00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __peoParaSGATransform_h
00010 #define __peoParaSGATransform_h
00011
00012 #include "peoTransform.h"
00013 #include "core/thread.h"
00014 #include "core/messaging.h"
00015 #include "core/peo_debug.h"
00016
00017
00018 extern int getNodeRank();
00019
00020
00021 template< class EOT > class peoParaSGATransform : public peoTransform< EOT > {
00022
00023 public:
00024
00025 using peoTransform< EOT > :: requestResourceRequest;
00026 using peoTransform< EOT > :: resume;
00027 using peoTransform< EOT > :: stop;
00028 using peoTransform< EOT > :: getOwner;
00029
00030 peoParaSGATransform(
00031
00032 eoQuadOp< EOT >& __cross,
00033 double __cross_rate,
00034 eoMonOp< EOT >& __mut,
00035 double __mut_rate
00036 );
00037
00038 void operator()( eoPop< EOT >& __pop );
00039
00040 void packData();
00041
00042 void unpackData();
00043
00044 void execute();
00045
00046 void packResult();
00047
00048 void unpackResult();
00049
00050 void notifySendingData();
00051 void notifySendingAllResourceRequests();
00052
00053 private:
00054
00055 eoQuadOp< EOT >& cross;
00056 double cross_rate;
00057
00058 eoMonOp< EOT >& mut;
00059 double mut_rate;
00060
00061 unsigned idx;
00062
00063 eoPop< EOT >* pop;
00064
00065 EOT father, mother;
00066
00067 unsigned num_term;
00068 };
00069
00070 template< class EOT > peoParaSGATransform< EOT > :: peoParaSGATransform(
00071
00072 eoQuadOp< EOT >& __cross,
00073 double __cross_rate,
00074 eoMonOp < EOT >& __mut,
00075 double __mut_rate
00076
00077 ) : cross( __cross ), cross_rate( __cross_rate ), mut( __mut ), mut_rate( __mut_rate )
00078 {
00079
00080 }
00081
00082
00083 template< class EOT > void peoParaSGATransform< EOT > :: packData() {
00084
00085 pack( idx );
00086 :: pack( pop->operator[]( idx++ ) );
00087 :: pack( pop->operator[]( idx++ ) );
00088 }
00089
00090
00091 template< class EOT > void peoParaSGATransform< EOT > :: unpackData() {
00092
00093 unpack( idx );
00094 :: unpack( father );
00095 :: unpack( mother );
00096 }
00097
00098
00099 template< class EOT > void peoParaSGATransform< EOT > :: execute() {
00100
00101 if( rng.uniform() < cross_rate ) cross( mother, father );
00102
00103 if( rng.uniform() < mut_rate ) mut( mother );
00104 if( rng.uniform() < mut_rate ) mut( father );
00105 }
00106
00107
00108 template< class EOT > void peoParaSGATransform< EOT > :: packResult() {
00109
00110 pack( idx );
00111 :: pack( father );
00112 :: pack( mother );
00113 }
00114
00115
00116 template< class EOT > void peoParaSGATransform< EOT > :: unpackResult() {
00117
00118 unsigned sidx;
00119
00120 unpack( sidx );
00121 :: unpack( pop->operator[]( sidx++ ) );
00122 :: unpack( pop->operator[]( sidx ) );
00123 num_term += 2;
00124
00125 if( num_term == pop->size() ) {
00126
00127 getOwner()->setActive();
00128 resume();
00129 }
00130 }
00131
00132
00133 template< class EOT > void peoParaSGATransform< EOT > :: operator()( eoPop < EOT >& __pop ) {
00134
00135 printDebugMessage( "performing the parallel transformation step." );
00136 pop = &__pop;
00137 idx = 0;
00138 num_term = 0;
00139 requestResourceRequest( __pop.size() / 2 );
00140 stop();
00141 }
00142
00143
00144 template< class EOT > void peoParaSGATransform< EOT > :: notifySendingData() {
00145
00146 }
00147
00148
00149 template< class EOT > void peoParaSGATransform< EOT > :: notifySendingAllResourceRequests() {
00150
00151 getOwner()->setPassive();
00152 }
00153
00154
00155 #endif