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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/symmetric_randomize.adb, Revision 1.1.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_Integer_Vectors;           use Standard_Integer_Vectors;
                      4: with Standard_Complex_Laur_Polys;        use Standard_Complex_Laur_Polys;
                      5: with Permutations,Permute_Operations;    use Permutations,Permute_Operations;
                      6:
                      7: function Symmetric_Randomize ( p : Laur_Sys; v,w : List_of_Permutations )
                      8:                              return Laur_Sys is
                      9:
                     10:   res : Laur_Sys(p'range);
                     11:
                     12:   procedure Symmetric_Randomize_Terms ( index : in natural; py : in Poly ) is
                     13:
                     14:     tpy : Term;
                     15:
                     16:     procedure Permute_and_Randomize ( t : in Term ) is
                     17:
                     18:       tmpv,tmpw : List_of_Permutations;
                     19:
                     20:     begin
                     21:       tmpv := v;  tmpw := w;
                     22:       while not Is_Null(tmpv) loop
                     23:         declare
                     24:           permt : Term := Permutation(Head_Of(tmpv).all)*t;
                     25:           indw : natural := Head_Of(tmpw)(index);
                     26:         begin
                     27:           if Coeff(res(indw),permt.dg) = Create(0.0)
                     28:            then Add(res(indw),permt);
                     29:           end if;
                     30:           Clear(permt);
                     31:         end;
                     32:         tmpv := Tail_Of(tmpv);
                     33:         tmpw := Tail_Of(tmpw);
                     34:       end loop;
                     35:     end Permute_and_Randomize;
                     36:
                     37:     procedure Pick_Term ( t : in Term; cont : out boolean ) is
                     38:     begin
                     39:       if Coeff(res(index),t.dg) = Create(0.0)
                     40:        then Copy(t,tpy);
                     41:             tpy.cf := Random1;
                     42:             cont := false;
                     43:        else cont := true;
                     44:       end if;
                     45:     end Pick_Term;
                     46:     procedure Pick_A_Term is new Visiting_Iterator(Pick_Term);
                     47:
                     48:   begin
                     49:     tpy.cf := Create(0.0);
                     50:     Pick_A_Term(py);
                     51:     if tpy.cf /= Create(0.0)
                     52:      then Permute_and_Randomize(tpy);
                     53:           Clear(tpy);
                     54:     end if;
                     55:   end Symmetric_Randomize_Terms;
                     56:
                     57: begin
                     58:   res := (res'range => Null_Poly);
                     59:   for k in res'range loop
                     60:     while Number_of_Terms(res(k)) < Number_of_Terms(p(k)) loop
                     61:       Symmetric_Randomize_Terms(k,p(k));
                     62:     end loop;
                     63:   end loop;
                     64:   return res;
                     65: end Symmetric_Randomize;

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