26 RandomizerP randP = cart->state_->getRandomizer();
27 const uint nOutputs = cart->nOutputs_;
28 const uint nRows = cart->nRows_;
29 const uint nCols = cart->nCols_;
30 const uint nInputs = cart->nInputs_;
31 const uint nLevelsBack = cart->nLevelsBack_;
33 std::vector<uint> activeNodes;
34 cart->getActiveFunctionNodes(activeNodes);
37 if (activeNodes.size() == (nRows * nCols))
40 std::vector<uint> silentNodes;
42 for(uint i = nInputs; i < cart->nodes_.size(); i++)
43 if (iActive < activeNodes.size() && activeNodes[iActive] == i)
46 silentNodes.push_back(i);
49 uint silentNodeIndex = randP->getRandomInteger((uint) silentNodes.size());
50 uint silentNode = silentNodes[silentNodeIndex];
51 uint silentNodeColumn = (silentNode - nInputs) / nRows;
54 uint nextColumnNode = (silentNodeColumn + 1) * nRows + nInputs;
58 std::vector<uint> validNodes;
59 for (uint node : activeNodes) {
60 uint nodeColumn = (node - nInputs) / nRows;
61 if (node >= nextColumnNode && (nodeColumn - silentNodeColumn) <= nLevelsBack)
62 validNodes.push_back(node);
66 for (uint i = 0; i < nOutputs; i++)
67 validNodes.push_back(i + (uint) cart->nodes_.size());
69 uint mutateNodeIndex = randP->getRandomInteger((uint) validNodes.size());
70 uint mutateNode = validNodes[mutateNodeIndex];
73 if (mutateNode >= cart->nodes_.size()) {
74 cart->outputs_[mutateNode - cart->nodes_.size()] = silentNode;
77 uint input = randP->getRandomInteger(cart->nodes_[mutateNode].primitive_->getNumberOfArguments());
78 cart->nodes_[mutateNode].arguments_[input] = silentNode;