void TreeSTag::removeNOP(Individual& inIndividual, GP::Context& ioContext) { // Beagle_LogDebugM( // ioContext.getSystem().getLogger(), // "individual", "TreeSTag", // std::string("Individual before NOP removal: ")+inIndividual.serialize() // ); TreeSTag::Handle lTree = castHandleT<TreeSTag>((inIndividual)[0]); GP::Individual& lIndividual = castObjectT<GP::Individual&>(inIndividual); GP::Individual::Handle lOldIndividualHandle = ioContext.getIndividualHandle(); unsigned int lOldGenotypeIndex = ioContext.getGenotypeIndex(); GP::Tree::Handle lOldGenotypeHandle = ioContext.getGenotypeHandle(); ioContext.setIndividualHandle(&lIndividual); ioContext.setGenotypeIndex(0); ioContext.setGenotypeHandle(lIndividual[0]); ioContext.getCallStack().clear(); removeNOPLoop(0,ioContext); ioContext.setIndividualHandle(lOldIndividualHandle); ioContext.setGenotypeIndex(lOldGenotypeIndex); ioContext.setGenotypeHandle(lOldGenotypeHandle); // Beagle_LogDebugM( // ioContext.getSystem().getLogger(), // "individual", "TreeSTag", // std::string("Individual after NOP removal: ")+inIndividual.serialize() // ); }
void TreeSTag::removeNOPLoop(unsigned int inN, GP::Context& ioContext) { GP::Tree& lActualTree = ioContext.getGenotype(); if(lActualTree[inN].mPrimitive->getName() == "NOP") { //Decrease the subtree size of the call stack for(unsigned i = 0; i < ioContext.getCallStackSize(); ++i) { lActualTree[ioContext.getCallStack()[i]].mSubTreeSize -= 1; } //Delete the primitive from the tree std::vector< GP::Node,BEAGLE_STLALLOCATOR<GP::Node> >::iterator lPrimitiveIter = lActualTree.begin(); lPrimitiveIter += inN; lActualTree.erase(lPrimitiveIter); // cout << "Callstack: " << ioContext.getCallStack()[0]; // for(unsigned int i = 1; i < ioContext.getCallStackSize() ; ++i) { // cout << ", " << ioContext.getCallStack()[0]; // } cout << endl; // for(unsigned int i = 0; i < lActualTree.size(); ++i) { // cout << i << " : " << lActualTree[i].mPrimitive->getName() << " : " << lActualTree[i].mSubTreeSize << endl; // } removeNOPLoop(inN, ioContext); } else { //Parse all arguments ioContext.pushCallStack(inN); for(unsigned int i = 0; i < lActualTree[inN].mPrimitive->getNumberArguments(); ++i) { removeNOPLoop(lActualTree[inN].mPrimitive->getChildrenNodeIndex(i,ioContext), ioContext); } ioContext.popCallStack(); } }