View Javadoc

1   /*
2    * Copyright 2010 Fraunhofer Gesellschaft, Munich, Germany,
3    * for its Fraunhofer Institute for Computer Architecture and Software
4    * Technology (FIRST), Berlin, Germany. All rights reserved.
5    * http://www.first.fraunhofer.de/
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   * @author Andreas Hoheisel
24   *         (<a href="http://www.andreas-hoheisel.de">www.andreas-hoheisel.de</a>)
25   * @version $Id: WorkflowStatistics.java 1419 2010-11-01 14:12:17Z hoheisel $
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          // key is operation resource pair, value is the combined distribution set over all transitions
60          Map<OperationResourcePair,DistributionSet> orDistMap = new Hashtable<OperationResourcePair,DistributionSet>();
61          
62          // loop over all Transition statistics
63          for (TransitionActivityStatistics transitionStats : transitionStatistics.values()) {
64              Map<OperationResourcePair, DistributionSet> transDists = transitionStats.getDistributionMap();
65              // loop over all operation resource pairs
66              for (OperationResourcePair orp : transDists.keySet()) {
67                  // combine distribution maps for equal operation resource pairs
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          // update database for each operation resource pair
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       * ToDo: this is not an "official" branching factor (defined as children for each node).
96       * @return
97       */
98      public double updateBranchingFactor() {
99  //        int nodes = workflow.placeCount() + workflow.transitionCount();
100 //        if (getNumberOfEdges() <= 0) return -1d;
101 //        branchingFactor = (double) getNumberOfEdges() / (double) nodes;
102 //        workflow.getProperties().put(GWorkflowDLHandler.PROP_WORKFLOW_BRANCHINGFACTOR, "" + branchingFactor);
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         // counte edges
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 }