Annotation of OpenXM_contrib/PHC/Ada/Schubert/deformation_posets.adb, Revision 1.1.1.1
1.1 maekawa 1: with unchecked_deallocation;
2: with integer_io; use integer_io;
3: with Timing_Package; use Timing_Package;
4: with Characters_and_Numbers; use Characters_and_Numbers;
5: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
6: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
7: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
8: with Standard_Complex_Numbers_io; use Standard_Complex_Numbers_io;
9: with Standard_Complex_Vectors_io; use Standard_Complex_Vectors_io;
10: with Standard_Natural_Matrices;
11: with Standard_Complex_Matrices;
12: with Standard_Complex_Matrices_io; use Standard_Complex_Matrices_io;
13: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
14: with Symbol_Table; use Symbol_Table;
15: with Standard_Complex_Poly_Functions; use Standard_Complex_Poly_Functions;
16: with Standard_Complex_Poly_SysFun; use Standard_Complex_Poly_SysFun;
17: with Standard_Complex_Poly_Systems; use Standard_Complex_Poly_Systems;
18: with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
19: with Standard_Complex_Poly_Matrices;
20: with Standard_Complex_Poly_Matrices_io; use Standard_Complex_Poly_Matrices_io;
21: with Brackets,Brackets_io; use Brackets,Brackets_io;
22: with Bracket_Monomials; use Bracket_Monomials;
23: with Bracket_Polynomials; use Bracket_Polynomials;
24: with Bracket_Systems; use Bracket_Systems;
25: with Bracket_Systems_io; use Bracket_Systems_io;
26: with Plane_Representations; use Plane_Representations;
27: with Symbolic_Minor_Equations; use Symbolic_Minor_Equations;
28: with Numeric_Minor_Equations; use Numeric_Minor_Equations;
29: with Determinantal_Systems; use Determinantal_Systems;
30: with Specialization_of_Planes; use Specialization_of_Planes;
31: with Curves_into_Grassmannian; use Curves_into_Grassmannian;
32: with Curves_into_Grassmannian_io; use Curves_into_Grassmannian_io;
33: with Pieri_Homotopies; use Pieri_Homotopies;
34: with Pieri_Continuation; use Pieri_Continuation;
35:
36: package body Deformation_Posets is
37:
38: -- BRACKET AUXILIARITIES TO DETERMINE PIVOTS :
39:
40: function Complement ( n : natural; b : Bracket ) return Bracket is
41:
42: -- DESCRIPTION :
43: -- Returns the complement of the bracket b, defined as a bracket
44: -- of range 1..n-b'length as an ordered subset of {1..n} \ b.
45:
46: res : Bracket(1..n-b'last);
47: cnt : natural := 0;
48: ind : natural := 1;
49:
50: begin
51: for i in 1..n loop
52: if ((ind > b'last) or else (i < b(ind)))
53: then cnt := cnt+1;
54: res(cnt) := i;
55: elsif i = b(ind)
56: then ind := ind+1;
57: end if;
58: end loop;
59: return res;
60: end Complement;
61:
62: function Remove ( b : Bracket; l : natural ) return Bracket is
63:
64: -- DESCRIPTION :
65: -- Returns a smaller bracket that does not contain l.
66:
67: -- REQUIRED : there exists a k: b(k) = l.
68:
69: res : Bracket(1..b'last-1);
70: cnt : natural := 0;
71:
72: begin
73: for i in b'range loop
74: if b(i) /= l
75: then cnt := cnt+1;
76: res(cnt) := b(i);
77: end if;
78: end loop;
79: return res;
80: end Remove;
81:
82: function Is_In ( b : Bracket; l : natural ) return boolean is
83:
84: -- DESCRIPTION :
85: -- Returns true if there exists an index k such that b(k) = l.
86:
87: begin
88: for k in b'range loop
89: if b(k) = l
90: then return true;
91: end if;
92: end loop;
93: return false;
94: end Is_In;
95:
96: function Remove ( b1,b2 : Bracket ) return Bracket is
97:
98: -- DESCRIPTION :
99: -- Returns b1 minus the first element in b2 that also occurs in b1.
100:
101: begin
102: for i in b2'range loop
103: if Is_In(b1,b2(i))
104: then return Remove(b1,b2(i));
105: end if;
106: end loop;
107: return b1;
108: end Remove;
109:
110: function Remove ( cols,b,subb : Bracket ) return Bracket is
111:
112: -- DESCRIPTION :
113: -- The indices in cols correspond to the entries in b.
114: -- The bracket subb is a sub-bracket of b, with only one entry removed.
115: -- The indices on return correspond to the entries in subb.
116:
117: res : Bracket(subb'range);
118:
119: begin
120: for i in subb'range loop
121: if b(i) = subb(i)
122: then res(i) := cols(i);
123: else res(i) := cols(i+1);
124: end if;
125: end loop;
126: return res;
127: end Remove;
128:
129: -- POSET-ORIENTED PIERI DEFORMATIONS :
130:
131: function Leaf_Plane ( n : natural; nd : Node )
132: return Standard_Complex_Matrices.Matrix is
133:
134: -- DESCRIPTION :
135: -- Returns the solution plane that corresponds to a leaf of the poset.
136:
137: res : Standard_Complex_Matrices.Matrix(1..n,nd.top'range);
138:
139: begin
140: for i in res'range(1) loop
141: for j in res'range(2) loop
142: res(i,j) := Create(0.0);
143: end loop;
144: end loop;
145: for i in nd.top'range loop
146: res(nd.top(i),i) := Create(1.0);
147: end loop;
148: return res;
149: end Leaf_Plane;
150:
151: -- DEFORMATIONS :
152:
153: function Path_Coordinates ( level,label,child : natural )
154: return string is
155: begin
156: return "tracing (User time) at node("
157: & Convert(level) & ")("
158: & Convert(label) & ") from child "
159: & Convert(child);
160: end Path_Coordinates;
161:
162: procedure Write_Path_Coordinates
163: ( file : in file_type;
164: level,label,path,child,childpath : in natural ) is
165:
166: -- DESCRIPTION :
167: -- Writes all coordinates from the current path that is to be traced.
168:
169: begin
170: put(file,"Tracing at node("); put(file,level,1); put(file,")(");
171: put(file,label,1); put(file,") path "); put(file,path,1);
172: put(file," as path "); put(file,childpath,1);
173: put(file," from child "); put(file,child,1); new_line(file);
174: end Write_Path_Coordinates;
175:
176: procedure Write_Path_Coordinates
177: ( file : in file_type;
178: level,label,child : in natural ) is
179:
180: -- DESCRIPTION :
181: -- Writes all coordinates from the current path that is to be traced.
182:
183: begin
184: put(file,"Tracing paths at node("); put(file,level,1); put(file,")(");
185: put(file,label,1);
186: put(file,") from child "); put(file,child,1); new_line(file);
187: end Write_Path_Coordinates;
188:
189: procedure Deform_from_Children
190: ( file : in file_type;
191: poset : in out Array_of_Array_of_VecMats;
192: nd : in Node; n,uplevel : in natural;
193: homotopy : in Poly_Sys; report,outlog : in boolean;
194: x : in Standard_Complex_Poly_Matrices.Matrix;
195: npaths : in out Standard_Natural_Vectors.Vector;
196: timings : in out Duration_Array ) is
197:
198: -- DESCRIPTION :
199: -- Deforms from the i-th non-empty child of nd at uplevel.
200:
201: -- ON ENTRY :
202: -- file to write intermediate results on;
203: -- poset poset of solution p-planes;
204: -- nd current node in the localization poset;
205: -- n dimension of the working space;
206: -- uplevel level where to find the start planes in the poset;
207: -- homotopy family of moving planes;
208: -- report indicates whether intermediate output during continuation;
209: -- outlog flag to write homotopies on file if set to true.
210: -- x matrix of unknowns according to a localization pattern.
211:
212: -- ON RETURN :
213: -- poset updated poset of solution p-planes;
214: -- npaths updated number of paths traced at that level;
215: -- timings updated elapsed user timings.
216:
217: locmap : Standard_Natural_Matrices.Matrix(1..n,1..nd.p);
218: solcnt : natural := 0;
219: label : natural;
220:
221: begin
222: for i in nd.child_labels'range loop
223: label := nd.child_labels(i);
224: if not Empty(poset,uplevel,label) -- child.roco > 0
225: then
226: Write_Path_Coordinates(file,nd.level,nd.label,label);
227: declare
228: planes : VecMat(poset(uplevel)(label)'range);
229: timer : Timing_Widget;
230: begin
231: tstart(timer);
232: for i in planes'range loop -- create to avoid sharing
233: planes(i) := new Standard_Complex_Matrices.Matrix'
234: (poset(uplevel)(label)(i).all);
235: end loop;
236: locmap := Standard_Coordinate_Frame(x,planes(planes'first).all);
237: Trace_Paths(file,homotopy,locmap,report,outlog,planes);
238: for i in planes'range loop
239: solcnt := solcnt+1;
240: poset(nd.level)(nd.label)(solcnt) := planes(i);
241: end loop;
242: tstop(timer);
243: new_line(file);
244: print_times(file,timer,Path_Coordinates(nd.level,nd.label,label));
245: new_line(file);
246: timings(nd.level) := timings(nd.level) + Elapsed_User_Time(timer);
247: end;
248: end if;
249: end loop;
250: npaths(nd.level) := npaths(nd.level) + solcnt;
251: end Deform_from_Children;
252:
253: procedure Quantum_Deform_from_Children
254: ( file : in file_type;
255: poset : in out Array_of_Array_of_VecMats;
256: nd : in Node; n,q,uplevel : in natural;
257: homotopy : in Poly_Sys; conpar,s_mode : in natural;
258: report,outlog : in boolean;
259: x : in Standard_Complex_Poly_Matrices.Matrix;
260: npaths : in out Standard_Natural_Vectors.Vector;
261: timings : in out Duration_Array ) is
262:
263: -- DESCRIPTION :
264: -- Deforms from the i-th non-empty child of nd at uplevel.
265: -- This is the quantum analogue to the hypersurface Pieri.
266:
267: -- ON ENTRY :
268: -- file to write intermediate results on;
269: -- poset poset of solution p-planes;
270: -- nd current node in the localization poset;
271: -- n dimension of the working space;
272: -- q degree of the curve;
273: -- uplevel level where to find the start planes in the poset;
274: -- homotopy family of moving planes;
275: -- conpar number of the continuation parameter;
276: -- s_mode if = 0, then s = 0, otherwise s = 1 at start;
277: -- report indicates whether intermediate output during continuation;
278: -- outlog flag to write homotopies on file if set to true;
279: -- x symbolic representation of the curve matrix of polynomials.
280:
281: -- ON RETURN :
282: -- poset updated poset of solution p-planes;
283: -- npaths updated number of paths at each level;
284: -- timings updated CPU user timings for each level.
285:
286: m : constant natural := n - nd.p;
287: rws : constant natural := n*(q+1);
288: locmap : Standard_Natural_Matrices.Matrix(1..rws,1..nd.p);
289: solcnt : natural := 0;
290: label : natural;
291:
292: begin
293: for i in nd.child_labels'range loop
294: label := nd.child_labels(i);
295: if not Empty(poset,uplevel,label) -- child.roco > 0
296: then
297: Write_Path_Coordinates(file,nd.level,nd.label,label);
298: declare
299: planes : VecMat(poset(uplevel)(label)'range);
300: timer : Timing_Widget;
301: begin
302: tstart(timer);
303: for i in planes'range loop -- create to avoid sharing
304: planes(i) := new Standard_Complex_Matrices.Matrix'
305: (poset(uplevel)(label)(i).all);
306: end loop;
307: locmap := Standard_Coordinate_Frame
308: (m,nd.p,q,nd.top,nd.bottom,planes(planes'first).all);
309: Quantum_Trace_Paths
310: (file,m,nd.p,q,nd,homotopy,conpar,s_mode,locmap,
311: report,outlog,planes);
312: for i in planes'range loop
313: solcnt := solcnt+1;
314: poset(nd.level)(nd.label)(solcnt) := planes(i);
315: end loop;
316: tstop(timer);
317: new_line(file);
318: print_times(file,timer,Path_Coordinates(nd.level,nd.label,label));
319: new_line(file);
320: timings(nd.level) := timings(nd.level) + Elapsed_User_Time(timer);
321: end;
322: end if;
323: end loop;
324: npaths(nd.level) := npaths(nd.level) + solcnt;
325: end Quantum_Deform_from_Children;
326:
327: procedure Hypersurface_Deform
328: ( file : in file_type; n : in natural;
329: poset : in out Array_of_Array_of_VecMats;
330: nd : in Node; expbp : in Bracket_Polynomial;
331: planes : in VecMat; report,outlog : in boolean;
332: npaths : in out Standard_Natural_Vectors.Vector;
333: timings : in out Duration_Array ) is
334:
335: -- DESCRIPTION :
336: -- Does the Pieri deformations to the node, same specifications as Solve
337: -- for the hypersurface case.
338:
339: -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
340:
341: xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
342: := Localization_Pattern(n,nd.top,nd.bottom);
343: homsys : Poly_Sys(1..nd.level);
344:
345: begin
346: if nd.tp = mixed
347: then homsys := Two_Hypersurface_Pieri_Homotopy(n,nd,expbp,xpm,planes);
348: Deform_from_Children
349: (file,poset,nd,n,nd.level-2,homsys,report,outlog,
350: xpm,npaths,timings);
351: else homsys := One_Hypersurface_Pieri_Homotopy(n,nd,expbp,xpm,planes);
352: Deform_from_Children
353: (file,poset,nd,n,nd.level-1,homsys,report,outlog,
354: xpm,npaths,timings);
355: end if;
356: Standard_Complex_Poly_Matrices.Clear(xpm);
357: Clear(homsys);
358: end Hypersurface_Deform;
359:
360: procedure One_General_Deform
361: ( file : in file_type; n,ind : in natural;
362: poset : in out Array_of_Array_of_VecMats; nd : in Node;
363: start,target : in Standard_Complex_Matrices.Matrix;
364: planes : in VecMat; bs : in Bracket_System;
365: report,outlog : in boolean;
366: npaths : in out Standard_Natural_Vectors.Vector;
367: timings : in out Duration_Array ) is
368:
369: -- DESCRIPTION :
370: -- Does the Pieri deformations to the node, same specifications as Solve
371: -- for the general case.
372:
373: -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
374:
375: -- ON ENTRY :
376: -- file to write intermediate output to;
377: -- n number of rows in the matrices;
378: -- ind planes(ind) is currently being folded in with this chain;
379: -- poset contains solution planes at higher levels;
380: -- nd current node in the localization poset;
381: -- start start (m+1-k)-plane for pivots;
382: -- target target (m+1-k)-plane for pivots;
383: -- planes target planes;
384: -- bs structure to expand the minors;
385: -- report switch to determine output during continuation;
386: -- outlog flag to write homotopies on file if set to true.
387:
388: -- ON RETURN :
389: -- poset solution planes at (nd.level)(nd.label) are determined;
390: -- npaths number of paths followed at each level;
391: -- timings CPU user time at each level.
392:
393: xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
394: := Localization_Pattern(n,nd.top,nd.bottom);
395: hom : Link_to_Poly_Sys
396: := One_General_Pieri_Homotopy(n,ind,nd,bs,start,target,xpm,planes);
397:
398: begin
399: Deform_from_Children
400: (file,poset,nd,n,nd.level-1,hom.all,report,outlog,xpm,npaths,timings);
401: Standard_Complex_Poly_Matrices.Clear(xpm);
402: Clear(hom);
403: end One_General_Deform;
404:
405: procedure Two_General_Deform
406: ( file : in file_type; n,ind : in natural;
407: poset : in out Array_of_Array_of_VecMats; nd : in Node;
408: top_start,top_target,bot_start,bot_target
409: : in Standard_Complex_Matrices.Matrix;
410: planes : in VecMat; top_bs,bot_bs : in Bracket_System;
411: report,outlog : in boolean;
412: npaths : in out Standard_Natural_Vectors.Vector;
413: timings : in out Duration_Array ) is
414:
415: -- DESCRIPTION :
416: -- Does the Pieri deformations to the node, same specifications as Solve
417: -- for the general case.
418:
419: -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
420:
421: -- ON ENTRY :
422: -- file to write intermediate output to;
423: -- n number of rows in the matrices;
424: -- ind planes(ind) is currently being folded in with this chain;
425: -- poset contains solution planes at higher levels;
426: -- nd current node in the localization poset;
427: -- top_start start (m+1-k)-plane for top pivots;
428: -- top_target target (m+1-k)-plane for top pivots;
429: -- bot_start start (m+1-k)-plane for bottom pivots;
430: -- bot_target target (m+1-k)-plane for bottom pivots;
431: -- planes target planes;
432: -- top_bs structure to expand the minors for top pivots;
433: -- bot_bs structure to expand the minors for bottom pivots;
434: -- report switch to determine output during continuation;
435: -- outlog flag to write homotopies on file if set to true.
436:
437: -- ON RETURN :
438: -- poset solution planes at (nd.level)(nd.label) are determined;
439: -- npaths number of paths traced at each level;
440: -- timings updated CPU user times for each level.
441:
442: xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
443: := Localization_Pattern(n,nd.top,nd.bottom);
444: homotopy : Link_to_Poly_Sys;
445:
446: begin
447: case nd.tp is
448: when top
449: => homotopy := One_General_Pieri_Homotopy
450: (n,ind,nd,top_bs,top_start,top_target,xpm,planes);
451: Deform_from_Children
452: (file,poset,nd,n,nd.level-1,homotopy.all,report,outlog,xpm,
453: npaths,timings);
454: when bottom
455: => homotopy := One_General_Pieri_Homotopy
456: (n,ind,nd,bot_bs,bot_start,bot_target,xpm,planes);
457: Deform_from_Children
458: (file,poset,nd,n,nd.level-1,homotopy.all,report,outlog,xpm,
459: npaths,timings);
460: when mixed
461: => homotopy := Two_General_Pieri_Homotopy
462: (n,ind,nd,top_bs,bot_bs,top_start,top_target,
463: bot_start,bot_target,xpm,planes);
464: Deform_from_Children
465: (file,poset,nd,n,nd.level-2,homotopy.all,report,outlog,xpm,
466: npaths,timings);
467: end case;
468: Standard_Complex_Poly_Matrices.Clear(xpm);
469: Clear(homotopy);
470: end Two_General_Deform;
471:
472: procedure Quantum_Deform
473: ( file : in file_type; n,q : in natural;
474: poset : in out Array_of_Array_of_VecMats;
475: nd : in Node; expbp : in Bracket_Polynomial;
476: planes : in VecMat; s : Standard_Complex_Vectors.Vector;
477: report,outlog : in boolean;
478: npaths : in out Standard_Natural_Vectors.Vector;
479: timings : in out Duration_Array ) is
480:
481: -- DESCRIPTION :
482: -- This is the q-analogue to the Hypersurface Deform.
483:
484: -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
485:
486: m : constant natural := n-nd.p;
487: xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
488: := Symbolic_Create(m,nd.p,q,nd.top,nd.bottom);
489:
490: begin
491: if outlog
492: then put(file,"Curve at node(");
493: put(file,nd.level,1); put(file,")("); put(file,nd.label,1);
494: put(file,") for pivots (");
495: put(file,nd.top); put(file,","); put(file,nd.bottom);
496: put_line(file,") :");
497: One_Set_up_Symbol_Table(m,nd.p,q,nd.top,nd.bottom);
498: put(file,xpm);
499: end if;
500: if nd.tp = mixed
501: then
502: declare
503: homsys : Poly_Sys(1..nd.level+2);
504: begin
505: homsys := Two_Quantum_Pieri_Homotopy(n,nd,expbp,xpm,planes,s);
506: if outlog
507: then Two_Set_up_Symbol_Table(m,nd.p,q,nd.top,nd.bottom);
508: put_line(file,"The homotopy : "); put_line(file,homsys);
509: end if;
510: Quantum_Deform_from_Children
511: (file,poset,nd,n,q,nd.level-2,homsys,nd.level+3,1,
512: report,outlog,xpm,npaths,timings);
513: Clear(homsys);
514: end;
515: else
516: declare
517: homsys : Poly_Sys(1..nd.level+1);
518: begin
519: homsys := One_Quantum_Pieri_Homotopy(n,nd,expbp,xpm,planes,s);
520: if outlog
521: then put_line(file,"The homotopy : "); put_line(file,homsys);
522: end if;
523: Quantum_Deform_from_Children
524: (file,poset,nd,n,q,nd.level-1,homsys,nd.level+2,1,
525: report,outlog,xpm,npaths,timings);
526: Clear(homsys);
527: end;
528: end if;
529: Standard_Complex_Poly_Matrices.Clear(xpm);
530: end Quantum_Deform;
531:
532: function Moving_Point_Mode
533: ( l,k : natural; modpiv : Bracket ) return natural is
534:
535: -- DESCRIPTION :
536: -- Returns a natural number that indicates the moving of the
537: -- interpolation point. The value on return means the following
538: -- when = 0 : s goes from 0 to 1;
539: -- = 1 : s remains constant at 1;
540: -- = 2 : s goes from 1 to a target value.
541:
542: begin
543: if l = 0
544: then return 2;
545: elsif l = k-1 and modpiv(1) > 1
546: then return 0;
547: else return 1;
548: end if;
549: end Moving_Point_Mode;
550:
551: procedure One_General_Quantum_Deform
552: ( file : in file_type; n,q,l,k,ind : in natural;
553: poset : in out Array_of_Array_of_VecMats; nd : in Node;
554: modpiv : in Bracket;
555: start,target : in Standard_Complex_Matrices.Matrix;
556: planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
557: bs : in Bracket_System; report,outlog : in boolean;
558: npaths : in out Standard_Natural_Vectors.Vector;
559: timings : in out Duration_Array ) is
560:
561: -- DESCRIPTION :
562: -- This is the quantum analogue to One_General_Deform.
563:
564: -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
565:
566: -- ON ENTRY :
567: -- file to write intermediate output to;
568: -- n number of rows in the matrices;
569: -- q degree of the map;
570: -- l runs from k-1 downto 0;
571: -- k co-dimension currently being treated;
572: -- ind planes(ind) is currently being folded in with this chain;
573: -- poset contains solution planes at higher levels;
574: -- nd current node in the localization poset;
575: -- modpiv bottom or top pivots modulo n;
576: -- start start (m+1-k)-plane for pivots;
577: -- target target (m+1-k)-plane for pivots;
578: -- planes target planes;
579: -- s interpolation points where the maps meets the planes;
580: -- bs structure to expand the minors;
581: -- report switch to determine output during continuation;
582: -- outlog flag to write homotopies on file if set to true.
583:
584: -- ON RETURN :
585: -- poset solution planes at (nd.level)(nd.label) are determined;
586: -- npaths number of paths followed at each level;
587: -- timings CPU user time at each level.
588:
589: m : constant natural := n-nd.p;
590: xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
591: := Symbolic_Create(m,nd.p,q,nd.top,nd.bottom);
592: s_mode : constant natural := Moving_Point_Mode(l,k,modpiv);
593: hom : Link_to_Poly_Sys
594: := One_General_Quantum_Pieri_Homotopy
595: (n,ind,nd,s_mode,bs,start,target,xpm,planes,s);
596:
597: begin
598: if outlog
599: then put(file,"level l : "); put(file,l,1); put(file," ");
600: put(file,"codim k : "); put(file,k,1); new_line(file);
601: put(file,"Curve at node(");
602: put(file,nd.level,1); put(file,")("); put(file,nd.label,1);
603: put(file,") for pivots (");
604: put(file,nd.top); put(file,","); put(file,nd.bottom);
605: put_line(file,") :");
606: One_Set_up_Symbol_Table(m,nd.p,q,nd.top,nd.bottom);
607: put(file,xpm);
608: put_line(file,"The homotopy : "); put_line(file,hom.all);
609: end if;
610: Quantum_Deform_from_Children
611: (file,poset,nd,n,q,nd.level-1,hom.all,nd.level+2,s_mode,
612: report,outlog,xpm,npaths,timings);
613: Standard_Complex_Poly_Matrices.Clear(xpm);
614: Clear(hom);
615: end One_General_Quantum_Deform;
616:
617: -- CREATORS :
618:
619: function Create ( index_poset : Array_of_Array_of_Nodes )
620: return Array_of_Array_of_VecMats is
621:
622: res : Array_of_Array_of_VecMats(index_poset'range);
623: lnd : Link_to_Node;
624:
625: begin
626: for i in index_poset'range loop
627: if index_poset(i) /= null
628: then res(i) := new Array_of_VecMats(index_poset(i)'range);
629: for j in res(i)'range loop
630: lnd := index_poset(i)(j);
631: if lnd.roco /= 0
632: then res(i)(j) := new VecMat(1..lnd.roco);
633: end if;
634: end loop;
635: end if;
636: end loop;
637: return res;
638: end Create;
639:
640: -- SELECTORS :
641:
642: function Empty ( poset : Array_of_Array_of_VecMats; level,label : natural )
643: return boolean is
644:
645: use Standard_Complex_Matrices;
646:
647: begin
648: if poset(level) = null
649: then return true;
650: elsif poset(level)(label) = null
651: then return true;
652: else declare
653: lavm : Link_to_VecMat := poset(level)(label);
654: begin
655: return (lavm(lavm'first) = null);
656: end;
657: end if;
658: end Empty;
659:
660: -- ANALOGUES TO THE ROOT COUNTERS :
661:
662: procedure Recursive_Hypersurface_Solve
663: ( file : in file_type; n : in natural;
664: nd : in Node; expbp : in Bracket_Polynomial;
665: poset : in out Array_of_Array_of_VecMats;
666: planes : in VecMat; report,outlog : in boolean;
667: npaths : in out Standard_Natural_Vectors.Vector;
668: timings : in out Duration_Array ) is
669:
670: -- DESCRIPTION :
671: -- This additional layer is added to avoid the repeated construction
672: -- of the structure of the equations, that is now in expbp.
673:
674: begin
675: if Empty(poset,nd.level,nd.label)
676: then
677: if nd.level = 0
678: then
679: poset(nd.level)(nd.label)(1)
680: := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
681: else
682: for i in nd.children'range(1) loop
683: for j in nd.children'range(2) loop
684: if nd.children(i,j) /= null
685: then Recursive_Hypersurface_Solve
686: (file,n,nd.children(i,j).all,expbp,
687: poset,planes,report,outlog,npaths,timings);
688: end if;
689: end loop;
690: end loop;
691: Hypersurface_Deform
692: (file,n,poset,nd,expbp,planes,report,outlog,npaths,timings);
693: end if;
694: end if;
695: end Recursive_Hypersurface_Solve;
696:
697: procedure Solve ( file : in file_type; n : in natural;
698: poset : in out Array_of_Array_of_VecMats;
699: nd : in Node; planes : in VecMat;
700: report,outlog : in boolean;
701: npaths : in out Standard_Natural_Vectors.Vector;
702: timings : in out Duration_Array ) is
703:
704: bm : Bracket_Monomial := Maximal_Minors(n,n);
705: bs : Bracket_System(0..Number_of_Brackets(bm))
706: := Minor_Equations(n,n-nd.p,bm);
707:
708: begin
709: Recursive_Hypersurface_Solve
710: (file,n,nd,bs(1),poset,planes,report,outlog,npaths,timings);
711: Clear(bm); Clear(bs);
712: end Solve;
713:
714: procedure One_Solve_along_Chains
715: ( file : in file_type; nd : in Node; n,l,k,ind : in natural;
716: poset : in out Array_of_Array_of_VecMats;
717: pivots,columns : in Bracket; bs : in Bracket_System;
718: special,start,target : in Standard_Complex_Matrices.Matrix;
719: planes : in VecMat; report,outlog : in boolean;
720: npaths : in out Standard_Natural_Vectors.Vector;
721: timings : in out Duration_Array ) is
722:
723: -- DESCRIPTION :
724: -- Applies the general solver along the nodes in all chains that end at
725: -- the current node. This is the analogue to the hypersurface solver,
726: -- for use in connection with the grandchildren first recursive solving.
727: -- This procedure is only called in "One_Solve".
728:
729: -- ON ENTRY :
730: -- file to write intermediate results on;
731: -- nd current node in the localization poset;
732: -- n working dimension, equation m+p;
733: -- l runs from 0 to k-1;
734: -- k current codimension condition;
735: -- poset structure with all solution p-planes;
736: -- ind ind-1 planes are already folded in;
737: -- pivots pivot elements used for the special m-plane;
738: -- columns which columns of the special m-plane are used;
739: -- bs Laplace expansion of the polynomial equations;
740: -- special special m-plane for top pivots;
741: -- start (m+1-k)-plane used at the start of the deformation;
742: -- target (m+1-k)-plane used as target;
743: -- planes sequence of (m+1-k)-planes;
744: -- report indicates whether intermediate output during continuation;
745: -- outlog flag to write homotopies on file if set to true.
746:
747: -- ON RETURN :
748: -- poset updated structure of all solution p-planes;
749: -- npaths updated numbers of paths traced at each level;
750: -- timings updated CPU user times at each level.
751:
752: m : constant natural := n - nd.p;
753: new_piv,new_col : Bracket(1..pivots'last-1);
754: new_start : Standard_Complex_Matrices.Matrix(1..n,start'range(2));
755:
756: begin
757: if empty(poset,nd.level,nd.label)
758: then
759: if l < k-1
760: then
761: for i in nd.children'range(1) loop
762: for j in nd.children'range(2) loop
763: if ((nd.children(i,j) /= null)
764: and then (nd.children(i,j).roco > 0))
765: then
766: if nd.children(i,j).tp = top
767: then new_piv := Remove(pivots,nd.children(i,j).top);
768: else new_piv := Remove(pivots,nd.children(i,j).bottom);
769: end if;
770: new_col := Remove(columns,pivots,new_piv);
771: new_start := Special_Plane(n,m,k,new_col,special);
772: One_Solve_along_Chains
773: (file,nd.children(i,j).all,n,l+1,k,ind,poset,new_piv,
774: new_col,bs,special,new_start,start,planes,report,outlog,
775: npaths,timings);
776: end if;
777: end loop;
778: end loop;
779: end if;
780: One_General_Deform
781: (file,n,ind,poset,nd,start,target,planes,bs,report,outlog,
782: npaths,timings);
783: end if;
784: end One_Solve_along_Chains;
785:
786: procedure One_Quantum_Solve_along_Chains
787: ( file : in file_type; nd : in Node; n,q,l,k,ind : in natural;
788: poset : in out Array_of_Array_of_VecMats;
789: pivots,columns : in Bracket; bs : in Bracket_System;
790: special,start,target : in Standard_Complex_Matrices.Matrix;
791: planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
792: report,outlog : in boolean;
793: npaths : in out Standard_Natural_Vectors.Vector;
794: timings : in out Duration_Array ) is
795:
796: -- DESCRIPTION :
797: -- Applies the general solver along the nodes in all chains that end at
798: -- the current node. This is the analogue to the hypersurface solver,
799: -- for use in connection with the grandchildren first recursive solving.
800: -- This procedure is only called in the q-analogue of "One_Solve".
801:
802: -- ON ENTRY :
803: -- file to write intermediate results on;
804: -- nd current node in the localization poset;
805: -- n working dimension, equation m+p;
806: -- q degree of the map;
807: -- l runs from 0 to k-1;
808: -- k current codimension condition;
809: -- poset structure with all solution p-planes;
810: -- ind ind-1 planes are already folded in;
811: -- pivots pivot elements used for the special m-plane;
812: -- columns which columns of the special m-plane are used;
813: -- bs Laplace expansion of the polynomial equations;
814: -- special special m-plane for top pivots;
815: -- start (m+1-k)-plane used at the start of the deformation;
816: -- target (m+1-k)-plane used as target;
817: -- planes sequence of (m+1-k)-planes;
818: -- s interpolation points where the map meets the planes;
819: -- report indicates whether intermediate output during continuation;
820: -- outlog flag to write homotopies on file if set to true.
821:
822: -- ON RETURN :
823: -- poset updated structure of all solution p-planes;
824: -- npaths updated numbers of paths traced at each level;
825: -- timings updated CPU user times at each level.
826:
827: m : constant natural := n - nd.p;
828: new_piv,new_col : Bracket(1..pivots'last-1);
829: new_start : Standard_Complex_Matrices.Matrix(1..n,start'range(2));
830: mod_piv : Bracket(1..nd.p);
831:
832: begin
833: if empty(poset,nd.level,nd.label)
834: then
835: if l < k-1
836: then
837: for i in nd.children'range(1) loop
838: for j in nd.children'range(2) loop
839: if ((nd.children(i,j) /= null)
840: and then (nd.children(i,j).roco > 0))
841: then
842: if nd.children(i,j).tp = top
843: then mod_piv := Modulo(nd.children(i,j).top,n);
844: new_piv := Remove(pivots,mod_piv);
845: put(file,"Top pivots at node : ");
846: put(file,nd.top);
847: put(file," child top pivots : ");
848: put(file,nd.children(i,j).top); new_line(file);
849: else mod_piv := Modulo(nd.children(i,j).bottom,n);
850: new_piv := Remove(pivots,mod_piv);
851: put(file,"Bottom pivots at node : ");
852: put(file,nd.bottom);
853: put(file," child bottom pivots : ");
854: put(file,nd.children(i,j).bottom); new_line(file);
855: end if;
856: put(file,"Modular pivots : "); put(file,mod_piv);
857: put(file," new pivots : "); put(file,new_piv);
858: new_line(file);
859: put(file,"Pivot columns : "); put(file,columns);
860: put(file," new columns : "); put(file,new_piv);
861: new_line(file);
862: new_col := Remove(columns,pivots,new_piv);
863: new_start := Special_Plane(n,m,k,new_col,special);
864: One_Quantum_Solve_along_Chains
865: (file,nd.children(i,j).all,n,q,l+1,k,ind,poset,new_piv,
866: new_col,bs,special,new_start,start,planes,s,report,outlog,
867: npaths,timings);
868: end if;
869: end loop;
870: end loop;
871: end if;
872: One_General_Quantum_Deform
873: (file,n,q,l,k,ind,poset,nd,mod_piv,start,target,planes,s,bs,
874: report,outlog,npaths,timings);
875: end if;
876: end One_Quantum_Solve_along_Chains;
877:
878: procedure Solve_along_One_Chain
879: ( file : in file_type; nd : in Node; n,l,k,ind : in natural;
880: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
881: pivots,columns : in Bracket; bs : in Bracket_System;
882: special,start,target : in Standard_Complex_Matrices.Matrix;
883: planes : in VecMat; report,outlog : in boolean;
884: npaths : in out Standard_Natural_Vectors.Vector;
885: timings : in out Duration_Array ) is
886:
887: -- DESCRIPTION :
888: -- Applies the general solver along the nodes in all chains that end at
889: -- the current node. This is the analogue to the hypersurface solver,
890: -- which can be used in a general control structure.
891:
892: -- ON ENTRY :
893: -- file to write intermediate results on;
894: -- nd current node in the localization poset;
895: -- n working dimension, equation m+p;
896: -- l runs from 0 to k-1;
897: -- k current codimension condition;
898: -- poset structure with all solution p-planes;
899: -- ind ind-1 planes are already folded in;
900: -- pivots pivot elements used for the special m-plane;
901: -- columns which columns of the special m-plane are used;
902: -- bs Laplace expansion of the polynomial equations;
903: -- special special m-plane for top pivots;
904: -- start (m+1-k)-plane used at the start of the deformation;
905: -- target (m+1-k)-plane used as target;
906: -- planes sequence of (m+1-k)-planes;
907: -- report indicates whether intermediate output during continuation;
908: -- outlog file to write homotopies on if set to true.
909:
910: -- ON RETURN :
911: -- poset updated structure of solution p-planes;
912: -- npaths updated number of paths traced at each level;
913: -- timings updated CPU user times for each level.
914:
915: m : constant natural := n - nd.p;
916:
917: begin
918: if empty(poset,nd.level,nd.label)
919: then
920: if nd.level = 0
921: then poset(nd.level)(nd.label)(1)
922: := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
923: elsif nd.roco > 0
924: then
925: if l = k
926: then
927: if cod'last > cod'first
928: then
929: declare
930: kk : constant natural := cod(cod'last-1);
931: kd : constant natural := n+1-kk;
932: new_piv,new_col : Bracket(1..m);
933: new_special : Standard_Complex_Matrices.Matrix(1..n,1..m);
934: new_target : constant Standard_Complex_Matrices.Matrix
935: := planes(cod'last-1).all;
936: new_start
937: : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
938: new_bm : Bracket_Monomial := Maximal_Minors(n,kd);
939: new_bs : Bracket_System(0..Number_of_Brackets(new_bm))
940: := Minor_Equations(kd,kd-nd.p,new_bm);
941: begin
942: for i in new_col'range loop
943: new_col(i) := i;
944: end loop;
945: if nd.tp = top
946: then new_piv := Complement(n,nd.top);
947: new_special := Special_Top_Plane(m,nd.top);
948: else new_piv := Complement(n,nd.bottom);
949: new_special := Special_Bottom_Plane(m,nd.bottom);
950: end if;
951: new_start := Special_Plane(n,m,kk,new_col,new_special);
952: Solve_along_One_Chain
953: (file,nd,n,0,kk,cod'last-1,cod(cod'first..cod'last-1),
954: poset,new_piv,new_col,new_bs,new_special,new_start,
955: new_target,planes,report,outlog,npaths,timings);
956: Clear(new_bm); Clear(new_bs);
957: end;
958: end if;
959: else
960: declare
961: new_piv,new_col : Bracket(1..pivots'last-1);
962: new_start
963: : Standard_Complex_Matrices.Matrix(1..n,start'range(2));
964: begin
965: for i in nd.children'range(1) loop
966: for j in nd.children'range(2) loop
967: if ((nd.children(i,j) /= null)
968: and then (nd.children(i,j).roco > 0))
969: then
970: if nd.children(i,j).tp = top
971: then new_piv := Remove(pivots,nd.children(i,j).top);
972: else new_piv
973: := Remove(pivots,nd.children(i,j).bottom);
974: end if;
975: new_col := Remove(columns,pivots,new_piv);
976: new_start := Special_Plane(n,m,k,new_col,special);
977: Solve_along_One_Chain
978: (file,nd.children(i,j).all,n,l+1,k,ind,cod,poset,
979: new_piv,new_col,bs,special,new_start,start,
980: planes,report,outlog,npaths,timings);
981: end if;
982: end loop;
983: end loop;
984: One_General_Deform
985: (file,n,ind,poset,nd,start,target,planes,bs,
986: report,outlog,npaths,timings);
987: end;
988: end if;
989: end if;
990: end if;
991: end Solve_along_One_Chain;
992:
993: procedure Solve_along_Two_Chains
994: ( file : in file_type; nd : in Node;
995: n,l_top,k_top,l_bot,k_bot,ind : in natural;
996: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
997: top_pivots,top_columns,bot_pivots,bot_columns : in Bracket;
998: top_bs,bot_bs : in Bracket_System;
999: top_special,top_start,top_target,bot_special,bot_start,
1000: bot_target : in Standard_Complex_Matrices.Matrix;
1001: planes : in VecMat; report,outlog : in boolean;
1002: npaths : in out Standard_Natural_Vectors.Vector;
1003: timings : in out Duration_Array );
1004:
1005: -- DESCRIPTION :
1006: -- Applies the general solver along the nodes in all chains that end at
1007: -- the current node. This is the analogue to the hypersurface solver
1008: -- where the type of the node may be anything.
1009:
1010: -- ON ENTRY :
1011: -- file to write intermediate results on;
1012: -- nd current node in the localization poset;
1013: -- n working dimension, equation m+p;
1014: -- l_top runs from 0 to k_top-1;
1015: -- k_top co-dimension condition satisfied incrementing top pivots;
1016: -- l_bot runs from 0 to k_bot-1;
1017: -- k_bot co-dimension condition satisfied decrementing bottom pivots;
1018: -- poset structure with all solution p-planes;
1019: -- ind ind-1 planes are already folded in;
1020: -- top_pivots pivot elements used for the special top m-plane;
1021: -- top_columns which columns of the special top m-plane are used;
1022: -- bot_pivots pivot elements used for the special bottom m-plane;
1023: -- bot_columns which columns of the special bottom m-plane are used;
1024: -- top_bs Laplace expansion of the polynomial equations;
1025: -- bot_bs Laplace expansion of the polynomial equations;
1026: -- top_special special m-plane for top pivots;
1027: -- top_start (m+1-k)-plane used at the start of the deformation;
1028: -- top_target (m+1-k)-plane used as target satisfied with top pivots;
1029: -- bot_special special m-plane for top pivots;
1030: -- bot_start (m+1-k)-plane used at the start of the deformation;
1031: -- bot_target (m+1-k)-plane used as target satisfied with bottom pivots;
1032: -- planes sequence of (m+1-k)-planes;
1033: -- report indicates whether intermediate output during continuation;
1034: -- outlog flag to write homotopies on file if set to true.
1035:
1036: -- ON RETURN :
1037: -- poset updated structure of solution p-planes;
1038: -- npaths updated number of paths traced at each level;
1039: -- timings updated CPU user timings at each level.
1040:
1041: procedure Solve_along_Two_Chains_Deforming_Top_and_Bottom
1042: ( file : in file_type; nd : in Node;
1043: n,l_top,k_top,l_bot,k_bot,ind : in natural;
1044: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
1045: top_pivots,top_columns,bot_pivots,bot_columns : in Bracket;
1046: top_bs,bot_bs : in Bracket_System;
1047: top_special,top_start,top_target,bot_special,bot_start,
1048: bot_target : in Standard_Complex_Matrices.Matrix;
1049: planes : in VecMat; report,outlog : in boolean;
1050: npaths : in out Standard_Natural_Vectors.Vector;
1051: timings : in out Duration_Array ) is
1052:
1053: -- DESCRIPTION :
1054: -- Assumes that k_top > l_top and k_bot > l_bot so that the deformations
1055: -- involve both incrementing top and decrementing bottom pivots.
1056:
1057: m : constant natural := n - nd.p;
1058: top_piv,top_col : Bracket(1..top_pivots'last-1);
1059: bot_piv,bot_col : Bracket(1..bot_pivots'last-1);
1060: new_top_start : Standard_Complex_Matrices.Matrix(1..n,top_start'range(2));
1061: new_bot_start : Standard_Complex_Matrices.Matrix(1..n,bot_start'range(2));
1062:
1063: begin
1064: for i in nd.children'range(1) loop
1065: for j in nd.children'range(2) loop
1066: if ((nd.children(i,j) /= null)
1067: and then (nd.children(i,j).roco > 0))
1068: then if nd.children(i,j).tp = top or nd.children(i,j).tp = mixed
1069: then top_piv := Remove(top_pivots,nd.children(i,j).top);
1070: top_col := Remove(top_columns,top_pivots,top_piv);
1071: new_top_start
1072: := Special_Plane(n,m,k_top,top_col,top_special);
1073: end if;
1074: if nd.children(i,j).tp = bottom or nd.children(i,j).tp = mixed
1075: then bot_piv := Remove(bot_pivots,nd.children(i,j).bottom);
1076: bot_col := Remove(bot_columns,bot_pivots,bot_piv);
1077: new_bot_start
1078: := Special_Plane(n,m,k_bot,bot_col,bot_special);
1079: end if;
1080: Solve_along_Two_Chains
1081: (file,nd.children(i,j).all,
1082: n,l_top+1,k_top,l_bot+1,k_bot,ind,cod,poset,
1083: top_piv,top_col,bot_piv,bot_col,top_bs,bot_bs,
1084: top_special,new_top_start,top_start,
1085: bot_special,new_bot_start,bot_start,
1086: planes,report,outlog,npaths,timings);
1087: end if;
1088: end loop;
1089: end loop;
1090: Two_General_Deform
1091: (file,n,ind,poset,nd,top_start,top_target,bot_start,
1092: bot_target,planes,top_bs,bot_bs,report,outlog,npaths,timings);
1093: end Solve_along_Two_Chains_Deforming_Top_and_Bottom;
1094:
1095: procedure Switch_Top_and_Solve_along_Two_Chains
1096: ( file : in file_type; nd : in Node;
1097: n,l_bot,k_bot,ind : in natural; cod : in Bracket;
1098: poset : in out Array_of_Array_of_VecMats;
1099: bot_pivots,bot_columns : in Bracket;
1100: bot_bs : in Bracket_System;
1101: bot_special,bot_start,bot_target
1102: : in Standard_Complex_Matrices.Matrix;
1103: planes : in VecMat; report,outlog : in boolean;
1104: npaths : in out Standard_Natural_Vectors.Vector;
1105: timings : in out Duration_Array ) is
1106:
1107: -- DESCRIPTION :
1108: -- Assumes that l_top = k_top, l_bot < k_bot, and ind > cod'first so
1109: -- that first a new top chain can be started, which is then solved
1110: -- along with the existing chain for decrementing bottom pivots.
1111:
1112: m : constant natural := n - nd.p;
1113: new_k_top : constant natural := cod(ind);
1114: kd : constant natural := n+1-new_k_top;
1115: new_top_pivots : Bracket(1..m) := Complement(n,nd.top);
1116: new_top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1117: := Special_Top_Plane(m,nd.top);
1118: new_top_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top)
1119: := planes(ind).all;
1120: new_top_columns : Bracket(1..m);
1121: new_top_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top);
1122: new_top_bm : Bracket_Monomial := Maximal_Minors(n,kd);
1123: new_top_bs : Bracket_System(0..Number_of_Brackets(new_top_bm))
1124: := Minor_Equations(kd,kd-nd.p,new_top_bm);
1125:
1126: begin
1127: for i in new_top_columns'range loop
1128: new_top_columns(i) := i;
1129: end loop;
1130: new_top_start
1131: := Special_Plane(n,m,new_k_top,new_top_columns,new_top_special);
1132: Solve_along_Two_Chains_Deforming_Top_and_Bottom
1133: (file,nd,n,0,new_k_top,l_bot,k_bot,ind,cod,poset,
1134: new_top_pivots,new_top_columns,bot_pivots,bot_columns,
1135: new_top_bs,bot_bs,new_top_special,new_top_start,new_top_target,
1136: bot_special,bot_start,bot_target,planes,
1137: report,outlog,npaths,timings);
1138: Clear(new_top_bm); Clear(new_top_bs);
1139: end Switch_Top_and_Solve_along_Two_Chains;
1140:
1141: procedure Switch_Top_and_Solve_along_One_Chain
1142: ( file : in file_type; nd : in Node; n,ind : in natural;
1143: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
1144: planes : in VecMat; report,outlog : in boolean;
1145: npaths : in out Standard_Natural_Vectors.Vector;
1146: timings : in out Duration_Array ) is
1147:
1148: -- DESCRIPTION :
1149: -- Assumes that l_top = k_top, l_bot = k_bot, with nd.tp = top
1150: -- and ind > cod'first so that a new top chain can be started.
1151:
1152: m : constant natural := n - nd.p;
1153: new_k_top : constant natural := cod(ind);
1154: kd : constant natural := n+1-new_k_top;
1155: new_top_pivots : Bracket(1..m) := Complement(n,nd.top);
1156: new_top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1157: := Special_Top_Plane(m,nd.top);
1158: new_top_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top)
1159: := planes(ind).all;
1160: new_top_columns : Bracket(1..m);
1161: new_top_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top);
1162: new_top_bm : Bracket_Monomial := Maximal_Minors(n,kd);
1163: new_top_bs : Bracket_System(0..Number_of_Brackets(new_top_bm))
1164: := Minor_Equations(kd,kd-nd.p,new_top_bm);
1165:
1166: begin
1167: for i in new_top_columns'range loop
1168: new_top_columns(i) := i;
1169: end loop;
1170: new_top_start
1171: := Special_Plane(n,m,new_k_top,new_top_columns,new_top_special);
1172: Solve_along_One_Chain
1173: (file,nd,n,0,new_k_top,ind,cod(cod'first..ind),poset,
1174: new_top_pivots,new_top_columns,new_top_bs,
1175: new_top_special,new_top_start,new_top_target,
1176: planes,report,outlog,npaths,timings);
1177: Clear(new_top_bm); Clear(new_top_bs);
1178: end Switch_Top_and_Solve_along_One_Chain;
1179:
1180: procedure Switch_Bottom_and_Solve_along_Two_Chains
1181: ( file : in file_type; nd : in Node;
1182: n,l_top,k_top,ind : in natural; cod : in Bracket;
1183: poset : in out Array_of_Array_of_VecMats;
1184: top_pivots,top_columns : in Bracket;
1185: top_bs : in Bracket_System;
1186: top_special,top_start,top_target
1187: : in Standard_Complex_Matrices.Matrix;
1188: planes : in VecMat; report,outlog : in boolean;
1189: npaths : in out Standard_Natural_Vectors.Vector;
1190: timings : in out Duration_Array ) is
1191:
1192: -- DESCRIPTION :
1193: -- Assumes that l_top < k_top, l_bot = k_bot, and ind > cod'first so
1194: -- that first a new bottom chain can be launched, which is then solved
1195: -- along with the existing chain for incrementing top pivots.
1196:
1197: m : constant natural := n - nd.p;
1198: new_k_bot : constant natural := cod(ind);
1199: kd : constant natural := n+1-new_k_bot;
1200: new_bot_pivots : Bracket(1..m) := Complement(n,nd.bottom);
1201: new_bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1202: := Special_Bottom_Plane(m,nd.bottom);
1203: new_bot_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot)
1204: := planes(ind).all;
1205: new_bot_columns : Bracket(1..m);
1206: new_bot_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot);
1207: new_bot_bm : Bracket_Monomial := Maximal_Minors(n,kd);
1208: new_bot_bs : Bracket_System(0..Number_of_Brackets(new_bot_bm))
1209: := Minor_Equations(kd,kd-nd.p,new_bot_bm);
1210:
1211: begin
1212: for i in new_bot_columns'range loop
1213: new_bot_columns(i) := i;
1214: end loop;
1215: new_bot_start
1216: := Special_Plane(n,m,new_k_bot,new_bot_columns,new_bot_special);
1217: Solve_along_Two_Chains_Deforming_Top_and_Bottom
1218: (file,nd,n,l_top,k_top,0,new_k_bot,ind,cod,poset,
1219: top_pivots,top_columns,new_bot_pivots,new_bot_columns,
1220: top_bs,new_bot_bs,top_special,top_start,top_target,
1221: new_bot_special,new_bot_start,new_bot_target,
1222: planes,report,outlog,npaths,timings);
1223: Clear(new_bot_bm); Clear(new_bot_bs);
1224: end Switch_Bottom_and_Solve_along_Two_Chains;
1225:
1226: procedure Switch_Bottom_and_Solve_along_One_Chain
1227: ( file : in file_type; nd : in Node; n,ind : in natural;
1228: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
1229: planes : in VecMat; report,outlog : in boolean;
1230: npaths : in out Standard_Natural_Vectors.Vector;
1231: timings : in out Duration_Array ) is
1232:
1233: -- DESCRIPTION :
1234: -- Assumes that l_top < k_top, l_bot = k_bot, and ind > cod'first so
1235: -- that first a new bottom chain can be launched, which is then solved
1236: -- along with the existing chain for incrementing top pivots.
1237:
1238: m : constant natural := n - nd.p;
1239: new_k_bot : constant natural := cod(ind);
1240: kd : constant natural := n+1-new_k_bot;
1241: new_bot_pivots : Bracket(1..m) := Complement(n,nd.bottom);
1242: new_bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1243: := Special_Bottom_Plane(m,nd.bottom);
1244: new_bot_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot)
1245: := planes(ind).all;
1246: new_bot_columns : Bracket(1..m);
1247: new_bot_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot);
1248: new_bot_bm : Bracket_Monomial := Maximal_Minors(n,kd);
1249: new_bot_bs : Bracket_System(0..Number_of_Brackets(new_bot_bm))
1250: := Minor_Equations(kd,kd-nd.p,new_bot_bm);
1251:
1252: begin
1253: for i in new_bot_columns'range loop
1254: new_bot_columns(i) := i;
1255: end loop;
1256: new_bot_start
1257: := Special_Plane(n,m,new_k_bot,new_bot_columns,new_bot_special);
1258: Solve_along_One_Chain
1259: (file,nd,n,0,new_k_bot,ind,cod(cod'first..ind),poset,
1260: new_bot_pivots,new_bot_columns,new_bot_bs,
1261: new_bot_special,new_bot_start,new_bot_target,
1262: planes,report,outlog,npaths,timings);
1263: Clear(new_bot_bm); Clear(new_bot_bs);
1264: end Switch_Bottom_and_Solve_along_One_Chain;
1265:
1266: procedure Switch_Top_Bottom_and_Solve_along_Two_Chains
1267: ( file : in file_type; nd : in Node; n,ind : in natural;
1268: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
1269: planes : in VecMat; report,outlog : in boolean;
1270: npaths : in out Standard_Natural_Vectors.Vector;
1271: timings : in out Duration_Array ) is
1272:
1273: -- DESCRIPTION :
1274: -- Assumes that l_top = k_top, l_bot = k_bot, and ind > cod'first+1
1275: -- so that first new top and bottom chains can be started which are
1276: -- then solved along.
1277:
1278: m : constant natural := n - nd.p;
1279: new_k_top : constant natural := cod(ind);
1280: new_k_bot : constant natural := cod(ind+1);
1281: kd_top : constant natural := n+1-new_k_top;
1282: kd_bot : constant natural := n+1-new_k_bot;
1283: new_top_pivots : Bracket(1..m) := Complement(n,nd.top);
1284: new_bot_pivots : Bracket(1..m) := Complement(n,nd.bottom);
1285: new_top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1286: := Special_Top_Plane(m,nd.top);
1287: new_bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1288: := Special_Bottom_Plane(m,nd.bottom);
1289: new_top_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top)
1290: := planes(ind).all;
1291: new_bot_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot)
1292: := planes(ind+1).all;
1293: new_top_columns,new_bot_columns : Bracket(1..m);
1294: new_top_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top);
1295: new_bot_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot);
1296: new_top_bm : Bracket_Monomial := Maximal_Minors(n,kd_top);
1297: new_bot_bm : Bracket_Monomial := Maximal_Minors(n,kd_bot);
1298: new_top_bs : Bracket_System(0..Number_of_Brackets(new_top_bm))
1299: := Minor_Equations(kd_top,kd_top-nd.p,new_top_bm);
1300: new_bot_bs : Bracket_System(0..Number_of_Brackets(new_bot_bm))
1301: := Minor_Equations(kd_bot,kd_bot-nd.p,new_bot_bm);
1302:
1303: begin
1304: for i in new_bot_columns'range loop
1305: new_top_columns(i) := i;
1306: new_bot_columns(i) := i;
1307: end loop;
1308: new_top_start
1309: := Special_Plane(n,m,new_k_top,new_top_columns,new_top_special);
1310: new_bot_start
1311: := Special_Plane(n,m,new_k_bot,new_bot_columns,new_bot_special);
1312: Solve_along_Two_Chains_Deforming_Top_and_Bottom
1313: (file,nd,n,0,new_k_top,0,new_k_bot,ind,cod,poset,
1314: new_top_pivots,new_top_columns,new_bot_pivots,new_bot_columns,
1315: new_top_bs,new_bot_bs,new_top_special,new_top_start,new_top_target,
1316: new_bot_special,new_bot_start,new_bot_target,
1317: planes,report,outlog,npaths,timings);
1318: Clear(new_top_bm); Clear(new_top_bs);
1319: Clear(new_bot_bm); Clear(new_bot_bs);
1320: end Switch_Top_Bottom_and_Solve_along_Two_Chains;
1321:
1322: procedure Solve_along_Two_Chains
1323: ( file : in file_type; nd : in Node;
1324: n,l_top,k_top,l_bot,k_bot,ind : in natural;
1325: cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
1326: top_pivots,top_columns,bot_pivots,bot_columns : in Bracket;
1327: top_bs,bot_bs : in Bracket_System;
1328: top_special,top_start,top_target,bot_special,bot_start,
1329: bot_target : in Standard_Complex_Matrices.Matrix;
1330: planes : in VecMat; report,outlog : in boolean;
1331: npaths : in out Standard_Natural_Vectors.Vector;
1332: timings : in out Duration_Array ) is
1333:
1334: -- DESCRIPTION :
1335: -- Does the dispatching according to the case analysis.
1336:
1337: -- IMPORTANT :
1338: -- The control structure in the case analysis matches the structure
1339: -- in Localization_Posets.Recursive_Top_Bottom_Create.
1340:
1341: begin
1342: if empty(poset,nd.level,nd.label)
1343: then
1344: if nd.level = 0
1345: then poset(nd.level)(nd.label)(1)
1346: := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
1347: elsif nd.roco > 0
1348: then
1349: if ((l_top < k_top) and (l_bot < k_bot))
1350: then Solve_along_Two_Chains_Deforming_Top_and_Bottom
1351: (file,nd,n,l_top,k_top,l_bot,k_bot,ind,cod,poset,
1352: top_pivots,top_columns,bot_pivots,bot_columns,
1353: top_bs,bot_bs,top_special,top_start,top_target,
1354: bot_special,bot_start,bot_target,planes,
1355: report,outlog,npaths,timings);
1356: elsif ((l_top = k_top) and (l_bot < k_bot))
1357: then
1358: if ind = cod'first
1359: then Solve_along_One_Chain
1360: (file,nd,n,l_bot,k_bot,ind,cod,poset,
1361: bot_pivots,bot_columns,bot_bs,bot_special,
1362: bot_start,bot_target,planes,report,outlog,
1363: npaths,timings);
1364: else Switch_Top_and_Solve_along_Two_Chains
1365: (file,nd,n,l_bot,k_bot,ind-1,cod,poset,
1366: bot_pivots,bot_columns,bot_bs,bot_special,
1367: bot_start,bot_target,planes,report,outlog,
1368: npaths,timings);
1369: end if;
1370: elsif ((l_top < k_top) and (l_bot = k_bot))
1371: then
1372: if ind = cod'first
1373: then Solve_along_One_Chain
1374: (file,nd,n,l_top,k_top,ind,cod,poset,
1375: top_pivots,top_columns,top_bs,top_special,
1376: top_start,top_target,planes,report,outlog,
1377: npaths,timings);
1378: else Switch_Bottom_and_Solve_along_Two_Chains
1379: (file,nd,n,l_top,k_top,ind-1,cod,poset,
1380: top_pivots,top_columns,top_bs,top_special,
1381: top_start,top_target,planes,report,outlog,
1382: npaths,timings);
1383: end if;
1384: else -- ((l_top = k_top) and (l_bot = k_bot))
1385: if ind > cod'first+1
1386: then Switch_Top_Bottom_and_Solve_along_Two_Chains
1387: (file,nd,n,ind-2,cod,poset,planes,
1388: report,outlog,npaths,timings);
1389: elsif ind > cod'first
1390: then
1391: if nd.tp = bottom
1392: then
1393: Switch_Bottom_and_Solve_along_One_Chain
1394: (file,nd,n,ind-1,cod,poset,planes,
1395: report,outlog,npaths,timings);
1396: else
1397: Switch_Top_and_Solve_along_One_Chain
1398: (file,nd,n,ind-1,cod,poset,planes,
1399: report,outlog,npaths,timings);
1400: end if;
1401: end if;
1402: end if;
1403: end if;
1404: end if;
1405: end Solve_along_Two_Chains;
1406:
1407: procedure One_Solve
1408: ( file : in file_type; n : in natural; cod : in Bracket;
1409: poset : in out Array_of_Array_of_VecMats;
1410: nd : in Node; planes : in VecMat;
1411: report,outlog : in boolean;
1412: npaths : in out Standard_Natural_Vectors.Vector;
1413: timings : in out Duration_Array ) is
1414:
1415: -- NOTE :
1416: -- We assume that we are always folding in the last condition, with
1417: -- codimension cod(cod'last). In passing recursively to higher levels
1418: -- in the deformation poset, we take a slice of k, omitting the last one.
1419: -- Applies the solver first to all grandchildren of the current node,
1420: -- which is the additional layer compared to the hypersurface case.
1421: -- This implementation will only work in the non-mixed case.
1422:
1423: m : constant natural := n - nd.p;
1424: kk : constant natural := cod(cod'last);
1425: kd : constant natural := n+1-kk;
1426:
1427: procedure Solve_Grand_Child
1428: ( lnd : in Link_to_Node; continue : out boolean ) is
1429:
1430: -- DESCRIPTION :
1431: -- This node lnd is a grandchild of the current node.
1432:
1433: begin
1434: if Empty(poset,lnd.level,lnd.label)
1435: then if lnd.level = 0
1436: then poset(lnd.level)(lnd.label)(1)
1437: := new Standard_Complex_Matrices.Matrix'
1438: (Leaf_Plane(n,lnd.all));
1439: elsif lnd.roco > 0
1440: then One_Solve(file,n,cod(cod'first..cod'last-1),poset,
1441: lnd.all,planes,report,outlog,npaths,timings);
1442: end if;
1443: end if;
1444: continue := true;
1445: end Solve_Grand_Child;
1446:
1447: procedure Solve_Grand_Children is
1448: new Enumerate_Grand_Children(Solve_Grand_Child);
1449:
1450: begin
1451: if (Empty(poset,nd.level,nd.label) and (nd.roco > 0))
1452: then
1453: if cod'last >= cod'first
1454: then Solve_Grand_Children(nd,kk);
1455: end if;
1456: declare
1457: pivots,columns : Bracket(1..m);
1458: special : Standard_Complex_Matrices.Matrix(1..n,1..m);
1459: target : constant Standard_Complex_Matrices.Matrix
1460: := planes(cod'last).all;
1461: start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
1462: bm : Bracket_Monomial := Maximal_Minors(n,kd);
1463: bs : Bracket_System(0..Number_of_Brackets(bm))
1464: := Minor_Equations(kd,kd-nd.p,bm);
1465: begin
1466: for i in columns'range loop
1467: columns(i) := i;
1468: end loop;
1469: if nd.tp = top
1470: then pivots := Complement(n,nd.top);
1471: special := Special_Top_Plane(m,nd.top);
1472: else pivots := Complement(n,nd.bottom);
1473: special := Special_Bottom_Plane(m,nd.bottom);
1474: end if;
1475: start := Special_Plane(n,m,kk,columns,special);
1476: One_Solve_along_Chains
1477: (file,nd,n,0,kk,cod'last,poset,pivots,columns,bs,
1478: special,start,target,planes,report,outlog,npaths,timings);
1479: Clear(bm); Clear(bs);
1480: end;
1481: end if;
1482: end One_Solve;
1483:
1484: procedure Chain_Solve
1485: ( file : in file_type; n : in natural; cod : in Bracket;
1486: poset : in out Array_of_Array_of_VecMats; nd : in Node;
1487: planes : in VecMat; report,outlog : in boolean;
1488: npaths : in out Standard_Natural_Vectors.Vector;
1489: timings : in out Duration_Array ) is
1490:
1491: -- NOTE :
1492: -- The convention is that the last co-dimension condition is treated
1493: -- when the type of the node is not mixed, otherwise the last two entries
1494: -- of the vector of co-dimension conditions are sliced off when moving
1495: -- to the upper levels.
1496: -- This is another organization of One_Solve and only works when the
1497: -- type of the nodes are not mixed.
1498:
1499: begin
1500: if Empty(poset,nd.level,nd.label)
1501: then
1502: if nd.level = 0
1503: then poset(nd.level)(nd.label)(1)
1504: := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
1505: elsif nd.roco > 0
1506: then declare
1507: m : constant natural := n - nd.p;
1508: pivots,columns : Bracket(1..m);
1509: special : Standard_Complex_Matrices.Matrix(1..n,1..m);
1510: kk : constant natural := cod(cod'last);
1511: kd : constant natural := n+1-kk;
1512: start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
1513: target : constant Standard_Complex_Matrices.Matrix
1514: := planes(planes'last).all;
1515: bm : Bracket_Monomial := Maximal_Minors(n,kd);
1516: bs : Bracket_System(0..Number_of_Brackets(bm))
1517: := Minor_Equations(kd,kd-nd.p,bm);
1518: begin
1519: for i in columns'range loop
1520: columns(i) := i;
1521: end loop;
1522: if nd.tp = top
1523: then pivots := Complement(n,nd.top);
1524: special := Special_Top_Plane(m,nd.top);
1525: else pivots := Complement(n,nd.bottom);
1526: special := Special_Bottom_Plane(m,nd.bottom);
1527: end if;
1528: start := Special_Plane(n,m,kk,columns,special);
1529: Solve_along_One_Chain
1530: (file,nd,n,0,cod(cod'last),cod'last,cod,poset,
1531: pivots,columns,bs,special,start,target,planes,
1532: report,outlog,npaths,timings);
1533: Clear(bm); Clear(bs);
1534: end;
1535: end if;
1536: end if;
1537: end Chain_Solve;
1538:
1539: procedure Solve ( file : in file_type; n : in natural; cod : in Bracket;
1540: poset : in out Array_of_Array_of_VecMats; nd : in Node;
1541: planes : in VecMat; report,outlog : in boolean;
1542: npaths : in out Standard_Natural_Vectors.Vector;
1543: timings : in out Duration_Array ) is
1544:
1545: -- REQUIREMENT ONE :
1546: -- The convention is that the last co-dimension condition is treated
1547: -- when the type of the node is not mixed, otherwise the last two entries
1548: -- of the vector of co-dimension conditions are sliced off when moving
1549: -- to the upper levels.
1550: -- REQUIREMENT TWO :
1551: -- The nodes that are not mixed appear at the top of the poset.
1552:
1553: begin
1554: if Empty(poset,nd.level,nd.label)
1555: then
1556: if nd.level = 0
1557: then poset(nd.level)(nd.label)(1)
1558: := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
1559: elsif nd.roco > 0
1560: then
1561: if nd.tp /= mixed
1562: then
1563: declare
1564: m : constant natural := n - nd.p;
1565: pivots,columns : Bracket(1..m);
1566: special : Standard_Complex_Matrices.Matrix(1..n,1..m);
1567: kk : constant natural := cod(cod'last);
1568: kd : constant natural := n+1-kk;
1569: start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
1570: target : constant Standard_Complex_Matrices.Matrix
1571: := planes(planes'last).all;
1572: bm : Bracket_Monomial := Maximal_Minors(n,kd);
1573: bs : Bracket_System(0..Number_of_Brackets(bm))
1574: := Minor_Equations(kd,kd-nd.p,bm);
1575: begin
1576: for i in columns'range loop
1577: columns(i) := i;
1578: end loop;
1579: if nd.tp = top
1580: then pivots := Complement(n,nd.top);
1581: special := Special_Top_Plane(m,nd.top);
1582: else pivots := Complement(n,nd.bottom);
1583: special := Special_Bottom_Plane(m,nd.bottom);
1584: end if;
1585: start := Special_Plane(n,m,kk,columns,special);
1586: Solve_along_One_Chain
1587: (file,nd,n,0,cod(cod'last),cod'last,cod,poset,
1588: pivots,columns,bs,special,start,target,planes,
1589: report,outlog,npaths,timings);
1590: Clear(bm); Clear(bs);
1591: end;
1592: else
1593: declare
1594: m : constant natural := n - nd.p;
1595: top_col,bot_col : Bracket(1..m);
1596: kk_top : constant natural := cod(cod'last-1);
1597: kk_bot : constant natural := cod(cod'last);
1598: kd_top : constant natural := n+1-kk_top;
1599: kd_bot : constant natural := n+1-kk_bot;
1600: top_bm : Bracket_Monomial := Maximal_Minors(n,kd_top);
1601: bot_bm : Bracket_Monomial := Maximal_Minors(n,kd_bot);
1602: top_bs : Bracket_System(0..Number_of_Brackets(top_bm))
1603: := Minor_Equations(kd_top,kd_top-nd.p,top_bm);
1604: bot_bs : Bracket_System(0..Number_of_Brackets(bot_bm))
1605: := Minor_Equations(kd_bot,kd_bot-nd.p,bot_bm);
1606: top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1607: := Special_Top_Plane(m,nd.top);
1608: bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
1609: := Special_Bottom_Plane(m,nd.bottom);
1610: top_piv : Bracket(1..m) := Complement(n,nd.top);
1611: bot_piv : Bracket(1..m) := Complement(n,nd.bottom);
1612: top_start,top_target
1613: : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk_top);
1614: bot_start,bot_target
1615: : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk_bot);
1616: begin
1617: for i in top_col'range loop
1618: top_col(i) := i;
1619: end loop;
1620: top_start := Special_Plane(n,m,kk_top,top_col,top_special);
1621: top_target := planes(planes'last-1).all;
1622: for i in bot_col'range loop
1623: bot_col(i) := i;
1624: end loop;
1625: bot_start := Special_Plane(n,m,kk_bot,bot_col,bot_special);
1626: bot_target := planes(planes'last).all;
1627: Solve_along_Two_Chains
1628: (file,nd,n,0,kk_top,0,kk_bot,cod'last-1,cod,poset,
1629: top_piv,top_col,bot_piv,bot_col,top_bs,bot_bs,
1630: top_special,top_start,top_target,bot_special,bot_start,
1631: bot_target,planes,report,outlog,npaths,timings);
1632: Clear(top_bm); Clear(top_bs); Clear(bot_bm); Clear(bot_bs);
1633: end;
1634: end if;
1635: end if;
1636: end if;
1637: end Solve;
1638:
1639: procedure Recursive_Quantum_Solve
1640: ( file : in file_type; n,q : in natural;
1641: nd : in Node; expbp : in Bracket_Polynomial;
1642: poset : in out Array_of_Array_of_VecMats;
1643: planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
1644: report,outlog : in boolean;
1645: npaths : in out Standard_Natural_Vectors.Vector;
1646: timings : in out Duration_Array ) is
1647:
1648: -- DESCRIPTION :
1649: -- This additional layer is added to avoid the repeated construction
1650: -- of the structure of the equations, that is now in expbp.
1651: -- This is the q-analogue to the Recursive Hypersurface Solver.
1652:
1653: begin
1654: if Empty(poset,nd.level,nd.label)
1655: then
1656: if nd.level = 0
1657: then
1658: poset(nd.level)(nd.label)(1)
1659: := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n*(q+1),nd));
1660: else
1661: for i in nd.children'range(1) loop
1662: for j in nd.children'range(2) loop
1663: if nd.children(i,j) /= null
1664: then Recursive_Quantum_Solve
1665: (file,n,q,nd.children(i,j).all,expbp,poset,
1666: planes,s,report,outlog,npaths,timings);
1667: end if;
1668: end loop;
1669: end loop;
1670: Quantum_Deform(file,n,q,poset,nd,expbp,planes,s,report,outlog,
1671: npaths,timings);
1672: end if;
1673: end if;
1674: end Recursive_Quantum_Solve;
1675:
1676: procedure Solve ( file : in file_type; n,q : in natural;
1677: poset : in out Array_of_Array_of_VecMats; nd : in Node;
1678: planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
1679: report,outlog : in boolean;
1680: npaths : in out Standard_Natural_Vectors.Vector;
1681: timings : in out Duration_Array ) is
1682:
1683: bm : Bracket_Monomial := Maximal_Minors(n,n);
1684: bs : Bracket_System(0..Number_of_Brackets(bm))
1685: := Minor_Equations(n,n-nd.p,bm);
1686:
1687: begin
1688: Recursive_Quantum_Solve(file,n,q,nd,bs(1),poset,planes,s,report,outlog,
1689: npaths,timings);
1690: Clear(bm); Clear(bs);
1691: end Solve;
1692:
1693: procedure One_Solve
1694: ( file : in file_type; n,q : in natural; cod : in Bracket;
1695: poset : in out Array_of_Array_of_VecMats; nd : in Node;
1696: planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
1697: report,outlog : in boolean;
1698: npaths : in out Standard_Natural_Vectors.Vector;
1699: timings : in out Duration_Array ) is
1700:
1701: m : constant natural := n - nd.p;
1702: kk : constant natural := cod(cod'last);
1703: kd : constant natural := n+1-kk;
1704:
1705: procedure Solve_Grand_Child
1706: ( lnd : in Link_to_Node; continue : out boolean ) is
1707:
1708: -- DESCRIPTION :
1709: -- This node lnd is a grandchild of the current node.
1710:
1711: begin
1712: if Empty(poset,lnd.level,lnd.label)
1713: then if lnd.level = 0
1714: then poset(lnd.level)(lnd.label)(1)
1715: := new Standard_Complex_Matrices.Matrix'
1716: (Leaf_Plane(n*(q+1),lnd.all));
1717: elsif lnd.roco > 0
1718: then One_Solve(file,n,q,cod(cod'first..cod'last-1),poset,
1719: lnd.all,planes,s,report,outlog,npaths,timings);
1720: end if;
1721: end if;
1722: continue := true;
1723: end Solve_Grand_Child;
1724:
1725: procedure Solve_Grand_Children is
1726: new Enumerate_Grand_Children(Solve_Grand_Child);
1727:
1728: begin
1729: if (Empty(poset,nd.level,nd.label) and (nd.roco > 0))
1730: then
1731: if cod'last >= cod'first
1732: then Solve_Grand_Children(nd,kk);
1733: end if;
1734: declare
1735: pivots,columns : Bracket(1..m);
1736: mod_piv : Bracket(1..nd.p);
1737: special : Standard_Complex_Matrices.Matrix(1..n,1..m);
1738: target : constant Standard_Complex_Matrices.Matrix
1739: := planes(cod'last).all;
1740: start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
1741: bm : Bracket_Monomial := Maximal_Minors(n,kd);
1742: bs : Bracket_System(0..Number_of_Brackets(bm))
1743: := Minor_Equations(kd,kd-nd.p,bm);
1744: begin
1745: for i in columns'range loop
1746: columns(i) := i;
1747: end loop;
1748: if nd.tp = top
1749: then mod_piv := Modulo(nd.top,n);
1750: pivots := Complement(n,mod_piv);
1751: special := Special_Top_Plane(m,mod_piv);
1752: else mod_piv := Modulo(nd.bottom,n);
1753: pivots := Complement(n,mod_piv);
1754: special := Special_Bottom_Plane(m,mod_piv);
1755: end if;
1756: start := Special_Plane(n,m,kk,columns,special);
1757: One_Quantum_Solve_along_Chains
1758: (file,nd,n,q,0,kk,cod'last,poset,pivots,columns,bs,
1759: special,start,target,planes,s,report,outlog,npaths,timings);
1760: Clear(bm); Clear(bs);
1761: end;
1762: end if;
1763: end One_Solve;
1764:
1765: procedure Solve ( file : in file_type; n,q : in natural; cod : in Bracket;
1766: poset : in out Array_of_Array_of_VecMats; nd : in Node;
1767: planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
1768: report,outlog : in boolean;
1769: npaths : in out Standard_Natural_Vectors.Vector;
1770: timings : in out Duration_Array ) is
1771:
1772: begin
1773: null;
1774: end Solve;
1775:
1776: -- DESTRUCTORS :
1777:
1778: procedure Clear ( avm : in out Array_of_VecMats ) is
1779: begin
1780: for i in avm'range loop
1781: Deep_Clear(avm(i));
1782: end loop;
1783: end Clear;
1784:
1785: procedure Clear ( avm : in out Link_to_Array_of_VecMats ) is
1786:
1787: procedure free is
1788: new unchecked_deallocation(Array_of_VecMats,Link_to_Array_of_VecMats);
1789:
1790: begin
1791: if avm /= null
1792: then Clear(avm.all);
1793: free(avm);
1794: end if;
1795: end Clear;
1796:
1797: procedure Clear ( avm : in out Array_of_Array_of_VecMats ) is
1798: begin
1799: for i in avm'range loop
1800: if avm(i) /= null
1801: then Clear(avm(i).all);
1802: end if;
1803: end loop;
1804: end Clear;
1805:
1806: end Deformation_Posets;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>