View Javadoc

1   package net.kwfgrid.gworkflowdl.analysis;
2   
3   import net.kwfgrid.gworkflowdl.structure.Edge;
4   import net.kwfgrid.gworkflowdl.structure.Place;
5   import net.kwfgrid.gworkflowdl.structure.Transition;
6   import net.kwfgrid.gworkflowdl.structure.Workflow;
7   
8   import java.util.HashSet;
9   import java.util.Iterator;
10  
11  /***
12   * Created by IntelliJ IDEA.
13   * User: hans
14   * Date: 28.10.2005
15   * Time: 15:08:13
16   * To change this template use File | Settings | File Templates.
17   */
18  public class Analyzer {
19  
20      public Net net;
21      public Workflow workflow;
22  
23      public Analyzer(Workflow wf) {
24          workflow = wf;
25          net = new KarpMillerTree();
26          initializeNet();
27          net.build();
28      }
29  
30      public Analyzer(Workflow wf, int type) {
31          workflow = wf;
32          if (type == Net.KARP_MILLER_TREE) {
33              net = new KarpMillerTree();
34          } else if (type == Net.FINITE_STATE_MACHINE) {
35              net = new FiniteStateMachine();
36          } else {
37              throw new ArrayIndexOutOfBoundsException("'Net.KARP_MILLER_TREE' or 'Net.FINITE_STATE_MACHINE' only");
38          }
39          initializeNet();
40          net.build();
41      }
42  
43      public void initializeNet () {
44              Place[] ps = workflow.getPlaces();
45              net.N = ps.length;
46              Transition[] ts = workflow.getTransitions();
47  
48              net.capacities = new Marking(net.N);
49              net.initial = new Marking(net.N);
50              for (int i = 0; i < net.N; i++) {
51                  net.initial.set(i, ps[i].getTokenNumber());
52                  net.capacities.set(i, ps[i].getCapacity());
53                  //} else
54              }
55              net.transitions = new AnalysisTransition[ts.length];
56              for (int k = 0; k < ts.length; k++) {
57                  int[] inM = new int[net.N];
58                  for (int i = 0; i < net.N; i++) {
59                      inM[i] = 0;
60                  }
61                  Edge[] ine = ts[k].getInEdges();
62                  for (int j = 0; j < ine.length; j++) {
63                      inM[workflow.getPlaceIndex(ine[j].getPlace().getID())] = 1;
64                  }
65  
66                  int[] outM = new int[net.N];
67                  for (int i = 0; i < net.N; i++) {
68                      outM[i] = 0;
69                  }
70                  Edge[] oute = ts[k].getOutEdges();
71                  for (int j = 0; j < oute.length; j++) {
72                      outM[workflow.getPlaceIndex(oute[j].getPlace().getID())] = 1;
73                  }
74                  net.transitions[k] = new AnalysisTransition(k, new Marking(inM), new Marking(outM));
75  
76              }
77  
78          }
79  
80  
81      /***
82       * checks whether a transition can fire
83       *
84       * @param t transition
85       * @return answer
86       */
87  
88      public boolean isFireable(Transition t) {
89          int it = workflow.getTransitionIndex(t.getID());
90          return net.isFireable(it);
91      }
92  
93      public boolean isQuasiLive(Transition t) {
94          return isFireable(t);
95      }
96  
97      /*
98      public boolean mustFire(Transition t) {
99          int it = workflow.getTransitionIndex(t.getID());
100         return net.mustFire(it);
101     }
102     */
103 
104     public boolean isQuasiLive(Place p) {
105         int ip = workflow.getPlaceIndex(p.getID());
106         return net.isQuasiLive(ip);
107     }
108 
109     public boolean isFinallyMarked(Place p) {
110         int ip = workflow.getPlaceIndex(p.getID());
111         return net.isFinallyMarked(ip);
112     }
113 
114     public boolean oneOfIsFinallyMarked(Place[] ps) {
115         int[] is = new int[ps.length];
116         for (int i = 0; i < ps.length; i++) {
117             is[i] = workflow.getPlaceIndex(ps[i].getID());
118         }
119         return net.oneOfIsFinallyMarked(is);
120     }
121 
122     public int initialMarked(Place p) {
123         return p.getTokenNumber();
124     }
125 
126     public Decision[] getDecisions() {
127         HashSet gather = net.gatherDecisions();
128 
129         Decision[] ret = new Decision[gather.size()];
130 
131         int i = 0;
132         Iterator it = gather.iterator();
133         while (it.hasNext()) {
134             IndexDecision id = (IndexDecision) it.next();
135             Decision d = new Decision();
136             d.type = id.type;
137             d.place = workflow.getPlace(id.placeIndex);
138             d.transitions = new Transition[id.transitionIndices.size()];
139             for (int j = 0; j < d.transitions.length; j++) {
140                 d.transitions[j] = workflow.getTransition(((Integer) id.transitionIndices.get(j)).intValue());
141             }
142             ret[i++] = d;
143         }
144 
145         return ret;
146     }
147 
148     public int getComplexity() {
149         return net.complexity;
150     }
151 
152 
153     public boolean isPersistent() {
154         Decision[] ds = getDecisions();
155         boolean persistent = true;
156         for (int i = 0; i < ds.length; i++) {
157             if (ds[i].type == Decision.PUT_CONFLICT || ds[i].type == Decision.TAKE_CONFLICT) {
158                 persistent = false;
159                 break;
160             }
161         }
162         return persistent;
163     }
164 
165     public void showAnalysis() {
166         System.out.println("persistency " + isPersistent());
167         System.out.println();
168 
169         System.out.println("places");
170         Place[] ps = workflow.getPlaces();
171         for (int i = 0; i < ps.length; i++) {
172             Place p = ps[i];
173             String s = p.getID() + " ";
174             if (isQuasiLive(p)) {
175                 s += "not-dead";
176             } else {
177                 s += "dead";
178             }
179             if (isFinallyMarked(p)) {
180                 s += " finally-marked";
181             }
182             System.out.println(s);
183 
184         }
185         System.out.println();
186         System.out.println("transitions");
187         Transition[] ts = workflow.getTransitions();
188         for (int i = 0; i < ts.length; i++) {
189             Transition t = ts[i];
190             String s = t.getID() + " ";
191             if (isFireable(t)) {
192                 s += "not-dead";
193             } else {
194                 s += "dead";
195             }
196 
197             if (net.type == Net.FINITE_STATE_MACHINE) {
198                 s  += " must-fire=?";
199             }
200             /*else if (mustFire(t)) {
201                 s += " must-fire";
202             }
203             */
204 
205             System.out.println(s);
206 
207         }
208         System.out.println();
209         System.out.println("decisions");
210         Decision[] ds = getDecisions();
211         for (int i = 0; i < ds.length; i++) {
212             System.out.println(ds[i].toString());
213         }
214         System.out.println();
215         //kmTree1.show();
216 
217     }
218 
219 
220 }