|
|
1.1 root 1: #include <stdio.h>
2: #include "pret.h"
3: #include "pret.d"
4:
5: #define DEBUG6 0
6: #define DEBUG7 0
7:
8: extern struct COL column[MANY];
9: extern struct ROW row[MANY];
10: extern int nrrows, nrcols, redrows;
11:
12: struct ENTRY * find();
13: char * Emalloc();
14:
15: char **triangle;
16: short **successor;
17: short *tmpsucc;
18: int *unmap; /* reverses maptwo values to original row numbers */
19:
20: MAP(x)
21: { int y = row[x].maptwo; /* gives a value between 0 and redrows */
22:
23: unmap[y] = x;
24: return y;
25: }
26:
27: minimize()
28: { int i, j;
29: int n = redrows;
30:
31: unmap = (int *)
32: Emalloc( n * sizeof (int) );
33: triangle = (char **)
34: Emalloc( n * sizeof (char *) );
35: /*
36: ** allocate a triangle of states
37: ** triangle[i][j] == 1
38: ** will indicate that the states i and j are
39: ** in the same equivalence class
40: ** initially, claim all pairs to be equivalent
41: */
42:
43: for (i = 1; i < n; i++)
44: { triangle[i] = (char *)
45: Emalloc(i * sizeof (char));
46: for (j = 0; j < i; j++)
47: triangle[i][j] = 1;
48: }
49: tmpsucc = (short *)
50: Emalloc( n * sizeof (short));
51: successor = (short **)
52: Emalloc( n * sizeof (short *) );
53:
54: for (i = 0; i < n; i++)
55: { successor[i] = (short *)
56: Emalloc(n * sizeof (short));
57: for (j = 0; j < n; j++)
58: successor[i][j] = 0;
59: }
60: partition();
61:
62: #if DEBUG6
63: putriangle();
64: #endif
65: squash();
66:
67: for (i = 1; i < n; i++)
68: free(triangle[i]);
69: free(triangle);
70: free(unmap);
71: }
72:
73: /*
74: newgeneration()
75: { register int i,j;
76:
77: for (j = 0; j < n; i++)
78: tmpsucc[j] = 0;
79: for (i = 0; i < n; i++)
80: { for (j = 0; j < n; j++)
81: addkids(successor[i][j]);
82: for (j = 0; j < n; j++)
83: { successor[i][j] = tmpsucc[j];
84: tmpsucc[i] = 0;
85: }
86: }
87: }
88:
89: addkids(whosekids)
90: { register int h,k,x,y;
91: struct ENTRY *one = find(i, 0);
92: struct ENTRY *two = find(j, 0);
93: struct PILAR *a;
94:
95:
96: for (k = 0; k < nrcols; k++)
97: { for (h = 0; h < one->nrpils; h++)
98: { a = one->pilar;
99:
100: tmpsucc[target(a->transf)] = 1;
101:
102: a = a->nxtp;
103: }
104: one = one->nextcol;
105: two = two->nextcol;
106: }
107: }
108: */
109:
110: partition()
111: { register int i, j, K;
112: int anychange = 1;
113:
114: /*
115: ** recursively scan through the
116: ** triangle to find non-equivalent pairs
117: ** until pi(1) -> pi(k) == pi(k-1)
118: */
119:
120: for (K = 1; anychange == 1; K++)
121: { anychange = 0;
122: #if DEBUG7
123: printf("%d Equivalence:\n", K);
124: #endif DEBUG7
125: for (i = nrrows-1; i > 0; i--)
126: { if (row[i].mapping != NOSTATE)
127: continue;
128:
129: for (j = 0; j < i; j++)
130: { if (row[j].mapping != NOSTATE
131: || triangle[MAP(i)][MAP(j)] == 0)
132: continue;
133:
134: if ( !equiv(K, i, j) )
135: { triangle[MAP(i)][MAP(j)] = 0;
136: anychange = 1;
137: }
138: #if DEBUG7
139: else
140: { printf("\tstates: %2d,", MAP(i));
141: printf("%2d\n", MAP(j));
142: }
143: #endif DEBUG7
144: } } } }
145:
146: #if DEBUG6
147: putriangle()
148: { int i, j;
149: int n = redrows;
150: int cn = 0;
151: char * class = (char *) Emalloc (n * sizeof (char) );
152:
153: for (i = 0; i < n; i++)
154: class[i] = 0;
155:
156: for (i = 1; i < n; i++)
157: for (j = 0; j < i; j++)
158: if ( triangle[i][j] )
159: { if (class[i] == 0 && class[j] == 0)
160: class[i] = class[j] = ++cn;
161: else if (class[i] != 0)
162: class[j] = class[i];
163: else if (class[j] != 0)
164: class[i] = class[j];
165: else
166: whoops("cannot happen, classes");
167: }
168:
169: for (i = 1; i <= cn; i++)
170: { printf("class %2d: ", i);
171: for (j = 0; j < n; j++)
172: if (class[j] == i)
173: printf("%d,", j);
174: printf("\n\n");
175: }
176:
177: free(class);
178: }
179: #endif
180:
181: squash()
182: { int i, j;
183: int n = redrows;
184: for (i = 1; i < n; i++)
185: for (j = 0; j < i; j++)
186: if ( triangle[i][j] )
187: { row[unmap[i]].mapping = unmap[j];
188: row[unmap[j]].labeled |= row[unmap[i]].labeled;
189: }
190: }
191:
192: outequiv(A, B)
193: struct ENTRY *A, *B;
194: { struct PILAR *at = A->pilar;
195: struct PILAR *it = B->pilar;
196:
197: /*
198: ** don't look at the at->transf's,
199: ** equal columns implicitly give
200: ** equal inputs or outputs, so
201: ** just compare the cargo codes
202: */
203:
204: while (it != NULL && at != NULL)
205: { if (at->code != it->code)
206: break;
207:
208: at = at->nxtp;
209: it = it->nxtp;
210: }
211:
212: return (it == NULL && at == NULL);
213: }
214:
215: equiv(K, i, j)
216: { int h, k, x, y, z;
217: struct ENTRY *one = find(i, 0);
218: struct ENTRY *two = find(j, 0);
219: struct PILAR *a, *b;
220:
221: if (one->nrpils != two->nrpils)
222: return 0;
223:
224: if (K == 1)
225: { for (k = 0; k < nrcols; k++)
226: { if ( !outequiv(one, two) )
227: return 0;
228:
229: one = one->nextcol;
230: two = two->nextcol;
231: }
232: } else
233: for (k = 0; k < nrcols; k++)
234: { a = one->pilar;
235: b = two->pilar;
236: for (h = 0; h < one->nrpils; h++)
237: {
238: x = target(a->transf);
239: y = target(b->transf);
240: x = MAP(x); y = MAP(y);
241: if (y > x) { z=x; x=y; y=z; }
242: if (x != y && triangle[x][y] == 0)
243: return 0;
244:
245: a = a->nxtp;
246: b = b->nxtp;
247: }
248: one = one->nextcol;
249: two = two->nextcol;
250: }
251:
252: return 1;
253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.