LibCudaOptimize  1.0
SolutionSet.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 __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
 All Classes Files Functions Variables Enumerations Enumerator Defines