コード例 #1
0
        /// <summary>
        /// Creates the instance of the activation function.
        /// </summary>
        /// <param name="cfg">The configuration.</param>
        /// <param name="rand">A random object to be used for randomly generated parameters.</param>
        public static IActivation CreateAF(IActivationSettings cfg, Random rand)
        {
            IActivation af;
            Type        settingsType = cfg.GetType();

            if (settingsType == typeof(AFSpikingAdExpIFSettings))
            {
                AFSpikingAdExpIFSettings afs = (AFSpikingAdExpIFSettings)cfg;
                af = new AFSpikingAdExpIF(rand.NextDouble(afs.TimeScale),
                                          rand.NextDouble(afs.Resistance),
                                          rand.NextDouble(afs.RestV),
                                          rand.NextDouble(afs.ResetV),
                                          rand.NextDouble(afs.RheobaseV),
                                          rand.NextDouble(afs.FiringThresholdV),
                                          rand.NextDouble(afs.SharpnessDeltaT),
                                          rand.NextDouble(afs.AdaptationVoltageCoupling),
                                          rand.NextDouble(afs.AdaptationTimeConstant),
                                          rand.NextDouble(afs.AdaptationSpikeTriggeredIncrement),
                                          afs.SolverMethod,
                                          afs.SolverCompSteps,
                                          afs.StimuliDuration,
                                          rand.NextRangedUniformDouble(MinInitialVRatio, MaxInitialVRatio)
                                          );
            }
            else if (settingsType == typeof(AFAnalogBentIdentitySettings))
            {
                af = new AFAnalogBentIdentity();
            }
            else if (settingsType == typeof(AFAnalogElliotSettings))
            {
                AFAnalogElliotSettings afs = (AFAnalogElliotSettings)cfg;
                af = new AFAnalogElliot(rand.NextDouble(afs.Slope));
            }
            else if (settingsType == typeof(AFSpikingExpIFSettings))
            {
                AFSpikingExpIFSettings afs = (AFSpikingExpIFSettings)cfg;
                af = new AFSpikingExpIF(rand.NextDouble(afs.TimeScale),
                                        rand.NextDouble(afs.Resistance),
                                        rand.NextDouble(afs.RestV),
                                        rand.NextDouble(afs.ResetV),
                                        rand.NextDouble(afs.RheobaseV),
                                        rand.NextDouble(afs.FiringThresholdV),
                                        rand.NextDouble(afs.SharpnessDeltaT),
                                        afs.RefractoryPeriods,
                                        afs.SolverMethod,
                                        afs.SolverCompSteps,
                                        afs.StimuliDuration,
                                        rand.NextRangedUniformDouble(MinInitialVRatio, MaxInitialVRatio)
                                        );
            }
            else if (settingsType == typeof(AFAnalogGaussianSettings))
            {
                af = new AFAnalogGaussian();
            }
            else if (settingsType == typeof(AFAnalogIdentitySettings))
            {
                af = new AFAnalogIdentity();
            }
            else if (settingsType == typeof(AFAnalogISRUSettings))
            {
                AFAnalogISRUSettings afs = (AFAnalogISRUSettings)cfg;
                af = new AFAnalogISRU(rand.NextDouble(afs.Alpha));
            }
            else if (settingsType == typeof(AFSpikingIzhikevichIFSettings))
            {
                AFSpikingIzhikevichIFSettings afs = (AFSpikingIzhikevichIFSettings)cfg;
                af = new AFSpikingIzhikevichIF(rand.NextDouble(afs.RecoveryTimeScale),
                                               rand.NextDouble(afs.RecoverySensitivity),
                                               rand.NextDouble(afs.RecoveryReset),
                                               rand.NextDouble(afs.RestV),
                                               rand.NextDouble(afs.ResetV),
                                               rand.NextDouble(afs.FiringThresholdV),
                                               afs.RefractoryPeriods,
                                               afs.SolverMethod,
                                               afs.SolverCompSteps,
                                               afs.StimuliDuration,
                                               rand.NextRangedUniformDouble(MinInitialVRatio, MaxInitialVRatio)
                                               );
            }
            else if (settingsType == typeof(AFSpikingAutoIzhikevichIFSettings))
            {
                double randomValue = rand.NextDouble().Power(2);
                AFSpikingAutoIzhikevichIFSettings afs = (AFSpikingAutoIzhikevichIFSettings)cfg;
                //Ranges
                af = new AFSpikingIzhikevichIF(0.02,
                                               0.2,
                                               8 + (-6 * randomValue),
                                               -70,
                                               -65 + (15 * randomValue),
                                               30,
                                               afs.RefractoryPeriods,
                                               afs.SolverMethod,
                                               afs.SolverCompSteps,
                                               afs.StimuliDuration,
                                               rand.NextRangedUniformDouble(MinInitialVRatio, MaxInitialVRatio)
                                               );
            }
            else if (settingsType == typeof(AFSpikingLeakyIFSettings))
            {
                AFSpikingLeakyIFSettings afs = (AFSpikingLeakyIFSettings)cfg;
                af = new AFSpikingLeakyIF(rand.NextDouble(afs.TimeScale),
                                          rand.NextDouble(afs.Resistance),
                                          rand.NextDouble(afs.RestV),
                                          rand.NextDouble(afs.ResetV),
                                          rand.NextDouble(afs.FiringThresholdV),
                                          afs.RefractoryPeriods,
                                          afs.SolverMethod,
                                          afs.SolverCompSteps,
                                          afs.StimuliDuration,
                                          rand.NextRangedUniformDouble(MinInitialVRatio, MaxInitialVRatio)
                                          );
            }
            else if (settingsType == typeof(AFAnalogLeakyReLUSettings))
            {
                AFAnalogLeakyReLUSettings afs = (AFAnalogLeakyReLUSettings)cfg;
                af = new AFAnalogLeakyReLU(rand.NextDouble(afs.NegSlope));
            }
            else if (settingsType == typeof(AFAnalogSigmoidSettings))
            {
                af = new AFAnalogSigmoid();
            }
            else if (settingsType == typeof(AFSpikingSimpleIFSettings))
            {
                AFSpikingSimpleIFSettings afs = (AFSpikingSimpleIFSettings)cfg;
                af = new AFSpikingSimpleIF(rand.NextDouble(afs.Resistance),
                                           rand.NextDouble(afs.DecayRate),
                                           rand.NextDouble(afs.ResetV),
                                           rand.NextDouble(afs.FiringThresholdV),
                                           afs.RefractoryPeriods,
                                           rand.NextRangedUniformDouble(MinInitialVRatio, MaxInitialVRatio)
                                           );
            }
            else if (settingsType == typeof(AFAnalogSincSettings))
            {
                af = new AFAnalogSinc();
            }
            else if (settingsType == typeof(AFAnalogSinusoidSettings))
            {
                af = new AFAnalogSinusoid();
            }
            else if (settingsType == typeof(AFAnalogSoftExponentialSettings))
            {
                AFAnalogSoftExponentialSettings afs = (AFAnalogSoftExponentialSettings)cfg;
                af = new AFAnalogSoftExponential(rand.NextDouble(afs.Alpha));
            }
            else if (settingsType == typeof(AFAnalogSoftMaxSettings))
            {
                af = new AFAnalogSoftMax();
            }
            else if (settingsType == typeof(AFAnalogSoftPlusSettings))
            {
                af = new AFAnalogSoftPlus();
            }
            else if (settingsType == typeof(AFAnalogSQNLSettings))
            {
                af = new AFAnalogSQNL();
            }
            else if (settingsType == typeof(AFAnalogTanHSettings))
            {
                af = new AFAnalogTanH();
            }
            else
            {
                throw new ArgumentException($"Unsupported activation function configuration: {settingsType.Name}");
            }
            return(af);
        }