From 9c87b3b0c0577567cfc6a983fd2d4f8d93af7b4a Mon Sep 17 00:00:00 2001 From: canape Date: Fri, 16 Nov 2007 11:34:20 +0000 Subject: [PATCH] New style for PEO git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@789 331e1502-861f-0410-8da2-ba01fb791d7f --- trunk/paradiseo-peo/README | 6 +- trunk/paradiseo-peo/src/core/communicable.cpp | 38 ++- trunk/paradiseo-peo/src/core/communicable.h | 41 +-- trunk/paradiseo-peo/src/core/cooperative.h | 29 +- trunk/paradiseo-peo/src/core/eoPop_comm.h | 10 +- trunk/paradiseo-peo/src/core/eoVector_comm.h | 52 +-- trunk/paradiseo-peo/src/core/messaging.h | 60 ++-- trunk/paradiseo-peo/src/core/peo_debug.cpp | 50 +-- trunk/paradiseo-peo/src/core/peo_debug.h | 2 +- trunk/paradiseo-peo/src/core/peo_fin.cpp | 5 +- trunk/paradiseo-peo/src/core/peo_fin.h | 7 +- trunk/paradiseo-peo/src/core/peo_init.cpp | 18 +- trunk/paradiseo-peo/src/core/peo_init.h | 9 +- trunk/paradiseo-peo/src/core/peo_param.cpp | 5 +- trunk/paradiseo-peo/src/core/peo_param.h | 7 +- trunk/paradiseo-peo/src/core/peo_run.cpp | 7 +- trunk/paradiseo-peo/src/core/peo_run.h | 7 +- trunk/paradiseo-peo/src/core/reac_thread.cpp | 20 +- trunk/paradiseo-peo/src/core/reac_thread.h | 29 +- trunk/paradiseo-peo/src/core/ring_topo.cpp | 22 +- trunk/paradiseo-peo/src/core/ring_topo.h | 21 +- trunk/paradiseo-peo/src/core/rmc.h | 4 +- trunk/paradiseo-peo/src/core/runner.cpp | 62 ++-- trunk/paradiseo-peo/src/core/runner.h | 37 +-- trunk/paradiseo-peo/src/core/service.cpp | 48 +-- trunk/paradiseo-peo/src/core/service.h | 45 +-- trunk/paradiseo-peo/src/core/thread.cpp | 65 ++-- trunk/paradiseo-peo/src/core/thread.h | 39 +-- trunk/paradiseo-peo/src/core/topology.cpp | 16 +- trunk/paradiseo-peo/src/core/topology.h | 23 +- trunk/paradiseo-peo/src/peo.h | 14 +- trunk/paradiseo-peo/src/peoAggEvalFunc.h | 7 +- trunk/paradiseo-peo/src/peoAsyncIslandMig.h | 210 ++++++------ trunk/paradiseo-peo/src/peoEA.h | 135 ++++---- trunk/paradiseo-peo/src/peoEvalFunc.h | 26 +- trunk/paradiseo-peo/src/peoEvalFuncPSO.h | 28 +- trunk/paradiseo-peo/src/peoInitializer.h | 94 +++--- trunk/paradiseo-peo/src/peoNoAggEvalFunc.h | 18 +- trunk/paradiseo-peo/src/peoPSO.h | 119 +++---- trunk/paradiseo-peo/src/peoPSOReplacement.h | 43 +-- trunk/paradiseo-peo/src/peoPSOSelect.h | 31 +- trunk/paradiseo-peo/src/peoPSOVelocity.h | 59 ++-- trunk/paradiseo-peo/src/peoParaPopEval.h | 286 +++++++++-------- trunk/paradiseo-peo/src/peoParaSGATransform.h | 168 +++++----- .../src/peoParallelAlgorithmWrapper.h | 94 +++--- trunk/paradiseo-peo/src/peoPopEval.h | 13 +- trunk/paradiseo-peo/src/peoSeqPopEval.h | 41 +-- trunk/paradiseo-peo/src/peoSeqTransform.h | 72 +++-- trunk/paradiseo-peo/src/peoSyncIslandMig.h | 244 +++++++------- trunk/paradiseo-peo/src/peoSyncMultiStart.h | 200 ++++++------ .../src/peoSynchronousMultiStart.h | 300 ++++++++++-------- trunk/paradiseo-peo/src/peoTransform.h | 7 +- trunk/paradiseo-peo/src/rmc/mpi/comm.cpp | 44 +-- trunk/paradiseo-peo/src/rmc/mpi/comm.h | 17 +- trunk/paradiseo-peo/src/rmc/mpi/coop.cpp | 19 +- trunk/paradiseo-peo/src/rmc/mpi/mess.cpp | 165 ++++++---- trunk/paradiseo-peo/src/rmc/mpi/mess.h | 2 +- trunk/paradiseo-peo/src/rmc/mpi/node.cpp | 41 +-- trunk/paradiseo-peo/src/rmc/mpi/node.h | 2 +- trunk/paradiseo-peo/src/rmc/mpi/param.cpp | 5 +- trunk/paradiseo-peo/src/rmc/mpi/param.h | 2 +- trunk/paradiseo-peo/src/rmc/mpi/recv.cpp | 186 +++++------ trunk/paradiseo-peo/src/rmc/mpi/recv.h | 2 +- trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp | 13 +- trunk/paradiseo-peo/src/rmc/mpi/runner.cpp | 13 +- trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp | 65 ++-- trunk/paradiseo-peo/src/rmc/mpi/scheduler.h | 4 +- trunk/paradiseo-peo/src/rmc/mpi/schema.cpp | 146 +++++---- trunk/paradiseo-peo/src/rmc/mpi/schema.h | 19 +- trunk/paradiseo-peo/src/rmc/mpi/send.cpp | 124 ++++---- trunk/paradiseo-peo/src/rmc/mpi/send.h | 2 +- trunk/paradiseo-peo/src/rmc/mpi/service.cpp | 8 +- trunk/paradiseo-peo/src/rmc/mpi/tags.h | 2 +- trunk/paradiseo-peo/src/rmc/mpi/worker.cpp | 78 +++-- trunk/paradiseo-peo/src/rmc/mpi/worker.h | 43 +-- .../paradiseo-peo/src/rmc/mpi/xml_parser.cpp | 62 ++-- trunk/paradiseo-peo/src/rmc/mpi/xml_parser.h | 2 +- trunk/paradiseo-peo/test/t-peo.cpp | 2 +- trunk/paradiseo-peo/test/t-peoInsularPSO.cpp | 147 ++++----- trunk/paradiseo-peo/test/t-peoPSO.cpp | 127 ++++---- trunk/paradiseo-peo/test/t-peoPSOPara.cpp | 110 +++---- .../paradiseo-peo/test/t-peoPSOParaIsland.cpp | 222 ++++++------- .../paradiseo-peo/tutorial/Lesson1/mainEA.cpp | 126 ++++---- .../tutorial/Lesson1/mainPSO.cpp | 154 ++++----- .../paradiseo-peo/tutorial/Lesson2/mainEA.cpp | 118 +++---- .../paradiseo-peo/tutorial/Lesson3/mainEA.cpp | 182 +++++------ .../tutorial/Lesson3/mainPSO.cpp | 206 ++++++------ .../paradiseo-peo/tutorial/Lesson4/mainEA.cpp | 200 ++++++------ .../tutorial/Lesson4/mainPSO.cpp | 220 ++++++------- .../tutorial/Lesson5/example.cpp | 47 +-- trunk/paradiseo-peo/tutorial/Lesson6/main.cpp | 80 ++--- .../tutorial/examples/tsp/city_swap.cpp | 13 +- .../tutorial/examples/tsp/city_swap.h | 17 +- .../tutorial/examples/tsp/data.cpp | 114 +++---- .../tutorial/examples/tsp/data.h | 2 +- .../tutorial/examples/tsp/display.cpp | 94 +++--- .../tutorial/examples/tsp/display.h | 2 +- .../examples/tsp/display_best_route.cpp | 15 +- .../examples/tsp/display_best_route.h | 23 +- .../tutorial/examples/tsp/edge_xover.cpp | 150 +++++---- .../tutorial/examples/tsp/edge_xover.h | 33 +- .../examples/tsp/merge_route_eval.cpp | 7 +- .../tutorial/examples/tsp/merge_route_eval.h | 15 +- .../paradiseo-peo/tutorial/examples/tsp/mix.h | 7 +- .../tutorial/examples/tsp/node.cpp | 53 ++-- .../tutorial/examples/tsp/node.h | 4 +- .../tutorial/examples/tsp/opt_route.cpp | 124 ++++---- .../tutorial/examples/tsp/opt_route.h | 2 +- .../tutorial/examples/tsp/order_xover.cpp | 60 ++-- .../tutorial/examples/tsp/order_xover.h | 21 +- .../tutorial/examples/tsp/param.cpp | 7 +- .../tutorial/examples/tsp/param.h | 2 +- .../tutorial/examples/tsp/part_route_eval.cpp | 21 +- .../tutorial/examples/tsp/part_route_eval.h | 25 +- .../examples/tsp/partial_mapped_xover.cpp | 37 ++- .../examples/tsp/partial_mapped_xover.h | 21 +- .../tutorial/examples/tsp/route.cpp | 11 +- .../tutorial/examples/tsp/route.h | 6 +- .../tutorial/examples/tsp/route_eval.cpp | 7 +- .../tutorial/examples/tsp/route_eval.h | 15 +- .../tutorial/examples/tsp/route_init.cpp | 11 +- .../tutorial/examples/tsp/route_init.h | 15 +- .../tutorial/examples/tsp/two_opt.cpp | 20 +- .../tutorial/examples/tsp/two_opt.h | 15 +- .../examples/tsp/two_opt_incr_eval.cpp | 13 +- .../tutorial/examples/tsp/two_opt_incr_eval.h | 13 +- .../tutorial/examples/tsp/two_opt_init.cpp | 7 +- .../tutorial/examples/tsp/two_opt_init.h | 17 +- .../tutorial/examples/tsp/two_opt_next.cpp | 27 +- .../tutorial/examples/tsp/two_opt_next.h | 15 +- .../tutorial/examples/tsp/two_opt_rand.cpp | 9 +- .../tutorial/examples/tsp/two_opt_rand.h | 17 +- 132 files changed, 3736 insertions(+), 3351 deletions(-) diff --git a/trunk/paradiseo-peo/README b/trunk/paradiseo-peo/README index 7e1bfa57c..d60eb05c3 100755 --- a/trunk/paradiseo-peo/README +++ b/trunk/paradiseo-peo/README @@ -58,6 +58,8 @@ structure: | | +-- tutorial APPLICATIONS + | + +-- examples TSP | +-- Introduction Technical introduction | @@ -69,7 +71,9 @@ structure: | +-- Lesson4 PSO and EA completely parallel | - +-- Lesson5 Multi-start : several local searches + +-- Lesson5 Hybridization + | + +-- Lesson6 Multi-start : several local searches =================================================================== NOTES diff --git a/trunk/paradiseo-peo/src/core/communicable.cpp b/trunk/paradiseo-peo/src/core/communicable.cpp index 6ca4fa80f..609ceb0d4 100644 --- a/trunk/paradiseo-peo/src/core/communicable.cpp +++ b/trunk/paradiseo-peo/src/core/communicable.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -46,7 +46,8 @@ static std :: map comm_to_key; /* Map of regist unsigned Communicable :: num_comm = 0; -Communicable :: Communicable () { +Communicable :: Communicable () +{ comm_to_key [this] = key = ++ num_comm; key_to_comm.push_back (this); @@ -54,41 +55,48 @@ Communicable :: Communicable () { sem_init (& sem_stop, 0, 0); } -Communicable :: ~ Communicable () { - +Communicable :: ~ Communicable () +{ } -COMM_ID Communicable :: getKey () { +COMM_ID Communicable :: getKey () +{ return key; } -Communicable * getCommunicable (COMM_ID __key) { +Communicable * getCommunicable (COMM_ID __key) +{ assert (__key < key_to_comm.size ()); - return key_to_comm [__key]; + return key_to_comm [__key]; } -COMM_ID getKey (const Communicable * __comm) { - +COMM_ID getKey (const Communicable * __comm) +{ + return comm_to_key [__comm]; } -void Communicable :: lock () { +void Communicable :: lock () + { - sem_wait (& sem_lock); -} + sem_wait (& sem_lock); + } -void Communicable :: unlock () { +void Communicable :: unlock () +{ sem_post (& sem_lock); } -void Communicable :: stop () { +void Communicable :: stop () +{ sem_wait (& sem_stop); } -void Communicable :: resume () { +void Communicable :: resume () +{ sem_post (& sem_stop); } diff --git a/trunk/paradiseo-peo/src/core/communicable.h b/trunk/paradiseo-peo/src/core/communicable.h index 11348707e..24b315ec6 100644 --- a/trunk/paradiseo-peo/src/core/communicable.h +++ b/trunk/paradiseo-peo/src/core/communicable.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,34 +41,35 @@ typedef unsigned COMM_ID; -class Communicable { +class Communicable + { -public : + public : - Communicable (); - - virtual ~ Communicable (); + Communicable (); - COMM_ID getKey (); + virtual ~ Communicable (); - void lock (); /* It suspends the current process if the semaphore is locked */ - void unlock (); /* It unlocks the shared semaphore */ + COMM_ID getKey (); - void stop (); /* It suspends the current process */ - void resume (); /* It resumes ___________ */ - -protected : + void lock (); /* It suspends the current process if the semaphore is locked */ + void unlock (); /* It unlocks the shared semaphore */ - COMM_ID key; + void stop (); /* It suspends the current process */ + void resume (); /* It resumes ___________ */ - sem_t sem_lock; - - sem_t sem_stop; + protected : - static unsigned num_comm; -}; + COMM_ID key; -extern Communicable * getCommunicable (COMM_ID __key); + sem_t sem_lock; + + sem_t sem_stop; + + static unsigned num_comm; + }; + +extern Communicable * getCommunicable (COMM_ID __key); //extern COMM_ID getKey (const Communicable * __comm); diff --git a/trunk/paradiseo-peo/src/core/cooperative.h b/trunk/paradiseo-peo/src/core/cooperative.h index 573c06805..e8d9698f7 100644 --- a/trunk/paradiseo-peo/src/core/cooperative.h +++ b/trunk/paradiseo-peo/src/core/cooperative.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,28 +42,29 @@ typedef unsigned COOP_ID; -class Cooperative : public Communicable { +class Cooperative : public Communicable + { -public : + public : - Runner * getOwner (); + Runner * getOwner (); - void setOwner (Runner & __runner); + void setOwner (Runner & __runner); - virtual void pack () = 0; - - virtual void unpack () = 0; + virtual void pack () = 0; - void send (Cooperative * __coop); + virtual void unpack () = 0; - virtual void notifySending (); + void send (Cooperative * __coop); -private : + virtual void notifySending (); - Runner * owner; + private : -}; + Runner * owner; -extern Cooperative * getCooperative (COOP_ID __key); + }; + +extern Cooperative * getCooperative (COOP_ID __key); #endif diff --git a/trunk/paradiseo-peo/src/core/eoPop_comm.h b/trunk/paradiseo-peo/src/core/eoPop_comm.h index 6071ae92a..322d2cf03 100644 --- a/trunk/paradiseo-peo/src/core/eoPop_comm.h +++ b/trunk/paradiseo-peo/src/core/eoPop_comm.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,17 +41,19 @@ #include "messaging.h" -template void pack (const eoPop & __pop) { +template void pack (const eoPop & __pop) +{ pack ((unsigned) __pop.size ()); for (unsigned i = 0; i < __pop.size (); i ++) pack (__pop [i]); } -template void unpack (eoPop & __pop) { +template void unpack (eoPop & __pop) +{ unsigned n; - + unpack (n); __pop.resize (n); for (unsigned i = 0; i < n; i ++) diff --git a/trunk/paradiseo-peo/src/core/eoVector_comm.h b/trunk/paradiseo-peo/src/core/eoVector_comm.h index 9921c3622..d9cb90882 100644 --- a/trunk/paradiseo-peo/src/core/eoVector_comm.h +++ b/trunk/paradiseo-peo/src/core/eoVector_comm.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,34 +41,36 @@ #include "messaging.h" -template void pack (const eoVector & __v) { +template void pack (const eoVector & __v) +{ - if ( !__v.invalid() ) - { - pack( (unsigned int) 1 ); + if ( !__v.invalid() ) + { + pack( (unsigned int) 1 ); pack (__v.fitness ()) ; - } + } else - pack( (unsigned int) 0 ); + pack( (unsigned int) 0 ); unsigned len = __v.size (); pack (len); for (unsigned i = 0 ; i < len; i ++) - pack (__v [i]); + pack (__v [i]); } -template void unpack (eoVector & __v) { +template void unpack (eoVector & __v) +{ - F fit; + F fit; unsigned int vfit; unpack( vfit ); - if ( vfit ) - { - unpack (fit); + if ( vfit ) + { + unpack (fit); __v.fitness (fit); - } - else - __v.invalidate(); + } + else + __v.invalidate(); unsigned len; unpack (len); __v.resize (len); @@ -76,21 +78,23 @@ template void unpack (eoVector & __v) { unpack (__v [i]); } -template void pack (const eoVectorParticle & __v) { +template void pack (const eoVectorParticle & __v) +{ pack (__v.fitness ()) ; pack (__v.best()); unsigned len = __v.size (); pack (len); for (unsigned i = 0 ; i < len; i ++) - pack (__v [i]); + pack (__v [i]); for (unsigned i = 0 ; i < len; i ++) - pack (__v.bestPositions[i]); + pack (__v.bestPositions[i]); for (unsigned i = 0 ; i < len; i ++) - pack (__v.velocities[i]); + pack (__v.velocities[i]); } -template void unpack (eoVectorParticle & __v) { +template void unpack (eoVectorParticle & __v) +{ F fit; unpack(fit); @@ -101,11 +105,11 @@ template void unpack (eoVectorParticle & _ unpack (len); __v.resize (len); for (unsigned i = 0 ; i < len; i ++) - unpack (__v [i]); + unpack (__v [i]); for (unsigned i = 0 ; i < len; i ++) - unpack (__v.bestPositions[i]); + unpack (__v.bestPositions[i]); for (unsigned i = 0 ; i < len; i ++) - unpack (__v.velocities[i]); + unpack (__v.velocities[i]); } #endif diff --git a/trunk/paradiseo-peo/src/core/messaging.h b/trunk/paradiseo-peo/src/core/messaging.h index 4b9d0b3d9..1087584de 100644 --- a/trunk/paradiseo-peo/src/core/messaging.h +++ b/trunk/paradiseo-peo/src/core/messaging.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,44 +40,46 @@ #include /* Char */ -extern void pack (const char & __c); +extern void pack (const char & __c); /* Float */ -extern void pack (const float & __f, int __nitem = 1); +extern void pack (const float & __f, int __nitem = 1); /* Double */ -extern void pack (const double & __d, int __nitem = 1); +extern void pack (const double & __d, int __nitem = 1); /* Integer */ -extern void pack (const int & __i, int __nitem = 1); +extern void pack (const int & __i, int __nitem = 1); /* Unsigned int. */ -extern void pack (const unsigned int & __ui, int __nitem = 1); +extern void pack (const unsigned int & __ui, int __nitem = 1); /* Short int. */ -extern void pack (const short & __sh, int __nitem = 1); +extern void pack (const short & __sh, int __nitem = 1); /* Unsigned short */ extern void pack (const unsigned short & __ush, int __nitem = 1); /* Long */ -extern void pack (const long & __l, int __nitem = 1); +extern void pack (const long & __l, int __nitem = 1); /* Unsigned long */ -extern void pack (const unsigned long & __ul, int __nitem = 1); +extern void pack (const unsigned long & __ul, int __nitem = 1); /* String */ -extern void pack (const char * __str); +extern void pack (const char * __str); /* Pointer */ -template void pack (const T * __ptr) { - - pack ((unsigned long) __ptr); +template void pack (const T * __ptr) +{ + + pack ((unsigned long) __ptr); } /* Pair */ -template void pack (const std :: pair & __pair) { - +template void pack (const std :: pair & __pair) +{ + pack (__pair.first); pack (__pair.second); } @@ -86,46 +88,48 @@ template void pack (const std :: pair & __pair) { // /* Char */ -extern void unpack (char & __c); +extern void unpack (char & __c); /* Float */ -extern void unpack (float & __f, int __nitem = 1); +extern void unpack (float & __f, int __nitem = 1); /* Double */ -extern void unpack (double & __d, int __nitem = 1); +extern void unpack (double & __d, int __nitem = 1); /* Integer */ -extern void unpack (int & __i, int __nitem = 1); +extern void unpack (int & __i, int __nitem = 1); /* Unsigned int. */ -extern void unpack (unsigned int & __ui, int __nitem = 1); +extern void unpack (unsigned int & __ui, int __nitem = 1); /* Short int. */ -extern void unpack (short & __sh, int __nitem = 1); +extern void unpack (short & __sh, int __nitem = 1); /* Unsigned short */ extern void unpack (unsigned short & __ush, int __nitem = 1); /* Long */ -extern void unpack (long & __l, int __nitem = 1); +extern void unpack (long & __l, int __nitem = 1); /* Unsigned long */ -extern void unpack (unsigned long & __ul, int __nitem = 1); +extern void unpack (unsigned long & __ul, int __nitem = 1); /* String */ -extern void unpack (char * __str); +extern void unpack (char * __str); /* Pointer */ -template void unpack (T * & __ptr) { - +template void unpack (T * & __ptr) +{ + unsigned long p; unpack (p); __ptr = (T *) p; } /* Pair */ -template void unpack (std :: pair & __pair) { - +template void unpack (std :: pair & __pair) +{ + unpack (__pair.first); unpack (__pair.second); } diff --git a/trunk/paradiseo-peo/src/core/peo_debug.cpp b/trunk/paradiseo-peo/src/core/peo_debug.cpp index 26db32ba3..e5aa1bff1 100644 --- a/trunk/paradiseo-peo/src/core/peo_debug.cpp +++ b/trunk/paradiseo-peo/src/core/peo_debug.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -56,7 +56,8 @@ static char host [MAX_BUFF_SIZE]; std :: vector files; -void setDebugMode (bool __dbg) { +void setDebugMode (bool __dbg) +{ debug = __dbg; gethostname (host, MAX_BUFF_SIZE); @@ -64,8 +65,9 @@ void setDebugMode (bool __dbg) { extern int getNodeRank (); -void initDebugging () { - +void initDebugging () +{ + mkdir (DEBUG_PATH, S_IRWXU); // files.push_back (stdout); char buff [MAX_BUFF_SIZE]; @@ -73,33 +75,37 @@ void initDebugging () { files.push_back (fopen (buff, "w")); } -void endDebugging () { +void endDebugging () +{ for (unsigned i = 0; i < files.size (); i ++) if (files [i] != stdout) fclose (files [i]); } -void printDebugMessage (const char * __mess) { +void printDebugMessage (const char * __mess) +{ - if (debug) { + if (debug) + { - char buff [MAX_BUFF_SIZE]; - time_t t = time (0); + char buff [MAX_BUFF_SIZE]; + time_t t = time (0); - /* Date */ - sprintf (buff, "[%s][%s: ", host, ctime (& t)); - * strchr (buff, '\n') = ']'; - for (unsigned i = 0; i < files.size (); i ++) - fprintf (files [i], buff); + /* Date */ + sprintf (buff, "[%s][%s: ", host, ctime (& t)); + * strchr (buff, '\n') = ']'; + for (unsigned i = 0; i < files.size (); i ++) + fprintf (files [i], buff); - /* Message */ - sprintf (buff, "%s", __mess); - - for (unsigned i = 0; i < files.size (); i ++) { - fputs (buff, files [i]); - fputs ("\n", files [i]); - fflush (files [i]); + /* Message */ + sprintf (buff, "%s", __mess); + + for (unsigned i = 0; i < files.size (); i ++) + { + fputs (buff, files [i]); + fputs ("\n", files [i]); + fflush (files [i]); + } } - } } diff --git a/trunk/paradiseo-peo/src/core/peo_debug.h b/trunk/paradiseo-peo/src/core/peo_debug.h index d00b5e9c7..8c72f860b 100644 --- a/trunk/paradiseo-peo/src/core/peo_debug.h +++ b/trunk/paradiseo-peo/src/core/peo_debug.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/core/peo_fin.cpp b/trunk/paradiseo-peo/src/core/peo_fin.cpp index c6b41cceb..82b19559a 100644 --- a/trunk/paradiseo-peo/src/core/peo_fin.cpp +++ b/trunk/paradiseo-peo/src/core/peo_fin.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,7 +39,8 @@ #include "runner.h" #include "rmc.h" -void peo :: finalize () { +void peo :: finalize () +{ printDebugMessage ("waiting for the termination of all threads"); diff --git a/trunk/paradiseo-peo/src/core/peo_fin.h b/trunk/paradiseo-peo/src/core/peo_fin.h index 9cdaf2bf8..de34ee2dd 100644 --- a/trunk/paradiseo-peo/src/core/peo_fin.h +++ b/trunk/paradiseo-peo/src/core/peo_fin.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,8 +37,9 @@ #ifndef __peo_finalize_h #define __peo_finalize_h -namespace peo { - +namespace peo + { + extern void finalize (); } diff --git a/trunk/paradiseo-peo/src/core/peo_init.cpp b/trunk/paradiseo-peo/src/core/peo_init.cpp index 301090a34..130e398a3 100644 --- a/trunk/paradiseo-peo/src/core/peo_init.cpp +++ b/trunk/paradiseo-peo/src/core/peo_init.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,24 +41,26 @@ #include "peo_debug.h" #include "rmc.h" -namespace peo { +namespace peo + { int * argc; - + char * * * argv; - void init (int & __argc, char * * & __argv) { + void init (int & __argc, char * * & __argv) + { argc = & __argc; - + argv = & __argv; - + /* Initializing the the Resource Management and Communication */ initRMC (__argc, __argv); - /* Loading the common parameters */ + /* Loading the common parameters */ loadParameters (__argc, __argv); - + /* */ initDebugging (); } diff --git a/trunk/paradiseo-peo/src/core/peo_init.h b/trunk/paradiseo-peo/src/core/peo_init.h index b578cb501..0e39ad506 100644 --- a/trunk/paradiseo-peo/src/core/peo_init.h +++ b/trunk/paradiseo-peo/src/core/peo_init.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,12 +37,13 @@ #ifndef __peo_init_h #define __peo_init_h -namespace peo { +namespace peo + { extern int * argc; - + extern char * * * argv; - + extern void init (int & __argc, char * * & __argv); } diff --git a/trunk/paradiseo-peo/src/core/peo_param.cpp b/trunk/paradiseo-peo/src/core/peo_param.cpp index a6023430e..3d5af684d 100644 --- a/trunk/paradiseo-peo/src/core/peo_param.cpp +++ b/trunk/paradiseo-peo/src/core/peo_param.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,7 +41,8 @@ -void peo :: loadParameters (int & __argc, char * * & __argv) { +void peo :: loadParameters (int & __argc, char * * & __argv) +{ eoParser parser (__argc, __argv); diff --git a/trunk/paradiseo-peo/src/core/peo_param.h b/trunk/paradiseo-peo/src/core/peo_param.h index fd00bfc28..1860dce90 100644 --- a/trunk/paradiseo-peo/src/core/peo_param.h +++ b/trunk/paradiseo-peo/src/core/peo_param.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,8 +37,9 @@ #ifndef __peo_param_h #define __peo_param_h -namespace peo { - +namespace peo + { + extern void loadParameters (int & __argc, char * * & __argv); } diff --git a/trunk/paradiseo-peo/src/core/peo_run.cpp b/trunk/paradiseo-peo/src/core/peo_run.cpp index b379146af..6b91f7dbe 100644 --- a/trunk/paradiseo-peo/src/core/peo_run.cpp +++ b/trunk/paradiseo-peo/src/core/peo_run.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,8 +39,9 @@ #include "rmc.h" #include "runner.h" -void peo :: run () { - +void peo :: run () +{ + startRunners (); runRMC (); diff --git a/trunk/paradiseo-peo/src/core/peo_run.h b/trunk/paradiseo-peo/src/core/peo_run.h index e4bcc55c6..5eaf5483a 100644 --- a/trunk/paradiseo-peo/src/core/peo_run.h +++ b/trunk/paradiseo-peo/src/core/peo_run.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,8 +37,9 @@ #ifndef __peo_run_h #define __peo_run_h -namespace peo { - +namespace peo + { + extern void run (); } diff --git a/trunk/paradiseo-peo/src/core/reac_thread.cpp b/trunk/paradiseo-peo/src/core/reac_thread.cpp index d771a8ad4..8ae675e15 100644 --- a/trunk/paradiseo-peo/src/core/reac_thread.cpp +++ b/trunk/paradiseo-peo/src/core/reac_thread.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,25 +40,29 @@ static bool the_end = false; static std :: vector reac_threads; -ReactiveThread :: ReactiveThread () { +ReactiveThread :: ReactiveThread () +{ reac_threads.push_back (this); sem_init (& sem, 0, 0); } -void ReactiveThread :: sleep () { +void ReactiveThread :: sleep () +{ - sem_wait (& sem); + sem_wait (& sem); } -void ReactiveThread :: wakeUp () { +void ReactiveThread :: wakeUp () +{ - sem_post (& sem); + sem_post (& sem); } -void stopReactiveThreads () { +void stopReactiveThreads () +{ the_end = true; for (unsigned i = 0; i < reac_threads.size (); i ++) - reac_threads [i] -> wakeUp (); + reac_threads [i] -> wakeUp (); } diff --git a/trunk/paradiseo-peo/src/core/reac_thread.h b/trunk/paradiseo-peo/src/core/reac_thread.h index b3cd71912..f9f132f02 100644 --- a/trunk/paradiseo-peo/src/core/reac_thread.h +++ b/trunk/paradiseo-peo/src/core/reac_thread.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,22 +41,23 @@ #include "thread.h" -class ReactiveThread : public Thread { - -public: +class ReactiveThread : public Thread + { - /* Ctor */ - ReactiveThread (); + public: - void sleep (); - - void wakeUp (); - -private: + /* Ctor */ + ReactiveThread (); - sem_t sem; - -}; + void sleep (); + + void wakeUp (); + + private: + + sem_t sem; + + }; extern void stopReactiveThreads (); diff --git a/trunk/paradiseo-peo/src/core/ring_topo.cpp b/trunk/paradiseo-peo/src/core/ring_topo.cpp index 5dbf9933d..dfdbf571c 100644 --- a/trunk/paradiseo-peo/src/core/ring_topo.cpp +++ b/trunk/paradiseo-peo/src/core/ring_topo.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,17 +37,19 @@ #include "ring_topo.h" void RingTopology :: setNeighbors (Cooperative * __mig, - std :: vector & __from, - std :: vector & __to) { + std :: vector & __from, + std :: vector & __to) +{ __from.clear () ; __to.clear () ; - int len = mig.size () ; - - for (int i = 0 ; i < len ; i ++) - if (mig [i] == __mig) { - __from.push_back (mig [(i - 1 + len) % len]) ; - __to.push_back (mig [(i + 1) % len]) ; - break; + int len = mig.size () ; + + for (int i = 0 ; i < len ; i ++) + if (mig [i] == __mig) + { + __from.push_back (mig [(i - 1 + len) % len]) ; + __to.push_back (mig [(i + 1) % len]) ; + break; } } diff --git a/trunk/paradiseo-peo/src/core/ring_topo.h b/trunk/paradiseo-peo/src/core/ring_topo.h index 40d7405c6..b1715a99b 100644 --- a/trunk/paradiseo-peo/src/core/ring_topo.h +++ b/trunk/paradiseo-peo/src/core/ring_topo.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,14 +39,15 @@ #include "topology.h" -class RingTopology : public Topology { - -public : - - void setNeighbors (Cooperative * __mig, - std :: vector & __from, - std :: vector & __to); - -}; +class RingTopology : public Topology + { + + public : + + void setNeighbors (Cooperative * __mig, + std :: vector & __from, + std :: vector & __to); + + }; #endif diff --git a/trunk/paradiseo-peo/src/core/rmc.h b/trunk/paradiseo-peo/src/core/rmc.h index 7efb1bac3..be2f18e2e 100644 --- a/trunk/paradiseo-peo/src/core/rmc.h +++ b/trunk/paradiseo-peo/src/core/rmc.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,7 +39,7 @@ extern void initRMC (int & __argc, char * * & __argv); -extern void runRMC (); /* Resource Management and Communication */ +extern void runRMC (); /* Resource Management and Communication */ extern void finalizeRMC (); diff --git a/trunk/paradiseo-peo/src/core/runner.cpp b/trunk/paradiseo-peo/src/core/runner.cpp index 5df0bde41..c8c5ac36a 100644 --- a/trunk/paradiseo-peo/src/core/runner.cpp +++ b/trunk/paradiseo-peo/src/core/runner.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -43,47 +43,53 @@ static unsigned num_act = 0; /* Number of active runners */ -static std :: vector ll_threads; /* Low-level runner threads */ +static std :: vector ll_threads; /* Low-level runner threads */ static std :: vector the_runners; static unsigned num_runners = 0; -Runner :: Runner () { +Runner :: Runner () +{ id = ++ num_runners; the_runners.push_back (this); sem_init (& sem_start, 0, 0); - num_act ++; + num_act ++; } extern int getNodeRank (); extern int getNumberOfNodes (); -void unpackTerminationOfRunner () { - +void unpackTerminationOfRunner () +{ + RUNNER_ID id; - unpack (id); + unpack (id); num_act --; printDebugMessage ("I'm noticed of the termination of a runner"); - if (! num_act) { - printDebugMessage ("all the runners have terminated. Now stopping the reactive threads."); - stopReactiveThreads (); - } + if (! num_act) + { + printDebugMessage ("all the runners have terminated. Now stopping the reactive threads."); + stopReactiveThreads (); + } } -bool atLeastOneActiveRunner () { +bool atLeastOneActiveRunner () +{ return num_act; } -RUNNER_ID Runner :: getID () { +RUNNER_ID Runner :: getID () +{ return id; } -void Runner :: start () { +void Runner :: start () +{ setActive (); sem_post (& sem_start); @@ -91,7 +97,8 @@ void Runner :: start () { terminate (); } -void Runner :: notifySendingTermination () { +void Runner :: notifySendingTermination () +{ /* char b [1000]; @@ -100,32 +107,37 @@ void Runner :: notifySendingTermination () { */ printDebugMessage ("je suis informe que tout le monde a recu ma terminaison"); setPassive (); - + } -void Runner :: waitStarting () { +void Runner :: waitStarting () +{ sem_wait (& sem_start); } -Runner * getRunner (RUNNER_ID __key) { +Runner * getRunner (RUNNER_ID __key) +{ return dynamic_cast (getCommunicable (__key)); } -void startRunners () { - +void startRunners () +{ + /* Runners */ for (unsigned i = 0; i < the_runners.size (); i ++) - if (the_runners [i] -> isLocal ()) { - addThread (the_runners [i], ll_threads); - the_runners [i] -> waitStarting (); - } + if (the_runners [i] -> isLocal ()) + { + addThread (the_runners [i], ll_threads); + the_runners [i] -> waitStarting (); + } printDebugMessage ("launched the parallel runners"); } -void joinRunners () { +void joinRunners () +{ joinThreads (ll_threads); diff --git a/trunk/paradiseo-peo/src/core/runner.h b/trunk/paradiseo-peo/src/core/runner.h index 0567d3b4f..9153481b8 100644 --- a/trunk/paradiseo-peo/src/core/runner.h +++ b/trunk/paradiseo-peo/src/core/runner.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,40 +44,41 @@ typedef unsigned RUNNER_ID; -class Runner : public Communicable, public Thread { +class Runner : public Communicable, public Thread + { -public : + public : - Runner (); + Runner (); - void start (); + void start (); - void waitStarting (); + void waitStarting (); - bool isLocal (); + bool isLocal (); - void terminate (); + void terminate (); - virtual void run () = 0; - - RUNNER_ID getID (); + virtual void run () = 0; - void packTermination (); + RUNNER_ID getID (); - void notifySendingTermination (); + void packTermination (); -private : + void notifySendingTermination (); - sem_t sem_start; + private : - unsigned id; -}; + sem_t sem_start; + + unsigned id; + }; extern bool atLeastOneActiveRunner (); extern void unpackTerminationOfRunner (); -extern Runner * getRunner (RUNNER_ID __key); +extern Runner * getRunner (RUNNER_ID __key); extern void startRunners (); diff --git a/trunk/paradiseo-peo/src/core/service.cpp b/trunk/paradiseo-peo/src/core/service.cpp index c843aec10..fc36d7105 100644 --- a/trunk/paradiseo-peo/src/core/service.cpp +++ b/trunk/paradiseo-peo/src/core/service.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,51 +36,55 @@ #include "service.h" -void Service :: setOwner (Thread & __owner) { +void Service :: setOwner (Thread & __owner) +{ owner = & __owner; } - -Thread * Service :: getOwner () { + +Thread * Service :: getOwner () +{ return owner; } -Service * getService (SERVICE_ID __key) { +Service * getService (SERVICE_ID __key) +{ return dynamic_cast (getCommunicable (__key)); } -void Service :: notifySendingData () { - +void Service :: notifySendingData () +{ } -void Service :: notifySendingResourceRequest () { +void Service :: notifySendingResourceRequest () +{ num_sent_rr --; if (! num_sent_rr) notifySendingAllResourceRequests (); } -void Service :: notifySendingAllResourceRequests () { - +void Service :: notifySendingAllResourceRequests () +{ } -void Service :: packData () { - +void Service :: packData () +{ } -void Service :: unpackData () { - +void Service :: unpackData () +{ } -void Service :: execute () { - -} - -void Service :: packResult () { - +void Service :: execute () +{ } -void Service :: unpackResult () { - +void Service :: packResult () +{ +} + +void Service :: unpackResult () +{ } diff --git a/trunk/paradiseo-peo/src/core/service.h b/trunk/paradiseo-peo/src/core/service.h index 67a0fef03..f2fe895b7 100644 --- a/trunk/paradiseo-peo/src/core/service.h +++ b/trunk/paradiseo-peo/src/core/service.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,37 +42,38 @@ typedef unsigned SERVICE_ID; -class Service : public Communicable { +class Service : public Communicable + { -public : + public : - void setOwner (Thread & __owner); - - Thread * getOwner (); + void setOwner (Thread & __owner); - void requestResourceRequest (unsigned __how_many = 1); - void packResourceRequest (); + Thread * getOwner (); - virtual void packData (); - virtual void unpackData (); + void requestResourceRequest (unsigned __how_many = 1); + void packResourceRequest (); - virtual void execute (); - - virtual void packResult (); - virtual void unpackResult (); + virtual void packData (); + virtual void unpackData (); - virtual void notifySendingData (); - virtual void notifySendingResourceRequest (); - virtual void notifySendingAllResourceRequests (); + virtual void execute (); -private : + virtual void packResult (); + virtual void unpackResult (); - Thread * owner; /* Owner thread (i.e. 'uses' that service) */ + virtual void notifySendingData (); + virtual void notifySendingResourceRequest (); + virtual void notifySendingAllResourceRequests (); - unsigned num_sent_rr; /* Number of RR not really sent (i.e. still in the sending queue)*/ + private : -}; + Thread * owner; /* Owner thread (i.e. 'uses' that service) */ -extern Service * getService (SERVICE_ID __key); + unsigned num_sent_rr; /* Number of RR not really sent (i.e. still in the sending queue)*/ + + }; + +extern Service * getService (SERVICE_ID __key); #endif diff --git a/trunk/paradiseo-peo/src/core/thread.cpp b/trunk/paradiseo-peo/src/core/thread.cpp index 4ce4beae2..3badf671d 100644 --- a/trunk/paradiseo-peo/src/core/thread.cpp +++ b/trunk/paradiseo-peo/src/core/thread.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,68 +42,79 @@ static std :: vector threads; unsigned num_act = 0; -Thread :: Thread () { - +Thread :: Thread () +{ + threads.push_back (this); act = false; } -Thread :: ~ Thread () { +Thread :: ~ Thread () +{ /* Nothing ! */ } extern int getNodeRank (); -void Thread :: setActive () { +void Thread :: setActive () +{ - if (! act ) { + if (! act ) + { - act = true; - num_act ++; - // if (getNodeRank () == 1) - // printf ("On passe a %d\n", num_act); - } + act = true; + num_act ++; + // if (getNodeRank () == 1) + // printf ("On passe a %d\n", num_act); + } } -void Thread :: setPassive () { +void Thread :: setPassive () +{ - if (act) { + if (act) + { - act = false; - num_act --; - // if (getNodeRank () == 1) - // printf ("On passe a %d\n", num_act); + act = false; + num_act --; + // if (getNodeRank () == 1) + // printf ("On passe a %d\n", num_act); - } + } } -bool atLeastOneActiveThread () { +bool atLeastOneActiveThread () +{ return num_act; } -unsigned numberOfActiveThreads () { +unsigned numberOfActiveThreads () +{ return num_act; } -static void * launch (void * __arg) { +static void * launch (void * __arg) +{ - Thread * thr = (Thread *) __arg; + Thread * thr = (Thread *) __arg; thr -> start (); return 0; } -void addThread (Thread * __hl_thread, std :: vector & __ll_threads) { +void addThread (Thread * __hl_thread, std :: vector & __ll_threads) +{ pthread_t * ll_thr = new pthread_t; __ll_threads.push_back (ll_thr); - pthread_create (ll_thr, 0, launch, __hl_thread); + pthread_create (ll_thr, 0, launch, __hl_thread); } -void joinThreads (std :: vector & __threads) { +void joinThreads (std :: vector & __threads) +{ - for (unsigned i = 0; i < __threads.size (); i ++) - pthread_join (* __threads [i], 0); + for (unsigned i = 0; i < __threads.size (); i ++) + pthread_join (* __threads [i], 0); } diff --git a/trunk/paradiseo-peo/src/core/thread.h b/trunk/paradiseo-peo/src/core/thread.h index 0508d60d4..7d51bf2d7 100644 --- a/trunk/paradiseo-peo/src/core/thread.h +++ b/trunk/paradiseo-peo/src/core/thread.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,27 +41,28 @@ /* A high-level thread */ -class Thread { - -public: +class Thread + { - /* Ctor */ - Thread (); + public: - /* Dtor */ - virtual ~ Thread (); - - /* Go ! */ - virtual void start () = 0; + /* Ctor */ + Thread (); - void setActive ();/* It means the current process is going to send messages soon */ - void setPassive ();/* The current process is not going to perform send operations - (but it may receive messages) */ + /* Dtor */ + virtual ~ Thread (); -private : - - bool act; -}; + /* Go ! */ + virtual void start () = 0; + + void setActive ();/* It means the current process is going to send messages soon */ + void setPassive ();/* The current process is not going to perform send operations + (but it may receive messages) */ + + private : + + bool act; + }; extern void addThread (Thread * __hl_thread, std :: vector & __ll_threads); @@ -69,7 +70,7 @@ extern void joinThreads (std :: vector & __ll_threads); extern bool atLeastOneActiveThread (); /* It returns 'true' iff at least one process is going to send messages */ - + extern unsigned numberOfActiveThreads (); diff --git a/trunk/paradiseo-peo/src/core/topology.cpp b/trunk/paradiseo-peo/src/core/topology.cpp index 4a685b406..89deaa759 100644 --- a/trunk/paradiseo-peo/src/core/topology.cpp +++ b/trunk/paradiseo-peo/src/core/topology.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,13 +36,15 @@ #include "topology.h" -Topology :: ~ Topology () { - +Topology :: ~ Topology () +{ + /* Nothing ! */ } -void Topology :: add (Cooperative & __mig) { - - mig.push_back (& __mig) ; -} +void Topology :: add (Cooperative & __mig) + { + + mig.push_back (& __mig) ; + } diff --git a/trunk/paradiseo-peo/src/core/topology.h b/trunk/paradiseo-peo/src/core/topology.h index 1addbf842..0d14cb98a 100644 --- a/trunk/paradiseo-peo/src/core/topology.h +++ b/trunk/paradiseo-peo/src/core/topology.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,21 +41,22 @@ #include "cooperative.h" -class Topology { +class Topology + { -public: + public: - virtual ~Topology (); + virtual ~Topology (); - void add (Cooperative & __mig); + void add (Cooperative & __mig); - virtual void setNeighbors (Cooperative * __mig, - std :: vector & __from, - std :: vector & __to) = 0; + virtual void setNeighbors (Cooperative * __mig, + std :: vector & __from, + std :: vector & __to) = 0; -protected: + protected: - std :: vector mig ; -}; + std :: vector mig ; + }; #endif diff --git a/trunk/paradiseo-peo/src/peo.h b/trunk/paradiseo-peo/src/peo.h index 2a74c9a48..c9584db38 100644 --- a/trunk/paradiseo-peo/src/peo.h +++ b/trunk/paradiseo-peo/src/peo.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -114,7 +114,7 @@ //! for nonlinear numerical optimization). Whereas some time-out detection can be used to //! address the former issue, the latter one can be partially overcome if the grain is set to very //! small values, as individuals will be sent out for evaluations upon request of the workers. -//! +//! //!
  • Distributed evaluation of a single solution. The quality of each solution is evaluated in //! a parallel centralized way. That model is particularly interesting when the evaluation //! function can be itself parallelized as it is CPU time-consuming and/or IO intensive. In @@ -146,11 +146,11 @@ //!
      //!
    • Parallel exploration of neighboring candidates. It is a low-level Farmer-Worker model //! that does not alter the behavior of the heuristic. A sequential search computes the same -//! results slower.At the beginning of each iteration, the farmer duplicates the current solution +//! results slower.At the beginning of each iteration, the farmer duplicates the current solution //! between distributed nodes. Each one manages some candidates and the results are returned to the farmer. -//! The model is efficient if the evaluation of a each solution is time-consuming and/or there are a great -//! deal of candidate neighbors to evaluate. This is obviously not applicable to SA since only one candidate -//! is evaluated at each iteration. Likewise, the efficiency of the model for HC is not always guaranteed as +//! The model is efficient if the evaluation of a each solution is time-consuming and/or there are a great +//! deal of candidate neighbors to evaluate. This is obviously not applicable to SA since only one candidate +//! is evaluated at each iteration. Likewise, the efficiency of the model for HC is not always guaranteed as //! the number of neighboring solutions to process before finding one that improves the current objective function may //! be highly variable.
    • //! @@ -278,7 +278,7 @@ //! //! The basisc of the ParadisEO framework philosophy are exposed in a few simple tutorials: //! diff --git a/trunk/paradiseo-peo/src/peoAggEvalFunc.h b/trunk/paradiseo-peo/src/peoAggEvalFunc.h index 8727112d3..b1d41b459 100644 --- a/trunk/paradiseo-peo/src/peoAggEvalFunc.h +++ b/trunk/paradiseo-peo/src/peoAggEvalFunc.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -50,9 +50,8 @@ //! //! //! The aggregation object is called in an iterative manner for each of the results obtained by applying partial evaluation functions. -template< class EOT > class peoAggEvalFunc : public eoBF< EOT&, const typename EOT :: Fitness&, void > { - -}; +template< class EOT > class peoAggEvalFunc : public eoBF< EOT&, const typename EOT :: Fitness&, void > + {}; #endif diff --git a/trunk/paradiseo-peo/src/peoAsyncIslandMig.h b/trunk/paradiseo-peo/src/peoAsyncIslandMig.h index a2dc1140e..a6612abb8 100644 --- a/trunk/paradiseo-peo/src/peoAsyncIslandMig.h +++ b/trunk/paradiseo-peo/src/peoAsyncIslandMig.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -74,7 +74,7 @@ //! } while ( eaCheckpointContinue( population ) );   // checkpoint operators are applied on the current population, including the migration operator, if any specified //! //! -//! Constructing an asynchronous island migration model requires having defined (1) a topological migration model, +//! Constructing an asynchronous island migration model requires having defined (1) a topological migration model, //! (2) the control parameters of the migration process, (3) a checkpoint object associated with an evolutionary algorithm, //! and (4) an owner object must be set. The owner object must be derived from the Runner class (for example //! a peoEA object represents a possible owner). @@ -82,14 +82,14 @@ //! //!
        //!
      1. topological model to be followed when performing migrations:
        -//!
        +//!
        //! //! //!
        RingTopology migTopology;   // a simple ring topological model - each island communicates with two other islands
        //!
      2. //! //!
      3. the continuation criterion, selection and replacement strategy etc. are defined:
        -//!
        +//!
        //! //! //! @@ -98,16 +98,16 @@ //! //! //! -//! +//!
        );   //! //!
        eoPop< EOT > population( POP_SIZE, popInitializer );   // population of individuals to be used for the evolutionary algorithm
           
        eoSelectNumber< EOT > migSelect( migSelectStrategy, MIG_SIZE );   // number of individuals to be selected using the specified strategy
        eoPlusReplacement< EOT > migReplace;   // immigration strategy - the worse individuals in the destination population are replaced by the immigrant individuals
           
        peoAsyncIslandMig< EOT > asyncMigration( +//!
        peoAsyncIslandMig< EOT > asyncMigration( //!
                 migCont, migSelect, migReplace, migTopology, //!
                 population, population -//!
        );  
        // asynchronous migration object - the emigrant individuals are selected from the same from population in which the immigrant individuals are being integrated
        //!
      4. //! //!
      5. creation of a checkpoint object as part of the definition of an evolutionary algoritm (details of th EA not given as being out of scope):
        -//!
        +//!
        //! //! //! @@ -119,7 +119,7 @@ //! //! //!
      6. definition of an owner evolutionary algorithm (an object inheriting the Runner class):
        -//!
        +//!
        //!
      7. ...    
        eoGenContinue< EOT > eaCont( NUM_GEN );   // the evolutionary algorithm will stop after NUM_GEN generations
        //! //! @@ -137,149 +137,157 @@ //! islands requires the reiteration of the steps 2 through 4 for creating distinct algorithms, with distinct populations and //! the associated distinctly parametrized migration objects. The interconnecting element is the underlying topology, defined at step 1 //! (the same C++ migTopology object has to be passed as parameter for all the migration objects, in order to interconnect them). -template< class EOT > class peoAsyncIslandMig : public Cooperative, public eoUpdater { +template< class EOT > class peoAsyncIslandMig : public Cooperative, public eoUpdater + { -public: + public: - //! Constructor for the peoAsyncIslandMig class; the characteristics of the migration model are defined - //! through the specified parameters - out of the box objects provided in EO, etc., or custom, derived objects may be passed as parameters. - //! - //! @param eoContinue< EOT >& __cont - continuation criterion specifying whether the migration is performed or not; - //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of emigrant individuals out of the source population; - //! @param eoReplacement< EOT >& __replace - replacement strategy used for integrating the immigrant individuals in the destination population; - //! @param Topology& __topology - topological model to be followed when performing migrations; - //! @param eoPop< EOT >& __source - source population from which the emigrant individuals are selected; - //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. - peoAsyncIslandMig( - eoContinue< EOT >& __cont, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination - ); + //! Constructor for the peoAsyncIslandMig class; the characteristics of the migration model are defined + //! through the specified parameters - out of the box objects provided in EO, etc., or custom, derived objects may be passed as parameters. + //! + //! @param eoContinue< EOT >& __cont - continuation criterion specifying whether the migration is performed or not; + //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of emigrant individuals out of the source population; + //! @param eoReplacement< EOT >& __replace - replacement strategy used for integrating the immigrant individuals in the destination population; + //! @param Topology& __topology - topological model to be followed when performing migrations; + //! @param eoPop< EOT >& __source - source population from which the emigrant individuals are selected; + //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. + peoAsyncIslandMig( + eoContinue< EOT >& __cont, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + Topology& __topology, + eoPop< EOT >& __source, + eoPop< EOT >& __destination + ); - //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected - //! from the source population and sent to the next island (defined by the topology object) while the immigrant - //! individuals are integrated in the destination population. There is no need to explicitly call the function - the - //! wrapper checkpoint object (please refer to the above example) will perform the call when required. - void operator()(); - - //! Auxiliary function dealing with sending the emigrant individuals. There is no need to explicitly call the function. - void pack(); - //! Auxiliary function dealing with receiving immigrant individuals. There is no need to explicitly call the function. - void unpack(); + //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected + //! from the source population and sent to the next island (defined by the topology object) while the immigrant + //! individuals are integrated in the destination population. There is no need to explicitly call the function - the + //! wrapper checkpoint object (please refer to the above example) will perform the call when required. + void operator()(); + + //! Auxiliary function dealing with sending the emigrant individuals. There is no need to explicitly call the function. + void pack(); + //! Auxiliary function dealing with receiving immigrant individuals. There is no need to explicitly call the function. + void unpack(); -private: + private: - void emigrate(); - void immigrate(); + void emigrate(); + void immigrate(); -private: + private: - eoContinue< EOT >& cont; // continuator - eoSelect< EOT >& select; // the selection strategy - eoReplacement< EOT >& replace; // the replacement strategy - Topology& topology; // the neighboring topology - - // source and destination populations - eoPop< EOT >& source; - eoPop< EOT >& destination; - - // immigrants & emigrants in the queue - std :: queue< eoPop< EOT > > imm; - std :: queue< eoPop< EOT > > em; - - std :: queue< Cooperative* > coop_em; -}; + eoContinue< EOT >& cont; // continuator + eoSelect< EOT >& select; // the selection strategy + eoReplacement< EOT >& replace; // the replacement strategy + Topology& topology; // the neighboring topology + + // source and destination populations + eoPop< EOT >& source; + eoPop< EOT >& destination; + + // immigrants & emigrants in the queue + std :: queue< eoPop< EOT > > imm; + std :: queue< eoPop< EOT > > em; + + std :: queue< Cooperative* > coop_em; + }; template< class EOT > peoAsyncIslandMig< EOT > :: peoAsyncIslandMig( - eoContinue< EOT >& __cont, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination + eoContinue< EOT >& __cont, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + Topology& __topology, + eoPop< EOT >& __source, + eoPop< EOT >& __destination - ) : cont( __cont ), select( __select ), replace( __replace ), topology( __topology ), source( __source ), destination( __destination ) +) : cont( __cont ), select( __select ), replace( __replace ), topology( __topology ), source( __source ), destination( __destination ) { - __topology.add( *this ); + __topology.add( *this ); } template< class EOT > void peoAsyncIslandMig< EOT > :: pack() { - lock(); { + lock (); + { - :: pack( coop_em.front()->getKey() ); - :: pack( em.front() ); - coop_em.pop(); - em.pop(); - } - unlock(); + :: pack( coop_em.front()->getKey() ); + :: pack( em.front() ); + coop_em.pop(); + em.pop(); + } + unlock(); } template< class EOT > void peoAsyncIslandMig< EOT > :: unpack() { - lock(); { + lock (); + { - eoPop< EOT > mig; - :: unpack( mig ); - imm.push( mig ); - } - unlock(); + eoPop< EOT > mig; + :: unpack( mig ); + imm.push( mig ); + } + unlock(); } template< class EOT > void peoAsyncIslandMig< EOT > :: emigrate() { - std :: vector< Cooperative* >in, out; - topology.setNeighbors( this, in, out ); + std :: vector< Cooperative* >in, out; + topology.setNeighbors( this, in, out ); - for ( unsigned i = 0; i < out.size(); i++ ) { - - eoPop< EOT > mig; - select( source, mig ); - em.push( mig ); - coop_em.push( out[i] ); - send( out[i] ); - printDebugMessage( "sending some emigrants." ); - } + for ( unsigned i = 0; i < out.size(); i++ ) + { + + eoPop< EOT > mig; + select( source, mig ); + em.push( mig ); + coop_em.push( out[i] ); + send( out[i] ); + printDebugMessage( "sending some emigrants." ); + } } template< class EOT > void peoAsyncIslandMig< EOT > :: immigrate() { - lock(); { + lock (); + { - while ( !imm.empty() ) { + while ( !imm.empty() ) + { - replace( destination, imm.front() ); - imm.pop(); - printDebugMessage( "receiving some immigrants." ); - } - } - unlock(); + replace( destination, imm.front() ); + imm.pop(); + printDebugMessage( "receiving some immigrants." ); + } + } + unlock(); } -template< class EOT > void peoAsyncIslandMig< EOT > :: operator()() { +template< class EOT > void peoAsyncIslandMig< EOT > :: operator()() +{ - if ( !cont( source ) ) { + if ( !cont( source ) ) + { - emigrate(); // sending emigrants - immigrate(); // receiving immigrants - } + emigrate(); // sending emigrants + immigrate(); // receiving immigrants + } } diff --git a/trunk/paradiseo-peo/src/peoEA.h b/trunk/paradiseo-peo/src/peoEA.h index f55996577..a059d56a0 100644 --- a/trunk/paradiseo-peo/src/peoEA.h +++ b/trunk/paradiseo-peo/src/peoEA.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -53,7 +53,7 @@ //! The peoEA class offers an elementary evolutionary algorithm implementation. In addition, as compared //! with the algorithms provided by the EO framework, the peoEA class has the underlying necessary structure //! for including, for example, parallel evaluation and parallel transformation operators, migration operators -//! etc. Although there is no restriction on using the algorithms provided by the EO framework, the drawback resides +//! etc. Although there is no restriction on using the algorithms provided by the EO framework, the drawback resides //! in the fact that the EO implementation is exclusively sequential and, in consequence, no parallelism is provided. //! A simple example for constructing a peoEA object: //! @@ -79,95 +79,100 @@ //! //! //!
        peoEA< EOT > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace);   // evolutionary algorithm having as checkpoint the eaCheckpointContinue object defined above
        asyncMigration.setOwner( eaAlg );   // setting the evolutionary algorithm as owner of the migration object
        eaAlg( population );   // specifying the initial population for the algorithm
        ...    
        -template < class EOT > class peoEA : public Runner { +template < class EOT > class peoEA : public Runner + { -public: + public: - //! Constructor for the evolutionary algorithm object - several basic parameters have to be specified, - //! allowing for different levels of parallelism. Depending on the requirements, a sequential or a parallel - //! evaluation operator may be specified or, in the same manner, a sequential or a parallel transformation - //! operator may be given as parameter. Out of the box objects may be provided, from the EO package, for example, - //! or custom defined ones may be specified, provided that they are derived from the correct base classes. - //! - //! @param eoContinue< EOT >& __cont - continuation criterion specifying whether the algorithm should continue or not; - //! @param peoPopEval< EOT >& __pop_eval - evaluation operator; it allows the specification of parallel evaluation operators, aggregate evaluation functions, etc.; - //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of offspring individuals; - //! @param peoTransform< EOT >& __trans - transformation operator, i.e. crossover and mutation; allows for sequential or parallel transform; - //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the offspring individuals in the initial population; - peoEA( - eoContinue< EOT >& __cont, - peoPopEval< EOT >& __pop_eval, - eoSelect< EOT >& __select, - peoTransform< EOT >& __trans, - eoReplacement< EOT >& __replace - ); + //! Constructor for the evolutionary algorithm object - several basic parameters have to be specified, + //! allowing for different levels of parallelism. Depending on the requirements, a sequential or a parallel + //! evaluation operator may be specified or, in the same manner, a sequential or a parallel transformation + //! operator may be given as parameter. Out of the box objects may be provided, from the EO package, for example, + //! or custom defined ones may be specified, provided that they are derived from the correct base classes. + //! + //! @param eoContinue< EOT >& __cont - continuation criterion specifying whether the algorithm should continue or not; + //! @param peoPopEval< EOT >& __pop_eval - evaluation operator; it allows the specification of parallel evaluation operators, aggregate evaluation functions, etc.; + //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of offspring individuals; + //! @param peoTransform< EOT >& __trans - transformation operator, i.e. crossover and mutation; allows for sequential or parallel transform; + //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the offspring individuals in the initial population; + peoEA( + eoContinue< EOT >& __cont, + peoPopEval< EOT >& __pop_eval, + eoSelect< EOT >& __select, + peoTransform< EOT >& __trans, + eoReplacement< EOT >& __replace + ); - //! Evolutionary algorithm function - a side effect of the fact that the class is derived from the Runner class, - //! thus requiring the existence of a run function, the algorithm being executed on a distinct thread. - void run(); - - //! Function operator for specifying the population to be associated with the algorithm. - //! - //! @param eoPop< EOT >& __pop - initial population of the algorithm, to be iteratively evolved; - void operator()( eoPop< EOT >& __pop ); + //! Evolutionary algorithm function - a side effect of the fact that the class is derived from the Runner class, + //! thus requiring the existence of a run function, the algorithm being executed on a distinct thread. + void run(); -private: + //! Function operator for specifying the population to be associated with the algorithm. + //! + //! @param eoPop< EOT >& __pop - initial population of the algorithm, to be iteratively evolved; + void operator()( eoPop< EOT >& __pop ); + + private: - eoContinue< EOT >& cont; - peoPopEval< EOT >& pop_eval; - eoSelect< EOT >& select; - peoTransform< EOT >& trans; - eoReplacement< EOT >& replace; - eoPop< EOT >* pop; -}; + eoContinue< EOT >& cont; + peoPopEval< EOT >& pop_eval; + eoSelect< EOT >& select; + peoTransform< EOT >& trans; + eoReplacement< EOT >& replace; + eoPop< EOT >* pop; + }; -template < class EOT > peoEA< EOT > :: peoEA( +template < class EOT > peoEA< EOT > :: peoEA( - eoContinue< EOT >& __cont, - peoPopEval< EOT >& __pop_eval, - eoSelect< EOT >& __select, - peoTransform< EOT >& __trans, - eoReplacement< EOT >& __replace + eoContinue< EOT >& __cont, + peoPopEval< EOT >& __pop_eval, + eoSelect< EOT >& __select, + peoTransform< EOT >& __trans, + eoReplacement< EOT >& __replace - ) : cont( __cont ), pop_eval( __pop_eval ), select( __select ), trans( __trans ), replace( __replace ) +) : cont( __cont ), pop_eval( __pop_eval ), select( __select ), trans( __trans ), replace( __replace ) { - trans.setOwner( *this ); - pop_eval.setOwner( *this ); + trans.setOwner( *this ); + pop_eval.setOwner( *this ); } -template< class EOT > void peoEA< EOT > :: operator ()( eoPop< EOT >& __pop ) { +template< class EOT > void peoEA< EOT > :: operator ()( eoPop< EOT >& __pop ) +{ - pop = &__pop; + pop = &__pop; } -template< class EOT > void peoEA< EOT > :: run() { +template< class EOT > void peoEA< EOT > :: run() +{ - printDebugMessage( "performing the first evaluation of the population." ); - pop_eval( *pop ); - - do { + printDebugMessage( "performing the first evaluation of the population." ); + pop_eval( *pop ); - eoPop< EOT > off; + do + { - printDebugMessage( "performing the selection step." ); - select( *pop, off ); - trans( off ); + eoPop< EOT > off; - printDebugMessage( "performing the evaluation of the population." ); + printDebugMessage( "performing the selection step." ); + select( *pop, off ); + trans( off ); - pop_eval( off ); + printDebugMessage( "performing the evaluation of the population." ); - printDebugMessage( "performing the replacement of the population." ); - replace( *pop, off ); + pop_eval( off ); - printDebugMessage( "deciding of the continuation." ); - - } while ( cont( *pop ) ); + printDebugMessage( "performing the replacement of the population." ); + replace( *pop, off ); + + printDebugMessage( "deciding of the continuation." ); + + } + while ( cont( *pop ) ); } diff --git a/trunk/paradiseo-peo/src/peoEvalFunc.h b/trunk/paradiseo-peo/src/peoEvalFunc.h index a5231d551..b6e8486f3 100644 --- a/trunk/paradiseo-peo/src/peoEvalFunc.h +++ b/trunk/paradiseo-peo/src/peoEvalFunc.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -42,19 +42,21 @@ template< class EOT, class FitT = EOT::Fitness, class FunctionArg = const EOT& > #else template< class EOT, class FitT = typename EOT::Fitness, class FunctionArg = const EOT& > #endif -struct peoEvalFunc: public eoEvalFunc { - - peoEvalFunc( FitT (* _eval)( FunctionArg ) ) - : eoEvalFunc(), evalFunc( _eval ) {}; - - virtual void operator() ( EOT & _peo ) +struct peoEvalFunc: public eoEvalFunc { - _peo.fitness((*evalFunc)( _peo )); - }; - - private: + + peoEvalFunc( FitT (* _eval)( FunctionArg ) ) + : eoEvalFunc(), evalFunc( _eval ) + {}; + + virtual void operator() ( EOT & _peo ) + { + _peo.fitness((*evalFunc)( _peo )); + }; + +private: FitT (* evalFunc )( FunctionArg ); -}; + }; #endif diff --git a/trunk/paradiseo-peo/src/peoEvalFuncPSO.h b/trunk/paradiseo-peo/src/peoEvalFuncPSO.h index c7d17e30c..f311e0f0e 100644 --- a/trunk/paradiseo-peo/src/peoEvalFuncPSO.h +++ b/trunk/paradiseo-peo/src/peoEvalFuncPSO.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -42,27 +42,29 @@ //! peoEvalFuncPSO: This class //! takes an existing function pointer and converts it into a evaluation -//! function class. +//! function class. #ifdef _MSC_VER template< class POT, class FitT = POT::Fitness, class FunctionArg = const POT& > #else template< class POT, class FitT = typename POT::Fitness, class FunctionArg = const POT& > #endif -struct peoEvalFuncPSO: public eoEvalFunc { - - peoEvalFuncPSO( FitT (* _eval)( FunctionArg ) ) - : eoEvalFunc(), evalFunc( _eval ) {}; - - //!Applies the evaluation function to a PEO - virtual void operator() ( POT & _peo ) +struct peoEvalFuncPSO: public eoEvalFunc { + + peoEvalFuncPSO( FitT (* _eval)( FunctionArg ) ) + : eoEvalFunc(), evalFunc( _eval ) + {}; + + //!Applies the evaluation function to a PEO + virtual void operator() ( POT & _peo ) + { _peo.fitness((*evalFunc)( _peo )); - }; - - private: + }; + +private: FitT (* evalFunc )( FunctionArg ); -}; + }; #endif diff --git a/trunk/paradiseo-peo/src/peoInitializer.h b/trunk/paradiseo-peo/src/peoInitializer.h index 2f0ea133e..a62e2eba7 100644 --- a/trunk/paradiseo-peo/src/peoInitializer.h +++ b/trunk/paradiseo-peo/src/peoInitializer.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -44,55 +44,55 @@ */ template class peoInitializer : public eoInitializerBase -{ - public: - + { + public: - //! Constructor - //! @param _proc Evaluation function - //! @param _initVelo Initialization of the velocity - //! @param _initBest Initialization of the best - //! @param _pop Population - peoInitializer( - peoPopEval< POT >& _proc, - eoVelocityInit < POT > &_initVelo, - eoParticleBestInit &_initBest, - eoPop < POT > &_pop - ) : proc(_proc), initVelo(_initVelo), initBest(_initBest) - { - pop = &_pop; - } - - //! Give the name of the class - //! @return The name of the class - virtual std::string className (void) const + + //! Constructor + //! @param _proc Evaluation function + //! @param _initVelo Initialization of the velocity + //! @param _initBest Initialization of the best + //! @param _pop Population + peoInitializer( + peoPopEval< POT >& _proc, + eoVelocityInit < POT > &_initVelo, + eoParticleBestInit &_initBest, + eoPop < POT > &_pop + ) : proc(_proc), initVelo(_initVelo), initBest(_initBest) { - return "peoInitializer"; + pop = &_pop; } - + + //! Give the name of the class + //! @return The name of the class + virtual std::string className (void) const + { + return "peoInitializer"; + } + //! void operator () - //! Parallel initialization of the population - virtual void operator()() - { - proc(*pop); - apply < POT > (initVelo, *pop); - apply < POT > (initBest, *pop); - } - - private : - - /* - @param proc First evaluation - @param initVelo Initialization of the velocity - @param initBest Initialization of the best - @param pop Population - */ - peoPopEval< POT >& proc; - eoVelocityInit < POT > & initVelo; - eoParticleBestInit & initBest; - eoPop * pop; -}; + //! Parallel initialization of the population + virtual void operator()() + { + proc(*pop); + apply < POT > (initVelo, *pop); + apply < POT > (initBest, *pop); + } + + private : + + /* + @param proc First evaluation + @param initVelo Initialization of the velocity + @param initBest Initialization of the best + @param pop Population + */ + peoPopEval< POT >& proc; + eoVelocityInit < POT > & initVelo; + eoParticleBestInit & initBest; + eoPop * pop; + }; #endif - - + + diff --git a/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h b/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h index 28d49db5f..d6fa02152 100644 --- a/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h +++ b/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,18 +44,20 @@ //! The peoNoAggEvalFunc class does nothing more than an association between a fitness value and a specified individual. //! The class is provided as a mean of declaring that no aggregation is required for the evaluation function - the fitness //! value is explicitly specified. -template< class EOT > class peoNoAggEvalFunc : public peoAggEvalFunc< EOT > { +template< class EOT > class peoNoAggEvalFunc : public peoAggEvalFunc< EOT > + { -public : + public : - //! Operator which sets as fitness the __fit value for the __sol individual - void operator()( EOT& __sol, const typename EOT :: Fitness& __fit ); -}; + //! Operator which sets as fitness the __fit value for the __sol individual + void operator()( EOT& __sol, const typename EOT :: Fitness& __fit ); + }; -template< class EOT > void peoNoAggEvalFunc< EOT > :: operator()( EOT& __sol, const typename EOT :: Fitness& __fit ) { +template< class EOT > void peoNoAggEvalFunc< EOT > :: operator()( EOT& __sol, const typename EOT :: Fitness& __fit ) +{ - __sol.fitness( __fit ); + __sol.fitness( __fit ); } diff --git a/trunk/paradiseo-peo/src/peoPSO.h b/trunk/paradiseo-peo/src/peoPSO.h index e18250ffc..192bbbfc7 100644 --- a/trunk/paradiseo-peo/src/peoPSO.h +++ b/trunk/paradiseo-peo/src/peoPSO.h @@ -3,7 +3,7 @@ * (c) OPAC Team, October 2007 * * Clive Canape -* +* * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL @@ -29,96 +29,101 @@ * 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 +* Contact: paradiseo-help@lists.gforge.inria.fr * Contact: clive.canape@inria.fr */ #ifndef __peoPSO_h #define __peoPSO_h -#include -#include +#include +#include #include #include #include #include #include "peoPopEval.h" -#include "core/runner.h" -#include "core/peo_debug.h" +#include "core/runner.h" +#include "core/peo_debug.h" //! Class providing an elementary ParadisEO evolutionary algorithm. //! The peoPSO class offers an elementary Particle Swarm Optimization implementation. In addition, as compared //! with the algorithms provided by the EO framework, the peoPSO class has the underlying necessary structure -//! for including, for example, parallel evaluation, etc. +//! for including, for example, parallel evaluation, etc. -template < class POT > class peoPSO : public Runner { +template < class POT > class peoPSO : public Runner + { -public: + public: - //! Constructor for the Particle Swarm Optimization - //! @param eoContinue< POT >& __cont - continuation criterion specifying whether the algorithm should continue or not; - //! @param peoPopEval< POT >& __pop_eval - evaluation operator; it allows the specification of parallel evaluation operators, aggregate evaluation functions, etc.; - //! @param eoVelocity< POT >& __velocity - velocity operator; - //! @param eoFlight< POT >& __flight - flight operator; - peoPSO( - eoInitializerBase & _Init, - eoContinue< POT >& __cont, - peoPopEval< POT >& __pop_eval, - eoVelocity < POT > &_velocity, - eoFlight < POT > &_flight); + //! Constructor for the Particle Swarm Optimization + //! @param eoContinue< POT >& __cont - continuation criterion specifying whether the algorithm should continue or not; + //! @param peoPopEval< POT >& __pop_eval - evaluation operator; it allows the specification of parallel evaluation operators, aggregate evaluation functions, etc.; + //! @param eoVelocity< POT >& __velocity - velocity operator; + //! @param eoFlight< POT >& __flight - flight operator; + peoPSO( + eoInitializerBase & _Init, + eoContinue< POT >& __cont, + peoPopEval< POT >& __pop_eval, + eoVelocity < POT > &_velocity, + eoFlight < POT > &_flight); - //! Particle Swarm Optimization function - a side effect of the fact that the class is derived from the Runner class - //! thus requiring the existence of a run function, the algorithm being executed on a distinct thread. - void run(); - - //! Function operator for specifying the population to be associated with the algorithm. - void operator()( eoPop< POT >& __pop ); + //! Particle Swarm Optimization function - a side effect of the fact that the class is derived from the Runner class + //! thus requiring the existence of a run function, the algorithm being executed on a distinct thread. + void run(); -private: + //! Function operator for specifying the population to be associated with the algorithm. + void operator()( eoPop< POT >& __pop ); - eoInitializerBase & Init; - eoContinue< POT >& cont; - peoPopEval< POT >& pop_eval; - eoPop< POT >* pop; - eoVelocity < POT > &velocity; - eoFlight < POT > &flight; -}; + private: + + eoInitializerBase & Init; + eoContinue< POT >& cont; + peoPopEval< POT >& pop_eval; + eoPop< POT >* pop; + eoVelocity < POT > &velocity; + eoFlight < POT > &flight; + }; -template < class POT > peoPSO< POT > :: peoPSO( - eoInitializerBase & _Init, - eoContinue< POT >& __cont, - peoPopEval< POT >& __pop_eval, - eoVelocity < POT > &__velocity, - eoFlight < POT > &__flight - ) : Init(_Init),cont( __cont ), pop_eval(__pop_eval ),velocity( __velocity),flight( __flight) +template < class POT > peoPSO< POT > :: peoPSO( + eoInitializerBase & _Init, + eoContinue< POT >& __cont, + peoPopEval< POT >& __pop_eval, + eoVelocity < POT > &__velocity, + eoFlight < POT > &__flight +) : Init(_Init),cont( __cont ), pop_eval(__pop_eval ),velocity( __velocity),flight( __flight) { - pop_eval.setOwner( *this ); + pop_eval.setOwner( *this ); } -template< class POT > void peoPSO< POT > :: operator ()( eoPop< POT >& __pop ) { +template< class POT > void peoPSO< POT > :: operator ()( eoPop< POT >& __pop ) +{ - pop = &__pop; + pop = &__pop; } -template< class POT > void peoPSO< POT > :: run() { +template< class POT > void peoPSO< POT > :: run() +{ - printDebugMessage( "Performing the first evaluation of the population." ); - Init(); - velocity.getTopology().setup(*pop); - do { - printDebugMessage( "Performing the velocity evaluation." ); - velocity.apply ( *pop ); - printDebugMessage( "Performing the flight." ); - flight.apply ( *pop ); - printDebugMessage( "Performing the evaluation." ); - pop_eval(*pop); - velocity.updateNeighborhood( *pop ); - } while ( cont( *pop ) ); + printDebugMessage( "Performing the first evaluation of the population." ); + Init(); + velocity.getTopology().setup(*pop); + do + { + printDebugMessage( "Performing the velocity evaluation." ); + velocity.apply ( *pop ); + printDebugMessage( "Performing the flight." ); + flight.apply ( *pop ); + printDebugMessage( "Performing the evaluation." ); + pop_eval(*pop); + velocity.updateNeighborhood( *pop ); + } + while ( cont( *pop ) ); } diff --git a/trunk/paradiseo-peo/src/peoPSOReplacement.h b/trunk/paradiseo-peo/src/peoPSOReplacement.h index 94ef1dafe..ef6261cf3 100644 --- a/trunk/paradiseo-peo/src/peoPSOReplacement.h +++ b/trunk/paradiseo-peo/src/peoPSOReplacement.h @@ -3,7 +3,7 @@ * (c) OPAC Team, October 2007 * * Clive Canape -* +* * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL @@ -29,7 +29,7 @@ * 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 +* Contact: paradiseo-help@lists.gforge.inria.fr * Contact: clive.canape@inria.fr */ @@ -47,27 +47,28 @@ template class peoPSOReplacement : public eoReplacement -{ - public: - peoPSOReplacement(){} + { + public: + peoPSOReplacement() + {} - void operator()(eoPop& _dest, eoPop& _source) + void operator()(eoPop& _dest, eoPop& _source) + { + unsigned ind=0; + double best=_dest[0].best(); + for (unsigned j=1;j<_dest.size();j++) + if (_dest[j].best() < best) + { + ind=j; + best=_dest[j].best(); + } + if (_dest[ind].best() < _source[0].best()) { - unsigned ind=0; - double best=_dest[0].best(); - for(unsigned j=1;j<_dest.size();j++) - if(_dest[j].best() < best) - { - ind=j; - best=_dest[j].best(); - } - if(_dest[ind].best() < _source[0].best()) - { - _dest[ind].best(_source[0].best()); - for(unsigned j=0;j<_dest[ind].size();j++) - _dest[ind].bestPositions[j]=_source[0].bestPositions[j]; - } + _dest[ind].best(_source[0].best()); + for (unsigned j=0;j<_dest[ind].size();j++) + _dest[ind].bestPositions[j]=_source[0].bestPositions[j]; } -}; + } + }; #endif diff --git a/trunk/paradiseo-peo/src/peoPSOSelect.h b/trunk/paradiseo-peo/src/peoPSOSelect.h index 160d3d786..50f3f2862 100644 --- a/trunk/paradiseo-peo/src/peoPSOSelect.h +++ b/trunk/paradiseo-peo/src/peoPSOSelect.h @@ -3,7 +3,7 @@ * (c) OPAC Team, October 2007 * * Clive Canape -* +* * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL @@ -29,7 +29,7 @@ * 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 +* Contact: paradiseo-help@lists.gforge.inria.fr * Contact: clive.canape@inria.fr */ @@ -40,21 +40,22 @@ #include template class peoPSOSelect: public eoSelectOne -{ - public: - - peoPSOSelect(eoTopology < POT > & _topology):topology(_topology){} - - typedef typename PO < POT >::Fitness Fitness; - - virtual const POT& operator()(const eoPop& _pop) { - return topology.globalBest(_pop); - } - + public: + + peoPSOSelect(eoTopology < POT > & _topology):topology(_topology) + {} + + typedef typename PO < POT >::Fitness Fitness; + + virtual const POT& operator()(const eoPop& _pop) + { + return topology.globalBest(_pop); + } + private: - eoTopology < POT > & topology; -}; + eoTopology < POT > & topology; + }; #endif diff --git a/trunk/paradiseo-peo/src/peoPSOVelocity.h b/trunk/paradiseo-peo/src/peoPSOVelocity.h index 235b2e393..997a92dd7 100644 --- a/trunk/paradiseo-peo/src/peoPSOVelocity.h +++ b/trunk/paradiseo-peo/src/peoPSOVelocity.h @@ -3,7 +3,7 @@ * (c) OPAC Team, October 2007 * * Clive Canape -* +* * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL @@ -29,7 +29,7 @@ * 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 +* Contact: paradiseo-help@lists.gforge.inria.fr * Contact: clive.canape@inria.fr */ @@ -48,33 +48,34 @@ template class peoPSOVelocity : public eoReplacement -{ - public: - - typedef typename POT::ParticleVelocityType VelocityType; - - peoPSOVelocity( const double & _c3, - eoVelocity < POT > &_velocity): - c3 (_c3), - velocity (_velocity){} + { + public: - void operator()(eoPop& _dest, eoPop& _source) - { - - VelocityType newVelocity,r3; - r3 = (VelocityType) rng.uniform (1) * c3; - for(unsigned i=0;i<_dest.size();i++) - for(unsigned j=0;j<_dest[i].size();j++) - { - newVelocity= _dest[i].velocities[j] + r3 * (_source[0].bestPositions[j] - _dest[i][j]); - _dest[i].velocities[j]=newVelocity; - } - - } - - protected: - const double & c3; - eoVelocity < POT > & velocity; -}; + typedef typename POT::ParticleVelocityType VelocityType; + + peoPSOVelocity( const double & _c3, + eoVelocity < POT > &_velocity): + c3 (_c3), + velocity (_velocity) + {} + + void operator()(eoPop& _dest, eoPop& _source) + { + + VelocityType newVelocity,r3; + r3 = (VelocityType) rng.uniform (1) * c3; + for (unsigned i=0;i<_dest.size();i++) + for (unsigned j=0;j<_dest[i].size();j++) + { + newVelocity= _dest[i].velocities[j] + r3 * (_source[0].bestPositions[j] - _dest[i][j]); + _dest[i].velocities[j]=newVelocity; + } + + } + + protected: + const double & c3; + eoVelocity < POT > & velocity; + }; #endif diff --git a/trunk/paradiseo-peo/src/peoParaPopEval.h b/trunk/paradiseo-peo/src/peoParaPopEval.h index dade642c7..28eac56cf 100644 --- a/trunk/paradiseo-peo/src/peoParaPopEval.h +++ b/trunk/paradiseo-peo/src/peoParaPopEval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -51,190 +51,200 @@ //! The peoParaPopEval represents a wrapper for creating a functor capable of applying in parallel //! an EO-derived evaluation functor. The class offers the possibility of chosing between a single-function evaluation //! and an aggregate evaluation function, including several sub-evalution functions. -template< class EOT > class peoParaPopEval : public peoPopEval< EOT > { +template< class EOT > class peoParaPopEval : public peoPopEval< EOT > + { -public: + public: - using peoPopEval< EOT > :: requestResourceRequest; - using peoPopEval< EOT > :: resume; - using peoPopEval< EOT > :: stop; - using peoPopEval< EOT > :: getOwner; - - //! Constructor function - an EO-derived evaluation functor has to be specified; an internal reference - //! is set towards the specified evaluation functor. - //! - //! @param eoEvalFunc< EOT >& __eval_func - EO-derived evaluation functor to be applied in parallel on each individual of a specified population - peoParaPopEval( eoEvalFunc< EOT >& __eval_func ); + using peoPopEval< EOT > :: requestResourceRequest; + using peoPopEval< EOT > :: resume; + using peoPopEval< EOT > :: stop; + using peoPopEval< EOT > :: getOwner; - //! Constructor function - a vector of EO-derived evaluation functors has to be specified as well as an aggregation function. - //! - //! @param const std :: vector< eoEvalFunc < EOT >* >& __funcs - vector of EO-derived partial evaluation functors; - //! @param peoAggEvalFunc< EOT >& __merge_eval - aggregation functor for creating a fitness value out of the partial fitness values. - peoParaPopEval( const std :: vector< eoEvalFunc < EOT >* >& __funcs, peoAggEvalFunc< EOT >& __merge_eval ); + //! Constructor function - an EO-derived evaluation functor has to be specified; an internal reference + //! is set towards the specified evaluation functor. + //! + //! @param eoEvalFunc< EOT >& __eval_func - EO-derived evaluation functor to be applied in parallel on each individual of a specified population + peoParaPopEval( eoEvalFunc< EOT >& __eval_func ); - //! Operator for applying the evaluation functor (direct or aggregate) for each individual of the specified population. - //! - //! @param eoPop< EOT >& __pop - population to be evaluated by applying the evaluation functor specified in the constructor. - void operator()( eoPop< EOT >& __pop ); + //! Constructor function - a vector of EO-derived evaluation functors has to be specified as well as an aggregation function. + //! + //! @param const std :: vector< eoEvalFunc < EOT >* >& __funcs - vector of EO-derived partial evaluation functors; + //! @param peoAggEvalFunc< EOT >& __merge_eval - aggregation functor for creating a fitness value out of the partial fitness values. + peoParaPopEval( const std :: vector< eoEvalFunc < EOT >* >& __funcs, peoAggEvalFunc< EOT >& __merge_eval ); - //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that - //! performs the actual evaluation phase. There is no need to explicitly call the function. - void packData(); - - //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that - //! performs the actual evaluation phase. There is no need to explicitly call the function. - void unpackData(); + //! Operator for applying the evaluation functor (direct or aggregate) for each individual of the specified population. + //! + //! @param eoPop< EOT >& __pop - population to be evaluated by applying the evaluation functor specified in the constructor. + void operator()( eoPop< EOT >& __pop ); - //! Auxiliary function - it calls the specified evaluation functor(s). There is no need to explicitly call the function. - void execute(); - - //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that - //! performs the actual evaluation phase. There is no need to explicitly call the function. - void packResult(); - - //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that - //! performs the actual evaluation phase. There is no need to explicitly call the function. - void unpackResult(); - - //! Auxiliary function for notifications between the process requesting an evaluation operation and the processes that - //! performs the actual evaluation phase. There is no need to explicitly call the function. - void notifySendingData(); + //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that + //! performs the actual evaluation phase. There is no need to explicitly call the function. + void packData(); - //! Auxiliary function for notifications between the process requesting an evaluation operation and the processes that - //! performs the actual evaluation phase. There is no need to explicitly call the function. - void notifySendingAllResourceRequests(); + //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that + //! performs the actual evaluation phase. There is no need to explicitly call the function. + void unpackData(); -private: + //! Auxiliary function - it calls the specified evaluation functor(s). There is no need to explicitly call the function. + void execute(); + + //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that + //! performs the actual evaluation phase. There is no need to explicitly call the function. + void packResult(); + + //! Auxiliary function for transferring data between the process requesting an evaluation operation and the process that + //! performs the actual evaluation phase. There is no need to explicitly call the function. + void unpackResult(); + + //! Auxiliary function for notifications between the process requesting an evaluation operation and the processes that + //! performs the actual evaluation phase. There is no need to explicitly call the function. + void notifySendingData(); + + //! Auxiliary function for notifications between the process requesting an evaluation operation and the processes that + //! performs the actual evaluation phase. There is no need to explicitly call the function. + void notifySendingAllResourceRequests(); + + private: - const std :: vector< eoEvalFunc < EOT >* >& funcs; - std :: vector< eoEvalFunc < EOT >* > one_func; - - peoAggEvalFunc< EOT >& merge_eval; - peoNoAggEvalFunc< EOT > no_merge_eval; - - std :: queue< EOT* >tasks; - - std :: map< EOT*, std :: pair< unsigned, unsigned > > progression; - - unsigned num_func; - - EOT sol; - - EOT *ad_sol; - - unsigned total; -}; + const std :: vector< eoEvalFunc < EOT >* >& funcs; + std :: vector< eoEvalFunc < EOT >* > one_func; + + peoAggEvalFunc< EOT >& merge_eval; + peoNoAggEvalFunc< EOT > no_merge_eval; + + std :: queue< EOT* >tasks; + + std :: map< EOT*, std :: pair< unsigned, unsigned > > progression; + + unsigned num_func; + + EOT sol; + + EOT *ad_sol; + + unsigned total; + }; -template< class EOT > peoParaPopEval< EOT > :: peoParaPopEval( eoEvalFunc< EOT >& __eval_func ) : +template< class EOT > peoParaPopEval< EOT > :: peoParaPopEval( eoEvalFunc< EOT >& __eval_func ) : - funcs( one_func ), merge_eval( no_merge_eval ) + funcs( one_func ), merge_eval( no_merge_eval ) { - one_func.push_back( &__eval_func ); + one_func.push_back( &__eval_func ); } -template< class EOT > peoParaPopEval< EOT > :: peoParaPopEval( +template< class EOT > peoParaPopEval< EOT > :: peoParaPopEval( - const std :: vector< eoEvalFunc< EOT >* >& __funcs, - peoAggEvalFunc< EOT >& __merge_eval + const std :: vector< eoEvalFunc< EOT >* >& __funcs, + peoAggEvalFunc< EOT >& __merge_eval - ) : funcs( __funcs ), merge_eval( __merge_eval ) +) : funcs( __funcs ), merge_eval( __merge_eval ) +{} + + +template< class EOT > void peoParaPopEval< EOT >::operator()( eoPop< EOT >& __pop ) { - + for ( unsigned i = 0; i < __pop.size(); i++ ) + { + __pop[ i ].fitness(typename EOT :: Fitness() ); + progression[ &__pop[ i ] ].first = funcs.size() - 1; + progression[ &__pop[ i ] ].second = funcs.size(); + for ( unsigned j = 0; j < funcs.size(); j++ ) + { + /* Queuing the 'invalid' solution and its associated owner */ + tasks.push( &__pop[ i ] ); + } + } + total = funcs.size() * __pop.size(); + requestResourceRequest( funcs.size() * __pop.size() ); + stop(); } -template< class EOT > void peoParaPopEval< EOT >::operator()( eoPop< EOT >& __pop ) { - for ( unsigned i = 0; i < __pop.size(); i++ ) { - __pop[ i ].fitness(typename EOT :: Fitness() ); - progression[ &__pop[ i ] ].first = funcs.size() - 1; - progression[ &__pop[ i ] ].second = funcs.size(); - for ( unsigned j = 0; j < funcs.size(); j++ ) { - /* Queuing the 'invalid' solution and its associated owner */ - tasks.push( &__pop[ i ] ); - } - } - total = funcs.size() * __pop.size(); - requestResourceRequest( funcs.size() * __pop.size() ); - stop(); +template< class EOT > void peoParaPopEval< EOT > :: packData() +{ + // printDebugMessage ("debut pakc data"); + pack( progression[ tasks.front() ].first-- ); + + /* Packing the contents :-) of the solution */ + pack( *tasks.front() ); + + /* Packing the addresses of both the solution and the owner */ + pack( tasks.front() ); + tasks.pop( ); } -template< class EOT > void peoParaPopEval< EOT > :: packData() { - // printDebugMessage ("debut pakc data"); - pack( progression[ tasks.front() ].first-- ); - - /* Packing the contents :-) of the solution */ - pack( *tasks.front() ); - - /* Packing the addresses of both the solution and the owner */ - pack( tasks.front() ); - tasks.pop( ); +template< class EOT > void peoParaPopEval< EOT > :: unpackData() +{ + unpack( num_func ); + /* Unpacking the solution */ + unpack( sol ); + /* Unpacking the @ of that one */ + unpack( ad_sol ); } -template< class EOT > void peoParaPopEval< EOT > :: unpackData() { - unpack( num_func ); - /* Unpacking the solution */ - unpack( sol ); - /* Unpacking the @ of that one */ - unpack( ad_sol ); -} - - -template< class EOT > void peoParaPopEval< EOT > :: execute() { - /* Computing the fitness of the solution */ +template< class EOT > void peoParaPopEval< EOT > :: execute() +{ + /* Computing the fitness of the solution */ funcs[ num_func ]->operator()( sol ); } -template< class EOT > void peoParaPopEval< EOT > :: packResult() { +template< class EOT > void peoParaPopEval< EOT > :: packResult() +{ /* Packing the fitness of the solution */ - pack( sol.fitness() ); - /* Packing the @ of the individual */ - pack( ad_sol ); + pack( sol.fitness() ); + /* Packing the @ of the individual */ + pack( ad_sol ); } -template< class EOT > void peoParaPopEval< EOT > :: unpackResult() { - typename EOT :: Fitness fit; - - /* Unpacking the computed fitness */ - unpack( fit ); - - /* Unpacking the @ of the associated individual */ - unpack( ad_sol ); - - - /* Associating the fitness the local solution */ - merge_eval( *ad_sol, fit ); +template< class EOT > void peoParaPopEval< EOT > :: unpackResult() +{ + typename EOT :: Fitness fit; - progression[ ad_sol ].second--; + /* Unpacking the computed fitness */ + unpack( fit ); - /* Notifying the container of the termination of the evaluation */ - if ( !progression[ ad_sol ].second ) { + /* Unpacking the @ of the associated individual */ + unpack( ad_sol ); - progression.erase( ad_sol ); - } - - total--; - if ( !total ) { - getOwner()->setActive(); - resume(); - } + /* Associating the fitness the local solution */ + merge_eval( *ad_sol, fit ); + + progression[ ad_sol ].second--; + + /* Notifying the container of the termination of the evaluation */ + if ( !progression[ ad_sol ].second ) + { + + progression.erase( ad_sol ); + } + + total--; + if ( !total ) + { + + getOwner()->setActive(); + resume(); + } } -template< class EOT > void peoParaPopEval< EOT > :: notifySendingData() { -} +template< class EOT > void peoParaPopEval< EOT > :: notifySendingData() +{} -template< class EOT > void peoParaPopEval< EOT > :: notifySendingAllResourceRequests() { - getOwner()->setPassive(); +template< class EOT > void peoParaPopEval< EOT > :: notifySendingAllResourceRequests() +{ + getOwner()->setPassive(); } diff --git a/trunk/paradiseo-peo/src/peoParaSGATransform.h b/trunk/paradiseo-peo/src/peoParaSGATransform.h index 81f3a724a..36a6d3c21 100644 --- a/trunk/paradiseo-peo/src/peoParaSGATransform.h +++ b/trunk/paradiseo-peo/src/peoParaSGATransform.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -46,39 +46,40 @@ extern int getNodeRank(); -template< class EOT > class peoParaSGATransform : public peoTransform< EOT > { +template< class EOT > class peoParaSGATransform : public peoTransform< EOT > + { -public: + public: - using peoTransform< EOT > :: requestResourceRequest; - using peoTransform< EOT > :: resume; - using peoTransform< EOT > :: stop; - using peoTransform< EOT > :: getOwner; + using peoTransform< EOT > :: requestResourceRequest; + using peoTransform< EOT > :: resume; + using peoTransform< EOT > :: stop; + using peoTransform< EOT > :: getOwner; - peoParaSGATransform( + peoParaSGATransform( - eoQuadOp< EOT >& __cross, - double __cross_rate, - eoMonOp< EOT >& __mut, - double __mut_rate - ); + eoQuadOp< EOT >& __cross, + double __cross_rate, + eoMonOp< EOT >& __mut, + double __mut_rate + ); - void operator()( eoPop< EOT >& __pop ); - - void packData(); - - void unpackData(); - - void execute(); - - void packResult(); - - void unpackResult(); - - void notifySendingData(); - void notifySendingAllResourceRequests(); + void operator()( eoPop< EOT >& __pop ); -private: + void packData(); + + void unpackData(); + + void execute(); + + void packResult(); + + void unpackResult(); + + void notifySendingData(); + void notifySendingAllResourceRequests(); + + private: eoQuadOp< EOT >& cross; double cross_rate; @@ -93,90 +94,95 @@ private: EOT father, mother; unsigned num_term; -}; + }; -template< class EOT > peoParaSGATransform< EOT > :: peoParaSGATransform( +template< class EOT > peoParaSGATransform< EOT > :: peoParaSGATransform( - eoQuadOp< EOT >& __cross, - double __cross_rate, - eoMonOp < EOT >& __mut, - double __mut_rate + eoQuadOp< EOT >& __cross, + double __cross_rate, + eoMonOp < EOT >& __mut, + double __mut_rate - ) : cross( __cross ), cross_rate( __cross_rate ), mut( __mut ), mut_rate( __mut_rate ) +) : cross( __cross ), cross_rate( __cross_rate ), mut( __mut ), mut_rate( __mut_rate ) +{} + + +template< class EOT > void peoParaSGATransform< EOT > :: packData() { + pack( idx ); + :: pack( pop->operator[]( idx++ ) ); + :: pack( pop->operator[]( idx++ ) ); } -template< class EOT > void peoParaSGATransform< EOT > :: packData() { +template< class EOT > void peoParaSGATransform< EOT > :: unpackData() +{ - pack( idx ); - :: pack( pop->operator[]( idx++ ) ); - :: pack( pop->operator[]( idx++ ) ); + unpack( idx ); + :: unpack( father ); + :: unpack( mother ); } -template< class EOT > void peoParaSGATransform< EOT > :: unpackData() { +template< class EOT > void peoParaSGATransform< EOT > :: execute() +{ - unpack( idx ); - :: unpack( father ); - :: unpack( mother ); + if ( rng.uniform() < cross_rate ) cross( mother, father ); + + if ( rng.uniform() < mut_rate ) mut( mother ); + if ( rng.uniform() < mut_rate ) mut( father ); } -template< class EOT > void peoParaSGATransform< EOT > :: execute() { +template< class EOT > void peoParaSGATransform< EOT > :: packResult() +{ - if( rng.uniform() < cross_rate ) cross( mother, father ); - - if( rng.uniform() < mut_rate ) mut( mother ); - if( rng.uniform() < mut_rate ) mut( father ); + pack( idx ); + :: pack( father ); + :: pack( mother ); } -template< class EOT > void peoParaSGATransform< EOT > :: packResult() { +template< class EOT > void peoParaSGATransform< EOT > :: unpackResult() +{ - pack( idx ); - :: pack( father ); - :: pack( mother ); + unsigned sidx; + + unpack( sidx ); + :: unpack( pop->operator[]( sidx++ ) ); + :: unpack( pop->operator[]( sidx ) ); + num_term += 2; + // Can be used with a odd size + if ( num_term == 2*(pop->size()/2) ) + { + + getOwner()->setActive(); + resume(); + } } -template< class EOT > void peoParaSGATransform< EOT > :: unpackResult() { +template< class EOT > void peoParaSGATransform< EOT > :: operator()( eoPop < EOT >& __pop ) +{ - unsigned sidx; - - unpack( sidx ); - :: unpack( pop->operator[]( sidx++ ) ); - :: unpack( pop->operator[]( sidx ) ); - num_term += 2; - // Can be used with a odd size - if( num_term == 2*(pop->size()/2) ) { - - getOwner()->setActive(); - resume(); - } + printDebugMessage( "performing the parallel transformation step." ); + pop = &__pop; + idx = 0; + num_term = 0; + requestResourceRequest( __pop.size() / 2 ); + stop(); } -template< class EOT > void peoParaSGATransform< EOT > :: operator()( eoPop < EOT >& __pop ) { - - printDebugMessage( "performing the parallel transformation step." ); - pop = &__pop; - idx = 0; - num_term = 0; - requestResourceRequest( __pop.size() / 2 ); - stop(); -} +template< class EOT > void peoParaSGATransform< EOT > :: notifySendingData() +{} -template< class EOT > void peoParaSGATransform< EOT > :: notifySendingData() { +template< class EOT > void peoParaSGATransform< EOT > :: notifySendingAllResourceRequests() +{ -} - - -template< class EOT > void peoParaSGATransform< EOT > :: notifySendingAllResourceRequests() { - - getOwner()->setPassive(); + getOwner()->setPassive(); } diff --git a/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h b/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h index 64ebb6d05..c7b430e6a 100644 --- a/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h +++ b/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,70 +44,82 @@ -class peoParallelAlgorithmWrapper : public Runner { +class peoParallelAlgorithmWrapper : public Runner + { -public: + public: - template< typename AlgorithmType > peoParallelAlgorithmWrapper( AlgorithmType& externalAlgorithm ) - : algorithm( new Algorithm< AlgorithmType, void >( externalAlgorithm ) ) { + template< typename AlgorithmType > peoParallelAlgorithmWrapper( AlgorithmType& externalAlgorithm ) + : algorithm( new Algorithm< AlgorithmType, void >( externalAlgorithm ) ) + {} - } + template< typename AlgorithmType, typename AlgorithmDataType > peoParallelAlgorithmWrapper( AlgorithmType& externalAlgorithm, AlgorithmDataType& externalData ) + : algorithm( new Algorithm< AlgorithmType, AlgorithmDataType >( externalAlgorithm, externalData ) ) + {} - template< typename AlgorithmType, typename AlgorithmDataType > peoParallelAlgorithmWrapper( AlgorithmType& externalAlgorithm, AlgorithmDataType& externalData ) - : algorithm( new Algorithm< AlgorithmType, AlgorithmDataType >( externalAlgorithm, externalData ) ) { + ~peoParallelAlgorithmWrapper() + { - } + delete algorithm; + } - ~peoParallelAlgorithmWrapper() { - - delete algorithm; - } - - void run() { algorithm->operator()(); } + void run() + { + algorithm->operator()(); + } -private: + private: - struct AbstractAlgorithm { + struct AbstractAlgorithm + { - // virtual destructor as we will be using inheritance and polymorphism - virtual ~AbstractAlgorithm() { } + // virtual destructor as we will be using inheritance and polymorphism + virtual ~AbstractAlgorithm() + { } - // operator to be called for executing the algorithm - virtual void operator()() { } - }; + // operator to be called for executing the algorithm + virtual void operator()() + { } + }; - template< typename AlgorithmType, typename AlgorithmDataType > struct Algorithm : public AbstractAlgorithm { + template< typename AlgorithmType, typename AlgorithmDataType > struct Algorithm : public AbstractAlgorithm + { - Algorithm( AlgorithmType& externalAlgorithm, AlgorithmDataType& externalData ) - : algorithm( externalAlgorithm ), algorithmData( externalData ) { + Algorithm( AlgorithmType& externalAlgorithm, AlgorithmDataType& externalData ) + : algorithm( externalAlgorithm ), algorithmData( externalData ) + {} - } + virtual void operator()() + { + algorithm( algorithmData ); + } - virtual void operator()() { algorithm( algorithmData ); } - - AlgorithmType& algorithm; - AlgorithmDataType& algorithmData; - }; + AlgorithmType& algorithm; + AlgorithmDataType& algorithmData; + }; - template< typename AlgorithmType > struct Algorithm< AlgorithmType, void > : public AbstractAlgorithm { + template< typename AlgorithmType > struct Algorithm< AlgorithmType, void > : public AbstractAlgorithm + { - Algorithm( AlgorithmType& externalAlgorithm ) : algorithm( externalAlgorithm ) { + Algorithm( AlgorithmType& externalAlgorithm ) : algorithm( externalAlgorithm ) + {} - } + virtual void operator()() + { + algorithm(); + } - virtual void operator()() { algorithm(); } - - AlgorithmType& algorithm; - }; + AlgorithmType& algorithm; + }; -private: + private: - AbstractAlgorithm* algorithm; -}; + AbstractAlgorithm* algorithm; + }; #endif diff --git a/trunk/paradiseo-peo/src/peoPopEval.h b/trunk/paradiseo-peo/src/peoPopEval.h index 316b8e122..ed3f7087a 100644 --- a/trunk/paradiseo-peo/src/peoPopEval.h +++ b/trunk/paradiseo-peo/src/peoPopEval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,13 +44,14 @@ //! The peoPopEval class provides the interface for constructing ParadisEO specific evaluation functors. //! The derived classes may be used as wrappers for EO-derived evaluation functors. In order to have an example, //! please refer to the implementation of the peoSeqPopEval and peoParaPopEval classes. -template< class EOT > class peoPopEval : public Service { +template< class EOT > class peoPopEval : public Service + { -public: + public: - //! Interface function providing the signature for constructing an evaluation functor. - virtual void operator()( eoPop< EOT >& __pop ) = 0; -}; + //! Interface function providing the signature for constructing an evaluation functor. + virtual void operator()( eoPop< EOT >& __pop ) = 0; + }; #endif diff --git a/trunk/paradiseo-peo/src/peoSeqPopEval.h b/trunk/paradiseo-peo/src/peoSeqPopEval.h index 2c118a945..ecc2157df 100644 --- a/trunk/paradiseo-peo/src/peoSeqPopEval.h +++ b/trunk/paradiseo-peo/src/peoSeqPopEval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -46,35 +46,36 @@ //! The peoSeqPopEval class acts only as a ParadisEO specific sequential evaluation functor - a wrapper for incorporating //! an eoEvalFunc< EOT >-derived class as evaluation functor. The specified EO evaluation object is applyied in an //! iterative manner to each individual of a specified population. -template< class EOT > class peoSeqPopEval : public peoPopEval< EOT > { +template< class EOT > class peoSeqPopEval : public peoPopEval< EOT > + { -public: + public: - //! Constructor function - it only sets an internal reference to point to the specified evaluation object. - //! - //! @param eoEvalFunc< EOT >& __eval - evaluation object to be applied for each individual of a specified population - peoSeqPopEval( eoEvalFunc< EOT >& __eval ); + //! Constructor function - it only sets an internal reference to point to the specified evaluation object. + //! + //! @param eoEvalFunc< EOT >& __eval - evaluation object to be applied for each individual of a specified population + peoSeqPopEval( eoEvalFunc< EOT >& __eval ); - //! Operator for evaluating all the individuals of a given population - in a sequential iterative manner. - //! - //! @param eoPop< EOT >& __pop - population to be evaluated. - void operator()( eoPop< EOT >& __pop ); + //! Operator for evaluating all the individuals of a given population - in a sequential iterative manner. + //! + //! @param eoPop< EOT >& __pop - population to be evaluated. + void operator()( eoPop< EOT >& __pop ); -private: + private: - eoEvalFunc< EOT >& eval; -}; + eoEvalFunc< EOT >& eval; + }; -template< class EOT > peoSeqPopEval< EOT > :: peoSeqPopEval( eoEvalFunc< EOT >& __eval ) : eval( __eval ) { - -} +template< class EOT > peoSeqPopEval< EOT > :: peoSeqPopEval( eoEvalFunc< EOT >& __eval ) : eval( __eval ) +{} -template< class EOT > void peoSeqPopEval< EOT > :: operator()( eoPop< EOT >& __pop ) { +template< class EOT > void peoSeqPopEval< EOT > :: operator()( eoPop< EOT >& __pop ) +{ - for ( unsigned i = 0; i < __pop.size(); i++ ) - eval( __pop[i] ); + for ( unsigned i = 0; i < __pop.size(); i++ ) + eval( __pop[i] ); } diff --git a/trunk/paradiseo-peo/src/peoSeqTransform.h b/trunk/paradiseo-peo/src/peoSeqTransform.h index 981e8ac54..099e33325 100644 --- a/trunk/paradiseo-peo/src/peoSeqTransform.h +++ b/trunk/paradiseo-peo/src/peoSeqTransform.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -45,49 +45,55 @@ //! The peoSeqTransform represent a wrapper for offering the possibility of using EO derived transform operators //! along with the ParadisEO evolutionary algorithms. A minimal set of interface functions is also provided for creating the //! link with the parallel architecture of the ParadisEO framework. -template< class EOT > class peoSeqTransform : public peoTransform< EOT > { +template< class EOT > class peoSeqTransform : public peoTransform< EOT > + { -public: + public: - //! Constructor function - sets an internal reference towards the specified EO-derived transform object. - //! - //! @param eoTransform< EOT >& __trans - EO-derived transform object including crossover and mutation operators. - peoSeqTransform( eoTransform< EOT >& __trans ); - - //! Operator for applying the specified transform operators on each individual of the given population. - //! - //! @param eoPop< EOT >& __pop - population to be transformed by applying the crossover and mutation operators. - void operator()( eoPop< EOT >& __pop ); - - //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. - virtual void packData() { } + //! Constructor function - sets an internal reference towards the specified EO-derived transform object. + //! + //! @param eoTransform< EOT >& __trans - EO-derived transform object including crossover and mutation operators. + peoSeqTransform( eoTransform< EOT >& __trans ); - //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. - virtual void unpackData() { } - - //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. - virtual void execute() { } - - //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. - virtual void packResult() { } + //! Operator for applying the specified transform operators on each individual of the given population. + //! + //! @param eoPop< EOT >& __pop - population to be transformed by applying the crossover and mutation operators. + void operator()( eoPop< EOT >& __pop ); - //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. - virtual void unpackResult() { } + //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. + virtual void packData() + { } -private: + //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. + virtual void unpackData() + { } - eoTransform< EOT >& trans; -}; + //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. + virtual void execute() + { } + + //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. + virtual void packResult() + { } + + //! Interface function for providing a link with the parallel architecture of the ParadisEO framework. + virtual void unpackResult() + { } + + private: + + eoTransform< EOT >& trans; + }; -template< class EOT > peoSeqTransform< EOT > :: peoSeqTransform( eoTransform< EOT >& __trans ) : trans( __trans ) { - -} +template< class EOT > peoSeqTransform< EOT > :: peoSeqTransform( eoTransform< EOT >& __trans ) : trans( __trans ) +{} -template< class EOT > void peoSeqTransform< EOT > :: operator()( eoPop< EOT >& __pop ) { +template< class EOT > void peoSeqTransform< EOT > :: operator()( eoPop< EOT >& __pop ) +{ - trans( __pop ); + trans( __pop ); } diff --git a/trunk/paradiseo-peo/src/peoSyncIslandMig.h b/trunk/paradiseo-peo/src/peoSyncIslandMig.h index 53f1215c6..2e223d70f 100644 --- a/trunk/paradiseo-peo/src/peoSyncIslandMig.h +++ b/trunk/paradiseo-peo/src/peoSyncIslandMig.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -63,7 +63,7 @@ //! parameters, i.e. frequency of the migrations, selection and replacement strategies, //! a topological model and the source and destination population for the migrating individuals. //! The main difference as opposed to the asynchronous migration model is the synchronization step -//! performed after selecting and sending the emigrant individuals. +//! performed after selecting and sending the emigrant individuals. //! //! The migration operator is called at the end of each generation of an evolutionary algorithms //! as a checkpoint object - the following code exposes the structure of a classic evolutionary algorithm: @@ -139,175 +139,189 @@ //! islands requires the reiteration of the steps 2 through 4 for creating distinct algorithms, with distinct populations and //! the associated distinctly parametrized migration objects. The interconnecting element is the underlying topology, defined at step 1 //! (the same C++ migTopology object has to be passed as parameter for all the migration objects, in order to interconnect them). -template< class EOT > class peoSyncIslandMig : public Cooperative, public eoUpdater { +template< class EOT > class peoSyncIslandMig : public Cooperative, public eoUpdater + { -public: + public: - //! Constructor for the peoSyncIslandMig class; the characteristics of the migration model are defined - //! through the specified parameters - out of the box objects provided in EO, etc., or custom, derived objects may be passed as parameters. - //! - //! @param unsigned __frequency - frequency of the migrations - the migrations occur periodically; - //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of emigrant individuals out of the source population; - //! @param eoReplacement< EOT >& __replace - replacement strategy used for integrating the immigrant individuals in the destination population; - //! @param Topology& __topology - topological model to be followed when performing migrations; - //! @param eoPop< EOT >& __source - source population from which the emigrant individuals are selected; - //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. - peoSyncIslandMig( - unsigned __frequency, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination - ); + //! Constructor for the peoSyncIslandMig class; the characteristics of the migration model are defined + //! through the specified parameters - out of the box objects provided in EO, etc., or custom, derived objects may be passed as parameters. + //! + //! @param unsigned __frequency - frequency of the migrations - the migrations occur periodically; + //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of emigrant individuals out of the source population; + //! @param eoReplacement< EOT >& __replace - replacement strategy used for integrating the immigrant individuals in the destination population; + //! @param Topology& __topology - topological model to be followed when performing migrations; + //! @param eoPop< EOT >& __source - source population from which the emigrant individuals are selected; + //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. + peoSyncIslandMig( + unsigned __frequency, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + Topology& __topology, + eoPop< EOT >& __source, + eoPop< EOT >& __destination + ); - //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected - //! from the source population and sent to the next island (defined by the topology object) while the immigrant - //! individuals are integrated in the destination population. There is no need to explicitly call the function - the - //! wrapper checkpoint object (please refer to the above example) will perform the call when required. - void operator()(); + //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected + //! from the source population and sent to the next island (defined by the topology object) while the immigrant + //! individuals are integrated in the destination population. There is no need to explicitly call the function - the + //! wrapper checkpoint object (please refer to the above example) will perform the call when required. + void operator()(); - //! Auxiliary function dealing with sending the emigrant individuals. There is no need to explicitly call the function. - void pack(); - //! Auxiliary function dealing with receiving immigrant individuals. There is no need to explicitly call the function. - void unpack(); + //! Auxiliary function dealing with sending the emigrant individuals. There is no need to explicitly call the function. + void pack(); + //! Auxiliary function dealing with receiving immigrant individuals. There is no need to explicitly call the function. + void unpack(); - //! Auxiliary function dealing with migration notifications. There is no need to explicitly call the function. - void notifySending(); + //! Auxiliary function dealing with migration notifications. There is no need to explicitly call the function. + void notifySending(); -private: + private: - void emigrate(); - void immigrate(); + void emigrate(); + void immigrate(); -private: + private: - eoPeriodicContinue< EOT > cont; - eoSelect< EOT >& select; // selection strategy - eoReplacement< EOT >& replace; // replacement strategy - Topology& topology; // neighboring topology + eoPeriodicContinue< EOT > cont; + eoSelect< EOT >& select; // selection strategy + eoReplacement< EOT >& replace; // replacement strategy + Topology& topology; // neighboring topology - // source and target populations - eoPop< EOT >& source; - eoPop< EOT >& destination; + // source and target populations + eoPop< EOT >& source; + eoPop< EOT >& destination; - // immigrants & emigrants in the queue - std :: queue< eoPop< EOT > > imm; - std :: queue< eoPop< EOT > > em; + // immigrants & emigrants in the queue + std :: queue< eoPop< EOT > > imm; + std :: queue< eoPop< EOT > > em; - std :: queue< Cooperative* > coop_em; + std :: queue< Cooperative* > coop_em; - sem_t sync; -}; + sem_t sync; + }; template< class EOT > peoSyncIslandMig< EOT > :: peoSyncIslandMig( - unsigned __frequency, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination + unsigned __frequency, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + Topology& __topology, + eoPop< EOT >& __source, + eoPop< EOT >& __destination - ) : cont( __frequency ), select( __select ), replace( __replace ), topology( __topology ), source( __source ), destination( __destination ) +) : cont( __frequency ), select( __select ), replace( __replace ), topology( __topology ), source( __source ), destination( __destination ) { - __topology.add( *this ); - sem_init( &sync, 0, 0 ); + __topology.add( *this ); + sem_init( &sync, 0, 0 ); } -template< class EOT > void peoSyncIslandMig< EOT > :: pack() { +template< class EOT > void peoSyncIslandMig< EOT > :: pack() +{ - lock(); { + lock (); + { - :: pack( coop_em.front()->getKey() ); - :: pack( em.front() ); - coop_em.pop(); - em.pop(); - } - unlock(); + :: pack( coop_em.front()->getKey() ); + :: pack( em.front() ); + coop_em.pop(); + em.pop(); + } + unlock(); } -template< class EOT > void peoSyncIslandMig< EOT > :: unpack() { +template< class EOT > void peoSyncIslandMig< EOT > :: unpack() +{ - lock(); { + lock (); + { - eoPop< EOT > mig; - :: unpack( mig ); - imm.push( mig ); - } - unlock(); + eoPop< EOT > mig; + :: unpack( mig ); + imm.push( mig ); + } + unlock(); - sem_post( &sync ); + sem_post( &sync ); } -template< class EOT > void peoSyncIslandMig< EOT > :: emigrate() { +template< class EOT > void peoSyncIslandMig< EOT > :: emigrate() +{ - std :: vector< Cooperative* > in, out; - topology.setNeighbors( this, in, out ); - - for ( unsigned i = 0; i < out.size(); i ++ ) { + std :: vector< Cooperative* > in, out; + topology.setNeighbors( this, in, out ); - eoPop< EOT > mig; - select( source, mig ); - em.push( mig ); - coop_em.push( out[ i ] ); - send( out[ i ] ); - printDebugMessage( "sending some emigrants." ); - } + for ( unsigned i = 0; i < out.size(); i ++ ) + { + + eoPop< EOT > mig; + select( source, mig ); + em.push( mig ); + coop_em.push( out[ i ] ); + send( out[ i ] ); + printDebugMessage( "sending some emigrants." ); + } } -template< class EOT > void peoSyncIslandMig< EOT > :: immigrate() { +template< class EOT > void peoSyncIslandMig< EOT > :: immigrate() +{ - lock(); { + lock (); + { - assert( imm.size() ); - replace( destination, imm.front() ) ; - imm.pop(); - printDebugMessage( "receiving some immigrants." ); - } - unlock(); + assert( imm.size() ); + replace( destination, imm.front() ) ; + imm.pop(); + printDebugMessage( "receiving some immigrants." ); + } + unlock(); } -template< class EOT > void peoSyncIslandMig< EOT > :: operator()() { +template< class EOT > void peoSyncIslandMig< EOT > :: operator()() +{ - if ( !cont( source ) ) { - - // sending emigrants - emigrate(); - stop(); + if ( !cont( source ) ) + { - // synchronizing - sem_wait( &sync ); - getOwner()->setActive(); + // sending emigrants + emigrate(); + stop(); - // receiving immigrants - immigrate(); - } + // synchronizing + sem_wait( &sync ); + getOwner()->setActive(); + + // receiving immigrants + immigrate(); + } } -template< class EOT > void peoSyncIslandMig< EOT > :: notifySending() { +template< class EOT > void peoSyncIslandMig< EOT > :: notifySending() +{ - lock(); { + lock (); + { - if ( imm.empty() ) { + if ( imm.empty() ) + { - printDebugMessage( "entering pasive mode\n" ); - getOwner()->setPassive(); - } - } - unlock(); + printDebugMessage( "entering pasive mode\n" ); + getOwner()->setPassive(); + } + } + unlock(); - resume(); + resume(); } diff --git a/trunk/paradiseo-peo/src/peoSyncMultiStart.h b/trunk/paradiseo-peo/src/peoSyncMultiStart.h index d0481ce76..b4c15607a 100644 --- a/trunk/paradiseo-peo/src/peoSyncMultiStart.h +++ b/trunk/paradiseo-peo/src/peoSyncMultiStart.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -61,150 +61,156 @@ extern int getNodeRank(); //! peoSyncMultiStart object can be specified as checkpoint object for a classic ParadisEO evolutionary algorithm //! thus allowing for simple hybridization schemes which combine the evolutionary approach with a local search approach, //! for example, executed at the end of each generation. -template< class EOT > class peoSyncMultiStart : public Service, public eoUpdater { +template< class EOT > class peoSyncMultiStart : public Service, public eoUpdater + { -public: + public: - //! Constructor function - several simple parameters are required for defining the characteristics of the multi-start model. - //! - //! @param eoContinue< EOT >& __cont - defined for including further functionality - no semantics associated at this time; - //! @param eoSelect< EOT >& __select - selection strategy for obtaining a subset of the initial population on which to apply the specified algorithm; - //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the resulting individuals in the initial population; - //! @param moAlgo< EOT >& __ls - algorithm to be applied on each of the selected individuals - a moAlgo< EOT >-derived object must be specified; - //! @param eoPop< EOT >& __pop - the initial population from which the individuals are selected for applying the specified algorithm. - peoSyncMultiStart( + //! Constructor function - several simple parameters are required for defining the characteristics of the multi-start model. + //! + //! @param eoContinue< EOT >& __cont - defined for including further functionality - no semantics associated at this time; + //! @param eoSelect< EOT >& __select - selection strategy for obtaining a subset of the initial population on which to apply the specified algorithm; + //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the resulting individuals in the initial population; + //! @param moAlgo< EOT >& __ls - algorithm to be applied on each of the selected individuals - a moAlgo< EOT >-derived object must be specified; + //! @param eoPop< EOT >& __pop - the initial population from which the individuals are selected for applying the specified algorithm. + peoSyncMultiStart( - eoContinue< EOT >& __cont, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - moAlgo< EOT >& __ls, - eoPop< EOT >& __pop - ); + eoContinue< EOT >& __cont, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + moAlgo< EOT >& __ls, + eoPop< EOT >& __pop + ); - //! Operator which synchronously executes the specified algorithm on the individuals selected from the initial population. - //! There is no need to explicitly call the operator - automatically called as checkpoint operator. - void operator()(); + //! Operator which synchronously executes the specified algorithm on the individuals selected from the initial population. + //! There is no need to explicitly call the operator - automatically called as checkpoint operator. + void operator()(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void packData(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void packData(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void unpackData(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void unpackData(); - //! Auxiliary function for actually executing the specified algorithm on one assigned individual. There is no need to - //! explicitly call the function. - void execute(); + //! Auxiliary function for actually executing the specified algorithm on one assigned individual. There is no need to + //! explicitly call the function. + void execute(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void packResult(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void packResult(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void unpackResult(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void unpackResult(); - //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution - //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. - void notifySendingData(); + //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution + //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. + void notifySendingData(); - //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution - //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. - void notifySendingAllResourceRequests(); + //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution + //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. + void notifySendingAllResourceRequests(); -private: + private: - eoContinue< EOT >& cont; - eoSelect< EOT >& select; - eoReplacement< EOT >& replace; + eoContinue< EOT >& cont; + eoSelect< EOT >& select; + eoReplacement< EOT >& replace; - moAlgo< EOT >& ls; + moAlgo< EOT >& ls; - eoPop< EOT >& pop; - eoPop< EOT > sel; - eoPop< EOT > impr_sel; + eoPop< EOT >& pop; + eoPop< EOT > sel; + eoPop< EOT > impr_sel; - EOT sol; - unsigned idx; - unsigned num_term; -}; + EOT sol; + unsigned idx; + unsigned num_term; + }; -template< class EOT > peoSyncMultiStart< EOT > :: peoSyncMultiStart( +template< class EOT > peoSyncMultiStart< EOT > :: peoSyncMultiStart( - eoContinue < EOT >& __cont, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - moAlgo < EOT >& __ls, - eoPop< EOT >& __pop + eoContinue < EOT >& __cont, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + moAlgo < EOT >& __ls, + eoPop< EOT >& __pop - ) : cont( __cont ), select( __select ), replace( __replace ), ls( __ls ), pop( __pop ) +) : cont( __cont ), select( __select ), replace( __replace ), ls( __ls ), pop( __pop ) +{} + + +template< class EOT > void peoSyncMultiStart< EOT > :: packData() { + :: pack( sel[ idx++ ] ); } -template< class EOT > void peoSyncMultiStart< EOT > :: packData() { +template< class EOT > void peoSyncMultiStart< EOT > :: unpackData() +{ - :: pack( sel[ idx++ ] ); + unpack( sol ); } -template< class EOT > void peoSyncMultiStart< EOT > :: unpackData() { +template< class EOT > void peoSyncMultiStart< EOT > :: execute() +{ - unpack( sol ); + ls( sol ); } -template< class EOT > void peoSyncMultiStart< EOT > :: execute() { +template< class EOT > void peoSyncMultiStart< EOT > :: packResult() +{ - ls( sol ); + pack( sol ); } -template< class EOT > void peoSyncMultiStart< EOT > :: packResult() { +template< class EOT > void peoSyncMultiStart< EOT > :: unpackResult() +{ - pack( sol ); + unpack( sol ); + impr_sel.push_back( sol ); + num_term++; + + if ( num_term == sel.size() ) + { + + getOwner()->setActive(); + replace( pop, impr_sel ); + + printDebugMessage( "replacing the improved individuals in the population." ); + resume(); + } } -template< class EOT > void peoSyncMultiStart< EOT > :: unpackResult() { +template< class EOT > void peoSyncMultiStart< EOT > :: operator()() +{ - unpack( sol ); - impr_sel.push_back( sol ); - num_term++; - - if ( num_term == sel.size() ) { - - getOwner()->setActive(); - replace( pop, impr_sel ); - - printDebugMessage( "replacing the improved individuals in the population." ); - resume(); - } + printDebugMessage( "performing the parallel multi-start hybridization." ); + select( pop, sel ); + impr_sel.clear(); + idx = num_term = 0; + requestResourceRequest( sel.size() ); + stop(); } -template< class EOT > void peoSyncMultiStart< EOT > :: operator()() { - - printDebugMessage( "performing the parallel multi-start hybridization." ); - select( pop, sel ); - impr_sel.clear(); - idx = num_term = 0; - requestResourceRequest( sel.size() ); - stop(); -} +template< class EOT > void peoSyncMultiStart< EOT > :: notifySendingData() +{} -template< class EOT > void peoSyncMultiStart< EOT > :: notifySendingData() { +template< class EOT > void peoSyncMultiStart< EOT > :: notifySendingAllResourceRequests() +{ -} - - -template< class EOT > void peoSyncMultiStart< EOT > :: notifySendingAllResourceRequests() { - - getOwner()->setPassive(); + getOwner()->setPassive(); } diff --git a/trunk/paradiseo-peo/src/peoSynchronousMultiStart.h b/trunk/paradiseo-peo/src/peoSynchronousMultiStart.h index 580a2e61e..44feec3a1 100644 --- a/trunk/paradiseo-peo/src/peoSynchronousMultiStart.h +++ b/trunk/paradiseo-peo/src/peoSynchronousMultiStart.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,227 +42,265 @@ #include "core/messaging.h" -template < typename EntityType > class peoSynchronousMultiStart : public Service { +template < typename EntityType > class peoSynchronousMultiStart : public Service + { -public: + public: - template < typename AlgorithmType > peoSynchronousMultiStart( AlgorithmType& externalAlgorithm ) { + template < typename AlgorithmType > peoSynchronousMultiStart( AlgorithmType& externalAlgorithm ) + { - singularAlgorithm = new Algorithm< AlgorithmType >( externalAlgorithm ); - algorithms.push_back( singularAlgorithm ); + singularAlgorithm = new Algorithm< AlgorithmType >( externalAlgorithm ); + algorithms.push_back( singularAlgorithm ); - aggregationFunction = new NoAggregationFunction(); - } + aggregationFunction = new NoAggregationFunction(); + } - template < typename AlgorithmType, typename AggregationFunctionType > peoSynchronousMultiStart( std::vector< AlgorithmType* >& externalAlgorithms, AggregationFunctionType& externalAggregationFunction ) { + template < typename AlgorithmType, typename AggregationFunctionType > peoSynchronousMultiStart( std::vector< AlgorithmType* >& externalAlgorithms, AggregationFunctionType& externalAggregationFunction ) + { - for ( unsigned int index = 0; index < externalAlgorithms; index++ ) { + for ( unsigned int index = 0; index < externalAlgorithms; index++ ) + { - algorithms.push_back( new Algorithm< AlgorithmType >( *externalAlgorithms[ index ] ) ); - } + algorithms.push_back( new Algorithm< AlgorithmType >( *externalAlgorithms[ index ] ) ); + } - aggregationFunction = new Algorithm< AggregationFunctionType >( externalAggregationFunction ); - } + aggregationFunction = new Algorithm< AggregationFunctionType >( externalAggregationFunction ); + } - ~peoSynchronousMultiStart() { + ~peoSynchronousMultiStart() + { - for ( unsigned int index = 0; index < data.size(); index++ ) delete data[ index ]; - for ( unsigned int index = 0; index < algorithms.size(); index++ ) delete algorithms[ index ]; + for ( unsigned int index = 0; index < data.size(); index++ ) delete data[ index ]; + for ( unsigned int index = 0; index < algorithms.size(); index++ ) delete algorithms[ index ]; - delete aggregationFunction; - } + delete aggregationFunction; + } - template < typename Type > void operator()( Type& externalData ) { + template < typename Type > void operator()( Type& externalData ) + { - for ( typename Type::iterator externalDataIterator = externalData.begin(); externalDataIterator != externalData.end(); externalDataIterator++ ) { + for ( typename Type::iterator externalDataIterator = externalData.begin(); externalDataIterator != externalData.end(); externalDataIterator++ ) + { - data.push_back( new DataType< EntityType >( *externalDataIterator ) ); - } - - functionIndex = dataIndex = idx = num_term = 0; - requestResourceRequest( data.size() * algorithms.size() ); - stop(); - } + data.push_back( new DataType< EntityType >( *externalDataIterator ) ); + } + functionIndex = dataIndex = idx = num_term = 0; + requestResourceRequest( data.size() * algorithms.size() ); + stop(); + } - template < typename Type > void operator()( const Type& externalDataBegin, const Type& externalDataEnd ) { - for ( Type externalDataIterator = externalDataBegin; externalDataIterator != externalDataEnd; externalDataIterator++ ) { + template < typename Type > void operator()( const Type& externalDataBegin, const Type& externalDataEnd ) + { - data.push_back( new DataType< EntityType >( *externalDataIterator ) ); - } - - functionIndex = dataIndex = idx = num_term = 0; - requestResourceRequest( data.size() * algorithms.size() ); - stop(); - } + for ( Type externalDataIterator = externalDataBegin; externalDataIterator != externalDataEnd; externalDataIterator++ ) + { + data.push_back( new DataType< EntityType >( *externalDataIterator ) ); + } - void packData(); + functionIndex = dataIndex = idx = num_term = 0; + requestResourceRequest( data.size() * algorithms.size() ); + stop(); + } - void unpackData(); - void execute(); + void packData(); - void packResult(); + void unpackData(); - void unpackResult(); + void execute(); - void notifySendingData(); + void packResult(); - void notifySendingAllResourceRequests(); + void unpackResult(); + void notifySendingData(); -private: + void notifySendingAllResourceRequests(); - template < typename Type > struct DataType; - struct AbstractDataType { + private: - virtual ~AbstractDataType() { } + template < typename Type > struct DataType; - template < typename Type > operator Type& () { + struct AbstractDataType + { - return ( dynamic_cast< DataType< Type >& >( *this ) ).data; - } - }; + virtual ~AbstractDataType() + { } - template < typename Type > struct DataType : public AbstractDataType { + template < typename Type > operator Type& () + { - DataType( Type& externalData ) : data( externalData ) { } + return ( dynamic_cast< DataType< Type >& >( *this ) ).data; + } + }; - Type& data; - }; + template < typename Type > struct DataType : public AbstractDataType + { - struct AbstractAlgorithm { + DataType( Type& externalData ) : data( externalData ) + { } - virtual ~AbstractAlgorithm() { } + Type& data; + }; - virtual void operator()( AbstractDataType& dataTypeInstance ) {} - }; + struct AbstractAlgorithm + { - template < typename AlgorithmType > struct Algorithm : public AbstractAlgorithm { + virtual ~AbstractAlgorithm() + { } - Algorithm( AlgorithmType& externalAlgorithm ) : algorithm( externalAlgorithm ) { } + virtual void operator()( AbstractDataType& dataTypeInstance ) + {} + }; - void operator()( AbstractDataType& dataTypeInstance ) { algorithm( dataTypeInstance ); } + template < typename AlgorithmType > struct Algorithm : public AbstractAlgorithm + { - AlgorithmType& algorithm; - }; + Algorithm( AlgorithmType& externalAlgorithm ) : algorithm( externalAlgorithm ) + { } + void operator()( AbstractDataType& dataTypeInstance ) + { + algorithm( dataTypeInstance ); + } + AlgorithmType& algorithm; + }; - struct AbstractAggregationAlgorithm { - virtual ~AbstractAggregationAlgorithm() { } - virtual void operator()( AbstractDataType& dataTypeInstanceA, AbstractDataType& dataTypeInstanceB ) {}; - }; + struct AbstractAggregationAlgorithm + { - template < typename AggregationAlgorithmType > struct AggregationAlgorithm : public AbstractAggregationAlgorithm { + virtual ~AbstractAggregationAlgorithm() + { } - AggregationAlgorithm( AggregationAlgorithmType& externalAggregationAlgorithm ) : aggregationAlgorithm( externalAggregationAlgorithm ) { } + virtual void operator()( AbstractDataType& dataTypeInstanceA, AbstractDataType& dataTypeInstanceB ) + {}; + }; - void operator()( AbstractDataType& dataTypeInstanceA, AbstractDataType& dataTypeInstanceB ) { + template < typename AggregationAlgorithmType > struct AggregationAlgorithm : public AbstractAggregationAlgorithm + { - aggregationAlgorithm( dataTypeInstanceA, dataTypeInstanceB ); - } + AggregationAlgorithm( AggregationAlgorithmType& externalAggregationAlgorithm ) : aggregationAlgorithm( externalAggregationAlgorithm ) + { } - AggregationAlgorithmType& aggregationAlgorithm; - }; + void operator()( AbstractDataType& dataTypeInstanceA, AbstractDataType& dataTypeInstanceB ) + { - struct NoAggregationFunction : public AbstractAggregationAlgorithm { + aggregationAlgorithm( dataTypeInstanceA, dataTypeInstanceB ); + } - void operator()( AbstractDataType& dataTypeInstanceA, AbstractDataType& dataTypeInstanceB ) { + AggregationAlgorithmType& aggregationAlgorithm; + }; - static_cast< EntityType& >( dataTypeInstanceA ) = static_cast< EntityType& >( dataTypeInstanceB ); - } - }; + struct NoAggregationFunction : public AbstractAggregationAlgorithm + { + void operator()( AbstractDataType& dataTypeInstanceA, AbstractDataType& dataTypeInstanceB ) + { + static_cast< EntityType& >( dataTypeInstanceA ) = static_cast< EntityType& >( dataTypeInstanceB ); + } + }; - AbstractAlgorithm* singularAlgorithm; - std::vector< AbstractAlgorithm* > algorithms; - AbstractAggregationAlgorithm* aggregationFunction; + AbstractAlgorithm* singularAlgorithm; - EntityType entityTypeInstance; - std::vector< AbstractDataType* > data; + std::vector< AbstractAlgorithm* > algorithms; + AbstractAggregationAlgorithm* aggregationFunction; - unsigned idx; - unsigned num_term; - unsigned dataIndex; - unsigned functionIndex; -}; + EntityType entityTypeInstance; + std::vector< AbstractDataType* > data; -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::packData() { + unsigned idx; + unsigned num_term; + unsigned dataIndex; + unsigned functionIndex; + }; - ::pack( functionIndex ); - ::pack( idx ); - ::pack( ( EntityType& ) *data[ idx++ ] ); - // done with functionIndex for the entire data set - moving to another - // function/algorithm starting all over with the entire data set ( idx is set to 0 ) - if ( idx == data.size() ) { +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::packData() +{ - ++functionIndex; idx = 0; - } + ::pack( functionIndex ); + ::pack( idx ); + ::pack( ( EntityType& ) *data[ idx++ ] ); + + // done with functionIndex for the entire data set - moving to another + // function/algorithm starting all over with the entire data set ( idx is set to 0 ) + if ( idx == data.size() ) + { + + ++functionIndex; + idx = 0; + } } -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::unpackData() { +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::unpackData() +{ - ::unpack( functionIndex ); - ::unpack( dataIndex ); - ::unpack( entityTypeInstance ); + ::unpack( functionIndex ); + ::unpack( dataIndex ); + ::unpack( entityTypeInstance ); } -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::execute() { +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::execute() +{ - // wrapping the unpacked data - the definition of an abstract algorithm imposes - // that its internal function operator acts only on abstract data types - AbstractDataType* entityWrapper = new DataType< EntityType >( entityTypeInstance ); - algorithms[ functionIndex ]->operator()( *entityWrapper ); + // wrapping the unpacked data - the definition of an abstract algorithm imposes + // that its internal function operator acts only on abstract data types + AbstractDataType* entityWrapper = new DataType< EntityType >( entityTypeInstance ); + algorithms[ functionIndex ]->operator()( *entityWrapper ); - delete entityWrapper; + delete entityWrapper; } -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::packResult() { +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::packResult() +{ - ::pack( dataIndex ); - ::pack( entityTypeInstance ); + ::pack( dataIndex ); + ::pack( entityTypeInstance ); } -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::unpackResult() { +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::unpackResult() +{ - ::unpack( dataIndex ); - ::unpack( entityTypeInstance ); + ::unpack( dataIndex ); + ::unpack( entityTypeInstance ); - // wrapping the unpacked data - the definition of an abstract algorithm imposes - // that its internal function operator acts only on abstract data types - AbstractDataType* entityWrapper = new DataType< EntityType >( entityTypeInstance ); - aggregationFunction->operator()( *data[ dataIndex ], *entityWrapper ); - delete entityWrapper; + // wrapping the unpacked data - the definition of an abstract algorithm imposes + // that its internal function operator acts only on abstract data types + AbstractDataType* entityWrapper = new DataType< EntityType >( entityTypeInstance ); + aggregationFunction->operator()( *data[ dataIndex ], *entityWrapper ); + delete entityWrapper; - num_term++; + num_term++; - if ( num_term == data.size() * algorithms.size() ) { + if ( num_term == data.size() * algorithms.size() ) + { - getOwner()->setActive(); - resume(); - } + getOwner()->setActive(); + resume(); + } } -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::notifySendingData() { +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::notifySendingData() +{} -} +template < typename EntityType > void peoSynchronousMultiStart< EntityType >::notifySendingAllResourceRequests() +{ -template < typename EntityType > void peoSynchronousMultiStart< EntityType >::notifySendingAllResourceRequests() { - - getOwner()->setPassive(); + getOwner()->setPassive(); } diff --git a/trunk/paradiseo-peo/src/peoTransform.h b/trunk/paradiseo-peo/src/peoTransform.h index 710b0b974..c86dfe8e7 100644 --- a/trunk/paradiseo-peo/src/peoTransform.h +++ b/trunk/paradiseo-peo/src/peoTransform.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -45,9 +45,8 @@ //! The peoTransform class acts only as an interface for creating transform operators - for an example //! please refer to the peoSeqTransform and the peoParaSGATransform classes. -template< class EOT > class peoTransform : public Service, public eoTransform< EOT > { - -}; +template< class EOT > class peoTransform : public Service, public eoTransform< EOT > + {}; #endif diff --git a/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp b/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp index 107d0666c..e5356c800 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -51,42 +51,48 @@ static sem_t sem_comm_init; static Communicator * the_thread; -Communicator :: Communicator (int * __argc, char * * * __argv) { +Communicator :: Communicator (int * __argc, char * * * __argv) +{ - the_thread = this; + the_thread = this; initNode (__argc, __argv); - loadRMCParameters (* __argc, * __argv); + loadRMCParameters (* __argc, * __argv); sem_post (& sem_comm_init); } -void Communicator :: start () { +void Communicator :: start () +{ - while (true) { - - /* Zzz Zzz Zzz :-))) */ - sleep (); - sendMessages (); + while (true) + { - if (! atLeastOneActiveRunner ()) - break; - receiveMessages (); - } - waitBuffers (); + /* Zzz Zzz Zzz :-))) */ + sleep (); + sendMessages (); + + if (! atLeastOneActiveRunner ()) + break; + receiveMessages (); + } + waitBuffers (); printDebugMessage ("finalizing"); - MPI_Finalize (); + MPI_Finalize (); } -void initCommunication () { +void initCommunication () +{ sem_init (& sem_comm_init, 0, 0); } -void waitNodeInitialization () { +void waitNodeInitialization () +{ sem_wait (& sem_comm_init); } -void wakeUpCommunicator () { +void wakeUpCommunicator () +{ the_thread -> wakeUp (); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/comm.h b/trunk/paradiseo-peo/src/rmc/mpi/comm.h index 5184d45f1..ef19fa9ac 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/comm.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/comm.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,15 +40,16 @@ #include "../../core/communicable.h" #include "../../core/reac_thread.h" -class Communicator : public ReactiveThread { +class Communicator : public ReactiveThread + { -public : - - /* Ctor */ - Communicator (int * __argc, char * * * __argv); + public : - void start (); -}; + /* Ctor */ + Communicator (int * __argc, char * * * __argv); + + void start (); + }; extern void initCommunication (); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp b/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp index b4b57d7ba..186cefd51 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,28 +41,33 @@ #include "mess.h" #include "../../core/peo_debug.h" -Runner * Cooperative :: getOwner () { +Runner * Cooperative :: getOwner () +{ return owner; } -void Cooperative :: setOwner (Runner & __runner) { +void Cooperative :: setOwner (Runner & __runner) +{ owner = & __runner; } -void Cooperative :: send (Cooperative * __coop) { +void Cooperative :: send (Cooperative * __coop) +{ - :: send (this, getRankOfRunner (__coop -> getOwner () -> getID ()), COOP_TAG); + :: send (this, getRankOfRunner (__coop -> getOwner () -> getID ()), COOP_TAG); // stop (); } -Cooperative * getCooperative (COOP_ID __key) { +Cooperative * getCooperative (COOP_ID __key) +{ return dynamic_cast (getCommunicable (__key)); } -void Cooperative :: notifySending () { +void Cooperative :: notifySending () +{ //getOwner -> setPassive (); // resume (); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp b/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp index 2352e45ba..32021980e 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,54 +42,60 @@ #include "node.h" #define MPI_BUF_SIZE 1024*64 - + static char mpi_buf [MPI_BUF_SIZE]; - + static int pos_buf ; static std :: vector act_buf; /* Active buffers */ static std :: vector act_req; /* Active requests */ -void cleanBuffers () { +void cleanBuffers () +{ - for (unsigned i = 0; i < act_req.size ();) { - - MPI_Status stat ; - int flag ; - MPI_Test (act_req [i], & flag, & stat) ; - if (flag) { - - delete act_buf [i] ; - delete act_req [i] ; - - act_buf [i] = act_buf.back () ; - act_buf.pop_back () ; - - act_req [i] = act_req.back () ; - act_req.pop_back () ; + for (unsigned i = 0; i < act_req.size ();) + { + + MPI_Status stat ; + int flag ; + MPI_Test (act_req [i], & flag, & stat) ; + if (flag) + { + + delete act_buf [i] ; + delete act_req [i] ; + + act_buf [i] = act_buf.back () ; + act_buf.pop_back () ; + + act_req [i] = act_req.back () ; + act_req.pop_back () ; + } + else + i ++; } - else - i ++; - } } -void waitBuffers () { +void waitBuffers () +{ printDebugMessage ("waiting the termination of the asynchronous operations to complete"); - for (unsigned i = 0; i < act_req.size (); i ++) { - - MPI_Status stat ; + for (unsigned i = 0; i < act_req.size (); i ++) + { - MPI_Wait (act_req [i], & stat) ; - - delete act_buf [i] ; - delete act_req [i] ; - } + MPI_Status stat ; + + MPI_Wait (act_req [i], & stat) ; + + delete act_buf [i] ; + delete act_req [i] ; + } } -bool probeMessage (int & __src, int & __tag) { +bool probeMessage (int & __src, int & __tag) +{ int flag; @@ -103,36 +109,41 @@ bool probeMessage (int & __src, int & __tag) { return flag; } -void waitMessage () { +void waitMessage () +{ - MPI_Status stat; + MPI_Status stat; MPI_Probe (MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, & stat); } -void initMessage () { - +void initMessage () +{ + pos_buf = 0; } -void sendMessage (int __to, int __tag) { +void sendMessage (int __to, int __tag) +{ - cleanBuffers (); + cleanBuffers (); act_buf.push_back (new char [pos_buf]); - act_req.push_back (new MPI_Request); - memcpy (act_buf.back (), mpi_buf, pos_buf); - MPI_Isend (act_buf.back (), pos_buf, MPI_PACKED, __to, __tag, MPI_COMM_WORLD, act_req.back ()); + act_req.push_back (new MPI_Request); + memcpy (act_buf.back (), mpi_buf, pos_buf); + MPI_Isend (act_buf.back (), pos_buf, MPI_PACKED, __to, __tag, MPI_COMM_WORLD, act_req.back ()); } -void sendMessageToAll (int __tag) { +void sendMessageToAll (int __tag) +{ for (int i = 0; i < getNumberOfNodes (); i ++) sendMessage (i, __tag); } -void receiveMessage (int __from, int __tag) { - - MPI_Status stat; +void receiveMessage (int __from, int __tag) +{ + + MPI_Status stat; MPI_Request req; MPI_Irecv (mpi_buf, MPI_BUF_SIZE, MPI_PACKED, __from, __tag, MPI_COMM_WORLD, & req) ; @@ -140,126 +151,146 @@ void receiveMessage (int __from, int __tag) { } /* Char */ -void pack (const char & __c) { +void pack (const char & __c) +{ MPI_Pack ((void *) & __c, 1, MPI_CHAR, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Float */ -void pack (const float & __f, int __nitem) { +void pack (const float & __f, int __nitem) +{ MPI_Pack ((void *) & __f, __nitem, MPI_FLOAT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Double */ -void pack (const double & __d, int __nitem) { +void pack (const double & __d, int __nitem) +{ MPI_Pack ((void *) & __d, __nitem, MPI_DOUBLE, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Integer */ -void pack (const int & __i, int __nitem) { +void pack (const int & __i, int __nitem) +{ MPI_Pack ((void *) & __i, __nitem, MPI_INT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Unsigned int. */ -void pack (const unsigned int & __ui, int __nitem) { +void pack (const unsigned int & __ui, int __nitem) +{ MPI_Pack ((void *) & __ui, __nitem, MPI_UNSIGNED, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Short int. */ -void pack (const short & __sh, int __nitem) { +void pack (const short & __sh, int __nitem) +{ MPI_Pack ((void *) & __sh, __nitem, MPI_SHORT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Unsigned short */ -void pack (const unsigned short & __ush, int __nitem) { +void pack (const unsigned short & __ush, int __nitem) +{ MPI_Pack ((void *) & __ush, __nitem, MPI_UNSIGNED_SHORT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Long */ -void pack (const long & __l, int __nitem) { +void pack (const long & __l, int __nitem) +{ MPI_Pack ((void *) & __l, __nitem, MPI_LONG, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Unsigned long */ -void pack (const unsigned long & __ul, int __nitem) { +void pack (const unsigned long & __ul, int __nitem) +{ MPI_Pack ((void *) & __ul, __nitem, MPI_UNSIGNED_LONG, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* String */ -void pack (const char * __str) { - +void pack (const char * __str) +{ + int len = strlen (__str) + 1; MPI_Pack (& len, 1, MPI_INT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); MPI_Pack ((void *) __str, len, MPI_CHAR, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); } /* Char */ -void unpack (char & __c) { +void unpack (char & __c) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __c, 1, MPI_CHAR, MPI_COMM_WORLD); } /* Float */ -void unpack (float & __f, int __nitem) { +void unpack (float & __f, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __f, __nitem, MPI_FLOAT, MPI_COMM_WORLD); } /* Double */ -void unpack (double & __d, int __nitem) { +void unpack (double & __d, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __d, __nitem, MPI_DOUBLE, MPI_COMM_WORLD); } /* Integer */ -void unpack (int & __i, int __nitem) { +void unpack (int & __i, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __i, __nitem, MPI_INT, MPI_COMM_WORLD); } /* Unsigned int. */ -void unpack (unsigned int & __ui, int __nitem) { +void unpack (unsigned int & __ui, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __ui, __nitem, MPI_UNSIGNED, MPI_COMM_WORLD); } /* Short int. */ -void unpack (short & __sh, int __nitem) { +void unpack (short & __sh, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __sh, __nitem, MPI_SHORT, MPI_COMM_WORLD); } /* Unsigned short */ -void unpack (unsigned short & __ush, int __nitem) { +void unpack (unsigned short & __ush, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __ush, __nitem, MPI_UNSIGNED_SHORT, MPI_COMM_WORLD); } /* Long */ -void unpack (long & __l, int __nitem) { +void unpack (long & __l, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __l, __nitem, MPI_LONG, MPI_COMM_WORLD); } /* Unsigned long */ -void unpack (unsigned long & __ul, int __nitem) { +void unpack (unsigned long & __ul, int __nitem) +{ MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & __ul, __nitem, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); } /* String */ -void unpack (char * __str) { +void unpack (char * __str) +{ int len; MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & len, 1, MPI_INT, MPI_COMM_WORLD); - MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, __str, len, MPI_CHAR, MPI_COMM_WORLD); + MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, __str, len, MPI_CHAR, MPI_COMM_WORLD); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/mess.h b/trunk/paradiseo-peo/src/rmc/mpi/mess.h index 2fb9a59d1..b5eb98990 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/mess.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/mess.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/rmc/mpi/node.cpp b/trunk/paradiseo-peo/src/rmc/mpi/node.cpp index dcd156781..536d0d6f8 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/node.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/node.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -46,41 +46,46 @@ static std :: map name_to_rk; static std :: vector rk_to_name; -int getNodeRank () { +int getNodeRank () +{ return rk; } -int getNumberOfNodes () { +int getNumberOfNodes () +{ return sz; } -int getRankFromName (const std :: string & __name) { - - return atoi (__name.c_str ()); +int getRankFromName (const std :: string & __name) +{ + + return atoi (__name.c_str ()); } -void initNode (int * __argc, char * * * __argv) { - +void initNode (int * __argc, char * * * __argv) +{ + int provided; - MPI_Init_thread (__argc, __argv, MPI_THREAD_FUNNELED, & provided); + MPI_Init_thread (__argc, __argv, MPI_THREAD_FUNNELED, & provided); assert (provided == MPI_THREAD_FUNNELED); /* The MPI implementation must be multi-threaded. - Yet, only one thread performs the comm. - operations */ + Yet, only one thread performs the comm. + operations */ MPI_Comm_rank (MPI_COMM_WORLD, & rk); /* Who ? */ MPI_Comm_size (MPI_COMM_WORLD, & sz); /* How many ? */ char names [sz] [MPI_MAX_PROCESSOR_NAME]; int len; - /* Processor names */ - MPI_Get_processor_name (names [0], & len); /* Me */ + /* Processor names */ + MPI_Get_processor_name (names [0], & len); /* Me */ MPI_Allgather (names, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, names, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, MPI_COMM_WORLD); /* Broadcast */ - - for (int i = 0; i < sz; i ++) { - rk_to_name.push_back (names [i]); - name_to_rk [names [i]] = i; - } + + for (int i = 0; i < sz; i ++) + { + rk_to_name.push_back (names [i]); + name_to_rk [names [i]] = i; + } } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/node.h b/trunk/paradiseo-peo/src/rmc/mpi/node.h index 76babf5b7..700706bf6 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/node.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/node.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/rmc/mpi/param.cpp b/trunk/paradiseo-peo/src/rmc/mpi/param.cpp index 821e58179..c0cb02d9e 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/param.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/param.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -38,7 +38,8 @@ #include "schema.h" -void loadRMCParameters (int & __argc, char * * & __argv) { +void loadRMCParameters (int & __argc, char * * & __argv) +{ eoParser parser (__argc, __argv); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/param.h b/trunk/paradiseo-peo/src/rmc/mpi/param.h index b868a1db7..9d36e9241 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/param.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/param.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp b/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp index 39b98fd79..251f53e44 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,97 +44,103 @@ #include "../../core/cooperative.h" #include "../../core/peo_debug.h" -void receiveMessages () { +void receiveMessages () +{ cleanBuffers (); - - do { - if (! atLeastOneActiveThread ()) { - // printDebugMessage ("debut wait"); - waitMessage (); - //printDebugMessage ("fin wait"); + do + { + + if (! atLeastOneActiveThread ()) + { + // printDebugMessage ("debut wait"); + waitMessage (); + //printDebugMessage ("fin wait"); + } + + int src, tag; + + while (probeMessage (src, tag)) + { + + receiveMessage (src, tag); + initMessage (); + /* + char b [1000]; + sprintf (b, "traitement recv %d\n", tag); + printDebugMessage (b); + */ + + switch (tag) + { + + case RUNNER_STOP_TAG: + unpackTerminationOfRunner (); + wakeUpCommunicator (); + break; + + case COOP_TAG: + // printDebugMessage ("reception de message de cooperation"); + COOP_ID coop_id; + unpack (coop_id); + getCooperative (coop_id) -> unpack (); + break; + + case SCHED_REQUEST_TAG: + unpackResourceRequest (); + break; + + case SCHED_RESULT_TAG: + { + /* Unpacking the resource */ + SERVICE_ID serv_id; + unpack (serv_id); + Service * serv = getService (serv_id); + int dest; + unpack (dest); + WORKER_ID worker_id; + unpack (worker_id); + + /* Going back ... */ + initMessage (); + pack (worker_id); + pack (serv_id); + serv -> packData (); + serv -> notifySendingData (); + sendMessage (dest, TASK_DATA_TAG); + break; + } + + case TASK_DATA_TAG: + { + WORKER_ID worker_id; + unpack (worker_id); + Worker * worker = getWorker (worker_id); + worker -> setSource (src); + worker -> unpackData (); + worker -> wakeUp (); + break; + } + + case TASK_RESULT_TAG: + { + SERVICE_ID serv_id; + unpack (serv_id); + Service * serv = getService (serv_id); + serv -> unpackResult (); + break; + } + + case TASK_DONE_TAG: + unpackTaskDone (); + break; + + default: + ; + }; + } + } - - int src, tag; - - while (probeMessage (src, tag)) { - - receiveMessage (src, tag); - initMessage (); - /* - char b [1000]; - sprintf (b, "traitement recv %d\n", tag); - printDebugMessage (b); - */ - - switch (tag) { - - case RUNNER_STOP_TAG: - unpackTerminationOfRunner (); - wakeUpCommunicator (); - break; - - case COOP_TAG: - // printDebugMessage ("reception de message de cooperation"); - COOP_ID coop_id; - unpack (coop_id); - getCooperative (coop_id) -> unpack (); - break; - - case SCHED_REQUEST_TAG: - unpackResourceRequest (); - break; - - case SCHED_RESULT_TAG: - { - /* Unpacking the resource */ - SERVICE_ID serv_id; - unpack (serv_id); - Service * serv = getService (serv_id); - int dest; - unpack (dest); - WORKER_ID worker_id; - unpack (worker_id); - - /* Going back ... */ - initMessage (); - pack (worker_id); - pack (serv_id); - serv -> packData (); - serv -> notifySendingData (); - sendMessage (dest, TASK_DATA_TAG); - break; - } - - case TASK_DATA_TAG: - { - WORKER_ID worker_id; - unpack (worker_id); - Worker * worker = getWorker (worker_id); - worker -> setSource (src); - worker -> unpackData (); - worker -> wakeUp (); - break; - } - - case TASK_RESULT_TAG: - { - SERVICE_ID serv_id; - unpack (serv_id); - Service * serv = getService (serv_id); - serv -> unpackResult (); - break; - } - - case TASK_DONE_TAG: - unpackTaskDone (); - break; - - default: - ; - }; - } - - } while (! atLeastOneActiveThread () && atLeastOneActiveRunner () /*&& ! allResourcesFree ()*/); + while (! atLeastOneActiveThread () && atLeastOneActiveRunner () /*&& ! allResourcesFree ()*/); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/recv.h b/trunk/paradiseo-peo/src/rmc/mpi/recv.h index ad6eec330..80ab6bc95 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/recv.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/recv.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp b/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp index 21473a057..2bf011d87 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -43,16 +43,18 @@ static std :: vector ll_threads; /* Low level threads */ -void runRMC () { +void runRMC () +{ /* Worker(s) ? */ - for (unsigned i = 0; i < my_node -> num_workers; i ++) + for (unsigned i = 0; i < my_node -> num_workers; i ++) addThread (new Worker, ll_threads); wakeUpCommunicator (); } -void initRMC (int & __argc, char * * & __argv) { +void initRMC (int & __argc, char * * & __argv) +{ /* Communication */ initCommunication (); @@ -67,7 +69,8 @@ void initRMC (int & __argc, char * * & __argv) { /// } -void finalizeRMC () { +void finalizeRMC () +{ printDebugMessage ("before join threads RMC"); joinThreads (ll_threads); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/runner.cpp b/trunk/paradiseo-peo/src/rmc/mpi/runner.cpp index 2b844a2aa..8015aeb6b 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/runner.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/runner.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,7 +41,8 @@ #include "tags.h" #include "schema.h" -bool Runner :: isLocal () { +bool Runner :: isLocal () +{ for (unsigned i = 0; i < my_node -> id_run.size (); i ++) if (my_node -> id_run [i] == id) @@ -49,13 +50,15 @@ bool Runner :: isLocal () { return false; } -void Runner :: packTermination () { +void Runner :: packTermination () +{ pack (id); } -void Runner :: terminate () { +void Runner :: terminate () +{ - sendToAll (this, RUNNER_STOP_TAG); + sendToAll (this, RUNNER_STOP_TAG); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp index aef662050..1a0d1a0ad 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -47,45 +47,51 @@ static std :: queue requests; /* Requests */ static unsigned initNumberOfRes = 0; -void initScheduler () { - - for (unsigned i = 0; i < the_schema.size (); i ++) { - - const Node & node = the_schema [i]; - - if (node.rk_sched == my_node -> rk) - for (unsigned j = 0; j < node.num_workers; j ++) - resources.push (std :: pair (i, j + 1)); - } +void initScheduler () +{ + + for (unsigned i = 0; i < the_schema.size (); i ++) + { + + const Node & node = the_schema [i]; + + if (node.rk_sched == my_node -> rk) + for (unsigned j = 0; j < node.num_workers; j ++) + resources.push (std :: pair (i, j + 1)); + } initNumberOfRes = resources.size (); } -bool allResourcesFree () { +bool allResourcesFree () +{ return resources.size () == initNumberOfRes; } -static void update () { +static void update () +{ unsigned num_alloc = std :: min (resources.size (), requests.size ()); - - for (unsigned i = 0; i < num_alloc; i ++) { - - SCHED_REQUEST req = requests.front (); - requests.pop (); - - SCHED_RESOURCE res = resources.front (); - resources.pop (); - printDebugMessage ("allocating a resource."); - initMessage (); - pack (req.second); - pack (res); - sendMessage (req.first, SCHED_RESULT_TAG); - } + for (unsigned i = 0; i < num_alloc; i ++) + { + + SCHED_REQUEST req = requests.front (); + requests.pop (); + + SCHED_RESOURCE res = resources.front (); + resources.pop (); + + printDebugMessage ("allocating a resource."); + initMessage (); + pack (req.second); + pack (res); + sendMessage (req.first, SCHED_RESULT_TAG); + } } -void unpackResourceRequest () { +void unpackResourceRequest () +{ printDebugMessage ("queuing a resource request."); SCHED_REQUEST req; @@ -94,7 +100,8 @@ void unpackResourceRequest () { update (); } -void unpackTaskDone () { +void unpackTaskDone () +{ printDebugMessage ("I'm notified a worker is now idle."); SCHED_RESOURCE res; diff --git a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h index cbb61891a..ad95cd552 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -53,7 +53,7 @@ extern void initScheduler (); extern void unpackResourceRequest (); /* Being known a worker is now idle :-) */ -extern void unpackTaskDone (); +extern void unpackTaskDone (); extern bool allResourcesFree (); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp b/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp index 56736ec7a..4a2f22761 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -47,20 +47,22 @@ std :: vector the_schema; Node * my_node; -RANK_ID getRankOfRunner (RUNNER_ID __key) { +RANK_ID getRankOfRunner (RUNNER_ID __key) +{ for (unsigned i = 0; i < the_schema.size (); i ++) for (unsigned j = 0; j < the_schema [i].id_run.size (); j ++) if (the_schema [i].id_run [j] == __key) - return the_schema [i].rk; + return the_schema [i].rk; assert (false); - return 0; + return 0; } -static void loadNode (int __rk_sched) { +static void loadNode (int __rk_sched) +{ Node node; - + node.rk_sched = __rk_sched; /* ATT: name*/ @@ -68,96 +70,106 @@ static void loadNode (int __rk_sched) { /* ATT: num_workers */ node.num_workers = atoi (getAttributeValue ("num_workers").c_str ()); - while (true) { - - /* TAG: | */ - std :: string name = getNextNode (); - assert (name == "runner" || name == "node"); - if (name == "runner") { - /* TAG: */ - node.id_run.push_back (atoi (getNextNode ().c_str ())); - /* TAG: */ - assert (getNextNode () == "runner"); + while (true) + { + + /* TAG: | */ + std :: string name = getNextNode (); + assert (name == "runner" || name == "node"); + if (name == "runner") + { + /* TAG: */ + node.id_run.push_back (atoi (getNextNode ().c_str ())); + /* TAG: */ + assert (getNextNode () == "runner"); + } + else + { + /* TAG: */ + the_schema.push_back (node); + break; + } } - else { - /* TAG: */ - the_schema.push_back (node); - break; - } - } } -static void loadGroup () { +static void loadGroup () +{ std :: string name; - + /* ATT: scheduler*/ int rk_sched = getRankFromName (getAttributeValue ("scheduler")); - - while (true) { - /* TAG: | */ - name = getNextNode (); - assert (name == "node" || name == "group"); - if (name == "node") - /* TAG: */ - loadNode (rk_sched); - else - /* TAG: */ - break; - } + while (true) + { + + /* TAG: | */ + name = getNextNode (); + assert (name == "node" || name == "group"); + if (name == "node") + /* TAG: */ + loadNode (rk_sched); + else + /* TAG: */ + break; + } } -bool isScheduleNode () { - +bool isScheduleNode () +{ + return my_node -> rk == my_node -> rk_sched; } -void loadSchema (const char * __filename) { - +void loadSchema (const char * __filename) +{ + openXMLDocument (__filename); - + std :: string name; - + /* TAG: */ name = getNextNode (); assert (name == "schema"); - - while (true) { - /* TAG: | */ - name = getNextNode (); - assert (name == "group" || name == "schema"); - if (name == "group") - /* TAG: */ - loadGroup (); - else - /* TAG: */ - break; - } + while (true) + { + + /* TAG: | */ + name = getNextNode (); + assert (name == "group" || name == "schema"); + if (name == "group") + /* TAG: */ + loadGroup (); + else + /* TAG: */ + break; + } /* Looking for my node */ for (unsigned i = 0; i < the_schema.size (); i ++) if (the_schema [i].rk == getNodeRank ()) my_node = & (the_schema [i]); - + /* About me */ char mess [1000]; - + sprintf (mess, "my rank is %d", my_node -> rk); printDebugMessage (mess); if (isScheduleNode ()) - printDebugMessage ("I'am a scheduler"); - for (unsigned i = 0; i < my_node -> id_run.size (); i ++) { - sprintf (mess, "I manage the runner %d", my_node -> id_run [i]); - printDebugMessage (mess); - } - if (my_node -> num_workers) { - - sprintf (mess, "I manage %d worker(s)", my_node -> num_workers); - printDebugMessage (mess); - } - + printDebugMessage ("I'am a scheduler"); + for (unsigned i = 0; i < my_node -> id_run.size (); i ++) + { + sprintf (mess, "I manage the runner %d", my_node -> id_run [i]); + printDebugMessage (mess); + } + if (my_node -> num_workers) + { + + sprintf (mess, "I manage %d worker(s)", my_node -> num_workers); + printDebugMessage (mess); + } + closeXMLDocument (); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/schema.h b/trunk/paradiseo-peo/src/rmc/mpi/schema.h index 5982bf41b..a67d7e851 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/schema.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/schema.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -45,14 +45,15 @@ typedef int RANK_ID; -struct Node { - - RANK_ID rk; /* Rank */ - std :: string name; /* Host name */ - unsigned num_workers; /* Number of parallel workers */ - int rk_sched; /* rank of the scheduler */ - std :: vector id_run; /* List of runners */ -}; +struct Node + { + + RANK_ID rk; /* Rank */ + std :: string name; /* Host name */ + unsigned num_workers; /* Number of parallel workers */ + int rk_sched; /* rank of the scheduler */ + std :: vector id_run; /* List of runners */ + }; extern std :: vector the_schema; diff --git a/trunk/paradiseo-peo/src/rmc/mpi/send.cpp b/trunk/paradiseo-peo/src/rmc/mpi/send.cpp index f2209884b..797ccf9f1 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/send.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/send.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -49,26 +49,30 @@ #define TO_ALL -1 -typedef struct { +typedef struct + { - Communicable * comm; - int to; - int tag; + Communicable * comm; + int to; + int tag; + + } +SEND_REQUEST; -} SEND_REQUEST; - static std :: queue mess; static sem_t sem_send; -void initSending () { +void initSending () +{ sem_init (& sem_send, 0, 1); } -void send (Communicable * __comm, int __to, int __tag) { +void send (Communicable * __comm, int __to, int __tag) +{ - SEND_REQUEST req; + SEND_REQUEST req; req.comm = __comm; req.to = __to; req.tag = __tag; @@ -79,66 +83,70 @@ void send (Communicable * __comm, int __to, int __tag) { wakeUpCommunicator (); } -void sendToAll (Communicable * __comm, int __tag) { - +void sendToAll (Communicable * __comm, int __tag) +{ + send (__comm, TO_ALL, __tag); } -void sendMessages () { +void sendMessages () +{ sem_wait (& sem_send); - while (! mess.empty ()) { - - SEND_REQUEST req = mess.front (); - /* - char b [1000]; - sprintf (b, "traitement send %d\n", req.tag); - printDebugMessage (b); - */ - - Communicable * comm = req.comm; + while (! mess.empty ()) + { - initMessage (); + SEND_REQUEST req = mess.front (); + /* + char b [1000]; + sprintf (b, "traitement send %d\n", req.tag); + printDebugMessage (b); + */ - switch (req.tag) { + Communicable * comm = req.comm; - case RUNNER_STOP_TAG: - dynamic_cast (comm) -> packTermination (); - dynamic_cast (comm) -> notifySendingTermination (); - break; + initMessage (); - case COOP_TAG: - dynamic_cast (comm) -> pack (); - dynamic_cast (comm) -> notifySending (); - break; - - case SCHED_REQUEST_TAG: - dynamic_cast (comm) -> packResourceRequest (); - dynamic_cast (comm) -> notifySendingResourceRequest (); - break; + switch (req.tag) + { - case TASK_RESULT_TAG: - dynamic_cast (comm) -> packResult (); - dynamic_cast (comm) -> notifySendingResult (); - break; + case RUNNER_STOP_TAG: + dynamic_cast (comm) -> packTermination (); + dynamic_cast (comm) -> notifySendingTermination (); + break; - case TASK_DONE_TAG: - dynamic_cast (comm) -> packTaskDone (); - dynamic_cast (comm) -> notifySendingTaskDone (); - break; - - default : - break; + case COOP_TAG: + dynamic_cast (comm) -> pack (); + dynamic_cast (comm) -> notifySending (); + break; - }; - - if (req.to == TO_ALL) - sendMessageToAll (req.tag); - else - sendMessage (req.to, req.tag); - mess.pop (); - } + case SCHED_REQUEST_TAG: + dynamic_cast (comm) -> packResourceRequest (); + dynamic_cast (comm) -> notifySendingResourceRequest (); + break; - sem_post (& sem_send); + case TASK_RESULT_TAG: + dynamic_cast (comm) -> packResult (); + dynamic_cast (comm) -> notifySendingResult (); + break; + + case TASK_DONE_TAG: + dynamic_cast (comm) -> packTaskDone (); + dynamic_cast (comm) -> notifySendingTaskDone (); + break; + + default : + break; + + }; + + if (req.to == TO_ALL) + sendMessageToAll (req.tag); + else + sendMessage (req.to, req.tag); + mess.pop (); + } + + sem_post (& sem_send); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/send.h b/trunk/paradiseo-peo/src/rmc/mpi/send.h index b1bdc2300..deccf1799 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/send.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/send.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/rmc/mpi/service.cpp b/trunk/paradiseo-peo/src/rmc/mpi/service.cpp index f26f70b3d..8c7dbfa5d 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/service.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/service.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,14 +41,16 @@ #include "send.h" #include "scheduler.h" -void Service :: requestResourceRequest (unsigned __how_many) { +void Service :: requestResourceRequest (unsigned __how_many) +{ num_sent_rr = __how_many; for (unsigned i = 0; i < __how_many; i ++) send (this, my_node -> rk_sched, SCHED_REQUEST_TAG); } -void Service :: packResourceRequest () { +void Service :: packResourceRequest () +{ SCHED_REQUEST req; req.first = getNodeRank (); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/tags.h b/trunk/paradiseo-peo/src/rmc/mpi/tags.h index 3e4e15009..419d5bd18 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/tags.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/tags.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp b/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp index 53ad72925..bace07829 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -46,76 +46,88 @@ static std :: vector key_to_worker (1); /* Vector of registered workers */ -Worker * getWorker (WORKER_ID __key) { +Worker * getWorker (WORKER_ID __key) +{ - return key_to_worker [__key]; + return key_to_worker [__key]; } -Worker :: Worker () { - +Worker :: Worker () +{ + toto = false; id = key_to_worker.size (); key_to_worker.push_back (this); } -void Worker :: packResult () { - +void Worker :: packResult () +{ + pack (serv_id); - serv -> packResult (); + serv -> packResult (); } -void Worker :: unpackData () { +void Worker :: unpackData () +{ printDebugMessage ("unpacking the ID. of the service."); unpack (serv_id); - serv = getService (serv_id); + serv = getService (serv_id); printDebugMessage ("found the service."); - serv -> unpackData (); + serv -> unpackData (); printDebugMessage ("unpacking the data."); setActive (); } -void Worker :: packTaskDone () { +void Worker :: packTaskDone () +{ pack (getNodeRank ()); pack (id); } -void Worker :: notifySendingResult () { +void Worker :: notifySendingResult () +{ /* Notifying the scheduler of the termination */ toto = true; wakeUp (); } -void Worker :: notifySendingTaskDone () { +void Worker :: notifySendingTaskDone () +{ setPassive (); } - -void Worker :: setSource (int __rank) { + +void Worker :: setSource (int __rank) +{ src = __rank; } -void Worker :: start () { +void Worker :: start () +{ - while (true) { - - sleep (); + while (true) + { - if (! atLeastOneActiveRunner ()) - break; - - if (toto) { - send (this, my_node -> rk_sched, TASK_DONE_TAG); - toto = false; + sleep (); + + if (! atLeastOneActiveRunner ()) + break; + + if (toto) + { + send (this, my_node -> rk_sched, TASK_DONE_TAG); + toto = false; + } + else + { + + printDebugMessage ("executing the task."); + serv -> execute (); + send (this, src, TASK_RESULT_TAG); + } } - else { - - printDebugMessage ("executing the task."); - serv -> execute (); - send (this, src, TASK_RESULT_TAG); - } - } } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/worker.h b/trunk/paradiseo-peo/src/rmc/mpi/worker.h index 43c4ec62c..008812e54 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/worker.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/worker.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,37 +41,38 @@ #include "../../core/reac_thread.h" #include "../../core/service.h" -typedef unsigned WORKER_ID; +typedef unsigned WORKER_ID; -class Worker : public Communicable, public ReactiveThread { +class Worker : public Communicable, public ReactiveThread + { -public : + public : - Worker (); + Worker (); - void start (); + void start (); - void packResult (); + void packResult (); - void unpackData (); + void unpackData (); - void packTaskDone (); + void packTaskDone (); - void notifySendingResult (); + void notifySendingResult (); - void notifySendingTaskDone (); - - void setSource (int __rank); - -private : + void notifySendingTaskDone (); - WORKER_ID id; - SERVICE_ID serv_id; - Service * serv; - int src; + void setSource (int __rank); - bool toto; -}; + private : + + WORKER_ID id; + SERVICE_ID serv_id; + Service * serv; + int src; + + bool toto; + }; extern Worker * getWorker (WORKER_ID __key); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp b/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp index 1f044ba90..ddfd4a770 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,51 +40,59 @@ static xmlTextReaderPtr reader; -void openXMLDocument (const char * __filename) { - +void openXMLDocument (const char * __filename) +{ + reader = xmlNewTextReaderFilename (__filename); - - if (! reader) { - - fprintf (stderr, "unable to open '%s'.\n", __filename); - exit (1); - } + + if (! reader) + { + + fprintf (stderr, "unable to open '%s'.\n", __filename); + exit (1); + } } -void closeXMLDocument () { +void closeXMLDocument () +{ xmlFreeTextReader (reader); } -std :: string getAttributeValue (const std :: string & __attr) { - +std :: string getAttributeValue (const std :: string & __attr) +{ + xmlChar * value = xmlTextReaderGetAttribute (reader, (const xmlChar *) __attr.c_str ()); - + std :: string str ((const char *) value); - + xmlFree (value); - + return str; } -static bool isSep (const xmlChar * __text) { - +static bool isSep (const xmlChar * __text) +{ + for (unsigned i = 0; i < strlen ((char *) __text); i ++) if (__text [i] != ' ' && __text [i] != '\t' && __text [i] != '\n') return false; return true; } -std :: string getNextNode () { - +std :: string getNextNode () +{ + xmlChar * name, * value; - do { - xmlTextReaderRead (reader); - name = xmlTextReaderName (reader); - value = xmlTextReaderValue (reader); - // printf ("value = %s\n", value); - } while (! strcmp ((char *) name, "#text") && isSep (value)); + do + { + xmlTextReaderRead (reader); + name = xmlTextReaderName (reader); + value = xmlTextReaderValue (reader); + // printf ("value = %s\n", value); + } + while (! strcmp ((char *) name, "#text") && isSep (value)); std :: string str; @@ -92,12 +100,12 @@ std :: string getNextNode () { str.assign ((char *) name); else str.assign ((char *) value); - + if (name) xmlFree (name); if (value) xmlFree (value); - + return str; } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.h b/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.h index b54fbeed9..89cc7b5be 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/test/t-peo.cpp b/trunk/paradiseo-peo/test/t-peo.cpp index 2772a1fe0..a0742284b 100644 --- a/trunk/paradiseo-peo/test/t-peo.cpp +++ b/trunk/paradiseo-peo/test/t-peo.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp b/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp index 9c2b8a66d..cf8830459 100644 --- a/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp +++ b/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,92 +39,93 @@ #include -#define N 4 +#define N 4 typedef eoRealParticle < double >Indi; double f (const Indi & _indi) { - const double PI = 4.0 * atan(1.0); - double sum=0.; - for (unsigned i = 0; i < _indi.size()-1; i++) - sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); - sum+=pow(sin(3*PI*_indi[0]),2); - sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); - return (-sum); - + const double PI = 4.0 * atan(1.0); + double sum=0.; + for (unsigned i = 0; i < _indi.size()-1; i++) + sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); + sum+=pow(sin(3*PI*_indi[0]),2); + sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); + return (-sum); + } -template < class POT > class eoPrint : public eoContinue -{ - public : - - bool operator () (const eoPop & __pop) - { - double result[__pop.size()]; - for(unsigned i=0;i<__pop.size();i++) - result[i]=__pop[i].best(); - std::sort(result,result+__pop.size()); - std::cout << "\n"< class eoPrint : public eoContinue + { + public : + + bool operator () (const eoPop & __pop) + { + double result[__pop.size()]; + for (unsigned i=0;i<__pop.size();i++) + result[i]=__pop[i].best(); + std::sort(result,result+__pop.size()); + std::cout << "\n"< plainEvalSeq(f); - eoEvalFuncCounter < Indi > evalSeq (plainEvalSeq); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - eoFirstIsBestInit < Indi > localInit; - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoPop < Indi > popSeq; - popSeq.append (POP_SIZE, random); - apply(evalSeq, popSeq);; - apply < Indi > (veloRandom, popSeq); - apply < Indi > (localInit, popSeq); - eoLinearTopology topologySeq(NEIGHBORHOOD_SIZE); - topologySeq.setup(popSeq); - eoRealVectorBounds bndsSeq(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocitySeq (topologySeq,C1,C2,bndsSeq); - eoGenContinue < Indi > genContSeq (MAX_GEN); - eoPrint printSeq; - eoCombinedContinue continuatorSeq(genContSeq); - continuatorSeq.add(printSeq); - eoCheckPoint checkpointSeq(continuatorSeq); - eoSyncEasyPSO < Indi > psaSeq(checkpointSeq, evalSeq, velocitySeq, flight); - psaSeq (popSeq); - popSeq.sort (); + + const unsigned int VEC_SIZE = 4; + const unsigned int POP_SIZE = 10; + const unsigned int NEIGHBORHOOD_SIZE= 5; + const unsigned int MAX_GEN = 100; + const double INIT_POSITION_MIN = -50.0; + const double INIT_POSITION_MAX = 50.0; + const double INIT_VELOCITY_MIN = -1; + const double INIT_VELOCITY_MAX = 1; + const double C1 = 0.5; + const double C2 = 2; + rng.reseed (44); + std::cout<<"\n\nWith one PSO\n\n"; + eoEvalFuncPtr plainEvalSeq(f); + eoEvalFuncCounter < Indi > evalSeq (plainEvalSeq); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > popSeq; + popSeq.append (POP_SIZE, random); + apply(evalSeq, popSeq); + ; + apply < Indi > (veloRandom, popSeq); + apply < Indi > (localInit, popSeq); + eoLinearTopology topologySeq(NEIGHBORHOOD_SIZE); + topologySeq.setup(popSeq); + eoRealVectorBounds bndsSeq(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocitySeq (topologySeq,C1,C2,bndsSeq); + eoGenContinue < Indi > genContSeq (MAX_GEN); + eoPrint printSeq; + eoCombinedContinue continuatorSeq(genContSeq); + continuatorSeq.add(printSeq); + eoCheckPoint checkpointSeq(continuatorSeq); + eoSyncEasyPSO < Indi > psaSeq(checkpointSeq, evalSeq, velocitySeq, flight); + psaSeq (popSeq); + popSeq.sort (); } void peoPSOPara() -{ - char *tmp="mpiexec -n ",*tmp2=" ./t-peoPSOParaIsland @lesson.param ",tmp3[4],buffer[256]; - sprintf(tmp3,"%d",N); - strcpy(buffer,tmp); - strcat(buffer,tmp3); - strcat(buffer,tmp2); - system(buffer); +{ + char *tmp="mpiexec -n ",*tmp2=" ./t-peoPSOParaIsland @lesson.param ",tmp3[4],buffer[256]; + sprintf(tmp3,"%d",N); + strcpy(buffer,tmp); + strcat(buffer,tmp3); + strcat(buffer,tmp2); + system(buffer); } int main (int __argc, char *__argv[]) -{ +{ - peoPSOSeq (); - peoPSOPara(); + peoPSOSeq (); + peoPSOPara(); } diff --git a/trunk/paradiseo-peo/test/t-peoPSO.cpp b/trunk/paradiseo-peo/test/t-peoPSO.cpp index 90cb5e349..936f0b04a 100644 --- a/trunk/paradiseo-peo/test/t-peoPSO.cpp +++ b/trunk/paradiseo-peo/test/t-peoPSO.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,81 +39,82 @@ #include -#define N 4 +#define N 4 typedef eoRealParticle < double >Indi; double f (const Indi & _indi) { - double sum = 0; - for (unsigned i = 0; i < _indi.size (); i++) - sum += pow(_indi[i],2); - return (-sum); + double sum = 0; + for (unsigned i = 0; i < _indi.size (); i++) + sum += pow(_indi[i],2); + return (-sum); } double peoPSOSeq () { - clock_t beginSeq,endSeq; - double timeSeq; - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 10; - const unsigned int NEIGHBORHOOD_SIZE= 5; - const unsigned int MAX_GEN = 5000; - const double FIT_CONT = -1e-6; - const double INIT_POSITION_MIN = -5.0; - const double INIT_POSITION_MAX = 5.0; - const double INIT_VELOCITY_MIN = -1; - const double INIT_VELOCITY_MAX = 1; - const double C1 = 2; - const double C2 = 2; - rng.reseed (36); - beginSeq=clock(); - eoEvalFuncPtr plainEvalSeq(f); - eoEvalFuncCounter < Indi > evalSeq (plainEvalSeq); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - eoFirstIsBestInit < Indi > localInit; - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoPop < Indi > popSeq; - popSeq.append (POP_SIZE, random); - apply(evalSeq, popSeq);; - apply < Indi > (veloRandom, popSeq); - apply < Indi > (localInit, popSeq); - eoLinearTopology topologySeq(NEIGHBORHOOD_SIZE); - topologySeq.setup(popSeq); - eoRealVectorBounds bndsSeq(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocitySeq (topologySeq,C1,C2,bndsSeq); - eoGenContinue < Indi > genContSeq (MAX_GEN); - eoFitContinue < Indi > fitContSeq (FIT_CONT); - eoCombinedContinue continuatorSeq (genContSeq); - continuatorSeq.add(fitContSeq); - eoCheckPoint checkpointSeq(continuatorSeq); - eoSyncEasyPSO < Indi > psaSeq(checkpointSeq, evalSeq, velocitySeq, flight); + clock_t beginSeq,endSeq; + double timeSeq; + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 10; + const unsigned int NEIGHBORHOOD_SIZE= 5; + const unsigned int MAX_GEN = 5000; + const double FIT_CONT = -1e-6; + const double INIT_POSITION_MIN = -5.0; + const double INIT_POSITION_MAX = 5.0; + const double INIT_VELOCITY_MIN = -1; + const double INIT_VELOCITY_MAX = 1; + const double C1 = 2; + const double C2 = 2; + rng.reseed (36); + beginSeq=clock(); + eoEvalFuncPtr plainEvalSeq(f); + eoEvalFuncCounter < Indi > evalSeq (plainEvalSeq); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > popSeq; + popSeq.append (POP_SIZE, random); + apply(evalSeq, popSeq); + ; + apply < Indi > (veloRandom, popSeq); + apply < Indi > (localInit, popSeq); + eoLinearTopology topologySeq(NEIGHBORHOOD_SIZE); + topologySeq.setup(popSeq); + eoRealVectorBounds bndsSeq(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocitySeq (topologySeq,C1,C2,bndsSeq); + eoGenContinue < Indi > genContSeq (MAX_GEN); + eoFitContinue < Indi > fitContSeq (FIT_CONT); + eoCombinedContinue continuatorSeq (genContSeq); + continuatorSeq.add(fitContSeq); + eoCheckPoint checkpointSeq(continuatorSeq); + eoSyncEasyPSO < Indi > psaSeq(checkpointSeq, evalSeq, velocitySeq, flight); //Sequential - psaSeq (popSeq); - popSeq.sort (); - endSeq=clock(); - timeSeq = endSeq-beginSeq; - return timeSeq; + psaSeq (popSeq); + popSeq.sort (); + endSeq=clock(); + timeSeq = endSeq-beginSeq; + return timeSeq; } void peoPSOPara(long int arg) -{ - char *tmp="mpiexec -n ",*tmp2=" ./t-peoPSOPara @lesson.param ",tmp3[4],buffer[256]; - sprintf(tmp3,"%d",N); - strcpy(buffer,tmp); - strcat(buffer,tmp3); - strcat(buffer,tmp2); - sprintf(tmp3,"%ld",arg); - strcat(buffer,tmp3); - system(buffer); +{ + char *tmp="mpiexec -n ",*tmp2=" ./t-peoPSOPara @lesson.param ",tmp3[4],buffer[256]; + sprintf(tmp3,"%d",N); + strcpy(buffer,tmp); + strcat(buffer,tmp3); + strcat(buffer,tmp2); + sprintf(tmp3,"%ld",arg); + strcat(buffer,tmp3); + system(buffer); } int main (int __argc, char *__argv[]) -{ - long int timeSeq; - timeSeq=(long int)peoPSOSeq (); - peoPSOPara(timeSeq); +{ + long int timeSeq; + timeSeq=(long int)peoPSOSeq (); + peoPSOPara(timeSeq); } diff --git a/trunk/paradiseo-peo/test/t-peoPSOPara.cpp b/trunk/paradiseo-peo/test/t-peoPSOPara.cpp index 1ae3d10cf..275bf3b21 100644 --- a/trunk/paradiseo-peo/test/t-peoPSOPara.cpp +++ b/trunk/paradiseo-peo/test/t-peoPSOPara.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,64 +44,64 @@ typedef eoRealParticle < double >Indi; double f (const Indi & _indi) { - double sum = 0; - for (unsigned i = 0; i < _indi.size (); i++) - sum += pow(_indi[i],2); - return (-sum); + double sum = 0; + for (unsigned i = 0; i < _indi.size (); i++) + sum += pow(_indi[i],2); + return (-sum); } int main (int __argc, char *__argv[]) { - peo :: init( __argc, __argv ); - clock_t begin,end; - double time; - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 10; - const unsigned int NEIGHBORHOOD_SIZE= 5; - const unsigned int MAX_GEN = 500; - const double FIT_CONT = -1e-6; - const double INIT_POSITION_MIN = -5.0; - const double INIT_POSITION_MAX = 5.0; - const double INIT_VELOCITY_MIN = -1; - const double INIT_VELOCITY_MAX = 1; - const double C1 = 2; - const double C2 = 2; - rng.reseed (36); - if((isScheduleNode())&&(__argc >= 3)) - begin=clock(); - peoEvalFuncPSO plainEvalPara(f); - eoEvalFuncCounter < Indi > evalStartPara (plainEvalPara); - peoParaPopEval< Indi > evalPara(plainEvalPara); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - eoFirstIsBestInit < Indi > localInit; - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoPop < Indi > popPara; - popPara.append (POP_SIZE, random); - apply(evalStartPara, popPara); - apply < Indi > (veloRandom, popPara); - apply < Indi > (localInit, popPara); - eoLinearTopology topologyPara(NEIGHBORHOOD_SIZE); - topologyPara.setup(popPara); - eoRealVectorBounds bndsPara(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocityPara (topologyPara,C1,C2,bndsPara); - eoGenContinue < Indi > genContPara (MAX_GEN); - eoFitContinue < Indi > fitContPara (FIT_CONT); - eoCombinedContinue continuatorPara (genContPara); - continuatorPara.add(fitContPara); - eoCheckPoint checkpointPara(continuatorPara); - peoPSO < Indi > psaPara(checkpointPara, evalPara, velocityPara, flight); - psaPara(popPara); - peo :: run(); - peo :: finalize(); - if((isScheduleNode())&&(__argc >= 3)) + peo :: init( __argc, __argv ); + clock_t begin,end; + double time; + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 10; + const unsigned int NEIGHBORHOOD_SIZE= 5; + const unsigned int MAX_GEN = 500; + const double FIT_CONT = -1e-6; + const double INIT_POSITION_MIN = -5.0; + const double INIT_POSITION_MAX = 5.0; + const double INIT_VELOCITY_MIN = -1; + const double INIT_VELOCITY_MAX = 1; + const double C1 = 2; + const double C2 = 2; + rng.reseed (36); + if ((isScheduleNode())&&(__argc >= 3)) + begin=clock(); + peoEvalFuncPSO plainEvalPara(f); + eoEvalFuncCounter < Indi > evalStartPara (plainEvalPara); + peoParaPopEval< Indi > evalPara(plainEvalPara); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > popPara; + popPara.append (POP_SIZE, random); + apply(evalStartPara, popPara); + apply < Indi > (veloRandom, popPara); + apply < Indi > (localInit, popPara); + eoLinearTopology topologyPara(NEIGHBORHOOD_SIZE); + topologyPara.setup(popPara); + eoRealVectorBounds bndsPara(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocityPara (topologyPara,C1,C2,bndsPara); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoFitContinue < Indi > fitContPara (FIT_CONT); + eoCombinedContinue continuatorPara (genContPara); + continuatorPara.add(fitContPara); + eoCheckPoint checkpointPara(continuatorPara); + peoPSO < Indi > psaPara(checkpointPara, evalPara, velocityPara, flight); + psaPara(popPara); + peo :: run(); + peo :: finalize(); + if ((isScheduleNode())&&(__argc >= 3)) { - end=clock(); - time=end-begin; - std::cout<<"\n\nEfficiency : "<<(atoi(__argv[2])/(time*getNumberOfNodes()))<<"\n"; + end=clock(); + time=end-begin; + std::cout<<"\n\nEfficiency : "<<(atoi(__argv[2])/(time*getNumberOfNodes()))<<"\n"; } - return 1; + return 1; } diff --git a/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp b/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp index 975d8bdbf..0d6690da6 100644 --- a/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp +++ b/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -44,32 +44,32 @@ typedef eoRealParticle < double >Indi; //Evaluation function double f (const Indi & _indi) -{ +{ + + const double PI = 4.0 * atan(1.0); + double sum=0.; + for (unsigned i = 0; i < _indi.size()-1; i++) + sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); + sum+=pow(sin(3*PI*_indi[0]),2); + sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); + return (-sum); - const double PI = 4.0 * atan(1.0); - double sum=0.; - for (unsigned i = 0; i < _indi.size()-1; i++) - sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); - sum+=pow(sin(3*PI*_indi[0]),2); - sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); - return (-sum); - } -template < class POT > class eoPrint : public eoContinue -{ - public : - - bool operator () (const eoPop & __pop) - { - double result[__pop.size()]; - for(unsigned i=0;i<__pop.size();i++) - result[i]=__pop[i].best(); - std::sort(result,result+__pop.size()); - std::cout << "\n"< class eoPrint : public eoContinue + { + public : + + bool operator () (const eoPop & __pop) + { + double result[__pop.size()]; + for (unsigned i=0;i<__pop.size();i++) + result[i]=__pop[i].best(); + std::sort(result,result+__pop.size()); + std::cout << "\n"< plainEval(f); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - eoFirstIsBestInit < Indi > localInit; - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoEvalFuncCounter < Indi > evalSeq (plainEval); - peoParaPopEval< Indi > eval(plainEval); - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - apply(evalSeq, pop); - apply < Indi > (veloRandom, pop); - apply < Indi > (localInit, pop); - eoLinearTopology topology(NEIGHBORHOOD_SIZE); - topology.setup(pop); - eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); - eoGenContinue < Indi > genContPara (MAX_GEN); - eoPrint print; - eoCombinedContinue continuator(genContPara); - continuator.add(print); - eoCheckPoint checkpoint(continuator); - RingTopology topologyMig; - /*******************************************************************/ - eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); - peoPSOSelect mig_selec(topology); - eoSelectNumber< Indi > mig_select(mig_selec); - peoPSOReplacement mig_replace; -/*****************************************************************/ - - peoEvalFuncPSO plainEval2(f); - eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); - eoFirstIsBestInit < Indi > localInit2; - eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight2(bndsFlight2); - eoEvalFuncCounter < Indi > evalSeq2 (plainEval2); - peoParaPopEval< Indi > eval2(plainEval2); - eoPop < Indi > pop2; - pop2.append (POP_SIZE, random2); - apply(evalSeq2, pop2); - apply < Indi > (veloRandom2, pop2); - apply < Indi > (localInit2, pop2); - eoLinearTopology topology2(NEIGHBORHOOD_SIZE); - topology2.setup(pop2); - eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); - eoGenContinue < Indi > genContPara2 (MAX_GEN); - eoCheckPoint checkpoint2(genContPara2); - /*******************************************************************/ - eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); - peoPSOSelect mig_selec2(topology2); - eoSelectNumber< Indi > mig_select2(mig_selec2); - peoPSOReplacement mig_replace2; - peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); - checkpoint.add( mig ); - peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop); - checkpoint2.add( mig2 ); - - peoPSO < Indi > psa(checkpoint, eval, velocity, flight); - mig.setOwner( psa ); - psa(pop); - peoPSO < Indi > psa2(checkpoint2, eval2, velocity2, flight2); - mig2.setOwner( psa2 ); - psa2(pop2); - - peo :: run(); - peo :: finalize(); + const unsigned int MIG_FREQ = 1; + const unsigned int VEC_SIZE = 4; + const unsigned int POP_SIZE = 10; + const unsigned int NEIGHBORHOOD_SIZE= 5; + const unsigned int MAX_GEN = 100; + const double INIT_POSITION_MIN = -50.0; + const double INIT_POSITION_MAX = 50.0; + const double INIT_VELOCITY_MIN = -1; + const double INIT_VELOCITY_MAX = 1; + const double C1 = 0.5; + const double C2 = 2; + rng.reseed (44); + if (getNodeRank()==1) + std::cout<<"\n\nWith two islands\n\n"; + peoEvalFuncPSO plainEval(f); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoEvalFuncCounter < Indi > evalSeq (plainEval); + peoParaPopEval< Indi > eval(plainEval); + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + apply(evalSeq, pop); + apply < Indi > (veloRandom, pop); + apply < Indi > (localInit, pop); + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + topology.setup(pop); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoPrint print; + eoCombinedContinue continuator(genContPara); + continuator.add(print); + eoCheckPoint checkpoint(continuator); + RingTopology topologyMig; + /*******************************************************************/ + eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); + peoPSOSelect mig_selec(topology); + eoSelectNumber< Indi > mig_select(mig_selec); + peoPSOReplacement mig_replace; + /*****************************************************************/ + + peoEvalFuncPSO plainEval2(f); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); + eoFirstIsBestInit < Indi > localInit2; + eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight2(bndsFlight2); + eoEvalFuncCounter < Indi > evalSeq2 (plainEval2); + peoParaPopEval< Indi > eval2(plainEval2); + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + apply(evalSeq2, pop2); + apply < Indi > (veloRandom2, pop2); + apply < Indi > (localInit2, pop2); + eoLinearTopology topology2(NEIGHBORHOOD_SIZE); + topology2.setup(pop2); + eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCheckPoint checkpoint2(genContPara2); + /*******************************************************************/ + eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); + peoPSOSelect mig_selec2(topology2); + eoSelectNumber< Indi > mig_select2(mig_selec2); + peoPSOReplacement mig_replace2; + + peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); + checkpoint.add( mig ); + peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop); + checkpoint2.add( mig2 ); + + peoPSO < Indi > psa(checkpoint, eval, velocity, flight); + mig.setOwner( psa ); + psa(pop); + peoPSO < Indi > psa2(checkpoint2, eval2, velocity2, flight2); + mig2.setOwner( psa2 ); + psa2(pop2); + + peo :: run(); + peo :: finalize(); } diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson1/mainEA.cpp index c75b610b8..7a4169e6c 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson1/mainEA.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson1/mainEA.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -42,15 +42,15 @@ typedef eoReal Indi; //Evaluation function double f (const Indi & _indi) -{ - // Rosenbrock function f(x) = 100*(x[1]-x[0]^2)^2+(1-x[0])^2 - // => optimal : f* = 0 , with x* =(1,1) - - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + // Rosenbrock function f(x) = 100*(x[1]-x[0]^2)^2+(1-x[0])^2 + // => optimal : f* = 0 , with x* =(1,1) + + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) @@ -58,68 +58,68 @@ int main (int __argc, char *__argv[]) // Initialization of the parallel environment : thanks this instruction, ParadisEO-PEO can initialize himself - peo :: init( __argc, __argv ); + peo :: init( __argc, __argv ); //Parameters - const unsigned int VEC_SIZE = 2; // Don't change this parameter when you are resolving the Rosenbrock function - const unsigned int POP_SIZE = 20; // As with a sequential algorithm, you change the size of the population - const unsigned int MAX_GEN = 300; // Define the number of maximal generation - const double INIT_POSITION_MIN = -2.0; // For initialize x - const double INIT_POSITION_MAX = 2.0; // In the case of the Rosenbrock function : -2 < x[i] < 2 - const float CROSS_RATE = 0.8; // Crossover rate - const double EPSILON = 0.01; // Range for real uniform mutation - const float MUT_RATE = 0.3; // Mutation rate - rng.reseed (time(0)); - + const unsigned int VEC_SIZE = 2; // Don't change this parameter when you are resolving the Rosenbrock function + const unsigned int POP_SIZE = 20; // As with a sequential algorithm, you change the size of the population + const unsigned int MAX_GEN = 300; // Define the number of maximal generation + const double INIT_POSITION_MIN = -2.0; // For initialize x + const double INIT_POSITION_MAX = 2.0; // In the case of the Rosenbrock function : -2 < x[i] < 2 + const float CROSS_RATE = 0.8; // Crossover rate + const double EPSILON = 0.01; // Range for real uniform mutation + const float MUT_RATE = 0.3; // Mutation rate + rng.reseed (time(0)); + // Stopping - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCombinedContinue continuatorPara (genContPara); - eoCheckPoint checkpoint(continuatorPara); - - - /* In this lesson, you should define a peoEvalFunc witch will allow to initialize : - * - * - peoSeqPopEval : using to the sequential evaluation - * - * OR - * - * - peoParaPopEval : using to the parallel evaluation - * - */ + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + + + /* In this lesson, you should define a peoEvalFunc witch will allow to initialize : + * + * - peoSeqPopEval : using to the sequential evaluation + * + * OR + * + * - peoParaPopEval : using to the parallel evaluation + * + */ // For a parallel evaluation - peoEvalFunc plainEval(f); - peoParaPopEval< Indi > eval(plainEval); - - -// Initialization - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - + peoEvalFunc plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + + +// Initialization + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + // Selection - eoRankingSelect selectionStrategy; - eoSelectNumber select(selectionStrategy,POP_SIZE); - + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + // Transformation - eoSegmentCrossover crossover; // Crossover - eoUniformMutation mutation(EPSILON); // Mutation - eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); - peoSeqTransform eaTransform(transform); - + eoSegmentCrossover crossover; // Crossover + eoUniformMutation mutation(EPSILON); // Mutation + eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + peoSeqTransform eaTransform(transform); + // Replacement - eoPlusReplacement replace; - + eoPlusReplacement replace; + // Creation of the population - eoPop < Indi > pop; - pop.append (POP_SIZE, random); + eoPop < Indi > pop; + pop.append (POP_SIZE, random); //Parallel algorithm - peoEA Algo(checkpoint,eval,select,eaTransform,replace); - Algo(pop); - - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) - std::cout << "Final population :\n" << pop << std::endl; + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + Algo(pop); + + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) + std::cout << "Final population :\n" << pop << std::endl; } diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp b/trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp index 6ebeba39d..75d9a1abc 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -41,15 +41,15 @@ typedef eoRealParticle < double >Indi; //Evaluation function double f (const Indi & _indi) -{ - // Rosenbrock function f(x) = 100*(x[1]-x[0]^2)^2+(1-x[0])^2 - // => optimal : f* = 0 , with x* =(1,1) - - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + // Rosenbrock function f(x) = 100*(x[1]-x[0]^2)^2+(1-x[0])^2 + // => optimal : f* = 0 , with x* =(1,1) + + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) @@ -57,86 +57,86 @@ int main (int __argc, char *__argv[]) // Initialization of the parallel environment : thanks this instruction, ParadisEO-PEO can initialize himself - peo :: init( __argc, __argv ); + peo :: init( __argc, __argv ); //Parameters - const unsigned int VEC_SIZE = 2; // Don't change this parameter when you are resolving the Rosenbrock function - - const unsigned int POP_SIZE = 20; // As with a sequential algorithm, you change the size of the population - - const unsigned int NEIGHBORHOOD_SIZE= 6; // This parameter define the neighborhoods in the PSO's topology - - const unsigned int MAX_GEN = 150; // Define the number of maximal generation - - const double INIT_POSITION_MIN = -2.0; // For initialize x - const double INIT_POSITION_MAX = 2.0; // In the case of the Rosenbrock function : -2 < x[i] < 2 - - const double INIT_VELOCITY_MIN = -1.; // For initialize PSO's velocity - const double INIT_VELOCITY_MAX = 1.; // ie Lesson 6 of ParadisEO-EO - - const double C1 = 0.5; // For calculate the velocity - const double C2 = 2.; // ie Lesson 6 of ParadisEO-EO - rng.reseed (time(0)); - + const unsigned int VEC_SIZE = 2; // Don't change this parameter when you are resolving the Rosenbrock function + + const unsigned int POP_SIZE = 20; // As with a sequential algorithm, you change the size of the population + + const unsigned int NEIGHBORHOOD_SIZE= 6; // This parameter define the neighborhoods in the PSO's topology + + const unsigned int MAX_GEN = 150; // Define the number of maximal generation + + const double INIT_POSITION_MIN = -2.0; // For initialize x + const double INIT_POSITION_MAX = 2.0; // In the case of the Rosenbrock function : -2 < x[i] < 2 + + const double INIT_VELOCITY_MIN = -1.; // For initialize PSO's velocity + const double INIT_VELOCITY_MAX = 1.; // ie Lesson 6 of ParadisEO-EO + + const double C1 = 0.5; // For calculate the velocity + const double C2 = 2.; // ie Lesson 6 of ParadisEO-EO + rng.reseed (time(0)); + // Stopping - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCombinedContinue continuatorPara (genContPara); - eoCheckPoint checkpoint(continuatorPara); - - - - - /* In this lesson, you should define a peoEvalFuncPSO witch will allow to initialize : - * - * - peoSeqPopEval : using to the sequential evaluation - * - * OR - * - * - peoParaPopEval : using to the parallel evaluation - * - */ + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + + + + + /* In this lesson, you should define a peoEvalFuncPSO witch will allow to initialize : + * + * - peoSeqPopEval : using to the sequential evaluation + * + * OR + * + * - peoParaPopEval : using to the parallel evaluation + * + */ // For a parallel evaluation - peoEvalFuncPSO plainEval(f); - peoParaPopEval< Indi > eval(plainEval); + peoEvalFuncPSO plainEval(f); + peoParaPopEval< Indi > eval(plainEval); -// Initialization - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - -// Velocity (ie Lesson 6 of ParadisEO-PEO) - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - -// Initializing the best (ie Lesson 6 of ParadisEO-PEO) - eoFirstIsBestInit < Indi > localInit; - -// Flight (ie Lesson 6 of ParadisEO-PEO) - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - -// Creation of the population - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - // Initialization - peoInitializer init(eval,veloRandom,localInit,pop); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + +// Velocity (ie Lesson 6 of ParadisEO-PEO) + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + +// Initializing the best (ie Lesson 6 of ParadisEO-PEO) + eoFirstIsBestInit < Indi > localInit; + +// Flight (ie Lesson 6 of ParadisEO-PEO) + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + +// Creation of the population + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + +// Initialization + peoInitializer init(eval,veloRandom,localInit,pop); // Topology (ie Lesson 6 of ParadisEO-PEO) - eoLinearTopology topology(NEIGHBORHOOD_SIZE); - eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); //Parallel algorithm - peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); - psa(pop); - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) - std::cout << "Final population :\n" << pop << std::endl; + peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); + psa(pop); + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) + std::cout << "Final population :\n" << pop << std::endl; } diff --git a/trunk/paradiseo-peo/tutorial/Lesson2/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson2/mainEA.cpp index 8f40a404a..e2be01508 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson2/mainEA.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson2/mainEA.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -40,66 +40,66 @@ typedef eoReal Indi; double f (const Indi & _indi) -{ - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) { - peo :: init( __argc, __argv ); - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 20; - const unsigned int MAX_GEN = 300; - const double INIT_POSITION_MIN = -2.0; - const double INIT_POSITION_MAX = 2.0; - const float CROSS_RATE = 0.8; - const double EPSILON = 0.01; - const float MUT_RATE = 0.3; - rng.reseed (time(0)); - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCombinedContinue continuatorPara (genContPara); - eoCheckPoint checkpoint(continuatorPara); - peoEvalFunc plainEval(f); - peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoRankingSelect selectionStrategy; - eoSelectNumber select(selectionStrategy,POP_SIZE); - eoSegmentCrossover crossover; - eoUniformMutation mutation(EPSILON); - - /******************************************************************************************/ - - /* In this lesson, you can choose between : - * - * - A sequential transformation (crossover + mutation) : eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); - * peoSeqTransform eaTransform(transform); - * - * OR - * - * - A parallel transformation (crossover + mutation) : peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); - * - * Unfortunately, if you don't use a crossover which creates two children with two parents, - * you can't use this operator. - * In this case, you should send a mail to : paradiseo-help@lists.gforge.inria.fr - */ - - peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); - -/******************************************************************************************/ - - eoPlusReplacement replace; - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - peoEA Algo(checkpoint,eval,select,eaTransform,replace); - Algo(pop); - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) - std::cout << "Final population :\n" << pop << std::endl; + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int MAX_GEN = 300; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const float CROSS_RATE = 0.8; + const double EPSILON = 0.01; + const float MUT_RATE = 0.3; + rng.reseed (time(0)); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + peoEvalFunc plainEval(f); + peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + eoSegmentCrossover crossover; + eoUniformMutation mutation(EPSILON); + + /******************************************************************************************/ + + /* In this lesson, you can choose between : + * + * - A sequential transformation (crossover + mutation) : eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + * peoSeqTransform eaTransform(transform); + * + * OR + * + * - A parallel transformation (crossover + mutation) : peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); + * + * Unfortunately, if you don't use a crossover which creates two children with two parents, + * you can't use this operator. + * In this case, you should send a mail to : paradiseo-help@lists.gforge.inria.fr + */ + + peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); + + /******************************************************************************************/ + + eoPlusReplacement replace; + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + Algo(pop); + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) + std::cout << "Final population :\n" << pop << std::endl; } diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp index 732ba1a9e..b6bf2bee8 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -40,109 +40,109 @@ typedef eoReal Indi; double f (const Indi & _indi) -{ - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) { - peo :: init( __argc, __argv ); - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 20; - const unsigned int MAX_GEN = 300; - const double INIT_POSITION_MIN = -2.0; - const double INIT_POSITION_MAX = 2.0; - const float CROSS_RATE = 0.8; - const double EPSILON = 0.01; - const float MUT_RATE = 0.3; - // MIG_FREQ define the frequency of the migration. - const unsigned int MIG_FREQ = 10; - // MIG_SIZE define the size of each migration. - const unsigned int MIG_SIZE = 5; - rng.reseed (time(0)); - - // Define the topology of your island model - RingTopology topology; - - // First algorithm - /*****************************************************************************************/ - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCombinedContinue continuatorPara (genContPara); - eoCheckPoint checkpoint(continuatorPara); - peoEvalFunc plainEval(f); - peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoRankingSelect selectionStrategy; - eoSelectNumber select(selectionStrategy,POP_SIZE); - eoSegmentCrossover crossover; - eoUniformMutation mutation(EPSILON); - eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); - peoSeqTransform eaTransform(transform); // Here, the transformation is sequential - eoPlusReplacement replace; - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - - eoPeriodicContinue mig_cont( MIG_FREQ ); // Migration occurs periodically - eoRandomSelect mig_select_one; // Emigrants are randomly selected - eoSelectNumber mig_select (mig_select_one,MIG_SIZE); - eoPlusReplacement mig_replace; // Immigrants replace the worse individuals + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int MAX_GEN = 300; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const float CROSS_RATE = 0.8; + const double EPSILON = 0.01; + const float MUT_RATE = 0.3; +// MIG_FREQ define the frequency of the migration. + const unsigned int MIG_FREQ = 10; +// MIG_SIZE define the size of each migration. + const unsigned int MIG_SIZE = 5; + rng.reseed (time(0)); -/*****************************************************************************************/ +// Define the topology of your island model + RingTopology topology; -// Second algorithm (on the same model but with others names) - /*****************************************************************************************/ - eoGenContinue < Indi > genContPara2 (MAX_GEN); - eoCombinedContinue continuatorPara2 (genContPara2); - eoCheckPoint checkpoint2(continuatorPara2); - peoEvalFunc plainEval2(f); - peoSeqPopEval< Indi > eval2(plainEval2); - eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); - eoRankingSelect selectionStrategy2; - eoSelectNumber select2(selectionStrategy2,POP_SIZE); - eoSegmentCrossover crossover2; - eoUniformMutation mutation2(EPSILON); - eoSGATransform transform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); - peoSeqTransform eaTransform2(transform2); - eoPlusReplacement replace2; - eoPop < Indi > pop2; - pop2.append (POP_SIZE, random2); - eoPeriodicContinue mig_cont2( MIG_FREQ ); - eoRandomSelect mig_select_one2; - eoSelectNumber mig_select2 (mig_select_one2,MIG_SIZE); - eoPlusReplacement mig_replace2; +// First algorithm + /*****************************************************************************************/ + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + peoEvalFunc plainEval(f); + peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + eoSegmentCrossover crossover; + eoUniformMutation mutation(EPSILON); + eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + peoSeqTransform eaTransform(transform); // Here, the transformation is sequential + eoPlusReplacement replace; + eoPop < Indi > pop; + pop.append (POP_SIZE, random); -/*****************************************************************************************/ + eoPeriodicContinue mig_cont( MIG_FREQ ); // Migration occurs periodically + eoRandomSelect mig_select_one; // Emigrants are randomly selected + eoSelectNumber mig_select (mig_select_one,MIG_SIZE); + eoPlusReplacement mig_replace; // Immigrants replace the worse individuals + + /*****************************************************************************************/ + +// Second algorithm (on the same model but with others names) + /*****************************************************************************************/ + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCombinedContinue continuatorPara2 (genContPara2); + eoCheckPoint checkpoint2(continuatorPara2); + peoEvalFunc plainEval2(f); + peoSeqPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoRankingSelect selectionStrategy2; + eoSelectNumber select2(selectionStrategy2,POP_SIZE); + eoSegmentCrossover crossover2; + eoUniformMutation mutation2(EPSILON); + eoSGATransform transform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); + peoSeqTransform eaTransform2(transform2); + eoPlusReplacement replace2; + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + eoPeriodicContinue mig_cont2( MIG_FREQ ); + eoRandomSelect mig_select_one2; + eoSelectNumber mig_select2 (mig_select_one2,MIG_SIZE); + eoPlusReplacement mig_replace2; + + /*****************************************************************************************/ // You can choose between : // // - Synchronous communication : peoSyncIslandMig mig(MIG_FREQ,mig_select,mig_replace,topology,pop,pop); // - Asynchronous communication : peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop); // With a grid, you should use an asynchronous communication - peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop2); - checkpoint.add(mig); - peoAsyncIslandMig mig2(mig_cont2,mig_select2,mig_replace2,topology,pop2,pop); - checkpoint2.add(mig2); - -// Initialization of the algorithms - peoEA Algo(checkpoint,eval,select,eaTransform,replace); - mig.setOwner(Algo); - Algo(pop); - peoEA Algo2(checkpoint2,eval2,select2,eaTransform2,replace2); - mig2.setOwner(Algo2); - Algo2(pop2); - - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) + peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop2); + checkpoint.add(mig); + peoAsyncIslandMig mig2(mig_cont2,mig_select2,mig_replace2,topology,pop2,pop); + checkpoint2.add(mig2); + +// Initialization of the algorithms + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + mig.setOwner(Algo); + Algo(pop); + peoEA Algo2(checkpoint2,eval2,select2,eaTransform2,replace2); + mig2.setOwner(Algo2); + Algo2(pop2); + + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) { - std::cout << "Final population 1 :\n" << pop << std::endl; - std::cout << "Final population 2 :\n" << pop2 << std::endl; + std::cout << "Final population 1 :\n" << pop << std::endl; + std::cout << "Final population 2 :\n" << pop2 << std::endl; } } diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp b/trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp index 5c66b5b0a..0d751ab71 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -39,114 +39,114 @@ typedef eoRealParticle < double >Indi; double f (const Indi & _indi) -{ - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) { // In this lesson, we define two algorithms of the PSO witch represents two islands. -// Obviously, you can define more algorithms. - - // The parameters are common between the two algorithms. - /*****************************************************************************************/ - peo :: init( __argc, __argv ); - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 20; - const unsigned int NEIGHBORHOOD_SIZE= 6; - const unsigned int MAX_GEN = 150; - const double INIT_POSITION_MIN = -2.0; - const double INIT_POSITION_MAX = 2.0; - const double INIT_VELOCITY_MIN = -1.; - const double INIT_VELOCITY_MAX = 1.; - const double C1 = 0.5; - const double C2 = 2.; - // C3 is used for the calculation of one of the strategies of the island model. - const double C3 = 2.; - // MIG_FREQ define the frequency of the migration. - const unsigned int MIG_FREQ = 10; // The optimal value is 1 or 2 for the component peoPSOVelocity. - rng.reseed (time(0)); - /*****************************************************************************************/ - - // Define the topology of your island model - RingTopology topologyMig; - - // First algorithm - /*****************************************************************************************/ - peoEvalFuncPSO plainEval(f); - peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential ! - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - eoFirstIsBestInit < Indi > localInit; - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - peoInitializer init(eval,veloRandom,localInit,pop); - eoLinearTopology topology(NEIGHBORHOOD_SIZE); - eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCheckPoint checkpoint(genContPara); - // Specific implementation for the island model - eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); - peoPSOSelect mig_selec(topology); - eoSelectNumber< Indi > mig_select(mig_selec); - // If you want to use a replacement stategy : peoPSOReplacement mig_replace; - // If you want to use a consideration of the migration in the calculation of the velocity : peoPSOVelocity mig_replace(C3,velocity); - peoPSOReplacement mig_replace; -/*****************************************************************************************/ - - // Second algorithm (on the same model but with others names) -/*****************************************************************************************/ - peoEvalFuncPSO plainEval2(f); - peoSeqPopEval< Indi > eval2(plainEval2); - eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); - eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); - eoFirstIsBestInit < Indi > localInit2; - eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight2(bndsFlight2); - eoPop < Indi > pop2; - pop2.append (POP_SIZE, random2); - peoInitializer init2(eval2,veloRandom2,localInit2,pop2); - eoLinearTopology topology2(NEIGHBORHOOD_SIZE); - eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); - eoGenContinue < Indi > genContPara2 (MAX_GEN); - eoCheckPoint checkpoint2(genContPara2); - eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); - peoPSOSelect mig_selec2(topology2); - eoSelectNumber< Indi > mig_select2(mig_selec2); - peoPSOReplacement mig_replace2; -/*****************************************************************************************/ +// Obviously, you can define more algorithms. - // Define the communication between the islands - peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop); - checkpoint.add( mig ); - peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop2); - checkpoint2.add( mig2 ); - // Initialization of the algorithms - peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); - mig.setOwner( psa ); - psa(pop); - peoPSO < Indi > psa2(init2,checkpoint2, eval2, velocity2, flight2); - mig2.setOwner( psa2 ); - psa2(pop2); - - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) +// The parameters are common between the two algorithms. + /*****************************************************************************************/ + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int NEIGHBORHOOD_SIZE= 6; + const unsigned int MAX_GEN = 150; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const double INIT_VELOCITY_MIN = -1.; + const double INIT_VELOCITY_MAX = 1.; + const double C1 = 0.5; + const double C2 = 2.; +// C3 is used for the calculation of one of the strategies of the island model. + const double C3 = 2.; +// MIG_FREQ define the frequency of the migration. + const unsigned int MIG_FREQ = 10; // The optimal value is 1 or 2 for the component peoPSOVelocity. + rng.reseed (time(0)); + /*****************************************************************************************/ + +// Define the topology of your island model + RingTopology topologyMig; + +// First algorithm + /*****************************************************************************************/ + peoEvalFuncPSO plainEval(f); + peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential ! + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + peoInitializer init(eval,veloRandom,localInit,pop); + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCheckPoint checkpoint(genContPara); +// Specific implementation for the island model + eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); + peoPSOSelect mig_selec(topology); + eoSelectNumber< Indi > mig_select(mig_selec); +// If you want to use a replacement stategy : peoPSOReplacement mig_replace; +// If you want to use a consideration of the migration in the calculation of the velocity : peoPSOVelocity mig_replace(C3,velocity); + peoPSOReplacement mig_replace; + /*****************************************************************************************/ + +// Second algorithm (on the same model but with others names) + /*****************************************************************************************/ + peoEvalFuncPSO plainEval2(f); + peoSeqPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); + eoFirstIsBestInit < Indi > localInit2; + eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight2(bndsFlight2); + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + peoInitializer init2(eval2,veloRandom2,localInit2,pop2); + eoLinearTopology topology2(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCheckPoint checkpoint2(genContPara2); + eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); + peoPSOSelect mig_selec2(topology2); + eoSelectNumber< Indi > mig_select2(mig_selec2); + peoPSOReplacement mig_replace2; + /*****************************************************************************************/ + +// Define the communication between the islands + peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop); + checkpoint.add( mig ); + peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop2); + checkpoint2.add( mig2 ); +// Initialization of the algorithms + peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); + mig.setOwner( psa ); + psa(pop); + peoPSO < Indi > psa2(init2,checkpoint2, eval2, velocity2, flight2); + mig2.setOwner( psa2 ); + psa2(pop2); + + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) { - std::cout << "Population 1 :\n" << pop << std::endl; - std::cout << "Population 2 :\n" << pop2 << std::endl; + std::cout << "Population 1 :\n" << pop << std::endl; + std::cout << "Population 2 :\n" << pop2 << std::endl; } } diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp index 6ac1375f1..e79caf9a2 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -40,12 +40,12 @@ typedef eoReal Indi; double f (const Indi & _indi) -{ - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) @@ -55,98 +55,98 @@ int main (int __argc, char *__argv[]) // The evaluation is parallel. // The transformation is parallel. - peo :: init( __argc, __argv ); - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 20; - const unsigned int MAX_GEN = 300; - const double INIT_POSITION_MIN = -2.0; - const double INIT_POSITION_MAX = 2.0; - const float CROSS_RATE = 0.8; - const double EPSILON = 0.01; - const float MUT_RATE = 0.3; - const unsigned int MIG_FREQ = 10; - const unsigned int MIG_SIZE = 5; - rng.reseed (time(0)); - RingTopology topology; - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCombinedContinue continuatorPara (genContPara); - eoCheckPoint checkpoint(continuatorPara); - peoEvalFunc plainEval(f); - peoParaPopEval< Indi > eval(plainEval); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoRankingSelect selectionStrategy; - eoSelectNumber select(selectionStrategy,POP_SIZE); - eoSegmentCrossover crossover; - eoUniformMutation mutation(EPSILON); - peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); - eoPlusReplacement replace; - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - eoPeriodicContinue mig_cont( MIG_FREQ ); - eoRandomSelect mig_select_one; - eoSelectNumber mig_select (mig_select_one,MIG_SIZE); - eoPlusReplacement mig_replace; - eoGenContinue < Indi > genContPara2 (MAX_GEN); - eoCombinedContinue continuatorPara2 (genContPara2); - eoCheckPoint checkpoint2(continuatorPara2); - peoEvalFunc plainEval2(f); - peoParaPopEval< Indi > eval2(plainEval2); - eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); - eoRankingSelect selectionStrategy2; - eoSelectNumber select2(selectionStrategy2,POP_SIZE); - eoSegmentCrossover crossover2; - eoUniformMutation mutation2(EPSILON); - peoParaSGATransform eaTransform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); - eoPlusReplacement replace2; - eoPop < Indi > pop2; - pop2.append (POP_SIZE, random2); - eoPeriodicContinue mig_cont2( MIG_FREQ ); - eoRandomSelect mig_select_one2; - eoSelectNumber mig_select2 (mig_select_one2,MIG_SIZE); - eoPlusReplacement mig_replace2; - eoGenContinue < Indi > genContPara3 (MAX_GEN); - eoCombinedContinue continuatorPara3 (genContPara3); - eoCheckPoint checkpoint3(continuatorPara3); - peoEvalFunc plainEval3(f); - peoParaPopEval< Indi > eval3(plainEval3); - eoUniformGenerator < double >uGen3 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random3 (VEC_SIZE, uGen3); - eoRankingSelect selectionStrategy3; - eoSelectNumber select3(selectionStrategy3,POP_SIZE); - eoSegmentCrossover crossover3; - eoUniformMutation mutation3(EPSILON); - peoParaSGATransform eaTransform3(crossover3,CROSS_RATE,mutation3,MUT_RATE); - eoPlusReplacement replace3; - eoPop < Indi > pop3; - pop3.append (POP_SIZE, random3); - eoPeriodicContinue mig_cont3( MIG_FREQ ); - eoRandomSelect mig_select_one3; - eoSelectNumber mig_select3 (mig_select_one3,MIG_SIZE); - eoPlusReplacement mig_replace3; - peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop2); - checkpoint.add(mig); - peoAsyncIslandMig mig2(mig_cont2,mig_select2,mig_replace2,topology,pop2,pop); - checkpoint2.add(mig2); - peoAsyncIslandMig mig3(mig_cont3,mig_select3,mig_replace3,topology,pop3,pop); - checkpoint3.add(mig3); - peoEA Algo(checkpoint,eval,select,eaTransform,replace); - mig.setOwner(Algo); - Algo(pop); - peoEA Algo2(checkpoint2,eval2,select2,eaTransform2,replace2); - mig2.setOwner(Algo2); - Algo2(pop2); - peoEA Algo3(checkpoint3,eval3,select3,eaTransform3,replace3); - mig3.setOwner(Algo3); - Algo3(pop3); - - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int MAX_GEN = 300; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const float CROSS_RATE = 0.8; + const double EPSILON = 0.01; + const float MUT_RATE = 0.3; + const unsigned int MIG_FREQ = 10; + const unsigned int MIG_SIZE = 5; + rng.reseed (time(0)); + RingTopology topology; + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + peoEvalFunc plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + eoSegmentCrossover crossover; + eoUniformMutation mutation(EPSILON); + peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); + eoPlusReplacement replace; + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + eoPeriodicContinue mig_cont( MIG_FREQ ); + eoRandomSelect mig_select_one; + eoSelectNumber mig_select (mig_select_one,MIG_SIZE); + eoPlusReplacement mig_replace; + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCombinedContinue continuatorPara2 (genContPara2); + eoCheckPoint checkpoint2(continuatorPara2); + peoEvalFunc plainEval2(f); + peoParaPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoRankingSelect selectionStrategy2; + eoSelectNumber select2(selectionStrategy2,POP_SIZE); + eoSegmentCrossover crossover2; + eoUniformMutation mutation2(EPSILON); + peoParaSGATransform eaTransform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); + eoPlusReplacement replace2; + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + eoPeriodicContinue mig_cont2( MIG_FREQ ); + eoRandomSelect mig_select_one2; + eoSelectNumber mig_select2 (mig_select_one2,MIG_SIZE); + eoPlusReplacement mig_replace2; + eoGenContinue < Indi > genContPara3 (MAX_GEN); + eoCombinedContinue continuatorPara3 (genContPara3); + eoCheckPoint checkpoint3(continuatorPara3); + peoEvalFunc plainEval3(f); + peoParaPopEval< Indi > eval3(plainEval3); + eoUniformGenerator < double >uGen3 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random3 (VEC_SIZE, uGen3); + eoRankingSelect selectionStrategy3; + eoSelectNumber select3(selectionStrategy3,POP_SIZE); + eoSegmentCrossover crossover3; + eoUniformMutation mutation3(EPSILON); + peoParaSGATransform eaTransform3(crossover3,CROSS_RATE,mutation3,MUT_RATE); + eoPlusReplacement replace3; + eoPop < Indi > pop3; + pop3.append (POP_SIZE, random3); + eoPeriodicContinue mig_cont3( MIG_FREQ ); + eoRandomSelect mig_select_one3; + eoSelectNumber mig_select3 (mig_select_one3,MIG_SIZE); + eoPlusReplacement mig_replace3; + peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop2); + checkpoint.add(mig); + peoAsyncIslandMig mig2(mig_cont2,mig_select2,mig_replace2,topology,pop2,pop); + checkpoint2.add(mig2); + peoAsyncIslandMig mig3(mig_cont3,mig_select3,mig_replace3,topology,pop3,pop); + checkpoint3.add(mig3); + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + mig.setOwner(Algo); + Algo(pop); + peoEA Algo2(checkpoint2,eval2,select2,eaTransform2,replace2); + mig2.setOwner(Algo2); + Algo2(pop2); + peoEA Algo3(checkpoint3,eval3,select3,eaTransform3,replace3); + mig3.setOwner(Algo3); + Algo3(pop3); + + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) { - std::cout << "Final population 1 :\n" << pop << std::endl; - std::cout << "Final population 2 :\n" << pop2 << std::endl; - std::cout << "Final population 3 :\n" << pop3 << std::endl; + std::cout << "Final population 1 :\n" << pop << std::endl; + std::cout << "Final population 2 :\n" << pop2 << std::endl; + std::cout << "Final population 3 :\n" << pop3 << std::endl; } } diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp b/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp index 9facef818..033889e5c 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ #include @@ -39,12 +39,12 @@ typedef eoRealParticle < double >Indi; double f (const Indi & _indi) -{ - double sum; - sum=_indi[1]-pow(_indi[0],2); - sum=100*pow(sum,2); - sum+=pow((1-_indi[0]),2); - return (-sum); +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); } int main (int __argc, char *__argv[]) @@ -52,108 +52,108 @@ int main (int __argc, char *__argv[]) // In this lesson, we can see an example of a PSO with three islands. // The strategy of migration is the replacement. -// The evaluation is parallel. - - peo :: init( __argc, __argv ); - const unsigned int VEC_SIZE = 2; - const unsigned int POP_SIZE = 20; - const unsigned int NEIGHBORHOOD_SIZE= 6; - const unsigned int MAX_GEN = 150; - const double INIT_POSITION_MIN = -2.0; - const double INIT_POSITION_MAX = 2.0; - const double INIT_VELOCITY_MIN = -1.; - const double INIT_VELOCITY_MAX = 1.; - const double C1 = 0.5; - const double C2 = 2.; - const double C3 = 2.; - const unsigned int MIG_FREQ = 10; - rng.reseed (time(0)); - RingTopology topologyMig; - peoEvalFuncPSO plainEval(f); - peoParaPopEval< Indi > eval(plainEval); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); - eoFirstIsBestInit < Indi > localInit; - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoPop < Indi > pop; - pop.append (POP_SIZE, random); - peoInitializer init(eval,veloRandom,localInit,pop); - eoLinearTopology topology(NEIGHBORHOOD_SIZE); - eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); - eoGenContinue < Indi > genContPara (MAX_GEN); - eoCheckPoint checkpoint(genContPara); - eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); - peoPSOSelect mig_selec(topology); - eoSelectNumber< Indi > mig_select(mig_selec); - peoPSOReplacement mig_replace; - peoEvalFuncPSO plainEval2(f); - peoParaPopEval< Indi > eval2(plainEval2); - eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); - eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); - eoFirstIsBestInit < Indi > localInit2; - eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight2(bndsFlight2); - eoPop < Indi > pop2; - pop2.append (POP_SIZE, random2); - peoInitializer init2(eval2,veloRandom2,localInit2,pop2); - eoLinearTopology topology2(NEIGHBORHOOD_SIZE); - eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); - eoGenContinue < Indi > genContPara2 (MAX_GEN); - eoCheckPoint checkpoint2(genContPara2); - eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); - peoPSOSelect mig_selec2(topology2); - eoSelectNumber< Indi > mig_select2(mig_selec2); - peoPSOReplacement mig_replace2; - peoEvalFuncPSO plainEval3(f); - peoParaPopEval< Indi > eval3(plainEval3); - eoUniformGenerator < double >uGen3 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random3 (VEC_SIZE, uGen3); - eoUniformGenerator < double >sGen3 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom3 (VEC_SIZE, sGen3); - eoFirstIsBestInit < Indi > localInit3; - eoRealVectorBounds bndsFlight3(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight3(bndsFlight3); - eoPop < Indi > pop3; - pop3.append (POP_SIZE, random3); - peoInitializer init3(eval3,veloRandom3,localInit3,pop3); - eoLinearTopology topology3(NEIGHBORHOOD_SIZE); - eoRealVectorBounds bnds3(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity3 (topology3,C1,C2,bnds3); - eoGenContinue < Indi > genContPara3 (MAX_GEN); - eoCheckPoint checkpoint3(genContPara3); - eoPeriodicContinue< Indi > mig_cont3( MIG_FREQ ); - peoPSOSelect mig_selec3(topology3); - eoSelectNumber< Indi > mig_select3(mig_selec3); - peoPSOReplacement mig_replace3; - peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); - checkpoint.add( mig ); - peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop3); - checkpoint2.add( mig2 ); - peoAsyncIslandMig< Indi > mig3( mig_cont3, mig_select3, mig_replace3, topologyMig, pop3, pop); - checkpoint3.add( mig3 ); - peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); - mig.setOwner( psa ); - psa(pop); - peoPSO < Indi > psa2(init2,checkpoint2, eval2, velocity2, flight2); - mig2.setOwner( psa2 ); - psa2(pop2); - peoPSO < Indi > psa3(init3,checkpoint3, eval3, velocity3, flight3); - mig3.setOwner( psa3 ); - psa3(pop3); - - peo :: run(); - peo :: finalize(); - if(getNodeRank()==1) +// The evaluation is parallel. + + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int NEIGHBORHOOD_SIZE= 6; + const unsigned int MAX_GEN = 150; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const double INIT_VELOCITY_MIN = -1.; + const double INIT_VELOCITY_MAX = 1.; + const double C1 = 0.5; + const double C2 = 2.; + const double C3 = 2.; + const unsigned int MIG_FREQ = 10; + rng.reseed (time(0)); + RingTopology topologyMig; + peoEvalFuncPSO plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + peoInitializer init(eval,veloRandom,localInit,pop); + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCheckPoint checkpoint(genContPara); + eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); + peoPSOSelect mig_selec(topology); + eoSelectNumber< Indi > mig_select(mig_selec); + peoPSOReplacement mig_replace; + peoEvalFuncPSO plainEval2(f); + peoParaPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); + eoFirstIsBestInit < Indi > localInit2; + eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight2(bndsFlight2); + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + peoInitializer init2(eval2,veloRandom2,localInit2,pop2); + eoLinearTopology topology2(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCheckPoint checkpoint2(genContPara2); + eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); + peoPSOSelect mig_selec2(topology2); + eoSelectNumber< Indi > mig_select2(mig_selec2); + peoPSOReplacement mig_replace2; + peoEvalFuncPSO plainEval3(f); + peoParaPopEval< Indi > eval3(plainEval3); + eoUniformGenerator < double >uGen3 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random3 (VEC_SIZE, uGen3); + eoUniformGenerator < double >sGen3 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom3 (VEC_SIZE, sGen3); + eoFirstIsBestInit < Indi > localInit3; + eoRealVectorBounds bndsFlight3(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight3(bndsFlight3); + eoPop < Indi > pop3; + pop3.append (POP_SIZE, random3); + peoInitializer init3(eval3,veloRandom3,localInit3,pop3); + eoLinearTopology topology3(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds3(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity3 (topology3,C1,C2,bnds3); + eoGenContinue < Indi > genContPara3 (MAX_GEN); + eoCheckPoint checkpoint3(genContPara3); + eoPeriodicContinue< Indi > mig_cont3( MIG_FREQ ); + peoPSOSelect mig_selec3(topology3); + eoSelectNumber< Indi > mig_select3(mig_selec3); + peoPSOReplacement mig_replace3; + peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); + checkpoint.add( mig ); + peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop3); + checkpoint2.add( mig2 ); + peoAsyncIslandMig< Indi > mig3( mig_cont3, mig_select3, mig_replace3, topologyMig, pop3, pop); + checkpoint3.add( mig3 ); + peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); + mig.setOwner( psa ); + psa(pop); + peoPSO < Indi > psa2(init2,checkpoint2, eval2, velocity2, flight2); + mig2.setOwner( psa2 ); + psa2(pop2); + peoPSO < Indi > psa3(init3,checkpoint3, eval3, velocity3, flight3); + mig3.setOwner( psa3 ); + psa3(pop3); + + peo :: run(); + peo :: finalize(); + if (getNodeRank()==1) { - std::cout << "Population 1 :\n" << pop << std::endl; - std::cout << "Population 2 :\n" << pop2 << std::endl; - std::cout << "Population 3 :\n" << pop3 << std::endl; + std::cout << "Population 1 :\n" << pop << std::endl; + std::cout << "Population 2 :\n" << pop2 << std::endl; + std::cout << "Population 3 :\n" << pop3 << std::endl; } } diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/example.cpp b/trunk/paradiseo-peo/tutorial/Lesson5/example.cpp index c0d200b06..621d2d148 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson5/example.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson5/example.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -59,20 +59,21 @@ #define MUT_RATE 0.01 -int main (int __argc, char * * __argv) { - - // Example of a problem (TSP) with an hybridization +int main (int __argc, char * * __argv) +{ + + // Example of a problem (TSP) with an hybridization peo :: init (__argc, __argv); - - loadParameters (__argc, __argv); /* Processing some parameters relative to the tackled - problem (TSP) */ - RouteInit route_init; /* Its builds random routes */ + loadParameters (__argc, __argv); /* Processing some parameters relative to the tackled + problem (TSP) */ + + RouteInit route_init; /* Its builds random routes */ RouteEval full_eval; /* Full route evaluator */ - + OrderXover order_cross; /* Recombination */ PartialMappedXover pm_cross; EdgeXover edge_cross; @@ -88,30 +89,30 @@ int main (int __argc, char * * __argv) { /** The EA */ eoPop ox_pop (POP_SIZE, route_init); /* Population */ - - eoGenContinue ox_cont (NUM_GEN); /* A fixed number of iterations */ + + eoGenContinue ox_cont (NUM_GEN); /* A fixed number of iterations */ eoCheckPoint ox_checkpoint (ox_cont); /* Checkpoint */ - peoSeqPopEval ox_pop_eval (full_eval); + peoSeqPopEval ox_pop_eval (full_eval); eoStochTournamentSelect ox_select_one; eoSelectNumber ox_select (ox_select_one, POP_SIZE); eoSGATransform ox_transform (order_cross, CROSS_RATE, city_swap_mut, MUT_RATE); - peoSeqTransform ox_para_transform (ox_transform); + peoSeqTransform ox_para_transform (ox_transform); eoEPReplacement ox_replace (2); peoEA ox_ea (ox_checkpoint, ox_pop_eval, ox_select, ox_para_transform, ox_replace); - + ox_ea (ox_pop); /* Application to the given population */ - - + + peo :: run (); peo :: finalize (); /* Termination */ - - if(getNodeRank()==1) - std :: cout << "\nResult : "< * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, INRIA, 2007 @@ -31,7 +31,7 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* +* */ @@ -50,56 +50,56 @@ int main( int __argc, char** __argv ) { - -/* In this lesson you will learn to use a multi-start. - * - * Thanks to this method, you can use several local searches together !!! - * - */ - + + /* In this lesson you will learn to use a multi-start. + * + * Thanks to this method, you can use several local searches together !!! + * + */ + // Parameter - const unsigned int POP_SIZE = 10; - srand( time(NULL) ); + const unsigned int POP_SIZE = 10; + srand( time(NULL) ); // Initializing the ParadisEO-PEO environment - peo :: init( __argc, __argv ); + peo :: init( __argc, __argv ); // Processing the command line specified parameters - loadParameters( __argc, __argv ); + loadParameters( __argc, __argv ); // Define a Hill Climbing (you can choose an other local search) // ie Lessons of ParadisEO - MO - Route route; - RouteInit init; - init(route); - RouteEval eval; - eval(route); - TwoOptInit initHC; - TwoOptNext nextHC; - TwoOptIncrEval incrHC; - moBestImprSelect< TwoOpt > selectHC; - moHC< TwoOpt > hc(initHC, nextHC, incrHC, selectHC, eval); + Route route; + RouteInit init; + init(route); + RouteEval eval; + eval(route); + TwoOptInit initHC; + TwoOptNext nextHC; + TwoOptIncrEval incrHC; + moBestImprSelect< TwoOpt > selectHC; + moHC< TwoOpt > hc(initHC, nextHC, incrHC, selectHC, eval); // Define a population - RouteInit initPop; // Creates random Route objects - RouteEval evalPop; // Offers a fitness value for a specified Route object - eoPop < Route > pop(POP_SIZE, initPop); - for ( unsigned int index = 0; index < POP_SIZE; index++ ) - evalPop( pop[ index ] ); + RouteInit initPop; // Creates random Route objects + RouteEval evalPop; // Offers a fitness value for a specified Route object + eoPop < Route > pop(POP_SIZE, initPop); + for ( unsigned int index = 0; index < POP_SIZE; index++ ) + evalPop( pop[ index ] ); // Setting up the parallel wrapper - peoSynchronousMultiStart< Route > parallelHC(hc); - peoParallelAlgorithmWrapper WrapHC (parallelHC, pop); - parallelHC.setOwner( WrapHC ); + peoSynchronousMultiStart< Route > parallelHC(hc); + peoParallelAlgorithmWrapper WrapHC (parallelHC, pop); + parallelHC.setOwner( WrapHC ); - peo :: run( ); - peo :: finalize( ); - if ( getNodeRank() == 1 ) - { + peo :: run( ); + peo :: finalize( ); + if ( getNodeRank() == 1 ) + { - std :: cout << "\n\nBefore : \n" << route; - std :: cout << "\n\nWith the synchronous Multi-Start HCs:"; - for ( unsigned int index = 0; index < POP_SIZE; index++ ) - std::cout <<"\n"<< pop[ index ]; - } + std :: cout << "\n\nBefore : \n" << route; + std :: cout << "\n\nWith the synchronous Multi-Start HCs:"; + for ( unsigned int index = 0; index < POP_SIZE; index++ ) + std::cout <<"\n"<< pop[ index ]; + } } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.cpp index 4cf961da5..a9da49f6c 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -38,12 +38,13 @@ #include "city_swap.h" -bool CitySwap :: operator () (Route & __route) { - +bool CitySwap :: operator () (Route & __route) +{ + std :: swap (__route [rng.random (__route.size ())], - __route [rng.random (__route.size ())]) ; - + __route [rng.random (__route.size ())]) ; + __route.invalidate () ; - + return true ; } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.h b/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.h index 8a0756968..91770db04 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/city_swap.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -43,12 +43,13 @@ /** Its swaps two vertices randomly choosen */ -class CitySwap : public eoMonOp { - -public : - - bool operator () (Route & __route) ; - -} ; +class CitySwap : public eoMonOp + { + + public : + + bool operator () (Route & __route) ; + + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/data.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/data.cpp index 4bbdd1a96..fc7223342 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/data.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/data.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -48,78 +48,84 @@ #define MAX_FIELD_LENGTH 1000 #define MAX_LINE_LENGTH 1000 -static void getNextField (FILE * __f, char * __buff) { - - char trash [MAX_TRASH_LENGTH]; +static void getNextField (FILE * __f, char * __buff) +{ - fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ + char trash [MAX_TRASH_LENGTH]; + + fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ fscanf (__f, "%[^:\n]", __buff); /* Reading the field */ fgetc (__f); } -static void getLine (FILE * __f, char * __buff) { +static void getLine (FILE * __f, char * __buff) +{ - char trash [MAX_TRASH_LENGTH]; + char trash [MAX_TRASH_LENGTH]; - fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ + fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ fscanf (__f, "%[^\n]", __buff); /* Reading the line */ } -void loadData (const char * __filename) { +void loadData (const char * __filename) +{ FILE * f = fopen (__filename, "r"); - if (f) { + if (f) + { - printf ("Loading '%s'.\n", __filename); - - char field [MAX_FIELD_LENGTH]; - - getNextField (f, field); /* Name */ - assert (strstr (field, "NAME")); - getNextField (f, field); - printf ("NAME: %s.\n", field); - - getNextField (f, field); /* Comment */ - assert (strstr (field, "COMMENT")); - getLine (f, field); - printf ("COMMENT: %s.\n", field); - - getNextField (f, field); /* Type */ - assert (strstr (field, "TYPE")); - getNextField (f, field); - printf ("TYPE: %s.\n", field); + printf ("Loading '%s'.\n", __filename); - getNextField (f, field); /* Dimension */ - assert (strstr (field, "DIMENSION")); - getNextField (f, field); - printf ("DIMENSION: %s.\n", field); - numNodes = atoi (field); + char field [MAX_FIELD_LENGTH]; - getNextField (f, field); /* Edge weight type */ - assert (strstr (field, "EDGE_WEIGHT_TYPE")); - getNextField (f, field); - printf ("EDGE_WEIGHT_TYPE: %s.\n", field); - - getNextField (f, field); /* Node coord section */ - assert (strstr (field, "NODE_COORD_SECTION")); - loadNodes (f); - - getNextField (f, field); /* End of file */ - assert (strstr (field, "EOF")); - printf ("EOF.\n"); - } - else { - - fprintf (stderr, "Can't open '%s'.\n", __filename); - exit (1); - } + getNextField (f, field); /* Name */ + assert (strstr (field, "NAME")); + getNextField (f, field); + printf ("NAME: %s.\n", field); + + getNextField (f, field); /* Comment */ + assert (strstr (field, "COMMENT")); + getLine (f, field); + printf ("COMMENT: %s.\n", field); + + getNextField (f, field); /* Type */ + assert (strstr (field, "TYPE")); + getNextField (f, field); + printf ("TYPE: %s.\n", field); + + getNextField (f, field); /* Dimension */ + assert (strstr (field, "DIMENSION")); + getNextField (f, field); + printf ("DIMENSION: %s.\n", field); + numNodes = atoi (field); + + getNextField (f, field); /* Edge weight type */ + assert (strstr (field, "EDGE_WEIGHT_TYPE")); + getNextField (f, field); + printf ("EDGE_WEIGHT_TYPE: %s.\n", field); + + getNextField (f, field); /* Node coord section */ + assert (strstr (field, "NODE_COORD_SECTION")); + loadNodes (f); + + getNextField (f, field); /* End of file */ + assert (strstr (field, "EOF")); + printf ("EOF.\n"); + } + else + { + + fprintf (stderr, "Can't open '%s'.\n", __filename); + exit (1); + } } -void loadData (eoParser & __parser) { - +void loadData (eoParser & __parser) +{ + /* Getting the path of the instance */ - + eoValueParam param ("", "inst", "Path of the instance") ; __parser.processParam (param) ; loadData (param.value ().c_str ()); diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/data.h b/trunk/paradiseo-peo/tutorial/examples/tsp/data.h index 2ec56fdd4..4f501e463 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/data.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/data.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/display.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/display.cpp index 69ebfaf9d..66757006c 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/display.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/display.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -56,7 +56,7 @@ static unsigned * X_new_coord, * Y_new_coord ; /* this variable will contain the handle to the returned graphics context. */ static GC gc; - + /* this variable will contain the pointer to the Display structure */ static Display* disp; @@ -67,23 +67,24 @@ static int screen; /* Create a new backing pixmap of the appropriate size */ - /* Best tour */ - /* - gdk_gc_set_line_attributes (gc, 2, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_MITER) ; +/* Best tour */ +/* +gdk_gc_set_line_attributes (gc, 2, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_MITER) ; - gdk_gc_set_foreground (gc, & color_green) ; +gdk_gc_set_foreground (gc, & color_green) ; - for (int i = 0 ; i < (int) numNodes ; i ++) { +for (int i = 0 ; i < (int) numNodes ; i ++) { - gdk_draw_line (pixmap, gc, - X_new_coord [opt_route [i]], - Y_new_coord [opt_route [i]], - X_new_coord [opt_route [(i + 1) % numNodes]], - Y_new_coord [opt_route [(i + 1) % numNodes]]); - - }*/ + gdk_draw_line (pixmap, gc, + X_new_coord [opt_route [i]], + Y_new_coord [opt_route [i]], + X_new_coord [opt_route [(i + 1) % numNodes]], + Y_new_coord [opt_route [(i + 1) % numNodes]]); + + }*/ -void openMainWindow (const char * __filename) { +void openMainWindow (const char * __filename) +{ filename = __filename; @@ -91,7 +92,7 @@ void openMainWindow (const char * __filename) { int map_width = (int) (X_max - X_min); int map_height = (int) (Y_max - Y_min); int map_side = std :: max (map_width, map_height); - + /* Calculate the window's width and height. */ int win_width = (int) (screen_width * RATIO * map_width / map_side); int win_height = (int) (screen_height * RATIO * map_height / map_side); @@ -100,46 +101,49 @@ void openMainWindow (const char * __filename) { X_new_coord = new unsigned [numNodes]; Y_new_coord = new unsigned [numNodes]; - for (unsigned i = 0; i < numNodes; i ++) { - X_new_coord [i] = (unsigned) (win_width * (1.0 - (X_coord [i] - X_min) / map_width) + BORDER); - Y_new_coord [i] = (unsigned) (win_height * (1.0 - (Y_coord [i] - Y_min) / map_height) + BORDER); - } - + for (unsigned i = 0; i < numNodes; i ++) + { + X_new_coord [i] = (unsigned) (win_width * (1.0 - (X_coord [i] - X_min) / map_width) + BORDER); + Y_new_coord [i] = (unsigned) (win_height * (1.0 - (Y_coord [i] - Y_min) / map_height) + BORDER); + } + /* Initialisation */ XGCValues val ; - + disp = XOpenDisplay (NULL) ; screen = DefaultScreen (disp) ; win = XCreateSimpleWindow (disp, RootWindow (disp, screen), 0, 0, win_width + 2 * BORDER, win_height + 2 * BORDER, 2, BlackPixel (disp, screen), WhitePixel (disp, screen)) ; val.foreground = BlackPixel(disp, screen) ; val.background = WhitePixel(disp, screen) ; - gc = XCreateGC (disp, win, GCForeground | GCBackground, & val) ; + gc = XCreateGC (disp, win, GCForeground | GCBackground, & val) ; XMapWindow (disp, win) ; XFlush (disp) ; - while (true) { - XClearWindow (disp, win) ; + while (true) + { + XClearWindow (disp, win) ; - /* Vertices as circles */ - for (unsigned i = 1 ; i < numNodes ; i ++) - XDrawArc (disp, win, gc, X_new_coord [i] - 1, Y_new_coord [i] - 1, 3, 3, 0, 364 * 64) ; - - /* New tour */ - std :: ifstream f (filename); - if (f) { - Route route; - f >> route; - f.close (); - - for (int i = 0; i < (int) numNodes; i ++) - XDrawLine (disp, win, gc, - X_new_coord [route [i]], - Y_new_coord [route [i]], - X_new_coord [route [(i + 1) % numNodes]], - Y_new_coord [route [(i + 1) % numNodes]]); + /* Vertices as circles */ + for (unsigned i = 1 ; i < numNodes ; i ++) + XDrawArc (disp, win, gc, X_new_coord [i] - 1, Y_new_coord [i] - 1, 3, 3, 0, 364 * 64) ; + + /* New tour */ + std :: ifstream f (filename); + if (f) + { + Route route; + f >> route; + f.close (); + + for (int i = 0; i < (int) numNodes; i ++) + XDrawLine (disp, win, gc, + X_new_coord [route [i]], + Y_new_coord [route [i]], + X_new_coord [route [(i + 1) % numNodes]], + Y_new_coord [route [(i + 1) % numNodes]]); + } + XFlush (disp) ; + sleep (1) ; } - XFlush (disp) ; - sleep (1) ; - } } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/display.h b/trunk/paradiseo-peo/tutorial/examples/tsp/display.h index b39c307ca..6bc271746 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/display.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/display.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.cpp index 6bbe6630d..bd4257833 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -38,13 +38,14 @@ #include "display.h" DisplayBestRoute :: DisplayBestRoute (eoPop & __pop - ) : pop (__pop) { - - + ) : pop (__pop) +{ + } - -void DisplayBestRoute :: operator () () { - + +void DisplayBestRoute :: operator () () +{ + displayRoute (pop.best_element ()); } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.h b/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.h index 734f8a855..745a50222 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/display_best_route.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -43,18 +43,19 @@ #include "route.h" -class DisplayBestRoute : public eoUpdater { - -public : +class DisplayBestRoute : public eoUpdater + { - DisplayBestRoute (eoPop & __pop); - - void operator () (); + public : -private : - - eoPop & pop; + DisplayBestRoute (eoPop & __pop); -}; + void operator () (); + + private : + + eoPop & pop; + + }; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.cpp index a2dac3a9a..a4c46f617 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,104 +41,114 @@ #include "edge_xover.h" -void EdgeXover :: build_map (const Route & __par1, const Route & __par2) { - +void EdgeXover :: build_map (const Route & __par1, const Route & __par2) +{ + unsigned len = __par1.size () ; - + /* Initialization */ _map.clear () ; _map.resize (len) ; - - for (unsigned i = 0 ; i < len ; i ++) { - _map [__par1 [i]].insert (__par1 [(i + 1) % len]) ; - _map [__par2 [i]].insert (__par2 [(i + 1) % len]) ; - _map [__par1 [i]].insert (__par1 [(i - 1 + len) % len]) ; - _map [__par2 [i]].insert (__par2 [(i - 1 + len) % len]) ; - } - + + for (unsigned i = 0 ; i < len ; i ++) + { + _map [__par1 [i]].insert (__par1 [(i + 1) % len]) ; + _map [__par2 [i]].insert (__par2 [(i + 1) % len]) ; + _map [__par1 [i]].insert (__par1 [(i - 1 + len) % len]) ; + _map [__par2 [i]].insert (__par2 [(i - 1 + len) % len]) ; + } + visited.clear () ; visited.resize (len, false) ; } -void EdgeXover :: remove_entry (unsigned __vertex, std :: vector > & __map) { - - std :: set & neigh = __map [__vertex] ; +void EdgeXover :: remove_entry (unsigned __vertex, std :: vector > & __map) + { - for (std :: set :: iterator it = neigh.begin () ; - it != neigh.end () ; - it ++) - __map [* it].erase (__vertex) ; - -} + std :: set & neigh = __map [__vertex] ; + + for (std :: set :: iterator it = neigh.begin () ; + it != neigh.end () ; + it ++) + __map [* it].erase (__vertex) ; + + } + +void EdgeXover :: add_vertex (unsigned __vertex, Route & __child) +{ -void EdgeXover :: add_vertex (unsigned __vertex, Route & __child) { - visited [__vertex] = true ; - __child.push_back (__vertex) ; - remove_entry (__vertex, _map) ; /* Removing entries */ + __child.push_back (__vertex) ; + remove_entry (__vertex, _map) ; /* Removing entries */ } -void EdgeXover :: cross (const Route & __par1, const Route & __par2, Route & __child) { - +void EdgeXover :: cross (const Route & __par1, const Route & __par2, Route & __child) +{ + build_map (__par1, __par2) ; - + unsigned len = __par1.size () ; - + /* Go ! */ __child.clear () ; - + unsigned cur_vertex = rng.random (len) ; - + add_vertex (cur_vertex, __child) ; - for (unsigned i = 1 ; i < len ; i ++) { - - unsigned len_min_entry = MAXINT ; - - std :: set & neigh = _map [cur_vertex] ; - - for (std :: set :: iterator it = neigh.begin () ; - it != neigh.end () ; - it ++) { - unsigned l = _map [* it].size () ; - if (len_min_entry > l) - len_min_entry = l ; - } - - std :: vector cand ; /* Candidates */ - - for (std :: set :: iterator it = neigh.begin () ; - it != neigh.end () ; - it ++) { - unsigned l = _map [* it].size () ; - if (len_min_entry == l) - cand.push_back (* it) ; - } - - if (! cand.size ()) { - - /* Oh no ! Implicit mutation */ - for (unsigned j = 0 ; j < len ; j ++) - if (! visited [j]) - cand.push_back (j) ; - } + for (unsigned i = 1 ; i < len ; i ++) + { - cur_vertex = cand [rng.random (cand.size ())] ; - - add_vertex (cur_vertex, __child) ; - } + unsigned len_min_entry = MAXINT ; + + std :: set & neigh = _map [cur_vertex] ; + + for (std :: set :: iterator it = neigh.begin () ; + it != neigh.end () ; + it ++) + { + unsigned l = _map [* it].size () ; + if (len_min_entry > l) + len_min_entry = l ; + } + + std :: vector cand ; /* Candidates */ + + for (std :: set :: iterator it = neigh.begin () ; + it != neigh.end () ; + it ++) + { + unsigned l = _map [* it].size () ; + if (len_min_entry == l) + cand.push_back (* it) ; + } + + if (! cand.size ()) + { + + /* Oh no ! Implicit mutation */ + for (unsigned j = 0 ; j < len ; j ++) + if (! visited [j]) + cand.push_back (j) ; + } + + cur_vertex = cand [rng.random (cand.size ())] ; + + add_vertex (cur_vertex, __child) ; + } } -bool EdgeXover :: operator () (Route & __route1, Route & __route2) { - +bool EdgeXover :: operator () (Route & __route1, Route & __route2) +{ + // Init. copy Route par [2] ; par [0] = __route1 ; par [1] = __route2 ; - + cross (par [0], par [1], __route1) ; cross (par [1], par [0], __route2) ; - + __route1.invalidate () ; __route2.invalidate () ; diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.h b/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.h index 75d91a22e..c9249512c 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/edge_xover.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -45,27 +45,28 @@ #include "route.h" /** Edge Crossover */ -class EdgeXover : public eoQuadOp { - -public : - - bool operator () (Route & __route1, Route & __route2) ; +class EdgeXover : public eoQuadOp + { -private : - - void cross (const Route & __par1, const Route & __par2, Route & __child) ; /* Binary */ + public : - void remove_entry (unsigned __vertex, std :: vector > & __map) ; - /* Updating the map of entries */ + bool operator () (Route & __route1, Route & __route2) ; - void build_map (const Route & __par1, const Route & __par2) ; + private : - void add_vertex (unsigned __vertex, Route & __child) ; + void cross (const Route & __par1, const Route & __par2, Route & __child) ; /* Binary */ - std :: vector > _map ; /* The handled map */ + void remove_entry (unsigned __vertex, std :: vector > & __map) ; + /* Updating the map of entries */ - std :: vector visited ; /* Vertices that are already visited */ + void build_map (const Route & __par1, const Route & __par2) ; -} ; + void add_vertex (unsigned __vertex, Route & __child) ; + + std :: vector > _map ; /* The handled map */ + + std :: vector visited ; /* Vertices that are already visited */ + + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.cpp index dc005214b..5f67b5b3a 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,10 +36,11 @@ #include "merge_route_eval.h" -void MergeRouteEval :: operator () (Route & __route, const int & __part_fit) { +void MergeRouteEval :: operator () (Route & __route, const int & __part_fit) +{ int len = __route.fitness (); len += __part_fit; __route.fitness (len); } - + diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.h b/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.h index 78c7b8a65..40dd1a5a7 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/merge_route_eval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,12 +41,13 @@ #include "route.h" -class MergeRouteEval : public peoAggEvalFunc { - -public : +class MergeRouteEval : public peoAggEvalFunc + { - void operator () (Route & __route, const int & __part_fit) ; - -}; + public : + + void operator () (Route & __route, const int & __part_fit) ; + + }; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/mix.h b/trunk/paradiseo-peo/tutorial/examples/tsp/mix.h index ce6e31a26..11942f5cc 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/mix.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/mix.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,8 +41,9 @@ #include -template void mix (std :: vector & __v) { - +template void mix (std :: vector & __v) +{ + unsigned len = __v.size () ; for (unsigned i = 0 ; i < len ; i ++) diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/node.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/node.cpp index 48f76484d..a3a668d70 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/node.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/node.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -47,59 +47,62 @@ double * X_coord, * Y_coord; double X_min = MAXDOUBLE, X_max = MINDOUBLE, Y_min = MAXDOUBLE, Y_max = MINDOUBLE; -void loadNodes (FILE * __f) { +void loadNodes (FILE * __f) +{ /* Coord */ - + X_coord = new double [numNodes]; - + Y_coord = new double [numNodes]; - + unsigned num; - for (unsigned i = 0; i < numNodes; i ++) { - - fscanf (__f, "%u%lf%lf", & num, X_coord + i, Y_coord + i); - - if (X_coord [i] < X_min) - X_min = X_coord [i]; - if (X_coord [i] > X_max) - X_max = X_coord [i]; - if (Y_coord [i] < Y_min) - Y_min = Y_coord [i]; - if (Y_coord [i] > Y_max) - Y_max = Y_coord [i]; - } - + for (unsigned i = 0; i < numNodes; i ++) + { + + fscanf (__f, "%u%lf%lf", & num, X_coord + i, Y_coord + i); + + if (X_coord [i] < X_min) + X_min = X_coord [i]; + if (X_coord [i] > X_max) + X_max = X_coord [i]; + if (Y_coord [i] < Y_min) + Y_min = Y_coord [i]; + if (Y_coord [i] > Y_max) + Y_max = Y_coord [i]; + } + /* Allocation */ /* dist = new unsigned * [numNodes]; - + for (unsigned i = 0; i < numNodes; i ++) dist [i] = new unsigned [numNodes]; */ /* Computation of the distances */ - + /* for (unsigned i = 0; i < numNodes; i ++) { dist [i] [i] = 0; for (unsigned j = 0; j < numNodes; j ++) { - + double dx = X_coord [i] - X_coord [j], dy = Y_coord [i] - Y_coord [j]; - + dist [i] [j] = dist [j] [i] = (unsigned) (sqrt (dx * dx + dy * dy) + 0.5) ; } }*/ } -unsigned distance (Node __from, Node __to) { +unsigned distance (Node __from, Node __to) +{ // return dist [__from] [__to]; double dx = X_coord [__from] - X_coord [__to], dy = Y_coord [__from] - Y_coord [__to]; - + return (unsigned) (sqrt (dx * dx + dy * dy) + 0.5) ; } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/node.h b/trunk/paradiseo-peo/tutorial/examples/tsp/node.h index bbc68c7f6..6200d1da8 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/node.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/node.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,7 +39,7 @@ #include -typedef unsigned Node; +typedef unsigned Node; extern double X_min, X_max, Y_min, Y_max; diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.cpp index a8f85e3a1..0867869b4 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,88 +40,96 @@ #define MAX_FIELD_LENGTH 1000 #define MAX_LINE_LENGTH 1000 -static void getNextField (FILE * __f, char * __buff) { - - char trash [MAX_TRASH_LENGTH]; +static void getNextField (FILE * __f, char * __buff) +{ - fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ + char trash [MAX_TRASH_LENGTH]; + + fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ fscanf (__f, "%[^:\n]", __buff); /* Reading the field */ fgetc (__f); } -static void getLine (FILE * __f, char * __buff) { +static void getLine (FILE * __f, char * __buff) +{ - char trash [MAX_TRASH_LENGTH]; + char trash [MAX_TRASH_LENGTH]; - fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ + fscanf (__f, "%[ \t:\n]", trash); /* Discarding sep. */ fscanf (__f, "%[^\n]", __buff); /* Reading the line */ } -static void loadBestRoute (FILE * __f) { +static void loadBestRoute (FILE * __f) +{ opt_route.clear (); - - for (unsigned i = 0; i < numNodes; i ++) { - Node node; - fscanf (__f, "%u", & node); - opt_route.push_back (node - 1); - } + + for (unsigned i = 0; i < numNodes; i ++) + { + Node node; + fscanf (__f, "%u", & node); + opt_route.push_back (node - 1); + } int d; /* -1 ! */ fscanf (__f, "%d", & d); } -void loadOptimumRoute (const char * __filename) { +void loadOptimumRoute (const char * __filename) +{ FILE * f = fopen (__filename, "r"); - if (f) { - - printf ("Loading '%s'.\n", __filename); - - char field [MAX_FIELD_LENGTH]; - - getNextField (f, field); /* Name */ - assert (strstr (field, "NAME")); - getNextField (f, field); - //printf ("NAME: %s.\n", field); + if (f) + { - getNextField (f, field); /* Comment */ - assert (strstr (field, "COMMENT")); - getLine (f, field); - // printf ("COMMENT: %s.\n", field); - - getNextField (f, field); /* Type */ - assert (strstr (field, "TYPE")); - getNextField (f, field); - //printf ("TYPE: %s.\n", field); + printf ("Loading '%s'.\n", __filename); - getNextField (f, field); /* Dimension */ - assert (strstr (field, "DIMENSION")); - getNextField (f, field); - // printf ("DIMENSION: %s.\n", field); - numNodes = atoi (field); + char field [MAX_FIELD_LENGTH]; - getNextField (f, field); /* Tour section */ - assert (strstr (field, "TOUR_SECTION")); - loadBestRoute (f); - - getNextField (f, field); /* End of file */ - assert (strstr (field, "EOF")); - //printf ("EOF.\n"); - - printf ("The length of the best route is %u.\n", length (opt_route)); - } - else { - - fprintf (stderr, "Can't open '%s'.\n", __filename); - exit (1); - } + getNextField (f, field); /* Name */ + assert (strstr (field, "NAME")); + getNextField (f, field); + //printf ("NAME: %s.\n", field); + + getNextField (f, field); /* Comment */ + assert (strstr (field, "COMMENT")); + getLine (f, field); + // printf ("COMMENT: %s.\n", field); + + getNextField (f, field); /* Type */ + assert (strstr (field, "TYPE")); + getNextField (f, field); + //printf ("TYPE: %s.\n", field); + + getNextField (f, field); /* Dimension */ + assert (strstr (field, "DIMENSION")); + getNextField (f, field); + // printf ("DIMENSION: %s.\n", field); + numNodes = atoi (field); + + getNextField (f, field); /* Tour section */ + assert (strstr (field, "TOUR_SECTION")); + loadBestRoute (f); + + getNextField (f, field); /* End of file */ + assert (strstr (field, "EOF")); + //printf ("EOF.\n"); + + printf ("The length of the best route is %u.\n", length (opt_route)); + } + else + { + + fprintf (stderr, "Can't open '%s'.\n", __filename); + exit (1); + } } -void loadOptimumRoute (eoParser & __parser) { - +void loadOptimumRoute (eoParser & __parser) +{ + /* Getting the path of the instance */ - + eoValueParam param ("", "optimumTour", "Optimum tour") ; __parser.processParam (param) ; if (strlen (param.value ().c_str ())) diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.h b/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.h index 8a5767285..d454a7b82 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/opt_route.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.cpp index f69eaff30..0602ccaf9 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,51 +40,57 @@ #include "order_xover.h" -void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __child) { +void OrderXover :: cross (const Route & __par1, const Route & __par2, Route & __child) +{ - unsigned cut2 = 1 + rng.random (numNodes) ; + unsigned cut2 = 1 + rng.random (numNodes) ; unsigned cut1 = rng.random (cut2); unsigned l = 0; /* To store vertices that have already been crossed */ std :: vector v (numNodes, false); - /* Copy of the left partial route of the first parent */ - for (unsigned i = cut1 ; i < cut2 ; i ++) { - __child [l ++] = __par1 [i] ; - v [__par1 [i]] = true ; - } - + /* Copy of the left partial route of the first parent */ + for (unsigned i = cut1 ; i < cut2 ; i ++) + { + __child [l ++] = __par1 [i] ; + v [__par1 [i]] = true ; + } + /* Searching the vertex of the second path, that ended the previous first one */ unsigned from = 0 ; for (unsigned i = 0; i < numNodes; i ++) - if (__par2 [i] == __child [cut2 - 1]) { - from = i ; - break ; - } - + if (__par2 [i] == __child [cut2 - 1]) + { + from = i ; + break ; + } + /* Selecting a direction (Left or Right) */ char direct = rng.flip () ? 1 : -1 ; - - for (unsigned i = 0; i < numNodes + 1; i ++) { - unsigned bidule = (direct * i + from + numNodes) % numNodes; - if (! v [__par2 [bidule]]) { - __child [l ++] = __par2 [bidule] ; - v [__par2 [bidule]] = true ; - } - } -} -bool OrderXover :: operator () (Route & __route1, Route & __route2) { - + for (unsigned i = 0; i < numNodes + 1; i ++) + { + unsigned bidule = (direct * i + from + numNodes) % numNodes; + if (! v [__par2 [bidule]]) + { + __child [l ++] = __par2 [bidule] ; + v [__par2 [bidule]] = true ; + } + } +} + +bool OrderXover :: operator () (Route & __route1, Route & __route2) +{ + // Init. copy Route par [2] ; par [0] = __route1 ; par [1] = __route2 ; - + cross (par [0], par [1], __route1) ; cross (par [1], par [0], __route2) ; - + __route1.invalidate () ; __route2.invalidate () ; diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.h b/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.h index bd14f5a50..17f66eaf1 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/order_xover.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,15 +42,16 @@ #include "route.h" /** Order Crossover */ -class OrderXover : public eoQuadOp { - -public : - - bool operator () (Route & __route1, Route & __route2) ; +class OrderXover : public eoQuadOp + { -private : - - void cross (const Route & __par1, const Route & __par2, Route & __child) ; -} ; + public : + + bool operator () (Route & __route1, Route & __route2) ; + + private : + + void cross (const Route & __par1, const Route & __par2, Route & __child) ; + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/param.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/param.cpp index 92dc5f256..03c2c19ab 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/param.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/param.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,10 +39,11 @@ #include "data.h" #include "opt_route.h" -void loadParameters (int __argc, char * * __argv) { +void loadParameters (int __argc, char * * __argv) +{ eoParser parser (__argc, __argv); - + loadData (parser); loadOptimumRoute (parser); diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/param.h b/trunk/paradiseo-peo/tutorial/examples/tsp/param.h index 25b981696..4b0485879 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/param.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/param.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.cpp index d78c6c6e7..eb04105f0 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -38,21 +38,22 @@ #include "node.h" PartRouteEval :: PartRouteEval (float __from, - float __to - ) : from (__from), - to (__to) { - + float __to + ) : from (__from), + to (__to) +{ } -void PartRouteEval :: operator () (Route & __route) { - - +void PartRouteEval :: operator () (Route & __route) +{ + + unsigned len = 0 ; - + for (unsigned i = (unsigned) (__route.size () * from) ; i < (unsigned) (__route.size () * to) ; i ++) len += distance (__route [i], __route [(i + 1) % numNodes]) ; - + __route.fitness (- (int) len) ; } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.h b/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.h index 8d144555d..241a1aa08 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/part_route_eval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,20 +42,21 @@ #include "route.h" /** Route Evaluator */ -class PartRouteEval : public eoEvalFunc { - -public : +class PartRouteEval : public eoEvalFunc + { - /** Constructor */ - PartRouteEval (float __from, float __to) ; - - void operator () (Route & __route) ; - -private : + public : - float from, to ; + /** Constructor */ + PartRouteEval (float __from, float __to) ; -} ; + void operator () (Route & __route) ; + + private : + + float from, to ; + + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.cpp index 8c37ad6a0..a55689aa2 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,47 +41,50 @@ #include "partial_mapped_xover.h" #include "mix.h" -void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __cut2) { - +void PartialMappedXover :: repair (Route & __route, unsigned __cut1, unsigned __cut2) +{ + unsigned v [__route.size ()] ; // Number of times a cities are visited ... - + for (unsigned i = 0 ; i < __route.size () ; i ++) v [i] = 0 ; - + for (unsigned i = 0 ; i < __route.size () ; i ++) v [__route [i]] ++ ; - + std :: vector vert ; for (unsigned i = 0 ; i < __route.size () ; i ++) if (! v [i]) vert.push_back (i) ; - + mix (vert) ; for (unsigned i = 0 ; i < __route.size () ; i ++) if (i < __cut1 || i >= __cut2) - if (v [__route [i]] > 1) { - __route [i] = vert.back () ; - vert.pop_back () ; - } + if (v [__route [i]] > 1) + { + __route [i] = vert.back () ; + vert.pop_back () ; + } } -bool PartialMappedXover :: operator () (Route & __route1, Route & __route2) { - +bool PartialMappedXover :: operator () (Route & __route1, Route & __route2) +{ + unsigned cut1 = rng.random (__route1.size ()), cut2 = rng.random (__route2.size ()) ; - + if (cut2 < cut1) std :: swap (cut1, cut2) ; - + // Between the cuts for (unsigned i = cut1 ; i < cut2 ; i ++) std :: swap (__route1 [i], __route2 [i]) ; - + // Outside the cuts repair (__route1, cut1, cut2) ; repair (__route2, cut1, cut2) ; - + __route1.invalidate () ; __route2.invalidate () ; diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.h b/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.h index e3ff29ad7..23453bb9b 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/partial_mapped_xover.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,15 +42,16 @@ #include "route.h" /** Partial Mapped Crossover */ -class PartialMappedXover : public eoQuadOp { - -public : - - bool operator () (Route & __route1, Route & __route2) ; +class PartialMappedXover : public eoQuadOp + { -private : - - void repair (Route & __route, unsigned __cut1, unsigned __cut2) ; -} ; + public : + + bool operator () (Route & __route1, Route & __route2) ; + + private : + + void repair (Route & __route, unsigned __cut1, unsigned __cut2) ; + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/route.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/route.cpp index 73a035539..249056f30 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/route.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/route.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,13 +36,14 @@ #include "route.h" -unsigned length (const Route & __route) { +unsigned length (const Route & __route) +{ unsigned len = 0 ; - + for (unsigned i = 0; i < numNodes; i ++) - len += distance (__route [i], __route [(i + 1) % numNodes]) ; - + len += distance (__route [i], __route [(i + 1) % numNodes]) ; + return len; } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/route.h b/trunk/paradiseo-peo/tutorial/examples/tsp/route.h index 13071e2ec..30c8e16b5 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/route.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/route.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,8 +41,8 @@ #include "node.h" -typedef eoVector Route; +typedef eoVector Route; -unsigned length (const Route & __route); +unsigned length (const Route & __route); #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.cpp index d16c15ed4..97c87114c 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,6 +36,7 @@ #include "route_eval.h" -void RouteEval :: operator () (Route & __route) { - __route.fitness (- (int) length (__route)); +void RouteEval :: operator () (Route & __route) +{ + __route.fitness (- (int) length (__route)); } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.h b/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.h index 5e79b7b9f..55ceb9b48 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/route_eval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,11 +41,12 @@ #include "route.h" -class RouteEval : public eoEvalFunc { - -public : - - void operator () (Route & __route) ; -} ; +class RouteEval : public eoEvalFunc + { + + public : + + void operator () (Route & __route) ; + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.cpp index 6e611d76e..c3301cd46 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -39,13 +39,14 @@ #include "route_init.h" #include "node.h" -void RouteInit :: operator () (Route & __route) { +void RouteInit :: operator () (Route & __route) +{ __route.clear (); - + for (unsigned i = 0 ; i < numNodes ; i ++) __route.push_back (i); - - for (unsigned i = 0 ; i < numNodes ; i ++) + + for (unsigned i = 0 ; i < numNodes ; i ++) std :: swap (__route [i], __route [rng.random (numNodes)]); } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.h b/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.h index b5311b1f7..4f48fc26c 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/route_init.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,11 +41,12 @@ #include "route.h" -class RouteInit : public eoInit { - -public : - - void operator () (Route & __route); -} ; +class RouteInit : public eoInit + { + + public : + + void operator () (Route & __route); + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.cpp index f149b6de1..577723730 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,13 +36,15 @@ #include "two_opt.h" -void TwoOpt :: operator () (Route & __route) { - - unsigned i = 0; +void TwoOpt :: operator () (Route & __route) +{ - while ((2 * i) < (second - first)) { - - std :: swap (__route [first + i], __route [second - i]); - i ++; - } + unsigned i = 0; + + while ((2 * i) < (second - first)) + { + + std :: swap (__route [first + i], __route [second - i]); + i ++; + } } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.h b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.h index 5c9e985ea..68d4d95cb 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -42,12 +42,13 @@ #include "route.h" -class TwoOpt : public moMove , public std :: pair { - -public : - - void operator () (Route & __route); +class TwoOpt : public moMove , public std :: pair + { -} ; + public : + + void operator () (Route & __route); + + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.cpp index 60be43d9f..ba5548789 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,16 +37,17 @@ #include "two_opt_incr_eval.h" #include "node.h" -int TwoOptIncrEval :: operator () (const TwoOpt & __move, const Route & __route) { - +int TwoOptIncrEval :: operator () (const TwoOpt & __move, const Route & __route) +{ + /* From */ Node v1 = __route [__move.first], v1_left = __route [(__move.first - 1 + numNodes) % numNodes]; - + /* To */ Node v2 = __route [__move.second], v2_right = __route [(__move.second + 1) % numNodes]; - + if (v1 == v2 || v2_right == v1) return __route.fitness (); - else + else return __route.fitness () - distance (v1_left, v2) - distance (v1, v2_right) + distance (v1_left, v1) + distance (v2, v2_right); } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.h b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.h index 7cce92aa7..9ee08fad4 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_incr_eval.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -40,12 +40,13 @@ #include #include "two_opt.h" -class TwoOptIncrEval : public moMoveIncrEval { +class TwoOptIncrEval : public moMoveIncrEval + { -public : - - int operator () (const TwoOpt & __move, const Route & __route) ; + public : -} ; + int operator () (const TwoOpt & __move, const Route & __route) ; + + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.cpp index 862b5236e..32487b5b4 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -36,7 +36,8 @@ #include "two_opt_init.h" -void TwoOptInit :: operator () (TwoOpt & __move, const Route & __route) { - +void TwoOptInit :: operator () (TwoOpt & __move, const Route & __route) +{ + __move.first = __move.second = 0; } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.h b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.h index fc290b4f8..bb4eb0dcc 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_init.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,12 +41,13 @@ #include "two_opt.h" -class TwoOptInit : public moMoveInit { - -public : - - void operator () (TwoOpt & __move, const Route & __route) ; - -} ; +class TwoOptInit : public moMoveInit + { + + public : + + void operator () (TwoOpt & __move, const Route & __route) ; + + } ; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.cpp index a80e973be..a2ec7face 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,19 +37,22 @@ #include "two_opt_next.h" #include "node.h" -bool TwoOptNext :: operator () (TwoOpt & __move, const Route & __route) { +bool TwoOptNext :: operator () (TwoOpt & __move, const Route & __route) +{ if (__move.first == numNodes - 1 && __move.second == numNodes - 1) return false; - - else { - - __move.second ++; - if (__move.second == numNodes) { - - __move.first ++; - __move.second = __move.first; + + else + { + + __move.second ++; + if (__move.second == numNodes) + { + + __move.first ++; + __move.second = __move.first; + } + return true ; } - return true ; - } } diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.h b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.h index 09844b8c4..6c2f51442 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_next.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,12 +41,13 @@ #include "two_opt.h" -class TwoOptNext : public moNextMove { +class TwoOptNext : public moNextMove + { -public : - - bool operator () (TwoOpt & __move, const Route & __route); - -}; + public : + + bool operator () (TwoOpt & __move, const Route & __route); + + }; #endif diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.cpp b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.cpp index 9fa9270c8..f38fb80c8 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.cpp +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.cpp @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -37,13 +37,14 @@ #include #include "two_opt_rand.h" -#include "node.h" +#include "node.h" -void TwoOptRand :: operator () (TwoOpt & __move, const Route & __route) { +void TwoOptRand :: operator () (TwoOpt & __move, const Route & __route) +{ __move.second = rng.random (numNodes); __move.first = rng.random (__move.second); } - + diff --git a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.h b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.h index c2cac3a7b..85868d236 100644 --- a/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.h +++ b/trunk/paradiseo-peo/tutorial/examples/tsp/two_opt_rand.h @@ -1,4 +1,4 @@ -/* +/* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 * (C) OPAC Team, LIFL, 2002-2007 @@ -41,12 +41,13 @@ #include "two_opt.h" -class TwoOptRand : public eoMoveRand { - -public : - - void operator () (TwoOpt & __move, const Route & __route) ; - -} ; +class TwoOptRand : public eoMoveRand + { + + public : + + void operator () (TwoOpt & __move, const Route & __route) ; + + } ; #endif