00001 // CCancer.cpp : Defines the entry point for the console application. 00002 // 00003 00004 #ifdef _WINDOWS 00005 #include "StdAfx.h" 00006 #include <crtdbg.h> // For debugging functions windows only. 00007 #endif 00008 00009 // debugging only 00010 //#define _CRT_DEBUG_MAP_ALLOC 00011 00012 #include "QuorumMaster.h" 00013 #include "InfrastructureMaster.h" 00014 00015 /*#include <fstream.h> 00016 #include <stdlib.h> 00017 #include <iostream.h> 00018 #include <string.h> 00019 //#include "PC12EGFNGFMinimizableDirector.h" 00020 //#include "OneGeneInhibitoryNetworkMinimizableDirector.h" 00021 //#include "AlternateOneGeneInhibitoryNetworkMinimizableDirector.h" 00022 #include "ZeroTAnnealMinimizer.h" 00023 #include "PositiveDefiniteLevenbergMarquardtMinimizer.h" 00024 #include "ParameterReader.h" 00025 #include "GnuPlotterSimulatedAnnealingObserver.h" 00026 #include "LogParameterFilter.h" 00027 #include "SquareRootParameterFilter.h" 00028 #include "IdentityParameterFilter.h" 00029 #include "MixedReactionNetwork.h" 00030 //#include "OneGeneInhibitoryAveragingDirector.h" 00031 //#include "HessianMonteCarloQuench.h" 00032 #include "BasicQuenchMinimizer.h" 00033 #include "RobustLevenbergMarquardtMinimizer.h" 00034 #include "ImprovedLevenbergMarquardtMinimizer.h" 00035 #include "ScaleInvariantMarquardtMinimizer.h" 00036 #include "ConjugateGradientMinimizer.h" 00037 //#include "PC12EGFNGFRunDirector.h" 00038 //#include "PC12AlternateMinimizableDirector.h" 00039 #include "ParameterRandomizer.h" 00040 #include "ExampleNetworkMinimizableDirector.h" 00041 #include "StochasticSensitivityAnalysis.h" 00042 #include "GnuPlotterCostObserver.h" 00043 #include "GnuPlotterParameterScatterPlot.h" 00044 #include "GnuPlotterResidualScatterPlot.h" 00045 #include "CommaStrategyOne.h" 00046 #include "ClonalCommaES.h" 00047 //#include "OneGeneEnsembleRunDirector.h" 00048 //#include "OneGeneEnsembleDirector.h" 00049 //#include "PC12EGFNGFEnsembleDirector.h" 00050 //#include "PC12AlternateEnsembleDirector.h" 00051 //#include "CoupledOneGeneNetworksMinimizableDirector.h" 00052 //#include "CoupledPC12NetworksMinimizableDirector.h" 00053 //#include "EGFRTraffickingCoupledMinimizableDirector.h" 00054 #include "LowDimensionalCostFunctionMapper.h" 00055 #include "QuorumSensingNetworkMinimizableDirector.h" 00056 #include "QuorumSensingRunDirector.h" 00057 //#include "OneGeneInhibitoryNetworkRunDirector.h" 00058 #include "LeastSquaresObserver.h" 00059 #include "ConjugateGradientObserver.h" 00060 //#include "OneGeneStochasticNetworkMinimizableDirector.h" 00061 //#include "LacNetwork.h" 00062 //#include "LacRunDirector.h" 00063 #include "MichaelisMentenHeterodimerizationReaction.h" 00064 //#include "CombinatorialNetwork.h" 00065 //#include "CombinatorialRunDirector.h" 00066 //#include "CombinatorialNetworkMinimizableDirector.h" 00067 #include "LevenbergMarquardtMinimizer.h" 00068 #include "QuorumSensingEnsembleDirector.h" 00069 #include <fenv.h> 00070 */ 00071 00072 main(int argc, char* argv[]) 00073 { 00074 /* int fe=feenableexcept(FE_ALL_EXCEPT); 00075 if (fe == -1) { 00076 cout << "feenableexcept unsuccessful\n"; 00077 } 00078 */ int i; 00079 std::string defaultkey = "default"; 00080 char *parameterfile; 00081 char *method; 00082 int smethod; //to be used in switch 00083 int plotornot; 00084 if (argc == 1) { 00085 parameterfile = "goodtemp6.par"; 00086 method = "c"; 00087 smethod = method[0]; 00088 plotornot = 1; 00089 } 00090 else { 00091 parameterfile = argv[1]; 00092 //since switch can only use single characters the code for which method to 00093 // use is: 00094 // c = conjugate gradient 00095 // l = regular levenberg marquardt 00096 // s = scale invariant levenberg marquardt 00097 // b = basic quench (steepest descent with step size 1.0) 00098 // p = plot (steepest descent with step size 0.0) 00099 // h = stochastic sensitivity analysis (h for Hessian) 00100 // e = ensembledirector (adds error bars to plots) 00101 if (strlen(argv[2]) == 0){ 00102 method = "p"; 00103 } 00104 else { 00105 method = argv[2]; 00106 } 00107 smethod = method[0]; 00108 //if you want to watch the plots, the third argument should be y 00109 if (strlen(argv[3]) == 0){ 00110 plotornot = 0; 00111 } // end if no argv3 00112 else { 00113 if (argv[3][0] == 'y'){ 00114 plotornot = 1; 00115 } // end if argv3 = y 00116 else { 00117 plotornot = 0; 00118 }//end else argv3 = y 00119 } // end else no argv3 00120 } // end else strlen 00121 00122 if (smethod == 'p') { 00123 plotornot = 1; 00124 } 00125 00126 // cout << "plotornot " << plotornot << endl; 00127 00128 // MICROSOFT DEBUGGING STUFF 00129 //_crtBreakAlloc = 55; // Breaks at memory allocation failure no. ? 00130 // global variable 00131 //_CrtSetBreakAlloc(1129148); 00132 00133 // int tmpFlag = _CRTDBG_REPORT_FLAG; 00134 // tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF; 00135 // tmpFlag |= _CRTDBG_ALLOC_MEM_DF; // use any checking at all. 00136 // tmpFlag |= _CRTDBG_LEAK_CHECK_DF; // at end of program. 00137 // tmpFlag |= _CRTDBG_CHECK_ALWAYS_DF; // end of program 00138 // tmpFlag &= ~_CRTDBG_DELAY_FREE_MEM_DF; // turn it off 00139 00140 //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 00141 00142 //CRunDirector *rD = new COneGeneInhibitoryNetworkRunDirector(); 00143 //CRunDirector *rD = new COneGeneInhibitoryAveragingDirector(); 00144 //CRunDirector *rD = new CPC12EGFNGFRunDirector(); 00145 //CEnsembleCombinationDirector *rD = new COneGeneEnsembleDirector(250); 00146 //CEnsembleCombinationDirector *rD = new CPC12EGFNGFEnsembleDirector(50); 00147 //CEnsembleCombinationDirector *rD = new CPC12AlternateEnsembleDirector(50); 00148 // CEnsembleCombinationDirector *rD = new CQuorumSensingEnsembleDirector(5); 00149 // CRunDirector *rD = new CQuorumSensingRunDirector(); 00150 //CRunDirector *rD = new CLacRunDirector(); 00151 //CRunDirector *rD = new CCombinatorialRunDirector(); 00152 00153 // rD->Execute(); 00154 // delete rD; 00155 // cout << "Done plotting ensembledirector, proceed?" << endl; 00156 // cin.get(); 00157 00158 // define an uber-minimizable 00159 //NetworkMinimizableDirector *nM = new CPC12AlternateMinimizableDirector(); 00160 00161 //NetworkMinimizableDirector *nM = new PC12EGFNGFMinimizableDirector(); 00162 00163 //NetworkMinimizableDirector *nM = new CCoupledPC12NetworksMinimizableDirector(0.01,0.0); 00164 00165 //OneGeneInhibitoryNetwork is a quick test case for changes 00166 //NetworkMinimizableDirector *nM = new COneGeneInhibitoryNetworkMinimizableDirector(plotornot); 00167 //NetworkMinimizableDirector *nM = new COneGeneStochasticNetworkMinimizableDirector(); 00168 00169 NetworkMinimizableDirector *nM = new CQuorumSensingNetworkMinimizableDirector(plotornot); 00170 00171 //NetworkMinimizableDirector *nM = new CCombinatorialNetworkMinimizableDirector(); 00172 00173 //NetworkMinimizableDirector *nM = new CAlternateOneGeneInhibitoryNetworkMinimizableDirector(); 00174 00175 //NetworkMinimizableDirector *nM = new CExampleNetworkMinimizableDirector(); 00176 00177 //NetworkMinimizableDirector *nM = new CCoupledOneGeneNetworksMinimizableDirector(0.01,0.0); 00178 00179 //NetworkMinimizableDirector *nM = new CEGFRTraffickingCoupledMinimizableDirector(32.0,0.0); 00180 00181 /* 00182 // read in two sets of parameters 00183 ParameterReader *pR1 = new ParameterReader("min2_cg_woPI3K.par"); 00184 double *p1 = new double[nM->GetNParameters()]; 00185 for(int i = 0; i < nM->GetNParameters(); i++) 00186 { 00187 p1[i] = pR1->ReadParameter(); 00188 } 00189 delete pR1; 00190 ParameterReader *pR2 = new ParameterReader("min3_cg_woPI3K.par"); 00191 double *p2 = new double[nM->GetNParameters()]; 00192 for(i = 0; i < nM->GetNParameters(); i++) 00193 { 00194 p2[i] = pR2->ReadParameter(); 00195 } 00196 delete pR2; 00197 ParameterReader *pR3 = new ParameterReader("min4_cg_woPI3K.par"); 00198 double *p3 = new double[nM->GetNParameters()]; 00199 for(i = 0; i < nM->GetNParameters(); i++) 00200 { 00201 p3[i] = pR3->ReadParameter(); 00202 } 00203 delete pR3; 00204 00205 // create the mapper and filter 00206 CLowDimensionalCostFunctionMapper *pMap = new CLowDimensionalCostFunctionMapper(); 00207 CParameterFilter *pFilter = new CLogParameterFilter(); 00208 // do the mapping 00209 pMap->Map(nM,pFilter,p1,p2,p3,-1,1,-1,1,961); 00210 00211 delete pMap; 00212 delete pFilter; 00213 delete nM; 00214 delete [] p1; 00215 delete [] p2; 00216 delete [] p3; 00217 */ 00218 00219 double *parameters = new double[nM->GetNParameters()]; 00220 cout << "Total number of parameters is " << nM->GetNParameters() << endl; 00221 if (parameterfile == defaultkey ) { 00222 // use default parameters 00223 for(i = 0; i < nM->GetNParameters(); i++) 00224 { 00225 parameters[i] = nM->GetParameter(i); 00226 } 00227 } 00228 else { 00229 // read parameters from previous optimization pass 00230 ParameterReader *pReader = new ParameterReader(parameterfile); 00231 for(i = 0; i < nM->GetNParameters(); i++) 00232 { 00233 parameters[i] = pReader->ReadParameter(); 00234 } 00235 delete pReader; 00236 } 00237 00238 /* // randomize parameters 00239 CParameterRandomizer *pR = new CParameterRandomizer(9891); 00240 pR->Randomize(parameters,nM->GetNParameters(),0.25,1); 00241 */ 00242 //Print reactions in tex or mathematica input 00243 /* ReactionNetwork *rN = new CQuorumSensingNetwork(); 00244 rN->GetReactions(); 00245 rN->DumpTeXForm("QSequations.tex"); 00246 // rN->DumpMathematicaForm("steadystate.dat"); 00247 delete rN; 00248 cout << "texform printed\n"; 00249 cin.get(); 00250 */ 00251 /* 00252 // randomize parameters 00253 CParameterRandomizer *pR = new CParameterRandomizer(776157); 00254 pR->Randomize(parameters,nM->GetNParameters(),0.5,3); 00255 */ 00256 00257 //cout << nM->ObjectiveFunction(parameters) << endl; 00258 00259 /* 00260 // STEPSIZE TESTER - FOR USE WITH STOCHASTIC SENSITIVITY 00261 // evaluate the objective function at the minimum to determine what size step 00262 // to give to fixed stepsize mover 00263 double cost = nM->ObjectiveFunction(parameters); 00264 cout << "Cost of parameter set is " << cost << endl; 00265 for(int nEx = 0; nEx < nM->GetNExperiments(); nEx++) 00266 { 00267 cout << "Experiment " << nEx << ":" << endl; 00268 cout << "\tSmallest stepsize was " << nM->GetMover(nEx)->GetMinStepSize() << endl; 00269 cout << "\tLargest stepsize was " << nM->GetMover(nEx)->GetMaxStepSize() << endl; 00270 cout << "\tTotal number of steps was " << nM->GetMover(nEx)->GetTotalStepsTaken() << endl; 00271 } 00272 // just a dummy so I don't have to keep commenting out delete statement at bottom 00273 Minimizer *minimizer = new CBasicQuenchMinimizer(1,10,1.0,1); 00274 */ 00275 00276 /* CParameterFilter *pFilter = new CLogParameterFilter(); 00277 CStochasticSensitivityAnalysis *minimizer = new CStochasticSensitivityAnalysis(false,true,25,2115,pFilter,1.0e-6); 00278 cout << "Performing Stochastic Sensitivity Analysis" << endl; 00279 minimizer->DoAnalysis(parameters,nM); 00280 cout << "RW Variance : " << minimizer->GetRWValue() << endl; 00281 delete pFilter; 00282 */ 00283 /* 00284 cout << "(mu/rho,lambda)-ES One Selected" << endl; 00285 CParameterFilter *filter = new CLogParameterFilter(); 00286 Minimizer *minimizer = new CCommaStrategyOne(filter,1.0,15,2,50,100,887); 00287 double cost = minimizer->Minimize(parameters,nM); 00288 cout << "Average cost of final population " << cost << endl; 00289 delete filter; 00290 */ 00291 /* 00292 cout << "(mu,lambda)-ES Selected" << endl; 00293 CParameterFilter *filter = new CLogParameterFilter(); 00294 Minimizer *minimizer = new CClonalCommaES(filter,0.0,15,100,1109); 00295 double cost = minimizer->Minimize(parameters,nM); 00296 cout << "Average cost of final population " << cost << endl; 00297 delete filter; 00298 */ 00299 00300 // BE CAREFUL WITH THE ERROR TOLERANCE, PARTICULARLY IF YOU USE A LOW ORDER 00301 // INTEGRATOR 00302 // CParameterFilter *filter = new CIdentityParameterFilter(); 00303 CParameterFilter *filter = new CLogParameterFilter(); 00304 double cost; 00305 Minimizer *minimizer; 00306 int nEquilibrationSteps; 00307 double stepScale; 00308 CLeastSquaresObserver *LMForcesObserver = new CLeastSquaresObserver(); 00309 switch (smethod) { 00310 case 'l': 00311 cout << "Levenberg-Marquardt Selected" << endl; 00312 minimizer = new CImprovedLevenbergMarquardtMinimizer(filter,false,1.0e-06,false,1.0e-08,true,1.0e-06,true,1.0e-06,1000,1.0e-06); 00313 //CLeastSquaresObserver *LMForcesObserver = new CLeastSquaresObserver(); 00314 minimizer->Attach(LMForcesObserver); 00315 cost = minimizer->Minimize(parameters,nM); 00316 cout << "Final cost of " << cost << endl; 00317 minimizer->Detach(LMForcesObserver); 00318 delete filter; 00319 break; 00320 00321 case 's': 00322 cout << "Scale-Invariant Levenberg-Marquardt Selected" << endl; 00323 minimizer = new CScaleInvariantMarquardtMinimizer(filter,false,1.0e-2,true,1.0e-08,true,1.0e-06,true,1.0e-06,1000,1.0e-06); 00324 cost = minimizer->Minimize(parameters,nM); 00325 cout << "Final cost of " << cost << endl; 00326 delete filter; 00327 break; 00328 00329 case 'c': 00330 cout << "Conjugate Gradient Selected" << endl; 00331 minimizer = new CConjugateGradientMinimizer(false,filter,3,1.0e-06); 00332 // CConjugateGradientObserver *CGForcesObserver = new CConjugateGradientObserver(); 00333 // minimizer->Attach(CGForcesObserver); 00334 cost = minimizer->Minimize(parameters,nM); 00335 // minimizer->Detach(CGForcesObserver); 00336 delete filter; 00337 break; 00338 00339 case 'p': 00340 // GnuPlotterSimulatedAnnealingObserver *costObserver = new GnuPlotterSimulatedAnnealingObserver(); 00341 // costObserver->SetTitle("Basic Quench"); 00342 cout << "Plot Selected" << endl; 00343 nEquilibrationSteps = 25; 00344 stepScale = 0.0; 00345 minimizer = new CBasicQuenchMinimizer(nEquilibrationSteps,10,stepScale,99449,filter); 00346 // minimizer->Attach(costObserver); 00347 cost = minimizer->Minimize(parameters,nM); 00348 // minimizer->Detach(costObserver); 00349 // delete costObserver; 00350 break; 00351 00352 case 'b': 00353 // GnuPlotterSimulatedAnnealingObserver *costObserver = new GnuPlotterSimulatedAnnealingObserver(); 00354 // costObserver->SetTitle("Basic Quench"); 00355 cout << "Basic Quench Selected" << endl; 00356 nEquilibrationSteps = 25; 00357 stepScale = 1.0; 00358 minimizer = new CBasicQuenchMinimizer(nEquilibrationSteps,10,stepScale,99449,filter); 00359 // minimizer->Attach(costObserver); 00360 cost = minimizer->Minimize(parameters,nM); 00361 // minimizer->Detach(costObserver); 00362 // delete costObserver; 00363 break; 00364 00365 case 'h': 00366 CParameterFilter *pFilter = new CLogParameterFilter(); 00367 CStochasticSensitivityAnalysis *minimizer = new CStochasticSensitivityAnalysis(false,true,50,2115,pFilter,1.0e-6); 00368 cout << "Performing Stochastic Sensitivity Analysis" << endl; 00369 minimizer->DoAnalysis(parameters,nM); 00370 cout << "RW Variance : " << minimizer->GetRWValue() << endl; 00371 delete pFilter; 00372 break; 00373 00374 }//end switch method 00375 00376 cout << "Best cost for this minimization is " << cost << endl; 00377 // write the best parameters to a file and stdout 00378 fstream *pfbest = new fstream("goodtemp10.par",ios::out); 00379 *pfbest << "##################################################################" << endl; 00380 *pfbest << "# BEST PARAMETERS" << endl; 00381 *pfbest << "# COST : " << cost << endl; 00382 *pfbest << "##################################################################" << endl; 00383 for(i = 0; i < nM->GetNParameters(); i++) 00384 { 00385 *pfbest << parameters[i] << endl; 00386 } 00387 delete pfbest; 00388 00389 cout << "finish?" << endl; 00390 cin.get(); 00391 00392 delete minimizer; 00393 delete [] parameters; 00394 delete nM; 00395 00396 return 0; 00397 00398 }