LibCudaOptimize
1.0
|
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