1
2
3
4
5
6
7 package net.kwfgrid.gwes.workflowanalyzer;
8
9 import net.kwfgrid.gwes.Activity;
10 import net.kwfgrid.gwes.Constants;
11 import net.kwfgrid.gwes.XMLDB;
12 import net.kwfgrid.gwes.exception.DatabaseException;
13 import net.kwfgrid.gworkflowdl.structure.GenericProperties;
14 import net.kwfgrid.gworkflowdl.structure.Transition;
15 import net.kwfgrid.gworkflowdl.structure.Workflow;
16 import org.apache.log4j.Logger;
17
18 import java.util.HashMap;
19 import java.util.Map;
20 import java.util.Hashtable;
21
22
23
24
25
26
27 public class WorkflowStatistics {
28
29 static Logger logger = Logger.getLogger(WorkflowStatistics.class);
30
31 private Workflow workflow;
32
33 private int numberOfEdges = -1;
34 private double branchingFactor = -1d;
35 private long sequentialExecutionPathSize = -1;
36 private double speedupTotal = -1d;
37 private double speedupActive = -1d;
38
39 HashMap<String, TransitionActivityStatistics> transitionStatistics;
40
41 public WorkflowStatistics(Workflow workflow) {
42 this.workflow = workflow;
43 transitionStatistics = new HashMap<String, TransitionActivityStatistics>();
44 }
45
46 public synchronized void updateActivityStatistics(Activity activity, Transition transition) {
47 TransitionActivityStatistics stats = transitionStatistics.get(transition.getID());
48 if (stats == null) {
49 stats = new TransitionActivityStatistics();
50 transitionStatistics.put(transition.getID(), stats);
51 }
52 stats.put(activity);
53 GenericProperties props = transition.getProperties();
54 stats.updateTransitionProperties(props);
55 }
56
57 public synchronized void updateDatabaseActivityStatistics() throws DatabaseException {
58
59
60 Map<OperationResourcePair,DistributionSet> orDistMap = new Hashtable<OperationResourcePair,DistributionSet>();
61
62
63 for (TransitionActivityStatistics transitionStats : transitionStatistics.values()) {
64 Map<OperationResourcePair, DistributionSet> transDists = transitionStats.getDistributionMap();
65
66 for (OperationResourcePair orp : transDists.keySet()) {
67
68 DistributionSet distSet = orDistMap.get(orp);
69 if (distSet == null) {
70 distSet = new DistributionSet();
71 orDistMap.put(orp,distSet);
72 }
73 distSet.add(transDists.get(orp));
74 }
75 }
76
77
78 for (OperationResourcePair orp : orDistMap.keySet()) {
79 DistributionSet dbSet = XMLDB.getInstance().getResourceDurationStatistics(orp.getOperation(),orp.getResource());
80 if (dbSet == null) {
81 dbSet = new DistributionSet();
82 }
83 dbSet.add(orDistMap.get(orp));
84 XMLDB.getInstance().updateResourceDurationStatistics(orp.getOperation(), orp.getResource(), dbSet);
85 }
86
87 }
88
89 public double getBranchingFactor() {
90 if (branchingFactor < 0) updateBranchingFactor();
91 return branchingFactor;
92 }
93
94
95
96
97
98 public double updateBranchingFactor() {
99
100
101
102
103 return branchingFactor;
104 }
105
106 public long getSequentialExecutionPathSize() {
107 if (sequentialExecutionPathSize < 0) updateSequentialExecutionPathSize();
108 return sequentialExecutionPathSize;
109 }
110
111 public long updateSequentialExecutionPathSize() {
112 sequentialExecutionPathSize = 0;
113 if (transitionStatistics != null && transitionStatistics.size() > 0) {
114 for (String id : workflow.getTransitionIDs()) {
115 TransitionActivityStatistics stats = transitionStatistics.get(id);
116 if (stats != null) {
117 DistributionSet set = stats.getAggregatedSet();
118 sequentialExecutionPathSize += set.durationTotal.getNumber() * set.durationTotal.getMean();
119 }
120 }
121 }
122 workflow.getProperties().put(Constants.PROP_WORKFLOW_SEQUENTIAL_EXECUTION_PATH_SIZE_MS, "" + sequentialExecutionPathSize);
123 return sequentialExecutionPathSize;
124 }
125
126 public double getSpeedupActive() {
127 if (speedupActive < 0) updateSpeedupActive();
128 return speedupActive;
129 }
130
131 public double updateSpeedupActive() {
132 String makespanS = workflow.getProperties().get(Constants.PROP_DURATION_ACTIVE_MS);
133 if (makespanS == null) return -1d;
134 try {
135 long makespan = Long.parseLong(makespanS);
136 speedupActive = (double) getSequentialExecutionPathSize() / (double) makespan;
137 } catch (NumberFormatException e) {
138 logger.warn("Wrong format of durationActiveMs property: " + makespanS);
139 return -1d;
140 }
141 workflow.getProperties().put(Constants.PROP_WORKFLOW_SPEEDUP_ACTIVE, ""+ speedupActive);
142 return speedupActive;
143 }
144
145 public double getSpeedupTotal() {
146 if (speedupTotal < 0) updateSpeedupTotal();
147 return speedupTotal;
148 }
149
150 public double updateSpeedupTotal() {
151 String makespanS = workflow.getProperties().get(Constants.PROP_DURATION_TOTAL_MS);
152 if (makespanS == null) return -1d;
153 try {
154 long makespan = Long.parseLong(makespanS);
155 speedupTotal = (double) getSequentialExecutionPathSize() / (double) makespan;
156 } catch (NumberFormatException e) {
157 logger.warn("Wrong format of durationTotalMs property: " + makespanS);
158 return -1d;
159 }
160 workflow.getProperties().put(Constants.PROP_WORKFLOW_SPEEDUP_TOTAL, ""+ speedupTotal);
161 return speedupTotal;
162 }
163
164 public double getNumberOfEdges() {
165 if (numberOfEdges == -1) updateNumberOfEdges();
166 return numberOfEdges;
167 }
168
169 public double updateNumberOfEdges() {
170
171 int edgecounter = 0;
172 for (Transition transition : workflow.getTransitions()) {
173 edgecounter += transition.getReadEdges().length;
174 edgecounter += transition.getInEdges().length;
175 edgecounter += transition.getOutEdges().length;
176 }
177 numberOfEdges = edgecounter;
178 return numberOfEdges;
179 }
180
181 }