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

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

1.1     ! maekawa     1: with Lists_of_Integer_Vectors;           use Lists_of_Integer_Vectors;
        !             2: with Simplices;                          use Simplices;
        !             3: with Dynamic_Triangulations;             use Dynamic_Triangulations;
        !             4: with Cayley_Embedding;                   use Cayley_Embedding;
        !             5: with Flatten_Mixed_Subdivisions;         use Flatten_Mixed_Subdivisions;
        !             6:
        !             7: package body Cayley_Trick is
        !             8:
        !             9: -- UTILITIES :
        !            10:
        !            11:   function Extract ( n : natural; mix : Vector; lifted : in List )
        !            12:                    return Array_of_Lists is
        !            13:
        !            14:   -- DESCRIPTION :
        !            15:   --   Extracts from the list of lifted points to compute the Cayley
        !            16:   --   triangulation, the tuple of lifted points.
        !            17:
        !            18:     res : Array_of_Lists(mix'range);
        !            19:
        !            20:   begin
        !            21:     for k in res'range loop
        !            22:       res(k) := Extract(k-1,n,lifted);
        !            23:       Deflate(n,res(k));
        !            24:     end loop;
        !            25:     return res;
        !            26:   end Extract;
        !            27:
        !            28:   procedure Extract ( n : in natural; mix : in Vector;
        !            29:                       t : in Triangulation; liftedt : in List;
        !            30:                       mixsub : out Mixed_Subdivision;
        !            31:                       lifted : out Array_of_Lists ) is
        !            32:
        !            33:   -- DESCRIPTION :
        !            34:   --   Extracts the useful information from the Cayley polytope.
        !            35:
        !            36:     res : Mixed_Subdivision;
        !            37:
        !            38:   begin
        !            39:     lifted := Extract(n,mix,liftedt);
        !            40:     res := Extract_Mixed_Cells(n,mix,t);
        !            41:     Deflate(n,res);
        !            42:     mixsub := res;
        !            43:   end Extract;
        !            44:
        !            45:   procedure Extract_and_Clear
        !            46:                 ( n : in natural; mix : in Vector;
        !            47:                   t : in out Triangulation; liftedt : in out List;
        !            48:                   lent : out natural; mixsub : out Mixed_Subdivision;
        !            49:                   lifted : out Array_of_Lists ) is
        !            50:
        !            51:   -- DESCRIPTION :
        !            52:   --   Extracts the useful information from the Cayley polytope.
        !            53:   --   All intermediate data structures will be cleared.
        !            54:
        !            55:   begin
        !            56:     lent := Length_Of(t);
        !            57:     Extract(n,mix,t,liftedt,mixsub,lifted);
        !            58:     Clear(t); Clear(liftedt);
        !            59:   end Extract_and_Clear;
        !            60:
        !            61: -- BASIC VERSION :
        !            62:
        !            63:   procedure Dynamic_Cayley
        !            64:                 ( n : in natural; mix : in Vector;
        !            65:                   supports : in Array_of_Lists; order,inter : in boolean;
        !            66:                   maxli : in natural; lifted : out Array_of_Lists;
        !            67:                   mixsub : out Mixed_Subdivision; numtri : out natural ) is
        !            68:
        !            69:     tmpsub,lastcells : Mixed_Subdivision;
        !            70:     l,liftedl,liftedl_last : list;
        !            71:     t : Triangulation;
        !            72:
        !            73:     procedure Col_Flat ( nt : in Triangulation; l : List ) is
        !            74:
        !            75:     -- DESCRIPTION :
        !            76:     --   Updates the subdivision mixsub with the flattened cells.
        !            77:     --   The triangulation on entry contains the whole triangulation,
        !            78:     --   not just the new cells.
        !            79:
        !            80:       cells : Mixed_Subdivision;
        !            81:
        !            82:     begin
        !            83:       if Is_Null(tmpsub)
        !            84:        then cells := Extract_Mixed_Cells(n,mix,nt);
        !            85:             Deflate(n,cells);
        !            86:        else cells := Extract_non_Flat_Mixed_Cells(n,mix,nt);
        !            87:             Deflate(n,cells);
        !            88:             Construct(Head_Of(tmpsub),cells);
        !            89:       end if;
        !            90:       Flatten(cells);
        !            91:       tmpsub := cells;
        !            92:     end Col_Flat;
        !            93:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat(Col_Flat);
        !            94:
        !            95:   begin
        !            96:     l := Embedding_before_Lifting(supports);
        !            97:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !            98:     if Is_Null(tmpsub)
        !            99:      then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted);
        !           100:      else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t);
        !           101:           Deflate(n,lastcells);
        !           102:           Construct(Head_Of(tmpsub),lastcells);
        !           103:           mixsub := lastcells;
        !           104:           lifted := Extract(n,mix,liftedl);
        !           105:           numtri := Length_Of(t);
        !           106:     end if;
        !           107:   end Dynamic_Cayley;
        !           108:
        !           109:   procedure Dynamic_Cayley
        !           110:                 ( n : in natural; mix : in Vector;
        !           111:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           112:                   maxli : in natural; lifted : out Array_of_Lists;
        !           113:                   t : in out Triangulation ) is
        !           114:
        !           115:     l,liftedl,liftedl_last : list;
        !           116:
        !           117:   begin
        !           118:     l := Embedding_before_Lifting(supports);
        !           119:     Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           120:     lifted := Extract(n,mix,liftedl); Clear(liftedl);
        !           121:   end Dynamic_Cayley;
        !           122:
        !           123: -- EXTENDED VERSIONS :
        !           124:
        !           125:   procedure Dynamic_Cayley_with_Flat
        !           126:                 ( n : in natural; mix : in Vector;
        !           127:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           128:                   maxli : in natural; lifted : out Array_of_Lists;
        !           129:                   mixsub : out Mixed_Subdivision; numtri : out natural ) is
        !           130:
        !           131:     l,liftedl,liftedl_last : list;
        !           132:     t : Triangulation;
        !           133:     tmpsub,lastcells : Mixed_Subdivision;
        !           134:
        !           135:     procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is
        !           136:
        !           137:       cells,cells1 : Mixed_Subdivision;
        !           138:       lftpts : Array_of_Lists(mix'range);
        !           139:
        !           140:     begin
        !           141:       Extract(n,mix,tt,lft,cells,lftpts);
        !           142:       Before_Flattening(cells,lftpts);
        !           143:       if Is_Null(tmpsub)
        !           144:        then cells := Extract_Mixed_Cells(n,mix,tt);
        !           145:             Deflate(n,cells);
        !           146:        else cells := Extract_non_Flat_Mixed_Cells(n,mix,tt);
        !           147:             Deflate(n,cells);
        !           148:             Construct(Head_Of(tmpsub),cells);
        !           149:       end if;
        !           150:       Flatten(cells);
        !           151:       tmpsub := cells;
        !           152:     end Bef_Flat;
        !           153:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat (Bef_Flat);
        !           154:
        !           155:   begin
        !           156:     l := Embedding_before_Lifting(supports);
        !           157:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           158:     if Is_Null(tmpsub)
        !           159:      then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted);
        !           160:      else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t);
        !           161:           Deflate(n,lastcells);
        !           162:           Construct(Head_Of(tmpsub),lastcells);
        !           163:           mixsub := lastcells;
        !           164:           lifted := Extract(n,mix,liftedl);
        !           165:           numtri := Length_Of(t);
        !           166:     end if;
        !           167:   end Dynamic_Cayley_with_Flat;
        !           168:
        !           169:   procedure Dynamic_Cayley_with_Flatt
        !           170:                 ( n : in natural; mix : in Vector;
        !           171:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           172:                   maxli : in natural; lifted : out Array_of_Lists;
        !           173:                   t : in out Triangulation ) is
        !           174:
        !           175:     l,liftedl,liftedl_last : list;
        !           176:
        !           177:     procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is
        !           178:
        !           179:       cells : Mixed_Subdivision;
        !           180:       lftpts : Array_of_Lists(supports'range);
        !           181:
        !           182:     begin
        !           183:       Extract(n,mix,tt,lft,cells,lftpts);
        !           184:       Before_Flattening(cells,lftpts);
        !           185:     end Bef_Flat;
        !           186:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat (Bef_Flat);
        !           187:
        !           188:   begin
        !           189:     l := Embedding_before_Lifting(supports);
        !           190:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           191:     lifted := Extract(n,mix,liftedl); Clear(liftedl);
        !           192:   end Dynamic_Cayley_with_Flatt;
        !           193:
        !           194:   procedure Dynamic_Cayley_with_New
        !           195:                 ( n : in natural; mix : in Vector;
        !           196:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           197:                   maxli : in natural; lifted : out Array_of_Lists;
        !           198:                   mixsub : out Mixed_Subdivision; numtri : out natural ) is
        !           199:
        !           200:     l,liftedl,liftedl_last : list;
        !           201:     t : Triangulation;
        !           202:     tmpsub,lastcells : Mixed_Subdivision;
        !           203:
        !           204:     procedure Col_Flat ( nt : in Triangulation; l : List ) is
        !           205:
        !           206:     -- DESCRIPTION :
        !           207:     --   Updates the subdivision mixsub with the flattened cells.
        !           208:     --   The triangulation on entry contains the whole triangulation,
        !           209:     --   not just the new cells.
        !           210:
        !           211:       cells : Mixed_Subdivision;
        !           212:
        !           213:     begin
        !           214:       if Is_Null(tmpsub)
        !           215:        then cells := Extract_Mixed_Cells(n,mix,nt);
        !           216:             Deflate(n,cells);
        !           217:        else cells := Extract_non_Flat_Mixed_Cells(n,mix,nt);
        !           218:             Deflate(n,cells);
        !           219:             Construct(Head_Of(tmpsub),cells);
        !           220:       end if;
        !           221:       Flatten(cells);
        !           222:       tmpsub := cells;
        !           223:     end Col_Flat;
        !           224:
        !           225:     procedure New_Cell ( tt : in Triangulation; pt : in vector ) is
        !           226:
        !           227:       cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt);
        !           228:       index : natural := 1;
        !           229:
        !           230:     begin
        !           231:       Deflate(n,cells);
        !           232:       for i in 1..mix'last-1 loop
        !           233:         if pt(i+n) /= 0
        !           234:          then index := i+1;
        !           235:         end if;
        !           236:         exit when index > 1;
        !           237:       end loop;
        !           238:       Process_New_Cells(cells,index,pt);
        !           239:     end New_Cell;
        !           240:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat_and_New
        !           241:       (Before_Flattening => Col_Flat, Process_New_Simplices => New_Cell);
        !           242:
        !           243:   begin
        !           244:     l := Embedding_before_Lifting(supports);
        !           245:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           246:     if Is_Null(tmpsub)
        !           247:      then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted);
        !           248:      else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t);
        !           249:           Deflate(n,lastcells);
        !           250:           Construct(Head_Of(tmpsub),lastcells);
        !           251:           mixsub := lastcells;
        !           252:           lifted := Extract(n,mix,liftedl);
        !           253:           numtri := Length_Of(t);
        !           254:     end if;
        !           255:   end Dynamic_Cayley_with_New;
        !           256:
        !           257:   procedure Dynamic_Cayley_with_Newt
        !           258:                 ( n : in natural; mix : in Vector;
        !           259:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           260:                   maxli : in natural; lifted : out Array_of_Lists;
        !           261:                   t : in out Triangulation ) is
        !           262:
        !           263:     l,liftedl,liftedl_last : list;
        !           264:
        !           265:     procedure New_Cell ( tt : in Triangulation; pt : in vector ) is
        !           266:
        !           267:       cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt);
        !           268:       index : natural := 1;
        !           269:
        !           270:     begin
        !           271:       Deflate(n,cells);
        !           272:       for i in 1..mix'last-1 loop
        !           273:         if pt(i+n) /= 0
        !           274:          then index := i+1;
        !           275:         end if;
        !           276:         exit when index > 1;
        !           277:       end loop;
        !           278:       Process_New_Cells(cells,index,pt);
        !           279:     end New_Cell;
        !           280:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_New(New_Cell);
        !           281:
        !           282:   begin
        !           283:     l := Embedding_before_Lifting(supports);
        !           284:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           285:     lifted := Extract(n,mix,liftedl); Clear(liftedl);
        !           286:   end Dynamic_Cayley_with_Newt;
        !           287:
        !           288:   procedure Dynamic_Cayley_with_Flat_and_New
        !           289:                 ( n : in natural; mix : in Vector;
        !           290:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           291:                   maxli : in natural; lifted : out Array_of_Lists;
        !           292:                   mixsub : out Mixed_Subdivision; numtri : out natural ) is
        !           293:
        !           294:     l,liftedl,liftedl_last : list;
        !           295:     t : Triangulation;
        !           296:     tmpsub,lastcells : Mixed_Subdivision;
        !           297:
        !           298:     procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is
        !           299:
        !           300:       cells,cells1 : Mixed_Subdivision;
        !           301:       lftpts : Array_of_Lists(mix'range);
        !           302:
        !           303:     begin
        !           304:       Extract(n,mix,tt,lft,cells,lftpts);
        !           305:       Before_Flattening(cells,lftpts);
        !           306:       if Is_Null(tmpsub)
        !           307:        then cells := Extract_Mixed_Cells(n,mix,tt);
        !           308:             Deflate(n,cells);
        !           309:        else cells := Extract_non_Flat_Mixed_Cells(n,mix,tt);
        !           310:             Deflate(n,cells);
        !           311:             Construct(Head_Of(tmpsub),cells);
        !           312:       end if;
        !           313:       Flatten(cells);
        !           314:       tmpsub := cells;
        !           315:     end Bef_Flat;
        !           316:
        !           317:     procedure New_Cell ( tt : in Triangulation; pt : in vector ) is
        !           318:
        !           319:       cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt);
        !           320:       index : natural := 1;
        !           321:
        !           322:     begin
        !           323:       Deflate(n,cells);
        !           324:       for i in 1..mix'last-1 loop
        !           325:         if pt(i+n) /= 0
        !           326:          then index := i+1;
        !           327:         end if;
        !           328:         exit when index > 1;
        !           329:       end loop;
        !           330:       Process_New_Cells(cells,index,pt);
        !           331:     end New_Cell;
        !           332:
        !           333:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat_and_New
        !           334:       (Before_Flattening => Bef_Flat, Process_New_Simplices => New_Cell);
        !           335:
        !           336:   begin
        !           337:     l := Embedding_before_Lifting(supports);
        !           338:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           339:     if Is_Null(tmpsub)
        !           340:      then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted);
        !           341:      else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t);
        !           342:           Deflate(n,lastcells);
        !           343:           Construct(Head_Of(tmpsub),lastcells);
        !           344:           mixsub := lastcells;
        !           345:           numtri := Length_Of(t);
        !           346:     end if;
        !           347:   end Dynamic_Cayley_with_Flat_and_New;
        !           348:
        !           349:   procedure Dynamic_Cayley_with_Flat_and_Newt
        !           350:                 ( n : in natural; mix : in Vector;
        !           351:                   supports : in Array_of_Lists; order,inter : in boolean;
        !           352:                   maxli : in natural; lifted : out Array_of_Lists;
        !           353:                   t : in out Triangulation ) is
        !           354:
        !           355:     l,liftedl,liftedl_last : list;
        !           356:
        !           357:     procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is
        !           358:
        !           359:       cells : Mixed_Subdivision;
        !           360:       lftpts : Array_of_Lists(supports'range);
        !           361:
        !           362:     begin
        !           363:       Extract(n,mix,tt,lft,cells,lftpts);
        !           364:       Before_Flattening(cells,lftpts);
        !           365:     end Bef_Flat;
        !           366:
        !           367:     procedure New_Cell ( tt : in Triangulation; pt : in vector ) is
        !           368:
        !           369:       cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt);
        !           370:       index : natural := 1;
        !           371:
        !           372:     begin
        !           373:       Deflate(n,cells);
        !           374:       for i in 1..mix'last-1 loop
        !           375:         if pt(i+n) /= 0
        !           376:          then index := i+1;
        !           377:         end if;
        !           378:         exit when index > 1;
        !           379:       end loop;
        !           380:       Process_New_Cells(cells,index,pt);
        !           381:     end New_Cell;
        !           382:
        !           383:     procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat_and_New
        !           384:         (Before_Flattening => Bef_Flat, Process_New_Simplices => New_Cell);
        !           385:
        !           386:   begin
        !           387:     l := Embedding_before_Lifting(supports);
        !           388:     C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t);
        !           389:     lifted := Extract(n,mix,liftedl); Clear(liftedl);
        !           390:   end Dynamic_Cayley_with_Flat_and_Newt;
        !           391:
        !           392: end Cayley_Trick;

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