[BACK]Return to floating_polyhedral_continuation.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Stalift

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/floating_polyhedral_continuation.adb, Revision 1.1.1.1

1.1       maekawa     1: with integer_io;                         use integer_io;
                      2: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      3: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      4: with Standard_Mathematical_Functions;    use Standard_Mathematical_Functions;
                      5: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      6: with Standard_Floating_Vectors_io;       use Standard_Floating_Vectors_io;
                      7: with Standard_Complex_Vectors;
                      8: with Standard_Complex_Vectors_io;        use Standard_Complex_Vectors_io;
                      9: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                     10: with Standard_Integer_VecVecs;
                     11: with Standard_Floating_VecVecs;
                     12: with Standard_Complex_Matrices;          use Standard_Complex_Matrices;
                     13: with Standard_Complex_Polynomials;
                     14: with Standard_Complex_Laur_Polys;
                     15: with Standard_Complex_Laur_Functions;    use Standard_Complex_Laur_Functions;
                     16: with Standard_Complex_Poly_Systems;      use Standard_Complex_Poly_Systems;
                     17: with Standard_Laur_Poly_Convertors;      use Standard_Laur_Poly_Convertors;
                     18: with Standard_Complex_Substitutors;      use Standard_Complex_Substitutors;
                     19: with Power_Lists;                        use Power_Lists;
                     20: with Lists_of_Floating_Vectors;          use Lists_of_Floating_Vectors;
                     21: with Floating_Lifting_Utilities;         use Floating_Lifting_Utilities;
                     22: with Floating_Integer_Convertors;        use Floating_Integer_Convertors;
                     23: with Transforming_Integer_Vector_Lists;  use Transforming_Integer_Vector_Lists;
                     24: with Transforming_Laurent_Systems;       use Transforming_Laurent_Systems;
                     25: with Continuation_Parameters;
                     26: with Increment_and_Fix_Continuation;     use Increment_and_Fix_Continuation;
                     27: with Fewnomial_System_Solvers;           use Fewnomial_System_Solvers;
                     28: with BKK_Bound_Computations;             use BKK_Bound_Computations;
                     29:
                     30: package body Floating_Polyhedral_Continuation is
                     31:
                     32: -- UTILITIES FOR POLYHEDRAL COEFFICIENT HOMOTOPY :
                     33:
                     34:   procedure put ( file : in file_type;
                     35:                   v : in Standard_Floating_Vectors.Vector;
                     36:                   fore,aft,exp : in natural ) is
                     37:   begin
                     38:     for i in v'range loop
                     39:       put(file,v(i),fore,aft,exp);
                     40:     end loop;
                     41:   end put;
                     42:
                     43:   procedure put ( file : in file_type;
                     44:                   v : in Standard_Complex_Vectors.Vector;
                     45:                   fore,aft,exp : in natural ) is
                     46:   begin
                     47:     for i in v'range loop
                     48:       put(file,REAL_PART(v(i)),fore,aft,exp);
                     49:       put(file,IMAG_PART(v(i)),fore,aft,exp);
                     50:     end loop;
                     51:   end put;
                     52:
                     53:   function Power ( x,m : double_float ) return double_float is
                     54:
                     55:   -- DESCRIPTION :
                     56:   --   Computes x**m for high powers of m to avoid RANGE_ERROR.
                     57:
                     58:    -- intm : integer := integer(m);
                     59:    -- fltm : double_float;
                     60:
                     61:   begin
                     62:    -- if m < 10.0
                     63:    --  then
                     64:     return (x**m);  -- GNAT is better at this
                     65:    --  else if double_float(intm) > m
                     66:    --        then intm := intm-1;
                     67:    --       end if;
                     68:    --       fltm := m - double_float(intm);
                     69:    --       return ((x**intm)*(x**fltm));
                     70:    -- end if;
                     71:   end Power;
                     72:
                     73:   function Minimum ( v : Standard_Floating_Vectors.Vector )
                     74:                    return double_float is
                     75:
                     76:   -- DESCRIPTION :
                     77:   --   Returns the minimal element (/= 0)  in the vector v.
                     78:
                     79:     tol : constant double_float := 10.0**(-7);
                     80:     min : double_float := 0.0;
                     81:     tmp : double_float;
                     82:
                     83:   begin
                     84:     for i in v'range loop
                     85:       tmp := abs(v(i));
                     86:       if tmp > tol
                     87:        then if (min = 0.0) or else (tmp < min)
                     88:              then min := tmp;
                     89:             end if;
                     90:       end if;
                     91:     end loop;
                     92:     return min;
                     93:   end Minimum;
                     94:
                     95:   function Minimum ( v : Standard_Floating_VecVecs.VecVec )
                     96:                    return double_float is
                     97:
                     98:   -- DESCRIPTION :
                     99:   --   Returns the minimal nonzero element in the vectors of v.
                    100:
                    101:     tol : constant double_float := 10.0**(-7);
                    102:     min : double_float := 0.0;
                    103:     tmp : double_float;
                    104:
                    105:   begin
                    106:     for i in v'range loop
                    107:       tmp := Minimum(v(i).all);
                    108:       if abs(tmp) > tol
                    109:        then if (min = 0.0) or else (tmp < min)
                    110:              then min := tmp;
                    111:             end if;
                    112:       end if;
                    113:     end loop;
                    114:     return min;
                    115:   end Minimum;
                    116:
                    117:   function Scale ( v : Standard_Floating_Vectors.Vector; s : double_float )
                    118:                  return Standard_Floating_Vectors.Vector is
                    119:
                    120:   -- DESCRIPTION :
                    121:   --   Returns the scaled vector, by dividing every element by s.
                    122:
                    123:     res : Standard_Floating_Vectors.Vector(v'range);
                    124:
                    125:   begin
                    126:     for i in res'range loop
                    127:       res(i) := v(i)/s;
                    128:     end loop;
                    129:     return res;
                    130:   end Scale;
                    131:
                    132:   function Scale ( v : Standard_Floating_VecVecs.VecVec )
                    133:                  return Standard_Floating_VecVecs.VecVec is
                    134:
                    135:   -- DESCRIPTION :
                    136:   --   Returns an array of scaled vectors.
                    137:
                    138:     res : Standard_Floating_VecVecs.VecVec(v'range);
                    139:     min : constant double_float := Minimum(v);
                    140:     tol : constant double_float := 10.0**(-8);
                    141:
                    142:   begin
                    143:     if (abs(min) > tol) and (min /= 1.0)
                    144:      then
                    145:        for i in v'range loop
                    146:          res(i) := new Standard_Floating_Vectors.Vector'(Scale(v(i).all,min));
                    147:        end loop;
                    148:      else
                    149:        for i in v'range loop
                    150:          res(i) := new Standard_Floating_Vectors.Vector'(v(i).all);
                    151:        end loop;
                    152:     end if;
                    153:     return res;
                    154:   end Scale;
                    155:
                    156:   procedure Shift ( v : in out Standard_Floating_Vectors.Vector ) is
                    157:
                    158:   -- DESCRIPTION :
                    159:   --   Shifts the elements in v, such that the minimal element equals zero.
                    160:
                    161:     min : double_float := v(v'first);
                    162:
                    163:   begin
                    164:     for i in v'first+1..v'last loop
                    165:       if v(i) < min
                    166:        then min := v(i);
                    167:       end if;
                    168:     end loop;
                    169:     if min /= 0.0
                    170:      then for i in v'range loop
                    171:             v(i) := v(i) - min;
                    172:           end loop;
                    173:     end if;
                    174:   end Shift;
                    175:
                    176:   function Create ( e : Standard_Integer_VecVecs.VecVec;
                    177:                     l : List; normal :  Standard_Floating_Vectors.Vector )
                    178:                   return Standard_Floating_Vectors.Vector is
                    179:
                    180:   -- DESCRIPTION :
                    181:   --   Returns a vector with all inner products of the normal with
                    182:   --   the exponents in the list, such that minimal value equals zero.
                    183:
                    184:     res : Standard_Floating_Vectors.Vector(e'range);
                    185:     use Standard_Floating_Vectors;
                    186:     found : boolean;
                    187:     lif : double_float;
                    188:
                    189:   begin
                    190:     for i in e'range loop
                    191:       declare
                    192:         fei : constant Standard_Floating_Vectors.Vector := Convert(e(i).all);
                    193:       begin
                    194:         Search_Lifting(l,fei,found,lif);
                    195:         if not found
                    196:          then res(i) := 1000.0;
                    197:          else res(i) := fei*normal(fei'range) + lif*normal(normal'last);
                    198:         end if;
                    199:       end;
                    200:     end loop;
                    201:     Shift(res);
                    202:     return res;
                    203:   end Create;
                    204:
                    205:   function Create ( e : Exponent_Vectors_Array;
                    206:                     l : Array_of_Lists; mix : Standard_Integer_Vectors.Vector;
                    207:                     normal : Standard_Floating_Vectors.Vector )
                    208:                   return Standard_Floating_VecVecs.VecVec is
                    209:
                    210:     res : Standard_Floating_VecVecs.VecVec(normal'first..normal'last-1);
                    211:     cnt : natural := res'first;
                    212:
                    213:   begin
                    214:     for i in mix'range loop
                    215:       declare
                    216:         rescnt : constant Standard_Floating_Vectors.Vector
                    217:                := Create(e(cnt).all,l(i),normal);
                    218:       begin
                    219:         res(cnt) := new Standard_Floating_Vectors.Vector(rescnt'range);
                    220:         for j in rescnt'range loop
                    221:           res(cnt)(j) := rescnt(j);
                    222:         end loop;
                    223:       end;
                    224:       Shift(res(cnt).all);
                    225:       for k in 1..(mix(i)-1) loop
                    226:         res(cnt+k) := new Standard_Floating_Vectors.Vector(res(cnt)'range);
                    227:         for j in res(cnt)'range loop
                    228:           res(cnt+k)(j) := res(cnt)(j);
                    229:         end loop;
                    230:       end loop;
                    231:       cnt := cnt + mix(i);
                    232:     end loop;
                    233:     return res;
                    234:   end Create;
                    235:
                    236:   procedure Eval ( c : in Standard_Complex_Vectors.Vector;
                    237:                    t : in double_float; m : in Standard_Floating_Vectors.Vector;
                    238:                    ctm : in out Standard_Complex_Vectors.Vector ) is
                    239:
                    240:   -- DESCRIPTION : ctm = c*t**m.
                    241:
                    242:   begin
                    243:     for i in ctm'range loop
                    244:       -- ctm(i) := c(i)*Create((t**m(i)));
                    245:       ctm(i) := c(i)*Create(Power(t,m(i)));
                    246:     end loop;
                    247:   end Eval;
                    248:
                    249:   procedure Eval ( c : in Standard_Complex_VecVecs.VecVec;
                    250:                    t : in double_float; m : in Standard_Floating_VecVecs.VecVec;
                    251:                    ctm : in out Standard_Complex_VecVecs.VecVec ) is
                    252:
                    253:   -- DESCRIPTION : ctm = c*t**m.
                    254:
                    255:   begin
                    256:     for i in ctm'range loop
                    257:       Eval(c(i).all,t,m(i).all,ctm(i).all);
                    258:     end loop;
                    259:   end Eval;
                    260:
                    261: -- USEFUL PRIMITIVES :
                    262:
                    263:   function Is_In ( l : List;
                    264:                    d : Standard_Complex_Laur_Polys.Degrees )
                    265:                  return boolean is
                    266:
                    267:   -- DESCRIPTION :
                    268:   --   Returns true if the degrees belong to the list l.
                    269:
                    270:     tmp : List := l;
                    271:     pt : Standard_Floating_Vectors.Link_to_Vector;
                    272:     fld : Standard_Floating_Vectors.Vector(d'range);
                    273:     equ : boolean;
                    274:
                    275:   begin
                    276:     for i in fld'range loop
                    277:       fld(i) := double_float(d(i));
                    278:     end loop;
                    279:     while not Is_Null(tmp) loop
                    280:       pt := Head_Of(tmp);
                    281:       equ := true;
                    282:       for i in fld'range loop
                    283:         if pt(i) /= fld(i)
                    284:          then equ := false;
                    285:         end if;
                    286:         exit when not equ;
                    287:       end loop;
                    288:       if equ
                    289:        then return true;
                    290:        else tmp := Tail_Of(tmp);
                    291:       end if;
                    292:     end loop;
                    293:     return false;
                    294:   end Is_In;
                    295:
                    296:   function Select_Terms ( p : Standard_Complex_Laur_Polys.Poly; l : List )
                    297:                         return Standard_Complex_Laur_Polys.Poly is
                    298:
                    299:     use Standard_Complex_Laur_Polys;
                    300:     res : Poly := Null_Poly;
                    301:
                    302:     procedure Visit_Term ( t : in Term; cont : out boolean ) is
                    303:     begin
                    304:       if Is_In(l,t.dg)
                    305:        then Add(res,t);
                    306:       end if;
                    307:       cont := true;
                    308:     end Visit_Term;
                    309:     procedure Visit_Terms is new Visiting_Iterator(Visit_Term);
                    310:
                    311:   begin
                    312:     Visit_Terms(p);
                    313:     return res;
                    314:   end Select_Terms;
                    315:
                    316:   function Select_Subsystem
                    317:                ( p : Laur_Sys; mix : Standard_Integer_Vectors.Vector;
                    318:                  mic : Mixed_Cell ) return Laur_Sys is
                    319:
                    320:   -- DESCRIPTION :
                    321:   --   Given a Laurent polynomial system and a mixed cell,
                    322:   --   the corresponding subsystem will be returned.
                    323:
                    324:   -- ON ENTRY :
                    325:   --   p          a Laurent polynomial system;
                    326:   --   mix        type of mixture: occurencies of the supports;
                    327:   --   mic        a mixed cell.
                    328:
                    329:   -- REQUIRED :
                    330:   --   The polynomials in p must be ordered according to the type of mixture.
                    331:
                    332:     res : Laur_Sys(p'range);
                    333:     cnt : natural := 0;
                    334:
                    335:   begin
                    336:     for k in mix'range loop
                    337:       for l in 1..mix(k) loop
                    338:         cnt := cnt + 1;
                    339:         res(cnt) := Select_Terms(p(cnt),mic.pts(k));
                    340:       end loop;
                    341:     end loop;
                    342:     return res;
                    343:   end Select_Subsystem;
                    344:
                    345:   procedure Extract_Regular ( sols : in out Solution_List ) is
                    346:
                    347:     function To_Be_Removed ( flag : in natural ) return boolean is
                    348:     begin
                    349:       return ( flag /= 1 );
                    350:     end To_Be_Removed;
                    351:     procedure Extract_Regular_Solutions is new
                    352:                 Standard_Complex_Solutions.Delete(To_Be_Removed);
                    353:
                    354:   begin
                    355:     Extract_Regular_Solutions(sols);
                    356:   end Extract_Regular;
                    357:
                    358:   procedure Refine ( file : in file_type; p : in Laur_Sys;
                    359:                      sols : in out Solution_List ) is
                    360:
                    361:   -- DESCRIPTION :
                    362:   --   Given a polyhedral homotopy p and a list of solution for t=1,
                    363:   --   this list of solutions will be refined.
                    364:
                    365:     pp : Poly_Sys(p'range) := Laurent_to_Polynomial_System(p);
                    366:     n : constant natural := p'length;
                    367:     eps : constant double_float := 10.0**(-12);
                    368:     tolsing : constant double_float := 10.0**(-8);
                    369:     max : constant natural := 3;
                    370:     numb : natural := 0;
                    371:
                    372:   begin
                    373:     pp := Laurent_to_Polynomial_System(p);
                    374:     Substitute(n+1,Create(1.0),pp);
                    375:    -- Reporting_Root_Refiner(file,pp,sols,eps,eps,tolsing,numb,max,false);
                    376:     Clear(pp); Extract_Regular(sols);
                    377:   end Refine;
                    378:
                    379: -- FIRST LAYER OF CONTINUATION ROUTINES :
                    380:
                    381:   procedure Mixed_Continuation
                    382:                 ( mix : in Standard_Integer_Vectors.Vector;
                    383:                   lifted : in Array_of_Lists; h : in Eval_Coeff_Laur_Sys;
                    384:                   c : in Standard_Complex_VecVecs.VecVec;
                    385:                   e : in Exponent_Vectors_Array;
                    386:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    387:                   normal : in Standard_Floating_Vectors.Vector;
                    388:                   sols : in out Solution_List ) is
                    389:
                    390:     pow : Standard_Floating_VecVecs.VecVec(c'range)
                    391:         := Create(e,lifted,mix,normal);
                    392:     scapow : Standard_Floating_VecVecs.VecVec(c'range) := Scale(pow);
                    393:     ctm : Standard_Complex_VecVecs.VecVec(c'range);
                    394:
                    395:     use Standard_Floating_Vectors;
                    396:     use Standard_Complex_Laur_Polys;
                    397:
                    398:     function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    399:                   return Standard_Complex_Vectors.Vector is
                    400:     begin
                    401:       Eval(c,REAL_PART(t),scapow,ctm);
                    402:       return Eval(h,ctm,x);
                    403:     end Eval;
                    404:
                    405:     function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    406:                  return Standard_Complex_Vectors.Vector is
                    407:
                    408:       res : Standard_Complex_Vectors.Vector(h'range);
                    409:       xtl : constant integer := x'last+1;
                    410:
                    411:     begin
                    412:       Eval(c,REAL_PART(t),scapow,ctm);
                    413:       for i in res'range loop
                    414:         res(i) := Eval(j(i,xtl),m(i,xtl).all,ctm(i).all,x);
                    415:       end loop;
                    416:       return res;
                    417:     end dHt;
                    418:
                    419:     function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    420:                  return matrix is
                    421:
                    422:       mt : Matrix(x'range,x'range);
                    423:
                    424:     begin
                    425:       Eval(c,REAL_PART(t),scapow,ctm);
                    426:       for k in mt'range(1) loop
                    427:         for l in mt'range(2) loop
                    428:           mt(k,l) := Eval(j(k,l),m(k,l).all,ctm(k).all,x);
                    429:         end loop;
                    430:       end loop;
                    431:       return mt;
                    432:     end dHx;
                    433:
                    434:     procedure Laur_Cont is new Silent_Continue(Max_Norm,Eval,dHt,dHx);
                    435:
                    436:   begin
                    437:     for i in c'range loop
                    438:       ctm(i)
                    439:         := new Standard_Complex_Vectors.Vector'(c(i).all'range => Create(0.0));
                    440:     end loop;
                    441:     Laur_Cont(sols,false);
                    442:     Standard_Floating_VecVecs.Clear(pow);
                    443:     Standard_Floating_VecVecs.Clear(scapow);
                    444:     Standard_Complex_VecVecs.Clear(ctm);
                    445:     Extract_Regular(sols);
                    446:   end Mixed_Continuation;
                    447:
                    448:   procedure Mixed_Continuation
                    449:                 ( file : in file_type;
                    450:                   mix : in Standard_Integer_Vectors.Vector;
                    451:                   lifted : in Array_of_Lists; h : in Eval_Coeff_Laur_Sys;
                    452:                   c : in Standard_Complex_VecVecs.VecVec;
                    453:                   e : in Exponent_Vectors_Array;
                    454:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    455:                   normal : in Standard_Floating_Vectors.Vector;
                    456:                   sols : in out Solution_List ) is
                    457:
                    458:     pow : Standard_Floating_VecVecs.VecVec(c'range)
                    459:         := Create(e,lifted,mix,normal);
                    460:     scapow : Standard_Floating_VecVecs.VecVec(c'range) := Scale(pow);
                    461:     ctm : Standard_Complex_VecVecs.VecVec(c'range);
                    462:
                    463:     use Standard_Floating_Vectors;
                    464:     use Standard_Complex_Laur_Polys;
                    465:
                    466:     function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    467:                   return Standard_Complex_Vectors.Vector is
                    468:     begin
                    469:       Eval(c,REAL_PART(t),scapow,ctm);
                    470:       return Eval(h,ctm,x);
                    471:     end Eval;
                    472:
                    473:     function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    474:                  return Standard_Complex_Vectors.Vector is
                    475:
                    476:       res : Standard_Complex_Vectors.Vector(h'range);
                    477:       xtl : constant integer := x'last+1;
                    478:
                    479:     begin
                    480:       Eval(c,REAL_PART(t),scapow,ctm);
                    481:       for i in res'range loop
                    482:         res(i) := Eval(j(i,xtl),m(i,xtl).all,ctm(i).all,x);
                    483:       end loop;
                    484:       return res;
                    485:     end dHt;
                    486:
                    487:     function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    488:                  return Matrix is
                    489:
                    490:       mt : Matrix(x'range,x'range);
                    491:
                    492:     begin
                    493:       Eval(c,REAL_PART(t),scapow,ctm);
                    494:       for k in m'range(1) loop
                    495:         for l in m'range(1) loop
                    496:           mt(k,l) := Eval(j(k,l),m(k,l).all,ctm(k).all,x);
                    497:         end loop;
                    498:       end loop;
                    499:       return mt;
                    500:     end dHx;
                    501:
                    502:     procedure Laur_Cont is new Reporting_Continue(Max_Norm,Eval,dHt,dHx);
                    503:
                    504:   begin
                    505:    -- put_line(file,"The coefficient vectors :" );
                    506:    -- for i in c'range loop
                    507:    --   put(file,c(i).all,3,3,3); new_line(file);
                    508:    -- end loop;
                    509:     for i in c'range loop
                    510:       ctm(i)
                    511:         := new Standard_Complex_Vectors.Vector'(c(i).all'range => Create(0.0));
                    512:     end loop;
                    513:    -- put(file,"The normal : "); put(file,normal,3,3,3); new_line(file);
                    514:    -- put_line(file,"The exponent vector : ");
                    515:    -- for i in pow'range loop
                    516:    --   put(file,pow(i).all,3,3,3); new_line(file);
                    517:    -- end loop;
                    518:    -- put_line(file,"The scaled exponent vector : ");
                    519:    -- for i in pow'range loop
                    520:    --   put(file,scapow(i).all,3,3,3); new_line(file);
                    521:    -- end loop;
                    522:     Laur_Cont(file,sols,false);
                    523:     Standard_Floating_VecVecs.Clear(pow);
                    524:     Standard_Floating_VecVecs.Clear(scapow);
                    525:     Standard_Complex_VecVecs.Clear(ctm);
                    526:     Extract_Regular(sols);
                    527:   end Mixed_Continuation;
                    528:
                    529: -- UTILITIES FOR SECOND LAYER :
                    530:
                    531:   function Remove_Lifting ( l : List ) return List is
                    532:
                    533:   -- DESCRIPTION :
                    534:   --   Removes the lifting value from the vectors.
                    535:
                    536:     tmp,res,res_last : List;
                    537:
                    538:   begin
                    539:     tmp := l;
                    540:     while not Is_Null(tmp) loop
                    541:       declare
                    542:         d1 : constant Standard_Floating_Vectors.Vector := Head_Of(tmp).all;
                    543:         d2 : constant Standard_Floating_Vectors.Vector
                    544:            := d1(d1'first..d1'last-1);
                    545:       begin
                    546:         Append(res,res_last,d2);
                    547:       end;
                    548:       tmp := Tail_Of(tmp);
                    549:     end loop;
                    550:     return res;
                    551:   end Remove_Lifting;
                    552:
                    553:   function Sub_Lifting ( q : Laur_Sys; mix : Standard_Integer_Vectors.Vector;
                    554:                          mic : Mixed_Cell ) return Array_of_Lists is
                    555:
                    556:   -- DESCRIPTION :
                    557:   --   Returns the lifting used to subdivide the cell.
                    558:
                    559:     res : Array_of_Lists(mix'range);
                    560:     sup : Array_of_Lists(q'range);
                    561:     n : constant natural := q'last;
                    562:     cnt : natural := sup'first;
                    563:
                    564:   begin
                    565:     for i in mic.pts'range loop
                    566:       sup(cnt) := Remove_Lifting(mic.pts(i));
                    567:       for j in 1..(mix(i)-1) loop
                    568:         Copy(sup(cnt),sup(cnt+j));
                    569:       end loop;
                    570:       cnt := cnt + mix(i);
                    571:     end loop;
                    572:     res := Induced_Lifting(n,mix,sup,mic.sub.all);
                    573:     Deep_Clear(sup);
                    574:     return res;
                    575:   end Sub_Lifting;
                    576:
                    577:   function Sub_Polyhedral_Homotopy
                    578:                ( l : List; e : Standard_Integer_VecVecs.VecVec;
                    579:                  c : Standard_Complex_Vectors.Vector )
                    580:                return Standard_Complex_Vectors.Vector is
                    581:
                    582:   -- DESCRIPTION :
                    583:   --   For every vector in e that does not belong to l, the corresponding
                    584:   --   index in c will be set to zero, otherwise it is copied to the result.
                    585:
                    586:     res : Standard_Complex_Vectors.Vector(c'range);
                    587:     found : boolean;
                    588:     lif : double_float;
                    589:
                    590:   begin
                    591:     for i in e'range loop
                    592:       declare
                    593:         fei : constant Standard_Floating_Vectors.Vector := Convert(e(i).all);
                    594:       begin
                    595:         Search_Lifting(l,fei,found,lif);
                    596:         if not found
                    597:          then res(i) := Create(0.0);
                    598:          else res(i) := c(i);
                    599:         end if;
                    600:       end;
                    601:     end loop;
                    602:     return res;
                    603:   end Sub_Polyhedral_Homotopy;
                    604:
                    605:   function Sub_Polyhedral_Homotopy
                    606:                ( mix : Standard_Integer_Vectors.Vector; mic : Mixed_Cell;
                    607:                  e : Exponent_Vectors_Array;
                    608:                  c : Standard_Complex_VecVecs.VecVec )
                    609:                return Standard_Complex_VecVecs.VecVec is
                    610:
                    611:   -- DESCRIPTION :
                    612:   --   Given a subsystem q of p and the coefficient vector of p, the
                    613:   --   vector on return will have only nonzero entries for coefficients
                    614:   --   that belong to q.
                    615:
                    616:     res : Standard_Complex_VecVecs.VecVec(c'range);
                    617:
                    618:   begin
                    619:     for i in mix'range loop
                    620:       declare
                    621:         cri : constant Standard_Complex_Vectors.Vector
                    622:             := Sub_Polyhedral_Homotopy(mic.pts(i),e(i).all,c(i).all);
                    623:       begin
                    624:         res(i) := new Standard_Complex_Vectors.Vector'(cri);
                    625:         for j in 1..(mix(i)-1) loop
                    626:           declare
                    627:             crj : constant Standard_Complex_Vectors.Vector
                    628:                 := Sub_Polyhedral_Homotopy(mic.pts(i),e(i+j).all,c(i+j).all);
                    629:           begin
                    630:             res(i+j) := new Standard_Complex_Vectors.Vector'(crj);
                    631:           end;
                    632:         end loop;
                    633:       end;
                    634:     end loop;
                    635:     return res;
                    636:   end Sub_Polyhedral_Homotopy;
                    637:
                    638:   procedure Refined_Mixed_Solve
                    639:                 ( q : in Laur_Sys; mix : in Standard_Integer_Vectors.Vector;
                    640:                   mic : in Mixed_Cell; h : in Eval_Coeff_Laur_Sys;
                    641:                   c : in Standard_Complex_VecVecs.VecVec;
                    642:                   e : in Exponent_Vectors_Array;
                    643:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    644:                   qsols : in out Solution_List ) is
                    645:
                    646:   -- DESCRIPTION :
                    647:   --   Polyhedral coeffient-homotopy for subsystem q.
                    648:
                    649:   -- REQUIRED : mic.sub /= null.
                    650:
                    651:     lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
                    652:     cq : Standard_Complex_VecVecs.VecVec(c'range)
                    653:        := Sub_Polyhedral_Homotopy(mix,mic,e,c);
                    654:
                    655:   begin
                    656:     Mixed_Solve(q,lif,h,cq,e,j,m,mix,mic.sub.all,qsols);
                    657:     Standard_Complex_VecVecs.Clear(cq); Deep_Clear(lif);
                    658:   end Refined_Mixed_Solve;
                    659:
                    660:   procedure Refined_Mixed_Solve
                    661:                 ( file : in file_type; q : in Laur_Sys;
                    662:                   mix : in Standard_Integer_Vectors.Vector;
                    663:                   mic : in Mixed_Cell; h : in Eval_Coeff_Laur_Sys;
                    664:                   c : in Standard_Complex_VecVecs.VecVec;
                    665:                   e : in Exponent_Vectors_Array;
                    666:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    667:                   qsols : in out Solution_List ) is
                    668:
                    669:   -- DESCRIPTION :
                    670:   --   Polyhedral coeffient-homotopy for subsystem q.
                    671:
                    672:   -- REQUIRED : mic.sub /= null.
                    673:
                    674:     lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
                    675:     cq : Standard_Complex_VecVecs.VecVec(c'range)
                    676:        := Sub_Polyhedral_Homotopy(mix,mic,e,c);
                    677:
                    678:   begin
                    679:     Mixed_Solve(file,q,lif,h,cq,e,j,m,mix,mic.sub.all,qsols);
                    680:     Standard_Complex_VecVecs.Clear(cq); Deep_Clear(lif);
                    681:   end Refined_Mixed_Solve;
                    682:
                    683: -- SECOND LAYER :
                    684:
                    685:   procedure Mixed_Solve
                    686:                 ( p : in Laur_Sys; lifted : in Array_of_Lists;
                    687:                   h : in Eval_Coeff_Laur_Sys;
                    688:                   c : in Standard_Complex_VecVecs.VecVec;
                    689:                   e : in Exponent_Vectors_Array;
                    690:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    691:                   mix : in Standard_Integer_Vectors.Vector;
                    692:                   mic : in Mixed_Cell;
                    693:                   sols,sols_last : in out Solution_List ) is
                    694:
                    695:     q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
                    696:     sq : Laur_Sys(q'range) := Shift(q);
                    697:     pq : Poly_Sys(q'range);
                    698:     qsols : Solution_List;
                    699:     len : natural := 0;
                    700:     fail : boolean;
                    701:
                    702:   begin
                    703:     Solve(sq,qsols,fail);
                    704:     if fail
                    705:      then if mic.sub = null
                    706:            then pq := Laurent_to_Polynomial_System(sq);
                    707:                 qsols := Solve_by_Static_Lifting(pq);
                    708:                 Clear(pq);
                    709:            else Refined_Mixed_Solve(q,mix,mic,h,c,e,j,m,qsols);
                    710:           end if;
                    711:           Set_Continuation_Parameter(qsols,Create(0.0));
                    712:     end if;
                    713:     len := Length_Of(qsols);
                    714:     if len > 0
                    715:      then Mixed_Continuation(mix,lifted,h,c,e,j,m,mic.nor.all,qsols);
                    716:           Concat(sols,sols_last,qsols);
                    717:     end if;
                    718:     Clear(sq); Clear(q); Clear(qsols);
                    719:   end Mixed_Solve;
                    720:
                    721:   procedure Mixed_Solve
                    722:                 ( file : in file_type;
                    723:                   p : in Laur_Sys; lifted : in Array_of_Lists;
                    724:                   h : in Eval_Coeff_Laur_Sys;
                    725:                   c : in Standard_Complex_VecVecs.VecVec;
                    726:                   e : in Exponent_Vectors_Array;
                    727:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    728:                   mix : in Standard_Integer_Vectors.Vector;
                    729:                   mic : in Mixed_Cell;
                    730:                   sols,sols_last : in out Solution_List ) is
                    731:
                    732:     q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
                    733:     sq : Laur_Sys(q'range) := Shift(q);
                    734:     pq : Poly_Sys(q'range);
                    735:     qsols : Solution_List;
                    736:     len : natural := 0;
                    737:     fail : boolean;
                    738:
                    739:   begin
                    740:     Solve(sq,qsols,fail);
                    741:     if not fail
                    742:      then put_line(file,"It is a fewnomial system.");
                    743:      else put_line(file,"No fewnomial system.");
                    744:           if mic.sub = null
                    745:            then put_line(file,"Calling the black box solver.");
                    746:                 pq := Laurent_to_Polynomial_System(sq);
                    747:                 qsols := Solve_by_Static_Lifting(file,pq);
                    748:                 Clear(pq);
                    749:            else put_line(file,"Using the refinement of the cell.");
                    750:                 Refined_Mixed_Solve(file,q,mix,mic,h,c,e,j,m,qsols);
                    751:           end if;
                    752:           Set_Continuation_Parameter(qsols,Create(0.0));
                    753:     end if;
                    754:     len := Length_Of(qsols);
                    755:     put(file,len,1); put_line(file," solutions found.");
                    756:     if len > 0
                    757:      then
                    758:        Mixed_Continuation(file,mix,lifted,h,c,e,j,m,mic.nor.all,qsols);
                    759:        Concat(sols,sols_last,qsols);
                    760:     end if;
                    761:     Clear(sq); Clear(q); Clear(qsols);
                    762:   end Mixed_Solve;
                    763:
                    764: -- THIRD LAYER :
                    765:
                    766:   procedure Mixed_Solve
                    767:                 ( p : in Laur_Sys; lifted : in Array_of_Lists;
                    768:                   h : in Eval_Coeff_Laur_Sys;
                    769:                   c : in Standard_Complex_VecVecs.VecVec;
                    770:                   e : in Exponent_Vectors_Array;
                    771:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    772:                   mix : in Standard_Integer_Vectors.Vector;
                    773:                   mixsub : in Mixed_Subdivision;
                    774:                   sols : in out Solution_List ) is
                    775:
                    776:     tmp : Mixed_Subdivision := mixsub;
                    777:     mic : Mixed_Cell;
                    778:     sols_last : Solution_List;
                    779:
                    780:   begin
                    781:     while not Is_Null(tmp) loop
                    782:       mic := Head_Of(tmp);
                    783:       Mixed_Solve(p,lifted,h,c,e,j,m,mix,mic,sols,sols_last);
                    784:       tmp := Tail_Of(tmp);
                    785:     end loop;
                    786:   end Mixed_Solve;
                    787:
                    788:   procedure Mixed_Solve
                    789:                 ( file : in file_type;
                    790:                   p : in Laur_Sys; lifted : in Array_of_Lists;
                    791:                   h : in Eval_Coeff_Laur_Sys;
                    792:                   c : in Standard_Complex_VecVecs.VecVec;
                    793:                   e : in Exponent_Vectors_Array;
                    794:                   j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
                    795:                   mix : in Standard_Integer_Vectors.Vector;
                    796:                   mixsub : in Mixed_Subdivision;
                    797:                   sols : in out Solution_List ) is
                    798:
                    799:     tmp : Mixed_Subdivision := mixsub;
                    800:     mic : Mixed_Cell;
                    801:     sols_last : Solution_List;
                    802:     cnt : natural := 0;
                    803:
                    804:   begin
                    805:     while not Is_Null(tmp) loop
                    806:       mic := Head_Of(tmp);
                    807:       cnt := cnt + 1;
                    808:       new_line(file);
                    809:       put(file,"*** PROCESSING SUBSYSTEM "); put(file,cnt,1);
                    810:       put_line(file," ***");
                    811:       new_line(file);
                    812:       Mixed_Solve(file,p,lifted,h,c,e,j,m,mix,mic,sols,sols_last);
                    813:       tmp := Tail_Of(tmp);
                    814:     end loop;
                    815:   end Mixed_Solve;
                    816:
                    817: end Floating_Polyhedral_Continuation;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>