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 __SOLUTION_SET_H 00013 #define __SOLUTION_SET_H 00014 00017 #include <vector> 00018 #include <stdint.h> 00019 #include "FitnessSet.h" 00020 00021 00022 #ifdef LIBCUDAOPTIMIZE_NAMESPACE 00023 OPEN_NAMESPACE 00024 #endif 00025 00026 00031 class SolutionSet 00032 { 00033 private: 00034 unsigned int m_setNumber; 00035 unsigned int m_solutionNumber; 00036 unsigned int m_problemDimension; 00037 unsigned int m_actualSolutionSize; 00038 00039 FitnessSet m_fitnessSet; 00040 00042 float* m_dPositions; 00043 00044 std::vector<float> m_hPositions; 00045 std::vector<float> m_hFitnesses; 00046 std::vector<float> m_hBestFitnesses; 00047 std::vector<float> m_hBestPositions; 00048 00050 float* m_dGlobalBestFitness; 00052 uint32_t* m_dGlobalBestID; 00053 00055 bool m_hostPositionsUpdate; 00057 bool m_hostFitnessesUpdate; 00059 bool m_hostBestPositionsUpdate; 00061 bool m_hostBestFitnessesUpdate; 00062 00064 std::string m_loggerFile; 00065 LOG_LEVEL m_verbosity; 00066 00067 void invalidateAllUpdateFlags(); 00068 void invalidatePositionUpdateFlags(); 00069 void invalidateFitnessUpdateFlags(); 00070 00072 void allocateMemory(); 00073 00074 void cpyDeviceToHost(float* dst, const float* src, unsigned int count); 00075 void cpyHostToDevice(float* dst, const float* src, unsigned int count); 00076 void checkSetNumber(unsigned int sId) const; 00077 void checkSolutionNumber(unsigned int sId) const; 00078 00079 public: 00084 SolutionSet(unsigned int dn, unsigned int sn, unsigned int pn); 00085 virtual ~SolutionSet(); 00086 00089 FitnessSet* getFitnessSet() { return &m_fitnessSet; } 00090 00094 void init(LOG_LEVEL verbosity, std::string loggerFile); 00095 00097 void free(); 00100 void findBests(bool maximize=false); 00101 00104 void setSetNumber(unsigned int sn){m_setNumber = sn;} 00107 void setSolutionNumber(unsigned int pn){m_solutionNumber = pn;} 00110 void setProblemDimension(unsigned int dn){m_problemDimension = dn; m_actualSolutionSize = iAlignUp(dn, 32);} 00115 void setParams(unsigned int sn, unsigned int pn, unsigned int dn) 00116 {setSetNumber(sn);setSolutionNumber(pn);setProblemDimension(dn);} 00119 void setParams(const SolutionSet& src) 00120 {setParams(src.getSetNumber(), src.getSolutionNumber(), src.getProblemDimension());} 00125 void setDevicePositions(float* ptr, POINTER_LOCATION location=HOST_POINTER, unsigned int sid = ALL_SETS); 00128 void setDevicePositionsPtr(float* ptr){invalidatePositionUpdateFlags(); m_dPositions=ptr;} 00133 void setDeviceFitnesses(float* ptr, POINTER_LOCATION location=HOST_POINTER, unsigned int sid = ALL_SETS); 00136 void setDeviceFitnessesPtr(float* ptr){invalidateFitnessUpdateFlags(); m_fitnessSet.setPtr(ptr);} 00139 void setDeviceFitnesses(FitnessSet fitn); 00140 00143 unsigned int getSetNumber() const {return m_setNumber;} 00146 unsigned int getSolutionNumber() const {return m_solutionNumber;} 00149 unsigned int getProblemDimension() const {return m_problemDimension;} 00152 unsigned int getActualSolutionSize() const {return m_actualSolutionSize;} 00155 float* getDevicePositions() {invalidatePositionUpdateFlags(); return m_dPositions;} 00157 const float* getDevicePositionsConst() const {return m_dPositions;} 00160 float* getDeviceFitnesses() {invalidateFitnessUpdateFlags(); return m_fitnessSet.get();} 00162 const float* getDeviceFitnessesConst() const {return m_fitnessSet.get();} 00165 float* getDeviceBestFitnesses() {m_hostBestFitnessesUpdate = false; return m_dGlobalBestFitness;} 00167 const float* getDeviceBestFitnessesConst() const {return m_dGlobalBestFitness;} 00170 uint32_t* getDeviceBestIDs() {m_hostBestFitnessesUpdate = m_hostBestPositionsUpdate = false; return m_dGlobalBestID;} 00172 const uint32_t* getDeviceBestIDsConst() const {return m_dGlobalBestID;} 00176 float* getDevicePositions(unsigned int sid) {checkSetNumber(sid); invalidatePositionUpdateFlags(); return m_dPositions+(sid*m_solutionNumber*m_actualSolutionSize);} 00178 const float* getDevicePositionsConst(unsigned int sid) const {checkSetNumber(sid); return m_dPositions+(sid*m_solutionNumber*m_actualSolutionSize);} 00182 float* getDeviceFitnesses(unsigned int sid) {checkSetNumber(sid); invalidateFitnessUpdateFlags(); return m_fitnessSet.get(sid);} 00184 const float* getDeviceFitnessesConst(unsigned int sid) const {checkSetNumber(sid); return m_fitnessSet.get(sid);} 00188 float* getDeviceBestFitnesses(unsigned int sid) {checkSetNumber(sid); m_hostBestFitnessesUpdate = false; return m_dGlobalBestFitness+sid;} 00190 const float* getDeviceBestFitnessesConst(unsigned int sid) const {checkSetNumber(sid); return m_dGlobalBestFitness+sid;} 00194 uint32_t* getDeviceBestIDs(unsigned int sid) {checkSetNumber(sid); m_hostBestFitnessesUpdate = m_hostBestPositionsUpdate = false; return m_dGlobalBestID+sid;} 00196 const uint32_t* getDeviceBestIDsConst(unsigned int sid)const {checkSetNumber(sid); return m_dGlobalBestID+sid;} 00201 float* getDevicePositions(unsigned int sid, unsigned int pid) {checkSetNumber(sid); checkSolutionNumber(pid); invalidatePositionUpdateFlags(); return m_dPositions+(((sid*m_solutionNumber)+pid)*m_actualSolutionSize);} 00203 const float* getDevicePositionsConst(unsigned int sid, unsigned int pid) const {checkSetNumber(sid); checkSolutionNumber(pid); return m_dPositions+(((sid*m_solutionNumber)+pid)*m_actualSolutionSize);} 00208 float* getDeviceFitnesses(unsigned int sid, unsigned int pid) {checkSetNumber(sid); checkSolutionNumber(pid); invalidateFitnessUpdateFlags(); return m_fitnessSet.get(sid, pid);} 00210 const float* getDeviceFitnessesConst(unsigned int sid, unsigned int pid) const {checkSetNumber(sid); checkSolutionNumber(pid); return m_fitnessSet.get(sid,pid);} 00211 00214 float* getHostFitnesses(); 00217 float* getHostBestFitnesses(); 00220 float* getHostBestPositions(); 00221 00225 float* getHostFitnesses(unsigned int sid); 00229 float getHostBestFitnesses(unsigned int sid); 00233 float* getHostBestPositions(unsigned int sid); 00234 00236 void copyPositionsToHost(); 00241 const float* getHostPositions(unsigned int sid=ALL_SETS, unsigned int pid=ALL_SOLUTIONS); 00246 const float* getHostPositionsConst(unsigned int sid=ALL_SETS, unsigned int pid=ALL_SOLUTIONS) const; 00251 float getHostFitnesses(unsigned int sid, unsigned int pid); 00252 }; 00253 00254 /*close the namespace 00255 this code should be at the end of the file 00256 by Hamid. 23/07/2012*/ 00257 #ifdef LIBCUDAOPTIMIZE_NAMESPACE 00258 CLOSE_NAMESPACE 00259 #endif 00260 00261 00262 #endif