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 neuronAddOutlinkTo(neuron *ng.Neuron, targetNodeId *ng.NodeId) *ng.OutboundConnection { cortex := neuron.Cortex switch targetNodeId.NodeType { case ng.NEURON: // make an outbound connection neuron -> targetNodeId chosenNeuron := cortex.FindNeuron(targetNodeId) connection := ng.ConnectOutbound(neuron, chosenNeuron) // make an inbound connection targetNodeId <- neuron weights := randomWeights(1) ng.ConnectInboundWeighted(chosenNeuron, neuron, weights) return connection case ng.ACTUATOR: chosenActuator := cortex.FindActuator(targetNodeId) // make an outbound connection neuron -> targetNodeId connection := ng.ConnectOutbound(neuron, chosenActuator) // make an inbound connection targetNodeId <- neuron ng.ConnectInbound(chosenActuator, neuron) return connection default: log.Panicf("unexpected chosen node type") return nil } }