From 274304ce507e684a693bed16709a53392e34504a Mon Sep 17 00:00:00 2001
From: Mark Woolrich <woolrich@fmrib.ox.ac.uk>
Date: Tue, 22 Jun 2004 12:27:50 +0000
Subject: [PATCH] *** empty log message ***

---
 minimize.cc |  9 ++++-----
 minimize.h  | 24 +++++++++++++++++++-----
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/minimize.cc b/minimize.cc
index 7380983..f85e2c9 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 8716aef..4b64eef 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:
-- 
GitLab