Changeset 2162 for trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationManager.java
- Timestamp:
- 09/07/17 16:15:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationManager.java
r2042 r2162 17 17 import java.util.ArrayList; 18 18 import java.util.HashMap; 19 import java.util.HashSet; 19 20 import java.util.LinkedList; 20 21 import java.util.List; 21 22 import java.util.ListIterator; 22 23 import java.util.Map; 24 import java.util.Set; 23 25 import java.util.logging.Level; 24 26 27 import de.ugoe.cs.autoquest.tasktrees.treeifc.DefaultTaskInstanceTraversingVisitor; 28 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance; 25 29 import de.ugoe.cs.autoquest.tasktrees.treeifc.IMarkingTemporalRelationship; 30 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; 26 31 import de.ugoe.cs.autoquest.tasktrees.treeifc.IStructuringTemporalRelationship; 27 32 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; 33 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance; 28 34 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 29 35 import de.ugoe.cs.util.console.Console; … … 58 64 rules.add(new TargetDistanceRule()); 59 65 rules.add(new MissingFeedbackRule()); 66 rules.add(new TaskRetryRule()); 60 67 rules.add(new DataEntryMethodChangeRule()); 61 68 rules.add(new CommonTaskRateRule()); … … 73 80 * 74 81 */ 75 public UsabilityEvaluationResult evaluateUsability(ITaskModel taskModel, int maxCount) { 82 public UsabilityEvaluationResult evaluateUsability(ITaskModel taskModel, 83 int maxCount, 84 boolean onlyMostRepresentative) 85 { 76 86 Console.traceln(Level.INFO, "evaluating usability of task model " + taskModel); 77 87 78 88 List<UsabilityEvaluationResult> interimResults = new ArrayList<UsabilityEvaluationResult>(); 89 Set<ITask> mostRepresentativeTasks = null; 79 90 80 91 for (UsabilityEvaluationRule rule : rules) { 81 92 Console.traceln(Level.INFO, "\napplying rule " + rule.getClass().getSimpleName()); 82 UsabilityEvaluationResult r esult = rule.evaluate(taskModel);93 UsabilityEvaluationResult ruleResult = rule.evaluate(taskModel); 83 94 84 95 Map<String, List<UsabilitySmell>> smellGroups = new HashMap<>(); 85 96 86 for (UsabilitySmell smell : r esult.getAllSmells()) {97 for (UsabilitySmell smell : ruleResult.getAllSmells()) { 87 98 List<UsabilitySmell> smellGroup = smellGroups.get(smell.getBriefDescription()); 88 99 … … 99 110 " usability smells of type \"" + smellGroup.getKey() + "\""); 100 111 101 result = new UsabilityEvaluationResult(taskModel, smellGroup.getValue()); 102 103 checkDuplicates(result); 104 105 if (maxCount < result.getAllSmells().size()) { 106 Console.traceln(Level.INFO, "filtering for " + maxCount + 107 " smells of same type with highest event coverage."); 108 112 ruleResult = new UsabilityEvaluationResult(taskModel, smellGroup.getValue()); 113 114 checkDuplicates(ruleResult); 115 116 if ((onlyMostRepresentative) || (maxCount < ruleResult.getAllSmells().size())) { 109 117 LinkedList<UsabilitySmell> sortedSmells = new LinkedList<>(); 110 118 111 for (UsabilitySmell smell : result.getAllSmells()) { 119 if (onlyMostRepresentative) { 120 Console.traceln(Level.INFO, "filtering for smells that refer to only most " + 121 "representative tasks."); 122 } 123 124 for (UsabilitySmell smell : ruleResult.getAllSmells()) { 125 if (onlyMostRepresentative && (smell.getSmellingTask() != null)) { 126 if (mostRepresentativeTasks == null) { 127 mostRepresentativeTasks = getMostRepresentativeSequences(taskModel); 128 } 129 130 if (!mostRepresentativeTasks.contains(smell.getSmellingTask())) { 131 continue; 132 } 133 } 134 112 135 ListIterator<UsabilitySmell> iterator = sortedSmells.listIterator(); 113 136 … … 116 139 while (iterator.hasNext()) { 117 140 if (iterator.next().getIntensity().getEventCoverage() < 118 141 smell.getIntensity().getEventCoverage()) 119 142 { 120 143 iterator.previous(); … … 129 152 } 130 153 154 } 155 156 if (maxCount < ruleResult.getAllSmells().size()) { 157 Console.traceln(Level.INFO, "filtering for " + maxCount + 158 " smells of same type with highest event coverage."); 159 131 160 while (sortedSmells.size() > maxCount) { 132 161 sortedSmells.removeLast(); … … 134 163 } 135 164 136 result = new UsabilityEvaluationResult(taskModel, sortedSmells); 137 checkDuplicates(result); 138 } 139 140 interimResults.add(result); 165 Console.traceln(Level.INFO, sortedSmells.size() + " remaining."); 166 ruleResult = new UsabilityEvaluationResult(taskModel, sortedSmells); 167 checkDuplicates(ruleResult); 168 } 169 170 interimResults.add(ruleResult); 141 171 } 142 172 } … … 147 177 148 178 return result; 179 } 180 181 /** 182 * <p> 183 * TODO: comment 184 * </p> 185 * 186 * @param taskModel 187 * @return 188 */ 189 private Set<ITask> getMostRepresentativeSequences(ITaskModel taskModel) { 190 Map<Integer, List<ISequence>> coverageCounts = new HashMap<>(); 191 Map<ISequence, Set<IEventTaskInstance>> coverages = new HashMap<>(); 192 int maxCoverage = 0; 193 194 for (ITask task : taskModel.getTasks()) { 195 if (task instanceof ISequence) { 196 final Set<IEventTaskInstance> coveredEvents = new HashSet<>(); 197 198 for (ITaskInstance instance : task.getInstances()) { 199 instance.accept(new DefaultTaskInstanceTraversingVisitor() { 200 @Override 201 public void visit(IEventTaskInstance eventTaskInstance) { 202 coveredEvents.add(eventTaskInstance); 203 } 204 }); 205 } 206 207 coverages.put((ISequence) task, coveredEvents); 208 209 List<ISequence> tasksWithSameCoverage = coverageCounts.get(coveredEvents.size()); 210 211 if (tasksWithSameCoverage == null) { 212 tasksWithSameCoverage = new LinkedList<>(); 213 coverageCounts.put(coveredEvents.size(), tasksWithSameCoverage); 214 } 215 216 tasksWithSameCoverage.add((ISequence) task); 217 218 maxCoverage = Math.max(maxCoverage, coveredEvents.size()); 219 } 220 } 221 222 Set<ITask> mostRepresentativeSequences = new HashSet<>(); 223 224 for (int i = maxCoverage; i > 0; i--) { 225 List<ISequence> sequencesWithSameCoverage = coverageCounts.get(i); 226 227 if (sequencesWithSameCoverage == null) { 228 continue; 229 } 230 231 for (ISequence sequence : sequencesWithSameCoverage) { 232 mostRepresentativeSequences.add(sequence); 233 } 234 235 if ((100 * mostRepresentativeSequences.size() / coverages.size()) > 20) { 236 break; 237 } 238 } 239 240 return mostRepresentativeSequences; 149 241 } 150 242
Note: See TracChangeset
for help on using the changeset viewer.