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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/initial_mixed_cell.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Integer_VecVecs;           use Standard_Integer_VecVecs;
        !             2: with Standard_Integer_Matrices;          use Standard_Integer_Matrices;
        !             3: with Standard_Integer_Linear_Solvers;    use Standard_Integer_Linear_Solvers;
        !             4: with Lists_of_Integer_Vectors;           use Lists_of_Integer_Vectors;
        !             5: with Transforming_Integer_Vector_Lists;  use Transforming_Integer_Vector_Lists;
        !             6: with Vertices;                           use Vertices;
        !             7: with Frequency_Graph;                    use Frequency_Graph;
        !             8:
        !             9: procedure Initial_Mixed_Cell
        !            10:                 ( n : in natural; mix : in Vector; pts : in Array_of_Lists;
        !            11:                   mic : out Mixed_Cell; rest : in out Array_of_Lists ) is
        !            12:
        !            13:   res : Mixed_Cell;
        !            14:   acc,tmp,rest_last : List;
        !            15:   pt : Link_to_Vector;
        !            16:   expts : Array_of_Lists(pts'range);
        !            17:   perm : Vector(pts'range);
        !            18:   mind,minl,dims,lent,index : integer;
        !            19:   nullvec : constant Vector := (1..n => 0);
        !            20:   shiftvecs : VecVec(pts'range);
        !            21:   grap : Matrix(1..n,pts'range);
        !            22:   fail : boolean := false;
        !            23:   rowcnt,cnt : natural := 0;
        !            24:   mat : Matrix(1..n,1..n+1);
        !            25:   ipvt : Vector(1..n+1);
        !            26:
        !            27: -- AUXILIAIRIES
        !            28:
        !            29:   procedure Add ( pt,shift : in Vector; l : in out List ) is
        !            30:
        !            31:     newpt : Link_to_Vector := new Vector'(pt);
        !            32:
        !            33:   begin
        !            34:     Add(newpt.all,shift);
        !            35:     Construct(newpt,l);
        !            36:   end Add;
        !            37:
        !            38:   procedure Add ( pt : in Vector; l : in out List ) is
        !            39:
        !            40:     newpt : Link_to_Vector := new Vector'(pt);
        !            41:
        !            42:   begin
        !            43:     Construct(newpt,l);
        !            44:   end Add;
        !            45:
        !            46:   procedure Fill ( l : in List; rowcnt : in out natural; m : in out Matrix ) is
        !            47:   -- DESCRIPTION :
        !            48:   --   Fills the matrix with the elements in l.
        !            49:
        !            50:   -- ON ENTRY :
        !            51:   --   l        list of point vectors;
        !            52:   --   rowcnt   m(m'first(1)..rowcnt) is already defined;
        !            53:   --   m        matrix with m'range(2) = range of points in l.
        !            54:
        !            55:   --   rowcnt   updated row counter;
        !            56:   --   m        matrix with the nonzero points of l
        !            57:
        !            58:     tmp : List := l;
        !            59:     pt : Link_to_Vector;
        !            60:
        !            61:   begin
        !            62:     while not Is_Null(tmp) loop
        !            63:       pt := Head_Of(tmp);
        !            64:       declare
        !            65:         nullvec : constant Vector(pt'range) := (pt'range => 0);
        !            66:       begin
        !            67:         if pt.all /= nullvec
        !            68:          then rowcnt := rowcnt + 1;
        !            69:               for k in pt'range loop
        !            70:                 m(rowcnt,k) := pt(k);
        !            71:               end loop;
        !            72:         end if;
        !            73:         tmp := Tail_Of(tmp);
        !            74:       end;
        !            75:     end loop;
        !            76:   end Fill;
        !            77:
        !            78:   procedure Initialize ( l : in List; rowcnt : out natural;
        !            79:                          m : in out Matrix; ipvt : in out Vector ) is
        !            80:
        !            81:   -- DESCRIPTION :
        !            82:   --   Given a list of linearly independent points, eventually with
        !            83:   --   0 in l, a matrix will be constructed which contains these points
        !            84:   --   in upper triangular form.
        !            85:
        !            86:     cnt : natural := 0;
        !            87:     piv : natural;
        !            88:
        !            89:   begin
        !            90:     Fill(l,cnt,m);
        !            91:     for i in 1..cnt loop
        !            92:       m(i,m'last(2)) := i;
        !            93:     end loop;
        !            94:     for k in 1..cnt loop
        !            95:       Triangulate(k,m,ipvt,piv);
        !            96:     end loop;
        !            97:     rowcnt := cnt;
        !            98:   end Initialize;
        !            99:
        !           100:   procedure Linearly_Independent
        !           101:                    ( m : in out Matrix; rowcnt : in natural; ipvt : in Vector;
        !           102:                      l : in List; len : out natural;
        !           103:                      indep,indep_last : out List ) is
        !           104:
        !           105:   -- DESCRIPTION :
        !           106:   --   Computes the list of points which are linearly independent w.r.t.
        !           107:   --   the matrix m.
        !           108:
        !           109:   -- ON ENTRY :
        !           110:   --   m             m(1..rowcnt,m'range(2)) is upper triangular,
        !           111:   --                 can be used as work space;
        !           112:   --   rowcnt        counter for the number of rows in m:
        !           113:   --   ipvt          vector with the pivoting information;
        !           114:   --   l             list of points to consider.
        !           115:
        !           116:   -- ON RETURN :
        !           117:   --   len           length of the list indep;
        !           118:   --   indep         the list of linearly independent points;
        !           119:   --   indep_last    pointer to the last element of indep.
        !           120:
        !           121:     tmp,res,res_last : List;
        !           122:     pt : Link_to_Vector;
        !           123:     wipvt : Vector(ipvt'range) := ipvt;
        !           124:     piv,cnt : natural;
        !           125:
        !           126:   begin
        !           127:     if rowcnt < m'last(2)
        !           128:      then tmp := l; cnt := 0;
        !           129:           while not Is_Null(tmp) loop
        !           130:             pt := Head_Of(tmp);
        !           131:             for i in pt'range loop
        !           132:               m(rowcnt+1,i) := pt(i);
        !           133:             end loop;
        !           134:             m(rowcnt+1,m'last(2)) := rowcnt+1;
        !           135:             Triangulate(rowcnt+1,m,wipvt,piv);
        !           136:             if m(rowcnt+1,rowcnt+1) /= 0
        !           137:              then cnt := cnt + 1;
        !           138:                   Append(res,res_last,pt.all);
        !           139:             end if;
        !           140:             wipvt := ipvt;
        !           141:             tmp := Tail_Of(tmp);
        !           142:           end loop;
        !           143:     end if;
        !           144:     len := cnt;
        !           145:     indep := res; indep_last := res_last;
        !           146:   end Linearly_Independent;
        !           147:
        !           148:   procedure Construct_Basis ( l : in List; rowcnt : in out natural;
        !           149:                               m : in out Matrix; ipvt : in out Vector ) is
        !           150:
        !           151:   -- DESCRIPTION :
        !           152:   --   Constructs a triangular basis for the vectors in l.
        !           153:
        !           154:   -- REQUIRED :  dimensions of the vectors must match.
        !           155:
        !           156:   -- ON ENTRY :
        !           157:   --   l         list of vector;
        !           158:   --   m         triangular basis, stored in the rows of the matrix;
        !           159:   --   rowcnt    index to the last significant row in m, could be 0,
        !           160:   --             when there is no initial basis to take into account;
        !           161:   --   ipvt      initial pivoting vector, must be equal to the identity
        !           162:   --             permutation vector, when rowcnt = 0.
        !           163:
        !           164:   -- ON RETURN :
        !           165:   --   m         triangular basis, stored in the rows of the matrix;
        !           166:   --   rowcnt    index to the last significant row in m;
        !           167:   --   ipvt      contains pivoting information.
        !           168:
        !           169:     tmp : List := l;
        !           170:     wipvt : Vector(ipvt'range);
        !           171:     pt : Link_to_Vector;
        !           172:     piv : natural;
        !           173:
        !           174:   begin
        !           175:     while not Is_Null(tmp) loop
        !           176:       pt := Head_Of(tmp);
        !           177:       for i in pt'range loop
        !           178:         m(rowcnt+1,i) := pt(i);
        !           179:       end loop;
        !           180:       wipvt := ipvt;
        !           181:       m(rowcnt+1,m'last(2)) := rowcnt+1;
        !           182:       Triangulate(rowcnt+1,m,wipvt,piv);
        !           183:       if m(rowcnt+1,rowcnt+1) /= 0
        !           184:        then rowcnt := rowcnt + 1;
        !           185:             ipvt := wipvt;
        !           186:       end if;
        !           187:       exit when (rowcnt >= m'last(2));
        !           188:       tmp := Tail_Of(tmp);
        !           189:     end loop;
        !           190:   end Construct_Basis;
        !           191:
        !           192:   function Linearly_Independent ( l : List; x : Vector ) return boolean is
        !           193:
        !           194:   -- DESCRIPTION :
        !           195:   --   Returns true if the given vector x is linearly independent w.r.t.
        !           196:   --   the vectors in l.
        !           197:
        !           198:     basis : Matrix(1..Length_Of(l)+1,x'first..x'last+1);
        !           199:     ipvt : Vector(basis'range(2));
        !           200:     rowcnt : natural := 0;
        !           201:     piv : natural;
        !           202:
        !           203:   begin
        !           204:     for i in ipvt'range loop
        !           205:       ipvt(i) := i;
        !           206:       for j in basis'range(1) loop
        !           207:         basis(j,i) := 0;
        !           208:       end loop;
        !           209:     end loop;
        !           210:     Construct_Basis(l,rowcnt,basis,ipvt);
        !           211:     for i in x'range loop
        !           212:       basis(rowcnt+1,i) := x(i);
        !           213:     end loop;
        !           214:     basis(rowcnt+1,basis'last(2)) := rowcnt+1;
        !           215:     Triangulate(rowcnt+1,basis,ipvt,piv);
        !           216:     return (basis(rowcnt+1,rowcnt+1) /= 0);
        !           217:   end Linearly_Independent;
        !           218:
        !           219:   procedure Linearly_Independent
        !           220:                 ( l,xl : in List; indep,indep_last : in out List ) is
        !           221:
        !           222:   -- DESCRIPTION :
        !           223:   --   Returns those points in xl that are linearly independent from the
        !           224:   --   points in l.
        !           225:
        !           226:   begin
        !           227:     if not Is_Null(xl)
        !           228:      then
        !           229:        declare
        !           230:          x : Link_to_Vector := Head_Of(xl);
        !           231:          basis : Matrix(1..Length_Of(l)+1,x'first..x'last+1);
        !           232:          ipvt : Vector(basis'range(2));
        !           233:          rowcnt,len : natural := 0;
        !           234:        begin
        !           235:          for i in ipvt'range loop
        !           236:            ipvt(i) := i;
        !           237:            for j in basis'range(1) loop
        !           238:              basis(j,i) := 0;
        !           239:            end loop;
        !           240:          end loop;
        !           241:          Construct_Basis(l,rowcnt,basis,ipvt);
        !           242:          Linearly_Independent(basis,rowcnt,ipvt,xl,len,indep,indep_last);
        !           243:        end;
        !           244:     end if;
        !           245:   end Linearly_Independent;
        !           246:
        !           247:   function Construct_Rest ( l : Array_of_Lists; start : natural )
        !           248:                           return List is
        !           249:
        !           250:   -- DESCRIPTION :
        !           251:   --   Collects all remaining points of l(i) into one single list,
        !           252:   --   for i in start..l'last.
        !           253:
        !           254:     tmp,res,res_last : List;
        !           255:     pt : Link_to_Vector;
        !           256:
        !           257:   begin
        !           258:     for i in start..l'last loop
        !           259:       tmp := l(i);
        !           260:       while not Is_Null(tmp) loop
        !           261:         pt := Head_Of(tmp);
        !           262:         if not Is_In(res,pt)
        !           263:          then Append(res,res_last,pt.all);
        !           264:         end if;
        !           265:         tmp := Tail_Of(tmp);
        !           266:       end loop;
        !           267:     end loop;
        !           268:     return res;
        !           269:   end Construct_Rest;
        !           270:
        !           271:   procedure Sort_Co_Linearly_Independent
        !           272:                ( l : in out List; al : in Array_of_Lists;
        !           273:                  start : in natural ) is
        !           274:
        !           275:   -- DESCRIPTION :
        !           276:   --   Sorts the points in l, by putting those points that are linearly
        !           277:   --   independent w.r.t. the rest of the poins in al, in front of the list.
        !           278:
        !           279:     rest : List := Construct_Rest(al,start);
        !           280:     tmp,indep,indep_last : List;
        !           281:     pt : Link_to_Vector;
        !           282:
        !           283:   begin
        !           284:    -- put_line("The set of points in al just after Construct_Rest :"); put(al);
        !           285:    -- put_line("The rest of the points : "); put(rest);
        !           286:     Linearly_Independent(rest,l,indep,indep_last);
        !           287:     if Is_Null(indep)
        !           288:      then null;                              -- nothing to put in front of l
        !           289:      else tmp := l;                 -- append the other points of l to indep
        !           290:          -- put_line("Linearly co-independent points : "); put(indep);
        !           291:          -- put_line(" w.r.t. the rest : "); put(rest);
        !           292:           while not Is_Null(tmp) loop
        !           293:             pt := Head_Of(tmp);
        !           294:             if not Is_In(indep,pt)
        !           295:              then Append(indep,indep_last,pt.all);
        !           296:             end if;
        !           297:             tmp := Tail_Of(tmp);
        !           298:           end loop;
        !           299:           Copy(indep,l); Deep_Clear(indep);
        !           300:     end if;
        !           301:     Deep_Clear(rest);
        !           302:    -- put_line("The list of points in al after Sort_Co : "); put(al);
        !           303:   end Sort_Co_Linearly_Independent;
        !           304:
        !           305:   procedure Incremental_Dimension
        !           306:                ( m : in out Matrix; rowcnt : in natural; ipvt : in Vector;
        !           307:                  l : in List; dim : out natural ) is
        !           308:
        !           309:   -- DESCRIPTION :
        !           310:   --   Computes the number of points which are linearly independent w.r.t.
        !           311:   --   the matrix m.
        !           312:
        !           313:   -- ON ENTRY :
        !           314:   --   m         m(1..rowcnt,m'range(2)) is upper triangular,
        !           315:   --             can be used as work space;
        !           316:   --   rowcnt    counter for the number of rows in m:
        !           317:   --   ipvt      vector with the pivoting information;
        !           318:   --   l         list of points to consider.
        !           319:
        !           320:   -- ON RETURN :
        !           321:   --   dim       the number of linearly independent points.
        !           322:
        !           323:    tmp : List;
        !           324:    pt : Link_to_Vector;
        !           325:    cnt,piv : natural;
        !           326:    newipvt,wipvt : Vector(ipvt'range);
        !           327:
        !           328:   begin
        !           329:     wipvt := ipvt; newipvt := ipvt;
        !           330:     tmp := l; cnt := 0;
        !           331:     while not Is_Null(tmp) loop
        !           332:       pt := Head_Of(tmp);
        !           333:       cnt := cnt + 1;
        !           334:       for i in pt'range loop
        !           335:         m(rowcnt+cnt,i) := pt(i);
        !           336:       end loop;
        !           337:       m(rowcnt+cnt,m'last(2)) := rowcnt+cnt;
        !           338:       Triangulate(rowcnt+cnt,m,newipvt,piv);
        !           339:       if m(rowcnt+cnt,rowcnt+cnt) /= 0
        !           340:        then wipvt := newipvt;
        !           341:        else newipvt := wipvt;
        !           342:             cnt := cnt - 1;
        !           343:       end if;
        !           344:       tmp := Tail_Of(tmp);
        !           345:       exit when ((rowcnt + cnt) >= m'last(1));
        !           346:     end loop;
        !           347:     dim := cnt;
        !           348:   end Incremental_Dimension;
        !           349:
        !           350:   procedure Incremental_Dimension
        !           351:                ( m : in out Matrix; rowcnt : in natural; ipvt : in Vector;
        !           352:                  l : in out List; dim,len : out natural ) is
        !           353:
        !           354:   -- DESCRIPTION :
        !           355:   --   Computes the increase in dimension by considering the points
        !           356:   --   in the list l, w.r.t. the matrix m.
        !           357:
        !           358:   -- ON ENTRY :
        !           359:   --   m         m(1..rowcnt,m'range(2)) is upper triangular,
        !           360:   --   rowcnt    counter for the number of rows in m:
        !           361:   --   ipvt      vector with the pivoting information;
        !           362:   --   l         list of points to consider.
        !           363:
        !           364:   -- ON RETURN :
        !           365:   --   l         list of linearly independent points w.r.t. m;
        !           366:   --   dim       increase in dimension;
        !           367:   --   len       length of the list of linearly independent points
        !           368:   --             w.r.t. the rows in the matrix m.
        !           369:
        !           370:   -- ALGORITHM :
        !           371:   --   works in two stages:
        !           372:   --   1. determination of all linearly independent points;
        !           373:   --   2. determination of the dimension.
        !           374:
        !           375:     workm : Matrix(m'range(1),m'range(2));
        !           376:     indep,indep_last : List;
        !           377:
        !           378:   begin
        !           379:    -- Initialize workm :
        !           380:    -- put_line("The list to investigate : "); put(l);
        !           381:     for i in 1..rowcnt loop
        !           382:       for j in m'range(2) loop
        !           383:         workm(i,j) := m(i,j);
        !           384:       end loop;
        !           385:     end loop;
        !           386:    -- Determine linearly independent points :
        !           387:     Linearly_Independent(workm,rowcnt,ipvt,l,len,indep,indep_last);
        !           388:    -- Determine the incremental dimension :
        !           389:     Incremental_Dimension(workm,rowcnt,ipvt,indep,dim);
        !           390:     Copy(indep,l); Deep_Clear(indep);
        !           391:   end Incremental_Dimension;
        !           392:
        !           393:   procedure Next_Point ( acc,l : in List; pt : out Link_to_Vector;
        !           394:                          fail : out boolean; rowcnt : in out natural;
        !           395:                          m : in out Matrix; ipvt : in out Vector ) is
        !           396:
        !           397:   -- DESCRIPTION :
        !           398:   --   A new point out of l, not in the list acc will be chosen.
        !           399:   --   The point pt has to be linearly independent from the other,
        !           400:   --   already chosen points.  Therefore, the upper triangular matrix m
        !           401:   --   will be used and properly updated.
        !           402:
        !           403:     res : Link_to_Vector;
        !           404:     tmp : List := l;
        !           405:     newipvt : Vector(ipvt'range) := ipvt;
        !           406:     done : boolean := false;
        !           407:     piv : natural;
        !           408:
        !           409:   begin
        !           410:     while not Is_Null(tmp) loop
        !           411:       res := Head_Of(tmp);
        !           412:       if not Is_In(acc,res)
        !           413:        then --put("Checking point "); put(res); new_line;
        !           414:             rowcnt := rowcnt + 1;
        !           415:             for i in res'range loop
        !           416:               m(rowcnt,i) := res(i);
        !           417:             end loop;
        !           418:             m(rowcnt,m'last(2)) := rowcnt;
        !           419:             Triangulate(rowcnt,m,newipvt,piv);
        !           420:             if m(rowcnt,rowcnt) = 0
        !           421:              then rowcnt := rowcnt - 1;
        !           422:                   newipvt := ipvt;
        !           423:              else ipvt := newipvt;
        !           424:                   pt := res;
        !           425:                   done := true;
        !           426:             end if;
        !           427:       end if;
        !           428:       exit when done;
        !           429:       tmp := Tail_Of(tmp);
        !           430:     end loop;
        !           431:     fail := not done;
        !           432:   end Next_Point;
        !           433:
        !           434: begin
        !           435:  -- INITIALIZE : compute for each list the basis points
        !           436:   res.nor := new Vector'(1..n+1 => 0); res.nor(n+1) := 1;
        !           437:   res.pts := new Array_of_Lists(mix'range);
        !           438:   for i in pts'range loop
        !           439:     expts(i) := Max_Extremal_Points(n,pts(i));  perm(i) := i;
        !           440:    -- put("Extremal points for component "); put(i,1); put_line(" :");
        !           441:    -- put(expts(i));
        !           442:   end loop;
        !           443:  -- INITIALIZE : order the lists according to occurencies
        !           444:   grap := Graph(n,expts);
        !           445:  -- put_line("The graph matrix of the extremal points : "); put(grap);
        !           446:   for i in expts'range loop
        !           447:     Sort(expts(i),grap);
        !           448:    -- put("Ordered extremal points for component "); put(i,1); put_line(" :");
        !           449:    -- put(expts(i));
        !           450:   end loop;
        !           451:  -- INITIALIZE : choose one anchor point for each component,
        !           452:  --              shift when necessary :
        !           453:   for i in expts'range loop
        !           454:     if Is_In(pts(i),nullvec)
        !           455:      then Add(nullvec,res.pts(i));
        !           456:           shiftvecs(i) := null;
        !           457:      else -- ADD LAST POINT = LEAST IMPORTANT
        !           458:           tmp := expts(i);
        !           459:           if not Is_Null(tmp)
        !           460:            then
        !           461:              while not Is_Null(Tail_Of(tmp)) loop
        !           462:                tmp := Tail_Of(tmp);
        !           463:              end loop;
        !           464:              pt := Head_Of(tmp);
        !           465:              Add(pt.all,res.pts(i));
        !           466:              shiftvecs(i) := new Vector'(pt.all);
        !           467:             -- put("The shift vector : "); put(shiftvecs(i)); new_line;
        !           468:              Shift(expts(i),shiftvecs(i));
        !           469:             -- put_line("The shifted list of points : "); put(expts(i));
        !           470:           end if;
        !           471:     end if;
        !           472:   end loop;
        !           473:  -- INITIALIZE : intermediate data structures mat and ipvt :
        !           474:   for i in ipvt'range loop
        !           475:     ipvt(i) := i;
        !           476:   end loop;
        !           477:   for i in mat'range(1) loop
        !           478:     for j in mat'range(2) loop
        !           479:       mat(i,j) := 0;
        !           480:     end loop;
        !           481:   end loop;
        !           482:   rowcnt := 0;
        !           483:  -- COMPUTE CELL : based on lists with extremal points
        !           484:   for i in expts'range loop   -- MAIN LOOP
        !           485:    -- LOOK FOR SMALLEST SET :
        !           486:     index := i;
        !           487:     if i = 1
        !           488:      then mind := Length_Of(expts(i))-1;
        !           489:           for j in i+1..expts'last loop
        !           490:             dims := Length_Of(expts(j))-1;
        !           491:             if dims < mind
        !           492:              then index := j; mind := dims;
        !           493:             end if;
        !           494:           end loop;
        !           495:      else --put("Calling Incremental_Dimension for i = "); put(i,1); new_line;
        !           496:           Incremental_Dimension(mat,rowcnt,ipvt,expts(i),mind,minl);
        !           497:           --put(" dimension : "); put(mind,1);
        !           498:           --put(" length : " ); put(minl,1); new_line;
        !           499:           for j in i+1..expts'last loop
        !           500:             --put("Calling Incremental_Dimension for j = "); put(j,1); new_line;
        !           501:             Incremental_Dimension(mat,rowcnt,ipvt,expts(j),dims,lent);
        !           502:             --put(" dimension : "); put(dims,1);
        !           503:             --put(" length : " ); put(lent,1); new_line;
        !           504:             if (dims < mind) or else ((dims = mind) and then (lent < minl))
        !           505:              then index := j; mind := dims; minl := lent;
        !           506:             end if;
        !           507:           end loop;
        !           508:     end if;
        !           509:    -- put("The index : "); put(index,1); new_line;
        !           510:    -- put(" with minimal dimension : "); put(mind,1); new_line;
        !           511:    -- put("perm before permute : "); put(perm); new_line;
        !           512:     if index /= i
        !           513:      then tmp := expts(index); expts(index) := expts(i); expts(i) := tmp;
        !           514:           mind := perm(i);  perm(i) := perm(index);  perm(index) := mind;
        !           515:     end if;
        !           516:    -- SORT ACCORDING TO OCCURRENCIES AND TO CO-LINEARLY :
        !           517:     Sort(expts(i),grap,i-1,perm);
        !           518:    -- put_line("After first ordering : "); put(expts(i));
        !           519:     Sort_Co_Linearly_Independent(expts(i),expts,i+1);
        !           520:    -- put_line("The ordered list : "); put(expts(i));
        !           521:    -- put("perm after permute : "); put(perm); new_line;
        !           522:    -- CHOOSE THE POINTS :
        !           523:     if i = 1
        !           524:      then Add(nullvec,acc);
        !           525:           tmp := expts(i);
        !           526:           for j in 1..mix(perm(i)) loop
        !           527:             pt := Head_Of(tmp);
        !           528:             if pt.all = nullvec  -- skip the null vector
        !           529:              then tmp := Tail_Of(tmp);
        !           530:                   if not Is_Null(tmp)
        !           531:                    then pt := Head_Of(tmp);
        !           532:                   end if;
        !           533:             end if;
        !           534:             exit when Is_Null(tmp);
        !           535:             Add(pt.all,acc);
        !           536:            -- put_line("frequency graph before ignore :"); put(grap);
        !           537:             Ignore(grap,pt.all);
        !           538:            -- put_line("frequency graph after ignore  :"); put(grap);
        !           539:             if shiftvecs(perm(i)) /= null
        !           540:              then Add(pt.all,shiftvecs(perm(i)).all,res.pts(perm(i)));
        !           541:              else Add(pt.all,res.pts(perm(i)));
        !           542:             end if;
        !           543:             tmp := Tail_Of(tmp);
        !           544:             exit when Is_Null(tmp);
        !           545:           end loop;
        !           546:           cnt := Length_Of(acc);
        !           547:           Initialize(acc,rowcnt,mat,ipvt);
        !           548:          -- put_line("The list acc : "); put(acc);
        !           549:          -- put_line("The matrix mat : "); put(mat,1,rowcnt);
        !           550:          -- put_line("The vector ipvt : "); put(ipvt); new_line;
        !           551:           fail := (cnt <= mix(perm(i)));
        !           552:      else for j in 1..mix(perm(i)) loop
        !           553:             Next_Point(acc,expts(i),pt,fail,rowcnt,mat,ipvt);
        !           554:             if not fail
        !           555:              then if shiftvecs(perm(i)) /= null
        !           556:                    then Add(pt.all,shiftvecs(perm(i)).all,res.pts(perm(i)));
        !           557:                    else Add(pt.all,res.pts(perm(i)));
        !           558:                   end if;
        !           559:                   Add(pt.all,acc); cnt := cnt + 1;
        !           560:                  -- put_line("frequency graph before ignore :"); put(grap);
        !           561:                   Ignore(grap,pt.all);
        !           562:                  -- put_line("frequency graph after ignore  :"); put(grap);
        !           563:             end if;
        !           564:             exit when fail;
        !           565:           end loop;
        !           566:          -- put_line("The list acc : "); put(acc);
        !           567:          -- put_line("The matrix mat : "); put(mat,1,rowcnt);
        !           568:          -- put_line("The vector ipvt : "); put(ipvt); new_line;
        !           569:           fail := (Length_Of(res.pts(perm(i))) <= mix(perm(i)));
        !           570:     end if;
        !           571:     exit when fail;
        !           572:   end loop;  -- END OF MAIN LOOP
        !           573:   Deep_Clear(acc);
        !           574:  -- COMPUTE THE REST OF THE POINT LISTS :
        !           575:   if not fail
        !           576:    then for i in pts'range loop
        !           577:           tmp := pts(i);
        !           578:           rest_last := rest(i);
        !           579:           while not Is_Null(tmp) loop
        !           580:             pt := Head_Of(tmp);
        !           581:             if not Is_In(res.pts(i),pt)
        !           582:              then Append(rest(i),rest_last,pt);
        !           583:             end if;
        !           584:             tmp := Tail_Of(tmp);
        !           585:           end loop;
        !           586:         end loop;
        !           587:   end if;
        !           588:  -- GIVE THE POINTS IN THE INITIAL SIMPLEX LIFTING VALUE 0 :
        !           589:   for i in res.pts'range loop
        !           590:     tmp := res.pts(i);
        !           591:     while not Is_Null(tmp) loop
        !           592:       pt := Head_Of(tmp);
        !           593:       declare
        !           594:         lpt : Link_to_Vector;
        !           595:       begin
        !           596:         lpt := new Vector(1..n+1);
        !           597:         lpt(pt'range) := pt.all; lpt(n+1) := 0;
        !           598:         Set_Head(tmp,lpt);
        !           599:       end;
        !           600:       tmp := Tail_Of(tmp);
        !           601:     end loop;
        !           602:   end loop;
        !           603:   mic := res;
        !           604: end Initial_Mixed_Cell;

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