00001 #include "../ECF_base.h"
00002 #include "Tree.h"
00003 #include "TreeMutNodeReplace.h"
00004 #include <stdio.h>
00005
00006
00007 namespace Tree
00008 {
00009
00010 void TreeMutNodeReplace::registerParameters(StateP state)
00011 {
00012 myGenotype_->registerParameter(state, "mut.nodereplace", (voidP) new double(0), ECF::DOUBLE);
00013 }
00014
00015
00016 bool TreeMutNodeReplace::initialize(StateP state)
00017 {
00018 voidP sptr = myGenotype_->getParameterValue(state, "mut.nodereplace");
00019 probability_ = *((double*)sptr.get());
00020 return true;
00021 }
00022
00023
00024 bool TreeMutNodeReplace::mutate(GenotypeP gene)
00025 {
00026 Tree* tree = (Tree*) (gene.get());
00027
00028
00029 uint origNodeIndex = state_->getRandomizer()->getRandomInteger((int) tree->size());
00030 std::string origNodeName = tree->at(origNodeIndex)->primitive_->getName();
00031 int origNodeNumberOfArguments = tree->at(origNodeIndex)->primitive_->getNumberOfArguments();
00032
00033
00034 PrimitiveP primitive;
00035 uint tries = 0;
00036 do {
00037 primitive = tree->primitiveSet_->getRandomPrimitive();
00038 tries++;
00039 } while((origNodeName == primitive->getName()
00040 || origNodeNumberOfArguments != primitive->getNumberOfArguments()) && tries < 4);
00041
00042 if(origNodeName == primitive->getName() || origNodeNumberOfArguments != primitive->getNumberOfArguments()) {
00043 ECF_LOG(state_, 5, "TreeMutNodeReplace not successful.");
00044 return false;
00045 }
00046
00047 tree->at(origNodeIndex)->setPrimitive(primitive);
00048
00049 std::stringstream log;
00050 log << "TreeMutNodeReplace successful (oldNode = " << origNodeName << ", ";
00051 log << "newNode = " << primitive->getName() << ")";
00052 ECF_LOG(state_, 5, log.str());
00053
00054 return true;
00055 }
00056
00057 }