[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

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>