#pragma once #include "./Instruction.h" #include "../Cell.h" #include "../CelularEncoding.h" namespace NeuralNetworks { namespace ConstructiveAlgorithms { namespace CelularEncoding { namespace Instruction{ class Par : public Instruction{ public: virtual void run(Cell &cell, CelularEncoding &encoding, const std::vector &) override { Cell &newCell = encoding.addCell(cell.getCodePointer()->c2); if(cell.isOutput()) { newCell.setOutput(); } if(cell.isInput()) { newCell.setInput(); } newCell.setLife(cell.getLife()); newCell.setBias(cell.getBias()); newCell.setLinks(cell.getLinks()); for(auto &cellI:encoding.getCells()) { for( const Link &link: cellI->getLinks()) { if(link.neuron == cell.getID()) { Link newLink (link); newLink.neuron=newCell.getID(); cellI->addLink(newLink); break; } } } encoding.addCellToProcessingOrder(newCell.getID()); cell.setCodePointer(cell.getCodePointer()->c1); } virtual std::size_t numberOfNodes() const override { return 2; } virtual std::string toString() const override { return "Par"; } protected: private: }; class Seq : public Instruction{ public: virtual void run(Cell &cell, CelularEncoding &encoding, const std::vector &) override { Cell &newCell = encoding.addCell(cell.getCodePointer()->c2); Link l(true, 1.0, cell.getID()); if(cell.isOutput()) { newCell.setOutput(); cell.disableOutput(); } newCell.addLink(l); for(auto& cellIter:encoding.getCells()) { if(cellIter->getID() != newCell.getID()) { auto links = cellIter->getLinks(); for(auto& link: links) { if(link.neuron==cell.getID()) { link.neuron=newCell.getID(); } } cellIter->setLinks(links); } } newCell.setLife(cell.getLife()); encoding.addCellToProcessingOrder(newCell.getID()); cell.setCodePointer(cell.getCodePointer()->c1); //TODO: copy registers } virtual std::size_t numberOfNodes() const override { return 2; } virtual std::string toString() const override { return "Seq"; } protected: private: }; } } } }