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>