00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- 00002 00003 //----------------------------------------------------------------------------- 00004 // EO.h 00005 // (c) GeNeura Team 1998 00006 /* 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with this library; if not, write to the Free Software 00019 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 00021 Contact: todos@geneura.ugr.es, http://geneura.ugr.es 00022 */ 00023 //----------------------------------------------------------------------------- 00024 00025 #ifndef EO_H 00026 #define EO_H 00027 00028 //----------------------------------------------------------------------------- 00029 00030 #include <stdexcept> // std::runtime_error 00031 #include <eoObject.h> // eoObject 00032 #include <eoPersistent.h> // eoPersistent 00033 00034 //----------------------------------------------------------------------------- 00044 template<class F> class EO: public eoObject, public eoPersistent 00045 { 00046 public: 00047 typedef F Fitness; 00048 00054 EO(): repFitness(Fitness()), invalidFitness(true) {} 00055 00057 virtual ~EO() {}; 00058 00060 Fitness fitness() const { 00061 if (invalid()) 00062 throw std::runtime_error("invalid fitness"); 00063 return repFitness; 00064 } 00065 00066 // Set fitness as invalid. 00067 void invalidate() { invalidFitness = true; } 00068 00072 void fitness(const Fitness& _fitness) 00073 { 00074 repFitness = _fitness; 00075 invalidFitness = false; 00076 } 00077 00081 bool invalid() const { return invalidFitness; } 00082 00086 bool operator<(const EO& _eo2) const { return fitness() < _eo2.fitness(); } 00087 bool operator>(const EO& _eo2) const { return !(fitness() <= _eo2.fitness()); } 00088 00090 00091 00095 virtual std::string className() const { return "EO"; } 00096 00105 virtual void readFrom(std::istream& _is) { 00106 00107 // the new version of the reafFrom function. 00108 // It can distinguish between valid and invalid fitness values. 00109 std::string fitness_str; 00110 int pos = _is.tellg(); 00111 _is >> fitness_str; 00112 00113 if (fitness_str == "INVALID") 00114 { 00115 invalidFitness = true; 00116 } 00117 else 00118 { 00119 invalidFitness = false; 00120 _is.seekg(pos); // rewind 00121 _is >> repFitness; 00122 } 00123 } 00124 00129 virtual void printOn(std::ostream& _os) const { 00130 00131 00132 // the latest version of the code. Very similar to the old code 00133 if (invalid()) { 00134 _os << "INVALID "; 00135 } 00136 else 00137 { 00138 _os << repFitness << ' '; 00139 } 00140 00141 } 00142 00144 00145 private: 00146 Fitness repFitness; // value of fitness for this chromosome 00147 bool invalidFitness; // true if the value of fitness is invalid 00148 }; 00149 00150 //----------------------------------------------------------------------------- 00151 00152 #endif
1.4.7