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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/contributions_to_mixed_volume.adb, Revision 1.1.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 Vertices;                           use Vertices;
                      6: with Inner_Normal_Cones;                 use Inner_Normal_Cones;
                      7: with Normal_Cone_Intersections;          use Normal_Cone_Intersections;
                      8:
                      9: package body Contributions_to_Mixed_Volume is
                     10:
                     11: -- AUXILIAIRIES TO CONSTRUCT THE FACETS :
                     12:
                     13:   procedure Copy_Remove ( l : in out List; x : in Vector ) is
                     14:
                     15:   -- DESCRIPTION :
                     16:   --   Replaces the list by a copy of it, without the point x.
                     17:
                     18:     tmp,res,res_last : List;
                     19:
                     20:   begin
                     21:     tmp := l;
                     22:     while not Is_Null(tmp) loop
                     23:       declare
                     24:         pt : Link_to_Vector := Head_Of(tmp);
                     25:       begin
                     26:         if not Equal(pt.all,x)
                     27:          then Append(res,res_last,pt.all);
                     28:         end if;
                     29:       end;
                     30:       tmp := Tail_Of(tmp);
                     31:     end loop;
                     32:     Copy(res,l);  Deep_Clear(l);
                     33:   end Copy_Remove;
                     34:
                     35:   function Vertex_Points ( l : Array_of_Lists ) return Array_of_Lists is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   returns for each list the list of the vertex points.
                     39:
                     40:     res : Array_of_Lists(l'range);
                     41:
                     42:   begin
                     43:     for i in l'range loop
                     44:       res(i) := Vertex_Points(l(i));
                     45:     end loop;
                     46:     return res;
                     47:   end Vertex_Points;
                     48:
                     49:   procedure Copy ( f1 : in Array_of_Faces; f2 : in out Array_of_Faces ) is
                     50:
                     51:   -- DESCRIPTION :
                     52:   --   Copies the array f1 into the array f2.
                     53:
                     54:   begin
                     55:     for i in f1'range loop
                     56:       Deep_Copy(f1(i),f2(i));
                     57:     end loop;
                     58:   end Copy;
                     59:
                     60:   function Create_Facets ( n : natural; l : List; x : Vector ) return Faces is
                     61:
                     62:   -- DESCRIPTION :
                     63:   --   Returns a list of all facets of conv(l), that all contain x.
                     64:   --   First it will be checked whether x belongs to l or not.
                     65:
                     66:     res : Faces;
                     67:     wrk : List;
                     68:     lx : Link_to_Vector;
                     69:
                     70:   begin
                     71:     if Is_In(l,x)
                     72:      then res := Create(n-1,n,l,x);
                     73:      else wrk := l;
                     74:           lx := new Vector'(x);
                     75:           Construct(lx,wrk);
                     76:           res := Create(n-1,n,wrk,x);
                     77:     end if;
                     78:     return res;
                     79:   end Create_Facets;
                     80:
                     81:   function All_Facets ( n : natural; l : Array_of_Lists )
                     82:                       return Array_of_Faces is
                     83:
                     84:   -- DESCRIPTION :
                     85:   --   Returns all facets of all sets in l.
                     86:
                     87:     res : Array_of_Faces(l'range);
                     88:
                     89:   begin
                     90:     for i in l'range loop
                     91:       res(i) := Create(n-1,n,l(i));
                     92:     end loop;
                     93:     return res;
                     94:   end All_Facets;
                     95:
                     96: -- DETERMINE ZERO CONTRIBUTION BASED ON INTERSECTION MATRIX :
                     97:
                     98:   function Exhaustive_Zero_Contribution
                     99:              ( pts : Array_of_Lists; g : List; i : natural ) return boolean is
                    100:
                    101:   -- DESCRIPTION :
                    102:   --   Creates an intersection matrix, based on the list of generators of
                    103:   --   the normal cone of a points in the ith component of pts.
                    104:
                    105:     res : boolean;
                    106:     n1 : constant natural := pts'length - 1;
                    107:     mg : constant natural := Length_Of(g);
                    108:     nc : constant natural := Number_of_Cones(pts,i);
                    109:     ima : Intersection_Matrix(n1,mg,nc);
                    110:
                    111:   begin
                    112:     ima := Create(pts,g,i);
                    113:     return Contained_in_Union(pts,i,g,ima);
                    114:   end Exhaustive_Zero_Contribution;
                    115:
                    116: -- THE CRITERION :
                    117:
                    118:   function Simple_Zero_Contribution
                    119:                ( pts : Array_of_Lists; x : Vector; i : natural )
                    120:                return boolean is
                    121:
                    122:     res : boolean := false;
                    123:     g : List := Generators(pts(i),x);
                    124:
                    125:   begin
                    126:     for j in pts'range loop
                    127:       if j /= i
                    128:        then res := Contained_in_Cone(pts(j),g);
                    129:       end if;
                    130:       exit when res;
                    131:     end loop;
                    132:     Deep_Clear(g);
                    133:     return res;
                    134:   end Simple_Zero_Contribution;
                    135:
                    136:   function Simple_Zero_Contribution
                    137:                ( pts : Array_of_Lists; ifacets : Faces;
                    138:                  x : Vector; i : natural ) return boolean is
                    139:
                    140:     g : List := Generators(pts(i),ifacets,x);
                    141:     res : boolean := false;
                    142:
                    143:   begin
                    144:     for j in pts'range loop
                    145:       if j /= i
                    146:        then res := Contained_in_Cone(pts(j),g);
                    147:       end if;
                    148:       exit when res;
                    149:     end loop;
                    150:     Deep_Clear(g);
                    151:     return res;
                    152:   end Simple_Zero_Contribution;
                    153:
                    154:   function Exhaustive_Zero_Contribution
                    155:                ( pts : Array_of_Lists;
                    156:                  x : Vector; i : natural ) return boolean is
                    157:
                    158:     n : constant natural := x'length;
                    159:     res : boolean := false;
                    160:
                    161:   begin
                    162:     if Length_Of(pts(i)) > n
                    163:      then declare
                    164:             f : Faces := Create_Facets(n,pts(i),x);
                    165:           begin
                    166:             res := Exhaustive_Zero_Contribution(pts,f,x,i);
                    167:             Clear(f);
                    168:           end;
                    169:      else declare
                    170:             g : List := Generators(pts(i),x);
                    171:           begin
                    172:             res := Exhaustive_Zero_Contribution(pts,g,i);
                    173:           end;
                    174:     end if;
                    175:     return res;
                    176:   end Exhaustive_Zero_Contribution;
                    177:
                    178:   function Exhaustive_Zero_Contribution
                    179:                ( pts : Array_of_Lists; ifacets : Faces;
                    180:                  x : Vector; i : natural ) return boolean is
                    181:
                    182:     g : List;
                    183:
                    184:   begin
                    185:     if not Is_Null(ifacets)
                    186:      then g := Generators(pts(i),ifacets,x);
                    187:      else g := Generators(pts(i),x);
                    188:     end if;
                    189:     return Exhaustive_Zero_Contribution(pts,g,i);
                    190:   end Exhaustive_Zero_Contribution;
                    191:
                    192: -- SWEEPING THROUGH THE POINT LISTS :
                    193:
                    194:   function Simple_Sweep ( pts : Array_of_Lists ) return Array_of_Lists is
                    195:
                    196:     n : constant natural := Head_Of(pts(pts'first))'length;
                    197:     afa : Array_of_Faces(pts'range) := All_Facets(n,pts);
                    198:
                    199:   begin
                    200:     return Simple_Sweep(pts,afa);
                    201:   end Simple_Sweep;
                    202:
                    203:   function Simple_Sweep ( pts : Array_of_Lists; facets : Array_of_Faces )
                    204:                         return Array_of_Lists is
                    205:
                    206:     res,res_last,points : Array_of_Lists(pts'range);
                    207:    -- wrkfacets : Array_of_Faces(facets'range);
                    208:
                    209:    -- SAFETY MODE : checks whether mixed volume does not decrease
                    210:    -- n : constant natural := pts'last;
                    211:    -- mix : constant Vector := (1..n => 1);
                    212:    -- mv : constant natural := Mixed_Volume(n,mix,pts);
                    213:
                    214:   begin
                    215:    -- Copy(facets,wrkfacets);
                    216:     points := Vertex_Points(pts);  -- instead of: Copy(pts,points);
                    217:     for i in points'range loop
                    218:       declare
                    219:         tmp : constant VecVec := Shallow_Create(points(i));
                    220:       begin
                    221:         for j in tmp'range loop
                    222:           declare
                    223:             x : constant Vector := tmp(j).all;
                    224:            -- f : Faces := Extract_Faces(wrkfacets(i),x);
                    225:           begin
                    226:            -- if not Simple_Zero_Contribution(points,f,x,i)
                    227:             if not Simple_Zero_Contribution(points,x,i)
                    228:              then Append(res(i),res_last(i),x);
                    229:              else Remove(points(i),x);
                    230:                  -- SAFETY MODE :
                    231:                  -- if mv > Mixed_Volume(n,mix,points)
                    232:                  --  then put_line("BUG at points : "); put(points);
                    233:                  --       put("for the vector : "); put(x); new_line;
                    234:                  --       put("  at component "); put(i,1); new_line;
                    235:                  --       raise PROGRAM_ERROR;
                    236:                  -- end if;
                    237:                  -- Clear(wrkfacets(i));
                    238:                  -- wrkfacets(i) := Create(x'length-1,x'length,points(i));
                    239:             end if;
                    240:           end;
                    241:         end loop;
                    242:       end;
                    243:       Copy(res(i),points(i));
                    244:     end loop;
                    245:     Deep_Clear(points);
                    246:     return res;
                    247:   end Simple_Sweep;
                    248:
                    249:   function Exhaustive_Sweep ( pts : Array_of_Lists ) return Array_of_Lists is
                    250:
                    251:     n : constant natural := Head_Of(pts(pts'first))'length;
                    252:     afa : Array_of_Faces(pts'range) := All_Facets(n,pts);
                    253:
                    254:   begin
                    255:     return Exhaustive_Sweep(pts,afa);
                    256:   end Exhaustive_Sweep;
                    257:
                    258:   function Exhaustive_Sweep ( pts : Array_of_Lists; facets : Array_of_Faces )
                    259:                             return Array_of_Lists is
                    260:
                    261:     res,res_last,points : Array_of_Lists(pts'range);
                    262:    -- wrkfacets : Array_of_Faces(facets'range);
                    263:
                    264:    -- SAFETY MODE : checks whether mixed volume does not decrease
                    265:    -- n : constant natural := pts'last;
                    266:    -- mix : constant Vector := (1..n => 1);
                    267:    -- mv : constant natural := Mixed_Volume(n,mix,pts);
                    268:
                    269:   begin
                    270:    -- Copy(facets,wrkfacets);
                    271:     points := Vertex_Points(pts);  -- instead of: Copy(pts,points);
                    272:     for i in points'range loop
                    273:       declare
                    274:         tmp : constant VecVec := Shallow_Create(points(i));
                    275:       begin
                    276:         for j in tmp'range loop
                    277:           declare
                    278:             x : constant Vector := tmp(j).all;
                    279:            -- f : Faces := Extract_Faces(wrkfacets(i),x);
                    280:           begin
                    281:            -- if not Exhaustive_Zero_Contribution(points,f,x,i)
                    282:             if not Exhaustive_Zero_Contribution(points,x,i)
                    283:              then Append(res(i),res_last(i),x);
                    284:              else Remove(points(i),x);
                    285:                  -- SAFETY MODE :
                    286:                  -- if mv > Mixed_Volume(n,mix,points)
                    287:                  --  then put_line("BUG at points : "); put(points);
                    288:                  --       put("for the vector : "); put(x); new_line;
                    289:                  --       put("  at component "); put(i,1); new_line;
                    290:                  --       raise PROGRAM_ERROR;
                    291:                  -- end if;
                    292:                  -- Clear(wrkfacets(i));
                    293:                  -- wrkfacets(i) := Create(x'length-1,x'length,points(i));
                    294:             end if;
                    295:           end;
                    296:         end loop;
                    297:       end;
                    298:       Copy(res(i),points(i));
                    299:     end loop;
                    300:     Deep_Clear(points);
                    301:     return res;
                    302:   end Exhaustive_Sweep;
                    303:
                    304: end Contributions_to_Mixed_Volume;

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