Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/symmetry_group.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Integer_Vectors; use Standard_Integer_Vectors;
2:
3: package body Symmetry_Group is
4:
5: use Lists_of_Permutations;
6:
7: procedure Add ( l : in out List_of_Permutations; p : in Permutation ) is
8:
9: lp : Link_To_Permutation;
10:
11: begin
12: lp := new Vector'(Vector(p));
13: Construct(lp,l);
14: end Add;
15:
16: procedure Append ( first,last : in out List_of_Permutations;
17: p : in Permutation ) is
18:
19: lp : Link_To_Permutation;
20:
21: begin
22: lp := new Vector'(Vector(p));
23: Append(first,last,lp);
24: end Append;
25:
26: function Union ( a,b : List_of_Permutations ) return List_of_Permutations is
27:
28: tmp,res : List_of_Permutations;
29:
30: begin
31: res := a;
32: tmp := b;
33: while not Is_Null(tmp) loop
34: Add(res,Permutation(Head_Of(tmp).all));
35: tmp := Tail_Of(tmp);
36: end loop;
37: return res;
38: end Union;
39:
40: function SymGrp ( n : natural ) return List_of_Permutations is
41:
42: sn : List_of_Permutations;
43: p : Vector(1..n);
44:
45: begin
46: for k in p'range loop
47: p(k) := k;
48: end loop;
49: for k in reverse 1..n loop
50: p(k) := 1; p(1) := k;
51: declare
52: lp : Link_to_Permutation := new Vector'(p);
53: begin
54: Construct(lp,sn);
55: end;
56: p(1) := 1; p(k) := k;
57: end loop;
58: return sn;
59: end SymGrp;
60:
61: function Generate ( g : List_of_Permutations ) return List_of_Permutations is
62:
63: res : List_Of_Permutations;
64: at_end : boolean;
65:
66: -- IMPORTANT :
67: -- This routine assumes that permutations are added to the front
68: -- of the list !!!
69:
70: begin
71: if not Is_Null(g)
72: then declare
73: p1,p2,r : Permutation(Head_Of(g).all'range);
74: temp1,temp2,nwres : List_Of_Permutations;
75: nb,cnt : natural;
76: begin
77: -- INITIALIZE res :
78: temp1 := g;
79: while not Is_Null(temp1) loop
80: p1 := Permutation(Head_Of(temp1).all);
81: Add(res,p1);
82: temp1 := Tail_Of(temp1);
83: end loop;
84: -- CONSTRUCT res :
85: at_end := false;
86: nb := Length_Of(res);
87: while not at_end loop
88: temp1 := g; --res;
89: while not Is_Null(temp1) loop
90: p1 := Permutation(Head_Of(temp1).all);
91: cnt := 0;
92: temp2 := res;
93: while cnt < nb loop
94: p2 := Permutation(Head_Of(temp2).all);
95: r := p1*p2;
96: if not Is_In(res,r) and not Is_In(nwres,r)
97: then Add(nwres,r);
98: end if;
99: cnt := cnt + 1;
100: temp2 := Tail_Of(temp2);
101: end loop;
102: temp1 := Tail_Of(temp1);
103: end loop;
104: nb := Length_Of(nwres);
105: at_end := (nb = 0);
106: if not at_end
107: then temp2 := nwres;
108: while not Is_Null(temp2) loop
109: Add(res,Permutation(Head_Of(temp2).all));
110: temp2 := Tail_Of(temp2);
111: end loop;
112: Clear(nwres);
113: end if;
114: end loop;
115: end;
116: end if;
117: return res;
118: end Generate;
119:
120: -- SELECTORS :
121:
122: function Number (l : List_Of_Permutations) return natural is
123: begin
124: return Length_Of(l);
125: end Number;
126:
127: function Is_In ( l : List_of_Permutations; p : Permutation )
128: return boolean is
129:
130: tmp : List_Of_Permutations := l;
131:
132: begin
133: while not Is_Null(tmp) loop
134: if Equal(Permutation(Head_Of(tmp).all),p)
135: then return true;
136: else tmp := Tail_Of(tmp);
137: end if;
138: end loop;
139: return false;
140: end Is_In;
141:
142: procedure Iterator ( l : in List_of_Permutations ) is
143:
144: tmp : List_Of_Permutations := l;
145: cont : boolean;
146:
147: begin
148: cont := false;
149: while not Is_Null(tmp) loop
150: Process(Permutation(Head_Of(tmp).all),cont);
151: exit when not cont;
152: tmp := Tail_Of(tmp);
153: end loop;
154: end Iterator;
155:
156: -- DESTRUCTOR :
157:
158: procedure Clear ( l : in out List_of_Permutations ) is
159: begin
160: Lists_of_Permutations.Clear(Lists_of_Permutations.List(l));
161: end Clear;
162:
163: end Symmetry_Group;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>