Esempio n. 1
0
        //Methods
        public void Run()
        {
            MackeyGlassGeneratorSettings modSettings = new MackeyGlassGeneratorSettings(18, 0.1, 0.2);
            IGenerator generator = new MackeyGlassGenerator(modSettings);

            int steps = 100;

            for (int i = 0; i < steps; i++)
            {
                Console.WriteLine(generator.Next());
            }
            Console.ReadLine();
            generator.Reset();
            for (int i = 0; i < steps; i++)
            {
                Console.WriteLine(generator.Next());
            }
            Console.ReadLine();

            ///*
            SimpleIFSettings settings = new SimpleIFSettings(1,
                                                             new RandomValueSettings(15, 15),
                                                             new RandomValueSettings(0.05, 0.05),
                                                             new RandomValueSettings(5, 5),
                                                             new RandomValueSettings(20, 20),
                                                             0
                                                             );
            IActivationFunction af = ActivationFactory.Create(settings, new Random(0));

            //*/
            TestActivation(af, 800, 0.15, 10, 600);
            return;
        }
Esempio n. 2
0
        //Methods
        //Static methods
        /// <summary>
        /// Fuction checks if specified activation can be used in FF network
        /// </summary>
        /// <param name="activationSettings">Activation settings</param>
        /// <returns></returns>
        public static bool IsAllowedActivation(ActivationSettings activationSettings)
        {
            IActivationFunction af = ActivationFactory.Create(activationSettings);

            if (!af.Stateless || !af.SupportsComputeDerivativeMethod)
            {
                return(false);
            }
            return(true);
        }
Esempio n. 3
0
        //Methods
        //Static methods
        /// <summary>
        /// Fuction checks if specified activation can be used in FF network
        /// </summary>
        /// <param name="activationSettings">Activation settings</param>
        /// <param name="outputRange">Returned range of the activation function</param>
        public static bool IsAllowedActivation(Object activationSettings, out Interval outputRange)
        {
            IActivationFunction af = ActivationFactory.Create(activationSettings, new Random());

            outputRange = af.OutputRange.DeepClone();
            if (!af.Stateless || !af.SupportsDerivative)
            {
                return(false);
            }
            return(true);
        }
Esempio n. 4
0
 /// <summary>
 /// Instantiates an initialized feed forward network
 /// </summary>
 /// <param name="numOfInputValues">Number of network's input values</param>
 /// <param name="numOfOutputValues">Number of network's output values</param>
 /// <param name="settings">Configuration parameters</param>
 public FeedForwardNetwork(int numOfInputValues, int numOfOutputValues, FeedForwardNetworkSettings settings)
     : this(numOfInputValues, numOfOutputValues)
 {
     //Initialize FF network
     for (int i = 0; i < settings.HiddenLayerCollection.Count; i++)
     {
         AddLayer(settings.HiddenLayerCollection[i].NumOfNeurons,
                  ActivationFactory.Create(settings.HiddenLayerCollection[i].Activation)
                  );
     }
     FinalizeStructure(ActivationFactory.Create(settings.OutputLayerActivation));
     return;
 }
Esempio n. 5
0
        //Methods
        public void Run()
        {
            //Filter test
            RealFeatureFilter rff = new RealFeatureFilter(new Interval(-1, 1));

            for (int i = 1; i <= 1500; i++)
            {
                rff.Update(_rand.NextDouble() * _rand.Next(0, 10000));
            }
            double featureValue = 0.5;
            double filterValue  = rff.ApplyFilter(featureValue);
            double reverseValue = rff.ApplyReverse(filterValue);

            Console.WriteLine($"Feature: {featureValue} Filter: {filterValue} Reverse: {reverseValue}");



            //Pulse generator test
            BasicStat sampleStat = new BasicStat();

            sampleStat.Reset();
            PulseGeneratorSettings modSettings = new PulseGeneratorSettings(1, 1.5, PulseGeneratorSettings.TimingMode.Poisson);
            IGenerator             generator   = new PulseGenerator(modSettings);

            int    steps  = 10000;
            double period = 0;

            for (int i = 0; i < steps; i++)
            {
                ++period;
                double sample = generator.Next();
                //Console.WriteLine(sample);
                if (sample != 0)
                {
                    sampleStat.AddSampleValue(period);
                    period = 0;
                }
            }
            Console.WriteLine($"Mean: {sampleStat.ArithAvg} StdDev: {sampleStat.StdDev} Min: {sampleStat.Min} Max: {sampleStat.Max}");
            Console.ReadLine();



            //Random distributions test
            BasicStat rStat = new BasicStat();

            for (int i = 0; i < 200; i++)
            {
                double r = _rand.NextFilterredGaussianDouble(0.5, 1, -0.5, 1);
                rStat.AddSampleValue(r);
                Console.WriteLine(r);
            }
            Console.WriteLine($"Mean: {rStat.ArithAvg} StdDev: {rStat.StdDev} Min: {rStat.Min} Max: {rStat.Max}");
            Console.ReadLine();



            //Activation tests
            double fadingSum = 0;

            for (int i = 0; i < 1000; i++)
            {
                fadingSum *= (1d - 0.1);
                fadingSum += 1d;
                Console.WriteLine(fadingSum);
            }

            Console.ReadLine();


            IActivationFunction testAF = ActivationFactory.Create(new SimpleIFSettings(refractoryPeriods: 0), new Random(0));

            TestActivation(testAF, 100, 3.5, 10, 70);

            SimpleIFSettings setup = new SimpleIFSettings();

            FindAFInputBorders(ActivationFactory.Create(setup, new Random(0)),
                               -0.1,
                               20
                               );



            //Linear algebra test
            double[] flatData =
            {
                0.2,      5,  17.3,   1.01,     54,     7,
                2.2,    5.5, 12.13,  11.57,   5.71,   -85,
                -70.1,   15, -18.3,    0.3,     42, -6.25,
                0.042,    1,  7.75, -81.01, -21.29,  5.44,
                0.1,      4,  -4.3,  18.01,   7.12, -3.14,
                -80.1, 24.4,   4.3,  12.03,  2.789, -13
            };
            Matrix testM = new Matrix(6, 6, flatData);

            /*
             * //Inversion test
             * Matrix resultM = new Matrix(testM);
             * resultM.SingleThreadInverse();
             */
            /*
             * //Transpose test
             * Matrix resultM = testM.Transpose();
             */

            /*
             * //Multiply test
             * Matrix resultM = Matrix.Multiply(testM, testM);
             * for (int i = 0; i < resultM.NumOfRows; i++)
             * {
             *  Console.WriteLine($"{resultM.Data[i][0]}; {resultM.Data[i][1]}; {resultM.Data[i][2]}; {resultM.Data[i][3]}; {resultM.Data[i][4]}; {resultM.Data[i][5]}");
             * }
             */



            ;



            int numOfweights = 3;
            int xIdx, dIdx = 0;

            double[][] data = new double[3][];
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 2;
            data[dIdx][++xIdx] = 1;
            data[dIdx][++xIdx] = 3;
            ++dIdx;
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 1;
            data[dIdx][++xIdx] = 3;
            data[dIdx][++xIdx] = -3;
            ++dIdx;
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = -2;
            data[dIdx][++xIdx] = 4;
            data[dIdx][++xIdx] = 4;

            //Matrix M = new Matrix(data, true);
            //Matrix I = M.Inverse(false);
            //Matrix identity = M * I; //Must lead to identity matrix


            Matrix I = new Matrix(3, 3);

            I.AddScalarToDiagonal(1);
            Matrix X = new Matrix(I);

            X.Multiply(0.1);

            Matrix XT = X.Transpose();
            Matrix R  = XT * X;


            Console.ReadLine();



            ///*
            SimpleIFSettings settings = new SimpleIFSettings(new RandomValueSettings(15, 15),
                                                             new RandomValueSettings(0.05, 0.05),
                                                             new RandomValueSettings(5, 5),
                                                             new RandomValueSettings(20, 20),
                                                             0
                                                             );
            IActivationFunction af = ActivationFactory.Create(settings, new Random(0));

            //*/
            TestActivation(af, 800, 0.15, 10, 600);
            return;
        }
Esempio n. 6
0
        /// <summary>
        /// Instantiates the reservoir
        /// </summary>
        /// <param name="instanceName">The name of the reservoir instance</param>
        /// <param name="numOfInputNodes">Number of reservoir inputs</param>
        /// <param name="inputRange">Range of input values</param>
        /// <param name="settings">Reservoir settings</param>
        /// <param name="augmentedStates">Specifies whether this reservoir will add augmented states to output predictors</param>
        /// <param name="randomizerSeek">
        /// A value greater than or equal to 0 will always ensure the same initialization of the internal
        /// random number generator and therefore the same reservoir structure, which is good for tuning purposes.
        /// A value less than 0 causes a fully random initialization each time creating a reservoir instance.
        /// </param>
        public Reservoir(string instanceName, int numOfInputNodes, Interval inputRange, ReservoirSettings settings, bool augmentedStates, int randomizerSeek = -1)
        {
            //Set instance name
            _instanceName = instanceName;
            //Copy settings
            _settings = settings.DeepClone();
            //Random generator initialization
            if (randomizerSeek < 0)
            {
                _rand = new Random();
            }
            else
            {
                _rand = new Random(randomizerSeek);
            }
            //Prepare neuron buffers
            //Input neurons
            _inputNeurons = new INeuron[numOfInputNodes];
            for (int i = 0; i < numOfInputNodes; i++)
            {
                if (_settings.InputCoding == CommonEnums.InputCodingType.Analog)
                {
                    //Analog input
                    _inputNeurons[i] = new InputAnalogNeuron(i, inputRange);
                }
                else
                {
                    //Spiking input
                    _inputNeurons[i] = new InputSpikingNeuron(i, inputRange, _settings.InputDuration);
                }
            }
            //Pools
            _numOfPredictors = 0;
            List <INeuron> allNeurons          = new List <INeuron>();
            int            neuronGlobalFlatIdx = 0;
            int            totalNumOfNeurons   = 0;

            _poolNeuronsCollection = new List <INeuron[]>(_settings.PoolSettingsCollection.Count);
            for (int poolID = 0; poolID < _settings.PoolSettingsCollection.Count; poolID++)
            {
                PoolSettings poolSettings = _settings.PoolSettingsCollection[poolID];
                totalNumOfNeurons += poolSettings.Dim.Size;
                _numOfPredictors  += poolSettings.RouteToReadout ? poolSettings.Dim.Size : 0;
                INeuron[] poolNeurons = new INeuron[poolSettings.Dim.Size];
                //Retainment rates
                double[] retRates = new double[poolSettings.Dim.Size];
                retRates.Populate(0);
                if (poolSettings.RetainmentNeuronsFeature)
                {
                    int[] indices = new int[poolSettings.Dim.Size];
                    indices.ShuffledIndices(_rand);
                    int numOfRetNeurons = (int)Math.Round(poolSettings.RetainmentNeuronsDensity * poolSettings.Dim.Size, 0);
                    for (int i = 0; i < numOfRetNeurons; i++)
                    {
                        retRates[indices[i]] = _rand.NextDouble(poolSettings.RetainmentMinRate, poolSettings.RetainmentMaxRate, false, RandomClassExtensions.DistributionType.Uniform);
                    }
                }
                //Neuron signal types distribution
                CommonEnums.NeuronSignalType[] sigTypes = new CommonEnums.NeuronSignalType[poolSettings.Dim.Size];
                sigTypes.Populate(CommonEnums.NeuronSignalType.Excitatory);
                int[] inhibitoryIndices = new int[poolSettings.Dim.Size];
                inhibitoryIndices.ShuffledIndices(_rand);
                int numOfInhibitoryNeurons = (int)Math.Round(poolSettings.InhibitoryNeuronsDensity * poolSettings.Dim.Size, 0);
                for (int i = 0; i < numOfInhibitoryNeurons; i++)
                {
                    sigTypes[inhibitoryIndices[i]] = CommonEnums.NeuronSignalType.Inhibitory;
                }
                //Instantiate neurons
                int neuronPoolIdx = 0;
                for (int x = 0; x < poolSettings.Dim.X; x++)
                {
                    for (int y = 0; y < poolSettings.Dim.Y; y++)
                    {
                        for (int z = 0; z < poolSettings.Dim.Z; z++)
                        {
                            NeuronPlacement     placement  = new NeuronPlacement(neuronGlobalFlatIdx, poolID, neuronPoolIdx, x, y, z);
                            IActivationFunction activation = null;
                            double bias = 0;
                            if (sigTypes[neuronPoolIdx] == CommonEnums.NeuronSignalType.Excitatory)
                            {
                                //Activation and bias for Excitatory neuron
                                activation = ActivationFactory.Create(poolSettings.ExcitatoryActivation);
                                bias       = _rand.NextDouble(poolSettings.ExcitatoryBias.Min, poolSettings.ExcitatoryBias.Max, poolSettings.ExcitatoryBias.RandomSign, poolSettings.ExcitatoryBias.DistrType);
                            }
                            else
                            {
                                //Activation and bias for Inhibitory neuron
                                activation = ActivationFactory.Create(poolSettings.InhibitoryActivation);
                                bias       = _rand.NextDouble(poolSettings.InhibitoryBias.Min, poolSettings.InhibitoryBias.Max, poolSettings.InhibitoryBias.RandomSign, poolSettings.InhibitoryBias.DistrType);
                            }
                            //Neuron instance
                            if (activation.OutputSignalType == ActivationFactory.FunctionOutputSignalType.Spike)
                            {
                                //Spiking neuron
                                poolNeurons[neuronPoolIdx] = new ReservoirSpikingNeuron(placement,
                                                                                        sigTypes[neuronPoolIdx],
                                                                                        activation,
                                                                                        bias
                                                                                        );
                            }
                            else
                            {
                                //Analog neuron
                                poolNeurons[neuronPoolIdx] = new ReservoirAnalogNeuron(placement,
                                                                                       sigTypes[neuronPoolIdx],
                                                                                       activation,
                                                                                       bias,
                                                                                       retRates[neuronPoolIdx]
                                                                                       );
                            }
                            allNeurons.Add(poolNeurons[neuronPoolIdx]);
                            ++neuronPoolIdx;
                            ++neuronGlobalFlatIdx;
                        }
                    }
                }
                _poolNeuronsCollection.Add(poolNeurons);
            }
            //All neurons flat structure
            _neurons = allNeurons.ToArray();

            //Interconnections
            //Banks allocations
            _neuronInputConnectionsCollection  = new List <ISynapse> [totalNumOfNeurons];
            _neuronNeuronConnectionsCollection = new List <ISynapse> [totalNumOfNeurons];
            for (int n = 0; n < totalNumOfNeurons; n++)
            {
                _neuronInputConnectionsCollection[n]  = new List <ISynapse>();
                _neuronNeuronConnectionsCollection[n] = new List <ISynapse>();
            }
            //Wiring setup
            //Pools internal connections
            for (int poolID = 0; poolID < _poolNeuronsCollection.Count; poolID++)
            {
                //Input connection
                SetPoolInputConnections(poolID, _settings.PoolSettingsCollection[poolID]);
                //Pool interconnection
                if (_settings.PoolSettingsCollection[poolID].InterconnectionAvgDistance > 0)
                {
                    //Required to keep average distance
                    SetPoolDistInterconnections(poolID, _settings.PoolSettingsCollection[poolID]);
                }
                else
                {
                    //Not required to keep average distance
                    SetPoolRandInterconnections(poolID, _settings.PoolSettingsCollection[poolID]);
                }
            }
            //Add pool to pool connections
            foreach (ReservoirSettings.PoolsInterconnection poolsInterConn in _settings.PoolsInterconnectionCollection)
            {
                SetPool2PoolInterconnections(poolsInterConn);
            }

            //Spectral radius
            if (_settings.SpectralRadius > 0)
            {
                double maxEigenValue = ComputeMaxEigenValue();
                if (maxEigenValue == 0)
                {
                    throw new Exception("Invalid reservoir weights. Max eigenvalue is 0.");
                }
                double scale = _settings.SpectralRadius / maxEigenValue;
                //Scale internal weights
                foreach (List <ISynapse> connCollection in _neuronNeuronConnectionsCollection)
                {
                    foreach (ISynapse conn in connCollection)
                    {
                        conn.Weight *= scale;
                    }
                }
            }
            //Augmented states
            _augmentedStatesFeature = augmentedStates;
            return;
        }
Esempio n. 7
0
        //Methods
        public void Run()
        {
            //Linear algebra test
            double[] flatData =
            {
                0.2,      5,  17.3,   1.01,     54,     7,
                2.2,    5.5, 12.13,  11.57,   5.71,   -85,
                -70.1,   15, -18.3,    0.3,     42, -6.25,
                0.042,    1,  7.75, -81.01, -21.29,  5.44,
                0.1,      4,  -4.3,  18.01,   7.12, -3.14,
                -80.1, 24.4,   4.3,  12.03,  2.789, -13
            };
            Matrix testM = new Matrix(6, 6, flatData);

            /*
             * //Inversion test
             * Matrix resultM = new Matrix(testM);
             * resultM.SingleThreadInverse();
             */
            /*
             * //Transpose test
             * Matrix resultM = testM.Transpose();
             */

            /*
             * //Multiply test
             * Matrix resultM = Matrix.Multiply(testM, testM);
             * for (int i = 0; i < resultM.NumOfRows; i++)
             * {
             *  Console.WriteLine($"{resultM.Data[i][0]}; {resultM.Data[i][1]}; {resultM.Data[i][2]}; {resultM.Data[i][3]}; {resultM.Data[i][4]}; {resultM.Data[i][5]}");
             * }
             */



            ;



            int numOfweights = 4;
            int xIdx, dIdx = 0;

            double[][] data = new double[5][];
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 1; //Bias
            data[dIdx][++xIdx] = 2;
            data[dIdx][++xIdx] = 1;
            data[dIdx][++xIdx] = 3;
            ++dIdx;
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 1; //Bias
            data[dIdx][++xIdx] = 1;
            data[dIdx][++xIdx] = 3;
            data[dIdx][++xIdx] = -3;
            ++dIdx;
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 1; //Bias
            data[dIdx][++xIdx] = -2;
            data[dIdx][++xIdx] = 4;
            data[dIdx][++xIdx] = 4;
            ++dIdx;
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 1; //Bias
            data[dIdx][++xIdx] = -5;
            data[dIdx][++xIdx] = 7;
            data[dIdx][++xIdx] = 6;
            ++dIdx;
            data[dIdx]         = new double[numOfweights];
            xIdx               = -1;
            data[dIdx][++xIdx] = 1; //Bias
            data[dIdx][++xIdx] = 1;
            data[dIdx][++xIdx] = 12;
            data[dIdx][++xIdx] = 5;

            Matrix M       = new Matrix(data, true);
            Vector desired = new Vector(5);

            dIdx = -1;
            desired.Data[++dIdx] = 8;
            desired.Data[++dIdx] = 13;
            desired.Data[++dIdx] = 5;
            desired.Data[++dIdx] = 7;
            desired.Data[++dIdx] = 10;

            Vector weights = Matrix.RidgeRegression(M, desired, 0);

            //Display results
            for (int i = 0; i < data.Length; i++)
            {
                double result = 0;
                for (int j = 0; j < weights.Length; j++)
                {
                    result += data[i][j] * weights[j];
                }
                Console.WriteLine($"Computed {result}, Desired {desired.Data[i]}");
            }
            for (int i = 0; i < weights.Length; i++)
            {
                Console.WriteLine($"Weight[{i}] = {weights[i]}");
            }
            Console.WriteLine();


            //QRD
            QRD    decomposition = new QRD(M);
            Matrix B             = new Matrix(desired.Length, 1, desired.Data);
            Matrix W             = decomposition.Solve(B);

            //Display results
            for (int i = 0; i < data.Length; i++)
            {
                double result = 0;
                for (int j = 0; j < W.Data.Length; j++)
                {
                    result += data[i][j] * W.Data[j][0];
                }
                Console.WriteLine($"Computed {result}, Desired {desired.Data[i]}");
            }
            for (int i = 0; i < W.Data.Length; i++)
            {
                Console.WriteLine($"Weight[{i}] = {W.Data[i][0]}");
            }



            ;



            //TimeSeriesGenerator.SaveTimeSeriesToCsvFile("MackeyGlass_big.csv", "Value", TimeSeriesGenerator.GenMackeyGlassTimeSeries(16000), CultureInfo.InvariantCulture);
            MackeyGlassGeneratorSettings modSettings = new MackeyGlassGeneratorSettings(18, 0.1, 0.2);
            IGenerator generator = new MackeyGlassGenerator(modSettings);

            int steps = 100;

            for (int i = 0; i < steps; i++)
            {
                Console.WriteLine(generator.Next());
            }
            Console.ReadLine();
            generator.Reset();
            for (int i = 0; i < steps; i++)
            {
                Console.WriteLine(generator.Next());
            }
            Console.ReadLine();

            ///*
            SimpleIFSettings settings = new SimpleIFSettings(1,
                                                             new RandomValueSettings(15, 15),
                                                             new RandomValueSettings(0.05, 0.05),
                                                             new RandomValueSettings(5, 5),
                                                             new RandomValueSettings(20, 20),
                                                             0
                                                             );
            IActivationFunction af = ActivationFactory.Create(settings, new Random(0));

            //*/
            TestActivation(af, 800, 0.15, 10, 600);
            return;
        }
Esempio n. 8
0
        /// <summary>
        /// Creates StateMachine configuration following pure LSM design
        /// </summary>
        /// <param name="proportionsCfg">LSM pool proportions</param>
        /// <param name="aFnCfg">Spiking activation function configuration</param>
        /// <param name="hes">Homogenous excitability configuration</param>
        /// <param name="inputConnectionDensity">Density of the input field connections to hidden neurons</param>
        /// <param name="maxInputDelay">Maximum delay of input synapse</param>
        /// <param name="interconnectionDensity">Density of the hidden neurons interconnection</param>
        /// <param name="maxInternalDelay">Maximum delay of internal synapse</param>
        /// <param name="steadyBias">Constant bias (0 means bias is not required)</param>
        /// <param name="predictorsParamsCfg">Predictors parameters (use null for defaults)</param>
        /// <param name="allowedPredictor">Allowed predictor(s)</param>
        public StateMachineSettings CreatePureLSMCfg(ProportionsSettings proportionsCfg,
                                                     RCNetBaseSettings aFnCfg,
                                                     HomogenousExcitabilitySettings hes,
                                                     double inputConnectionDensity,
                                                     int maxInputDelay,
                                                     double interconnectionDensity,
                                                     int maxInternalDelay,
                                                     double steadyBias,
                                                     PredictorsParamsSettings predictorsParamsCfg,
                                                     params PredictorsProvider.PredictorID[] allowedPredictor
                                                     )
        {
            //Activation check
            if (ActivationFactory.Create(aFnCfg, new Random()).TypeOfActivation != ActivationType.Spiking)
            {
                throw new ArgumentException("Specified activation must be spiking.", "aFnCfg");
            }
            //One neuron group
            SpikingNeuronGroupSettings grp = CreateSpikingGroup(aFnCfg, hes, steadyBias);
            //Simple spiking pool
            PoolSettings poolCfg = new PoolSettings(GetPoolName(ActivationContent.Spiking, 0),
                                                    proportionsCfg,
                                                    new NeuronGroupsSettings(grp),
                                                    new InterconnSettings(new RandomSchemaSettings(interconnectionDensity, 0d, false, false))
                                                    );
            //Simple reservoir structure
            ReservoirStructureSettings resStructCfg = new ReservoirStructureSettings(GetResStructName(ActivationContent.Spiking, 0),
                                                                                     new PoolsSettings(poolCfg)
                                                                                     );
            //Input connections configuration
            List <InputConnSettings> inputConns = new List <InputConnSettings>(InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection.Count);

            foreach (ExternalFieldSettings fieldCfg in InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection)
            {
                InputConnSettings inputConnCfg = new InputConnSettings(fieldCfg.Name,
                                                                       poolCfg.Name,
                                                                       inputConnectionDensity,
                                                                       0
                                                                       );
                inputConns.Add(inputConnCfg);
            }
            //Synapse general configuration
            SynapseSTInputSettings      synapseSTInputSettings      = new SynapseSTInputSettings(Synapse.SynapticDelayMethod.Random, maxInputDelay);
            SynapseSTExcitatorySettings synapseSTExcitatorySettings = new SynapseSTExcitatorySettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay);
            SynapseSTInhibitorySettings synapseSTInhibitorySettings = new SynapseSTInhibitorySettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay);
            SynapseSTSettings           synapseSTCfg = new SynapseSTSettings(synapseSTInputSettings, synapseSTExcitatorySettings, synapseSTInhibitorySettings);
            SynapseSettings             synapseCfg   = new SynapseSettings(synapseSTCfg, null);

            //Initially set all switches to false - all available predictors are forbidden
            bool[] predictorSwitches = new bool[PredictorsProvider.NumOfSupportedPredictors];
            predictorSwitches.Populate(false);
            //Enable specified predictors
            foreach (PredictorsProvider.PredictorID predictorID in allowedPredictor)
            {
                predictorSwitches[(int)predictorID] = true;
            }
            //Create predictors configuration using default params
            PredictorsSettings predictorsCfg = new PredictorsSettings(predictorSwitches, predictorsParamsCfg);
            //Create reservoir instance
            ReservoirInstanceSettings resInstCfg = new ReservoirInstanceSettings(GetResInstName(ResDesign.PureLSM, 0),
                                                                                 resStructCfg.Name,
                                                                                 new InputConnsSettings(inputConns),
                                                                                 synapseCfg,
                                                                                 predictorsCfg
                                                                                 );

            //Build and return SM configuration
            return(new StateMachineSettings(new NeuralPreprocessorSettings(InputCfg,
                                                                           new ReservoirStructuresSettings(resStructCfg),
                                                                           new ReservoirInstancesSettings(resInstCfg)
                                                                           ),
                                            ReadoutCfg
                                            ));
        }
Esempio n. 9
0
        //Methods
        /// <summary>
        /// Builds name of the specified activation function
        /// </summary>
        /// <param name="activationCfg">Activation function configuration</param>
        private string GetActivationName(RCNetBaseSettings activationCfg)
        {
            IActivationFunction aFn = ActivationFactory.Create(activationCfg, _rand);

            return(aFn.TypeOfActivation.ToString() + "-" + aFn.GetType().Name.Replace("Settings", string.Empty));
        }