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

Annotation of OpenXM_contrib/PHC/Ada/Continuation/correctors.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Natural_Vectors;
                      2: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                      3: with Standard_Complex_Linear_Solvers;    use Standard_Complex_Linear_Solvers;
                      4: with Standard_Complex_QR_Decomposition;  use Standard_Complex_QR_Decomposition;
                      5: with Standard_Complex_Least_Squares;     use Standard_Complex_Least_Squares;
                      6: with Process_io;                         use Process_io;
                      7:
                      8: package body Correctors is
                      9:
                     10: -- AUXILIARIES FOR IMPLEMENTING MULTIPLE CORRECTORS :
                     11:
                     12:   procedure Equals ( s : in Solu_Info_Array; x : in Vector; i : in natural;
                     13:                      d : in double_float; j : in out natural ) is
                     14:     eq : boolean;
                     15:
                     16:   begin
                     17:     while j < i loop
                     18:       eq := true;
                     19:       for k in x'range loop
                     20:         eq := Equal(s(j).sol.v(k),x(k),d);
                     21:         exit when not eq;
                     22:       end loop;
                     23:       exit when eq;
                     24:       j := j + 1;
                     25:     end loop;
                     26:   end Equals;
                     27:
                     28:   generic
                     29:     with procedure Corrector ( s : in out Solu_Info; c : in Corr_Pars );
                     30:   procedure Multiple_Silent_Corrector
                     31:               ( s : in out Solu_Info_Array;
                     32:                 pivot : in out natural; dist_sols : in double_float;
                     33:                 c : in Corr_Pars; fail : out boolean );
                     34:
                     35:   -- DESCRIPTION :
                     36:   --   Allows to build any multiple silent corrector,
                     37:   --   depending on the corrector supplied as generic parameter.
                     38:
                     39:   generic
                     40:     with procedure Corrector ( file : in file_type;
                     41:                                s : in out Solu_Info; c : in Corr_Pars );
                     42:   procedure Multiple_Reporting_Corrector
                     43:               ( file : in file_type; s : in out Solu_Info_Array;
                     44:                 pivot : in out natural; dist_sols : in double_float;
                     45:                 c : in Corr_Pars; fail : out boolean );
                     46:
                     47:   -- DESCRIPTION :
                     48:   --   Allows to build any multiple reporting corrector,
                     49:   --   depending on the corrector supplied as generic parameter.
                     50:
                     51:   procedure Multiple_Silent_Corrector
                     52:               ( s : in out Solu_Info_Array;
                     53:                 pivot : in out natural; dist_sols : in double_float;
                     54:                 c : in Corr_Pars; fail : out boolean ) is
                     55:
                     56:     i,j : natural;
                     57:     ffail : boolean := false;
                     58:
                     59:   begin
                     60:     i := pivot;
                     61:     loop
                     62:       Corrector(s(i),c);
                     63:       ffail := (((s(i).resa > c.epsaf) and then (s(i).cora > c.epsax))
                     64:         or else ((s(i).resr > c.epsrf) and then (s(i).corr > c.epsrx)));
                     65:       if not ffail
                     66:        then j := 1;
                     67:             Equals(s,s(i).sol.v,i,dist_sols,j);
                     68:             if j /= i
                     69:              then ffail := true;
                     70:             end if;
                     71:       end if;
                     72:       exit when ffail;
                     73:       i := i + 1;
                     74:       if i > s'last
                     75:        then i := s'first;
                     76:       end if;
                     77:       exit when (i = pivot);
                     78:     end loop;
                     79:     if ffail
                     80:      then pivot := i;
                     81:     end if;
                     82:     fail := ffail;
                     83:   end Multiple_Silent_Corrector;
                     84:
                     85:   procedure Multiple_Reporting_Corrector
                     86:               ( file : in file_type; s : in out Solu_Info_Array;
                     87:                 pivot : in out natural; dist_sols : in double_float;
                     88:                 c : in Corr_Pars; fail : out boolean ) is
                     89:
                     90:     i,j : natural;
                     91:     ffail : boolean := false;
                     92:
                     93:   begin
                     94:     i := pivot;
                     95:     loop
                     96:       Write_path(file,i);
                     97:       Corrector(file,s(i),c);
                     98:       sWrite(file,s(i).sol.all);
                     99:       ffail := (((s(i).resa > c.epsaf) and then (s(i).cora > c.epsax))
                    100:         or else ((s(i).resr > c.epsrf) and then (s(i).corr > c.epsrx)));
                    101:       if not ffail
                    102:        then j := 1;
                    103:             Equals(s,s(i).sol.v,i,dist_sols,j);
                    104:             if j /= i
                    105:              then ffail := true;
                    106:             end if;
                    107:       end if;
                    108:       exit when ffail;
                    109:       i := i + 1;
                    110:       if i > s'last
                    111:        then i := s'first;
                    112:       end if;
                    113:       exit when (i = pivot);
                    114:     end loop;
                    115:     if ffail
                    116:      then pivot := i;
                    117:     end if;
                    118:     fail := ffail;
                    119:   end Multiple_Reporting_Corrector;
                    120:
                    121: -- TARGET PROCEDURES :
                    122:
                    123:   procedure Affine_Single_Loose_Normal_Silent_Corrector
                    124:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    125:
                    126:     info : integer;
                    127:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    128:     j : Matrix(y'range,y'range);
                    129:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    130:     nit : natural := 0;
                    131:     normv : double_float;
                    132:
                    133:   begin
                    134:     s.resa := Norm(y);  s.cora := 1.0;               -- INITIALIZATION
                    135:     normv := Norm(s.sol.v);
                    136:     if normv + 1.0 /= 1.0
                    137:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    138:     end if;
                    139:     while nit < c.maxit loop  -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    140:       j := dH(s.sol.v,s.sol.t);
                    141:       lufac(j,y'last,ipvt,info);
                    142:       exit when info /= 0;              -- STOP WHEN SINGULAR JACOBIAN
                    143:       Min(y);
                    144:       lusolve(j,y'last,ipvt,y); s.cora := Norm(y);
                    145:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    146:       y := H(s.sol.v,s.sol.t);  s.resa := Norm(y);
                    147:       normv := Norm(s.sol.v);
                    148:       if normv + 1.0 /= 1.0
                    149:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    150:       end if;
                    151:       nit := nit + 1;
                    152:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    153:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    154:     end loop;                   -- STOP WHEN DESIRED PRECISION REACHED
                    155:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    156:   exception
                    157:     when numeric_error => return;
                    158:   end Affine_Single_Loose_Normal_Silent_Corrector;
                    159:
                    160:   procedure Affine_Single_Loose_Normal_Reporting_Corrector
                    161:               ( file : in file_type;
                    162:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    163:
                    164:     info : integer;
                    165:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    166:     j : Matrix(y'range,y'range);
                    167:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    168:     nit : natural := 0;
                    169:     normv : double_float;
                    170:
                    171:   begin
                    172:     s.resa := Norm(y);  s.cora := 1.0;               -- INITIALIZATION
                    173:     normv := Norm(s.sol.v);
                    174:     if normv + 1.0 /= 1.0
                    175:      then s.corr := s.cora / normv;
                    176:           s.resr := s.resa / normv;
                    177:     end if;
                    178:     while nit < c.maxit loop  -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    179:       j := dH(s.sol.v,s.sol.t);
                    180:       lufac(j,y'last,ipvt,info);
                    181:       exit when info /= 0;              -- STOP WHEN SINGULAR JACOBIAN
                    182:       Min(y);
                    183:       lusolve(j,y'last,ipvt,y); s.cora := Norm(y);
                    184:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    185:       y := H(s.sol.v,s.sol.t);  s.resa := Norm(y);
                    186:       normv := Norm(s.sol.v);
                    187:       if normv + 1.0 /= 1.0
                    188:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    189:       end if;
                    190:       cWrite(file,s.cora,s.corr,s.resa,s.resr);    -- WRITE STATISTICS
                    191:       nit := nit + 1;
                    192:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    193:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    194:     end loop;                   -- STOP WHEN DESIRED PRECISION REACHED
                    195:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    196:   exception
                    197:     when numeric_error => return;
                    198:   end Affine_Single_Loose_Normal_Reporting_Corrector;
                    199:
                    200:   procedure Affine_Single_Loose_Conditioned_Silent_Corrector
                    201:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    202:
                    203:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    204:     n : constant natural := y'last;
                    205:     j : Matrix(y'range,y'range);
                    206:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    207:           := (y'range => Create(0.0));
                    208:     dum : Standard_Complex_Vectors.Vector(y'range);
                    209:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    210:     info : integer;
                    211:     nit : natural := 0;
                    212:     normv : double_float;
                    213:
                    214:   begin
                    215:     s.resa := Norm(y);  s.cora := 1.0;                 -- INITIALIZATION
                    216:     normv := Norm(s.sol.v);
                    217:     if normv + 1.0 /= 1.0
                    218:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    219:     end if;
                    220:     while nit < c.maxit loop    -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    221:       j := dH(s.sol.v,s.sol.t);
                    222:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    223:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    224:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    225:       s.cora := Norm(y);
                    226:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    227:       y := H(s.sol.v,s.sol.t);  s.resa := Norm(y);
                    228:       normv := Norm(s.sol.v);
                    229:       if normv + 1.0 /= 1.0
                    230:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    231:       end if;
                    232:       nit := nit + 1;
                    233:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    234:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    235:     end loop;                     -- STOP WHEN DESIRED PRECISION REACHED
                    236:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    237:     j := dH(s.sol.v,s.sol.t);
                    238:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    239:   exception
                    240:     when numeric_error => return;
                    241:   end Affine_Single_Loose_Conditioned_Silent_Corrector;
                    242:
                    243:   procedure Affine_Single_Loose_Conditioned_Reporting_Corrector
                    244:               ( file : in file_type;
                    245:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    246:
                    247:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    248:     n : constant natural := y'last;
                    249:     j : Matrix(y'range,y'range);
                    250:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    251:           := (y'range => Create(0.0));
                    252:     dum : Standard_Complex_Vectors.Vector(y'range);
                    253:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    254:     info : integer;
                    255:     nit : natural := 0;
                    256:     normv : double_float;
                    257:
                    258:   begin
                    259:     s.resa := Norm(y);  s.cora := 1.0;                 -- INITIALIZATION
                    260:     normv := Norm(s.sol.v);
                    261:     if normv + 1.0 /= 1.0
                    262:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    263:     end if;
                    264:     while nit < c.maxit loop    -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    265:       j := dH(s.sol.v,s.sol.t);
                    266:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    267:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    268:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    269:       s.cora := Norm(y);
                    270:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    271:       y := H(s.sol.v,s.sol.t);  s.resa := Norm(y);
                    272:       normv := Norm(s.sol.v);
                    273:       if normv + 1.0 /= 1.0
                    274:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    275:       end if;
                    276:       cWrite(file,s.cora,s.corr,s.resa,s.resr);      -- WRITE STATISTICS
                    277:       cWrite(file,s.rcond,s.sol.m);
                    278:       nit := nit + 1;
                    279:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    280:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    281:     end loop;                     -- STOP WHEN DESIRED PRECISION REACHED
                    282:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    283:     j := dH(s.sol.v,s.sol.t);
                    284:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    285:   exception
                    286:     when numeric_error => return;
                    287:   end Affine_Single_Loose_Conditioned_Reporting_Corrector;
                    288:
                    289:   procedure Affine_Single_Severe_Normal_Silent_Corrector
                    290:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    291:
                    292:     info : integer;
                    293:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    294:     j : Matrix(y'range,y'range);
                    295:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    296:     nit : natural := 0;
                    297:     normv,ncora,nresa,ncorr,nresr : double_float;
                    298:     stop : boolean;
                    299:
                    300:   begin
                    301:     s.resa := Norm(y);  s.cora := 1.0;              -- INITIALIZATION
                    302:     normv := Norm(s.sol.v);
                    303:     if normv + 1.0 /= 1.0
                    304:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    305:     end if;
                    306:     while nit < c.maxit loop -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    307:       j := dH(s.sol.v,s.sol.t);
                    308:       lufac(j,y'last,ipvt,info);
                    309:       exit when info /= 0;             -- STOP WHEN SINGULAR JACOBIAN
                    310:       Min(y);
                    311:       lusolve(j,y'last,ipvt,y); ncora := Norm(y);
                    312:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    313:       y := H(s.sol.v,s.sol.t);  nresa := Norm(y);
                    314:       normv := Norm(s.sol.v);
                    315:       if normv + 1.0 /= 1.0
                    316:        then ncorr := ncora / normv; nresr := nresa / normv;
                    317:       end if;
                    318:       nit := nit + 1;
                    319:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    320:                or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    321:                                                  -- STOP WHEN DIVERGENCE
                    322:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    323:       exit when stop;
                    324:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    325:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    326:     end loop;                  -- STOP WHEN DESIRED PRECISION REACHED
                    327:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    328:   exception
                    329:     when numeric_error => return;
                    330:   end Affine_Single_Severe_Normal_Silent_Corrector;
                    331:
                    332:   procedure Affine_Single_Severe_Normal_Reporting_Corrector
                    333:               ( file : in file_type;
                    334:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    335:
                    336:     info : integer;
                    337:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    338:     j : Matrix(y'range,y'range);
                    339:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    340:     nit : natural := 0;
                    341:     normv,ncora,nresa,ncorr,nresr : double_float;
                    342:     stop : boolean;
                    343:
                    344:   begin
                    345:     s.resa := Norm(y);  s.cora := 1.0;              -- INITIALIZATION
                    346:     normv := Norm(s.sol.v);
                    347:     if normv + 1.0 /= 1.0
                    348:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    349:     end if;
                    350:     while nit < c.maxit loop -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    351:       j := dH(s.sol.v,s.sol.t);
                    352:       lufac(j,y'last,ipvt,info);
                    353:       exit when info /= 0;             -- STOP WHEN SINGULAR JACOBIAN
                    354:       Min(y);
                    355:       lusolve(j,y'last,ipvt,y); ncora := Norm(y);
                    356:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    357:       y := H(s.sol.v,s.sol.t);  nresa := Norm(y);
                    358:       normv := Norm(s.sol.v);
                    359:       if normv + 1.0 /= 1.0
                    360:        then ncorr := ncora / normv; nresr := nresa / normv;
                    361:       end if;
                    362:       cWrite(file,ncora,ncorr,nresa,nresr);       -- WRITE STATISTICS
                    363:       nit := nit + 1;
                    364:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    365:               or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    366:                                                  -- STOP WHEN DIVERGENCE
                    367:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    368:       exit when stop;
                    369:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    370:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    371:     end loop;                 -- STOP WHEN DESIRED PRECISION REACHED
                    372:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    373:   exception
                    374:     when numeric_error => return;
                    375:   end Affine_Single_Severe_Normal_Reporting_Corrector;
                    376:
                    377:   procedure Affine_Single_Severe_Conditioned_Silent_Corrector
                    378:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    379:
                    380:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    381:     n : constant natural := y'last;
                    382:     j : Matrix(y'range,y'range);
                    383:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    384:           := (y'range => Create(0.0));
                    385:     dum : Standard_Complex_Vectors.Vector(y'range);
                    386:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    387:     info : integer;
                    388:     nit : natural := 0;
                    389:     normv,ncora,nresa,ncorr,nresr : double_float;
                    390:     stop : boolean;
                    391:
                    392:   begin
                    393:     s.resa := Norm(y);  s.cora := 1.0;                  -- INITIALIZATION
                    394:     normv := Norm(s.sol.v);
                    395:     if normv + 1.0 /= 1.0
                    396:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    397:     end if;
                    398:     while nit < c.maxit loop     -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    399:       j := dH(s.sol.v,s.sol.t);
                    400:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    401:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    402:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    403:       ncora := Norm(y);
                    404:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    405:       y := H(s.sol.v,s.sol.t);  nresa := Norm(y);
                    406:       normv := Norm(s.sol.v);
                    407:       if normv + 1.0 /= 1.0
                    408:        then ncorr := ncora / normv; nresr := nresa / normv;
                    409:       end if;
                    410:       nit := nit + 1;
                    411:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    412:             or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    413:                                                     -- STOP WHEN DIVERGENCE
                    414:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    415:       exit when stop;
                    416:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    417:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    418:     end loop;                      -- STOP WHEN DESIRED PRECISION REACHED
                    419:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    420:     j := dH(s.sol.v,s.sol.t);
                    421:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    422:   exception
                    423:     when numeric_error => return;
                    424:   end Affine_Single_Severe_Conditioned_Silent_Corrector;
                    425:
                    426:   procedure Affine_Single_Severe_Conditioned_Reporting_Corrector
                    427:               ( file : in file_type;
                    428:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    429:
                    430:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    431:     n : constant natural := y'last;
                    432:     j : Matrix(y'range,y'range);
                    433:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    434:           := (y'range => Create(0.0));
                    435:     dum : Standard_Complex_Vectors.Vector(y'range);
                    436:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    437:     info : integer;
                    438:     nit : natural := 0;
                    439:     normv,ncora,nresa,ncorr,nresr : double_float;
                    440:     stop : boolean;
                    441:
                    442:   begin
                    443:     s.resa := Norm(y);  s.cora := 1.0;                  -- INITIALIZATION
                    444:     normv := Norm(s.sol.v);
                    445:     if normv + 1.0 /= 1.0
                    446:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    447:     end if;
                    448:     while nit < c.maxit loop     -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    449:       j := dH(s.sol.v,s.sol.t);
                    450:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    451:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    452:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    453:       ncora := Norm(y);
                    454:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    455:       y := H(s.sol.v,s.sol.t);  nresa := Norm(y);
                    456:       normv := Norm(s.sol.v);
                    457:       if normv + 1.0 /= 1.0
                    458:        then ncorr := ncora / normv; nresr := nresa / normv;
                    459:       end if;
                    460:       cWrite(file,ncora,ncorr,nresa,nresr);           -- WRITE STATISTICS
                    461:       cWrite(file,s.rcond,s.sol.m);
                    462:       nit := nit + 1;
                    463:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    464:             or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    465:                                                      -- STOP WHEN DIVERGENCE
                    466:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    467:       exit when stop;
                    468:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    469:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    470:     end loop;                      -- STOP WHEN DESIRED PRECISION REACHED
                    471:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    472:     j := dH(s.sol.v,s.sol.t);
                    473:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    474:   exception
                    475:     when numeric_error => return;
                    476:   end Affine_Single_Severe_Conditioned_Reporting_Corrector;
                    477:
                    478:   procedure Affine_Multiple_Loose_Normal_Silent_Corrector
                    479:               ( s : in out Solu_Info_Array;
                    480:                 pivot : in out natural; dist_sols : in double_float;
                    481:                 c : in Corr_Pars; fail : out boolean ) is
                    482:
                    483:     procedure Single_Corrector is
                    484:       new Affine_Single_Loose_Normal_Silent_Corrector(Norm,H,dH);
                    485:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                    486:
                    487:   begin
                    488:     Corrector(s,pivot,dist_sols,c,fail);
                    489:   end Affine_Multiple_Loose_Normal_Silent_Corrector;
                    490:
                    491:   procedure Affine_Multiple_Loose_Normal_Reporting_Corrector
                    492:               ( file : in file_type; s : in out Solu_Info_Array;
                    493:                 pivot : in out natural; dist_sols : in double_float;
                    494:                 c : in Corr_Pars; fail : out boolean ) is
                    495:
                    496:     procedure Single_Corrector is
                    497:       new Affine_Single_Loose_Normal_Reporting_Corrector(Norm,H,dH);
                    498:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                    499:
                    500:   begin
                    501:     Corrector(file,s,pivot,dist_sols,c,fail);
                    502:   end Affine_Multiple_Loose_Normal_Reporting_Corrector;
                    503:
                    504:   procedure Affine_Multiple_Loose_Conditioned_Silent_Corrector
                    505:               ( s : in out Solu_Info_Array;
                    506:                 pivot : in out natural; dist_sols : in double_float;
                    507:                 c : in Corr_Pars; fail : out boolean ) is
                    508:
                    509:     procedure Single_Corrector is
                    510:       new Affine_Single_Loose_Conditioned_Silent_Corrector(Norm,H,dH);
                    511:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                    512:
                    513:   begin
                    514:     Corrector(s,pivot,dist_sols,c,fail);
                    515:   end Affine_Multiple_Loose_Conditioned_Silent_Corrector;
                    516:
                    517:   procedure Affine_Multiple_Loose_Conditioned_Reporting_Corrector
                    518:               ( file : in file_type; s : in out Solu_Info_Array;
                    519:                 pivot : in out natural; dist_sols : in double_float;
                    520:                 c : in Corr_Pars; fail : out boolean ) is
                    521:
                    522:     procedure Single_Corrector is
                    523:       new Affine_Single_Loose_Conditioned_Reporting_Corrector(Norm,H,dH);
                    524:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                    525:
                    526:   begin
                    527:     Corrector(file,s,pivot,dist_sols,c,fail);
                    528:   end Affine_Multiple_Loose_Conditioned_Reporting_Corrector;
                    529:
                    530:   procedure Affine_Multiple_Severe_Normal_Silent_Corrector
                    531:               ( s : in out Solu_Info_Array;
                    532:                 pivot : in out natural; dist_sols : in double_float;
                    533:                 c : in Corr_Pars; fail : out boolean ) is
                    534:
                    535:     procedure Single_Corrector is
                    536:       new Affine_Single_Severe_Normal_Silent_Corrector(Norm,H,dH);
                    537:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                    538:
                    539:   begin
                    540:     Corrector(s,pivot,dist_sols,c,fail);
                    541:   end Affine_Multiple_Severe_Normal_Silent_Corrector;
                    542:
                    543:   procedure Affine_Multiple_Severe_Normal_Reporting_Corrector
                    544:               ( file : in file_type; s : in out Solu_Info_Array;
                    545:                 pivot : in out natural; dist_sols : in double_float;
                    546:                 c : in Corr_Pars; fail : out boolean ) is
                    547:
                    548:     procedure Single_Corrector is
                    549:       new Affine_Single_Severe_Normal_Reporting_Corrector(Norm,H,dH);
                    550:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                    551:
                    552:   begin
                    553:     Corrector(file,s,pivot,dist_sols,c,fail);
                    554:   end Affine_Multiple_Severe_Normal_Reporting_Corrector;
                    555:
                    556:   procedure Affine_Multiple_Severe_Conditioned_Silent_Corrector
                    557:               ( s : in out Solu_Info_Array;
                    558:                 pivot : in out natural; dist_sols : in double_float;
                    559:                 c : in Corr_Pars; fail : out boolean ) is
                    560:
                    561:     procedure Single_Corrector is
                    562:       new Affine_Single_Severe_Conditioned_Silent_Corrector(Norm,H,dH);
                    563:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                    564:
                    565:   begin
                    566:     Corrector(s,pivot,dist_sols,c,fail);
                    567:   end Affine_Multiple_Severe_Conditioned_Silent_Corrector;
                    568:
                    569:   procedure Affine_Multiple_Severe_Conditioned_Reporting_Corrector
                    570:               ( file : in file_type; s : in out Solu_Info_Array;
                    571:                 pivot : in out natural; dist_sols : in double_float;
                    572:                 c : in Corr_Pars; fail : out boolean ) is
                    573:
                    574:     procedure Single_Corrector is
                    575:       new Affine_Single_Severe_Conditioned_Reporting_Corrector(Norm,H,dH);
                    576:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                    577:
                    578:   begin
                    579:     Corrector(file,s,pivot,dist_sols,c,fail);
                    580:   end Affine_Multiple_Severe_Conditioned_Reporting_Corrector;
                    581:
                    582:   procedure Projective_Single_Loose_Normal_Silent_Corrector
                    583:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    584:
                    585:     info : integer;
                    586:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    587:     j : Matrix(y'range,y'range);
                    588:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    589:     nit : natural := 0;
                    590:     normv : double_float;
                    591:
                    592:   begin
                    593:     s.resa := Norm(y);  s.cora := 1.0;                -- INITIALIZATION
                    594:     normv := Norm(s.sol.v);
                    595:     if normv + 1.0 /= 1.0
                    596:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    597:     end if;
                    598:     while nit < c.maxit loop   -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    599:       j := dH(s.sol.v,s.sol.t);
                    600:       for jj in y'range loop
                    601:         j(j'last(1),jj) := s.sol.v(jj);        -- CORRECT PERPENDICULAR
                    602:       end loop;
                    603:       lufac(j,y'last,ipvt,info);
                    604:       exit when info /= 0;               -- STOP WHEN SINGULAR JACOBIAN
                    605:       Min(y);
                    606:       y(y'last) := Create(0.0);               -- IGNORE SCALING EQUATION
                    607:       lusolve(j,y'last,ipvt,y); s.cora := Norm(y);
                    608:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    609:       y := H(s.sol.v,s.sol.t);
                    610:       y(y'last) := Create(0.0);  s.resa := Norm(y);
                    611:       normv := Norm(s.sol.v);
                    612:       if normv + 1.0 /= 1.0
                    613:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    614:             for jj in s.sol.v'range loop          -- SCALE THE SOLUTION
                    615:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    616:             end loop;
                    617:       end if;
                    618:       nit := nit + 1;
                    619:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    620:          and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    621:     end loop;                    -- STOP WHEN DESIRED PRECISION REACHED
                    622:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    623:   exception
                    624:     when numeric_error => return;
                    625:   end Projective_Single_Loose_Normal_Silent_Corrector;
                    626:
                    627:   procedure Projective_Single_Loose_Normal_Reporting_Corrector
                    628:               ( file : in file_type;
                    629:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    630:
                    631:     info : integer;
                    632:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    633:     j : Matrix(y'range,y'range);
                    634:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    635:     nit : natural := 0;
                    636:     normv : double_float;
                    637:
                    638:   begin
                    639:     s.resa := Norm(y);  s.cora := 1.0;                -- INITIALIZATION
                    640:     normv := Norm(s.sol.v);
                    641:     if normv + 1.0 /= 1.0
                    642:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    643:     end if;
                    644:     while nit < c.maxit loop   -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    645:       j := dH(s.sol.v,s.sol.t);
                    646:       for jj in y'range loop
                    647:         j(j'last(1),jj) := s.sol.v(jj);        -- CORRECT PERPENDICULAR
                    648:       end loop;
                    649:       lufac(j,y'last,ipvt,info);
                    650:       exit when info /= 0;               -- STOP WHEN SINGULAR JACOBIAN
                    651:       Min(y);
                    652:       y(y'last) := Create(0.0);               -- IGNORE SCALING EQUATION
                    653:       lusolve(j,y'last,ipvt,y); s.cora := Norm(y);
                    654:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    655:       y := H(s.sol.v,s.sol.t);
                    656:       y(y'last) := Create(0.0);  s.resa := Norm(y);
                    657:       normv := Norm(s.sol.v);
                    658:       if normv + 1.0 /= 1.0
                    659:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    660:             for jj in s.sol.v'range loop          -- SCALE THE SOLUTION
                    661:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    662:             end loop;
                    663:       end if;
                    664:       cWrite(file,s.cora,s.corr,s.resa,s.resr);     -- WRITE STATISTICS
                    665:       nit := nit + 1;
                    666:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    667:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    668:     end loop;                    -- STOP WHEN DESIRED PRECISION REACHED
                    669:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    670:   exception
                    671:     when numeric_error => return;
                    672:   end Projective_Single_Loose_Normal_Reporting_Corrector;
                    673:
                    674:   procedure Projective_Single_Loose_Conditioned_Silent_Corrector
                    675:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    676:
                    677:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    678:     n : constant natural := y'last;
                    679:     j : Matrix(y'range,y'range);
                    680:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    681:           := (y'range => Create(0.0));
                    682:     dum : Standard_Complex_Vectors.Vector(y'range);
                    683:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    684:     info : integer;
                    685:     nit : natural := 0;
                    686:     normv : double_float;
                    687:
                    688:   begin
                    689:     s.resa := Norm(y);  s.cora := 1.0;                -- INITIALIZATION
                    690:     normv := Norm(s.sol.v);
                    691:     if normv + 1.0 /= 1.0
                    692:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    693:     end if;
                    694:     while nit < c.maxit loop   -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    695:       j := dH(s.sol.v,s.sol.t);
                    696:       for jj in y'range loop
                    697:         j(j'last(1),jj) := s.sol.v(jj);        -- CORRECT PERPENDICULAR
                    698:       end loop;
                    699:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    700:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    701:       y(y'last) := Create(0.0);               -- IGNORE SCALING EQUATION
                    702:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    703:       s.cora := Norm(y);
                    704:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    705:       y := H(s.sol.v,s.sol.t);
                    706:       y(y'last) := Create(0.0);  s.resa := Norm(y);
                    707:       normv := Norm(s.sol.v);
                    708:       if normv + 1.0 /= 1.0
                    709:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    710:             for jj in s.sol.v'range loop          -- SCALE THE SOLUTION
                    711:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    712:             end loop;
                    713:       end if;
                    714:       nit := nit + 1;
                    715:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    716:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    717:     end loop;                    -- STOP WHEN DESIRED PRECISION REACHED
                    718:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    719:     j := dH(s.sol.v,s.sol.t);
                    720:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    721:   exception
                    722:     when numeric_error => return;
                    723:   end Projective_Single_Loose_Conditioned_Silent_Corrector;
                    724:
                    725:   procedure Projective_Single_Loose_Conditioned_Reporting_Corrector
                    726:               ( file : in file_type;
                    727:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    728:
                    729:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    730:     n : constant natural := y'last;
                    731:     j : Matrix(y'range,y'range);
                    732:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    733:           := (y'range => Create(0.0));
                    734:     dum : Standard_Complex_Vectors.Vector(y'range);
                    735:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    736:     info : integer;
                    737:     nit : natural := 0;
                    738:     normv : double_float;
                    739:
                    740:   begin
                    741:     s.resa := Norm(y);  s.cora := 1.0;                -- INITIALIZATION
                    742:     normv := Norm(s.sol.v);
                    743:     if normv + 1.0 /= 1.0
                    744:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    745:     end if;
                    746:     while nit < c.maxit loop   -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    747:       j := dH(s.sol.v,s.sol.t);
                    748:       for jj in y'range loop
                    749:         j(j'last(1),jj) := s.sol.v(jj);        -- CORRECT PERPENDICULAR
                    750:       end loop;
                    751:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    752:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    753:       y(y'last) := Create(0.0);               -- IGNORE SCALING EQUATION
                    754:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    755:       s.cora := Norm(y);
                    756:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    757:       y := H(s.sol.v,s.sol.t);
                    758:       y(y'last) := Create(0.0);  s.resa := Norm(y);
                    759:       normv := Norm(s.sol.v);
                    760:       if normv + 1.0 /= 1.0
                    761:        then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    762:             for jj in s.sol.v'range loop          -- SCALE THE SOLUTION
                    763:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    764:             end loop;
                    765:       end if;
                    766:       cWrite(file,s.cora,s.corr,s.resa,s.resr);     -- WRITE STATISTICS
                    767:       cWrite(file,s.rcond,s.sol.m);
                    768:       nit := nit + 1;
                    769:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    770:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    771:     end loop;                    -- STOP WHEN DESIRED PRECISION REACHED
                    772:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    773:     j := dH(s.sol.v,s.sol.t);
                    774:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    775:   exception
                    776:     when numeric_error => return;
                    777:   end Projective_Single_Loose_Conditioned_Reporting_Corrector;
                    778:
                    779:   procedure Projective_Single_Severe_Normal_Silent_Corrector
                    780:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    781:
                    782:     info : integer;
                    783:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    784:     j : Matrix(y'range,y'range);
                    785:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    786:     nit : natural := 0;
                    787:     normv,ncora,nresa,ncorr,nresr : double_float;
                    788:     stop : boolean;
                    789:
                    790:   begin
                    791:     s.resa := Norm(y);  s.cora := 1.0;               -- INITIALIZATION
                    792:     normv := Norm(s.sol.v);
                    793:     if normv + 1.0 /= 1.0
                    794:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    795:     end if;
                    796:     while nit < c.maxit loop  -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    797:       j := dH(s.sol.v,s.sol.t);
                    798:       for jj in y'range loop
                    799:         j(j'last(1),jj) := s.sol.v(jj);       -- CORRECT PERPENDICULAR
                    800:       end loop;
                    801:       lufac(j,y'last,ipvt,info);
                    802:       exit when info /= 0;              -- STOP WHEN SINGULAR JACOBIAN
                    803:       Min(y);
                    804:       y(y'last) := Create(0.0);              -- IGNORE SCALING EQUATION
                    805:       lusolve(j,y'last,ipvt,y); ncora := Norm(y);
                    806:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    807:       y := H(s.sol.v,s.sol.t);
                    808:       y(y'last) := Create(0.0);  nresa := Norm(y);
                    809:       normv := Norm(s.sol.v);
                    810:       if normv + 1.0 /= 1.0
                    811:        then ncorr := ncora / normv; nresr := nresa / normv;
                    812:             for jj in s.sol.v'range loop         -- SCALE THE SOLUTION
                    813:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    814:             end loop;
                    815:       end if;
                    816:       nit := nit + 1;
                    817:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    818:              or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    819:                                                     -- STOP WHEN DIVERGENCE
                    820:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    821:       exit when stop;
                    822:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    823:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    824:     end loop;                   -- STOP WHEN DESIRED PRECISION REACHED
                    825:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    826:   exception
                    827:     when numeric_error => return;
                    828:   end Projective_Single_Severe_Normal_Silent_Corrector;
                    829:
                    830:   procedure Projective_Single_Severe_Normal_Reporting_Corrector
                    831:               ( file : in file_type;
                    832:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    833:
                    834:     info : integer;
                    835:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    836:     j : Matrix(y'range,y'range);
                    837:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    838:     nit : natural := 0;
                    839:     normv,ncora,nresa,ncorr,nresr : double_float;
                    840:     stop : boolean;
                    841:
                    842:   begin
                    843:     s.resa := Norm(y);  s.cora := 1.0;               -- INITIALIZATION
                    844:     normv := Norm(s.sol.v);
                    845:     if normv + 1.0 /= 1.0
                    846:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    847:     end if;
                    848:     while nit < c.maxit loop  -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    849:       j := dH(s.sol.v,s.sol.t);
                    850:       for jj in y'range loop
                    851:         j(j'last(1),jj) := s.sol.v(jj);       -- CORRECT PERPENDICULAR
                    852:       end loop;
                    853:       lufac(j,y'last,ipvt,info);
                    854:       exit when info /= 0;              -- STOP WHEN SINGULAR JACOBIAN
                    855:       Min(y);
                    856:       y(y'last) := Create(0.0);              -- IGNORE SCALING EQUATION
                    857:       lusolve(j,y'last,ipvt,y); ncora := Norm(y);
                    858:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    859:       y := H(s.sol.v,s.sol.t);
                    860:       y(y'last) := Create(0.0);  nresa := Norm(y);
                    861:       normv := Norm(s.sol.v);
                    862:       if normv + 1.0 /= 1.0
                    863:        then ncorr := ncora / normv; nresr := nresa / normv;
                    864:             for jj in s.sol.v'range loop         -- SCALE THE SOLUTION
                    865:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    866:             end loop;
                    867:       end if;
                    868:       cWrite(file,ncora,ncorr,nresa,nresr);        -- WRITE STATISTICS
                    869:       nit := nit + 1;
                    870:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    871:             or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    872:                                                    -- STOP WHEN DIVERGENCE
                    873:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    874:       exit when stop;
                    875:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    876:          and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    877:     end loop;                   -- STOP WHEN DESIRED PRECISION REACHED
                    878:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    879:   exception
                    880:     when numeric_error => return;
                    881:   end Projective_Single_Severe_Normal_Reporting_Corrector;
                    882:
                    883:   procedure Projective_Single_Severe_Conditioned_Silent_Corrector
                    884:               ( s : in out Solu_Info; c : in Corr_Pars ) is
                    885:
                    886:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    887:     n : constant natural := y'last;
                    888:     j : Matrix(y'range,y'range);
                    889:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    890:           := (y'range => Create(0.0));
                    891:     dum : Standard_Complex_Vectors.Vector(y'range);
                    892:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    893:     info : integer;
                    894:     nit : natural := 0;
                    895:     normv,ncora,nresa,ncorr,nresr : double_float;
                    896:     stop : boolean;
                    897:
                    898:   begin
                    899:     s.resa := Norm(y);  s.cora := 1.0;               -- INITIALIZATION
                    900:     normv := Norm(s.sol.v);
                    901:     if normv + 1.0 /= 1.0
                    902:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    903:     end if;
                    904:     while nit < c.maxit loop    -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    905:       j := dH(s.sol.v,s.sol.t);
                    906:       for jj in y'range loop
                    907:         j(j'last(1),jj) := s.sol.v(jj);         -- CORRECT PERPENDICULAR
                    908:       end loop;
                    909:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    910:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    911:       y(y'last) := Create(0.0);                -- IGNORE SCALING EQUATION
                    912:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    913:       ncora := Norm(y);
                    914:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    915:       y := H(s.sol.v,s.sol.t);
                    916:       y(y'last) := Create(0.0);  nresa := Norm(y);
                    917:       normv := Norm(s.sol.v);
                    918:       if normv + 1.0 /= 1.0
                    919:        then ncorr := ncora / normv; nresr := nresa / normv;
                    920:             for jj in s.sol.v'range loop           -- SCALE THE SOLUTION
                    921:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    922:             end loop;
                    923:       end if;
                    924:       nit := nit + 1;
                    925:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    926:              or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    927:                                                     -- STOP WHEN DIVERGENCE
                    928:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    929:       exit when stop;
                    930:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    931:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    932:     end loop;                     -- STOP WHEN DESIRED PRECISION REACHED
                    933:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    934:     j := dH(s.sol.v,s.sol.t);
                    935:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    936:   exception
                    937:     when numeric_error => return;
                    938:   end Projective_Single_Severe_Conditioned_Silent_Corrector;
                    939:
                    940:   procedure Projective_Single_Severe_Conditioned_Reporting_Corrector
                    941:               ( file : in file_type;
                    942:                 s : in out Solu_Info; c : in Corr_Pars ) is
                    943:
                    944:     y : Vector(s.sol.v'range) := H(s.sol.v,s.sol.t);
                    945:     n : constant natural := y'last;
                    946:     j : Matrix(y'range,y'range);
                    947:     qraux : Standard_Complex_Vectors.Vector(y'range)
                    948:           := (y'range => Create(0.0));
                    949:     dum : Standard_Complex_Vectors.Vector(y'range);
                    950:     ipvt : Standard_Natural_Vectors.Vector(y'range);
                    951:     info : integer;
                    952:     nit : natural := 0;
                    953:     normv,ncora,nresa,ncorr,nresr : double_float;
                    954:     stop : boolean;
                    955:
                    956:   begin
                    957:     s.resa := Norm(y);  s.cora := 1.0;               -- INITIALIZATION
                    958:     normv := Norm(s.sol.v);
                    959:     if normv + 1.0 /= 1.0
                    960:      then s.corr := s.cora / normv; s.resr := s.resa / normv;
                    961:     end if;
                    962:     while nit < c.maxit loop    -- STOP WHEN MAXIMUM #ITERATIONS REACHED
                    963:       j := dH(s.sol.v,s.sol.t);
                    964:       for jj in y'range loop
                    965:         j(j'last(1),jj) := s.sol.v(jj);         -- CORRECT PERPENDICULAR
                    966:       end loop;
                    967:       QRD(j,qraux,ipvt,false);                    -- QR WITHOUT PIVOTING
                    968:       Min(y);                               -- FOLLOWED BY LEAST SQUARES
                    969:       y(y'last) := Create(0.0);                -- IGNORE SCALING EQUATION
                    970:       QRLS(j,n,n,n,qraux,y,dum,dum,y,dum,dum,100,info);
                    971:       ncora := Norm(y);
                    972:       Add(s.sol.v,y);   s.length_path := s.length_path + s.cora;
                    973:       y := H(s.sol.v,s.sol.t);
                    974:       y(y'last) := Create(0.0);  nresa := Norm(y);
                    975:       normv := Norm(s.sol.v);
                    976:       if normv + 1.0 /= 1.0
                    977:        then ncorr := ncora / normv; nresr := nresa / normv;
                    978:             for jj in s.sol.v'range loop           -- SCALE THE SOLUTION
                    979:               s.sol.v(jj) := s.sol.v(jj)/Create(normv);
                    980:             end loop;
                    981:       end if;
                    982:       cWrite(file,ncora,ncorr,nresa,nresr);          -- WRITE STATISTICS
                    983:       cWrite(file,s.rcond,s.sol.m);
                    984:       nit := nit + 1;
                    985:       stop := (((ncora > s.cora) and then (nresa > s.resa))
                    986:               or else ((ncorr > s.corr) and then (ncorr > s.corr)));
                    987:                                                    -- STOP WHEN DIVERGENCE
                    988:       s.cora := ncora; s.resa := nresa; s.corr := ncorr; s.resr := nresr;
                    989:       exit when stop;
                    990:       exit when (((s.cora <= c.epsax) or else (s.resa <= c.epsaf))
                    991:         and then ((s.corr <= c.epsrx) or else (s.resr <= c.epsrf)));
                    992:     end loop;                     -- STOP WHEN DESIRED PRECISION REACHED
                    993:     s.niter := s.niter + nit; s.nsyst := s.nsyst + nit;
                    994:     j := dH(s.sol.v,s.sol.t);
                    995:     lufco(j,y'last,ipvt,s.rcond);           -- ESTIMATE CONDITION NUMBER
                    996:   exception
                    997:     when numeric_error => return;
                    998:   end Projective_Single_Severe_Conditioned_Reporting_Corrector;
                    999:
                   1000:   procedure Projective_Multiple_Loose_Normal_Silent_Corrector
                   1001:               ( s : in out Solu_Info_Array;
                   1002:                 pivot : in out natural; dist_sols : in double_float;
                   1003:                 c : in Corr_Pars; fail : out boolean ) is
                   1004:
                   1005:     procedure Single_Corrector is
                   1006:       new Projective_Single_Loose_Normal_Silent_Corrector(Norm,H,dH);
                   1007:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                   1008:
                   1009:   begin
                   1010:     Corrector(s,pivot,dist_sols,c,fail);
                   1011:   end Projective_Multiple_Loose_Normal_Silent_Corrector;
                   1012:
                   1013:   procedure Projective_Multiple_Loose_Normal_Reporting_Corrector
                   1014:               ( file : in file_type; s : in out Solu_Info_Array;
                   1015:                 pivot : in out natural; dist_sols : in double_float;
                   1016:                 c : in Corr_Pars; fail : out boolean ) is
                   1017:
                   1018:     procedure Single_Corrector is
                   1019:       new Projective_Single_Loose_Normal_Reporting_Corrector(Norm,H,dH);
                   1020:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                   1021:
                   1022:   begin
                   1023:     Corrector(file,s,pivot,dist_sols,c,fail);
                   1024:   end Projective_Multiple_Loose_Normal_Reporting_Corrector;
                   1025:
                   1026:   procedure Projective_Multiple_Loose_Conditioned_Silent_Corrector
                   1027:               ( s : in out Solu_Info_Array;
                   1028:                 pivot : in out natural; dist_sols : in double_float;
                   1029:                 c : in Corr_Pars; fail : out boolean ) is
                   1030:
                   1031:     procedure Single_Corrector is
                   1032:       new Projective_Single_Loose_Conditioned_Silent_Corrector(Norm,H,dH);
                   1033:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                   1034:
                   1035:   begin
                   1036:     Corrector(s,pivot,dist_sols,c,fail);
                   1037:   end Projective_Multiple_Loose_Conditioned_Silent_Corrector;
                   1038:
                   1039:   procedure Projective_Multiple_Loose_Conditioned_Reporting_Corrector
                   1040:               ( file : in file_type; s : in out Solu_Info_Array;
                   1041:                 pivot : in out natural; dist_sols : in double_float;
                   1042:                 c : in Corr_Pars; fail : out boolean ) is
                   1043:
                   1044:     procedure Single_Corrector is
                   1045:       new Projective_Single_Loose_Normal_Reporting_Corrector(Norm,H,dH);
                   1046:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                   1047:
                   1048:   begin
                   1049:     Corrector(file,s,pivot,dist_sols,c,fail);
                   1050:   end Projective_Multiple_Loose_Conditioned_Reporting_Corrector;
                   1051:
                   1052:   procedure Projective_Multiple_Severe_Normal_Silent_Corrector
                   1053:               ( s : in out Solu_Info_Array;
                   1054:                 pivot : in out natural; dist_sols : in double_float;
                   1055:                 c : in Corr_Pars; fail : out boolean ) is
                   1056:
                   1057:     procedure Single_Corrector is
                   1058:       new Projective_Single_Severe_Normal_Silent_Corrector(Norm,H,dH);
                   1059:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                   1060:
                   1061:   begin
                   1062:     Corrector(s,pivot,dist_sols,c,fail);
                   1063:   end Projective_Multiple_Severe_Normal_Silent_Corrector;
                   1064:
                   1065:   procedure Projective_Multiple_Severe_Normal_Reporting_Corrector
                   1066:               ( file : in file_type; s : in out Solu_Info_Array;
                   1067:                 pivot : in out natural; dist_sols : in double_float;
                   1068:                 c : in Corr_Pars; fail : out boolean ) is
                   1069:
                   1070:     procedure Single_Corrector is
                   1071:       new Projective_Single_Loose_Normal_Reporting_Corrector(Norm,H,dH);
                   1072:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                   1073:
                   1074:   begin
                   1075:     Corrector(file,s,pivot,dist_sols,c,fail);
                   1076:   end Projective_Multiple_Severe_Normal_Reporting_Corrector;
                   1077:
                   1078:   procedure Projective_Multiple_Severe_Conditioned_Silent_Corrector
                   1079:               ( s : in out Solu_Info_Array;
                   1080:                 pivot : in out natural; dist_sols : in double_float;
                   1081:                 c : in Corr_Pars; fail : out boolean ) is
                   1082:
                   1083:     procedure Single_Corrector is
                   1084:       new Projective_Single_Severe_Conditioned_Silent_Corrector(Norm,H,dH);
                   1085:     procedure Corrector is new Multiple_Silent_Corrector(Single_Corrector);
                   1086:
                   1087:   begin
                   1088:     Corrector(s,pivot,dist_sols,c,fail);
                   1089:   end Projective_Multiple_Severe_Conditioned_Silent_Corrector;
                   1090:
                   1091:   procedure Projective_Multiple_Severe_Conditioned_Reporting_Corrector
                   1092:               ( file : in file_type; s : in out Solu_Info_Array;
                   1093:                 pivot : in out natural; dist_sols : in double_float;
                   1094:                 c : in Corr_Pars; fail : out boolean ) is
                   1095:
                   1096:     procedure Single_Corrector is
                   1097:       new Projective_Single_Severe_Conditioned_Reporting_Corrector(Norm,H,dH);
                   1098:     procedure Corrector is new Multiple_Reporting_Corrector(Single_Corrector);
                   1099:
                   1100:   begin
                   1101:     Corrector(file,s,pivot,dist_sols,c,fail);
                   1102:   end Projective_Multiple_Severe_Conditioned_Reporting_Corrector;
                   1103:
                   1104: end Correctors;

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