7 #ifndef Tomato_OXFITTERAMOEBANr2_H 8 #define Tomato_OXFITTERAMOEBANr2_H 10 #include "CmakeConfigForTomato.h" 16 #include "nr_modified.h" 28 const int NR_MAX_THREADS = 8;
38 static Model<float> *globalFunctonsT1Nr2Array[NR_MAX_THREADS];
41 static float f_wrapper0(
float *params) {
return globalFunctonsT1Nr2Array[0]->calcCostValue(params+1); }
42 static float f_wrapper1(
float *params) {
return globalFunctonsT1Nr2Array[1]->calcCostValue(params+1); }
43 static float f_wrapper2(
float *params) {
return globalFunctonsT1Nr2Array[2]->calcCostValue(params+1); }
44 static float f_wrapper3(
float *params) {
return globalFunctonsT1Nr2Array[3]->calcCostValue(params+1); }
45 static float f_wrapper4(
float *params) {
return globalFunctonsT1Nr2Array[4]->calcCostValue(params+1); }
46 static float f_wrapper5(
float *params) {
return globalFunctonsT1Nr2Array[5]->calcCostValue(params+1); }
47 static float f_wrapper6(
float *params) {
return globalFunctonsT1Nr2Array[6]->calcCostValue(params+1); }
48 static float f_wrapper7(
float *params) {
return globalFunctonsT1Nr2Array[7]->calcCostValue(params+1); }
51 static float (*f_wrapperArray[NR_MAX_THREADS])(
float *params) = {
71 template<
typename MeasureType>
72 class FitterAmoebaNr2 :
public Fitter<MeasureType> {
80 virtual Fitter<MeasureType> *newByCloning() {
return new FitterAmoebaNr2<MeasureType>(*this); }
83 int performFitting() {
86 int threadId = this->_ThreadId;
87 if (threadId < 0 || threadId >= Ugly::NR_MAX_THREADS){
88 throw std::runtime_error(
"Incorrect threadID");
92 Ugly::globalFunctonsT1Nr2Array[threadId] = this->_Model;
93 float(*func)(
float*) = Ugly::f_wrapperArray[threadId];
94 int nDims = this->_Model->getNDims();
97 float *startPoint =
new float[nDims];
98 KWUtil::copyArrayToArray(nDims, startPoint, this->getParameters());
104 float FTOL = this->getFTolerance();
106 int i, nfunc, j, ndim = NP;
112 p = matrix(1, MP, 1, NP);
115 for (i = 1; i <= MP; i++) {
116 for (j = 1; j <= NP; j++)
118 x[j] = p[i][j] = startPoint[j-1];
120 x[j] = p[i][j] = startPoint[j-1] * 1.4;
125 if (this->_Verbose) {
126 printf(
"\n%3s %10s %12s %12s %14s\n\n",
127 "i",
"x[i]",
"y[i]",
"z[i]",
"function");
128 for (i = 1; i <= MP; i++) {
130 for (j = 1; j <= NP; j++) printf(
"%12.6f ", p[i][j]);
131 printf(
"%12.6f\n", y[i]);
136 amoeba(p, y, ndim, FTOL, func, &nfunc);
139 this->copyToParameters(p[1]+1);
142 if (this->_Verbose) {
143 printf(
"\nNumber of function evaluations: %3d\n", nfunc);
144 printf(
"Vertices of final 3-d simplex and\n");
145 printf(
"function values at the vertices:\n\n");
146 printf(
"%3s %10s %12s %12s %14s\n\n",
147 "i",
"x[i]",
"y[i]",
"z[i]",
"function");
148 for (i = 1; i <= MP; i++) {
150 for (j = 1; j <= NP; j++) printf(
"%12.6f ", p[i][j]);
151 printf(
"%12.6f\n", y[i]);
156 free_matrix(p, 1, MP, 1, NP);
157 free_vector(y, 1, MP);
158 free_vector(x, 1, NP);
159 delete [] startPoint;
167 #endif //Tomato_OXFITTERAMOEBANr2_H
Definition: OxCalculator.h:19