Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/permute_operations.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
2:
3: package body Permute_Operations is
4:
5: function "*" ( p : Permutation; v : Standard_Natural_Vectors.Vector )
6: return Standard_Natural_Vectors.Vector is
7:
8: r : Standard_Natural_Vectors.Vector(v'range);
9:
10: begin
11: for i in p'range loop
12: if p(i) >= 0
13: then r(i) := v(p(i));
14: else r(i) := -v(-p(i));
15: end if;
16: end loop;
17: return r;
18: end "*";
19:
20: function "*" ( p : Permutation; v : Standard_Integer_Vectors.Vector )
21: return Standard_Integer_Vectors.Vector is
22:
23: r : Standard_Integer_Vectors.Vector(v'range);
24:
25: begin
26: for i in p'range loop
27: if p(i) >= 0
28: then r(i) := v(p(i));
29: else r(i) := -v(-p(i));
30: end if;
31: end loop;
32: return r;
33: end "*";
34:
35: function "*" ( p : Permutation; v : Standard_Floating_Vectors.Vector )
36: return Standard_Floating_Vectors.Vector is
37:
38: r : Standard_Floating_Vectors.Vector(v'range);
39:
40: begin
41: for i in p'range loop
42: if p(i) >= 0
43: then r(i) := v(p(i));
44: else r(i) := -v(-p(i));
45: end if;
46: end loop;
47: return r;
48: end "*";
49:
50: function "*" ( p : Permutation; v : Standard_Complex_Vectors.Vector )
51: return Standard_Complex_Vectors.Vector is
52:
53: r : Standard_Complex_Vectors.Vector(v'range);
54:
55: begin
56: for i in p'range loop
57: if p(i) >= 0
58: then r(i) := v(p(i));
59: else r(i) := -v(-p(i));
60: end if;
61: end loop;
62: return r;
63: end "*";
64:
65: function Permutable ( v1,v2 : Standard_Natural_Vectors.Vector )
66: return boolean is
67: begin
68: if v1'first /= v2'first or else v1'last /= v2'last
69: then return false; -- the dimensions must correspond !
70: else declare
71: p : Permutation(v1'first..v1'last);
72: begin
73: for k in p'range loop
74: p(k) := 0;
75: for l in v2'range loop
76: if v2(l) = v1(k)
77: then p(k) := l;
78: for j in 1..(k-1) loop
79: if p(j) = l
80: then p(k) := 0;
81: end if;
82: end loop;
83: end if;
84: exit when p(k) /= 0;
85: end loop;
86: if p(k) = 0
87: then return false;
88: end if;
89: end loop;
90: end;
91: return true;
92: end if;
93: end Permutable;
94:
95: function Permutable ( v1,v2 : Standard_Integer_Vectors.Vector )
96: return boolean is
97: begin
98: if v1'first /= v2'first or else v1'last /= v2'last
99: then return false; -- the dimensions must correspond !
100: else declare
101: p : Permutation(v1'first..v1'last);
102: begin
103: for k in p'range loop
104: p(k) := 0;
105: for l in v2'range loop
106: if v2(l) = v1(k)
107: then p(k) := l;
108: for j in 1..(k-1) loop
109: if p(j) = l
110: then p(k) := 0;
111: end if;
112: end loop;
113: end if;
114: exit when p(k) /= 0;
115: end loop;
116: if p(k) = 0
117: then return false;
118: end if;
119: end loop;
120: end;
121: return true;
122: end if;
123: end Permutable;
124:
125: function Permutable ( v1,v2 : Standard_Floating_Vectors.Vector )
126: return boolean is
127: begin
128: if v1'first /= v2'first or else v1'last /= v2'last
129: then return false; -- the dimensions must correspond !
130: else declare
131: p : Permutation(v1'first..v1'last);
132: begin
133: for k in p'range loop
134: p(k) := 0;
135: for l in v2'range loop
136: if v2(l) = v1(k)
137: then p(k) := l;
138: for j in 1..(k-1) loop
139: if p(j) = l
140: then p(k) := 0;
141: end if;
142: end loop;
143: end if;
144: exit when p(k) /= 0;
145: end loop;
146: if p(k) = 0
147: then return false;
148: end if;
149: end loop;
150: end;
151: return true;
152: end if;
153: end Permutable;
154:
155: function Permutable ( v1,v2 : Standard_Complex_Vectors.Vector )
156: return boolean is
157: begin
158: if v1'first /= v2'first or else v1'last /= v2'last
159: then return false; -- the dimensions must correspond !
160: else declare
161: p : Permutation(v1'first..v1'last);
162: begin
163: for k in p'range loop
164: p(k) := 0;
165: for l in v2'range loop
166: if v2(l) = v1(k)
167: then p(k) := l;
168: for j in 1..(k-1) loop
169: if p(j) = l
170: then p(k) := 0;
171: end if;
172: end loop;
173: end if;
174: exit when p(k) /= 0;
175: end loop;
176: if p(k) = 0
177: then return false;
178: end if;
179: end loop;
180: end;
181: return true;
182: end if;
183: end Permutable;
184:
185: function Permutable ( v1,v2 : Standard_Floating_Vectors.Vector;
186: tol : double_float ) return boolean is
187: begin
188: if v1'first /= v2'first or else v1'last /= v2'last
189: then return false; -- the dimensions must correspond !
190: else declare
191: p : Permutation(v1'first..v1'last);
192: begin
193: for k in p'range loop
194: p(k) := 0;
195: for l in v2'range loop
196: if ABS(v2(l) - v1(k)) <= tol
197: then p(k) := l;
198: for j in 1..(k-1) loop
199: if p(j) = l
200: then p(k) := 0;
201: end if;
202: end loop;
203: end if;
204: exit when p(k) /= 0;
205: end loop;
206: if p(k) = 0
207: then return false;
208: end if;
209: end loop;
210: end;
211: return true;
212: end if;
213: end Permutable;
214:
215: function Permutable ( v1,v2 : Standard_Complex_Vectors.Vector;
216: tol : double_float ) return boolean is
217: begin
218: if v1'first /= v2'first or else v1'last /= v2'last
219: then return false; -- the dimensions must correspond !
220: else declare
221: p : Permutation(v1'first..v1'last);
222: begin
223: for k in p'range loop
224: p(k) := 0;
225: for l in v2'range loop
226: if (ABS(REAL_PART(v2(l)) - REAL_PART(v1(k))) <= tol)
227: and then (ABS(IMAG_PART(v2(l)) - IMAG_PART(v1(k))) <= tol)
228: then p(k) := l;
229: for j in 1..(k-1) loop
230: if p(j) = l
231: then p(k) := 0;
232: end if;
233: end loop;
234: end if;
235: exit when p(k) /= 0;
236: end loop;
237: if p(k) = 0
238: then return false;
239: end if;
240: end loop;
241: end;
242: return true;
243: end if;
244: end Permutable;
245:
246: function Sign_Permutable ( v1,v2 : Standard_Natural_Vectors.Vector )
247: return boolean is
248: begin
249: if v1'first /= v2'first or else v1'last /= v2'last
250: then return false; -- the dimensions must correspond !
251: else declare
252: p : Permutation(v1'first..v1'last);
253: begin
254: for k in p'range loop
255: p(k) := 0;
256: for l in v2'range loop
257: if v2(l) = v1(k) or else v2(l) = -v1(k)
258: then p(k) := l;
259: for j in 1..(k-1) loop
260: if p(j) = l
261: then p(k) := 0;
262: end if;
263: end loop;
264: end if;
265: exit when p(k) /= 0;
266: end loop;
267: if p(k) = 0
268: then return false;
269: end if;
270: end loop;
271: end;
272: return true;
273: end if;
274: end Sign_Permutable;
275:
276: function Sign_Permutable ( v1,v2 : Standard_Integer_Vectors.Vector )
277: return boolean is
278: begin
279: if v1'first /= v2'first or else v1'last /= v2'last
280: then return false; -- the dimensions must correspond !
281: else declare
282: p : Permutation(v1'first..v1'last);
283: begin
284: for k in p'range loop
285: p(k) := 0;
286: for l in v2'range loop
287: if v2(l) = v1(k) or else v2(l) = -v1(k)
288: then p(k) := l;
289: for j in 1..(k-1) loop
290: if p(j) = l
291: then p(k) := 0;
292: end if;
293: end loop;
294: end if;
295: exit when p(k) /= 0;
296: end loop;
297: if p(k) = 0
298: then return false;
299: end if;
300: end loop;
301: end;
302: return true;
303: end if;
304: end Sign_Permutable;
305:
306: function Sign_Permutable ( v1,v2 : Standard_Floating_Vectors.Vector )
307: return boolean is
308: begin
309: if v1'first /= v2'first or else v1'last /= v2'last
310: then return false; -- the dimensions must correspond !
311: else declare
312: p : Permutation(v1'first..v1'last);
313: begin
314: for k in p'range loop
315: p(k) := 0;
316: for l in v2'range loop
317: if v2(l) = v1(k) or else v2(l) = -v1(k)
318: then p(k) := l;
319: for j in 1..(k-1) loop
320: if p(j) = l
321: then p(k) := 0;
322: end if;
323: end loop;
324: end if;
325: exit when p(k) /= 0;
326: end loop;
327: if p(k) = 0
328: then return false;
329: end if;
330: end loop;
331: end;
332: return true;
333: end if;
334: end Sign_Permutable;
335:
336: function Sign_Permutable ( v1,v2 : Standard_Complex_Vectors.Vector )
337: return boolean is
338: begin
339: if v1'first /= v2'first or else v1'last /= v2'last
340: then return false; -- the dimensions must correspond !
341: else declare
342: p : Permutation(v1'first..v1'last);
343: begin
344: for k in p'range loop
345: p(k) := 0;
346: for l in v2'range loop
347: if v2(l) = v1(k) or else v2(l) = -v1(k)
348: then p(k) := l;
349: for j in 1..(k-1) loop
350: if p(j) = l
351: then p(k) := 0;
352: end if;
353: end loop;
354: end if;
355: exit when p(k) /= 0;
356: end loop;
357: if p(k) = 0
358: then return false;
359: end if;
360: end loop;
361: end;
362: return true;
363: end if;
364: end Sign_Permutable;
365:
366: function Sign_Permutable ( v1,v2 : Standard_Floating_Vectors.Vector;
367: tol : double_float ) return boolean is
368: begin
369: if v1'first /= v2'first or else v1'last /= v2'last
370: then return false; -- the dimensions must correspond !
371: else declare
372: p : Permutation(v1'first..v1'last);
373: begin
374: for k in p'range loop
375: p(k) := 0;
376: for l in v2'range loop
377: if (ABS(v2(l) - v1(k)) <= tol)
378: or else (ABS(v2(l) + v1(k)) <= tol)
379: then p(k) := l;
380: for j in 1..(k-1) loop
381: if p(j) = l
382: then p(k) := 0;
383: end if;
384: end loop;
385: end if;
386: exit when p(k) /= 0;
387: end loop;
388: if p(k) = 0
389: then return false;
390: end if;
391: end loop;
392: end;
393: return true;
394: end if;
395: end Sign_Permutable;
396:
397: function Sign_Permutable ( v1,v2 : Standard_Complex_Vectors.Vector;
398: tol : double_float ) return boolean is
399: begin
400: if v1'first /= v2'first or else v1'last /= v2'last
401: then return false; -- the dimensions must correspond !
402: else declare
403: p : Permutation(v1'first..v1'last);
404: begin
405: for k in p'range loop
406: p(k) := 0;
407: for l in v2'range loop
408: if ((ABS(REAL_PART(v2(l)) - REAL_PART(v1(k))) <= tol)
409: and then (ABS(IMAG_PART(v2(l)) - IMAG_PART(v1(k))) <= tol))
410: or else ((ABS(REAL_PART(v2(l)) + REAL_PART(v1(k))) <= tol)
411: and then (ABS(IMAG_PART(v2(l)) + IMAG_PART(v1(k))) <= tol))
412: then p(k) := l;
413: for j in 1..(k-1) loop
414: if p(j) = l
415: then p(k) := 0;
416: end if;
417: end loop;
418: end if;
419: exit when p(k) /= 0;
420: end loop;
421: if p(k) = 0
422: then return false;
423: end if;
424: end loop;
425: end;
426: return true;
427: end if;
428: end Sign_Permutable;
429:
430: function "*" ( p : Permutation; t : Standard_Complex_Polynomials.Term )
431: return Standard_Complex_Polynomials.Term is
432:
433: res : Standard_Complex_Polynomials.Term;
434:
435: begin
436: res.cf := t.cf;
437: res.dg := new Standard_Natural_Vectors.Vector(t.dg'range);
438: for i in p'range loop
439: if p(i) >= 0
440: then res.dg(i) := t.dg(p(i));
441: else res.dg(i) := t.dg(-p(i));
442: res.cf := -res.cf;
443: end if;
444: end loop;
445: return res;
446: end "*";
447:
448: function "*" ( p : Permutation; s : Standard_Complex_Polynomials.Poly )
449: return Standard_Complex_Polynomials.Poly is
450:
451: use Standard_Complex_Polynomials;
452: res : Poly := Null_Poly;
453:
454: procedure Permute_Term ( t : in Term; continue : out boolean ) is
455: tt : Term := p*t;
456: begin
457: Add(res,tt);
458: Clear(tt);
459: continue := true;
460: end Permute_Term;
461: procedure Permute_Terms is new Visiting_Iterator(Permute_Term);
462:
463: begin
464: Permute_Terms(s);
465: return res;
466: end "*";
467:
468: function "*" ( p : Permutation; t : Standard_Complex_Laur_Polys.Term )
469: return Standard_Complex_Laur_Polys.Term is
470:
471: res : Standard_Complex_Laur_Polys.Term;
472:
473: begin
474: res.cf := t.cf;
475: res.dg := new Standard_Integer_Vectors.Vector(t.dg'range);
476: for i in p'range loop
477: if p(i) >= 0
478: then res.dg(i) := t.dg(p(i));
479: else res.dg(i) := t.dg(-p(i));
480: res.cf := -res.cf;
481: end if;
482: end loop;
483: return res;
484: end "*";
485:
486: function "*" ( p : Permutation; s : Standard_Complex_Laur_Polys.Poly )
487: return Standard_Complex_Laur_Polys.Poly is
488:
489: use Standard_Complex_Laur_Polys;
490: res : Poly := Null_Poly;
491:
492: procedure Permute_Term ( t : in Term; continue : out boolean ) is
493:
494: tt : Term := p*t;
495:
496: begin
497: Add(res,tt);
498: Clear(tt);
499: continue := true;
500: end Permute_Term;
501: procedure Permute_Terms is new Visiting_Iterator(Permute_Term);
502:
503: begin
504: Permute_Terms(s);
505: return res;
506: end "*";
507:
508: function "*" ( s : Poly_Sys; p : Permutation ) return Poly_Sys is
509:
510: res : Poly_Sys(s'range);
511:
512: begin
513: for k in res'range loop
514: res(k) := p*s(k);
515: end loop;
516: return res;
517: end "*";
518:
519: function "*" ( s : Laur_Sys; p : Permutation ) return Laur_Sys is
520:
521: res : Laur_Sys(s'range);
522:
523: begin
524: for k in res'range loop
525: res(k) := p*s(k);
526: end loop;
527: return res;
528: end "*";
529:
530: function "*" ( p : Permutation; s : Poly_Sys ) return Poly_Sys is
531:
532: r : Poly_Sys(s'range);
533: use Standard_Complex_Polynomials;
534:
535: begin
536: for i in p'range loop
537: if p(i) >= 0
538: then Copy(s(p(i)),r(i));
539: else r(i) := -s(-p(i));
540: end if;
541: end loop;
542: return r;
543: end "*";
544:
545: function "*" ( p : Permutation; s : Laur_Sys ) return Laur_Sys is
546:
547: r : Laur_Sys(s'range);
548: use Standard_Complex_Laur_Polys;
549:
550: begin
551: for i in p'range loop
552: if p(i) >= 0
553: then Copy(s(p(i)),r(i));
554: else r(i) := -s(-p(i));
555: end if;
556: end loop;
557: return r;
558: end "*";
559:
560: end Permute_Operations;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>