/*! * \brief Return indices of the trees that can be invoked by the module. * \param outCandidates Indices of tree that can be selected as invokable in the actual context. * \param inNumberArguments Number of arguments for which the selection is desired. * \param ioContext Evolutionary context. */ void GP::Module::getCandidatesToInvoke(std::vector<unsigned int>& outCandidates, unsigned int inNumberArguments, GP::Context& ioContext) const { Beagle_StackTraceBeginM(); outCandidates.clear(); for(unsigned int i=0; i<ioContext.getCallStackSize(); ++i) { if(ioContext.getGenotype()[ioContext.getCallStackElement(i)].mPrimitive->getName() == getName()) return; } Component::Handle lComponent = ioContext.getSystem().getComponent("ModuleVector"); GP::ModuleVectorComponent::Handle lModVector = castHandleT<GP::ModuleVectorComponent>(lComponent); if(lModVector==NULL) { throw Beagle_RunTimeExceptionM(std::string("GP system is not configured with a module vector. ")+ std::string("Consider adding a GP::ModuleVectorComponent object to the system.")); } for(unsigned int i=0; i<lModVector->size(); ++i) { if((*lModVector)[i]==NULL) continue; const unsigned int lNbArgsTree = (*lModVector)[i]->getNumberArguments(); if(inNumberArguments == GP::Primitive::eAny) outCandidates.push_back(i); else if((inNumberArguments==GP::Primitive::eBranch) && (lNbArgsTree>0)) outCandidates.push_back(i); else if(inNumberArguments == lNbArgsTree) outCandidates.push_back(i); } Beagle_StackTraceEndM(); }
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(); } }
/*! * \brief Validate the arguments position in the tree. * \param ioContext Evolutionary context. * \return True if the argument is correctly positioned, false if not. * \throw Beagle::AssertException If the context is in a bad state. */ bool GP::Argument::validate(GP::Context& ioContext) const { Beagle_StackTraceBeginM(); if(GP::Primitive::validate(ioContext) == false) return false; if(ioContext.getGenotypeIndex() == 0) return false; if(mIndex >= ioContext.getGenotype().getNumberArguments()) return false; return true; Beagle_StackTraceEndM(); }
/*! * \brief Read an argument primitive from XML subtree. * \param inIter XML iterator to read primitive from. * \param ioContext Evolutionary context. */ void GP::Argument::readWithContext(PACC::XML::ConstIterator inIter, GP::Context& ioContext) { Beagle_StackTraceBeginM(); GP::Primitive::readWithContext(inIter, ioContext); std::string lIndexValue = inIter->getAttribute("id"); if(lIndexValue.empty()==false) { mIndex = str2uint(lIndexValue); Beagle_AssertM(mIndex < ioContext.getGenotype().getNumberArguments()); } Beagle_StackTraceEndM(); }
/*! * \brief Return a reference to the actual argument. * \param inNumberArguments * \param ioContext Evolutionary context. * \return Handle to argument. */ GP::Primitive::Handle GP::Argument::giveReference(unsigned int inNumberArguments, GP::Context& ioContext) { Beagle_StackTraceBeginM(); if(mIndex!=eGenerator) return this; const unsigned int lTreeNbArgs = ioContext.getGenotype().getNumberArguments(); Beagle_AssertM(lTreeNbArgs > 0); const unsigned int lGenIndex = ioContext.getSystem().getRandomizer().rollInteger(0,(lTreeNbArgs-1)); return generateArgument(lGenIndex); Beagle_StackTraceEndM(); }
/*! * \brief Return selection weight of the argument primitive. * \param inNumberArguments Number of arguments to get weight for. * \param ioContext Evolutionary context. * \return Selection weight for the given number of arguments. */ double GP::Argument::getSelectionWeight(unsigned int inNumberArguments, GP::Context& ioContext) const { Beagle_StackTraceBeginM(); if(ioContext.getGenotypeIndex() == 0) return 0.0; if((inNumberArguments==0) || (inNumberArguments==GP::Primitive::eAny)) { const unsigned int lTreeNbArgs = ioContext.getGenotype().getNumberArguments(); if(lTreeNbArgs > 0) return double(lTreeNbArgs); } return 0.0; Beagle_StackTraceEndM(); }
/*! * \brief Validate the module position in the tree. * \param ioContext Evolutionary context. * \return True if the module is correctly positioned, false if not. * \throw Beagle::AssertException If the context is in a bad state. */ bool GP::Module::validate(GP::Context& ioContext) const { Beagle_StackTraceBeginM(); for(unsigned int i=0; i<ioContext.getCallStackSize(); ++i) { if(ioContext.getGenotype()[ioContext.getCallStackElement(i)].mPrimitive->getName() == getName()) return false; } Component::Handle lComponent = ioContext.getSystem().getComponent("ModuleVector"); GP::ModuleVectorComponent::Handle lModVector = castHandleT<GP::ModuleVectorComponent>(lComponent); if(lModVector==NULL) { throw Beagle_RunTimeExceptionM(std::string("GP system is not configured with a module vector. ")+ std::string("Consider adding a GP::ModuleVectorComponent object to the system.")); } Beagle_AssertM((*lModVector)[mIndex]!=NULL); if((*lModVector)[mIndex]->getNumberArguments() != getNumberArguments()) return false; return GP::Primitive::validate(ioContext); Beagle_StackTraceEndM(); }