From e5011d65a9784813a39539bab8a9e1b9ad46c24f Mon Sep 17 00:00:00 2001
From: Stamatios Sotiropoulos <stam@fmrib.ox.ac.uk>
Date: Fri, 21 Jan 2011 11:28:03 +0000
Subject: [PATCH] Added pseudo-constrained non-linear optimization

---
 pvmfit.cc       | 30 ++++++++++++++++++++++--------
 pvmfitOptions.h |  6 ++++++
 2 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/pvmfit.cc b/pvmfit.cc
index a8e6157..93d707d 100644
--- a/pvmfit.cc
+++ b/pvmfit.cc
@@ -116,15 +116,29 @@ int main(int argc, char** argv)
 	  S(t+1)=data(i,j,k,t);
 
 	if(opts.modelnum.value()==1){
-	  PVM_single pvm(S,bvecs,bvals,opts.nfibres.value());
-	  pvm.fit();
+	  if (opts.cnonlinear.value()){
+	    PVM_single_c pvm(S,bvecs,bvals,opts.nfibres.value());
+	    pvm.fit();
 	  
-	  S0(i-minx,j-miny,k-minz)   = pvm.get_s0();
-	  dvol(i-minx,j-miny,k-minz) = pvm.get_d();
-	  for(int f=0;f<opts.nfibres.value();f++){
-	    fvol[f](i-minx,j-miny,k-minz)  = pvm.get_f(f+1);
-	    thvol[f](i-minx,j-miny,k-minz) = pvm.get_th(f+1);
-	    phvol[f](i-minx,j-miny,k-minz) = pvm.get_ph(f+1);
+	    S0(i-minx,j-miny,k-minz)   = pvm.get_s0();
+	    dvol(i-minx,j-miny,k-minz) = pvm.get_d();
+	    for(int f=0;f<opts.nfibres.value();f++){
+	      fvol[f](i-minx,j-miny,k-minz)  = pvm.get_f(f+1);
+	      thvol[f](i-minx,j-miny,k-minz) = pvm.get_th(f+1);
+	      phvol[f](i-minx,j-miny,k-minz) = pvm.get_ph(f+1);
+	    }
+	  }
+	  else{
+	    PVM_single pvm(S,bvecs,bvals,opts.nfibres.value());
+	    pvm.fit();
+	  
+	    S0(i-minx,j-miny,k-minz)   = pvm.get_s0();
+	    dvol(i-minx,j-miny,k-minz) = pvm.get_d();
+	    for(int f=0;f<opts.nfibres.value();f++){
+	      fvol[f](i-minx,j-miny,k-minz)  = pvm.get_f(f+1);
+	      thvol[f](i-minx,j-miny,k-minz) = pvm.get_th(f+1);
+	      phvol[f](i-minx,j-miny,k-minz) = pvm.get_ph(f+1);
+	    }
 	  }
 	}
 	else{
diff --git a/pvmfitOptions.h b/pvmfitOptions.h
index bf7c7b2..24deea9 100644
--- a/pvmfitOptions.h
+++ b/pvmfitOptions.h
@@ -36,6 +36,8 @@ class pvmfitOptions {
   Option<string> bvalsfile;
   Option<int>    nfibres;
   Option<int>    modelnum;
+  Option<bool>   cnonlinear;
+
   bool parse_command_line(int argc, char** argv);
   
  private:
@@ -84,6 +86,9 @@ class pvmfitOptions {
    modelnum(string("--model"), 1,
 	     string("1:monoexponential;2:non mono-exponential"),
 	     false, requires_argument), 
+   cnonlinear(string("--cnonlinear"),false, 
+	      string("Apply constrained nonlinear optimization on the diffusivity, volume fractions and their sum"),
+	      false,no_argument),
    options("pvmfit", "pvmfit -k <datafile> -m <maskfile> -r <bvecsfile> -b <bvalsfile> [-n 2]\n")
    {
      
@@ -98,6 +103,7 @@ class pvmfitOptions {
        options.add(bvalsfile);
        options.add(nfibres);
        options.add(modelnum);
+       options.add(cnonlinear);
      }
      catch(X_OptionError& e) {
        options.usage();
-- 
GitLab