Ignore:
Timestamp:
09/07/17 16:15:00 (7 years ago)
Author:
pharms
Message:
  • changes for first VR oriented usability evaluation
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationManager.java

    r2042 r2162  
    1717import java.util.ArrayList; 
    1818import java.util.HashMap; 
     19import java.util.HashSet; 
    1920import java.util.LinkedList; 
    2021import java.util.List; 
    2122import java.util.ListIterator; 
    2223import java.util.Map; 
     24import java.util.Set; 
    2325import java.util.logging.Level; 
    2426 
     27import de.ugoe.cs.autoquest.tasktrees.treeifc.DefaultTaskInstanceTraversingVisitor; 
     28import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance; 
    2529import de.ugoe.cs.autoquest.tasktrees.treeifc.IMarkingTemporalRelationship; 
     30import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; 
    2631import de.ugoe.cs.autoquest.tasktrees.treeifc.IStructuringTemporalRelationship; 
    2732import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; 
     33import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance; 
    2834import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 
    2935import de.ugoe.cs.util.console.Console; 
     
    5864        rules.add(new TargetDistanceRule()); 
    5965        rules.add(new MissingFeedbackRule()); 
     66        rules.add(new TaskRetryRule()); 
    6067        rules.add(new DataEntryMethodChangeRule()); 
    6168        rules.add(new CommonTaskRateRule()); 
     
    7380     * 
    7481     */ 
    75     public UsabilityEvaluationResult evaluateUsability(ITaskModel taskModel, int maxCount) { 
     82    public UsabilityEvaluationResult evaluateUsability(ITaskModel taskModel, 
     83                                                       int        maxCount, 
     84                                                       boolean    onlyMostRepresentative) 
     85    { 
    7686        Console.traceln(Level.INFO, "evaluating usability of task model " + taskModel); 
    7787 
    7888        List<UsabilityEvaluationResult> interimResults = new ArrayList<UsabilityEvaluationResult>(); 
     89        Set<ITask> mostRepresentativeTasks = null; 
    7990 
    8091        for (UsabilityEvaluationRule rule : rules) { 
    8192            Console.traceln(Level.INFO, "\napplying rule " + rule.getClass().getSimpleName()); 
    82             UsabilityEvaluationResult result = rule.evaluate(taskModel); 
     93            UsabilityEvaluationResult ruleResult = rule.evaluate(taskModel); 
    8394 
    8495            Map<String, List<UsabilitySmell>> smellGroups = new HashMap<>(); 
    8596             
    86             for (UsabilitySmell smell : result.getAllSmells()) { 
     97            for (UsabilitySmell smell : ruleResult.getAllSmells()) { 
    8798                List<UsabilitySmell> smellGroup = smellGroups.get(smell.getBriefDescription()); 
    8899                 
     
    99110                                " usability smells of type \"" + smellGroup.getKey() + "\""); 
    100111                 
    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())) { 
    109117                    LinkedList<UsabilitySmell> sortedSmells = new LinkedList<>(); 
    110118                     
    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                         
    112135                        ListIterator<UsabilitySmell> iterator = sortedSmells.listIterator(); 
    113136 
     
    116139                        while (iterator.hasNext()) { 
    117140                            if (iterator.next().getIntensity().getEventCoverage() < 
    118                                     smell.getIntensity().getEventCoverage()) 
     141                                smell.getIntensity().getEventCoverage()) 
    119142                            { 
    120143                                iterator.previous(); 
     
    129152                        } 
    130153                     
     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                         
    131160                        while (sortedSmells.size() > maxCount) { 
    132161                            sortedSmells.removeLast(); 
     
    134163                    } 
    135164                 
    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); 
    141171            } 
    142172        } 
     
    147177 
    148178        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; 
    149241    } 
    150242 
Note: See TracChangeset for help on using the changeset viewer.