Merge branch 'solve_opt' of git.dynare.org:JohannesPfeifer/dynare

time-shift
Sébastien Villemot 2021-01-22 18:33:12 +01:00
commit dfa6359dd3
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
1 changed files with 26 additions and 19 deletions

View File

@ -14,9 +14,8 @@ function [x,f,exitflag,n_f_evals,n_grad_evals,n_constraint_evals,n_constraint_gr
% fun name of an M-file (M-function) which computes the value % fun name of an M-file (M-function) which computes the value
% of the objective function <fun> at a point x, % of the objective function <fun> at a point x,
% synopsis: f=fun(x) % synopsis: f=fun(x)
% grad name of an M-file (M-function) which computes the gradient % grad indicator whether objective function provides the gradient
% vector of the function <fun> at a point x, % vector of the function <fun> at a point x,
% synopsis: g=grad(x)
% func name of an M-file (M-function) which computes the MAXIMAL % func name of an M-file (M-function) which computes the MAXIMAL
% RESIDUAL(!) for a set of constraints at a point x, % RESIDUAL(!) for a set of constraints at a point x,
% synopsis: fc=func(x) % synopsis: fc=func(x)
@ -126,7 +125,7 @@ if nargin<2 % Function and/or starting point are not specified
end end
if nargin<3 if nargin<3
app=1; % No user-supplied gradients app=1; % No user-supplied gradients
elseif isempty(grad) elseif isempty(grad) || grad==0
app=1; app=1;
else else
app=0; % Exact gradients are supplied app=0; % Exact gradients are supplied
@ -271,9 +270,19 @@ stopf=0;
% COMPUTE THE FUNCTION ( FIRST TIME ) ----{ % COMPUTE THE FUNCTION ( FIRST TIME ) ----{
if trx if trx
f=feval(fun,x',varargin{:}); if app
f=feval(fun,x',varargin{:});
else
[f,g]=feval(fun,x',varargin{:});
n_grad_evals=n_grad_evals+1;
end
else else
f=feval(fun,x,varargin{:}); if app
f=feval(fun,x,varargin{:});
else
[f,g]=feval(fun,x,varargin{:});
n_grad_evals=n_grad_evals+1;
end
end end
n_f_evals=n_f_evals+1; n_f_evals=n_f_evals+1;
if isempty(f) if isempty(f)
@ -378,12 +387,7 @@ if app
end end
n_f_evals=n_f_evals+n; n_f_evals=n_f_evals+n;
else else
if trx %done above
g=feval(grad,x',varargin{:});
else
g=feval(grad,x,varargin{:});
end
n_grad_evals=n_grad_evals+1;
end end
if size(g,2)==1, g=g'; end if size(g,2)==1, g=g'; end
ng=norm(g); ng=norm(g);
@ -674,6 +678,9 @@ while 1
end end
if ksm || kc>=mxtc if ksm || kc>=mxtc
exitflag=-3; exitflag=-3;
% don't return with NaN or Inf despite error code
x=x1;
f=f1;
if trx if trx
x=x'; x=x';
end end
@ -786,10 +793,10 @@ while 1
end end
n_f_evals=n_f_evals+n; n_f_evals=n_f_evals+n;
else else
if trx if trx
g=feval(grad,x',varargin{:}); [~,g]=feval(fun,x',varargin{:});
else else
g=feval(grad,x,varargin{:}); [~,g]=feval(fun,x,varargin{:});
end end
n_grad_evals=n_grad_evals+1; n_grad_evals=n_grad_evals+1;
end end
@ -1084,7 +1091,7 @@ while 1
elseif isnan(f) elseif isnan(f)
if dispwarn if dispwarn
disp(errmes) disp(errmes)
disp(error32) disp(error31)
end end
exitflag=-3; exitflag=-3;
if trx if trx
@ -1105,9 +1112,9 @@ while 1
n_f_evals=n_f_evals+n; n_f_evals=n_f_evals+n;
else else
if trx if trx
g=feval(grad,x',varargin{:}); [~,g]=feval(fun,x',varargin{:});
else else
g=feval(grad,x,varargin{:}); [~,g]=feval(fun,x,varargin{:});
end end
n_grad_evals=n_grad_evals+1; n_grad_evals=n_grad_evals+1;
end end
@ -1210,9 +1217,9 @@ while 1
n_f_evals=n_f_evals+n; n_f_evals=n_f_evals+n;
else else
if trx if trx
gt=feval(grad,x1',varargin{:}); [~,gt]=feval(fun,x1',varargin{:});
else else
gt=feval(grad,x1,varargin{:}); [~,gt]=feval(fun,x1,varargin{:});
end end
n_grad_evals=n_grad_evals+1; n_grad_evals=n_grad_evals+1;
end end