[BACK]Return to drivers_for_homotopy_creation.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Homotopy

Annotation of OpenXM_contrib/PHC/Ada/Homotopy/drivers_for_homotopy_creation.adb, Revision 1.1

1.1     ! maekawa     1: with integer_io;                         use integer_io;
        !             2: with Communications_with_User;           use Communications_with_User;
        !             3: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
        !             4: with Standard_Complex_Numbers_io;        use Standard_Complex_Numbers_io;
        !             5: with Standard_Random_Numbers;            use Standard_Random_Numbers;
        !             6: with Numbers_io;                         use Numbers_io;
        !             7: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
        !             8: with Homotopy;
        !             9: with Projective_Transformations;         use Projective_Transformations;
        !            10: with Homogenization;                     use Homogenization;
        !            11:
        !            12: package body Drivers_for_Homotopy_Creation is
        !            13:
        !            14:   procedure Info_on_Power is
        !            15:
        !            16:     i : array(1..6) of string(1..65);
        !            17:
        !            18:   begin
        !            19:     i(1):="  The  homotopy  parameter  k  determines  the   power   of   the";
        !            20:     i(2):="continuation  parameter  t.  Taking k>1 has as effect that at the";
        !            21:     i(3):="beginning and at the end of the continuation, changes in t do not";
        !            22:     i(4):="change  the homotopy as much as with a homotopy that is linear in";
        !            23:     i(5):="t so that paths are better to follow.  The default value  k=2  is";
        !            24:     i(6):="recommended.                                                     ";
        !            25:     for j in i'range loop
        !            26:       put_line(i(j));
        !            27:     end loop;
        !            28:   end Info_on_Power;
        !            29:
        !            30:   procedure Info_on_Constant is
        !            31:
        !            32:     i : array(1..3) of string(1..65);
        !            33:
        !            34:   begin
        !            35:     i(1):="  The homotopy parameter a ensures the regularity of the solution";
        !            36:     i(2):="paths, i.e.: by choosing a random complex number for a, all paths";
        !            37:     i(3):="are regular and do not diverge for t<1.                          ";
        !            38:     for j in i'range loop
        !            39:       put_line(i(j));
        !            40:     end loop;
        !            41:   end Info_on_Constant;
        !            42:
        !            43:   procedure Info_on_Target is
        !            44:
        !            45:     i : array(1..7) of string(1..65);
        !            46:
        !            47:   begin
        !            48:     i(1):="  The target value for the continuation parameter t is by default";
        !            49:     i(2):="1.   To  create  stepping stones in the continuation stage, it is";
        !            50:     i(3):="possible to let the continuation stop at t<1, for instance at t =";
        !            51:     i(4):="0.9  or even at a complex value for t.  The solutions at t<1 will";
        !            52:     i(5):="serve at start solutions to take up the continuation in  a  later";
        !            53:     i(6):="stage.   In this stage, the same homotopy parameters k and a must";
        !            54:     i(7):="be used.                                                         ";
        !            55:     for j in i'range loop
        !            56:       put_line(i(j));
        !            57:     end loop;
        !            58:   end Info_on_Target;
        !            59:
        !            60:   procedure Info_on_Exit is
        !            61:
        !            62:     i : constant string
        !            63:       :="By typing 0, the current settings are used in the homotopy.";
        !            64:
        !            65:   begin
        !            66:     put_line(i);
        !            67:   end Info_on_Exit;
        !            68:
        !            69:   procedure Info_on_Projective_Transformation is
        !            70:
        !            71:     i : array(1..5) of string(1..65);
        !            72:
        !            73:   begin
        !            74:     i(1):="  A projective transformation of the homotopy and start solutions";
        !            75:     i(2):="makes  the equations in the polynomials homogeneous and adds an a";
        !            76:     i(3):="random hyperplane.   The  vectors  of  the  start  solutions  are";
        !            77:     i(4):="extended  with an additional unknown.  For solutions at infinity,";
        !            78:     i(5):="this additional unknown equals zero.                             ";
        !            79:     for j in i'range loop
        !            80:       put_line(i(j));
        !            81:     end loop;
        !            82:   end Info_on_Projective_Transformation;
        !            83:
        !            84:   procedure Read_Complex ( x : in out Complex_Number ) is
        !            85:
        !            86:   -- DESCRIPTION :
        !            87:   --   User friendly reading of a complex number.
        !            88:
        !            89:     re,im : double_float;
        !            90:
        !            91:   begin
        !            92:     put("  Give a real number for real part : ");      Read_Double_Float(re);
        !            93:     put("  Give a real number for imaginary part : "); Read_Double_Float(im);
        !            94:     x := Create(re,im);
        !            95:   end Read_Complex;
        !            96:
        !            97:   procedure Default_Homotopy_Settings
        !            98:                 ( k : out positive; a,t : out Complex_Number ) is
        !            99:   begin
        !           100:     k := 2;
        !           101:     a := Random1;
        !           102:     t := Create(1.0);
        !           103:   end Default_Homotopy_Settings;
        !           104:
        !           105:   procedure Default_Homotopy_Settings
        !           106:                 ( k : out positive; a,t : out Complex_Number;
        !           107:                   proj : out boolean ) is
        !           108:   begin
        !           109:     Default_Homotopy_Settings(k,a,t);
        !           110:     proj := false;
        !           111:   end Default_Homotopy_Settings;
        !           112:
        !           113:   procedure Menu_for_Homotopy_Settings
        !           114:                 ( file : in file_type; k : in out positive;
        !           115:                   a,t : in out Complex_Number; proj : in out boolean ) is
        !           116:
        !           117:     ans : character;
        !           118:     choice : string(1..2) := "  ";
        !           119:
        !           120:   begin
        !           121:     new_line;
        !           122:     put_line
        !           123:        ("Homotopy is H(x,t) = a*(1-t)^k * Q(x) + t^k * P(x) = 0, t in [0,1],");
        !           124:     put_line
        !           125:        ("      with Q(x) = 0 a start system, and P(x) = 0 the target system.");
        !           126:     loop
        !           127:       new_line;
        !           128:       put_line("MENU with settings for homotopy :");
        !           129:       put("  relaxation constant k : "); put(k,2); new_line;
        !           130:       put("  regularity constant a : "); put(a); new_line;
        !           131:       put("  target value for t    : "); put(t); new_line;
        !           132:       put("  projective transformation : ");
        !           133:            if proj then put("yes"); else put("no"); end if; new_line;
        !           134:       put("Type k, a, t, or p to change, preceded by i for info."
        !           135:           & "  Type 0 to exit : ");
        !           136:       Ask_Alternative(choice,"katp0",'i');
        !           137:       exit when choice(1) = '0';
        !           138:       case choice(1) is
        !           139:         when 'k' =>
        !           140:           put("Give a value (1,2, or 3) for the relaxation constant k : ");
        !           141:           Read_Positive(k);
        !           142:         when 'a' =>
        !           143:           put_line("Reading a complex value for the regularity constant a.");
        !           144:           loop
        !           145:             Read_Complex(a);
        !           146:             exit when AbsVal(a) /= 0.0;
        !           147:             put_line("The value 0 for a is not allowed! Try again.");
        !           148:           end loop;
        !           149:         when 't' =>
        !           150:           put_line("Reading the (complex) target value for t.");
        !           151:           Read_Complex(t);
        !           152:         when 'p' =>
        !           153:           put("Do you want a projective transformation? ");
        !           154:           Ask_Yes_or_No(ans); proj := (ans ='y');
        !           155:         when 'i' =>
        !           156:           new_line;
        !           157:           case choice(2) is
        !           158:             when 'k' => Info_on_Power;
        !           159:             when 'a' => Info_on_Constant;
        !           160:             when 't' => Info_on_Target;
        !           161:             when 'p' => Info_on_Projective_Transformation;
        !           162:             when '0' => Info_on_Exit;
        !           163:             when others => null;
        !           164:           end case;
        !           165:         when others => null;
        !           166:       end case;
        !           167:     end loop;
        !           168:     new_line(file);
        !           169:     put_line(file,"HOMOTOPY PARAMETERS :");
        !           170:     put(file,"  k : "); put(file,k,2); new_line(file);
        !           171:     put(file,"  a : "); put(file,a);   new_line(file);
        !           172:     put(file,"  t : "); put(file,t);   new_line(file);
        !           173:     if proj
        !           174:      then put_line(file,"  projective transformation");
        !           175:      else put_line(file,"  no projective transformation");
        !           176:     end if;
        !           177:   end Menu_for_Homotopy_Settings;
        !           178:
        !           179:   procedure Menu_for_Homotopy_Settings
        !           180:                 ( file : in file_type; k : in out positive;
        !           181:                   a,t : in out Complex_Number ) is
        !           182:
        !           183:     choice : string(1..2) := "  ";
        !           184:
        !           185:   begin
        !           186:     new_line;
        !           187:     put_line
        !           188:        ("Homotopy is H(x,t) = a*(1-t)^k * Q(x) + t^k * P(x) = 0, t in [0,1],");
        !           189:     put_line
        !           190:        ("      with Q(x) = 0 a start system, and P(x) = 0 the target system.");
        !           191:     loop
        !           192:       new_line;
        !           193:       put_line("MENU with settings for homotopy :");
        !           194:       put("  relaxation constant k : "); put(k,2); new_line;
        !           195:       put("  regularity constant a : "); put(a); new_line;
        !           196:       put("  target value for t    : "); put(t); new_line;
        !           197:       put("Type k, a, or t to change, preceded by i for info."
        !           198:           & "  Type 0 to exit : ");
        !           199:       Ask_Alternative(choice,"kat0",'i');
        !           200:       exit when choice(1) = '0';
        !           201:       case choice(1) is
        !           202:         when 'k' =>
        !           203:           put("Give a value (1,2, or 3) for the relaxation constant k : ");
        !           204:           Read_Positive(k);
        !           205:         when 'a' =>
        !           206:           put_line("Reading a complex value for the regularity constant a.");
        !           207:           loop
        !           208:             Read_Complex(a);
        !           209:             exit when AbsVal(a) /= 0.0;
        !           210:             put_line("The value 0 for a is not allowed! Try again.");
        !           211:           end loop;
        !           212:         when 't' =>
        !           213:           put_line("Reading the (complex) target value for t.");
        !           214:           Read_Complex(t);
        !           215:         when 'i' =>
        !           216:           new_line;
        !           217:           case choice(2) is
        !           218:             when 'k' => Info_on_Power;
        !           219:             when 'a' => Info_on_Constant;
        !           220:             when 't' => Info_on_Target;
        !           221:             when '0' => Info_on_Exit;
        !           222:             when others => null;
        !           223:           end case;
        !           224:         when others => null;
        !           225:       end case;
        !           226:     end loop;
        !           227:     new_line(file);
        !           228:     put_line(file,"HOMOTOPY PARAMETERS :");
        !           229:     put(file,"  k : "); put(file,k,2); new_line(file);
        !           230:     put(file,"  a : "); put(file,a);   new_line(file);
        !           231:     put(file,"  t : "); put(file,t);   new_line(file);
        !           232:   end Menu_for_Homotopy_Settings;
        !           233:
        !           234:   procedure Driver_for_Homotopy_Construction
        !           235:                ( file : in file_type; p,q : in out Poly_Sys;
        !           236:                  qsols : in out Solution_List; target : out Complex_Number ) is
        !           237:
        !           238:     k : positive;
        !           239:     a,t : Complex_Number;
        !           240:     prt : boolean;
        !           241:
        !           242:   begin
        !           243:     Default_Homotopy_Settings(k,a,t,prt);
        !           244:     Menu_for_Homotopy_Settings(file,k,a,t,prt);
        !           245:     target := t;
        !           246:     if prt
        !           247:      then Projective_Transformation(p);
        !           248:           Projective_Transformation(q);
        !           249:           Projective_Transformation(qsols);
        !           250:           declare
        !           251:             pp,sysp : Poly_Sys(p'first..p'last+1);
        !           252:           begin
        !           253:             pp := Add_Random_Hyperplanes(p,1,true);
        !           254:             sysp := Add_Standard_Hyperplanes(q,1);
        !           255:             Homotopy.Create(pp,sysp,k,a);
        !           256:             Clear(pp); Clear(sysp);
        !           257:           end;
        !           258:      else Homotopy.Create(p,q,k,a);
        !           259:     end if;
        !           260:   end Driver_for_Homotopy_Construction;
        !           261:
        !           262: end Drivers_for_Homotopy_Creation;

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