[BACK]Return to ts_fvector.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Supports

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Supports/ts_fvector.adb, Revision 1.1

1.1     ! maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
        !             2: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
        !             3: with Standard_Random_Numbers;            use Standard_Random_Numbers;
        !             4: with Standard_Integer_Vectors;
        !             5: with Standard_Floating_Vectors;
        !             6: with Standard_Integer_VecVecs;
        !             7: with Standard_Integer_VecVecs_io;        use Standard_Integer_VecVecs_io;
        !             8: with Standard_Floating_VecVecs;
        !             9: with Standard_Floating_VecVecs_io;       use Standard_Floating_VecVecs_io;
        !            10: with Standard_Random_VecVecs;            use Standard_Random_VecVecs;
        !            11: with Face_Cardinalities;                 use Face_Cardinalities;
        !            12:
        !            13: procedure ts_fvector is
        !            14:
        !            15: -- DESCRIPTION :
        !            16: --   Computes the f-vector of a polytope and checks the Euler-Poincare formula.
        !            17:
        !            18:   procedure Write ( f : in Standard_Integer_Vectors.Vector ) is
        !            19:
        !            20:   -- DESCRIPTION :
        !            21:   --   Writes the f-vector on screen.
        !            22:
        !            23:     n : constant natural := f'last;
        !            24:
        !            25:   begin
        !            26:     put_line("The f-vector : ");
        !            27:     put(" f(-1)     : "); put(f(-1)); new_line;
        !            28:     put(" #vertices : "); put(f(0)); new_line;
        !            29:     put(" #edges    : "); put(f(1)); new_line;
        !            30:     for i in 2..(n-1) loop
        !            31:       put(" #"); put(i,1); put("-faces  : "); put(f(i)); new_line;
        !            32:     end loop;
        !            33:     put(" f("); put(n,1); put(")      : "); put(f(n)); new_line;
        !            34:   end Write;
        !            35:
        !            36:   function Euler_Poincare ( f : Standard_Integer_Vectors.Vector )
        !            37:                           return integer is
        !            38:
        !            39:   -- DESCRIPTION :
        !            40:   --   Computes the alternating sum: sum_{i in f'range} (-1)^(i) f(i).
        !            41:
        !            42:     sum : integer := 0;
        !            43:     pos : boolean := false;
        !            44:
        !            45:   begin
        !            46:     for i in f'range loop
        !            47:       if pos
        !            48:        then sum := sum + f(i);
        !            49:        else sum := sum - f(i);
        !            50:       end if;
        !            51:       pos := not pos;
        !            52:     end loop;
        !            53:     return sum;
        !            54:   end Euler_Poincare;
        !            55:
        !            56:   procedure Integer_Interactive_Testing is
        !            57:
        !            58:     n,m : natural;
        !            59:     tol : constant double_float := 10.0**(-12);
        !            60:     sum : integer;
        !            61:
        !            62:   begin
        !            63:     put("Give the dimension n : "); get(n);
        !            64:     put("Give the number of points that span the polytope : "); get(m);
        !            65:     declare
        !            66:       pts : Standard_Integer_VecVecs.VecVec(1..m);
        !            67:       f : Standard_Integer_Vectors.Vector(-1..n);
        !            68:     begin
        !            69:       put("Give "); put(m,1); put(" "); put(n,1);
        !            70:       put_line("-dimensional integer vectors :");
        !            71:       get(n,pts);
        !            72:       put_line("Counting vertices, edges , .., facets, ...");
        !            73:       f := fvector(pts); sum := Euler_Poincare(f);
        !            74:       Write(f);
        !            75:       put("The result of the Euler-Poincare formula : "); put(sum,1);
        !            76:       if sum /= 0
        !            77:        then put_line("   BUG DISCOVERED !!!");
        !            78:        else put_line("   OK.");
        !            79:       end if;
        !            80:     end;
        !            81:   end Integer_Interactive_Testing;
        !            82:
        !            83:   procedure Floating_Interactive_Testing is
        !            84:
        !            85:     n,m : natural;
        !            86:     tol : constant double_float := 10.0**(-12);
        !            87:     sum : integer;
        !            88:
        !            89:   begin
        !            90:     put("Give the dimension n : "); get(n);
        !            91:     put("Give the number of points that span the polytope : "); get(m);
        !            92:     declare
        !            93:       pts : Standard_Floating_VecVecs.VecVec(1..m);
        !            94:       f : Standard_Integer_Vectors.Vector(-1..n);
        !            95:     begin
        !            96:       put("Give "); put(m,1); put(" "); put(n,1);
        !            97:       put_line("-dimensional floating point vectors :");
        !            98:       get(n,pts);
        !            99:       put_line("Counting vertices, edges , .., facets, ...");
        !           100:       f := fvector(pts); sum := Euler_Poincare(f);
        !           101:       Write(f);
        !           102:       put("The result of the Euler-Poincare formula : "); put(sum,1);
        !           103:       if sum /= 0
        !           104:        then put_line("   BUG DISCOVERED !!!");
        !           105:        else put_line("   OK.");
        !           106:       end if;
        !           107:     end;
        !           108:   end Floating_Interactive_Testing;
        !           109:
        !           110:   function Floating_Random_Polytope
        !           111:              ( n,m : natural ) return Standard_Floating_VecVecs.VecVec is
        !           112:
        !           113:   -- DESCRIPTION :
        !           114:   --   Returns m randomly chosen n-dimensional floating-point vectors.
        !           115:
        !           116:     res : Standard_Floating_VecVecs.VecVec(1..m) := Random_VecVec(n,m);
        !           117:
        !           118:   begin
        !           119:     return res;
        !           120:   end Floating_Random_Polytope;
        !           121:
        !           122:   function Integer_Random_Polytope
        !           123:              ( n,m : natural; lower,upper : integer )
        !           124:              return Standard_Integer_VecVecs.VecVec is
        !           125:
        !           126:   -- DESCRIPTION :
        !           127:   --   Returns m randomly chosen n-dimensional vectors,
        !           128:   --   with integer entries between lower and upper.
        !           129:
        !           130:     res : Standard_Integer_VecVecs.VecVec(1..m);
        !           131:     done : boolean;
        !           132:
        !           133:     function Is_In ( i : integer ) return boolean is
        !           134:
        !           135:     -- DESCRIPTION :
        !           136:     --   Returns true if the ith vector already occurs in res(1..i-1).
        !           137:
        !           138:       use Standard_Integer_Vectors;
        !           139:
        !           140:     begin
        !           141:       for j in 1..i-1 loop
        !           142:         if Equal(res(j).all,res(i).all)
        !           143:          then return true;
        !           144:         end if;
        !           145:       end loop;
        !           146:       return false;
        !           147:     end Is_In;
        !           148:
        !           149:   begin
        !           150:     for i in 1..m loop
        !           151:       res(i) := new Standard_Integer_Vectors.Vector(1..n);
        !           152:       done := false;
        !           153:       while not done loop
        !           154:         for j in 1..n loop
        !           155:           res(i)(j) := Random(lower,upper);
        !           156:         end loop;
        !           157:         done := not Is_In(i);
        !           158:       end loop;
        !           159:     end loop;
        !           160:     return res;
        !           161:   end Integer_Random_Polytope;
        !           162:
        !           163:   procedure Floating_Automatic_Testing is
        !           164:
        !           165:     n,m,times,cnt : natural;
        !           166:     tol : constant double_float := 10.0**(-12);
        !           167:     sum : integer;
        !           168:     bug : boolean := false;
        !           169:
        !           170:   begin
        !           171:     put("Give the dimension n : "); get(n);
        !           172:     put("Give the number of points that span the polytope : "); get(m);
        !           173:     put("Give the number of testing cycles : "); get(times);
        !           174:     declare
        !           175:       pts : Standard_Floating_VecVecs.VecVec(1..m);
        !           176:       f : Standard_Integer_Vectors.Vector(-1..n);
        !           177:     begin
        !           178:       for i in 1..times loop
        !           179:         cnt := i;
        !           180:         pts := Floating_Random_Polytope(n,m);
        !           181:         f := fvector(pts); sum := Euler_Poincare(f);
        !           182:         Write(f);
        !           183:         put("The result of the Euler-Poincare formula : "); put(sum,1);
        !           184:         if sum /= 0
        !           185:          then put_line("   BUG DISCOVERED !!!"); bug := true;
        !           186:               put_line("The generated random configuration is");
        !           187:               put(pts);
        !           188:          else put_line("   OK.");  bug := false;
        !           189:         end if;
        !           190:         Standard_Floating_VecVecs.Clear(pts);
        !           191:         exit when bug;
        !           192:       end loop;
        !           193:     end;
        !           194:     if not bug
        !           195:      then put("No bugs found, with "); put(times,1);
        !           196:           put_line(" generated cases tested.");
        !           197:           put("Dimension : "); put(n,1);
        !           198:           put(" and #points : "); put(m,1); put_line(".");
        !           199:      else put("Bug found at case "); put(cnt,1); put_line(".");
        !           200:     end if;
        !           201:   end Floating_Automatic_Testing;
        !           202:
        !           203:   procedure Integer_Automatic_Testing is
        !           204:
        !           205:     n,m,times,cnt : natural;
        !           206:     tol : constant double_float := 10.0**(-12);
        !           207:     sum : integer;
        !           208:     bug : boolean := false;
        !           209:     lower,upper : integer;
        !           210:
        !           211:   begin
        !           212:     put("Give the dimension n : "); get(n);
        !           213:     put("Give the number of points that span the polytope : "); get(m);
        !           214:     put("Give lower bound on the entries : "); get(lower);
        !           215:     put("Give upper bound on the entries : "); get(upper);
        !           216:     put("Give the number of testing cycles : "); get(times);
        !           217:     declare
        !           218:       pts : Standard_Integer_VecVecs.VecVec(1..m);
        !           219:       f : Standard_Integer_Vectors.Vector(-1..n);
        !           220:     begin
        !           221:       for i in 1..times loop
        !           222:         cnt := i;
        !           223:         pts := Integer_Random_Polytope(n,m,lower,upper);
        !           224:         f := fvector(pts); sum := Euler_Poincare(f);
        !           225:         Write(f);
        !           226:         put("The result of the Euler-Poincare formula : "); put(sum,1);
        !           227:         if sum /= 0
        !           228:          then put_line("   BUG DISCOVERED !!!"); bug := true;
        !           229:               put_line("The generated random configuration is");
        !           230:               put(pts);
        !           231:          else put_line("   OK.");  bug := false;
        !           232:         end if;
        !           233:         Standard_Integer_VecVecs.Clear(pts);
        !           234:         exit when bug;
        !           235:       end loop;
        !           236:     end;
        !           237:     if not bug
        !           238:      then put("No bugs found, with "); put(times,1);
        !           239:           put_line(" generated cases tested.");
        !           240:           put("Dimension : "); put(n,1);
        !           241:           put(" and #points : "); put(m,1); put_line(".");
        !           242:      else put("Bug found at case "); put(cnt,1); put_line(".");
        !           243:     end if;
        !           244:   end Integer_Automatic_Testing;
        !           245:
        !           246:   procedure Main is
        !           247:
        !           248:     ans : character;
        !           249:
        !           250:   begin
        !           251:     new_line;
        !           252:     put_line("Testing the face enumerators by computing f-vectors.");
        !           253:     loop
        !           254:       new_line;
        !           255:       put_line("Choose one of the following :                  ");
        !           256:       put_line("  0. Exit this program.                        ");
        !           257:       put_line("  1. f-vector of given integer polytope.       ");
        !           258:       put_line("  2. f-vector of given floating polytope.      ");
        !           259:       put_line("  3. f-vector of random integer polytope.      ");
        !           260:       put_line("  4. f-vector of random floating polytope.     ");
        !           261:       put("Type 0,1,2,3, or 4 to select : "); get(ans);
        !           262:       exit when (ans = '0');
        !           263:       case ans is
        !           264:         when '1' => Integer_Interactive_Testing;
        !           265:         when '2' => Floating_Interactive_Testing;
        !           266:         when '3' => Integer_Automatic_Testing;
        !           267:         when '4' => Floating_Automatic_Testing;
        !           268:         when others => null;
        !           269:       end case;
        !           270:     end loop;
        !           271:   end Main;
        !           272:
        !           273: begin
        !           274:   Main;
        !           275: end ts_fvector;

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