func AddNeuronNonRecurrent(cortex *ng.Cortex) (bool, MutateResult) { numAttempts := len(cortex.AllNodeIds()) * 5 for i := 0; i < numAttempts; i++ { nodeIdLayerMap := cortex.NodeIdLayerMap() neuronLayerMap := cortex.NeuronLayerMap() randomLayer := neuronLayerMap.ChooseRandomLayer() upstreamNodeId := nodeIdLayerMap.ChooseNodeIdPrecedingLayer(randomLayer) if upstreamNodeId == nil { continue } downstreamNodeId := findDownstreamNodeId(cortex, nodeIdLayerMap, randomLayer) if downstreamNodeId == nil { continue } neuron := cortex.CreateNeuronInLayer(randomLayer) neuronAddInlinkFrom(neuron, upstreamNodeId) neuronAddOutlinkTo(neuron, downstreamNodeId) return true, neuron } return false, nil }
func Outsplice(cortex *ng.Cortex, chooseOutbound OutboundChooser) (bool, *ng.Neuron) { numAttempts := len(cortex.AllNodeIds()) * 5 for i := 0; i < numAttempts; i++ { neuronA := randomNeuron(cortex) outbound := chooseOutbound(neuronA) if outbound == nil { continue } if neuronA.NodeId.UUID == outbound.NodeId.UUID { continue } nodeIdB := outbound.NodeId // figure out which layer neuronK will go in nodeIdLayerMap := cortex.NodeIdLayerMap() layerA := neuronA.NodeId.LayerIndex layerB := nodeIdB.LayerIndex layerK := nodeIdLayerMap.LayerBetweenOrNew(layerA, layerB) // create neuron K neuronK := cortex.CreateNeuronInLayer(layerK) // disconnect neuronA <-> nodeB nodeBConnector := cortex.FindInboundConnector(nodeIdB) ng.DisconnectOutbound(neuronA, nodeIdB) ng.DisconnectInbound(nodeBConnector, neuronA) // connect neuronA -> neuronK weights := randomWeights(1) ng.ConnectOutbound(neuronA, neuronK) ng.ConnectInboundWeighted(neuronK, neuronA, weights) // connect neuronK -> nodeB switch nodeIdB.NodeType { case ng.NEURON: neuronB := cortex.FindNeuron(nodeIdB) ng.ConnectOutbound(neuronK, neuronB) ng.ConnectInboundWeighted(nodeBConnector, neuronK, weights) case ng.ACTUATOR: actuatorB := cortex.FindActuator(nodeIdB) ng.ConnectOutbound(neuronK, actuatorB) ng.ConnectInbound(nodeBConnector, neuronK) } return true, neuronK } return false, nil }
func AddNeuronRecurrent(cortex *ng.Cortex) (bool, MutateResult) { numAttempts := len(cortex.AllNodeIds()) * 5 for i := 0; i < numAttempts; i++ { nodeIdLayerMap := cortex.NodeIdLayerMap() neuronLayerMap := cortex.NeuronLayerMap() randomLayer := neuronLayerMap.ChooseRandomLayer() inboundNodeId := findRecurrentInboundNodeId(cortex, nodeIdLayerMap, randomLayer) if inboundNodeId == nil { log.Printf("Warn: unable to find inbound node id") continue } if randomLayer == inboundNodeId.LayerIndex { continue } neuron := cortex.CreateNeuronInLayer(randomLayer) outboundNodeId := findRecurrentOutboundNodeId(cortex, nodeIdLayerMap, randomLayer) if outboundNodeId == nil { log.Printf("Warn: unable to find outbound node id") continue } neuronAddInlinkFrom(neuron, inboundNodeId) neuronAddOutlinkTo(neuron, outboundNodeId) return true, neuron } logg.LogTo("NEURVOLVE", "return false, nil") return false, nil }