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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/generating_mixed_cells.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      2: with Standard_Floating_Vectors;
                      3: with Lists_of_Integer_Vectors;
                      4: with Lists_of_Floating_Vectors;
                      5: with Arrays_of_Integer_Vector_Lists;
                      6: with Arrays_of_Floating_Vector_Lists;
                      7: with Mixed_Volume_Computation;           use Mixed_Volume_Computation;
                      8: with Permutations;                       use Permutations;
                      9: with Permute_Operations;                 use Permute_Operations;
                     10:
                     11: package body Generating_Mixed_Cells is
                     12:
                     13: -- FIRST TARGET ROUTINE :
                     14:
                     15:   function Permute ( l : Lists_of_Integer_Vectors.List; p : Permutation )
                     16:                    return Lists_of_Integer_Vectors.List is
                     17:
                     18:   -- DESCRIPTION :
                     19:   --   Applies the permutation p to all elements in the list l.
                     20:
                     21:     use Lists_of_Integer_Vectors;
                     22:
                     23:     tmp,res,res_last : List;
                     24:
                     25:   begin
                     26:     tmp := l;
                     27:     while not Is_Null(tmp) loop
                     28:       declare
                     29:         plv,lv : Standard_Integer_Vectors.Link_to_Vector;
                     30:       begin
                     31:         lv := Head_Of(tmp);
                     32:         plv := new Standard_Integer_Vectors.Vector'(p*lv.all);
                     33:         plv(plv'last) := lv(lv'last);  -- same lifting !
                     34:         Append(res,res_last,plv.all);
                     35:         Standard_Integer_Vectors.Clear(plv);
                     36:       end;
                     37:       tmp := Tail_Of(tmp);
                     38:     end loop;
                     39:     return res;
                     40:   end Permute;
                     41:
                     42:   function Permute ( p : Permutation; mix : Vector;
                     43:                      mic : Integer_Mixed_Subdivisions.Mixed_Cell )
                     44:                    return Integer_Mixed_Subdivisions.Mixed_Cell is
                     45:
                     46:   -- DESCRIPTION :
                     47:   --   Permutes the components of mic.pts according to the permutation p.
                     48:
                     49:     use Lists_of_Integer_Vectors;
                     50:     use Arrays_of_Integer_Vector_Lists;
                     51:     use Integer_Mixed_Subdivisions;
                     52:
                     53:     res : Mixed_Cell;
                     54:     index : natural;
                     55:
                     56:   begin
                     57:     res.nor := new Standard_Integer_Vectors.Vector'(mic.nor.all);
                     58:     res.pts := new Array_of_Lists(mic.pts'range);
                     59:     for k in res.pts'range loop
                     60:       index := Compute_Index(p(k),mix);
                     61:       Copy(mic.pts(index),res.pts(k));
                     62:     end loop;
                     63:     return res;
                     64:   end Permute;
                     65:
                     66:   function Permute ( mic : Integer_Mixed_Subdivisions.Mixed_Cell;
                     67:                      p : Permutation )
                     68:                    return Integer_Mixed_Subdivisions.Mixed_Cell is
                     69:
                     70:   -- DESCRIPTION :
                     71:   --   Applies permutation p on the mixed cell mic.
                     72:
                     73:     use Arrays_of_Integer_Vector_Lists;
                     74:     use Integer_Mixed_Subdivisions;
                     75:
                     76:     res : Mixed_Cell;
                     77:
                     78:   begin
                     79:     res.nor := new Standard_Integer_Vectors.Vector'(p*mic.nor.all);
                     80:     res.nor(res.nor'last) := mic.nor(mic.nor'last);
                     81:     res.pts := new Array_of_Lists(mic.pts'range);
                     82:     for k in mic.pts'range loop
                     83:       res.pts(k) := Permute(mic.pts(k),p);
                     84:     end loop;
                     85:     return res;
                     86:   end Permute;
                     87:
                     88:   procedure Permute_and_Append
                     89:                ( v,w : in List_of_Permutations;
                     90:                  mic : in Integer_Mixed_Subdivisions.Mixed_Cell;
                     91:                  mix : in Vector;
                     92:                  mixsub,mixsub_last
                     93:                      : in out Integer_Mixed_Subdivisions.Mixed_Subdivision ) is
                     94:
                     95:   -- DESCRIPTION :
                     96:   --   Applies all permutations to the mixed cell and appends the results.
                     97:
                     98:     use Integer_Mixed_Subdivisions;
                     99:
                    100:     lv,lw : List_of_Permutations;
                    101:
                    102:   begin
                    103:     lv := v; lw := w;
                    104:     while not Is_Null(lv) loop
                    105:       declare
                    106:         vmic,wmic : Mixed_Cell;
                    107:       begin
                    108:         vmic := Permute(mic,Permutation(Head_Of(lv).all));
                    109:         wmic := Permute(Permutation(Head_Of(lw).all),mix,vmic);
                    110:         Deep_Clear(vmic);
                    111:         if not Is_In(mixsub,wmic.nor.all)
                    112:          then Append(mixsub,mixsub_last,wmic);
                    113:         end if;
                    114:       end;
                    115:       lv := Tail_Of(lv);
                    116:       lw := Tail_Of(lw);
                    117:     end loop;
                    118:   end Permute_and_Append;
                    119:
                    120:   function Generating_Cells
                    121:               ( v,w : List_of_Permutations; mix : Vector;
                    122:                 mixsub : Integer_Mixed_Subdivisions.Mixed_Subdivision )
                    123:               return Integer_Mixed_Subdivisions.Mixed_Subdivision is
                    124:
                    125:     use Integer_Mixed_Subdivisions;
                    126:
                    127:     tmp,res,res_last,done,done_last : Mixed_Subdivision;
                    128:
                    129:   begin
                    130:     tmp := mixsub;
                    131:     while not Is_Null(tmp) loop
                    132:       declare
                    133:         mic : Mixed_Cell := Head_Of(tmp);
                    134:       begin
                    135:         if not Is_In(done,mic.nor.all)
                    136:          then Append(res,res_last,mic);
                    137:               Permute_and_Append(v,w,mic,mix,done,done_last);
                    138:         end if;
                    139:       end;
                    140:       tmp := Tail_Of(tmp);
                    141:     end loop;
                    142:     Clear(done);
                    143:     return res;
                    144:   end Generating_Cells;
                    145:
                    146: -- SECOND TARGET ROUTINE :
                    147:
                    148:   function Permute ( l : Lists_of_Floating_Vectors.List; p : Permutation )
                    149:                    return Lists_of_Floating_Vectors.List is
                    150:
                    151:   -- DESCRIPTION :
                    152:   --   Applies the permutation p to all elements in the list l.
                    153:
                    154:     use Lists_of_Floating_Vectors;
                    155:
                    156:     tmp,res,res_last : List;
                    157:
                    158:   begin
                    159:     tmp := l;
                    160:     while not Is_Null(tmp) loop
                    161:       declare
                    162:         plv,lv : Standard_Floating_Vectors.Link_to_Vector;
                    163:       begin
                    164:         lv := Head_Of(tmp);
                    165:         plv := new Standard_Floating_Vectors.Vector'(p*lv.all);
                    166:         plv(plv'last) := lv(lv'last);  -- same lifting !
                    167:         Append(res,res_last,plv.all);
                    168:         Standard_Floating_Vectors.Clear(plv);
                    169:       end;
                    170:       tmp := Tail_Of(tmp);
                    171:     end loop;
                    172:     return res;
                    173:   end Permute;
                    174:
                    175:   function Permute ( p : Permutation; mix : Vector;
                    176:                      mic : Floating_Mixed_Subdivisions.Mixed_Cell )
                    177:                    return Floating_Mixed_Subdivisions.Mixed_Cell is
                    178:
                    179:   -- DESCRIPTION :
                    180:   --   Permutes the components of mic.pts according to the permutation p.
                    181:
                    182:     use Lists_of_Floating_Vectors;
                    183:     use Arrays_of_Floating_Vector_Lists;
                    184:     use Floating_Mixed_Subdivisions;
                    185:
                    186:     res : Mixed_Cell;
                    187:     index : natural;
                    188:
                    189:   begin
                    190:     res.nor := new Standard_Floating_Vectors.Vector'(mic.nor.all);
                    191:     res.pts := new Array_of_Lists(mic.pts'range);
                    192:     for k in res.pts'range loop
                    193:       index := Compute_Index(p(k),mix);
                    194:       Copy(mic.pts(index),res.pts(k));
                    195:     end loop;
                    196:     return res;
                    197:   end Permute;
                    198:
                    199:   function Permute ( mic : Floating_Mixed_Subdivisions.Mixed_Cell;
                    200:                      p : Permutation )
                    201:                    return Floating_Mixed_Subdivisions.Mixed_Cell is
                    202:
                    203:   -- DESCRIPTION :
                    204:   --   Applies permutation p on the mixed cell mic.
                    205:
                    206:     use Arrays_of_Floating_Vector_Lists;
                    207:     use Floating_Mixed_Subdivisions;
                    208:
                    209:     res : Mixed_Cell;
                    210:
                    211:   begin
                    212:     res.nor := new Standard_Floating_Vectors.Vector'(p*mic.nor.all);
                    213:     res.nor(res.nor'last) := mic.nor(mic.nor'last);
                    214:     res.pts := new Array_of_Lists(mic.pts'range);
                    215:     for k in mic.pts'range loop
                    216:       res.pts(k) := Permute(mic.pts(k),p);
                    217:     end loop;
                    218:     return res;
                    219:   end Permute;
                    220:
                    221:   procedure Permute_and_Append
                    222:                ( v,w : in List_of_Permutations;
                    223:                  mic : in Floating_Mixed_Subdivisions.Mixed_Cell;
                    224:                  mix : in Vector;
                    225:                  mixsub,mixsub_last
                    226:                      : in out Floating_Mixed_Subdivisions.Mixed_Subdivision ) is
                    227:
                    228:   -- DESCRIPTION :
                    229:   --   Applies all permutations to the mixed cell and appends the results.
                    230:
                    231:     use Floating_Mixed_Subdivisions;
                    232:
                    233:     lv,lw : List_of_Permutations;
                    234:
                    235:   begin
                    236:     lv := v; lw := w;
                    237:     while not Is_Null(lv) loop
                    238:       declare
                    239:         vmic,wmic : Mixed_Cell;
                    240:       begin
                    241:         vmic := Permute(mic,Permutation(Head_Of(lv).all));
                    242:         wmic := Permute(Permutation(Head_Of(lw).all),mix,vmic);
                    243:         Deep_Clear(vmic);
                    244:         if not Is_In(mixsub,wmic.nor.all)
                    245:          then Append(mixsub,mixsub_last,wmic);
                    246:         end if;
                    247:       end;
                    248:       lv := Tail_Of(lv);
                    249:       lw := Tail_Of(lw);
                    250:     end loop;
                    251:   end Permute_and_Append;
                    252:
                    253:   function Generating_Cells
                    254:               ( v,w : List_of_Permutations; mix : Vector;
                    255:                 mixsub : Floating_Mixed_Subdivisions.Mixed_Subdivision )
                    256:               return Floating_Mixed_Subdivisions.Mixed_Subdivision is
                    257:
                    258:     use Floating_Mixed_Subdivisions;
                    259:
                    260:     tmp,res,res_last,done,done_last : Mixed_Subdivision;
                    261:
                    262:   begin
                    263:     tmp := mixsub;
                    264:     while not Is_Null(tmp) loop
                    265:       declare
                    266:         mic : Mixed_Cell := Head_Of(tmp);
                    267:       begin
                    268:         if not Is_In(done,mic.nor.all)
                    269:          then Append(res,res_last,mic);
                    270:               Permute_and_Append(v,w,mic,mix,done,done_last);
                    271:         end if;
                    272:       end;
                    273:       tmp := Tail_Of(tmp);
                    274:     end loop;
                    275:     Clear(done);
                    276:     return res;
                    277:   end Generating_Cells;
                    278:
                    279: -- THIRD TARGET ROUTINE :
                    280:
                    281:   function Generate_Cells
                    282:               ( v,w : List_of_Permutations; mix : Vector;
                    283:                 mixsub : Integer_Mixed_Subdivisions.Mixed_Subdivision )
                    284:               return Integer_Mixed_Subdivisions.Mixed_Subdivision is
                    285:
                    286:     use Integer_Mixed_Subdivisions;
                    287:
                    288:     tmp,res,res_last : Mixed_Subdivision;
                    289:
                    290:   begin
                    291:     tmp := mixsub;
                    292:     while not Is_Null(tmp) loop
                    293:       declare
                    294:         mic : Mixed_Cell := Head_Of(tmp);
                    295:       begin
                    296:         Permute_and_Append(v,w,mic,mix,res,res_last);
                    297:       end;
                    298:       tmp := Tail_Of(tmp);
                    299:     end loop;
                    300:     return res;
                    301:   end Generate_Cells;
                    302:
                    303:   function Exists_Permutation
                    304:                ( v1,v2 : Standard_Integer_Vectors.Link_to_Vector )
                    305:                return boolean is
                    306:
                    307:   -- DESCRIPTION :
                    308:   --   Returns true if there exists a permutation p: v1 = p*v1.
                    309:
                    310:   begin
                    311:     if v1(v1'last) /= v2(v2'last)
                    312:      then return false;  -- they must have the same lifted component !
                    313:      else return Permutable(v1(v1'first..v1'last-1),v2(v2'first..v2'last-1));
                    314:     end if;
                    315:   end Exists_Permutation;
                    316:
                    317:   function Permutable ( mic : Integer_Mixed_Subdivisions.Mixed_Cell;
                    318:                         mixsub : Integer_Mixed_Subdivisions.Mixed_Subdivision )
                    319:                       return boolean is
                    320:
                    321:     use Integer_Mixed_Subdivisions;
                    322:     tmp : Mixed_Subdivision := mixsub;
                    323:     mic2 : Mixed_Cell;
                    324:
                    325:   begin
                    326:     while not Is_Null(tmp) loop
                    327:       mic2 := Head_Of(tmp);
                    328:       if Exists_Permutation(mic.nor,mic2.nor)
                    329:        then return true;
                    330:        else tmp := Tail_Of(tmp);
                    331:       end if;
                    332:     end loop;
                    333:     return false;
                    334:   end Permutable;
                    335:
                    336:   function Generating_Cells
                    337:              ( mixsub : Integer_Mixed_Subdivisions.Mixed_Subdivision )
                    338:              return Integer_Mixed_Subdivisions.Mixed_Subdivision is
                    339:
                    340:     use Integer_Mixed_Subdivisions;
                    341:
                    342:     tmp,res,res_last : Mixed_Subdivision;
                    343:     mic : Mixed_Cell;
                    344:
                    345:   begin
                    346:     tmp := mixsub;
                    347:     while not Is_Null(tmp) loop
                    348:       mic := Head_Of(tmp);
                    349:       if not Permutable(mic,res)
                    350:        then Append(res,res_last,mic);
                    351:       end if;
                    352:       tmp := Tail_Of(tmp);
                    353:     end loop;
                    354:     return res;
                    355:   end Generating_Cells;
                    356:
                    357: -- FOURTH TARGET ROUTINE :
                    358:
                    359:   function Exists_Permutation
                    360:               ( v1,v2 : Standard_Floating_Vectors.Link_to_Vector )
                    361:               return boolean is
                    362:
                    363:   -- DESCRIPTION :
                    364:   --   Returns true if there exists a permutation p: v1 = p*v1.
                    365:
                    366:   begin
                    367:     if v1(v1'last) /= v2(v2'last)
                    368:      then return false;  -- they must have the same lifted component !
                    369:      else return Permutable(v1(v1'first..v1'last-1),v2(v2'first..v2'last-1));
                    370:     end if;
                    371:   end Exists_Permutation;
                    372:
                    373:   function Permutable ( mic : Floating_Mixed_Subdivisions.Mixed_Cell;
                    374:                         mixsub : Floating_Mixed_Subdivisions.Mixed_Subdivision )
                    375:                       return boolean is
                    376:
                    377:     use Floating_Mixed_Subdivisions;
                    378:
                    379:     tmp : Mixed_Subdivision := mixsub;
                    380:     mic2 : Mixed_Cell;
                    381:
                    382:   begin
                    383:     while not Is_Null(tmp) loop
                    384:       mic2 := Head_Of(tmp);
                    385:       if Exists_Permutation(mic.nor,mic2.nor)
                    386:        then return true;
                    387:        else tmp := Tail_Of(tmp);
                    388:       end if;
                    389:     end loop;
                    390:     return false;
                    391:   end Permutable;
                    392:
                    393:   function Generating_Cells
                    394:              ( mixsub : Floating_Mixed_Subdivisions.Mixed_Subdivision )
                    395:              return Floating_Mixed_Subdivisions.Mixed_Subdivision is
                    396:
                    397:     use Floating_Mixed_Subdivisions;
                    398:
                    399:     tmp,res,res_last : Mixed_Subdivision;
                    400:     mic : Mixed_Cell;
                    401:
                    402:   begin
                    403:     tmp := mixsub;
                    404:     while not Is_Null(tmp) loop
                    405:       mic := Head_Of(tmp);
                    406:       if not Permutable(mic,res)
                    407:        then Append(res,res_last,mic);
                    408:       end if;
                    409:       tmp := Tail_Of(tmp);
                    410:     end loop;
                    411:     return res;
                    412:   end Generating_Cells;
                    413:
                    414: end Generating_Mixed_Cells;

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