source: trunk/autoquest-ui-core/src/main/java/de/ugoe/cs/autoquest/commands/usability/CMDtaskTreeStatistics.java @ 2032

Last change on this file since 2032 was 2032, checked in by pharms, 9 years ago
  • extended task tree statistics to also get average session length and CSV formated output
File size: 7.8 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.commands.usability;
16
17import java.text.DecimalFormat;
18import java.util.HashSet;
19import java.util.LinkedList;
20import java.util.List;
21import java.util.Set;
22
23import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
24
25import de.ugoe.cs.autoquest.CommandHelpers;
26import de.ugoe.cs.autoquest.tasktrees.treeifc.DefaultTaskInstanceTraversingVisitor;
27import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
28import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
29import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
30import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
31import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
32import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
33import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
34import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
35import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
36import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
37import de.ugoe.cs.autoquest.tasktrees.treeifc.TaskTreeUtils;
38import de.ugoe.cs.util.console.Command;
39import de.ugoe.cs.util.console.Console;
40import de.ugoe.cs.util.console.GlobalDataContainer;
41
42/**
43 * <p>
44 * This command provides statistical information about a given task tree.
45 * </p>
46 *
47 * @author Patrick Harms
48 * @version 1.0
49 */
50public class CMDtaskTreeStatistics implements Command {
51
52    /*
53     * (non-Javadoc)
54     *
55     * @see de.ugoe.cs.util.console.Command#help()
56     */
57    @Override
58    public String help() {
59        return "taskTreeStatistics <tasktree>";
60    }
61
62    /*
63     * (non-Javadoc)
64     *
65     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
66     */
67    @Override
68    public void run(List<Object> parameters) {
69        String tasktreeName;
70        try {
71            tasktreeName = (String) parameters.get(0);
72        }
73        catch (Exception e) {
74            throw new IllegalArgumentException("must provide a task tree name");
75        }
76
77        Object dataObject = GlobalDataContainer.getInstance().getData(tasktreeName);
78        if (dataObject == null) {
79            CommandHelpers.objectNotFoundMessage(tasktreeName);
80            return;
81        }
82        if (!(dataObject instanceof ITaskModel)) {
83            CommandHelpers.objectNotType(tasktreeName, "ITaskModel");
84            return;
85        }
86
87        ITaskModel taskModel = (ITaskModel) dataObject;
88
89        int allEvents = 0;
90       
91        int noOfEventTasks = 0;
92        int noOfSequences = 0;
93        int noOfIterations = 0;
94        int noOfSelections = 0;
95        int noOfOptionals = 0;
96        Set<IEventTaskInstance> coveredEvents = new HashSet<IEventTaskInstance>();
97       
98        for (ITask task : taskModel.getTasks()) {
99            if (task instanceof IEventTask) {
100                noOfEventTasks++;
101                allEvents += task.getInstances().size();
102            }
103            else if (task instanceof ISequence) {
104                noOfSequences++;
105                getCoveredEvents(task, coveredEvents);
106            }
107            else if (task instanceof IIteration) {
108                noOfIterations++;
109            }
110            else if (task instanceof ISelection) {
111                noOfSelections++;
112            }
113            else if (task instanceof IOptional) {
114                noOfOptionals++;
115            }
116        }
117       
118        DescriptiveStatistics stats = new DescriptiveStatistics();
119       
120        for (IUserSession session : taskModel.getUserSessions()) {
121            if (session.size() > 0) {
122                final List<IEventTaskInstance> events = new LinkedList<>();
123               
124                for (ITaskInstance instance : session) {
125                    instance.accept(new DefaultTaskInstanceTraversingVisitor() {
126                        @Override
127                        public void visit(IEventTaskInstance eventTaskInstance) {
128                            events.add(eventTaskInstance);
129                        }
130                    });
131                }
132               
133                stats.addValue(events.size());
134            }
135        }
136       
137        Console.println(stats.getN() + " sessions");
138        Console.println("average session length " + stats.getMean() + " (std dev " +
139                        stats.getStandardDeviation() + ")");
140        Console.println(allEvents + " events");
141       
142        Console.println(noOfEventTasks + " eventTasks");
143        Console.println(noOfSequences + " sequences");
144        Console.println(noOfIterations + " iterations");
145        Console.println(noOfSelections + " selections");
146        Console.println(noOfOptionals + " optionals");
147       
148        Set<ISequence> mostProminent =
149            TaskTreeUtils.getMostProminentTasks(taskModel, taskModel.getTasks());
150       
151        Set<IEventTaskInstance> mpCoveredEvents = new HashSet<IEventTaskInstance>();
152       
153        for (ITask task : mostProminent) {
154            getCoveredEvents(task, mpCoveredEvents);
155        }
156       
157        Console.println(noOfSequences + " sequences cover " +
158                        coveredEvents.size() + " of " + allEvents + " recorded events (" +
159                        formatPercent(coveredEvents.size(), allEvents) + ")");
160       
161        Console.println(mostProminent.size() + " of " + noOfSequences + " sequences (" +
162                        formatPercent(mostProminent.size(), noOfSequences) + ") cover " +
163                        mpCoveredEvents.size() + " of " + allEvents + " recorded events (" +
164                        formatPercent(mpCoveredEvents.size(), allEvents) + ")");
165       
166        Console.println("CSV: " + tasktreeName + ";" + noOfEventTasks + ";" + noOfSequences + ";" +
167                        noOfIterations + ";" + noOfSelections + ";" + noOfOptionals + ";" +
168                        allEvents + ";" + coveredEvents.size() + ";" +
169                        formatPercent(coveredEvents.size(), allEvents) + ";" +
170                        mostProminent.size() + ";" +
171                        formatPercent(mostProminent.size(), noOfSequences) + ";" +
172                        mpCoveredEvents.size() + ";" +
173                        formatPercent(mpCoveredEvents.size(), allEvents));
174    }
175
176    /**
177     * convenience method to format a percentage
178     */
179    private String formatPercent(int ratio, int full) {
180        return new DecimalFormat("#,##0.0%").format(((double) ratio) / full);
181    }
182
183    /**
184     * <p>
185     * convenience method to determine the number of covered events by a task
186     * </p>
187     *
188     * @param task          the task to count the covered events for
189     * @param coveredEvents the events covered by the task (in/out parameter)
190     */
191    private void getCoveredEvents(ITask task, final Set<IEventTaskInstance> coveredEvents) {
192        for (ITaskInstance instance : task.getInstances()) {
193            instance.accept(new DefaultTaskInstanceTraversingVisitor() {
194                @Override
195                public void visit(IEventTaskInstance eventTaskInstance) {
196                    coveredEvents.add(eventTaskInstance);
197                }
198            });
199        }
200    }
201
202}
Note: See TracBrowser for help on using the repository browser.