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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Product/random_product_start_systems.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
        !             2: with Standard_Random_Numbers;            use Standard_Random_Numbers;
        !             3: with Standard_Natural_Vectors;
        !             4: with Standard_Complex_Vectors;           use Standard_Complex_Vectors;
        !             5: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
        !             6: with Random_Product_System;
        !             7: with Set_Structure;
        !             8:
        !             9: package body Random_Product_Start_Systems is
        !            10:
        !            11:   type Boolean_Array is array(integer range <>) of boolean;
        !            12:
        !            13:   function leq ( d1,d2 : Degrees ) return boolean is
        !            14:
        !            15:   -- DESCRIPTION :
        !            16:   --   returns true if for all k: d1(k) <= d2(k)
        !            17:
        !            18:   begin
        !            19:     for k in d1'range loop
        !            20:       if d1(k) > d2(k)
        !            21:        then return false;
        !            22:       end if;
        !            23:     end loop;
        !            24:     return true;
        !            25:   end leq;
        !            26:
        !            27:   function Dominated ( d : Degrees; p : Poly ) return boolean is
        !            28:
        !            29:    -- DESCRIPTION :
        !            30:    --   Returns true if the term indicated by the degrees d
        !            31:    --   is already in the set structure;
        !            32:    --   the polynomial p contains all terms that are already
        !            33:    --   belonging to the set structure.
        !            34:
        !            35:     res : boolean := false;
        !            36:
        !            37:     procedure Scan ( t : in Term; continue : out boolean ) is
        !            38:     begin
        !            39:       if leq(d,t.dg)
        !            40:        then res := true;
        !            41:            continue := false;
        !            42:        else continue := true;
        !            43:       end if;
        !            44:     end Scan;
        !            45:     procedure Scan_Terms is new Visiting_Iterator (Scan);
        !            46:
        !            47:   begin
        !            48:     Scan_Terms(p);
        !            49:     return res;
        !            50:   end Dominated;
        !            51:
        !            52:   procedure Divide ( dg : in out Standard_Natural_Vectors.Vector;
        !            53:                      i,d : in natural; occupied : in out Boolean_Array ) is
        !            54:
        !            55:   -- DESCRIPTION :
        !            56:   --   Divides the monomial by every unknown that occurs already
        !            57:   --   in one set of the ith component of the set structure.
        !            58:   --   Every set that contains already one unknown of the monomial is
        !            59:   --   marked by setting the corresponding entry in occupied on true.
        !            60:
        !            61:     j : natural;
        !            62:
        !            63:   begin
        !            64:     for k in dg'range loop
        !            65:       j := 1;
        !            66:       while (dg(k) /= 0) and (j <= d) loop
        !            67:         if not occupied(j) and Set_Structure.Is_In(i,j,k)
        !            68:          then occupied(j) := true;
        !            69:               dg(k) := dg(k)-1;
        !            70:         end if;
        !            71:         j := j+1;
        !            72:       end loop;
        !            73:     end loop;
        !            74:   end Divide;
        !            75:
        !            76:   procedure Augment ( ba : in Boolean_Array; index : in out integer ) is
        !            77:
        !            78:   -- DESCRIPTION :
        !            79:   --   Augments the index till ba(index) = false.
        !            80:
        !            81:   begin
        !            82:     while ba(index) loop
        !            83:       index := index + 1;
        !            84:       exit when index >= ba'last;
        !            85:     end loop;
        !            86:   end Augment;
        !            87:
        !            88:   procedure Build_Set_Structure ( i,di : in natural; p : in Poly ) is
        !            89:
        !            90:   -- DESCRIPTION :
        !            91:   --   This procedure builds the set structure for the polynomial p
        !            92:
        !            93:   -- ON ENTRY :
        !            94:   --   i        the number of the equation
        !            95:   --   di       the degree of the polynomial
        !            96:   --   p        the polynomial for the i-th equation
        !            97:
        !            98:     temp : Poly := Null_Poly;
        !            99:
        !           100:     procedure Process ( t : in Term; continue : out boolean ) is
        !           101:
        !           102:       ind : natural := 1; -- number of the set
        !           103:       processed : Boolean_Array(1..di) := (1..di => false);
        !           104:       tdg : Standard_Natural_Vectors.Vector(t.dg'range) := t.dg.all;
        !           105:
        !           106:     begin
        !           107:       if not Dominated(t.dg,temp)
        !           108:        then Divide(tdg,i,di,processed);
        !           109:             Augment(processed,ind);
        !           110:             for k in tdg'range loop
        !           111:               for j in 1..tdg(k) loop
        !           112:                 if not Set_Structure.Is_In(i,ind,k)
        !           113:                  then Set_Structure.Add(i,ind,k);
        !           114:                       processed(ind) := true;
        !           115:                 end if;
        !           116:                Augment(processed,ind);
        !           117:               end loop;
        !           118:             end loop;
        !           119:            Add(temp,t);
        !           120:       end if;
        !           121:       continue := true;
        !           122:     end Process;
        !           123:     procedure Process_Terms is new Visiting_Iterator (Process);
        !           124:
        !           125:   begin
        !           126:     Process_Terms(p);
        !           127:     Clear(temp);
        !           128:   end Build_Set_Structure;
        !           129:
        !           130:   procedure Build_Set_Structure ( p : in Poly_Sys ) is
        !           131:
        !           132:     n : natural := p'length;
        !           133:     ns : Standard_Natural_Vectors.Vector(1..n);
        !           134:
        !           135:   begin
        !           136:     for i in p'range loop
        !           137:       ns(i) := Degree(p(i));
        !           138:     end loop;
        !           139:     Set_Structure.Init(ns);
        !           140:     for i in p'range loop
        !           141:       Build_Set_Structure(i,Degree(p(i)),p(i));
        !           142:     end loop;
        !           143:   end Build_Set_Structure;
        !           144:
        !           145:   procedure Build_Random_Product_System ( n : in natural ) is
        !           146:
        !           147:   -- DESCRIPTION :
        !           148:   --   Based upon the set structure of p, a random product system
        !           149:   --   will be constructed.
        !           150:
        !           151:     h : Vector(0..n);
        !           152:     first : boolean;
        !           153:
        !           154:   begin
        !           155:     for i in 1..n loop
        !           156:       for j in 1..Set_Structure.Number_Of_Sets(i) loop
        !           157:         h := (0..n => Create(0.0));
        !           158:         first := true;
        !           159:        for k in 1..n loop
        !           160:           if Set_Structure.Is_In(i,j,k)
        !           161:            then if first
        !           162:                  then h(k) := Create(1.0); first := false;
        !           163:                  else h(k) := Random1;
        !           164:                 end if;
        !           165:           end if;
        !           166:         end loop;
        !           167:         h(0) := Random1;
        !           168:         Random_Product_System.Add_Hyperplane(i,h);
        !           169:       end loop;
        !           170:     end loop;
        !           171:   end Build_Random_Product_System;
        !           172:
        !           173:   procedure Construct ( p : in Poly_Sys; q : in out Poly_Sys;
        !           174:                        sols : in out Solution_List ) is
        !           175:
        !           176:     nl : natural := 0;
        !           177:     n : natural := p'length;
        !           178:
        !           179:   begin
        !           180:     Build_Set_Structure(p);
        !           181:     Random_Product_System.Init(n);
        !           182:     Build_Random_Product_System(n);
        !           183:     q := Random_Product_System.Polynomial_System;
        !           184:     Random_Product_System.Solve(sols,nl);
        !           185:     Random_Product_System.Clear;
        !           186:   end Construct;
        !           187:
        !           188: end Random_Product_Start_Systems;

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