Merge branch 'islandmodel'
This commit is contained in:
commit
953b4377e9
77 changed files with 4960 additions and 408 deletions
|
|
@ -44,6 +44,7 @@ set(CMAKE_CXX_FLAGS_RELEASE "-Wunknown-pragmas -O2" CACHE STRING "" FORCE)
|
||||||
if(SMP)
|
if(SMP)
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -pthread" CACHE STRING "" FORCE)
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -pthread" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -pthread" CACHE STRING "" FORCE)
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -pthread" CACHE STRING "" FORCE)
|
||||||
|
add_definitions(-D_GLIBCXX_USE_NANOSLEEP)
|
||||||
endif(SMP)
|
endif(SMP)
|
||||||
|
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,10 @@ if(PROFILING)
|
||||||
COMMAND lcov -r output.info '*/tutorial*' -o output.info
|
COMMAND lcov -r output.info '*/tutorial*' -o output.info
|
||||||
COMMAND lcov -r output.info '/usr*' -o output.info
|
COMMAND lcov -r output.info '/usr*' -o output.info
|
||||||
COMMAND lcov -r output.info '*/test*' -o output.info
|
COMMAND lcov -r output.info '*/test*' -o output.info
|
||||||
|
COMMAND lcov -r output.info '*/eo*' -o output.info
|
||||||
|
COMMAND lcov -r output.info '*/mo*' -o output.info
|
||||||
|
COMMAND lcov -r output.info '*/moeo*' -o output.info
|
||||||
|
COMMAND lcov -r output.info '*/problems*' -o output.info
|
||||||
COMMAND genhtml output.info -o coverage/ --highlight --legend
|
COMMAND genhtml output.info -o coverage/ --highlight --legend
|
||||||
)
|
)
|
||||||
else(LCOV)
|
else(LCOV)
|
||||||
|
|
|
||||||
62
eo/src/eoInvertedContinue.h
Normal file
62
eo/src/eoInvertedContinue.h
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
<eoInvertedContinue.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy
|
||||||
|
|
||||||
|
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 _eoInvertedContinue_h
|
||||||
|
#define _eoInvertedContinue_h
|
||||||
|
|
||||||
|
#include <eoContinue.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the opposite of the wrapped continuator
|
||||||
|
*
|
||||||
|
* @ingroup Continuators
|
||||||
|
*/
|
||||||
|
template< class EOT>
|
||||||
|
class eoInvertedContinue: public eoContinue<EOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Ctor
|
||||||
|
eoInvertedContinue(eoContinue<EOT>& _cont)
|
||||||
|
: cont(_cont) {};
|
||||||
|
|
||||||
|
/** Returns the opposite of the wrapped continuator
|
||||||
|
*/
|
||||||
|
virtual bool operator() ( const eoPop<EOT>& _pop )
|
||||||
|
{
|
||||||
|
return !cont(_pop);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string className(void) const { return "eoInvertedContinue"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
eoContinue<EOT> &eval;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -11,7 +11,7 @@ if(DOXYGEN_FOUND)
|
||||||
# Creating the custom target
|
# Creating the custom target
|
||||||
if(UNIX AND NOT ${CMAKE_VERBOSE_MAKEFILE})
|
if(UNIX AND NOT ${CMAKE_VERBOSE_MAKEFILE})
|
||||||
add_custom_target(doc-smp
|
add_custom_target(doc-smp
|
||||||
COMMAND ${DOXYGEN_EXECUTABLE} ${SMP_DOC_CONFIG_FILE} 2> /dev/null > /dev/null
|
COMMAND ${DOXYGEN_EXECUTABLE} ${SMP_DOC_CONFIG_FILE}
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
else(UNIX AND NOT ${CMAKE_VERBOSE_MAKEFILE})
|
else(UNIX AND NOT ${CMAKE_VERBOSE_MAKEFILE})
|
||||||
add_custom_target(doc-smp
|
add_custom_target(doc-smp
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
ParadisEO-SMP for Symmetric MultiProcessing or Shared Memory Parallelism is a module for multicores computations on several algorithms proposed by ParadiseEO. By simply wrapping the algorithms, it allows you to refer only to the API of your algorithm instead of learning a new one.
|
ParadisEO-SMP for Symmetric MultiProcessing or Shared Memory Parallelism is a module for multicores computations on several algorithms proposed by ParadiseEO. By simply wrapping the algorithms, it allows you to refer only to the API of your algorithm instead of learning a new one.
|
||||||
|
|
||||||
Different parallelism models are avaiable such as the Master / Slaves model or the Island Model.
|
Different parallelism models are available such as the Master / Slaves Model or the Island Model.
|
||||||
|
|
||||||
@section tutorials Tutorials
|
@section tutorials Tutorials
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1296,7 +1296,7 @@ SKIP_FUNCTION_MACROS = YES
|
||||||
# If a tag file is not located in the directory in which doxygen
|
# If a tag file is not located in the directory in which doxygen
|
||||||
# is run, you must also specify the path to the tagfile here.
|
# is run, you must also specify the path to the tagfile here.
|
||||||
|
|
||||||
TAGFILES = @SMP_BIN_DIR@/doc/eo.doxytag=http://eodev.sourceforge.net/smp/doc/html
|
TAGFILES = @SMP_BIN_DIR@/doc/smp.doxytag=http://paradiseo.gforge.inria.fr/addon/smp/doc/index.html
|
||||||
|
|
||||||
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
|
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
|
||||||
# a tag file that is based on the input files it reads.
|
# a tag file that is based on the input files it reads.
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
### 0) Include directories
|
### 0) Include directories
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
|
||||||
|
include_directories(${EO_SRC_DIR}/src)
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
|
@ -16,9 +17,22 @@ set(LIBRARY_OUTPUT_PATH ${SMP_LIB_OUTPUT_PATH})
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
|
||||||
set (SMP_FILE
|
set (SMP_FILE
|
||||||
thread.cpp
|
|
||||||
MWModel.h
|
MWModel.h
|
||||||
scheduler.h)
|
scheduler.h
|
||||||
|
island.h
|
||||||
|
topology/abstractTopology.h
|
||||||
|
topology/topology.h
|
||||||
|
topology/topologyBuilder.h
|
||||||
|
topology/complete.cpp
|
||||||
|
topology/star.cpp
|
||||||
|
topology/ring.cpp
|
||||||
|
topology/hypercubic.cpp
|
||||||
|
topology/mesh.cpp
|
||||||
|
topology/customBooleanTopology.cpp
|
||||||
|
topology/customStochasticTopology.cpp
|
||||||
|
notifier.cpp
|
||||||
|
islandModelWrapper.h
|
||||||
|
)
|
||||||
|
|
||||||
add_library(smp STATIC ${SMP_FILE})
|
add_library(smp STATIC ${SMP_FILE})
|
||||||
|
|
||||||
|
|
@ -28,15 +42,16 @@ install(TARGETS smp ARCHIVE DESTINATION ${LIB} COMPONENT libraries)
|
||||||
### 3) Look for headers
|
### 3) Look for headers
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
|
||||||
file(GLOB HDRS smp *.h)
|
file(GLOB HDRS smp *.h *.cpp)
|
||||||
install(FILES ${HDRS} DESTINATION include${INSTALL_SUB_DIR}/smp COMPONENT headers)
|
install(FILES ${HDRS} DESTINATION include${INSTALL_SUB_DIR}/smp COMPONENT headers)
|
||||||
|
|
||||||
######################################################################################
|
######################################################################################
|
||||||
### 4) Install directories
|
### 4) Install directories
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
|
||||||
install(DIRECTORY MWAlgo
|
install(DIRECTORY MWAlgo topology
|
||||||
DESTINATION include${INSTALL_SUB_DIR}/smp
|
DESTINATION include${INSTALL_SUB_DIR}/smp
|
||||||
COMPONENT headers
|
COMPONENT headers
|
||||||
FILES_MATCHING PATTERN "*.h"
|
FILES_MATCHING PATTERN "*.h"
|
||||||
|
PATTERN "*.cpp"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -32,12 +32,14 @@ template<class... Args>
|
||||||
paradiseo::smp::MWModel<EOAlgo,EOT,Policy>::MWModel(unsigned workersNb, Args&... args) :
|
paradiseo::smp::MWModel<EOAlgo,EOT,Policy>::MWModel(unsigned workersNb, Args&... args) :
|
||||||
EOAlgo<EOT>(args...),
|
EOAlgo<EOT>(args...),
|
||||||
scheduler(workersNb)
|
scheduler(workersNb)
|
||||||
{ assert(workersNb > 0); }
|
{
|
||||||
|
assert(workersNb > 0);
|
||||||
|
}
|
||||||
|
|
||||||
template<template <class> class EOAlgo, class EOT, class Policy>
|
template<template <class> class EOAlgo, class EOT, class Policy>
|
||||||
template<class... Args>
|
template<class... Args>
|
||||||
paradiseo::smp::MWModel<EOAlgo,EOT,Policy>::MWModel(Args&... args) :
|
paradiseo::smp::MWModel<EOAlgo,EOT,Policy>::MWModel(Args&... args) :
|
||||||
MWModel(Thread::hardware_concurrency(), args...)
|
MWModel(std::thread::hardware_concurrency(), args...)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
template<template <class> class EOAlgo, class EOT, class Policy>
|
template<template <class> class EOAlgo, class EOT, class Policy>
|
||||||
|
|
|
||||||
|
|
@ -27,16 +27,16 @@ ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MWMODEL_H_
|
#ifndef SMP_MWMODEL_H_
|
||||||
#define MWMODEL_H_
|
#define SMP_MWMODEL_H_
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
#include <scheduler.h>
|
#include <scheduler.h>
|
||||||
#include <algoDispatching.h>
|
#include <algoDispatching.h>
|
||||||
#include <policiesDispatching.h>
|
#include <policiesDispatching.h>
|
||||||
|
|
||||||
|
|
||||||
#include <eo>
|
#include <eo>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ namespace smp
|
||||||
|
|
||||||
/** MWModel: Master / Worker Model for multicore computation
|
/** MWModel: Master / Worker Model for multicore computation
|
||||||
|
|
||||||
The MW Model wraps any algorithm in order to apply it on several populations.
|
The MW Model wraps any algorithm in order to dispatch load between threads.
|
||||||
|
|
||||||
@see smp::Worker, smp::Thread
|
@see smp::Worker, smp::Thread
|
||||||
*/
|
*/
|
||||||
|
|
@ -99,7 +99,7 @@ protected:
|
||||||
void operator()(eoPop<EOT>& pop, const eoEasyEA_tag&);
|
void operator()(eoPop<EOT>& pop, const eoEasyEA_tag&);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifid algorithm for EasyPSO
|
* Specific algorithm for EasyPSO
|
||||||
*/
|
*/
|
||||||
void operator()(eoPop<EOT>& pop, const eoEasyPSO_tag&);
|
void operator()(eoPop<EOT>& pop, const eoEasyPSO_tag&);
|
||||||
|
|
||||||
|
|
@ -113,7 +113,7 @@ protected:
|
||||||
*/
|
*/
|
||||||
void operator()(eoPop<EOT>& pop,const error_tag&);
|
void operator()(eoPop<EOT>& pop,const error_tag&);
|
||||||
|
|
||||||
std::vector<Thread*> workers;
|
std::vector<std::thread*> workers;
|
||||||
Scheduler<EOT,Policy> scheduler;
|
Scheduler<EOT,Policy> scheduler;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
74
smp/src/PPExpander.h
Normal file
74
smp/src/PPExpander.h
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
<PPExpander.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_PPE_H_
|
||||||
|
#define SMP_PPE_H_
|
||||||
|
|
||||||
|
namespace paradiseo
|
||||||
|
{
|
||||||
|
namespace smp
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Parameter Pack Expansion: Utility file to expand parameter pack
|
||||||
|
|
||||||
|
Utility file to expand parameter pack with the recursive method
|
||||||
|
|
||||||
|
**/
|
||||||
|
template<class... Arg> class Loop;
|
||||||
|
|
||||||
|
template<class T, class... Arg>
|
||||||
|
class Loop<T,Arg...>
|
||||||
|
{
|
||||||
|
template<class U>
|
||||||
|
U& findValueImpl(T&, Arg&... arg, std::false_type)
|
||||||
|
{
|
||||||
|
return Loop<Arg...>().template findValue<U>(arg...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class U>
|
||||||
|
U& findValueImpl(T& t, Arg&... arg, std::true_type)
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
template<class U>
|
||||||
|
U& findValue(T& t, Arg&... arg)
|
||||||
|
{
|
||||||
|
typedef typename std::is_base_of<U,T>::type tag;
|
||||||
|
return findValueImpl<U>(t,arg...,tag());
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
98
smp/src/abstractIsland.h
Normal file
98
smp/src/abstractIsland.h
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
<abstractIsland.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_ABSTRACT_ISLAND_H_
|
||||||
|
#define SMP_ABSTRACT_ISLAND_H_
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
#include <eoPop.h>
|
||||||
|
#include <migPolicy.h>
|
||||||
|
|
||||||
|
namespace paradiseo
|
||||||
|
{
|
||||||
|
namespace smp
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declaration
|
||||||
|
template<class bEOT>
|
||||||
|
class IslandModel;
|
||||||
|
|
||||||
|
/** AbstractIsland: An abstract island.
|
||||||
|
|
||||||
|
The abstract island is used to manipulate island pointers wihout the knowledge of the algorithm.
|
||||||
|
The template is the base type for individuals.
|
||||||
|
|
||||||
|
@see smp::Island smp::IslandModel
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<class bEOT>
|
||||||
|
class AIsland
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void operator()() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Island Model.
|
||||||
|
* @param _model The model which manipulate the island.
|
||||||
|
*/
|
||||||
|
virtual void setModel(IslandModel<bEOT>* _model) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is population to receive or to emigrate.
|
||||||
|
*/
|
||||||
|
virtual void check(void) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the island by adding population to send in the imigrants list.
|
||||||
|
* @param _data Population to integrate.
|
||||||
|
*/
|
||||||
|
virtual void update(eoPop<bEOT> _data) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the algorithm is stopped.
|
||||||
|
* @return true if stopped.
|
||||||
|
*/
|
||||||
|
virtual bool isStopped(void) const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Receive population by integrate individuals.
|
||||||
|
*/
|
||||||
|
virtual void receive(void) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::mutex m;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -27,8 +27,8 @@ ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr
|
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ALGO_D_H_
|
#ifndef SMP_ALGO_DISPATCHING_H_
|
||||||
#define ALGO_D_H_
|
#define SMP_ALGO_DISPATCHING_H_
|
||||||
|
|
||||||
#include <eo>
|
#include <eo>
|
||||||
|
|
||||||
|
|
@ -37,7 +37,9 @@ namespace paradiseo
|
||||||
namespace smp
|
namespace smp
|
||||||
{
|
{
|
||||||
/** Algo Dispatching
|
/** Algo Dispatching
|
||||||
* The Algo Dispatching enable to choose the algorithm to call at compile time by tag-dispatching method
|
|
||||||
|
The Algo Dispatching enables to choose the algorithm to call at compile time by tag-dispatching method
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
// Main algorithms tags
|
// Main algorithms tags
|
||||||
|
|
|
||||||
79
smp/src/bimap.cpp
Normal file
79
smp/src/bimap.cpp
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
<bimap.cpp>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
void paradiseo::smp::Bimap<A,B>::add(A& a, B& b)
|
||||||
|
{
|
||||||
|
rightAssociation[a] = b;
|
||||||
|
leftAssociation[b] = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
std::map<A,B> paradiseo::smp::Bimap<A,B>::getRight() const
|
||||||
|
{
|
||||||
|
return rightAssociation;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
std::map<B,A> paradiseo::smp::Bimap<A,B>::getLeft() const
|
||||||
|
{
|
||||||
|
return leftAssociation;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
void paradiseo::smp::Bimap<A,B>::removeFromRight(const A& a)
|
||||||
|
{
|
||||||
|
for(auto& it : leftAssociation)
|
||||||
|
if(it->second == a)
|
||||||
|
leftAssociation.erase(it);
|
||||||
|
|
||||||
|
rightAssociation.erase(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
void paradiseo::smp::Bimap<A,B>::removeFromLeft(const B& b)
|
||||||
|
{
|
||||||
|
for(auto& it : rightAssociation)
|
||||||
|
if(it->second == b)
|
||||||
|
rightAssociation.erase(it);
|
||||||
|
|
||||||
|
leftAssociation.erase(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
unsigned paradiseo::smp::Bimap<A,B>::size() const
|
||||||
|
{
|
||||||
|
return leftAssociation.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
bool paradiseo::smp::Bimap<A,B>::empty() const
|
||||||
|
{
|
||||||
|
return leftAssociation.empty();
|
||||||
|
}
|
||||||
105
smp/src/bimap.h
Normal file
105
smp/src/bimap.h
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
<bimap.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_BIMAP_MODEL_H_
|
||||||
|
#define SMP_BIMAP_MODEL_H_
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace paradiseo
|
||||||
|
{
|
||||||
|
namespace smp
|
||||||
|
{
|
||||||
|
/** Bimap
|
||||||
|
|
||||||
|
Bidirectional map in order to create a bijection between islands and vertices.
|
||||||
|
A and B objects are stocked in two std::map, then if you would like to avoid instances duplications,
|
||||||
|
template A and B with pointers.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
template<class A, class B>
|
||||||
|
class Bimap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Add a relation
|
||||||
|
* @param A right key
|
||||||
|
* @param B left key
|
||||||
|
*/
|
||||||
|
void add(A& a, B& b);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a map which represents the right association.
|
||||||
|
* @return rightAssociation
|
||||||
|
*/
|
||||||
|
std::map<A,B> getRight() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a map which represents the left association.
|
||||||
|
* @return leftAssociation
|
||||||
|
*/
|
||||||
|
std::map<B,A> getLeft() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an association from a right key.
|
||||||
|
* @param Right key of the association to be removed.
|
||||||
|
*/
|
||||||
|
void removeFromRight(const A& a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an association from a left key.
|
||||||
|
* @param Left key of the association to be removed.
|
||||||
|
*/
|
||||||
|
void removeFromLeft(const B& b);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of associations.
|
||||||
|
* @return Size of bimap
|
||||||
|
*/
|
||||||
|
unsigned size() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the bimap is empty
|
||||||
|
* @return true if the bimap is empty
|
||||||
|
*/
|
||||||
|
bool empty() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::map<A,B> rightAssociation;
|
||||||
|
std::map<B,A> leftAssociation;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <bimap.cpp>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
63
smp/src/contDispatching.h
Normal file
63
smp/src/contDispatching.h
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
<contDispatching.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_CONT_DISPATCHING_H_
|
||||||
|
#define SMP_CONT_DISPATCHING_H_
|
||||||
|
|
||||||
|
/** Continuator Dispatching
|
||||||
|
|
||||||
|
The Continuator Dispatching enables to wrap continuators in the Island constructor for a better user interface and, moreover, avoiding side effect.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
template<class T, class U>
|
||||||
|
U& wrap_pp_impl(T&, U& u, std::false_type)
|
||||||
|
{
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T, class U>
|
||||||
|
T& wrap_pp_impl(T& t, U&, std::true_type)
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T, class U>
|
||||||
|
struct result_of_wrap_pp :
|
||||||
|
std::conditional<std::is_base_of<T,U>::value,T&,U&>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<class T, class U>
|
||||||
|
typename result_of_wrap_pp<T,U>::type wrap_pp(T& t, U& u)
|
||||||
|
{
|
||||||
|
typedef typename std::is_base_of<T,U>::type tag;
|
||||||
|
return wrap_pp_impl(t,u,tag());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
36
smp/src/contWrapper.cpp
Normal file
36
smp/src/contWrapper.cpp
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
<contWrapper.cpp>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<class EOT, class bEOT>
|
||||||
|
paradiseo::smp::ContWrapper<EOT, bEOT>::ContWrapper(eoContinue<EOT>& _cont, AIsland<bEOT>* island) :
|
||||||
|
ck(_cont),
|
||||||
|
islandNotifier(island, &AIsland<bEOT>::check)
|
||||||
|
{
|
||||||
|
ck.add(islandNotifier);
|
||||||
|
}
|
||||||
72
smp/src/contWrapper.h
Normal file
72
smp/src/contWrapper.h
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
<contWrapper.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_CONT_WRAPPER_H_
|
||||||
|
#define SMP_CONT_WRAPPER_H_
|
||||||
|
|
||||||
|
#include <utils/eoCheckPoint.h>
|
||||||
|
#include <eoContinue.h>
|
||||||
|
#include <migPolicy.h>
|
||||||
|
#include <islandNotifier.h>
|
||||||
|
|
||||||
|
namespace paradiseo
|
||||||
|
{
|
||||||
|
namespace smp
|
||||||
|
{
|
||||||
|
|
||||||
|
/** ContWrapper: Utility class to wrap the algorithm continuators with island notifier.
|
||||||
|
|
||||||
|
Utility class to wrap the algorithm continuators with island notifier during the island construction.
|
||||||
|
By using the wrapper, we do not have to modify original continuators inside the IslandModel and then,
|
||||||
|
it avoids some side effects.
|
||||||
|
|
||||||
|
*/
|
||||||
|
template<class EOT, class bEOT>
|
||||||
|
class ContWrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param _cont Original continuators
|
||||||
|
* @param _island Pointer on the island used by the notifier
|
||||||
|
*/
|
||||||
|
ContWrapper(eoContinue<EOT>& _cont, AIsland<bEOT>* _island);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
eoCheckPoint<EOT> ck;
|
||||||
|
IslandNotifier<bEOT> islandNotifier;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <contWrapper.cpp>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
54
smp/src/intPolicy.h
Normal file
54
smp/src/intPolicy.h
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
<intPolicy.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_INT_POLICY_H_
|
||||||
|
#define SMP_INT_POLICY_H_
|
||||||
|
|
||||||
|
#include <eoReplacement.h>
|
||||||
|
|
||||||
|
namespace paradiseo
|
||||||
|
{
|
||||||
|
namespace smp
|
||||||
|
{
|
||||||
|
|
||||||
|
/** IntPolicy: Integration policy for island.
|
||||||
|
|
||||||
|
The island model will check its policy to know how to integrate populations sent by other islands.
|
||||||
|
|
||||||
|
@see smp::Island, smp::MigPolicy
|
||||||
|
*/
|
||||||
|
|
||||||
|
template <class EOT>
|
||||||
|
using IntPolicy = eoReplacement<EOT>;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
158
smp/src/island.cpp
Normal file
158
smp/src/island.cpp
Normal file
|
|
@ -0,0 +1,158 @@
|
||||||
|
/*
|
||||||
|
<island.cpp>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
template<class... Args>
|
||||||
|
paradiseo::smp::Island<EOAlgo,EOT,bEOT>::Island(std::function<EOT(bEOT&)> _convertFromBase, std::function<bEOT(EOT&)> _convertToBase, eoPop<EOT>& _pop, IntPolicy<EOT>& _intPolicy, MigPolicy<EOT>& _migPolicy, Args&... args) :
|
||||||
|
// The PPExpander looks for the continuator in the parameters pack.
|
||||||
|
// The private inheritance of ContWrapper wraps the continuator and add islandNotifier.
|
||||||
|
ContWrapper<EOT, bEOT>(Loop<Args...>().template findValue<eoContinue<EOT>>(args...), this),
|
||||||
|
// We inject the wrapped continuator by tag dispatching method during the algorithm construction.
|
||||||
|
algo(EOAlgo<EOT>(wrap_pp<eoContinue<EOT>>(this->ck,args)...)),
|
||||||
|
// With the PPE we look for the eval function in order to evaluate EOT to integrate
|
||||||
|
eval(Loop<Args...>().template findValue<eoEvalFunc<EOT>>(args...)),
|
||||||
|
pop(_pop),
|
||||||
|
intPolicy(_intPolicy),
|
||||||
|
migPolicy(_migPolicy),
|
||||||
|
stopped(false),
|
||||||
|
model(nullptr),
|
||||||
|
convertFromBase(_convertFromBase),
|
||||||
|
convertToBase(_convertToBase)
|
||||||
|
{
|
||||||
|
// Check in compile time the inheritance thanks to type_trait.
|
||||||
|
static_assert(std::is_base_of<eoAlgo<EOT>,EOAlgo<EOT>>::value, "Algorithm must inherit from eoAlgo<EOT>");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
template<class... Args>
|
||||||
|
paradiseo::smp::Island<EOAlgo,EOT,bEOT>::Island(eoPop<EOT>& _pop, IntPolicy<EOT>& _intPolicy, MigPolicy<EOT>& _migPolicy, Args&... args) :
|
||||||
|
Island(
|
||||||
|
// Default conversion functions for homogeneous islands
|
||||||
|
[](bEOT& i) -> EOT { return std::forward<EOT>(i); },
|
||||||
|
[](EOT& i) -> bEOT { return std::forward<bEOT>(i); },
|
||||||
|
_pop, _intPolicy, _migPolicy, args...)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
void paradiseo::smp::Island<EOAlgo,EOT,bEOT>::operator()()
|
||||||
|
{
|
||||||
|
stopped = false;
|
||||||
|
algo(pop);
|
||||||
|
stopped = true;
|
||||||
|
// Let's wait the end of communications with the island model
|
||||||
|
for(auto& message : sentMessages)
|
||||||
|
message.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
void paradiseo::smp::Island<EOAlgo,EOT,bEOT>::setModel(IslandModel<bEOT>* _model)
|
||||||
|
{
|
||||||
|
model = _model;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
eoPop<EOT>& paradiseo::smp::Island<EOAlgo,EOT,bEOT>::getPop() const
|
||||||
|
{
|
||||||
|
return pop;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
void paradiseo::smp::Island<EOAlgo,EOT,bEOT>::check()
|
||||||
|
{
|
||||||
|
// Sending
|
||||||
|
for(PolicyElement<EOT>& elem : migPolicy)
|
||||||
|
if(!elem(pop))
|
||||||
|
send(elem.getSelect());
|
||||||
|
|
||||||
|
// Receiving
|
||||||
|
receive();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
bool paradiseo::smp::Island<EOAlgo,EOT,bEOT>::isStopped(void) const
|
||||||
|
{
|
||||||
|
return (bool)stopped;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
void paradiseo::smp::Island<EOAlgo,EOT,bEOT>::send(eoSelect<EOT>& _select)
|
||||||
|
{
|
||||||
|
// Allow island to work alone
|
||||||
|
if(model != nullptr)
|
||||||
|
{
|
||||||
|
eoPop<EOT> migPop;
|
||||||
|
_select(pop, migPop);
|
||||||
|
|
||||||
|
// Convert pop to base pop
|
||||||
|
eoPop<bEOT> baseMigPop;
|
||||||
|
for(auto& indi : migPop)
|
||||||
|
baseMigPop.push_back(std::move(convertToBase(indi)));
|
||||||
|
|
||||||
|
//std::cout << "On envoie de l'île : " << migPop << std::endl;
|
||||||
|
|
||||||
|
// Delete delivered messages
|
||||||
|
for(auto it = sentMessages.begin(); it != sentMessages.end(); it++)
|
||||||
|
if(!it->joinable())
|
||||||
|
sentMessages.erase(it);
|
||||||
|
|
||||||
|
sentMessages.push_back(std::thread(&IslandModel<bEOT>::update, model, std::move(baseMigPop), this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
void paradiseo::smp::Island<EOAlgo,EOT,bEOT>::receive(void)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(this->m);
|
||||||
|
while (!listImigrants.empty())
|
||||||
|
{
|
||||||
|
//std::cout << "On reçoit dans l'île : " << listImigrants.size() << std::endl;
|
||||||
|
eoPop<bEOT> base_offspring = std::move(listImigrants.front());
|
||||||
|
|
||||||
|
// Convert objects from base to our objects type
|
||||||
|
eoPop<EOT> offspring;
|
||||||
|
for(auto& indi : base_offspring)
|
||||||
|
offspring.push_back(std::move(convertFromBase(indi)));
|
||||||
|
|
||||||
|
// Evaluate objects to integrate
|
||||||
|
for(auto& indi : offspring)
|
||||||
|
eval(indi);
|
||||||
|
|
||||||
|
intPolicy(pop, offspring);
|
||||||
|
listImigrants.pop();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT>
|
||||||
|
void paradiseo::smp::Island<EOAlgo,EOT,bEOT>::update(eoPop<bEOT> _data)
|
||||||
|
{
|
||||||
|
//std::cout << "On update dans l'île" << std::endl;
|
||||||
|
std::lock_guard<std::mutex> lock(this->m);
|
||||||
|
listImigrants.push(_data);
|
||||||
|
}
|
||||||
157
smp/src/island.h
Normal file
157
smp/src/island.h
Normal file
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
<island.h>
|
||||||
|
Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012
|
||||||
|
|
||||||
|
Alexandre Quemy, Thibault Lasnier - INSA Rouen
|
||||||
|
|
||||||
|
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 SMP_ISLAND_H_
|
||||||
|
#define SMP_ISLAND_H_
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
|
#include <atomic>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <eoEvalFunc.h>
|
||||||
|
#include <eoSelect.h>
|
||||||
|
#include <eoAlgo.h>
|
||||||
|
#include <eoPop.h>
|
||||||
|
|
||||||
|
#include <abstractIsland.h>
|
||||||
|
#include <islandModel.h>
|
||||||
|
#include <migPolicy.h>
|
||||||
|
#include <intPolicy.h>
|
||||||
|
#include <PPExpander.h>
|
||||||
|
#include <contWrapper.h>
|
||||||
|
#include <contDispatching.h>
|
||||||
|
|
||||||
|
namespace paradiseo
|
||||||
|
{
|
||||||
|
namespace smp
|
||||||
|
{
|
||||||
|
/** Island: Concrete island that wraps an algorithm
|
||||||
|
|
||||||
|
The island wraps an algorithm and provide mecanisms for emigration and integration of populations.
|
||||||
|
An island also have a base type which represents the type of individuals of the Island Model.
|
||||||
|
|
||||||
|
@see smp::AbstractIsland, smp::MigPolicy
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<template <class> class EOAlgo, class EOT, class bEOT = EOT>
|
||||||
|
class Island : private ContWrapper<EOT, bEOT>, public AIsland<bEOT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param _convertFromBase Function to convert EOT from base EOT
|
||||||
|
* @param _convertToBase Function to convert base EOT to EOT
|
||||||
|
* @param _pop Population of the island
|
||||||
|
* @param _intPolicy Integration policy
|
||||||
|
* @param _migPolicy Migration policy
|
||||||
|
* @param args Parameters to construct the algorithm.
|
||||||
|
*/
|
||||||
|
template<class... Args>
|
||||||
|
Island(std::function<EOT(bEOT&)> _convertFromBase, std::function<bEOT(EOT&)> _convertToBase, eoPop<EOT>& pop, IntPolicy<EOT>& _intPolicy, MigPolicy<EOT>& _migPolicy, Args&... args);
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param _pop Population of the island
|
||||||
|
* @param _intPolicy Integration policy
|
||||||
|
* @param _migPolicy Migration policy
|
||||||
|
* @param args Parameters to construct the algorithm.
|
||||||
|
*/
|
||||||
|
template<class... Args>
|
||||||
|
Island(eoPop<EOT>& pop, IntPolicy<EOT>& _intPolicy, MigPolicy<EOT>& _migPolicy, Args&... args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the island.
|
||||||
|
*/
|
||||||
|
void operator()(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set model
|
||||||
|
* @param _model Pointer to the Island Model corresponding
|
||||||
|
*/
|
||||||
|
virtual void setModel(IslandModel<bEOT>* _model);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a reference to the island population.
|
||||||
|
* @return Reference to the island population
|
||||||
|
*/
|
||||||
|
eoPop<EOT>& getPop() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is population to receive or to migrate
|
||||||
|
*/
|
||||||
|
virtual void check(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the list of imigrants.
|
||||||
|
* @param _data Elements to integrate in the main population.
|
||||||
|
*/
|
||||||
|
void update(eoPop<bEOT> _data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the algorithm is stopped.
|
||||||
|
* @return true if stopped
|
||||||
|
*/
|
||||||
|
virtual bool isStopped(void) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is population to receive
|
||||||
|
*/
|
||||||
|
virtual void receive(void);
|
||||||
|
|
||||||
|
AIsland<bEOT> clone() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send population to mediator
|
||||||
|
* @param _select Method to select EOT to send
|
||||||
|
*/
|
||||||
|
virtual void send(eoSelect<EOT>& _select);
|
||||||
|
|
||||||
|
EOAlgo<EOT> algo;
|
||||||
|
eoEvalFunc<EOT>& eval;
|
||||||
|
eoPop<EOT>& pop;
|
||||||
|
std::queue<eoPop<bEOT>> listImigrants;
|
||||||
|
IntPolicy<EOT>& intPolicy;
|
||||||
|
MigPolicy<EOT>& migPolicy;
|
||||||
|
std::atomic<bool> stopped;
|
||||||
|
std::vector<std::thread> sentMessages;
|
||||||
|
IslandModel<bEOT>* model;
|
||||||
|
std::function<EOT(bEOT&)> convertFromBase;
|
||||||
|
std::function<bEOT(EOT&)> convertToBase;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <island.cpp>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue