//Constructor /// <summary> /// Creates an initialized instance. /// </summary> /// <param name="name">The name of the input field.</param> /// <param name="idx">The zero-based index of the input field among other input fields.</param> /// <param name="coordinates">The coordinates of input neurons in 3D space.</param> /// <param name="dataWorkingRange">The output range of the input data.</param> /// <param name="featureFilterCfg">The configuration of the feature filter.</param> /// <param name="spikesEncodingCfg">The configuration of the spikes coder.</param> /// <param name="routeToReadout">Specifies whether to route the input field values to readout layer.</param> /// <param name="inputNeuronsStartIdx">The zero-based index of the first input neuron of this field among all other input neurons.</param> public InputField(string name, int idx, int[] coordinates, Interval dataWorkingRange, IFeatureFilterSettings featureFilterCfg, InputSpikesCoderSettings spikesEncodingCfg, bool routeToReadout, int inputNeuronsStartIdx ) { Name = name; Idx = idx; RouteToReadout = routeToReadout; _featureFilter = FeatureFilterFactory.Create(dataWorkingRange, featureFilterCfg); _iAnalogStimuli = 0; _currentDataIdx = 0; //Spikes encoder _spikesEncoder = new InputSpikesCoder(spikesEncodingCfg); //Analog neuron int verticalCycles = _spikesEncoder.Regime == InputEncoder.InputSpikesCoding.Vertical ? _spikesEncoder.LargestComponentLength : 1; AnalogNeuron = new AnalogInputNeuron(new NeuronLocation(InputEncoder.ReservoirID, inputNeuronsStartIdx, InputEncoder.PoolID, inputNeuronsStartIdx, idx, coordinates[0], coordinates[1], coordinates[2]), verticalCycles); ++inputNeuronsStartIdx; //Spiking neurons int spikingPopulationSize; if (_spikesEncoder.Regime == InputEncoder.InputSpikesCoding.Horizontal) { //Population encoding spikingPopulationSize = _spikesEncoder.AllSpikesFlatCollection.Length; } else if (_spikesEncoder.Regime == InputEncoder.InputSpikesCoding.Vertical) { //Spike-train encoding spikingPopulationSize = _spikesEncoder.ComponentSpikesCollection.Length; } else { //Forbidden encoding spikingPopulationSize = 0; } SpikingNeuronCollection = new SpikingInputNeuron[spikingPopulationSize]; for (int i = 0; i < SpikingNeuronCollection.Length; i++) { SpikingNeuronCollection[i] = new SpikingInputNeuron(new NeuronLocation(InputEncoder.ReservoirID, inputNeuronsStartIdx, InputEncoder.PoolID, inputNeuronsStartIdx, idx, coordinates[0], coordinates[1], coordinates[2])); ++inputNeuronsStartIdx; } return; }
//Constructor /// <summary> /// Creates an initialized instance /// </summary> /// <param name="name">Name of the input field</param> /// <param name="idx">Index of the input field</param> /// <param name="coordinates">Input coordinates (entry point)</param> /// <param name="dataWorkingRange">Input data range</param> /// <param name="featureFilterCfg">Feature filter configuration</param> /// <param name="spikeCodeCfg">Configuration of the input spike code</param> /// <param name="routeToReadout">Specifies whether to route values as the additional predictors to readout</param> /// <param name="inputNeuronsStartIdx">Index of the first input neuron of this unit among all input neurons</param> public InputField(string name, int idx, int[] coordinates, Interval dataWorkingRange, IFeatureFilterSettings featureFilterCfg, SpikeCodeSettings spikeCodeCfg, bool routeToReadout, int inputNeuronsStartIdx ) { Name = name; Idx = idx; RouteToReadout = routeToReadout; _featureFilter = FeatureFilterFactory.Create(dataWorkingRange, featureFilterCfg); //Analog neuron AnalogNeuron = new AnalogInputNeuron(new NeuronLocation(InputEncoder.ReservoirID, inputNeuronsStartIdx, InputEncoder.PoolID, inputNeuronsStartIdx, idx, coordinates[0], coordinates[1], coordinates[2])); ++inputNeuronsStartIdx; //Spiking neurons _realSpikeCode = null; int populationSize = -1; switch (_featureFilter.Type) { case FeatureFilterBase.FeatureType.Real: _realSpikeCode = new SpikeCode(spikeCodeCfg); populationSize = _realSpikeCode.Code.Length; break; case FeatureFilterBase.FeatureType.Binary: populationSize = 1; break; case FeatureFilterBase.FeatureType.Enum: populationSize = ((EnumFeatureFilterSettings)featureFilterCfg).NumOfElements; break; } SpikingNeuronCollection = new SpikingInputNeuron[populationSize]; for (int i = 0; i < SpikingNeuronCollection.Length; i++) { SpikingNeuronCollection[i] = new SpikingInputNeuron(new NeuronLocation(InputEncoder.ReservoirID, inputNeuronsStartIdx, InputEncoder.PoolID, inputNeuronsStartIdx, idx, coordinates[0], coordinates[1], coordinates[2])); ++inputNeuronsStartIdx; } return; }
private void CreateNetwork() { var iTop = new AnalogInputNeuron() { Tag = 0 }; var iLeft = new AnalogInputNeuron() { Tag = 1 }; var iRight = new AnalogInputNeuron() { Tag = 2 }; var iBottom = new AnalogInputNeuron() { Tag = 3 }; var sensoryNeurons = new List <Neuron>() { iTop, iRight, iBottom, iLeft }; var n001 = new IzhikevichNeuron() { Tag = 4 }; var n002 = new IzhikevichNeuron() { Tag = 5 }; var n003 = new IzhikevichNeuron() { Tag = 6 }; var n004 = new IzhikevichNeuron() { Tag = 7 }; var n005 = new IzhikevichNeuron() { Tag = 8 }; var n006 = new IzhikevichNeuron() { Tag = 9 }; var n007 = new IzhikevichNeuron(true) { Tag = 10 }; var n008 = new IzhikevichNeuron(true) { Tag = 11 }; var n009 = new IzhikevichNeuron(true) { Tag = 12 }; var interNeurons = new List <Neuron>() { n001, n002, n003, n004, n005, n006, n007, n008, n009 }; var oAngle = new AnalogOutputNeuron() { Tag = 13 }; var oForce = new AnalogOutputNeuron() { Tag = 14 }; var outputNeurons = new List <Neuron>() { oAngle, oForce }; var rand = new Random(1000); // connect inputs to each interneuron foreach (var n in interNeurons) { n.Dendrites = new Synapse[interNeurons.Count + sensoryNeurons.Count]; for (int i = 0; i < sensoryNeurons.Count; i++) { n.Dendrites[i] = new Synapse() { Source = sensoryNeurons[i], Target = n, Weight = 120.0d }; } } // connect all inter neurons foreach (var n in interNeurons) { for (int i = sensoryNeurons.Count; i < n.Dendrites.Length; i++) { if ((int)n.Tag < 10) { n.Dendrites[i] = new Synapse() { Source = interNeurons[i - sensoryNeurons.Count], Target = n, Weight = 0.5 * rand.NextDouble() }; } else { n.Dendrites[i] = new Synapse() { Source = interNeurons[i - sensoryNeurons.Count], Target = n, Weight = -1d * rand.NextDouble() }; } } } // connect all interneurons to ouput neurons foreach (var n in outputNeurons) { n.Dendrites = new Synapse[interNeurons.Count]; for (int i = 0; i < n.Dendrites.Length; i++) { if ((int)interNeurons[i].Tag < 10) { n.Dendrites[i] = new Synapse() { Source = interNeurons[i], Target = n, Weight = 2.5 * rand.NextDouble() }; } else { n.Dendrites[i] = new Synapse() { Source = interNeurons[i], Target = n, Weight = -0.1d * rand.NextDouble() }; } } } iTop.AnalogInput = 10d; _network = new VisualNetwork(GraphicsDevice, sensoryNeurons, interNeurons, outputNeurons); }