func findDownstreamNodeId(cortex *ng.Cortex, layerMap ng.LayerToNodeIdMap, fromLayer float64) *ng.NodeId { numAttempts := len(cortex.AllNodeIds()) * 5 for i := 0; i < numAttempts; i++ { downstreamNodeId := layerMap.ChooseNodeIdFollowingLayer(fromLayer) if downstreamNodeId == nil { log.Printf("findDownstreamNodeId unable to find downstream neuron, cannot add neuron") return nil } if downstreamNodeId.NodeType == ng.ACTUATOR { // make sure it has capacity for new incoming actuator := cortex.FindActuator(downstreamNodeId) if actuator.CanAddInboundConnection() == false { continue } } return downstreamNodeId } return nil }
// Find a nodeId suitable for use as an inbound node for a newly created // neuron. This can either be a sensor node or another neuron node (including // the new neuron itself), but it cannot be an actuator node. func findRecurrentInboundNodeId(cortex *ng.Cortex, layerMap ng.LayerToNodeIdMap, fromLayer float64) *ng.NodeId { keys := layerMap.Keys() actuatorLayer := keys[len(keys)-1] chosenNodeId := layerMap.ChooseNodeIdPrecedingLayer(actuatorLayer) return chosenNodeId }
// Find a nodeId suitable for use as an outbound node for a newly created // neuron. This can either be a either another neuron node (including // the new neuron itself), or an actuator (if it has space), but it cannot // be a sensor node func findRecurrentOutboundNodeId(cortex *ng.Cortex, layerMap ng.LayerToNodeIdMap, fromLayer float64) *ng.NodeId { numAttempts := len(cortex.AllNodeIds()) * 5 keys := layerMap.Keys() sensorLayer := keys[0] for i := 0; i < numAttempts; i++ { chosenNodeId := layerMap.ChooseNodeIdFollowingLayer(sensorLayer) if chosenNodeId.NodeType == ng.ACTUATOR { // make sure it has capacity for new incoming actuator := cortex.FindActuator(chosenNodeId) if actuator.CanAddInboundConnection() == false { continue } } return chosenNodeId } return nil }