Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Polynomials/standard_evaluator_packages.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 Characters_and_Numbers; use Characters_and_Numbers;
4: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
5: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
6: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
7: with Symbol_Table; use Symbol_Table;
8: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
9: with Standard_Complex_Polynomials_io; use Standard_Complex_Polynomials_io;
10: with Standard_Complex_Jaco_Matrices; use Standard_Complex_Jaco_Matrices;
11:
12: package body Standard_Evaluator_Packages is
13:
14: function Vector_Symbol ( i : natural ) return Symbol is
15:
16: res : Symbol;
17: s : constant String := "x(" & Convert(i) & ")";
18: cnt : natural := res'first;
19:
20: begin
21: for i in s'range loop
22: res(cnt) := s(i);
23: cnt := cnt+1;
24: exit when cnt > res'last;
25: end loop;
26: for i in cnt..res'last loop
27: res(i) := ' ';
28: end loop;
29: return res;
30: end Vector_Symbol;
31:
32: procedure Replace_Symbols is
33:
34: -- DESCRIPTION :
35: -- Replaces all symbols in the symbol table with vector entries:
36: -- x(1), x(2), up to x(n).
37:
38: n : constant natural := Symbol_Table.Number;
39:
40: begin
41: Symbol_Table.Clear;
42: Symbol_Table.Init(n);
43: for i in 1..n loop
44: Symbol_Table.Add(Vector_Symbol(i));
45: end loop;
46: end Replace_Symbols;
47:
48: procedure Create_Inline_Term_Evaluator
49: ( file : in file_type; t : in Term ) is
50:
51: -- DESCRIPTION :
52: -- Writes the code to evaluate one term on file.
53:
54: cff : boolean := false;
55:
56: begin
57: new_line(file);
58: if t.cf = Create(1.0)
59: then if Sum(t.dg) = 0
60: then put(file," + Create(1.0)");
61: else put(file," + ");
62: end if;
63: elsif t.cf = Create(-1.0)
64: then if Sum(t.dg) = 0
65: then put(file," - Create(1.0)");
66: else put(file," - ");
67: end if;
68: else put(file," + Create(");
69: put(file,REAL_PART(t.cf));
70: put(file,",");
71: put(file,IMAG_PART(t.cf));
72: put(file,")");
73: cff := true;
74: end if;
75: for i in t.dg'range loop
76: if t.dg(i) /= 0
77: then if cff
78: then put(file,"*");
79: else cff := true;
80: end if;
81: put(file,"x(" & Convert(i) & ")");
82: if t.dg(i) > 1
83: then put(file,"**");
84: put(file,t.dg(i),1);
85: end if;
86: end if;
87: end loop;
88: end Create_Inline_Term_Evaluator;
89:
90: procedure Create_Inline_Polynomial_Evaluator
91: ( file : in file_type; p : in Poly ) is
92:
93: procedure Visit_Term ( t : in Term; continue : out boolean ) is
94: begin
95: Create_Inline_Term_Evaluator(file,t);
96: continue := true;
97: end Visit_Term;
98: procedure Visit_Terms is new Visiting_Iterator(Visit_Term);
99:
100: begin
101: Visit_Terms(p);
102: put_line(file,";");
103: end Create_Inline_Polynomial_Evaluator;
104:
105: procedure Create_Inline_System_Evaluator
106: ( file : in file_type; funname : in String; p : in Poly_Sys ) is
107:
108: -- DESCRIPTION :
109: -- Writes the body of a function for an evaluator for p on file.
110:
111: begin
112: put_line(file," function " & funname
113: & " ( x : Vector ) return Vector is");
114: new_line(file);
115: put_line(file," y : Vector(x'range);");
116: new_line(file);
117: put_line(file," begin");
118: for i in p'range loop
119: put(file," y(" & Convert(i) & ") := ");
120: Create_Inline_Polynomial_Evaluator(file,p(i));
121: end loop;
122: put_line(file," return y;");
123: put_line(file," end " & funname & ";");
124: end Create_Inline_System_Evaluator;
125:
126: procedure Create_Inline_Jacobian_Evaluator
127: ( file : in file_type; funname : in String; p : in Poly_Sys ) is
128:
129: -- DESCRIPTION :
130: -- Writes the body of a function to evaluate the Jacobian matrix of
131: -- p on file.
132:
133: jm : Jaco_Mat(p'range,p'range) := Create(p);
134:
135: begin
136: put_line(file," function " & funname
137: & " ( x : Vector ) return Matrix is");
138: new_line(file);
139: put_line(file," y : Matrix(x'range,x'range);");
140: new_line(file);
141: put_line(file," begin");
142: for i in p'range loop
143: for j in p'range loop
144: put(file," y(" & Convert(i) & "," & Convert(j) & ") := ");
145: Create_Inline_Polynomial_Evaluator(file,jm(i,j));
146: end loop;
147: end loop;
148: put_line(file," return y;");
149: put_line(file," end " & funname & ";");
150: Clear(jm);
151: end Create_Inline_Jacobian_Evaluator;
152:
153: function Read_Package_Name return String is
154:
155: -- DESCRIPTION :
156: -- Reads the package name from standard input and returns the string.
157:
158: begin
159: put_line("Reading the name of the package.");
160: declare
161: s : String := Read_String;
162: begin
163: return s;
164: end;
165: end Read_Package_Name;
166:
167: procedure Create ( packname : in String; p : in Poly_Sys ) is
168:
169: -- DESCRIPTION :
170: -- Creates a package that allows to evaluate the polynomial system p.
171:
172: specfile,bodyfile : file_type;
173:
174: begin
175: Replace_Symbols;
176: Create(specfile,out_file,packname & ".ads");
177: put_line(specfile,"with Standard_Complex_Vectors; "
178: & "use Standard_Complex_Vectors;");
179: put_line(specfile,"with Standard_Complex_Matrices; "
180: & "use Standard_Complex_Matrices;");
181: new_line(specfile);
182: put_line(specfile,"package " & packname & " is");
183: new_line(specfile);
184: put_line(specfile," function Eval_Sys ( x : Vector ) return Vector;");
185: put_line(specfile," function Eval_Jaco ( x : Vector ) return Matrix;");
186: new_line(specfile);
187: put_line(specfile,"end " & packname & ";");
188: Close(specfile);
189: Create(bodyfile,out_file,packname & ".adb");
190: put_line(bodyfile,"with Standard_Floating_Numbers; "
191: & "use Standard_Floating_Numbers;");
192: put_line(bodyfile,"with Standard_Complex_Numbers; "
193: & "use Standard_Complex_Numbers;");
194: new_line(bodyfile);
195: put_line(bodyfile,"package body " & packname & " is");
196: new_line(bodyfile);
197: Create_Inline_System_Evaluator(bodyfile,"Eval_Sys",p);
198: new_line(bodyfile);
199: Create_Inline_Jacobian_Evaluator(bodyfile,"Eval_Jaco",p);
200: new_line(bodyfile);
201: put_line(bodyfile,"end " & packname & ";");
202: Close(bodyfile);
203: end Create;
204:
205: procedure Create ( p : in Poly_Sys ) is
206:
207: -- DESCRIPTION :
208: -- Creates a package that allows to evaluate the polynomial system p.
209:
210: packname : String := Read_Package_Name;
211:
212: begin
213: Create(packname,p);
214: end Create;
215:
216: end Standard_Evaluator_Packages;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>