Пример #1
0
 //Constructor
 /// <summary>
 /// Creates an initialized instance of hidden neuron having analog activation
 /// </summary>
 /// <param name="location">Information about a neuron location within the neural preprocessor</param>
 /// <param name="analogActivation">Instantiated activation function.</param>
 /// <param name="bias">Constant bias to be applied.</param>
 /// <param name="firingThreshold">A number between 0 and 1 (LT1). Every time the new activation value is higher than the previous activation value by at least the threshold, it is evaluated as a firing event.</param>
 /// <param name="thresholdMaxRefDeepness">Maximum deepness of historical normalized activation value to be compared with current normalized activation value when evaluating firing event.</param>
 /// <param name="retainmentStrength">Strength of the analog neuron's retainment property.</param>
 /// <param name="predictorsCfg">Configuration of neuron's predictors</param>
 public HiddenNeuron(NeuronLocation location,
                     IActivationFunction analogActivation,
                     double bias,
                     double firingThreshold,
                     int thresholdMaxRefDeepness,
                     double retainmentStrength,
                     PredictorsSettings predictorsCfg
                     )
 {
     Location   = location;
     Statistics = new NeuronStatistics();
     Bias       = bias;
     //Activation check
     if (analogActivation.TypeOfActivation == ActivationType.Spiking)
     {
         throw new InvalidOperationException($"Called wrong type of hidden neuron constructor for analog activation.");
     }
     _activation               = analogActivation;
     _analogFiringThreshold    = firingThreshold;
     _histActivationsQueue     = thresholdMaxRefDeepness < 2 ? null : new SimpleQueue <double>(thresholdMaxRefDeepness);
     _analogRetainmentStrength = retainmentStrength;
     _predictors               = predictorsCfg != null ? new PredictorsProvider(predictorsCfg) : null;
     OutputData = new NeuronOutputData();
     Reset(false);
     return;
 }
Пример #2
0
        /// <summary>
        /// Creates an initialized instance.
        /// </summary>
        /// <param name="elem">Xml element containing the initialization settings.</param>
        public SpikingNeuronGroupSettings(XElement elem)
        {
            //Validation
            XElement settingsElem = Validate(elem, XsdTypeName);

            //Parsing
            //Name
            Name = settingsElem.Attribute("name").Value;
            //Relative share
            RelShare = double.Parse(settingsElem.Attribute("relShare").Value, CultureInfo.InvariantCulture);
            //Activation settings
            ActivationCfg = ActivationFactory.LoadSettings(settingsElem.Elements().First());
            //Homogenous excitability
            XElement homogenousExcitabilityElem = settingsElem.Elements("homogenousExcitability").FirstOrDefault();

            HomogenousExcitabilityCfg = homogenousExcitabilityElem == null ? new HomogenousExcitabilitySettings() : new HomogenousExcitabilitySettings(homogenousExcitabilityElem);
            //Bias
            XElement biasSettingsElem = settingsElem.Elements("bias").FirstOrDefault();

            BiasCfg = biasSettingsElem == null ? null : new RandomValueSettings(biasSettingsElem);
            //Predictors
            XElement predictorsSettingsElem = settingsElem.Elements("predictors").FirstOrDefault();

            if (predictorsSettingsElem != null)
            {
                PredictorsCfg = new PredictorsSettings(predictorsSettingsElem);
            }
            Check();
            return;
        }
Пример #3
0
        /// <summary>
        /// Creates an initialized instance.
        /// </summary>
        /// <param name="elem">Xml element containing the initialization settings.</param>
        public AnalogNeuronGroupSettings(XElement elem)
        {
            //Validation
            XElement settingsElem = Validate(elem, XsdTypeName);

            //Parsing
            //Name
            Name = settingsElem.Attribute("name").Value;
            //Relative share
            RelShare = double.Parse(settingsElem.Attribute("relShare").Value, CultureInfo.InvariantCulture);
            //Activation settings
            ActivationCfg = ActivationFactory.LoadSettings(settingsElem.Elements().First());
            //Firing threshold
            FiringThreshold         = double.Parse(settingsElem.Attribute("firingThreshold").Value, CultureInfo.InvariantCulture);
            ThresholdMaxRefDeepness = int.Parse(settingsElem.Attribute("thresholdMaxRefDeepness").Value, CultureInfo.InvariantCulture);
            //Bias
            XElement biasSettingsElem = settingsElem.Elements("bias").FirstOrDefault();

            BiasCfg = biasSettingsElem == null ? null : new RandomValueSettings(biasSettingsElem);
            //Retainment
            XElement retainmentSettingsElem = settingsElem.Elements("retainment").FirstOrDefault();

            RetainmentCfg = retainmentSettingsElem == null ? null : new RetainmentSettings(retainmentSettingsElem);
            //Predictors
            XElement predictorsSettingsElem = settingsElem.Elements("predictors").FirstOrDefault();

            if (predictorsSettingsElem != null)
            {
                PredictorsCfg = new PredictorsSettings(predictorsSettingsElem);
            }
            Check();
            return;
        }
Пример #4
0
        /// <summary>
        /// Creates reservoir instance configuration
        /// </summary>
        /// <param name="instName">Name of the reservoir instance</param>
        /// <param name="structName">Name of the associated reservoir structure configuration</param>
        /// <param name="pool1Name">Name of the first pool</param>
        /// <param name="pool2Name">Name of the second pool</param>
        /// <param name="inputMaxDelay">Maximum delay of input synapses</param>
        /// <param name="internalMaxDelay">Maximum delay of internal synapses</param>
        private ReservoirInstanceSettings CreateResInstCfg(string instName,
                                                           string structName,
                                                           string pool1Name,
                                                           string pool2Name,
                                                           int inputMaxDelay,
                                                           int internalMaxDelay
                                                           )
        {
            //Maximum weight of input connection
            const double ConnMaxWeight = 0.6d;
            //Create input connections configurations for each input field
            //We connect High input field to Pool1
            InputConnSettings inpConnHighCfg = CreateInputConnCfg("High", pool1Name);
            //We connect Low input field to Pool2
            InputConnSettings inpConnLowCfg = CreateInputConnCfg("Low", pool2Name);
            //We connect Adj Close input field to both pools
            InputConnSettings inpConnAdjCloseP1Cfg = CreateInputConnCfg("Adj Close", pool1Name);
            InputConnSettings inpConnAdjCloseP2Cfg = CreateInputConnCfg("Adj Close", pool2Name);
            //Synapse general configuration
            AnalogSourceSettings         asc = new AnalogSourceSettings(new URandomValueSettings(0, ConnMaxWeight));
            SynapseATInputSettings       synapseATInputSettings       = new SynapseATInputSettings(Synapse.SynapticDelayMethod.Random, inputMaxDelay, asc, null);
            SynapseATIndifferentSettings synapseATIndifferentSettings = new SynapseATIndifferentSettings(Synapse.SynapticDelayMethod.Random, internalMaxDelay);
            SynapseATSettings            synapseATCfg = new SynapseATSettings(SynapseATSettings.DefaultSpectralRadiusNum, synapseATInputSettings, synapseATIndifferentSettings);
            SynapseSettings synapseCfg = new SynapseSettings(null, synapseATCfg);

            //Predictors configuration
            //We use constructor accepting array of boolean switches
            //Initially we set all switches to false - all available predictors are forbidden
            bool[] predictorSwitches = new bool[PredictorsProvider.NumOfSupportedPredictors];
            predictorSwitches.Populate(false);
            //Now we enable Activation and ActivationMWAvg predictors
            predictorSwitches[(int)PredictorsProvider.PredictorID.Activation]      = true;
            predictorSwitches[(int)PredictorsProvider.PredictorID.ActivationMWAvg] = true;
            //We configure activation moving average predictor to use constant weights and last 7 values without the leaks
            ActivationMWAvgSettings activationMWAvgCfg = new ActivationMWAvgSettings(7, PredictorsProvider.PredictorMWAvgWeightsType.Constant);
            //We create predictors parameters configuration including custom configuration of activation moving average predictor
            PredictorsParamsSettings predictorsParamsCfg = new PredictorsParamsSettings(activationMWAvgCfg);
            //Create predictors configuration using prepared boolean switches and predictors parameters
            PredictorsSettings predictorsCfg = new PredictorsSettings(predictorSwitches, predictorsParamsCfg);
            //Create reservoir instance configuration
            ReservoirInstanceSettings resInstCfg = new ReservoirInstanceSettings(instName,
                                                                                 structName,
                                                                                 new InputConnsSettings(inpConnHighCfg, inpConnLowCfg, inpConnAdjCloseP1Cfg, inpConnAdjCloseP2Cfg),
                                                                                 synapseCfg,
                                                                                 predictorsCfg
                                                                                 );

            return(resInstCfg);
        }
Пример #5
0
 //Constructors
 /// <summary>
 /// Creates an initialized instance
 /// </summary>
 /// <param name="name">Name of the reservoir structure settings</param>
 /// <param name="structureCfgName">Name of the reservoir structure settings</param>
 /// <param name="inputConnsCfg">Collection of input connections settings</param>
 /// <param name="synapseCfg">Synapse configuration</param>
 /// <param name="predictorsCfg">Configuration of the predictors</param>
 public ReservoirInstanceSettings(string name,
                                  string structureCfgName,
                                  InputConnsSettings inputConnsCfg,
                                  SynapseSettings synapseCfg       = null,
                                  PredictorsSettings predictorsCfg = null
                                  )
 {
     Name             = name;
     StructureCfgName = structureCfgName;
     InputConnsCfg    = (InputConnsSettings)inputConnsCfg.DeepClone();
     SynapseCfg       = synapseCfg == null ? null : (SynapseSettings)synapseCfg.DeepClone();
     PredictorsCfg    = predictorsCfg == null ? null : (PredictorsSettings)predictorsCfg.DeepClone();
     Check();
     return;
 }
Пример #6
0
 //Constructors
 /// <summary>
 /// Creates an initialized instance
 /// </summary>
 /// <param name="name">Name of the neuron group</param>
 /// <param name="relShare">Specifies how big relative portion of pool's neurons is formed by this group of the neurons</param>
 /// <param name="activationCfg">Common activation function settings of the groupped neurons</param>
 /// <param name="homogenousExcitabilityCfg">Configuration of the neuron's homogenous excitability</param>
 /// <param name="biasCfg">Each neuron within the group receives constant input bias. Value of the neuron's bias is driven by this random settings</param>
 /// <param name="predictorsCfg">Configuration of the predictors</param>
 public SpikingNeuronGroupSettings(string name,
                                   double relShare,
                                   RCNetBaseSettings activationCfg,
                                   HomogenousExcitabilitySettings homogenousExcitabilityCfg = null,
                                   RandomValueSettings biasCfg      = null,
                                   PredictorsSettings predictorsCfg = null
                                   )
 {
     Name                      = name;
     RelShare                  = relShare;
     ActivationCfg             = activationCfg.DeepClone();
     HomogenousExcitabilityCfg = homogenousExcitabilityCfg == null ? new HomogenousExcitabilitySettings() : (HomogenousExcitabilitySettings)homogenousExcitabilityCfg.DeepClone();
     BiasCfg                   = biasCfg == null ? null : (RandomValueSettings)biasCfg.DeepClone();
     PredictorsCfg             = predictorsCfg == null ? null : (PredictorsSettings)predictorsCfg.DeepClone();
     Check();
     return;
 }
Пример #7
0
 //Constructors
 /// <summary>
 /// Creates an initialized instance
 /// </summary>
 /// <param name="name">Pool name</param>
 /// <param name="proportionsCfg">Pool dimensions</param>
 /// <param name="neuronGroupsCfg">Settings of the neuron groups in the pool</param>
 /// <param name="interconnectionCfg">Configuration of the pool's neurons interconnection</param>
 /// <param name="predictorsCfg">Configuration of the predictors</param>
 /// <param name="coordinatesCfg">Pool coordinates within the 3D space</param>
 public PoolSettings(string name,
                     ProportionsSettings proportionsCfg,
                     NeuronGroupsSettings neuronGroupsCfg,
                     InterconnSettings interconnectionCfg,
                     PredictorsSettings predictorsCfg   = null,
                     CoordinatesSettings coordinatesCfg = null
                     )
 {
     Name               = name;
     ProportionsCfg     = (ProportionsSettings)proportionsCfg.DeepClone();
     NeuronGroupsCfg    = (NeuronGroupsSettings)neuronGroupsCfg.DeepClone();
     InterconnectionCfg = (InterconnSettings)interconnectionCfg.DeepClone();
     PredictorsCfg      = predictorsCfg == null ? null : (PredictorsSettings)predictorsCfg.DeepClone();
     CoordinatesCfg     = coordinatesCfg == null ? new CoordinatesSettings() : (CoordinatesSettings)coordinatesCfg.DeepClone();
     Check();
     return;
 }
Пример #8
0
 //Constructors
 /// <summary>
 /// Creates an initialized instance
 /// </summary>
 /// <param name="name">Name of the neuron group</param>
 /// <param name="relShare">Specifies how big relative portion of pool's neurons is formed by this group of the neurons</param>
 /// <param name="activationCfg">Common activation function settings of the groupped neurons</param>
 /// <param name="firingThreshold">
 /// A number between 0 and 1 (LT1). Every time the new normalized activation value is higher than the previous
 /// normalized activation value by at least the threshold, it is evaluated as a firing event.
 /// </param>
 /// <param name="thresholdMaxRefDeepness">Maximum deepness of historical normalized activation value to be compared with current normalized activation value when evaluating firing event.</param>
 /// <param name="biasCfg">Each neuron within the group receives constant input bias. Value of the neuron's bias is driven by this random settings</param>
 /// <param name="retainmentCfg">Neurons' retainment property configuration</param>
 /// <param name="predictorsCfg">Configuration of the predictors</param>
 public AnalogNeuronGroupSettings(string name,
                                  double relShare,
                                  RCNetBaseSettings activationCfg,
                                  double firingThreshold           = DefaultFiringThreshold,
                                  int thresholdMaxRefDeepness      = DefaultThresholdMaxRefDeepness,
                                  RandomValueSettings biasCfg      = null,
                                  RetainmentSettings retainmentCfg = null,
                                  PredictorsSettings predictorsCfg = null
                                  )
 {
     Name                    = name;
     RelShare                = relShare;
     ActivationCfg           = activationCfg.DeepClone();
     FiringThreshold         = firingThreshold;
     ThresholdMaxRefDeepness = thresholdMaxRefDeepness;
     BiasCfg                 = biasCfg == null ? null : (RandomValueSettings)biasCfg.DeepClone();
     RetainmentCfg           = retainmentCfg == null ? null : (RetainmentSettings)retainmentCfg.DeepClone();
     PredictorsCfg           = predictorsCfg == null ? null : (PredictorsSettings)predictorsCfg.DeepClone();
     Check();
     return;
 }
Пример #9
0
        /// <summary>
        /// Creates an initialized instance.
        /// </summary>
        /// <param name="elem">Xml element containing the initialization settings</param>
        public ReservoirInstanceSettings(XElement elem)
        {
            //Validation
            XElement settingsElem = Validate(elem, XsdTypeName);

            //Parsing
            Name             = settingsElem.Attribute("name").Value;
            StructureCfgName = settingsElem.Attribute("reservoirStructure").Value;
            //Input connections
            InputConnsCfg = new InputConnsSettings(settingsElem.Elements("inputConnections").First());
            //Synapse
            XElement synapseElem = settingsElem.Elements("synapse").FirstOrDefault();

            SynapseCfg = synapseElem == null ? new SynapseSettings() : new SynapseSettings(synapseElem);
            //Predictors
            XElement predictorsElem = settingsElem.Elements("predictors").FirstOrDefault();

            if (predictorsElem != null)
            {
                PredictorsCfg = new PredictorsSettings(predictorsElem);
            }
            Check();
            return;
        }
Пример #10
0
 //Constructor
 /// <summary>
 /// Creates an initialized instance of hidden neuron having spiking activation
 /// </summary>
 /// <param name="location">Information about a neuron location within the neural preprocessor</param>
 /// <param name="spikingActivation">Instantiated activation function.</param>
 /// <param name="bias">Constant bias to be applied.</param>
 /// <param name="predictorsCfg">Configuration of neuron's predictors</param>
 public HiddenNeuron(NeuronLocation location,
                     IActivationFunction spikingActivation,
                     double bias,
                     PredictorsSettings predictorsCfg
                     )
 {
     Location   = location;
     Statistics = new NeuronStatistics();
     Bias       = bias;
     //Activation check
     if (spikingActivation.TypeOfActivation == ActivationType.Analog)
     {
         //Spiking
         throw new InvalidOperationException($"Called wrong type of hidden neuron constructor for spiking activation.");
     }
     _activation               = spikingActivation;
     _analogFiringThreshold    = 0;
     _histActivationsQueue     = null;
     _analogRetainmentStrength = 0;
     _predictors               = predictorsCfg != null ? new PredictorsProvider(predictorsCfg) : null;
     OutputData = new NeuronOutputData();
     Reset(false);
     return;
 }
Пример #11
0
        /// <summary>
        /// Creates an initialized instance from the given xml element.
        /// </summary>
        /// <param name="elem">Xml element containing the initialization settings</param>
        public PoolSettings(XElement elem)
        {
            //Validation
            XElement poolSettingsElem = Validate(elem, XsdTypeName);

            //Parsing
            Name               = poolSettingsElem.Attribute("name").Value;
            ProportionsCfg     = new ProportionsSettings(poolSettingsElem.Elements("proportions").First());
            NeuronGroupsCfg    = new NeuronGroupsSettings(poolSettingsElem.Elements("neuronGroups").First());
            InterconnectionCfg = new InterconnSettings(poolSettingsElem.Elements("interconnection").First());
            //Predictors
            XElement predictorsElem = poolSettingsElem.Elements("predictors").FirstOrDefault();

            if (predictorsElem != null)
            {
                PredictorsCfg = new PredictorsSettings(predictorsElem);
            }
            //Coordinates
            XElement coordinatesElem = poolSettingsElem.Elements("coordinates").FirstOrDefault();

            CoordinatesCfg = coordinatesElem == null ? new CoordinatesSettings() : new CoordinatesSettings(coordinatesElem);
            Check();
            return;
        }
Пример #12
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
                                            ));
        }
Пример #13
0
        /// <summary>
        /// Creates StateMachine configuration following pure ESN design
        /// </summary>
        /// <param name="totalSize">Total number of hidden neurons</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="maxAbsBias">Maximum absolute value of the bias (0 means bias is not required)</param>
        /// <param name="maxRetainmentStrength">Maximum retainment strength (0 means retainment property is not required)</param>
        /// <param name="predictorsParamsCfg">Predictors parameters (use null for defaults)</param>
        /// <param name="allowedPredictor">Allowed predictor(s)</param>
        public StateMachineSettings CreatePureESNCfg(int totalSize,
                                                     double inputConnectionDensity,
                                                     int maxInputDelay,
                                                     double interconnectionDensity,
                                                     int maxInternalDelay,
                                                     double maxAbsBias,
                                                     double maxRetainmentStrength,
                                                     PredictorsParamsSettings predictorsParamsCfg,
                                                     params PredictorsProvider.PredictorID[] allowedPredictor
                                                     )
        {
            const double MaxInputWeightSum = 2.75d;
            //Default ESN activation
            RCNetBaseSettings aFnCfg = new TanHSettings();
            //One neuron group
            AnalogNeuronGroupSettings grp = CreateAnalogGroup(aFnCfg, maxAbsBias, maxRetainmentStrength);
            //Simple analog pool
            PoolSettings poolCfg = new PoolSettings(GetPoolName(ActivationContent.Analog, 0),
                                                    new ProportionsSettings(totalSize, 1, 1),
                                                    new NeuronGroupsSettings(grp),
                                                    new InterconnSettings(new RandomSchemaSettings(interconnectionDensity))
                                                    );
            //Simple reservoir structure
            ReservoirStructureSettings resStructCfg = new ReservoirStructureSettings(GetResStructName(ActivationContent.Analog, 0),
                                                                                     new PoolsSettings(poolCfg)
                                                                                     );
            //Input connections configuration
            List <InputConnSettings> inputConns = new List <InputConnSettings>(InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection.Count);
            double maxInpSynWeight = MaxInputWeightSum / InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection.Count;

            foreach (ExternalFieldSettings fieldCfg in InputCfg.VaryingFieldsCfg.ExternalFieldsCfg.FieldCfgCollection)
            {
                InputConnSettings inputConnCfg = new InputConnSettings(fieldCfg.Name,
                                                                       poolCfg.Name,
                                                                       0,
                                                                       inputConnectionDensity
                                                                       );
                inputConns.Add(inputConnCfg);
            }
            //Synapse general configuration
            AnalogSourceSettings         asc = new AnalogSourceSettings(new URandomValueSettings(0, maxInpSynWeight));
            SynapseATInputSettings       synapseATInputSettings       = new SynapseATInputSettings(Synapse.SynapticDelayMethod.Random, maxInputDelay, asc, null);
            SynapseATIndifferentSettings synapseATIndifferentSettings = new SynapseATIndifferentSettings(Synapse.SynapticDelayMethod.Random, maxInternalDelay);
            SynapseATSettings            synapseATCfg = new SynapseATSettings(SynapseATSettings.DefaultSpectralRadiusNum, synapseATInputSettings, synapseATIndifferentSettings);
            SynapseSettings synapseCfg = new SynapseSettings(null, synapseATCfg);

            //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.PureESN, 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
                                            ));
        }