00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _eoCombinedInit_h
00026 #define _eoCombinedInit_h
00027
00028 #include <eoInit.h>
00029
00034 template< class EOT>
00035 class eoCombinedInit: public eoInit<EOT> {
00036 public:
00037
00039 eoCombinedInit( eoInit<EOT>& _init, double _rate)
00040 : eoInit<EOT> ()
00041 {
00042 initializers.push_back(&_init);
00043 rates.push_back(_rate);
00044 }
00045
00050 void add(eoInit<EOT> & _init, double _rate, bool _verbose=false)
00051 {
00052 initializers.push_back(&_init);
00053 rates.push_back(_rate);
00054
00055 if (_verbose)
00056 printOn(std::cout);
00057 }
00058
00060 virtual void printOn(std::ostream & _os)
00061 {
00062 double total = 0;
00063 unsigned i;
00064 for (i=0; i<initializers.size(); i++)
00065 total += rates[i];
00066 _os << "In " << className() << "\n" ;
00067 for (i=0; i<initializers.size(); i++)
00068 _os << initializers[i]->className() << " with rate " << 100*rates[i]/total << " %\n";
00069 }
00070
00074 virtual void operator() ( EOT & _eo )
00075 {
00076 unsigned what = rng.roulette_wheel(rates);
00077 (*initializers[what])(_eo);
00078 return;
00079 }
00080
00081 virtual std::string className(void) const { return "eoCombinedInit"; }
00082
00083 private:
00084 std::vector<eoInit<EOT>*> initializers;
00085 std::vector<double> rates;
00086 };
00087
00088 #endif
00089