LibCudaOptimize  1.0
IOptimizer.h
Go to the documentation of this file.
00001 //*************************************************************************//
00002 //                                                                         //
00003 //  LibCudaOptimize                                                        //
00004 //  Copyright (C) 2012 Ibislab, University of Parma                        //
00005 //  Authors: Youssef S.G. Nashed, Roberto Ugolotti                         //
00006 //                                                                         //
00007 //  You should have received a copy of the GNU General Public License      //
00008 //  along with this program.  If not, see <http://www.gnu.org/licenses/>   //
00009 //                                                                         //
00010 //*************************************************************************//
00011 
00012 #ifndef OPTIMIZER_H
00013 #define OPTIMIZER_H
00014 
00017 #include <curand_kernel.h>
00018 #include "SolutionSet.h"
00019 #include "FitnessSet.h"
00020 #include "IOptimizer.cuh"
00021 
00022 /*open the namespace
00023   this code should be after all the #include lines and before the first line of the code in each file.
00024   by Hamid. 23/07/2012*/
00025 #ifdef LIBCUDAOPTIMIZE_NAMESPACE
00026 OPEN_NAMESPACE
00027 #endif
00028 
00029 #ifndef PRIVATE_DOXYGEN
00030 #define NUM_SETS 1
00031 #define NUM_SOLUTIONS 100
00032 #define PROBLEM_DIMENSIONS 100
00033 #define BOUNDS 100
00034 #define STOPTIME 1000
00035 #define GENERATIONS 100
00036 #define FUNC_EVALS 300000
00037 #define MIN_FITNESS 0.000000000001f
00038 #endif
00039 
00043 typedef void(*EvalFuncPtr)(const SolutionSet*,FitnessSet*,dim3,dim3);
00044 
00049 typedef enum
00050 {
00051         TERMINATE_EVALS = 0x1, 
00052         TERMINATE_GENS  = 0x2, 
00053         TERMINATE_FIT   = 0x4, 
00054         TERMINATE_TIME  = 0x8, 
00055 } TERMINATION_FLAGS;
00056 
00058 typedef enum {
00059   MAXIMUM,
00060   MINIMUM
00061 } OPTIMUM;
00062 
00071 class IOptimizer
00072 {
00073 protected:
00074 
00075 #ifndef PRIVATE_DOXYGEN
00076     
00077         SolutionSet m_solutionSet;
00078 
00079         EvalFuncPtr m_evalFuncPtr;
00080         TERMINATION_FLAGS m_terminationFlags;
00081 
00082         //Termination criteria
00083         unsigned int m_currentEvals;
00084         unsigned int m_currentGeneration;
00085         float m_elapsedTime;
00086 
00087         unsigned int m_evalsNum;
00088         unsigned int m_generationNum;
00089         std::vector<float> m_stoppingFitnesses;
00090         std::vector<bool> m_stoppingFlags;
00091         float m_stoppingTime;
00092 
00093         //Search Space bounds per dimension
00094         float2* m_dBounds;
00095         
00097         curandState* m_randStates;
00098 
00100         dim3 m_calculateFitnessesGrid;
00101         dim3 m_calculateFitnessesBlock;
00102 
00103         bool m_initialized;
00104         bool m_hostFitnessEval;
00105 
00107         LOG_LEVEL m_verbosity;
00108     std::string m_loggerFile;
00109         
00111         OPTIMUM optimizationType;
00112     
00114         virtual void initBounds();
00115         virtual bool isTerminated();
00120         virtual bool isBetter(float, float);
00121         
00122         void checkSetNumber(unsigned int sId);
00123 
00124 #endif
00125 
00128         virtual void initSolutions(dim3 initializationGrid,dim3 initializationBlock) = 0;
00132         virtual void step(dim3 initializationGrid,dim3 initializationBlock) = 0;
00137         virtual void fitnessEvaluation(dim3 initializationGrid,dim3 initializationBlock,bool first=false) = 0;
00142         virtual void update(dim3 initializationGrid,dim3 initializationBlock,bool first=false) = 0;
00143     
00145         virtual void findBest();
00146 
00147 public:
00149         IOptimizer(EvalFuncPtr fPtr=NULL, unsigned int dn=PROBLEM_DIMENSIONS, unsigned int sn=NUM_SETS, unsigned int pn=NUM_SOLUTIONS);
00150         virtual ~IOptimizer();
00151 
00153         virtual bool init();
00155         virtual void free();
00157         virtual void optimize();
00158 
00165         void setParams(EvalFuncPtr fPtr=NULL, unsigned int dn=PROBLEM_DIMENSIONS, unsigned int sn=NUM_SETS, unsigned int pn=NUM_SOLUTIONS)
00166         {
00167                 m_evalFuncPtr = fPtr;
00168                 m_solutionSet.setSetNumber(sn);
00169                 m_solutionSet.setSolutionNumber(pn);
00170                 m_solutionSet.setProblemDimension(dn);
00171                 m_initialized = false;
00172         }
00182         void setTerminationFlags(TERMINATION_FLAGS f)                           {m_terminationFlags = f;}
00184         void setGenerations(unsigned int gn)                                            {m_generationNum = gn;}
00186         void setFunctionEvals(unsigned int fn)                                          {m_evalsNum = fn;}
00188         void setStoppingTime(float st)                                                          {m_stoppingTime = st;}
00190         void setStoppingFitness(float f)                                                        {m_stoppingFitnesses.assign(m_solutionSet.getSetNumber(), f);m_stoppingFlags.assign(m_solutionSet.getSetNumber(), false);}
00192         void setStoppingFitness(unsigned int sId, float f)                      {checkSetNumber(sId); m_stoppingFitnesses.resize(m_solutionSet.getSetNumber(), MIN_FITNESS); m_stoppingFlags.resize(m_solutionSet.getSetNumber(), false); m_stoppingFitnesses[sId]=f;}
00194         void setNumberOfSets(unsigned int sn)                                           {m_initialized=false; m_solutionSet.setSetNumber(sn);}
00196         void setNumberOfSolutions(unsigned int pn)                                      {m_initialized=false; m_solutionSet.setSolutionNumber(pn);}
00198         void setProblemDimension(unsigned int dn)                                       {m_initialized=false; m_solutionSet.setProblemDimension(dn);}
00200         void setEvalFuncPtr(EvalFuncPtr evalPtr)                                        {m_evalFuncPtr = evalPtr;}
00202         void setBounds(float2 bounds)                                                           {if(!m_dBounds)initBounds(); h_fillBounds(m_dBounds, bounds, 0, m_solutionSet.getSetNumber()*m_solutionSet.getActualSolutionSize());}
00204         void setBounds(unsigned int sId, float2 bounds)                         {checkSetNumber(sId); if(!m_dBounds)initBounds(); h_fillBounds(m_dBounds, bounds, sId*m_solutionSet.getProblemDimension(), m_solutionSet.getActualSolutionSize());}
00206         void setBounds(unsigned int sId, unsigned int dId, float2 bounds)       {checkSetNumber(sId); if(!m_dBounds)initBounds(); h_fillBounds(m_dBounds, bounds, (sId*m_solutionSet.getActualSolutionSize())+dId, 1);}
00208         void setVerbosity(LOG_LEVEL verb)                                                       {m_verbosity=verb;}
00210         void setOptimizationType(OPTIMUM ot)                                            {optimizationType=ot;}
00212         void setHostFitnessEvaluation(bool on)                                          {m_hostFitnessEval=on;}
00214     void setFileOutput(std::string f)                           { m_loggerFile=f; }
00216     void resetFileOutput()                                      { m_loggerFile=""; }
00217 
00220         const SolutionSet* getSolutionSet() const                                       {return &m_solutionSet;}
00222         unsigned int getNumberOfSets() const                                            {return m_solutionSet.getSetNumber();}
00224         unsigned int getNumberOfSolutions() const                                       {return m_solutionSet.getSolutionNumber();}
00226         unsigned int getProblemDimension() const                                        {return m_solutionSet.getProblemDimension();}
00228         unsigned int getFunctionEvals() const                                           {return m_evalsNum;}
00230     unsigned int getCurrentEvals() const                                                {return m_currentEvals;}
00232     unsigned int getCurrentGeneration() const                                   {return m_currentGeneration;}
00234         TERMINATION_FLAGS getTerminationFlags() const                           {return m_terminationFlags;}
00236         float getElapsedTime() const                                                            {return m_elapsedTime;}
00238         virtual float* getBestFitnesses()                                                       {return m_solutionSet.getHostBestFitnesses();}
00240         virtual float  getBestFitness(unsigned int sid)                         {checkSetNumber(sid); return m_solutionSet.getHostBestFitnesses(sid);}
00242         virtual float* getBestSolution()                                                        {return m_solutionSet.getHostBestPositions();}
00244         virtual float* getBestSolution(unsigned int sid)                        {checkSetNumber(sid); return m_solutionSet.getHostBestPositions(sid);}
00246         bool isHostFitnessEvaluation() const                                            {return m_hostFitnessEval;}
00247         
00248 };
00249 
00250 /*close the namespace
00251   this code should be at the end of the file
00252   by Hamid. 23/07/2012*/
00253 #ifdef LIBCUDAOPTIMIZE_NAMESPACE
00254 CLOSE_NAMESPACE
00255 #endif
00256 
00257 #endif
 All Classes Files Functions Variables Enumerations Enumerator Defines