code 34215;
real procedure FLEMIN(N, X, G, H, FUNCT, IN, OUT);
value N;
integer N; array X, G, H, IN, OUT;
real procedure FUNCT;
begin integer I, IT, CNTL, EVL, EVLMAX;
real F,F0,FMIN,MU,DG,DG0,NRMDELTA,ALFA,RELTOL,ABSTOL,
EPS, TOLG, AID;
array V, DELTA, S[1:N];
RELTOL:= IN[1]; ABSTOL:= IN[2]; MU:= IN[3];
TOLG:= IN[4]; FMIN:= IN[5]; ALFA:= IN[6];
EVLMAX:= IN[7]; OUT[4]:= 0; IT := 0;
F:= FUNCT(N, X, G); EVL:= 1; CNTL:= 0;if ALFA > 0 then
begin INIVEC(1, N * (N + 1) // 2, H, 0);
INISYMD(1, N, 0, H, ALFA)
end;
for I:= 1 step 1 until N do
DELTA[I]:= - SYMMATVEC(1, N, I, H, G);
DG:= SQRT(VECVEC(1, N, 0, G, G));
NRMDELTA:= SQRT(VECVEC(1, N, 0, DELTA, DELTA));
EPS:= SQRT(VECVEC(1, N, 0, X, X)) * RELTOL + ABSTOL;
DG0:= VECVEC(1, N, 0, DELTA, G);
for IT := IT +1 while
(NRMDELTA > EPS or DG > TOLG ) and EVL < EVLMAX do
begin DUPVEC(1, N, 0, S, X); DUPVEC(1, N, 0, V, G);
if IT >= N then ALFA:= 1 else
begin if IT ^= 1 then ALFA:= ALFA / NRMDELTA else
begin ALFA:= 2 * (FMIN - F) / DG0;
if ALFA > 1 then ALFA:= 1
end
end;
ELMVEC(1, N, 0, X, DELTA, ALFA);
F0:= F; F:= FUNCT(N, X, G); EVL:= EVL +1 ;
DG:= VECVEC(1, N, 0, DELTA, G);
if IT = 1 or F0 - F < - MU * DG0 * ALFA then
begin I:= EVLMAX - EVL; CNTL:= CNTL +1 ;
LINEMIN(N, S, DELTA, NRMDELTA, ALFA, G, FUNCT, F0, F,
DG0, DG, I, false , IN); EVL:= EVL + I;
DUPVEC(1, N, 0, X, S);
end LINEMINIMIZATION;
if ALFA ^= 1 then MULVEC(1, N, 0, DELTA, DELTA, ALFA);
MULVEC(1, N, 0, V, V, -1); ELMVEC(1, N, 0, V, G, 1);
for I:= 1 step 1 until N do
S[I]:= SYMMATVEC(1, N, I, H, V);
AID:= VECVEC(1, N, 0, V, S); DG:= (DG - DG0) * ALFA;
if DG > 0 then
begin if DG >= AID then
FLEUPD(H, N, DELTA, S, 1 / DG, (1 + AID / DG) / DG)
else DAVUPD(H, N, DELTA, S, 1 / DG, 1 / AID)
end UPDATING;
for I:= 1 step 1 until N do
DELTA[I]:= -SYMMATVEC(1, N, I, H, G);
ALFA:= NRMDELTA * ALFA;
NRMDELTA:= SQRT(VECVEC(1, N, 0, DELTA, DELTA));
EPS:= SQRT(VECVEC(1, N, 0, X, X)) * RELTOL + ABSTOL;
DG:= SQRT(VECVEC(1, N, 0, G, G));
DG0:= VECVEC(1, N, 0, DELTA, G); if DG0 > 0 then
begin OUT[4]:= -1 ; goto EXIT end
end ITERATION;
EXIT: OUT[0]:= NRMDELTA; OUT[1]:= DG; OUT[2]:= EVL;
OUT[3]:= CNTL; FLEMIN:= F
end FLEMIN;
eop