00001 #include "GLBaseOrganism.h" 00002 #include "GLUtils.h" 00003 #include "GLLogicError.h" 00004 00008 GLBaseOrganism::GLBaseOrganism() 00009 { 00010 m_is_evaluated = false; 00011 m_locked_in_memory = true; 00012 m_tag = 0; 00013 m_fitness = NULL; 00014 }//Constructor 00015 00020 GLBaseOrganism::GLBaseOrganism(const GLBaseOrganism& source) 00021 { 00022 m_is_evaluated = source.m_is_evaluated; 00023 if (m_is_evaluated) 00024 { 00025 m_fitness = source.m_fitness->copy(); 00026 } 00027 m_tag = source.m_tag; 00028 }//Constructor 00029 00033 GLBaseOrganism::~GLBaseOrganism() 00034 { 00035 if (m_fitness != NULL) delete m_fitness; 00036 }//Destructor 00037 00046 void GLBaseOrganism::assertCompatibility(const GLBaseOrganism* source, 00047 const string& message) const 00048 { 00049 if (dynamic_cast<const GLBaseOrganism*>(source) == NULL) 00050 { 00051 char errormsg[1000]; 00052 sprintf(errormsg, "\nGLBaseOrganism::assertCompatibility\n" 00053 "%s\n" 00054 "Passed pointer is either NULL or not compatible " 00055 "with this class\n", 00056 message.c_str()); 00057 throw GLLogicError(errormsg); 00058 } 00059 }//assertCompatibility 00060 00068 const GLBaseFitness* GLBaseOrganism::evaluate( 00069 GLBaseEvaluator *evaluator) 00070 { 00071 setFitnessValue(evaluator->evaluateOrganism(this)); 00072 return m_fitness; 00073 }//evaluate 00074 00075 00081 void GLBaseOrganism::resetFitness() 00082 { 00083 if (m_fitness != NULL) 00084 { 00085 delete m_fitness; 00086 } 00087 m_is_evaluated = false; 00088 }//resetFitness 00089 00096 void GLBaseOrganism::setFitnessValue(const GLBaseFitness* fitness) 00097 { 00098 if (m_fitness != NULL) 00099 { 00100 delete m_fitness; 00101 } 00102 m_fitness = fitness; 00103 m_is_evaluated = fitness != NULL; 00104 }//setFitnessValue 00105 00106 /*-------------------------- INTERNAL CLASSES ---------------------*/ 00107 00114 bool GLBaseOrganism::CompareFitnessLess::operator()( 00115 const GLBaseOrganism* left, 00116 const GLBaseOrganism* right) const 00117 { 00118 GLUtils::assertEvaluated(left, 00119 "'left' from " 00120 "GLBaseOrganism::CompareOrganismsByFitness::operator()"); 00121 GLUtils::assertEvaluated(right, 00122 "'right' from " 00123 "GLBaseOrganism::CompareOrganismsByFitness::operator()"); 00124 return left->getFitness()->isLess(right->getFitness()); 00125 }//operator() 00126 00127