Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/permutations_of_faces.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Integer_Vectors; use Standard_Integer_Vectors;
2: with Standard_Integer_VecVecs; use Standard_Integer_VecVecs;
3: with Permute_Operations; use Permute_Operations;
4:
5: package body Permutations_of_Faces is
6:
7: function Invariant ( f : Face; p : Permutation ) return boolean is
8:
9: fp : Face := Permute(f,p);
10: res : boolean := Is_Equal(f,fp);
11:
12: begin
13: Deep_Clear(fp);
14: return res;
15: end Invariant;
16:
17: function Invariant_Lifted ( f : Face; p : Permutation ) return boolean is
18:
19: fp : Face := Permute_Lifted(f,p);
20: res : boolean := Is_Equal(f,fp);
21:
22: begin
23: Deep_Clear(fp);
24: return res;
25: end Invariant_Lifted;
26:
27: function Permute ( f : Face; p : Permutation ) return Face is
28:
29: res : Face := new VecVec(f'range);
30:
31: begin
32: for i in f'range loop
33: res(i) := new Vector'(p*f(i).all);
34: end loop;
35: return res;
36: end Permute;
37:
38: function Permute_Lifted ( f : Face; p : Permutation ) return Face is
39:
40: res : Face := new VecVec(f'range);
41:
42: begin
43: for i in f'range loop
44: declare
45: pt : constant Vector := f(i)(f(i)'first..f(i)'last-1);
46: begin
47: res(i) := new Vector(f(i)'range);
48: res(i)(pt'range) := p*pt;
49: res(i)(res(i)'last) := f(i)(f(i)'last);
50: end;
51: end loop;
52: return res;
53: end Permute_Lifted;
54:
55: function Permutable ( f1,f2 : Face ) return boolean is
56:
57: res : boolean;
58:
59: begin
60: for i in f1'range loop
61: res := false;
62: for j in f2'range loop
63: res := Permutable(f1(i).all,f2(j).all);
64: exit when res;
65: end loop;
66: exit when not res;
67: end loop;
68: return res;
69: end Permutable;
70:
71: function Permutable_Lifted ( f1,f2 : Face ) return boolean is
72:
73: res : boolean;
74:
75: begin
76: for i in f1'range loop
77: res := false;
78: for j in f2'range loop
79: if f1(i)(f1(i)'last) = f2(j)(f2(j)'last) -- same lifting
80: then res := Permutable(f1(i)(f1(i)'first..f1(i)'last-1),
81: f2(j)(f2(j)'first..f2(j)'last-1));
82: end if;
83: exit when res;
84: end loop;
85: exit when not res;
86: end loop;
87: return res;
88: end Permutable_Lifted;
89:
90: function Permutable ( f1 : Face; f2 : Faces ) return boolean is
91:
92: tmp : Faces := f2;
93:
94: begin
95: while not Is_Null(tmp) loop
96: if Permutable(f1,Head_Of(tmp))
97: then return true;
98: else tmp := Tail_Of(tmp);
99: end if;
100: end loop;
101: end Permutable;
102:
103: function Permutable_Lifted ( f1 : Face; f2 : Faces ) return boolean is
104:
105: tmp : Faces := f2;
106:
107: begin
108: while not Is_Null(tmp) loop
109: if Permutable_Lifted(f1,Head_Of(tmp))
110: then return true;
111: else tmp := Tail_Of(tmp);
112: end if;
113: end loop;
114: return false;
115: end Permutable_Lifted;
116:
117: end Permutations_of_Faces;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>