00001 #include "cadijoint.h"
00002 #include <iostream>
00003 #include "Aniso1DMTObjective.h"
00004 #include "MTStation.h"
00005 #include "gentypes.h"
00006 #include "CLevanisoConf.h"
00007 #include "MTFitSetup.h"
00008 #include <boost/bind.hpp>
00009 #include "PTensor1DMTObjective.h"
00010 #include <boost/shared_ptr.hpp>
00011 #include "PTensorMTStation.h"
00012
00013
00014 using namespace std;
00015
00016 boost::shared_ptr<PlottableObjective> MTObjective;
00017 CLevanisoConf Configuration;
00018
00019 void misfit(float *p, float *misfit, int *m)
00020 {
00021 const int nlayers = abs(*m)/4;
00022 const int nparam = nlayers * 4;
00023 ttranscribed mtmember(nparam);
00024 for (int i = 0; i < nparam; ++i)
00025 {
00026 mtmember(i) = p[i];
00027 }
00028 *misfit = 0.0;
00029 if (Configuration.weights.at(0) > 0)
00030 {
00031
00032 *misfit += Configuration.weights.at(0) * MTObjective->CalcPerformance(mtmember);
00033 }
00034 }
00035
00036
00037 void init(int* nd, float* ranges)
00038 {
00039 MTStation MTData;
00040 PTensorMTStation PTData;
00041 Configuration.GetData("levaniso.conf");
00042 try
00043 {
00044 MTData.GetData(Configuration.mtinputdata);
00045 }
00046 catch(CFatalException &e)
00047 {
00048 cerr << e.what() << endl;
00049 }
00050
00051
00052 if(Configuration.mtfit == "ptensor")
00053 {
00054
00055 PTData.GetData(Configuration.ptensordata);
00056 boost::shared_ptr<PTensor1DMTObjective> PTObjective(new PTensor1DMTObjective(PTData));
00057 MTObjective = PTObjective;
00058 }
00059 else
00060 {
00061
00062 MTData.GetData(Configuration.mtinputdata);
00063 boost::shared_ptr<Aniso1DMTObjective> AnisoObjective(new Aniso1DMTObjective(MTData));
00064 SetupMTFitParameters(Configuration,*AnisoObjective);
00065 MTObjective = AnisoObjective;
00066 }
00067
00068
00069 const int nlayers = Configuration.minres.size();
00070 const int nparams = nlayers * 4;
00071 *nd = nparams;
00072 ttranscribed mtmember(nparams);
00073 copy(Configuration.startres.begin(),Configuration.startres.end(),mtmember.begin());
00074 copy(Configuration.startthick.begin(),Configuration.startthick.end(),mtmember.begin()+nlayers);
00075 copy(Configuration.startaniso.begin(),Configuration.startaniso.end(),mtmember.begin()+2*nlayers);
00076 copy(Configuration.startstrike.begin(),Configuration.startstrike.end(),mtmember.begin()+3*nlayers);
00077 MTObjective->CalcPerformance(mtmember);
00078
00079
00080 for (int i = 0; i < nlayers; ++i)
00081 {
00082 ranges[2*i] = Configuration.minres.at(i);
00083 ranges[2*i+1] = Configuration.maxres.at(i);
00084 }
00085 for (int i = 0; i < nlayers; ++i)
00086 {
00087 ranges[2*i+2*nlayers] = Configuration.minthick.at(i);
00088 ranges[2*i+2*nlayers+1] = Configuration.maxthick.at(i);
00089 }
00090 for (int i = 0; i < nlayers; ++i)
00091 {
00092 ranges[2*i+4*nlayers] = Configuration.minaniso.at(i);
00093 ranges[2*i+4*nlayers+1] = Configuration.maxaniso.at(i);
00094 }
00095 for (int i = 0; i < nlayers; ++i)
00096 {
00097 ranges[2*i+6*nlayers] = Configuration.minstrike.at(i);
00098 ranges[2*i+6*nlayers+1] = Configuration.maxstrike.at(i);
00099 }
00100 cout << "Init finished ! " << endl;;
00101 }