From 83cdf11938283e8debd7efe7e1738af1953e9f8f Mon Sep 17 00:00:00 2001 From: boufaras Date: Tue, 24 Jan 2012 01:30:52 +0000 Subject: [PATCH] include in new paradiseo-gpu package git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@2666 331e1502-861f-0410-8da2-ba01fb791d7f --- .../src/neighborhood/moGPUMapping.h | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100755 branches/ParadisEO-GPU/paradiseo-gpu/src/neighborhood/moGPUMapping.h diff --git a/branches/ParadisEO-GPU/paradiseo-gpu/src/neighborhood/moGPUMapping.h b/branches/ParadisEO-GPU/paradiseo-gpu/src/neighborhood/moGPUMapping.h new file mode 100755 index 000000000..fda2c663d --- /dev/null +++ b/branches/ParadisEO-GPU/paradiseo-gpu/src/neighborhood/moGPUMapping.h @@ -0,0 +1,163 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012 + + Boufaras Karima, Thé Van Luong + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can ue, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + ParadisEO WebSite : http://paradiseo.gforge.inria.fr + Contact: paradiseo-help@lists.gforge.inria.fr + */ + +#ifndef _moGPUMapping_h +#define _moGPUMapping_h + +#include + +/** + * Define a Mapping Neighborhood: + * + * This neighborhood should manipulate a moGPUXChange Neighbor + * It helps to associate to identified neighbor by one index a set of correspondent indexes + */ + +template +class moGPUMapping: public moOrderNeighborhood { + +public: + + /** + * Define type of a solution corresponding to Neighbor + */ + + typedef N Neighbor; + typedef typename Neighbor::EOT EOT; + + using moOrderNeighborhood::neighborhoodSize; + using moOrderNeighborhood::currentIndex; + + /** + * Constructor + * @param _neighborhoodSize the neighborhood size + * @param _xChange the number of positions to exchange + */ + + moGPUMapping(unsigned int _neighborhoodSize, unsigned int _xChange) : + moOrderNeighborhood (_neighborhoodSize), xChange(_xChange) { + + mutex = false; + indices = new unsigned int[xChange]; + mapping = new unsigned int[neighborhoodSize * xChange]; + + } + + /** + * Destructor + */ + + ~moGPUMapping() { + + delete[] (indices); + delete[] (mapping); + } + + /** + * Initialization of the neighborhood + * @param _solution the solution to explore + * @param _current the first neighbor + */ + + virtual void init(EOT& _solution, Neighbor& _current) { + + moOrderNeighborhood::init(_solution, _current); + //Compute the mapping only for the first init + if (!mutex) { + setMapping(_solution.size()); + mutex = true; + } + //get the mapping correspondent to the currentIndex + getMapping(currentIndex); + if (!(_current.getXChange() == xChange)) + _current.setXChange(xChange); + //associate to this neighbor a set of correspondent indexes + _current.setIndices(indices); + } + + /** + * Give the next neighbor + * @param _solution the solution to explore + * @param _current the next neighbor + */ + + virtual void next(EOT& _solution, Neighbor& _current) { + + moOrderNeighborhood::next(_solution, _current); + getMapping(currentIndex); + _current.setIndices(indices); + + } + + /** + * Set the mapping of K-indexes + * @param _size the size of the solution + */ + + virtual void setMapping(unsigned _size) =0; + + /** + * Associate mapping of current index to a set of indexes + * _currentIndex the index to map with a set of indexes + */ + + virtual void getMapping(unsigned int _currentIndex) { + for (unsigned int i = 0; i < xChange; i++) { + indices[i] = mapping[_currentIndex + i * neighborhoodSize]; + } + } + + /** + * update mapping with combination of indexes corresponding to the currentIndex + * @param _indices the set of current combination of indexes + * @param _currentIndex the current index corresponding to the current neighbor + */ + + virtual void updateMapping(unsigned int* _indices, int _currentIndex) { + for (unsigned k = 0; k < xChange; k++) + mapping[_currentIndex + k * neighborhoodSize] = _indices[k]; + } + + /** + * Return the class Name + * @return the class name as a std::string + */ + virtual std::string className() const { + return "moGPUMapping"; + } + +protected: + + unsigned int * indices; + unsigned int * mapping; + unsigned int xChange; + bool mutex; +}; + +#endif