00001 #include "../ECF_base.h"
00002 #include "Tree.h"
00003 #include "TreeMutHoist.h"
00004 #include <stdio.h>
00005
00006
00007 namespace Tree
00008 {
00009
00010 void TreeMutHoist::registerParameters(StateP state)
00011 {
00012 myGenotype_->registerParameter(state, "mut.hoist", (voidP) new double(0), ECF::DOUBLE);
00013 }
00014
00015
00016 bool TreeMutHoist::initialize(StateP state)
00017 {
00018 voidP sptr = myGenotype_->getParameterValue(state, "mut.hoist");
00019 probability_ = *((double*)sptr.get());
00020 return true;
00021 }
00022
00023
00024 bool TreeMutHoist::mutate(GenotypeP gene)
00025 {
00026 Tree* tree = (Tree*) (gene.get());
00027
00028
00029 Tree* copyTree = tree->copy();
00030 tree->clear();
00031
00032
00033 uint chosenNode = state_->getRandomizer()->getRandomInteger((int) copyTree->size());
00034 uint chosenNodeSubtreeSize = copyTree->at(chosenNode)->size_;
00035
00036
00037 for(uint i = 0; i < chosenNodeSubtreeSize; i++) {
00038 NodeP node = static_cast<NodeP> (new Node(copyTree->at(chosenNode + i)->primitive_));
00039 tree->addNode(node);
00040 }
00041
00042 tree->update();
00043 delete copyTree;
00044
00045 std::stringstream log;
00046 log << "TreeMutHoist successful (hoisted subtree = ";
00047 for(uint i = 0; i < tree->size(); i++)
00048 log << tree->at(i)->primitive_->getName() << " ";
00049 log << ")";
00050 ECF_LOG(state_, 5, log.str());
00051
00052 return true;
00053 }
00054
00055 }