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
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
99
100
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
201
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
216
217 }
218
219
220 }