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

Annotation of OpenXM_contrib/PHC/Ada/Continuation/continuation_parameters_io.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_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
        !             5: with Numbers_io;                         use Numbers_io;
        !             6: with Characters_and_Numbers;
        !             7: with Continuation_Parameters;            use Continuation_Parameters;
        !             8:
        !             9: package body Continuation_Parameters_io is
        !            10:
        !            11: -- AUXILIARIES :
        !            12:
        !            13:   function Predictor_Banner ( pred_type : natural ) return string is
        !            14:
        !            15:   -- DESCRIPTION :
        !            16:   --   Returns banner for the corresponding predictor type.
        !            17:
        !            18:     ss : constant string := "( x:Sec,t:Rea )";
        !            19:     sc : constant string := "( x:Sec,t:Com )";
        !            20:     sg : constant string := "( x:Sec,t:Geo )";
        !            21:     ts : constant string := "( x:Tan,t:Rea )";
        !            22:     tc : constant string := "( x:Tan,t:Com )";
        !            23:     tg : constant string := "( x:Tan,t:Geo )";
        !            24:     hs : constant string := "( x:Her,t:Rea )";
        !            25:     uu : constant string := " no predictor  ";
        !            26:
        !            27:   begin
        !            28:     case pred_type is
        !            29:       when 0 => return ss;
        !            30:       when 1 => return sc;
        !            31:       when 2 => return sg;
        !            32:       when 3 => return ts;
        !            33:       when 4 => return tc;
        !            34:       when 5 => return tg;
        !            35:       when 6 => return hs;
        !            36:       when others => return uu;
        !            37:     end case;
        !            38:   end Predictor_Banner;
        !            39:
        !            40:   procedure Read_Positive_Float ( f : in out double_float ) is
        !            41:   begin
        !            42:     loop
        !            43:       Read_Double_Float(f);
        !            44:       exit when f > 0.0;
        !            45:       put("Zero or negative value not allowed, try again : ");
        !            46:     end loop;
        !            47:   end Read_Positive_Float;
        !            48:
        !            49: -- INFORMATION BALLOONS :
        !            50:
        !            51:   procedure Condition_Info is
        !            52:
        !            53:     i : array(1..4) of string(1..65);
        !            54:
        !            55:   begin
        !            56:     i(1):="  This global parameter  can  be  used  to  tune  the  parameters";
        !            57:     i(2):="according to the general expectancy of how difficult the solution";
        !            58:     i(3):="paths will be.  Low values of this parameter lead to a loose path";
        !            59:     i(4):="tracking, whereas higher values tighten up the path-following.   ";
        !            60:     for j in i'range loop
        !            61:       put_line(i(j));
        !            62:     end loop;
        !            63:   end Condition_Info;
        !            64:
        !            65:   procedure Number_of_Paths_Info is
        !            66:
        !            67:     i : array(1..9) of string(1..65);
        !            68:
        !            69:   begin
        !            70:     i(1):="  In simultaneous path-following, the same discretization for the";
        !            71:     i(2):="values  of  the  continuation  parameter  is used for a number of";
        !            72:     i(3):="paths.   Clustering  of  solution   paths   is   checked   during";
        !            73:     i(4):="continuation   for   the   number  of  paths  that  are  followed";
        !            74:     i(5):="simultaneously.                                                  ";
        !            75:     i(6):="  In sequential path-following, i.e., when this parameter  equals";
        !            76:     i(7):="one,  the  step sizes are adjusted according to the difficulty of";
        !            77:     i(8):="the current path being followed.  In this case, a difficult  path";
        !            78:     i(9):="does not slow down the continuation for the other ones.          ";
        !            79:     for j in i'range loop
        !            80:       put_line(i(j));
        !            81:     end loop;
        !            82:   end Number_of_Paths_Info;
        !            83:
        !            84:   procedure Max_Steps_Info is
        !            85:
        !            86:     i : array(1..3) of string(1..65);
        !            87:
        !            88:   begin
        !            89:     i(1):="  This parameter bounds the amount of work along a solution path.";
        !            90:     i(2):="Continuation for the path being followed stops when the number of";
        !            91:     i(3):="steps exceeds this threshold value.                              ";
        !            92:     for j in i'range loop
        !            93:       put_line(i(j));
        !            94:     end loop;
        !            95:   end Max_Steps_Info;
        !            96:
        !            97:   procedure Distance_Info is
        !            98:
        !            99:     i : array(1..6) of string(1..65);
        !           100:
        !           101:   begin
        !           102:     i(1):="  Tracking solution paths is organized in two stages.  As t<1, no";
        !           103:     i(2):="singularities  are  likely to occur and paths can be tracked more";
        !           104:     i(3):="loosely.  When t gets close to 1, paths may converge to  singular";
        !           105:     i(4):="solutions or diverge to infinity, so they have to be tracked more";
        !           106:     i(5):="carefully.  This distance marks the  switch  towards  the  second";
        !           107:     i(6):="stage, that is the so-called end game.                           ";
        !           108:     for j in i'range loop
        !           109:       put_line(i(j));
        !           110:     end loop;
        !           111:   end Distance_Info;
        !           112:
        !           113:   procedure Extrapolation_Order_Info is
        !           114:
        !           115:     i : array(1..5) of string(1..65);
        !           116:
        !           117:   begin
        !           118:     i(1):="  The direction of a diverging solution path provides a normal to";
        !           119:     i(2):="a  face  of the system that certificates the deficiency.  In this";
        !           120:     i(3):="polyhedral end game, extrapolation is used to  determine  winding";
        !           121:     i(4):="numbers.   When  the  order of the extrapolator equals zero, then";
        !           122:     i(5):="the polyhedral end game is turned off.                           ";
        !           123:     for j in i'range loop
        !           124:       put_line(i(j));
        !           125:     end loop;
        !           126:   end Extrapolation_Order_Info;
        !           127:
        !           128:   procedure Re_Run_Info is
        !           129:
        !           130:     i : array(1..4) of string(1..65);
        !           131:
        !           132:   begin
        !           133:     i(1):="  Solution paths may be clustered at the end of the continuation.";
        !           134:     i(2):="If  the  number  of  re-runs  is  higher than one, then clustered";
        !           135:     i(3):="solution paths  are  re-computed  by  following  the  paths  more";
        !           136:     i(4):="closely.  Setting this value to zero turns off this facility.    ";
        !           137:     for j in i'range loop
        !           138:       put_line(i(j));
        !           139:     end loop;
        !           140:   end Re_Run_Info;
        !           141:
        !           142:   procedure Predictor_Info is
        !           143:
        !           144:     i : array(1..11) of string(1..65);
        !           145:
        !           146:   begin
        !           147:     i( 1):="  We distinguish between predictors for the solution vector x and";
        !           148:     i( 2):="the  continuation  parameter  t.   The  secant predictor for x is";
        !           149:     i( 3):="based on linear extrapolation, whereas the tangent predictor uses";
        !           150:     i( 4):="the Jacobian matrix to extrapolate.                              ";
        !           151:     i( 5):="  For t, three  different  predictors  are  provided.   The  real";
        !           152:     i( 6):="predictor  simply  augments  t  with  the step size.  The complex";
        !           153:     i( 7):="predictor takes values in the complex plane to circumvent  values";
        !           154:     i( 8):="of  t  for  which  the corresponding system is badly conditioned.";
        !           155:     i( 9):="The geometric predictor  generates  values  for  t  so  that  the";
        !           156:     i(10):="distances  to  the  target  value behave like a geometric series.";
        !           157:     i(11):="The latter predictor is useful in a polyhedral end game.         ";
        !           158:     for j in i'range loop
        !           159:       put_line(i(j));
        !           160:     end loop;
        !           161:   end Predictor_Info;
        !           162:
        !           163:   procedure Min_Step_Size_Info is
        !           164:
        !           165:     i : array(1..4) of string(1..65);
        !           166:
        !           167:   begin
        !           168:     i(1):="  This is a lower bound on the step  size  for  the  continuation";
        !           169:     i(2):="parameter.  Continuation for the path being followed stops when a";
        !           170:     i(3):="required reduction of the step size yields a step length that  is";
        !           171:     i(4):="lower than the minimum step size.                                ";
        !           172:     for j in i'range loop
        !           173:       put_line(i(j));
        !           174:     end loop;
        !           175:   end Min_Step_Size_Info;
        !           176:
        !           177:   procedure Max_Step_Size_Info is
        !           178:
        !           179:     i : array(1..4) of string(1..65);
        !           180:
        !           181:   begin
        !           182:     i(1):="  This is an upper bound on the step size  for  the  continuation";
        !           183:     i(2):="parameter.   An  expansion  of  the  step size that yields a step";
        !           184:     i(3):="length that is larger than this threshold sets the step  size  to";
        !           185:     i(4):="this threshold.                                                  ";
        !           186:     for j in i'range loop
        !           187:       put_line(i(j));
        !           188:     end loop;
        !           189:   end Max_Step_Size_Info;
        !           190:
        !           191:   procedure Reduction_Factor_Info is
        !           192:
        !           193:     i : array(1..3) of string(1..65);
        !           194:
        !           195:   begin
        !           196:     i(1):="  When the corrector  does  not  manage  to  reach  the  required";
        !           197:     i(2):="accuracy  within  the allowed number of iterations, the step size";
        !           198:     i(3):="will be reduced by multiplication with the reduction factor.     ";
        !           199:     for j in i'range loop
        !           200:       put_line(i(j));
        !           201:     end loop;
        !           202:   end Reduction_Factor_Info;
        !           203:
        !           204:   procedure Expansion_Factor_Info is
        !           205:
        !           206:     i : array(1..4) of string(1..65);
        !           207:
        !           208:   begin
        !           209:     i(1):="  When the corrector has reached the required accuracy within the";
        !           210:     i(2):="allowed  number  of iterations, for a number of consecutive times";
        !           211:     i(3):="higher than the  expansion  threshold,  the  step  size  will  be";
        !           212:     i(4):="enlarged by multiplication by the expansion factor.              ";
        !           213:     for j in i'range loop
        !           214:       put_line(i(j));
        !           215:     end loop;
        !           216:   end Expansion_Factor_Info;
        !           217:
        !           218:   procedure Expansion_Threshold_Info is
        !           219:
        !           220:     i : array(1..7) of string(1..65);
        !           221:
        !           222:   begin
        !           223:     i(1):="  Before enlarging the step size along  a  path,  the  number  of";
        !           224:     i(2):="consecutive  successful  steps must pass the expansion threshold.";
        !           225:     i(3):="A step is successful when the  corrector  manages  to  reach  the";
        !           226:     i(4):="required accuracy within the allowed number of iterations.       ";
        !           227:     i(5):="  At the end of the path, this threshold  bounds  the  number  of";
        !           228:     i(6):="consecutive  equal  guesses  of the winding number $m$ before the";
        !           229:     i(7):="polyhedral end game can modify it.                               ";
        !           230:     for j in i'range loop
        !           231:       put_line(i(j));
        !           232:     end loop;
        !           233:   end Expansion_Threshold_Info;
        !           234:
        !           235:   procedure Number_of_Iterations_Info is
        !           236:
        !           237:     i : array(1..7) of string(1..65);
        !           238:
        !           239:   begin
        !           240:     i(1):="  The corrector stops when the desired  accuracy  is  reached  or";
        !           241:     i(2):="when it has exhausted its maximum number of iterations.          ";
        !           242:     i(3):="  A low maximum enforces quadratic convergence and keeps the path";
        !           243:     i(4):="tracker close to the solution paths.                             ";
        !           244:     i(5):="  A higher maximum may be needed at the end of the solution path,";
        !           245:     i(6):="when  quadratic  convergence  can  no  longer  be obtained due to";
        !           246:     i(7):="singularities.                                                   ";
        !           247:     for j in i'range loop
        !           248:       put_line(i(j));
        !           249:     end loop;
        !           250:   end Number_of_Iterations_Info;
        !           251:
        !           252:   procedure Relative_Residual_Info is
        !           253:
        !           254:     i : array(1..5) of string(1..65);
        !           255:
        !           256:   begin
        !           257:     i(1):="  The  residual  is  the  norm  of  the  vector  obtained   after";
        !           258:     i(2):="evaluating  the  current  approximation  vector in the polynomial";
        !           259:     i(3):="system.  The corrector stops when the  residual  divided  by  the";
        !           260:     i(4):="norm  of  the  approximation vector is lower than or equal to the";
        !           261:     i(5):="required precision.                                              ";
        !           262:     for j in i'range loop
        !           263:       put_line(i(j));
        !           264:     end loop;
        !           265:   end Relative_Residual_Info;
        !           266:
        !           267:   procedure Absolute_Residual_Info is
        !           268:
        !           269:     i : array(1..4) of string(1..65);
        !           270:
        !           271:   begin
        !           272:     i(1):="  The  residual  is  the  norm  of  the  vector  obtained   after";
        !           273:     i(2):="evaluating  the  current  approximation  vector in the polynomial";
        !           274:     i(3):="system.  The corrector stops when the residual is lower  than  or";
        !           275:     i(4):="equal to the required precision.                                 ";
        !           276:     for j in i'range loop
        !           277:       put_line(i(j));
        !           278:     end loop;
        !           279:   end Absolute_Residual_Info;
        !           280:
        !           281:   procedure Relative_Correction_Info is
        !           282:
        !           283:     i : array(1..4) of string(1..65);
        !           284:
        !           285:   begin
        !           286:     i(1):="  The correction is the norm of the last vector  used  to  update";
        !           287:     i(2):="the  current  approximation vector.  The corrector stops when the";
        !           288:     i(3):="correction divided by the norm of  the  approximation  vector  is";
        !           289:     i(4):="lower than or equal to the required precision.                   ";
        !           290:     for j in i'range loop
        !           291:       put_line(i(j));
        !           292:     end loop;
        !           293:   end Relative_Correction_Info;
        !           294:
        !           295:   procedure Absolute_Correction_Info is
        !           296:
        !           297:     i : array(1..3) of string(1..65);
        !           298:
        !           299:   begin
        !           300:     i(1):="  The correction is the norm of the last vector  used  to  update";
        !           301:     i(2):="the  current  approximation vector.  The corrector stops when the";
        !           302:     i(3):="correction is lower than or equal to the required precision.     ";
        !           303:     for j in i'range loop
        !           304:       put_line(i(j));
        !           305:     end loop;
        !           306:   end Absolute_Correction_Info;
        !           307:
        !           308:   procedure Singular_Info is
        !           309:
        !           310:     i : array(1..2) of string(1..65);
        !           311:
        !           312:   begin
        !           313:     i(1):="  A condition is considered as singular when the condition number";
        !           314:     i(2):="of the Jacobian matrix passes the given threshold value.         ";
        !           315:     for j in i'range loop
        !           316:       put_line(i(j));
        !           317:     end loop;
        !           318:   end Singular_Info;
        !           319:
        !           320:   procedure Clustered_Info is
        !           321:
        !           322:     i : array(1..3) of string(1..65);
        !           323:
        !           324:   begin
        !           325:     i(1):="  Two solutions are considered as  clustered  when  the  distance";
        !           326:     i(2):="between  all  corresponding  components is smaller than the given";
        !           327:     i(3):="threshold value.                                                 ";
        !           328:     for j in i'range loop
        !           329:       put_line(i(j));
        !           330:     end loop;
        !           331:   end Clustered_Info;
        !           332:
        !           333:   procedure Infinity_Info is
        !           334:
        !           335:     i : array(1..6) of string(1..65);
        !           336:
        !           337:   begin
        !           338:     i(1):="  A solution is considered to diverge to infinity when  its  norm";
        !           339:     i(2):="passes  the given threshold value, in case of affine coordinates,";
        !           340:     i(3):="or, in case of projective coordinates, when the added  coordinate";
        !           341:     i(4):="becomes   smaller  than  the  inverse  of  the  threshold  value.";
        !           342:     i(5):="Continuation for the path being followed stops when  it  diverges";
        !           343:     i(6):="to infinity.                                                     ";
        !           344:     for j in i'range loop
        !           345:       put_line(i(j));
        !           346:     end loop;
        !           347:   end Infinity_Info;
        !           348:
        !           349:   procedure Exit_Info is
        !           350:
        !           351:     i : constant string
        !           352:       :="By typing 0, the current continuation parameters are used.";
        !           353:
        !           354:   begin
        !           355:     put_line(i);
        !           356:   end Exit_Info;
        !           357:
        !           358:   procedure Menu_Predictor ( pred_type : out natural ) is
        !           359:
        !           360:   -- DESCRIPTION :
        !           361:   --   Shows the menu with available predictors and lets the user choose.
        !           362:
        !           363:     ans : character;
        !           364:     m : array(0..7) of string(1..65);
        !           365:
        !           366:   begin
        !           367:     m(0):="MENU with Predictors for Solution x & Continuation Parameter t : ";
        !           368:     m(1):="  0. Secant  : linear extrapolation & Real      increment for t; ";
        !           369:     m(2):="  1. Secant  :  based on 2 previous & Complex   increment for t; ";
        !           370:     m(3):="  2. Secant  :    solution values   & Geometric series    for t; ";
        !           371:     m(4):="  3. Tangent : linear extrapolation & Real      increment for t; ";
        !           372:     m(5):="  4. Tangent :   based on Jacobi    & Complex   increment for t; ";
        !           373:     m(6):="  5. Tangent :  matrix at solution  & Geometric series    for t; ";
        !           374:     m(7):="  6. Hermite : cubic extrapolation  & Real      increment for t; ";
        !           375:     for i in m'range loop
        !           376:       put_line(m(i));
        !           377:     end loop;
        !           378:     put("Select predictor by typing number between 0 and 6 : ");
        !           379:     Ask_Alternative(ans,"0123456");
        !           380:     pred_type := Characters_and_Numbers.Convert(ans);
        !           381:   end Menu_Predictor;
        !           382:
        !           383: -- TARGET ROUTINES :
        !           384:
        !           385:   procedure put is
        !           386:   begin
        !           387:     Continuation_Parameters_io.put(Standard_Output);
        !           388:   end put;
        !           389:
        !           390:   procedure put ( file : in file_type ) is
        !           391:
        !           392:     banner_path : constant string := Predictor_Banner(predictor_path_type);
        !           393:     banner_endg : constant string := Predictor_Banner(predictor_endg_type);
        !           394:
        !           395:   begin
        !           396:
        !           397:     put_line(file,"GLOBAL MONITOR : ");
        !           398:     put(file,"  1. the condition of the homotopy           : ");
        !           399:     put(file,condition,1); new_line(file);
        !           400:     put(file,"  2. number of paths tracked simultaneously  : ");
        !           401:     put(file,block_size,1); new_line(file);
        !           402:     put(file,"  3. maximum number of steps along a path    : ");
        !           403:     put(file,max_steps,1); new_line(file);
        !           404:     put(file,"  4. distance from target to start end game  : ");
        !           405:     put(file,start_end_game,1,3,3); new_line(file);
        !           406:     put(file,"  5. order of extrapolator in end game       : ");
        !           407:     put(file,endext_order,1); new_line(file);
        !           408:     put(file,"  6. maximum number of re-runs               : ");
        !           409:     put(file,max_reruns,1); new_line(file);
        !           410:
        !           411:     put_line(file,"STEP CONTROL (PREDICTOR) : "
        !           412:                           & "                   along path : end game");
        !           413:
        !           414:     put(file,"  7: 8. type " & banner_path & ":"
        !           415:                                          & banner_endg & " : ");
        !           416:     put(file,predictor_path_type,1);    put(file,"         : ");
        !           417:     put(file,predictor_endg_type,1); new_line(file);
        !           418:     put(file,"  9:10. minimum step size                    : ");
        !           419:     put(file,min_path_step_size,1,3,3);         put(file," : ");
        !           420:     put(file,min_endg_step_size,1,3,3); new_line(file);
        !           421:     put(file," 11:12. maximum step size                    : ");
        !           422:     put(file,max_path_step_size,1,3,3);         put(file," : ");
        !           423:     put(file,max_endg_step_size,1,3,3); new_line(file);
        !           424:     put(file," 13:14. reduction factor for step size       : ");
        !           425:     put(file,reduction_path_factor,1,3,3);      put(file," : ");
        !           426:     put(file,reduction_endg_factor,1,3,3); new_line(file);
        !           427:     put(file," 15:16. expansion factor for step size       : ");
        !           428:     put(file,expansion_path_factor,1,3,3);      put(file," : ");
        !           429:     put(file,expansion_endg_factor,1,3,3); new_line(file);
        !           430:     put(file," 17:18. expansion threshold                  : ");
        !           431:     put(file,success_path_steps,1);     put(file,"         : ");
        !           432:     put(file,success_endg_steps,1); new_line(file);
        !           433:
        !           434:     put_line(file,"PATH CLOSENESS (CORRECTOR) : "
        !           435:                             & "                 along path : end game");
        !           436:
        !           437:     put(file," 19:20. maximum number of iterations         : ");
        !           438:     put(file,max_path_iter,1);          put(file,"         : ");
        !           439:     put(file,max_endg_iter,1); new_line(file);
        !           440:     put(file," 21:22. relative precision for residuals     : ");
        !           441:     put(file,relative_path_residual,1,3,3);     put(file," : ");
        !           442:     put(file,relative_endg_residual,1,3,3); new_line(file);
        !           443:     put(file," 23:24. absolute precision for residuals     : ");
        !           444:     put(file,absolute_path_residual,1,3,3);     put(file," : ");
        !           445:     put(file,absolute_endg_residual,1,3,3); new_line(file);
        !           446:     put(file," 25:26. relative precision for corrections   : ");
        !           447:     put(file,relative_path_correction,1,3,3);   put(file," : ");
        !           448:     put(file,relative_endg_correction,1,3,3); new_line(file);
        !           449:     put(file," 27:28. absolute precision for corrections   : ");
        !           450:     put(file,absolute_path_correction,1,3,3);   put(file," : ");
        !           451:     put(file,absolute_endg_correction,1,3,3); new_line(file);
        !           452:
        !           453:     put_line(file,"SOLUTIONS (TOLERANCES) : "
        !           454:                         & "                     along path : end game");
        !           455:
        !           456:     put(file," 29:30. inverse condition of Jacobian        : ");
        !           457:     put(file,tol_path_inverse_condition,1,3,3); put(file," : ");
        !           458:     put(file,tol_endg_inverse_condition,1,3,3); new_line(file);
        !           459:     put(file," 31:32. clustering of solutions              : ");
        !           460:     put(file,tol_path_distance,1,3,3);          put(file," : ");
        !           461:     put(file,tol_endg_distance,1,3,3); new_line(file);
        !           462:     put(file," 33:34. solution at infinity                 : ");
        !           463:     put(file,tol_path_at_infinity,1,3,3);       put(file," : ");
        !           464:     put(file,tol_endg_at_infinity,1,3,3); new_line(file);
        !           465:
        !           466:   end put;
        !           467:
        !           468:   procedure get_parameter ( k : in natural ) is
        !           469:   begin
        !           470:     case k is
        !           471: -- GLOBAL MONITOR :
        !           472:       when  1 => put("  condition parameter : ");  Read_Natural(condition);
        !           473:                  Continuation_Parameters.Tune(condition);
        !           474:       when  2 => put("  number of paths tracked simultaneously : ");
        !           475:                  Read_Positive(block_size);
        !           476:       when  3 => put("  maximum number of steps along a path : ");
        !           477:                  Read_Positive(max_steps);
        !           478:       when  4 => put("  distance from target to start end game : ");
        !           479:                  Read_Positive_Float(start_end_game);
        !           480:       when  5 => put("  order of extrapolator in end game : ");
        !           481:                  Read_Natural(endext_order);
        !           482:                  Continuation_Parameters.Tune_Endgm_Pred(endext_order);
        !           483:       when  6 => put("  maximum number of re-runs : ");
        !           484:                  Read_Natural(max_reruns);
        !           485: -- STEP CONTROL (PREDICTOR) :
        !           486:       when  7 => Menu_Predictor(predictor_path_type);
        !           487:       when  8 => Menu_Predictor(predictor_endg_type);
        !           488:       when  9 => put("  minimum step size along the path : ");
        !           489:                  Read_Positive_Float(min_path_step_size);
        !           490:       when 10 => put("  minimum step size at end of path : ");
        !           491:                  Read_Positive_Float(min_endg_step_size);
        !           492:       when 11 => put("  maximum step size along the path : ");
        !           493:                  Read_Positive_Float(max_path_step_size);
        !           494:       when 12 => put("  maximum step size at end of path : ");
        !           495:                  Read_Positive_Float(max_endg_step_size);
        !           496:       when 13 => put("  reduction factor for step size along the path : ");
        !           497:                  Read_Positive_Float(reduction_path_factor);
        !           498:       when 14 => put("  reduction factor for step size at end of path : ");
        !           499:                  Read_Positive_Float(reduction_endg_factor);
        !           500:       when 15 => put("  expansion factor for step size along the path : ");
        !           501:                  Read_Positive_Float(expansion_path_factor);
        !           502:       when 16 => put("  expansion factor for step size at end of path : ");
        !           503:                  Read_Positive_Float(expansion_endg_factor);
        !           504:       when 17 => put("  expansion threshold along the path : ");
        !           505:                  Read_Positive(success_path_steps);
        !           506:       when 18 => put("  expansion threshold at end of path : ");
        !           507:                  Read_Positive(success_endg_steps);
        !           508: -- PATH CLOSENESS (CORRECTOR) :
        !           509:       when 19 => put("  maximum number of iterations along the path : ");
        !           510:                  Read_Positive(max_path_iter);
        !           511:       when 20 => put("  maximum number of iterations at end of path : ");
        !           512:                  Read_Positive(max_endg_iter);
        !           513:       when 21 => put("  relative precision for residual along the path : ");
        !           514:                  Read_Positive_Float(relative_path_residual);
        !           515:       when 22 => put("  relative precision for residual at end of path : ");
        !           516:                  Read_Positive_Float(relative_endg_residual);
        !           517:       when 23 => put("  absolute precision for residual along the path : ");
        !           518:                  Read_Positive_Float(absolute_path_residual);
        !           519:       when 24 => put("  absolute precision for residual at end of path : ");
        !           520:                  Read_Positive_Float(absolute_endg_residual);
        !           521:       when 25 => put("  relative precision for correction along the path : ");
        !           522:                  Read_Positive_Float(relative_path_correction);
        !           523:       when 26 => put("  relative precision for correction at end of path : ");
        !           524:                  Read_Positive_Float(relative_endg_correction);
        !           525:       when 27 => put("  absolute precision for correction along the path : ");
        !           526:                  Read_Positive_Float(absolute_path_correction);
        !           527:       when 28 => put("  absolute precision for correction at end of path : ");
        !           528:                  Read_Positive_Float(absolute_endg_correction);
        !           529: -- SOLUTIONS (TOLERANCES) :
        !           530:       when 29 => put("  inverse condition of Jacobian along the path : ");
        !           531:                  Read_Positive_Float(tol_path_inverse_condition);
        !           532:       when 30 => put("  inverse condition of Jacobian at end of path : ");
        !           533:                  Read_Positive_Float(tol_endg_inverse_condition);
        !           534:       when 31 => put("  clustering of solutions along the path : ");
        !           535:                  Read_Positive_Float(tol_path_distance);
        !           536:       when 32 => put("  clustering of solutions at end of path : ");
        !           537:                  Read_Positive_Float(tol_endg_distance);
        !           538:       when 33 => put("  solution at infinity along the path : ");
        !           539:                  Read_Positive_Float(tol_path_at_infinity);
        !           540:       when 34 => put("  solution at infinity at end of path : ");
        !           541:                  Read_Positive_Float(tol_endg_at_infinity);
        !           542:       when others => null;
        !           543:     end case;
        !           544:   end get_parameter;
        !           545:
        !           546:   procedure get_parameter_with_info ( k : in natural ) is
        !           547:
        !           548:     ans : character;
        !           549:
        !           550:   begin
        !           551:     new_line;
        !           552:     case k is
        !           553:       when  1 => Condition_Info;                             -- GLOBAL MONITOR
        !           554:       when  2 => Number_of_Paths_Info;
        !           555:       when  3 => Max_Steps_Info;
        !           556:       when  4 => Distance_Info;
        !           557:       when  5 => Extrapolation_Order_Info;
        !           558:       when  6 => Re_Run_Info;
        !           559:       when  7 |  8 => Predictor_Info;              -- STEP CONTROL (PREDICTOR)
        !           560:       when  9 | 10 => Min_Step_Size_Info;
        !           561:       when 11 | 12 => Max_Step_Size_Info;
        !           562:       when 13 | 14 => Reduction_Factor_Info;
        !           563:       when 15 | 16 => Expansion_Factor_Info;
        !           564:       when 17 | 18 => Expansion_Threshold_Info;
        !           565:       when 19 | 20 => Number_of_Iterations_Info; -- PATH CLOSENESS (CORRECTOR)
        !           566:       when 21 | 22 => Relative_Residual_Info;
        !           567:       when 23 | 24 => Absolute_Residual_Info;
        !           568:       when 25 | 26 => Relative_correction_Info;
        !           569:       when 27 | 28 => Absolute_Correction_Info;
        !           570:       when 29 | 30 => Singular_Info;                 -- SOLUTIONS (TOLERANCES)
        !           571:       when 31 | 32 => Clustered_Info;
        !           572:       when 33 | 34 => Infinity_Info;
        !           573:       when others  => Exit_Info;
        !           574:     end case;
        !           575:     new_line;
        !           576:     if k /= 0
        !           577:      then put("Do you want to change the value of this parameter ? (y/n) ");
        !           578:           Ask_Yes_or_No(ans);
        !           579:           if ans = 'y'
        !           580:            then new_line;
        !           581:                 get_parameter(k);
        !           582:           end if;
        !           583:     end if;
        !           584:   end get_parameter_with_info;
        !           585:
        !           586:   procedure get ( k : out natural ) is
        !           587:
        !           588:     tmp : string(1..10);
        !           589:     cnt : natural;
        !           590:     ans : character;
        !           591:     nb : integer := -1;
        !           592:     valid,info : boolean;
        !           593:
        !           594:   begin
        !           595:     loop
        !           596:       put("Type a number to change (0 to exit), preceded by i for info : ");
        !           597:       get_line(tmp,cnt);
        !           598:       valid := true; info := false;
        !           599:       for i in 1..cnt loop
        !           600:         if tmp(i) = 'i'
        !           601:          then info := true;
        !           602:          elsif tmp(i) /= ' '
        !           603:               and then Characters_and_Numbers.Convert(tmp(i)) = 10
        !           604:              then valid := false;
        !           605:         end if;
        !           606:         exit when not valid;
        !           607:       end loop;
        !           608:       if not valid
        !           609:        then put_line("Invalid answer.  Please try again.");
        !           610:        else nb := Characters_and_Numbers.Convert(tmp(1..cnt));
        !           611:             if nb < 0
        !           612:              then put_line("No natural number.  Please try again.");
        !           613:                   put("The current string is :"); put_line(tmp(1..cnt));
        !           614:             end if;
        !           615:       end if;
        !           616:       exit when (nb >= 0);
        !           617:     end loop;
        !           618:     if info
        !           619:      then get_parameter_with_info(nb);
        !           620:           if nb = 0
        !           621:            then put("Do you want to leave this menu ? (y/n) ");
        !           622:                 Ask_Yes_or_No(ans);
        !           623:                 if ans = 'n'
        !           624:                  then nb := 1;
        !           625:                 end if;
        !           626:           end if;
        !           627:      else get_parameter(nb);
        !           628:     end if;
        !           629:     k := nb;
        !           630:   end get;
        !           631:
        !           632: end Continuation_Parameters_io;

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