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 EO_H
00026 #define EO_H
00027
00028
00029
00030 #include <stdexcept>
00031 #include <eoObject.h>
00032 #include <eoPersistent.h>
00033
00034
00044 template<class F = double> class EO: public eoObject, public eoPersistent
00045 {
00046 public:
00047 typedef F Fitness;
00048
00051 EO(): repFitness(Fitness()), invalidFitness(true) { }
00052
00054 virtual ~EO() {};
00055
00057 const Fitness& fitness() const {
00058 if (invalid())
00059 throw std::runtime_error("invalid fitness");
00060 return repFitness;
00061 }
00062
00064 Fitness& fitnessReference() {
00065 if (invalid()) throw std::runtime_error("invalid fitness");
00066 return repFitness;
00067 }
00068
00069
00070 void invalidate() { invalidFitness = true; repFitness = Fitness(); }
00071
00075 void fitness(const Fitness& _fitness)
00076 {
00077 repFitness = _fitness;
00078 invalidFitness = false;
00079 }
00080
00084 bool invalid() const { return invalidFitness; }
00085
00089 bool operator<(const EO& _eo2) const { return fitness() < _eo2.fitness(); }
00090 bool operator>(const EO& _eo2) const { return !(fitness() <= _eo2.fitness()); }
00091
00093
00094
00098 virtual std::string className() const { return "EO"; }
00099
00108 virtual void readFrom(std::istream& _is) {
00109
00110
00111
00112 std::string fitness_str;
00113 int pos = _is.tellg();
00114 _is >> fitness_str;
00115
00116 if (fitness_str == "INVALID")
00117 {
00118 invalidFitness = true;
00119 }
00120 else
00121 {
00122 invalidFitness = false;
00123 _is.seekg(pos);
00124 _is >> repFitness;
00125 }
00126 }
00127
00132 virtual void printOn(std::ostream& _os) const {
00133
00134
00135
00136 if (invalid()) {
00137 _os << "INVALID ";
00138 }
00139 else
00140 {
00141 _os << repFitness << ' ';
00142 }
00143
00144 }
00145
00147
00148 private:
00149 Fitness repFitness;
00150 bool invalidFitness;
00151 };
00152
00153
00154
00155 #endif