Annotation of OpenXM_contrib/PHC/Ada/Main/tableau_formats.adb, Revision 1.1.1.1
1.1 maekawa 1: with integer_io; use integer_io;
2: with Communications_with_User; use Communications_with_User;
3: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
4: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
5: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
6: with Standard_Complex_Numbers_io; use Standard_Complex_Numbers_io;
7: with Standard_Natural_Vectors;
8: with Standard_Integer_Vectors;
9: with Standard_Complex_Vectors;
10: with Standard_Complex_VecVecs; use Standard_Complex_VecVecs;
11: with Lists_of_Integer_Vectors; use Lists_of_Integer_Vectors;
12: with Lists_of_Integer_Vectors_io; use Lists_of_Integer_Vectors_io;
13: with Arrays_of_Integer_Vector_Lists; use Arrays_of_Integer_Vector_Lists;
14: with Arrays_of_Integer_Vector_Lists_io; use Arrays_of_Integer_Vector_Lists_io;
15: with Symbol_Table,Symbol_Table_io; use Symbol_Table;
16: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
17: with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
18: with Power_Lists; use Power_Lists;
19:
20: package body Tableau_Formats is
21:
22: -- AUXILIARIES :
23:
24: procedure Read_Symbols ( file : in file_type; n : in natural ) is
25:
26: -- DESCRIPTION :
27: -- Reads n symbols from file.
28:
29: begin
30: Symbol_Table.Init(n);
31: for i in 1..n loop
32: declare
33: s : Symbol;
34: begin
35: Symbol_Table_io.get(file,s);
36: Symbol_Table.Add(s);
37: end;
38: end loop;
39: end Read_Symbols;
40:
41: procedure Write_Symbols ( file : in file_type ) is
42:
43: -- DESCRIPTION :
44: -- Writes the content of the symbol table on file.
45:
46: n : constant natural := Symbol_Table.Number;
47:
48: begin
49: put(file,n,1); new_line(file);
50: for i in 1..n loop
51: declare
52: s : Symbol := Symbol_Table.Get(i);
53: begin
54: put(file," ");
55: Symbol_Table_io.put(file,s);
56: end;
57: end loop;
58: new_line(file);
59: end Write_Symbols;
60:
61: procedure Read_Exponents ( file : in file_type;
62: exp : in out Array_of_Lists ) is
63:
64: -- DESCRIPTION :
65: -- Reads exponent vectors from file.
66: -- Each list of exponent vectors should be preceded by the number
67: -- of elements in the list.
68:
69: n : constant natural := exp'length;
70: m : natural;
71:
72: begin
73: for i in exp'range loop
74: get(file,m);
75: get(file,n,m,exp(i));
76: end loop;
77: end Read_Exponents;
78:
79: procedure Write_Exponents ( file : in file_type; p : in Poly_Sys ) is
80:
81: -- DESCRIPTION :
82: -- Writes the supports of p on file.
83:
84: exp : Array_of_Lists(p'range) := Create(p);
85:
86: begin
87: for i in exp'range loop
88: put(file,Length_Of(exp(i)),1); new_line(file);
89: put(file,exp(i));
90: end loop;
91: Deep_Clear(exp);
92: end Write_Exponents;
93:
94: procedure Read_Coefficients
95: ( file : in file_type;
96: exp : in Array_of_Lists; flt : in boolean;
97: cff : in out VecVec ) is
98:
99: -- DESCRIPTION :
100: -- Reads the coefficient from file, given the supports.
101:
102: f : double_float;
103:
104: begin
105: for i in cff'range loop
106: cff(i) := new Standard_Complex_Vectors.Vector(1..Length_Of(exp(i)));
107: for j in cff(i)'range loop
108: if flt
109: then get(file,f); cff(i)(j) := Create(f);
110: else get(file,cff(i)(j));
111: end if;
112: end loop;
113: end loop;
114: end Read_Coefficients;
115:
116: procedure Write_Coefficients ( file : in file_type; flt : in boolean;
117: p : in Poly ) is
118:
119: -- DESCRIPTION :
120: -- Writes the coefficients of the polynomial on file.
121: -- If flt, then the imaginary parts will be omitted.
122:
123: procedure Write_Coefficient_of_Term ( t : in Term; cont : out boolean ) is
124: begin
125: if flt
126: then put(file,REAL_PART(t.cf));
127: else put(file,t.cf);
128: end if;
129: new_line(file);
130: cont := true;
131: end Write_Coefficient_of_Term;
132:
133: procedure Write_Coefficients_of_Terms is
134: new Visiting_Iterator(Write_Coefficient_of_Term);
135:
136: begin
137: Write_Coefficients_of_Terms(p);
138: end Write_Coefficients;
139:
140: procedure Write_Coefficients ( file : in file_type; flt : in boolean;
141: p : in Poly_Sys ) is
142:
143: -- DESCRIPTION :
144: -- Writes the coefficients of the polynomial system on file.
145: -- If flt, then the imaginary parts will be omitted.
146:
147: begin
148: for i in p'range loop
149: Write_Coefficients(file,flt,p(i));
150: end loop;
151: end Write_Coefficients;
152:
153: function Create ( exp : Standard_Integer_Vectors.Vector;
154: cff : Complex_Number ) return Term is
155:
156: -- DESCRIPTION :
157: -- Creates a term from exponent vector and coefficient.
158:
159: res : Term;
160:
161: begin
162: res.cf := cff;
163: res.dg := new Standard_Natural_Vectors.Vector(exp'range);
164: for i in exp'range loop
165: res.dg(i) := exp(i);
166: end loop;
167: return res;
168: end Create;
169:
170: function Create ( exp : List; cff : Standard_Complex_Vectors.Vector )
171: return Poly is
172:
173: -- DESCRIPTION :
174: -- Creates a polynomial from the exponents and the coefficients.
175:
176: res : Poly;
177: tmp : List := exp;
178: lpt : Standard_Integer_Vectors.Link_to_Vector;
179:
180: begin
181: for i in cff'range loop
182: lpt := Head_Of(tmp);
183: declare
184: t : Term := Create(lpt.all,cff(i));
185: begin
186: Add(res,t);
187: end;
188: tmp := Tail_Of(tmp);
189: end loop;
190: return res;
191: end Create;
192:
193: function Create ( exp : Array_of_Lists; cff : VecVec ) return Poly_Sys is
194:
195: -- DESCRIPTION :
196: -- Creates the polynomial system from the supports and coefficients.
197:
198: res : Poly_Sys(exp'range);
199:
200: begin
201: for i in res'range loop
202: res(i) := Create(exp(i),cff(i).all);
203: end loop;
204: return res;
205: end Create;
206:
207: -- TARGET ROUTINES :
208:
209: procedure get ( file : in file_type; realcoeff : in boolean;
210: p : out Link_to_Poly_Sys ) is
211:
212: n : natural;
213:
214: begin
215: get(file,n);
216: new_line;
217: put("Dimension : "); put(n,1); new_line;
218: Read_Symbols(file,n);
219: put("Symbols :");
220: for i in 1..n loop
221: put(" "); put(Symbol_Table.get(i));
222: end loop;
223: new_line;
224: declare
225: exp : Array_of_Lists(1..n);
226: cff : VecVec(1..n);
227: sys : Poly_Sys(1..n);
228: begin
229: Read_Exponents(file,exp);
230: put_line("The exponents : ");
231: put(exp);
232: Read_Coefficients(file,exp,realcoeff,cff);
233: put_line("The coefficients : ");
234: for i in cff'range loop
235: for j in cff(i)'range loop
236: put(cff(i)(j)); new_line;
237: end loop;
238: new_line;
239: end loop;
240: sys := Create(exp,cff);
241: put_line("The polynomial system : "); put(sys);
242: p := new Poly_Sys'(sys);
243: end;
244: end get;
245:
246: procedure put ( file : in file_type; realcoeff : in boolean;
247: p : in Poly_Sys ) is
248:
249: begin
250: if not Symbol_Table.Empty
251: then Write_Symbols(file);
252: end if;
253: Write_Exponents(file,p);
254: Write_Coefficients(file,realcoeff,p);
255: end put;
256:
257: end Tableau_Formats;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>