00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00031 #ifndef __vtkAmoebaMinimizer_h
00032 #define __vtkAmoebaMinimizer_h
00033
00034 #include "vtkObject.h"
00035
00036 class VTK_COMMON_EXPORT vtkAmoebaMinimizer : public vtkObject
00037 {
00038 public:
00039 static vtkAmoebaMinimizer *New();
00040 vtkTypeRevisionMacro(vtkAmoebaMinimizer,vtkObject);
00041 void PrintSelf(ostream& os, vtkIndent indent);
00042
00049 void SetFunction(void (*f)(void *), void *arg);
00050
00052 void SetFunctionArgDelete(void (*f)(void *));
00053
00055
00061 void SetParameterValue(const char *name, double value);
00062 void SetParameterValue(int i, double value);
00064
00066
00070 void SetParameterScale(const char *name, double scale);
00071 double GetParameterScale(const char *name);
00072 void SetParameterScale(int i, double scale);
00073 double GetParameterScale(int i) { return this->ParameterScales[i]; };
00075
00077
00081 double GetParameterValue(const char *name);
00082 double GetParameterValue(int i) { return this->ParameterValues[i]; };
00084
00087 const char *GetParameterName(int i) { return this->ParameterNames[i]; };
00088
00090 int GetNumberOfParameters() { return this->NumberOfParameters; };
00091
00094 void Initialize();
00095
00098 virtual void Minimize();
00099
00102 virtual int Iterate();
00103
00105
00106 vtkSetMacro(FunctionValue,double);
00107 double GetFunctionValue() { return this->FunctionValue; };
00109
00111
00112 vtkSetMacro(Tolerance,double);
00113 vtkGetMacro(Tolerance,double);
00115
00117
00118 vtkSetMacro(MaxIterations,int);
00119 vtkGetMacro(MaxIterations,int);
00121
00123
00125 vtkGetMacro(Iterations,int);
00127
00129
00130 vtkGetMacro(FunctionEvaluations,int);
00132
00135 void EvaluateFunction();
00136
00137 protected:
00138 vtkAmoebaMinimizer();
00139 ~vtkAmoebaMinimizer();
00140
00141
00142 void (*Function)(void *);
00143 void (*FunctionArgDelete)(void *);
00144 void *FunctionArg;
00145
00146
00147 int NumberOfParameters;
00148 char **ParameterNames;
00149 double *ParameterValues;
00150 double *ParameterScales;
00151 double FunctionValue;
00152
00153 double Tolerance;
00154 int MaxIterations;
00155 int Iterations;
00156 int FunctionEvaluations;
00157
00158 private:
00159
00160
00161 double **AmoebaVertices;
00162 double *AmoebaValues;
00163 double *AmoebaSum;
00164 int AmoebaNStepsNoImprovement;
00165
00166 void InitializeAmoeba();
00167 void GetAmoebaParameterValues();
00168 void TerminateAmoeba();
00169 double TryAmoeba(double sum[], int high, double fac);
00170 int PerformAmoeba();
00171
00172
00173 vtkAmoebaMinimizer(const vtkAmoebaMinimizer&);
00174 void operator=(const vtkAmoebaMinimizer&);
00175 };
00176
00177 #endif