Annotation of OpenXM_contrib/PHC/Ada/Continuation/standard_root_refiners.adb, Revision 1.1.1.1
1.1 maekawa 1: with integer_io; use integer_io;
2: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
3: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
4: with Standard_Complex_Numbers_io; use Standard_Complex_Numbers_io;
5: with Standard_Complex_Vectors; use Standard_Complex_Vectors;
6: with Standard_Natural_Vectors;
7: with Standard_Complex_Matrices; use Standard_Complex_Matrices;
8: with Standard_Complex_Linear_Solvers; use Standard_Complex_Linear_Solvers;
9: with Standard_Complex_Norms_Equals; use Standard_Complex_Norms_Equals;
10: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
11:
12: package body Standard_Root_Refiners is
13:
14: -- AUXILIARIES :
15:
16: function Is_Real ( sol : Solution; tol : double_float ) return boolean is
17: begin
18: for i in sol.v'range loop
19: if ABS(IMAG_PART(sol.v(i))) > tol
20: then return false;
21: end if;
22: end loop;
23: return true;
24: end Is_Real;
25:
26: function Equal ( s1,s2 : Solution; tol : double_float ) return boolean is
27: begin
28: for i in s1.v'range loop
29: if not Equal(s1.v(i),s2.v(i),tol)
30: then return false;
31: end if;
32: end loop;
33: return true;
34: end Equal;
35:
36: function Complex_Conjugate ( s : Solution ) return Solution is
37:
38: res : Solution(s.n) := s;
39:
40: begin
41: for i in res.v'range loop
42: res.v(i) := Create(REAL_PART(s.v(i)),-IMAG_PART(s.v(i)));
43: end loop;
44: return res;
45: end Complex_Conjugate;
46:
47: function Is_Clustered ( sol : Solution; nb : natural; sols : Solution_List;
48: tol : double_float ) return natural is
49:
50: tmp : Solution_List := sols;
51: cnt : natural := 0;
52:
53: begin
54: while not Is_Null(tmp) loop
55: cnt := cnt + 1;
56: if cnt /= nb
57: then if Equal(sol,Head_Of(tmp).all,tol)
58: then return cnt;
59: end if;
60: end if;
61: tmp := Tail_Of(tmp);
62: end loop;
63: return nb;
64: end Is_Clustered;
65:
66: function Is_Clustered ( sol : Solution; nb : natural; sols : Solution_Array;
67: tol : double_float ) return natural is
68: begin
69: for i in sols'range loop
70: if i /= nb
71: then if Equal(sol,sols(i).all,tol)
72: then return i;
73: end if;
74: end if;
75: end loop;
76: return nb;
77: end Is_Clustered;
78:
79: function Multiplicity ( sol : Solution; sols : Solution_List;
80: tol : double_float ) return natural is
81:
82: tmp : Solution_List := sols;
83: cnt : natural := 0;
84:
85: begin
86: while not Is_Null(tmp) loop
87: if Equal(sol,Head_Of(tmp).all,tol)
88: then cnt := cnt + 1;
89: end if;
90: tmp := Tail_Of(tmp);
91: end loop;
92: return cnt;
93: end Multiplicity;
94:
95: function Multiplicity ( sol : Solution; sols : Solution_Array;
96: tol : double_float ) return natural is
97: cnt : natural := 0;
98:
99: begin
100: for i in sols'range loop
101: if Equal(sol,sols(i).all,tol)
102: then cnt := cnt + 1;
103: end if;
104: end loop;
105: return cnt;
106: end Multiplicity;
107:
108: procedure Write_Bar ( file : in file_type ) is
109: begin
110: for i in 1..75 loop
111: put(file,'=');
112: end loop;
113: new_line(file);
114: end Write_Bar;
115:
116: procedure Write_Info ( file : in file_type; zero : in Solution;
117: i,n,numb : in natural; fail : in boolean ) is
118:
119: -- DESCRIPTION :
120: -- The information concerning the zero is written
121:
122: begin
123: -- Write_Bar(file);
124: put(file,"solution "); put(file,i,1); put(file," : ");
125: put(file," start residual : "); put(file,zero.res,2,3,3); new_line(file);
126: put(file,zero);
127: end Write_Info;
128:
129: procedure Root_Accounting
130: ( file : in file_type; ls : in out Link_to_Solution;
131: nb : in natural; sa : in out Solution_Array;
132: fail : in boolean; tolsing,tolclus : in double_float;
133: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus : in out natural ) is
134:
135: -- DESCRIPTION :
136: -- This procedure does root accounting of the solution sol, w.r.t. the
137: -- solution list sols. Information will be provided concerning the type
138: -- of solution.
139:
140: begin
141: if fail
142: then put_line(file," no solution ==");
143: nbfail := nbfail + 1;
144: ls.m := 0;
145: else if Is_Real(ls.all,10.0**(-13))
146: then put(file," real ");
147: nbreal := nbreal + 1;
148: else put(file," complex ");
149: nbcomp := nbcomp + 1;
150: end if;
151: if sa(nb).rco < tolsing
152: then declare
153: m : natural := Multiplicity(ls.all,sa,tolclus);
154: begin
155: if m = 1
156: then m := 0;
157: end if;
158: ls.m := m;
159: end;
160: put_line(file,"singular ==");
161: nbsing := nbsing + 1;
162: else declare
163: nb2 : natural := Is_Clustered(ls.all,nb,sa,tolclus);
164: begin
165: if nb2 = nb
166: then put_line(file,"regular ==");
167: nbreg := nbreg + 1;
168: else put(file,"clustered : ");
169: put(file,nb2,1);
170: put_line(file," ==");
171: nbclus := nbclus + 1;
172: end if;
173: ls.m := 1;
174: end;
175: end if;
176: end if;
177: end Root_Accounting;
178:
179: procedure Root_Accounting
180: ( ls : in out Link_to_Solution; nb : in natural;
181: sa : in out Solution_Array; fail : in boolean;
182: tolsing,tolclus : in double_float ) is
183:
184: -- DESCRIPTION :
185: -- This procedure does root accounting of the solution sol, w.r.t. the
186: -- solution list sols. Information will be provided concerning the type
187: -- of solution.
188:
189: begin
190: if fail
191: then ls.m := 0;
192: elsif sa(nb).rco < tolsing
193: then declare
194: m : natural := Multiplicity(ls.all,sa,tolclus);
195: begin
196: if m = 1
197: then ls.m := 0;
198: else ls.m := m;
199: end if;
200: end;
201: else ls.m := 1;
202: end if;
203: end Root_Accounting;
204:
205: procedure Write_Global_Info
206: ( file : in file_type;
207: tot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus : in natural ) is
208:
209: begin
210: Write_Bar(file);
211: put(file,"A list of "); put(file,tot,1);
212: put_line(file," solutions has been refined :");
213: put(file,"Number of regular solutions : "); put(file,nbreg,1);
214: put_line(file,".");
215: put(file,"Number of singular solutions : "); put(file,nbsing,1);
216: put_line(file,".");
217: put(file,"Number of real solutions : "); put(file,nbreal,1);
218: put_line(file,".");
219: put(file,"Number of complex solutions : "); put(file,nbcomp,1);
220: put_line(file,".");
221: put(file,"Number of clustered solutions : "); put(file,nbclus,1);
222: put_line(file,".");
223: put(file,"Number of failures : "); put(file,nbfail,1);
224: put_line(file,".");
225: Write_Bar(file);
226: end Write_Global_Info;
227:
228: -- TARGET ROUTINES :
229:
230: procedure Silent_Newton
231: ( p_eval : in Eval_Poly_Sys; j_eval : in Eval_Jaco_Mat;
232: zero : in out Solution; epsxa,epsfa : in double_float;
233: numit : in out natural; max : in natural;
234: fail : out boolean ) is
235:
236: n : natural := zero.n;
237: jacobian : matrix(1..n,1..n);
238: ipvt : Standard_Natural_Vectors.Vector(1..n);
239: y,deltax : Vector(1..n);
240:
241: begin
242: y := eval(p_eval,zero.v); -- y = f(zero)
243: for i in 1..max loop
244: jacobian := eval(j_eval,zero.v); -- solve jacobian*deltax = -f(zero)
245: lufco(jacobian,n,ipvt,zero.rco);
246: if 1.0 + zero.rco = 1.0
247: then fail := (Sum_Norm(y) > epsfa);
248: return; -- singular Jacobian matrix
249: end if;
250: deltax := -y;
251: lusolve(jacobian,n,ipvt,deltax);
252: Add(zero.v,deltax); -- make the updates
253: y := eval(p_eval,zero.v);
254: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
255: numit := numit + 1;
256: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
257: -- stopping criteria
258: then fail := false; exit;
259: elsif numit >= max
260: then fail := true; exit;
261: end if;
262: end loop;
263: jacobian := eval(j_eval,zero.v); -- compute condition number
264: lufco(jacobian,n,ipvt,zero.rco);
265: exception
266: when numeric_error | constraint_error => fail := true; return;
267: end Silent_Newton;
268:
269: procedure Silent_Newton
270: ( p_eval : in Standard_Complex_Poly_SysFun.Evaluator;
271: j_eval : in Standard_Complex_Jaco_Matrices.Evaluator;
272: zero : in out Solution; epsxa,epsfa : in double_float;
273: numit : in out natural; max : in natural;
274: fail : out boolean ) is
275:
276: n : natural := zero.n;
277: jacobian : matrix(1..n,1..n);
278: ipvt : Standard_Natural_Vectors.Vector(1..n);
279: y,deltax : Vector(1..n);
280:
281: begin
282: y := p_eval(zero.v); -- y = f(zero)
283: for i in 1..max loop
284: jacobian := j_eval(zero.v); -- solve jacobian*deltax = -f(zero)
285: lufco(jacobian,n,ipvt,zero.rco);
286: if 1.0 + zero.rco = 1.0
287: then fail := (Sum_Norm(y) > epsfa);
288: return; -- singular Jacobian matrix
289: end if;
290: deltax := -y;
291: lusolve(jacobian,n,ipvt,deltax);
292: Add(zero.v,deltax); -- make the updates
293: y := p_eval(zero.v);
294: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
295: numit := numit + 1;
296: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
297: -- stopping criteria
298: then fail := false; exit;
299: elsif numit >= max
300: then fail := true; exit;
301: end if;
302: end loop;
303: jacobian := j_eval(zero.v); -- compute condition number
304: lufco(jacobian,n,ipvt,zero.rco);
305: exception
306: when numeric_error | constraint_error => fail := true; return;
307: end Silent_Newton;
308:
309: procedure Reporting_Newton
310: ( file : in file_type;
311: p_eval : in Eval_Poly_Sys; j_eval : in Eval_Jaco_Mat;
312: zero : in out Solution; epsxa,epsfa : in double_float;
313: numit : in out natural; max : in natural;
314: fail : out boolean ) is
315:
316: n : natural := zero.n;
317: jacobian : matrix(1..n,1..n);
318: ipvt : Standard_Natural_Vectors.Vector(1..n);
319: y,deltax : Vector(1..n);
320:
321: begin
322: y := Eval(p_eval,zero.v); -- y = f(zero)
323: for i in 1..max loop
324: jacobian := eval(j_eval,zero.v); -- solve jacobian*deltax = -f(zero)
325: lufco(jacobian,n,ipvt,zero.rco);
326: if 1.0 + zero.rco = 1.0 -- singular jacobian matrix
327: then fail := (Sum_Norm(y) > epsfa); -- accuracy not reached yet
328: return;
329: end if;
330: deltax := -y;
331: lusolve(jacobian,n,ipvt,deltax);
332: Add(zero.v,deltax); -- make the updates
333: y := eval(p_eval,zero.v);
334: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
335: numit := numit + 1;
336: put(file,"Step "); put(file,numit,4); new_line(file); -- output
337: put(file," |errxa| : "); put(file,zero.err); new_line(file);
338: put(file," |errfa| : "); put(file,zero.res); new_line(file);
339: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
340: -- stopping criteria
341: then fail := false; exit;
342: elsif numit >= max
343: then fail := true; exit;
344: end if;
345: end loop;
346: jacobian := eval(j_eval,zero.v); -- compute condition number
347: lufco(jacobian,n,ipvt,zero.rco);
348: exception
349: when numeric_error | constraint_error => fail := true; return;
350: end Reporting_Newton;
351:
352: procedure Reporting_Newton
353: ( file : in file_type;
354: p_eval : in Standard_Complex_Poly_SysFun.Evaluator;
355: j_eval : in Standard_Complex_Jaco_Matrices.Evaluator;
356: zero : in out Solution; epsxa,epsfa : in double_float;
357: numit : in out natural; max : in natural;
358: fail : out boolean ) is
359:
360: n : natural := zero.n;
361: jacobian : matrix(1..n,1..n);
362: ipvt : Standard_Natural_Vectors.Vector(1..n);
363: y,deltax : Vector(1..n);
364:
365: begin
366: y := p_eval(zero.v); -- y = f(zero)
367: for i in 1..max loop
368: jacobian := j_eval(zero.v); -- solve jacobian*deltax = -f(zero)
369: lufco(jacobian,n,ipvt,zero.rco);
370: if 1.0 + zero.rco = 1.0 -- singular jacobian matrix
371: then fail := (Sum_Norm(y) > epsfa); -- accuracy not reached yet
372: return;
373: end if;
374: deltax := -y;
375: lusolve(jacobian,n,ipvt,deltax);
376: Add(zero.v,deltax); -- make the updates
377: y := p_eval(zero.v);
378: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
379: numit := numit + 1;
380: put(file,"Step "); put(file,numit,4); new_line(file); -- output
381: put(file," |errxa| : "); put(file,zero.err); new_line(file);
382: put(file," |errfa| : "); put(file,zero.res); new_line(file);
383: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
384: -- stopping criteria
385: then fail := false; exit;
386: elsif numit >= max
387: then fail := true; exit;
388: end if;
389: end loop;
390: jacobian := j_eval(zero.v); -- compute condition number
391: lufco(jacobian,n,ipvt,zero.rco);
392: exception
393: when numeric_error | constraint_error => fail := true; return;
394: end Reporting_Newton;
395:
396: procedure Silent_Root_Refiner
397: ( p : in Poly_Sys; sols : in out Solution_List;
398: epsxa,epsfa,tolsing : in double_float;
399: numit : in out natural; max : in natural ) is
400:
401: n : natural := p'length;
402: p_eval : Eval_Poly_Sys(1..n) := Create(p);
403: jac : Jaco_Mat(1..n,1..n) := Create(p);
404: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
405: numb : natural;
406: fail : boolean;
407: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
408:
409: begin
410: for i in sa'range loop
411: numb := 0;
412: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
413: if sa(i).res < 1.0
414: then Silent_Newton(p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
415: else fail := true;
416: end if;
417: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
418: numit := numit + numb;
419: end loop;
420: clear(p_eval); clear(jac); clear(jac_eval);
421: Deep_Clear(sols); sols := Create(sa); Clear(sa);
422: end Silent_Root_Refiner;
423:
424: procedure Silent_Root_Refiner
425: ( p : in Standard_Complex_Poly_SysFun.Evaluator;
426: j : in Standard_Complex_Jaco_Matrices.Evaluator;
427: sols : in out Solution_List;
428: epsxa,epsfa,tolsing : in double_float;
429: numit : in out natural; max : in natural ) is
430:
431: n : constant natural := Head_Of(sols).n;
432: numb : natural;
433: fail : boolean;
434: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
435:
436: begin
437: for i in sa'range loop
438: numb := 0;
439: sa(i).res := Sum_Norm(p(sa(i).v));
440: if sa(i).res < 1.0
441: then Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
442: else fail := true;
443: end if;
444: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
445: numit := numit + numb;
446: end loop;
447: Deep_Clear(sols); sols := Create(sa); Clear(sa);
448: end Silent_Root_Refiner;
449:
450: procedure Silent_Root_Refiner
451: ( p : in Poly_Sys; sols,refsols : in out Solution_List;
452: epsxa,epsfa,tolsing : in double_float;
453: numit : in out natural; max : in natural ) is
454:
455: n : natural := p'length;
456: p_eval : Eval_Poly_Sys(1..n) := Create(p);
457: jac : Jaco_Mat(1..n,1..n) := Create(p);
458: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
459: numb : natural;
460: fail : boolean;
461: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
462: refsols_last : Solution_List;
463:
464: begin
465: for i in sa'range loop
466: numb := 0;
467: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
468: if sa(i).res < 1.0
469: then Silent_Newton(p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
470: if not fail
471: then Append(refsols,refsols_last,sa(i).all);
472: end if;
473: else fail := true;
474: end if;
475: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
476: numit := numit + numb;
477: end loop;
478: clear(p_eval); clear(jac); clear(jac_eval);
479: Deep_Clear(sols); sols := Create(sa); Clear(sa);
480: end Silent_Root_Refiner;
481:
482: procedure Silent_Root_Refiner
483: ( p : in Standard_Complex_Poly_SysFun.Evaluator;
484: j : in Standard_Complex_Jaco_Matrices.Evaluator;
485: sols,refsols : in out Solution_List;
486: epsxa,epsfa,tolsing : in double_float;
487: numit : in out natural; max : in natural ) is
488:
489: n : constant natural := Head_Of(sols).n;
490: numb : natural;
491: fail : boolean;
492: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
493: refsols_last : Solution_List;
494:
495: begin
496: for i in sa'range loop
497: numb := 0;
498: sa(i).res := Sum_Norm(p(sa(i).v));
499: if sa(i).res < 1.0
500: then Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
501: if not fail
502: then Append(refsols,refsols_last,sa(i).all);
503: end if;
504: else fail := true;
505: end if;
506: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
507: numit := numit + numb;
508: end loop;
509: Deep_Clear(sols); sols := Create(sa); Clear(sa);
510: end Silent_Root_Refiner;
511:
512: procedure Reporting_Root_Refiner
513: ( file : in file_type;
514: p : in Poly_Sys; sols : in out Solution_List;
515: epsxa,epsfa,tolsing : in double_float;
516: numit : in out natural; max : in natural;
517: wout : in boolean ) is
518:
519: n : natural := p'length;
520: p_eval : Eval_Poly_Sys(1..n) := Create(p);
521: jac : Jaco_Mat(1..n,1..n) := Create(p);
522: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
523: numb : natural;
524: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
525: nbtot : constant natural := Length_Of(sols);
526: fail : boolean;
527: sa : Solution_Array(1..nbtot) := Create(sols);
528:
529: begin
530: new_line(file);
531: put_line(file,"THE SOLUTIONS :"); new_line(file);
532: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
533: Write_Bar(file);
534: for i in sa'range loop
535: numb := 0;
536: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
537: if sa(i).res < 1.0
538: then
539: if wout
540: then Reporting_Newton
541: (file,p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
542: else Silent_Newton
543: (p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
544: end if;
545: else
546: fail := true;
547: end if;
548: Write_Info(file,sa(i).all,i,n,numb,fail);
549: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
550: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
551: numit := numit + numb;
552: end loop;
553: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
554: clear(p_eval); clear(jac); clear(jac_eval);
555: Deep_Clear(sols); sols := Create(sa); Clear(sa);
556: end Reporting_Root_Refiner;
557:
558: procedure Reporting_Root_Refiner
559: ( file : in file_type;
560: p : in Standard_Complex_Poly_SysFun.Evaluator;
561: j : in Standard_Complex_Jaco_Matrices.Evaluator;
562: sols : in out Solution_List;
563: epsxa,epsfa,tolsing : in double_float;
564: numit : in out natural; max : in natural;
565: wout : in boolean ) is
566:
567: n : constant natural := Head_Of(sols).n;
568: numb : natural;
569: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
570: nbtot : constant natural := Length_Of(sols);
571: fail : boolean;
572: sa : Solution_Array(1..nbtot) := Create(sols);
573:
574: begin
575: new_line(file);
576: put_line(file,"THE SOLUTIONS :"); new_line(file);
577: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
578: Write_Bar(file);
579: for i in sa'range loop
580: numb := 0;
581: sa(i).res := Sum_Norm(p(sa(i).v));
582: if sa(i).res < 1.0
583: then
584: if wout
585: then Reporting_Newton(file,p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
586: else Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
587: end if;
588: else
589: fail := true;
590: end if;
591: Write_Info(file,sa(i).all,i,n,numb,fail);
592: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
593: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
594: numit := numit + numb;
595: end loop;
596: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
597: Deep_Clear(sols); sols := Create(sa); Clear(sa);
598: end Reporting_Root_Refiner;
599:
600: procedure Reporting_Root_Refiner
601: ( file : in file_type;
602: p : in Poly_Sys; sols,refsols : in out Solution_List;
603: epsxa,epsfa,tolsing : in double_float;
604: numit : in out natural; max : in natural;
605: wout : in boolean ) is
606:
607: n : natural := p'length;
608: p_eval : Eval_Poly_Sys(1..n) := Create(p);
609: jac : Jaco_Mat(1..n,1..n) := Create(p);
610: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
611: numb : natural;
612: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
613: nbtot : constant natural := Length_Of(sols);
614: fail : boolean;
615: sa : Solution_Array(1..nbtot) := Create(sols);
616: refsols_last : Solution_List;
617:
618: begin
619: new_line(file);
620: put_line(file,"THE SOLUTIONS :"); new_line(file);
621: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
622: Write_Bar(file);
623: for i in sa'range loop
624: numb := 0;
625: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
626: if sa(i).res < 1.0
627: then
628: if wout
629: then Reporting_Newton
630: (file,p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
631: else Silent_Newton
632: (p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
633: end if;
634: if not fail
635: then Append(refsols,refsols_last,sa(i).all);
636: end if;
637: else
638: fail := true;
639: end if;
640: Write_Info(file,sa(i).all,i,n,numb,fail);
641: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
642: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
643: numit := numit + numb;
644: end loop;
645: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
646: clear(p_eval); clear(jac); clear(jac_eval);
647: Deep_Clear(sols); sols := Create(sa); Clear(sa);
648: end Reporting_Root_Refiner;
649:
650: procedure Reporting_Root_Refiner
651: ( file : in file_type;
652: p : in Standard_Complex_Poly_SysFun.Evaluator;
653: j : in Standard_Complex_Jaco_Matrices.Evaluator;
654: sols,refsols : in out Solution_List;
655: epsxa,epsfa,tolsing : in double_float;
656: numit : in out natural; max : in natural;
657: wout : in boolean ) is
658:
659: n : constant natural := Head_Of(sols).n;
660: numb : natural;
661: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
662: nbtot : constant natural := Length_Of(sols);
663: fail : boolean;
664: sa : Solution_Array(1..nbtot) := Create(sols);
665: refsols_last : Solution_List;
666:
667: begin
668: new_line(file);
669: put_line(file,"THE SOLUTIONS :"); new_line(file);
670: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
671: Write_Bar(file);
672: for i in sa'range loop
673: numb := 0;
674: sa(i).res := Sum_Norm(p(sa(i).v));
675: if sa(i).res < 1.0
676: then
677: if wout
678: then Reporting_Newton(file,p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
679: else Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
680: end if;
681: if not fail
682: then Append(refsols,refsols_last,sa(i).all);
683: end if;
684: else
685: fail := true;
686: end if;
687: Write_Info(file,sa(i).all,i,n,numb,fail);
688: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
689: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
690: numit := numit + numb;
691: end loop;
692: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
693: Deep_Clear(sols); sols := Create(sa); Clear(sa);
694: end Reporting_Root_Refiner;
695:
696: end Standard_Root_Refiners;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>