00001
00025
00026
00027 #ifndef _eoTruncatedSelectMany_h
00028 #define _eoTruncatedSelectMany_h
00029
00030
00031
00032 #include <eoSelect.h>
00033 #include <eoSelectOne.h>
00034 #include <utils/eoHowMany.h>
00035 #include <math.h>
00036
00037
00052 template<class EOT>
00053 class eoTruncatedSelectMany : public eoSelect<EOT>
00054 {
00055 public:
00057 eoTruncatedSelectMany(eoSelectOne<EOT>& _select,
00058 double _rateGenitors, double _rateFertile,
00059 bool _interpret_as_rateG = true,
00060 bool _interpret_as_rateF = true)
00061 : select(_select),
00062 howManyGenitors(_rateGenitors, _interpret_as_rateG),
00063 howManyFertile(_rateFertile, _interpret_as_rateF) {}
00064
00065
00066 eoTruncatedSelectMany(eoSelectOne<EOT>& _select,
00067 eoHowMany _howManyGenitors, eoHowMany _howManyFertile)
00068 : select(_select), howManyGenitors(_howManyGenitors),
00069 howManyFertile(_howManyFertile) {}
00070
00077 virtual void operator()(const eoPop<EOT>& _source, eoPop<EOT>& _dest)
00078 {
00079 unsigned target = howManyGenitors(_source.size());
00080
00081 _dest.resize(target);
00082
00083 unsigned nbFertile = howManyFertile(_source.size());
00084
00085
00086 if (nbFertile == _source.size())
00087 {
00088 select.setup(_source);
00089
00090 for (size_t i = 0; i < _dest.size(); ++i)
00091 _dest[i] = select(_source);
00092 }
00093 else
00094 {
00095
00096
00097
00098 eoPop<EOT> tmpPop = _source;
00099
00100 tmpPop.sort();
00101 tmpPop.resize(nbFertile);
00102 tmpPop.shuffle();
00103
00104 select.setup(tmpPop);
00105
00106 for (size_t i = 0; i < _dest.size(); ++i)
00107 _dest[i] = select(tmpPop);
00108 }
00109 }
00110
00111 private :
00112 eoSelectOne<EOT>& select;
00113 eoHowMany howManyGenitors;
00114 eoHowMany howManyFertile;
00115 };
00116
00117 #endif