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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Implift/set_structures_and_volumes.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
        !             2: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
        !             3: with Standard_Natural_Vectors;
        !             4: with Standard_Complex_Vectors;           use Standard_Complex_Vectors;
        !             5: with Standard_Complex_Matrices;          use Standard_Complex_Matrices;
        !             6: with Standard_Complex_Linear_Solvers;    use Standard_Complex_Linear_Solvers;
        !             7: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
        !             8: with Standard_Complex_Poly_Randomizers;  use Standard_Complex_Poly_Randomizers;
        !             9: with Standard_Complex_Substitutors;      use Standard_Complex_Substitutors;
        !            10: with Standard_Complex_Laur_Systems;      use Standard_Complex_Laur_Systems;
        !            11: with Standard_Poly_Laur_Convertors;      use Standard_Poly_Laur_Convertors;
        !            12: with Arrays_of_Integer_Vector_Lists;     use Arrays_of_Integer_Vector_Lists;
        !            13: with Set_Structure;
        !            14: with Random_Product_System;
        !            15: with Random_Product_Start_Systems;
        !            16: with Power_Lists;                        use Power_Lists;
        !            17: with Volumes;                            use Volumes;
        !            18: with Mixed_Homotopy_Continuation;        use Mixed_Homotopy_Continuation;
        !            19:
        !            20: package body Set_Structures_and_Volumes is
        !            21:
        !            22: -- AUXILIARIES :
        !            23:
        !            24:   procedure Build_RPS ( k,n : in natural; p : in Poly_Sys ) is
        !            25:
        !            26:   -- DESCRIPTION :
        !            27:   --   If the set structure is empty, then a set structure will
        !            28:   --   be constructed for the first k polynomials of p;
        !            29:   --   the data in Random_Product_System will be build.
        !            30:
        !            31:   begin
        !            32:     if Set_Structure.Empty
        !            33:      then declare
        !            34:            tmp : Poly_Sys(p'range);
        !            35:            t : Term;
        !            36:            cnst : Poly;
        !            37:           begin
        !            38:            tmp(1..k) := p(1..k);
        !            39:            t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
        !            40:            t.cf := Create(1.0);
        !            41:            cnst := Create(t);
        !            42:            tmp(k+1..n) := (k+1..n => cnst);
        !            43:            Random_Product_Start_Systems.Build_Set_Structure(tmp);
        !            44:            Standard_Natural_Vectors.Clear
        !            45:               (Standard_Natural_Vectors.Link_to_Vector(t.dg));
        !            46:             Clear(cnst);
        !            47:           end;
        !            48:     end if;
        !            49:     Random_Product_System.Init(n);
        !            50:     Random_Product_Start_Systems.Build_Random_Product_System(n);
        !            51:   end Build_RPS;
        !            52:
        !            53:   procedure Build_Elimination_Matrix
        !            54:              ( k,n : in natural; ind : in Standard_Natural_Vectors.Vector;
        !            55:                m : in out Matrix;
        !            56:                 pivots : in out Standard_Natural_Vectors.Vector;
        !            57:                degenerate : out boolean ) is
        !            58:
        !            59:   -- DESCRIPTION :
        !            60:   --   builds the elimination matrix m.
        !            61:
        !            62:   -- ON ENTRY :
        !            63:   --   k            the number of unknowns to be eliminated;
        !            64:   --   n            the number of polynomials and unknowns;
        !            65:   --   ind          entries in Random_Product_System;
        !            66:   --                ind(l) indicates lth hyperplane;
        !            67:
        !            68:   -- ON RETURN :
        !            69:   --   m            contains all k hyperplanes to use for elimination;
        !            70:   --   pivots       if not degenerate, then m(i,pivots(i)) /= 0;
        !            71:   --   degenerate   is true if the first k hyperplanes were inconsistent.
        !            72:
        !            73:     degen : boolean;
        !            74:
        !            75:   begin
        !            76:     for i in ind'range loop                 -- build the matrix
        !            77:       declare
        !            78:        h : Vector(0..n) := Random_Product_System.Get_Hyperplane(i,ind(i));
        !            79:       begin
        !            80:         for j in 1..n loop
        !            81:          m(i,j) := h(j);
        !            82:         end loop;
        !            83:         m(i,n+1) := h(0);
        !            84:       end;
        !            85:     end loop;
        !            86:     diagonalize(m,k,n+1);
        !            87:     degen := false;                         -- check degeneracy
        !            88:     declare
        !            89:       eps : constant double_float := 10.0**(-10);
        !            90:     begin
        !            91:       for i in pivots'range loop
        !            92:         for j in 1..n loop
        !            93:          if AbsVal(m(i,j)) > eps
        !            94:           then pivots(i) := j;
        !            95:           end if;
        !            96:          exit when (pivots(i) /= 0);
        !            97:         end loop;
        !            98:         degen := (pivots(i) = 0);
        !            99:         exit when degen;
        !           100:       end loop;
        !           101:     end;
        !           102:     degenerate := degen;
        !           103:   end Build_Elimination_Matrix;
        !           104:
        !           105:   procedure Eliminate ( k,n : in natural; p : in Poly_Sys; m : in Matrix;
        !           106:                         pivots : in Standard_Natural_Vectors.Vector;
        !           107:                        q : in out Poly_Sys ) is
        !           108:   -- DESCRIPTION :
        !           109:   --   eliminates k unknowns of the polynomial system p.
        !           110:
        !           111:   -- ON ENTRY :
        !           112:   --   k            the number of unknowns to be eliminated;
        !           113:   --   n            the number of polynomials and unknowns;
        !           114:   --   p            a polynomial system with random coefficients;
        !           115:   --   m            the diagonalized matrix, to be used for elimination,
        !           116:   --                for i in m'range(1) : m(i,pivots(i)) /= 0;
        !           117:   --   pivots       a vector indicating nonzero entries in m.
        !           118:
        !           119:   -- ON RETURN :
        !           120:   --   q            the reduced system.
        !           121:
        !           122:   begin
        !           123:     Clear(q); Copy(p,q);
        !           124:     for i in pivots'range loop
        !           125:       declare
        !           126:         h : Vector(0..n-i+1);
        !           127:         piv : natural := pivots(i)-i+1;
        !           128:       begin
        !           129:         h(0) := m(i,n+1);
        !           130:         h(1..n-i+1) := (1..n-i+1 => Create(0.0));
        !           131:         h(piv) := m(i,pivots(i));
        !           132:         for j in piv+1..n-i+1 loop
        !           133:           h(j) := m(i,j+i-1);
        !           134:         end loop;
        !           135:         Substitute(piv,h,q);
        !           136:       end;
        !           137:     end loop;
        !           138:   end Eliminate;
        !           139:
        !           140:   procedure Update ( sols : in out Solution_List; k,n : in natural;
        !           141:                     m : in Matrix;
        !           142:                      pivots : in Standard_Natural_Vectors.Vector ) is
        !           143:
        !           144:   -- DESCRIPTION :
        !           145:   --   Based on the elimination matrix m, solution components for x1..xk
        !           146:   --   can be computed.
        !           147:
        !           148:   -- ON ENTRY :
        !           149:   --   sols      a list of solutions, with values for x(n-k+1)..x(n);
        !           150:   --   k         the number of unknowns that have been eliminated;
        !           151:   --   n         total number of unknowns;
        !           152:   --   m         the elimination matrix;
        !           153:   --   pivots    for i in pivots'range : m(i,pivots(i)) /= 0.
        !           154:
        !           155:   -- ON RETURN :
        !           156:   --   sols      the solution list with n-dimensional vectors.
        !           157:
        !           158:     tmp,res,res_last : Solution_List;
        !           159:
        !           160:   begin
        !           161:     tmp := sols;
        !           162:     while not Is_Null(tmp) loop
        !           163:       declare
        !           164:        sol : Solution(n-k) := Head_Of(tmp).all;
        !           165:        soln : Solution(n);
        !           166:        ind : natural;
        !           167:       begin
        !           168:        soln.t := Create(0.0);
        !           169:        soln.m := sol.m;
        !           170:        soln.v := (1..n => Create(0.0));
        !           171:        for i in 1..k loop
        !           172:          soln.v(pivots(i)) := -m(i,n+1);
        !           173:         end loop;
        !           174:        ind := 0;
        !           175:        for i in 1..n loop
        !           176:          if soln.v(i) = Create(0.0)
        !           177:           then ind := ind + 1;
        !           178:                soln.v(i) := sol.v(ind);
        !           179:           end if;
        !           180:         end loop;
        !           181:        for i in 1..k loop
        !           182:          ind := pivots(i);
        !           183:          for j in ind+1..n loop
        !           184:            soln.v(ind) := soln.v(ind) - m(i,j)*soln.v(j);
        !           185:          end loop;
        !           186:          soln.v(ind) := soln.v(ind) / m(i,ind);
        !           187:         end loop;
        !           188:        Append(res,res_last,soln);
        !           189:       end;
        !           190:       tmp := Tail_Of(tmp);
        !           191:     end loop;
        !           192:     Clear(sols); Copy(res,sols);
        !           193:   end Update;
        !           194:
        !           195:   procedure Build_Indices ( l,k,n : in natural; p : in Poly_Sys;
        !           196:                            acc : in out Standard_Natural_Vectors.Vector;
        !           197:                            bb : in out natural ) is
        !           198:
        !           199:   -- DESCRIPTION :
        !           200:   --   Builds the indices in the vector acc.
        !           201:
        !           202:   -- ON ENTRY :
        !           203:   --   l           index in the array acc;
        !           204:   --   k           number of unknowns to eliminate;
        !           205:   --   n           number of polynomials and unknowns;
        !           206:   --   p           a polynomial system;
        !           207:   --   acc(1..l-1) contains entries indicating hyperplanes
        !           208:   --               in Random_Product_System.
        !           209:
        !           210:   -- ON RETURN :
        !           211:   --   acc(1..l)   contains entries indicating hyperplanes
        !           212:   --               in Random_Product_System;
        !           213:   --   bb          the mixed Bezout BKK bound.
        !           214:
        !           215:   begin
        !           216:     if l > k
        !           217:      then declare
        !           218:            degenerate : boolean;
        !           219:            m : Matrix(1..k,1..n+1);
        !           220:            pivots : Standard_Natural_Vectors.Vector(1..k);
        !           221:           begin
        !           222:            pivots := (1..k => 0);
        !           223:            Build_Elimination_Matrix(k,n,acc,m,pivots,degenerate);
        !           224:            if not degenerate
        !           225:             then declare
        !           226:                    q : Poly_Sys(p'range);
        !           227:                   begin
        !           228:                    Eliminate(k,n,p,m,pivots,q);
        !           229:                    bb := bb + Bezout_BKK(0,n-k,q);
        !           230:                    Clear(q);
        !           231:                   end;
        !           232:             end if;
        !           233:           end;
        !           234:      else for j in 1..Random_Product_System.Number_of_Hyperplanes(l) loop
        !           235:            acc(l) := j;
        !           236:            Build_Indices(l+1,k,n,p,acc,bb);
        !           237:           end loop;
        !           238:     end if;
        !           239:   end Build_Indices;
        !           240:
        !           241:   procedure Build_Indices ( l,k,n : in natural; p : in Poly_Sys;
        !           242:                            tv : in Tree_of_Vectors;
        !           243:                            acc : in out Standard_Natural_Vectors.Vector;
        !           244:                            bb : in out natural ) is
        !           245:
        !           246:   -- DESCRIPTION :
        !           247:   --   Builds the indices in the vector acc.
        !           248:
        !           249:   -- ON ENTRY :
        !           250:   --   l           index in the array acc;
        !           251:   --   k           number of unknowns to eliminate;
        !           252:   --   n           number of polynomials and unknowns;
        !           253:   --   p           a polynomial system;
        !           254:   --   tv          the tree of degrees used to compute the mixed volume;
        !           255:   --   acc(1..l-1) contains entries indicating hyperplanes
        !           256:   --               in Random_Product_System.
        !           257:
        !           258:   -- ON RETURN :
        !           259:   --   acc(1..l)   contains entries indicating hyperplanes
        !           260:   --               in Random_Product_System;
        !           261:   --   bb          the mixed Bezout BKK bound.
        !           262:
        !           263:   begin
        !           264:     if l > k
        !           265:      then declare
        !           266:            degenerate : boolean;
        !           267:            m : Matrix(1..k,1..n+1);
        !           268:            pivots : Standard_Natural_Vectors.Vector(1..k);
        !           269:           begin
        !           270:            pivots := (1..k => 0);
        !           271:            Build_Elimination_Matrix(k,n,acc,m,pivots,degenerate);
        !           272:            if not degenerate
        !           273:             then declare
        !           274:                    q : Poly_Sys(p'range);
        !           275:                   begin
        !           276:                    Eliminate(k,n,p,m,pivots,q);
        !           277:                    bb := bb + Bezout_BKK(0,n-k,q,tv);
        !           278:                    Clear(q);
        !           279:                   end;
        !           280:             end if;
        !           281:           end;
        !           282:      else for j in 1..Random_Product_System.Number_of_Hyperplanes(l) loop
        !           283:            acc(l) := j;
        !           284:            Build_Indices(l+1,k,n,p,tv,acc,bb);
        !           285:           end loop;
        !           286:     end if;
        !           287:   end Build_Indices;
        !           288:
        !           289:   procedure Build_Indices2 ( l,k,n : in natural; p : in Poly_Sys;
        !           290:                             tv : in out Tree_of_Vectors;
        !           291:                             acc : in out Standard_Natural_Vectors.Vector;
        !           292:                             bb : in out natural ) is
        !           293:
        !           294:   -- DESCRIPTION :
        !           295:   --   Builds the indices in the vector acc.
        !           296:
        !           297:   -- ON ENTRY :
        !           298:   --   l           index in the array acc;
        !           299:   --   k           number of unknowns to eliminate;
        !           300:   --   n           number of polynomials and unknowns;
        !           301:   --   p           a polynomial system;
        !           302:   --   acc(1..l-1) contains entries indicating hyperplanes
        !           303:   --               in Random_Product_System.
        !           304:
        !           305:   -- ON RETURN :
        !           306:   --   tv          the tree of degrees used to compute the mixed volume;
        !           307:   --   acc(1..l)   contains entries indicating hyperplanes
        !           308:   --               in Random_Product_System;
        !           309:   --   bb          the mixed Bezout BKK bound.
        !           310:
        !           311:   begin
        !           312:     if l > k
        !           313:      then declare
        !           314:            degenerate : boolean;
        !           315:            m : Matrix(1..k,1..n+1);
        !           316:            pivots : Standard_Natural_Vectors.Vector(1..k);
        !           317:           begin
        !           318:            pivots := (1..k => 0);
        !           319:            Build_Elimination_Matrix(k,n,acc,m,pivots,degenerate);
        !           320:            if not degenerate
        !           321:             then declare
        !           322:                    q : Poly_Sys(p'range);
        !           323:                    qtv,tmp : Tree_of_Vectors;
        !           324:                    mv : natural;
        !           325:                   begin
        !           326:                    Eliminate(k,n,p,m,pivots,q);
        !           327:                    Bezout_BKK(0,n-k,q,qtv,mv);
        !           328:                    bb := bb + mv;
        !           329:                    tmp := qtv;
        !           330:                    while not Is_Null(tmp) loop
        !           331:                      declare
        !           332:                        nd : node := Head_Of(tmp);
        !           333:                       begin
        !           334:                        if Is_In(tv,nd.d)
        !           335:                         then Clear(nd);
        !           336:                         else Construct(nd,tv);
        !           337:                         end if;
        !           338:                       end;
        !           339:                      tmp := Tail_Of(tmp);
        !           340:                     end loop;
        !           341:                    Clear(q);
        !           342:                   end;
        !           343:             end if;
        !           344:           end;
        !           345:      else for j in 1..Random_Product_System.Number_of_Hyperplanes(l) loop
        !           346:            acc(l) := j;
        !           347:            Build_Indices2(l+1,k,n,p,tv,acc,bb);
        !           348:           end loop;
        !           349:     end if;
        !           350:   end Build_Indices2;
        !           351:
        !           352:   procedure Build_Indices
        !           353:                  ( file : in file_type; p : in Poly_Sys; l,k,n : in natural;
        !           354:                    acc : in out Standard_Natural_Vectors.Vector;
        !           355:                    bb : in out natural;
        !           356:                    sols,sols_last : in out Solution_List ) is
        !           357:
        !           358:   -- DESCRIPTION :
        !           359:   --   Builds the indices in the vector acc.
        !           360:
        !           361:   -- ON ENTRY :
        !           362:   --   file        file to write intermediate results on;
        !           363:   --   p           a polynomial system;
        !           364:   --   l           index in the array acc;
        !           365:   --   k           number of unknowns to eliminate;
        !           366:   --   n           number of polynomials and unknowns;
        !           367:   --   acc(1..l-1) contains entries indicating hyperplanes
        !           368:   --               in Random_Product_System.
        !           369:
        !           370:   -- ON RETURN :
        !           371:   --   acc(1..l)   contains entries indicating hyperplanes
        !           372:   --               in Random_Product_System;
        !           373:   --   bb          the mixed Bezout BKK bound;
        !           374:   --   sols        the solutions of pi;
        !           375:   --   sols_last   points to the last element of the list sols.
        !           376:
        !           377:   begin
        !           378:     if l > k
        !           379:      then declare
        !           380:            degenerate : boolean;
        !           381:            m : Matrix(1..k,1..n+1);
        !           382:            pivots : Standard_Natural_Vectors.Vector(1..k);
        !           383:           begin
        !           384:            pivots := (1..k => 0);
        !           385:            Build_Elimination_Matrix(k,n,acc,m,pivots,degenerate);
        !           386:            if not degenerate
        !           387:             then declare
        !           388:                    q : Poly_Sys(p'range);
        !           389:                   begin
        !           390:                    Eliminate(k,n,p,m,pivots,q);
        !           391:                    declare
        !           392:                      las : Laur_Sys(q'range);
        !           393:                      qsols : Solution_List;
        !           394:                      bkk : natural;
        !           395:                     begin
        !           396:                      las := Polynomial_to_Laurent_System(q);
        !           397:                      Solve(file,las,bkk,qsols);
        !           398:                      bb := bb + bkk;
        !           399:                      Update(qsols,k,n,m,pivots);
        !           400:                      Concat(sols,sols_last,qsols);
        !           401:                       Clear(las); Shallow_Clear(qsols);
        !           402:                     end;
        !           403:                    Clear(q);
        !           404:                   end;
        !           405:             end if;
        !           406:           end;
        !           407:      else for j in 1..Random_Product_System.Number_of_Hyperplanes(l) loop
        !           408:            acc(l) := j;
        !           409:            Build_Indices(file,p,l+1,k,n,acc,bb,sols,sols_last);
        !           410:           end loop;
        !           411:     end if;
        !           412:   end Build_Indices;
        !           413:
        !           414:   procedure Build_Indices
        !           415:                  ( file : in file_type; p : in Poly_Sys; l,k,n : in natural;
        !           416:                    acc : in out Standard_Natural_Vectors.Vector;
        !           417:                    tv : in Tree_of_Vectors; bb : in out natural;
        !           418:                    sols,sols_last : in out Solution_List ) is
        !           419:
        !           420:   -- DESCRIPTION :
        !           421:   --   Builds the indices in the vector acc.
        !           422:
        !           423:   -- ON ENTRY :
        !           424:   --   file        file to write intermediate results on;
        !           425:   --   p           a polynomial system;
        !           426:   --   l           index in the array acc;
        !           427:   --   k           number of unknowns to eliminate;
        !           428:   --   n           number of polynomials and unknowns;
        !           429:   --   acc(1..l-1) contains entries indicating hyperplanes
        !           430:   --               in Random_Product_System;
        !           431:   --   tv          the tree containing useful directions;
        !           432:
        !           433:   -- ON RETURN :
        !           434:   --   acc(1..l)   contains entries indicating hyperplanes
        !           435:   --               in Random_Product_System;
        !           436:   --   bb          the mixed Bezout BKK bound;
        !           437:   --   sols        the solutions of pi;
        !           438:   --   sols_last   points to the last element of the list sols.
        !           439:
        !           440:   begin
        !           441:     if l > k
        !           442:      then declare
        !           443:            degenerate : boolean;
        !           444:            m : Matrix(1..k,1..n+1);
        !           445:            pivots : Standard_Natural_Vectors.Vector(1..k);
        !           446:           begin
        !           447:            pivots := (1..k => 0);
        !           448:            Build_Elimination_Matrix(k,n,acc,m,pivots,degenerate);
        !           449:            if not degenerate
        !           450:             then declare
        !           451:                    q : Poly_Sys(p'range);
        !           452:                   begin
        !           453:                    Eliminate(k,n,p,m,pivots,q);
        !           454:                    declare
        !           455:                      las : Laur_Sys(q'range);
        !           456:                      qsols : Solution_List;
        !           457:                      bkk : natural;
        !           458:                     begin
        !           459:                      las := Polynomial_to_Laurent_System(q);
        !           460:                      Solve(file,las,tv,bkk,qsols);
        !           461:                      bb := bb + bkk;
        !           462:                      Update(qsols,k,n,m,pivots);
        !           463:                      Concat(sols,sols_last,qsols);
        !           464:                       Clear(las); Shallow_Clear(qsols);
        !           465:                     end;
        !           466:                    Clear(q);
        !           467:                   end;
        !           468:             end if;
        !           469:           end;
        !           470:      else for j in 1..Random_Product_System.Number_of_Hyperplanes(l) loop
        !           471:            acc(l) := j;
        !           472:            Build_Indices(file,p,l+1,k,n,acc,tv,bb,sols,sols_last);
        !           473:           end loop;
        !           474:     end if;
        !           475:   end Build_Indices;
        !           476:
        !           477: -- TARGET ROUTINES :
        !           478:
        !           479:   function Bezout_BKK ( k,n : natural; p : Poly_Sys ) return natural is
        !           480:
        !           481:     res : natural;
        !           482:
        !           483:   begin
        !           484:     if k = 0
        !           485:      then declare
        !           486:            adl : Array_of_Lists(p'range) := Create(p);
        !           487:           begin
        !           488:            res := Mixed_Volume(n,adl);
        !           489:            Deep_Clear(adl);
        !           490:           end;
        !           491:      elsif k = n
        !           492:         then if Set_Structure.Empty
        !           493:               then Random_Product_Start_Systems.Build_Set_Structure(p);
        !           494:                    res := Set_Structure.B;
        !           495:                    Set_Structure.Clear;
        !           496:                else res := Set_Structure.B;
        !           497:               end if;
        !           498:          else Build_RPS(k,n,p);
        !           499:               declare
        !           500:                 acc : Standard_Natural_Vectors.Vector(1..k);
        !           501:                 q : Poly_Sys(1..n-k);
        !           502:               begin
        !           503:                 acc := (1..k => 0); res := 0;
        !           504:                 for i in q'range loop
        !           505:                   q(i) := Complex_Randomize1(p(i+k));
        !           506:                 end loop;
        !           507:                 Build_Indices(1,k,n,q,acc,res);
        !           508:                Clear(q);
        !           509:               end;
        !           510:              Random_Product_System.Clear;
        !           511:     end if;
        !           512:     return res;
        !           513:   end Bezout_BKK;
        !           514:
        !           515:   function Bezout_BKK ( k,n : natural; p : Poly_Sys; tv : Tree_of_Vectors )
        !           516:                      return natural is
        !           517:     res : natural;
        !           518:
        !           519:   begin
        !           520:     if k = 0
        !           521:      then declare
        !           522:            adl : Array_of_Lists(p'range) := Create(p);
        !           523:           begin
        !           524:            res := Mixed_Volume(n,adl,tv);
        !           525:            Deep_Clear(adl);
        !           526:           end;
        !           527:      elsif k = n
        !           528:         then if Set_Structure.Empty
        !           529:               then Random_Product_Start_Systems.Build_Set_Structure(p);
        !           530:                    res := Set_Structure.B;
        !           531:                    Set_Structure.Clear;
        !           532:                else res := Set_Structure.B;
        !           533:               end if;
        !           534:          else Build_RPS(k,n,p);
        !           535:               declare
        !           536:                 acc : Standard_Natural_Vectors.Vector(1..k);
        !           537:                 q : Poly_Sys(1..n-k);
        !           538:               begin
        !           539:                 acc := (1..k => 0); res := 0;
        !           540:                 for i in q'range loop
        !           541:                   q(i) := Complex_Randomize1(p(i+k));
        !           542:                 end loop;
        !           543:                 Build_Indices(1,k,n,q,tv,acc,res);
        !           544:                Clear(q);
        !           545:               end;
        !           546:              Random_Product_System.Clear;
        !           547:     end if;
        !           548:     return res;
        !           549:   end Bezout_BKK;
        !           550:
        !           551:   procedure Bezout_BKK ( k,n : in natural; p : in Poly_Sys;
        !           552:                         tv : in out Tree_of_Vectors; bb : out natural ) is
        !           553:     res : natural;
        !           554:
        !           555:   begin
        !           556:     if k = 0
        !           557:      then declare
        !           558:            adl : Array_of_Lists(p'range) := Create(p);
        !           559:           begin
        !           560:            Mixed_Volume(n,adl,tv,res);
        !           561:            Deep_Clear(adl);
        !           562:           end;
        !           563:      elsif k = n
        !           564:         then if Set_Structure.Empty
        !           565:               then Random_Product_Start_Systems.Build_Set_Structure(p);
        !           566:                    res := Set_Structure.B;
        !           567:                    Set_Structure.Clear;
        !           568:                else res := Set_Structure.B;
        !           569:               end if;
        !           570:          else Build_RPS(k,n,p);
        !           571:               declare
        !           572:                 acc : Standard_Natural_Vectors.Vector(1..k);
        !           573:                 q : Poly_Sys(1..n-k);
        !           574:               begin
        !           575:                 acc := (1..k => 0); res := 0;
        !           576:                 for i in q'range loop
        !           577:                   q(i) := Complex_Randomize1(p(i+k));
        !           578:                 end loop;
        !           579:                 Build_Indices2(1,k,n,q,tv,acc,res);
        !           580:                Clear(q);
        !           581:               end;
        !           582:              Random_Product_System.Clear;
        !           583:     end if;
        !           584:     bb := res;
        !           585:   end Bezout_BKK;
        !           586:
        !           587:   procedure Mixed_Solve
        !           588:                  ( file : in file_type; k,n : in natural; p : in Poly_Sys;
        !           589:                    bb : out natural;
        !           590:                    g : in out Poly_Sys; sols : in out Solution_List ) is
        !           591:   begin
        !           592:     if k = 0
        !           593:      then declare
        !           594:             l : Laur_Sys(g'range);
        !           595:             tmp : Solution_List;
        !           596:           begin
        !           597:             l := Polynomial_to_Laurent_System(g);
        !           598:             Solve(file,l,bb,sols);
        !           599:             tmp := sols;
        !           600:             while not Is_Null(tmp) loop
        !           601:               Head_Of(tmp).t := Create(0.0);
        !           602:               tmp := Tail_Of(tmp);
        !           603:             end loop;
        !           604:             Clear(l);
        !           605:           end;
        !           606:      elsif k = n
        !           607:         then Random_Product_Start_Systems.Construct(p,g,sols);
        !           608:              bb := Length_Of(sols);
        !           609:          else Build_RPS(k,n,p);
        !           610:               declare
        !           611:                 acc : Standard_Natural_Vectors.Vector(1..k);
        !           612:                 q : Poly_Sys(1..n-k);
        !           613:                rq : Poly_Sys(p'range);
        !           614:                sols_last : Solution_List;
        !           615:                res : natural;
        !           616:               begin
        !           617:                 acc := (1..k => 0); res := 0;
        !           618:                 for i in q'range loop
        !           619:                   q(i) := g(i+k);
        !           620:                 end loop;
        !           621:                 Build_Indices(file,q,1,k,n,acc,res,sols,sols_last);
        !           622:                bb := res;
        !           623:                rq := Random_Product_System.Polynomial_System;
        !           624:                g(1..k) := rq(1..k);
        !           625:               end;
        !           626:              Random_Product_System.Clear;
        !           627:     end if;
        !           628:   end Mixed_Solve;
        !           629:
        !           630:   procedure Mixed_Solve
        !           631:                  ( file : in file_type; k,n : in natural; p : in Poly_Sys;
        !           632:                    tv : in Tree_of_Vectors; bb : out natural;
        !           633:                    g : in out Poly_Sys; sols : in out Solution_List ) is
        !           634:   begin
        !           635:     if k = 0
        !           636:      then declare
        !           637:             l : Laur_Sys(g'range);
        !           638:             tmp : Solution_List;
        !           639:           begin
        !           640:            l := Polynomial_to_Laurent_System(g);
        !           641:            Solve(file,l,tv,bb,sols);
        !           642:            tmp := sols;
        !           643:            while not Is_Null(tmp) loop
        !           644:              Head_Of(tmp).t := Create(0.0);
        !           645:              tmp := Tail_Of(tmp);
        !           646:             end loop;
        !           647:            Clear(l);
        !           648:           end;
        !           649:      elsif k = n
        !           650:         then Random_Product_Start_Systems.Construct(p,g,sols);
        !           651:              bb := Length_Of(sols);
        !           652:          else Build_RPS(k,n,p);
        !           653:               declare
        !           654:                 acc : Standard_Natural_Vectors.Vector(1..k);
        !           655:                 q : Poly_Sys(1..n-k);
        !           656:                rq : Poly_Sys(p'range);
        !           657:                sols_last : Solution_List;
        !           658:                res : natural;
        !           659:               begin
        !           660:                 acc := (1..k => 0); res := 0;
        !           661:                 for i in q'range loop
        !           662:                   q(i) := g(i+k);
        !           663:                 end loop;
        !           664:                 Build_Indices(file,q,1,k,n,acc,tv,res,sols,sols_last);
        !           665:                bb := res;
        !           666:                rq := Random_Product_System.Polynomial_System;
        !           667:                g(1..k) := rq(1..k);
        !           668:               end;
        !           669:              Random_Product_System.Clear;
        !           670:     end if;
        !           671:   end Mixed_Solve;
        !           672:
        !           673: end Set_Structures_and_Volumes;

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