diff --git a/minimize.cc b/minimize.cc index 7380983407860753fee45d2f783401c5d6c17d09..f85e2c992b521fcdefd6be1de4c7a641f2471c12 100644 --- a/minimize.cc +++ b/minimize.cc @@ -171,7 +171,7 @@ ReturnMatrix gradient(const ColumnVector& x, const EvalFunction& func, float h,i return deriv; } -ReturnMatrix hessian(const ColumnVector& x, const EvalFunction& func, float h,int errorord) +ReturnMatrix hessian(const ColumnVector& x, const EvalFunction& func, ColumnVector& paramstovaryflags, float h,int errorord) { //evaluates the hessian of function "eval" at x in parameter space //errorord=4 requires something like 8n^2-3n evaluations @@ -191,7 +191,7 @@ ReturnMatrix hessian(const ColumnVector& x, const EvalFunction& func, float h,in } -void minsearch(ColumnVector& x, const EvalFunction& func){ +void minsearch(ColumnVector& x, const EvalFunction& func, ColumnVector& paramstovaryflags){ //perform generic function minimization without gradient info int n=x.Nrows(), maxiter=200*n,iter=0; int func_evals=0; @@ -344,11 +344,10 @@ void minsearch(ColumnVector& x, const EvalFunction& func){ } //closing while x=v[0].second; - - + } -void scg(ColumnVector& x,const gEvalFunction& func, float tol, float eps, int niters){ +void scg(ColumnVector& x,const gEvalFunction& func, ColumnVector& paramstovaryflags, float tol, float eps, int niters){ int fevals=0; int gevals=0; diff --git a/minimize.h b/minimize.h index 8716aef861d726721902de9dc0d1de3bcf137612..4b64eef651c95d562e8b1b4b1ee387aab50cb5ab 100644 --- a/minimize.h +++ b/minimize.h @@ -52,11 +52,11 @@ float diff2(const ColumnVector& x, const EvalFunction& func, int i,int j,float h ReturnMatrix gradient(const ColumnVector& x, const EvalFunction& func,float h,int errorord=4);// finite diff derivative vector -ReturnMatrix hessian(const ColumnVector& x, const EvalFunction& func,float h,int errorord=4);// finite diff hessian +ReturnMatrix hessian(const ColumnVector& x, const EvalFunction& func, ColumnVector& paramstovaryflags,float h,int errorord=4);// finite diff hessian -void minsearch(ColumnVector& x, const EvalFunction& func); +void minsearch(ColumnVector& x, const EvalFunction& func, ColumnVector& paramstovaryflags); -void scg(ColumnVector& x, const gEvalFunction& func, float tol = 0.0000001, float eps=1e-16, int niters=100); +void scg(ColumnVector& x, const gEvalFunction& func, ColumnVector& paramstovaryflags, float tol = 0.0000001, float eps=1e-16, int niters=100); class EvalFunction {//Function where gradient is not analytic (or you are too lazy to work it out) (required for fminsearch) @@ -67,7 +67,14 @@ public: virtual void minimize(ColumnVector& x) { - minsearch(x,*this); + ColumnVector paramstovaryflags(x.Nrows()); + paramstovaryflags = 1; + minsearch(x,*this,paramstovaryflags); + } + + virtual void minimize(ColumnVector& x, ColumnVector& paramstovaryflags) + { + minsearch(x,*this,paramstovaryflags); } private: @@ -86,7 +93,14 @@ public: virtual void minimize(ColumnVector& x) { - scg(x,*this); + ColumnVector paramstovaryflags(x.Nrows()); + paramstovaryflags = 1; + scg(x,*this,paramstovaryflags); + } + + virtual void minimize(ColumnVector& x, ColumnVector& paramstovaryflags) + { + scg(x,*this,paramstovaryflags); } private: