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   vtkTypeMacro(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