예제 #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;
        }
예제 #2
0
        /// <summary>
        /// Creates an initialized instance.
        /// </summary>
        /// <param name="elem">A xml element containing the configuration data.</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
            PredictorsCfg = new PredictorsProviderSettings(settingsElem.Elements("predictors").First());
            Check();
            return;
        }
예제 #3
0
 //Constructors
 /// <summary>
 /// Creates an initialized instance
 /// </summary>
 /// <param name="numOfNeurons">Number of hidden layer neurons</param>
 /// <param name="activationCfg">Layer activation configuration</param>
 public HiddenLayerSettings(int numOfNeurons, RCNetBaseSettings activationCfg)
 {
     NumOfNeurons  = numOfNeurons;
     ActivationCfg = ActivationFactory.DeepCloneActivationSettings(activationCfg);
     Check();
     return;
 }
예제 #4
0
 /// <summary>
 /// The deep copy constructor
 /// </summary>
 /// <param name="source">Source instance</param>
 public FeedForwardNetworkSettings(FeedForwardNetworkSettings source)
 {
     OutputLayerActivation = null;
     OutputRange           = null;
     if (source.OutputLayerActivation != null)
     {
         OutputLayerActivation = ActivationFactory.DeepCloneActivationSettings(source.OutputLayerActivation);
         OutputRange           = source.OutputRange.DeepClone();
     }
     RegressionMethod      = source.RegressionMethod;
     HiddenLayerCollection = new List <HiddenLayerSettings>(source.HiddenLayerCollection.Count);
     foreach (HiddenLayerSettings shls in source.HiddenLayerCollection)
     {
         HiddenLayerCollection.Add(shls.DeepClone());
     }
     LinRegrTrainerCfg = null;
     RPropTrainerCfg   = null;
     if (source.LinRegrTrainerCfg != null)
     {
         LinRegrTrainerCfg = source.LinRegrTrainerCfg.DeepClone();
     }
     if (source.RPropTrainerCfg != null)
     {
         RPropTrainerCfg = source.RPropTrainerCfg.DeepClone();
     }
     return;
 }
예제 #5
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;
        }
예제 #6
0
        /// <summary>
        /// Creates the instance and initialize it from given xml element.
        /// This is the preferred way to instantiate reservoir settings.
        /// </summary>
        /// <param name="elem">
        /// Xml data containing feed forward network settings.
        /// Content of xml element is always validated against the xml schema.
        /// </param>
        public FeedForwardNetworkSettings(XElement elem)
        {
            //Validation
            ElemValidator validator     = new ElemValidator();
            Assembly      assemblyRCNet = Assembly.GetExecutingAssembly();

            validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.FF.FeedForwardNetworkSettings.xsd");
            validator.AddXsdFromResources(assemblyRCNet, "RCNet.RCNetTypes.xsd");
            XElement feedForwardNetworkSettingsElem = validator.Validate(elem, "rootElem");

            //Parsing
            OutputLayerActivation = ActivationFactory.LoadSettings(feedForwardNetworkSettingsElem.Descendants().First());
            if (!IsAllowedActivation(OutputLayerActivation, out Interval outputRange))
            {
                throw new ApplicationException($"Activation can't be used in FF network. Activation function has to be stateless and has to support derivative calculation.");
            }
            OutputRange      = outputRange;
            RegressionMethod = ParseTrainingMethodType(feedForwardNetworkSettingsElem.Attribute("regressionMethod").Value);
            //Hidden layers
            HiddenLayerCollection = new List <HiddenLayerSettings>();
            XElement hiddenLayersElem = feedForwardNetworkSettingsElem.Descendants("hiddenLayers").FirstOrDefault();

            if (hiddenLayersElem != null)
            {
                foreach (XElement layerElem in hiddenLayersElem.Descendants("layer"))
                {
                    HiddenLayerCollection.Add(new HiddenLayerSettings(layerElem));
                }
            }
            //Trainers
            LinRegrTrainerCfg = null;
            RPropTrainerCfg   = null;
            switch (RegressionMethod)
            {
            case TrainingMethodType.Linear:
                XElement linRegrTrainerElem = feedForwardNetworkSettingsElem.Descendants("linRegrTrainer").FirstOrDefault();
                if (linRegrTrainerElem != null)
                {
                    LinRegrTrainerCfg = new LinRegrTrainerSettings(linRegrTrainerElem);
                }
                else
                {
                    LinRegrTrainerCfg = new LinRegrTrainerSettings();
                }
                break;

            case TrainingMethodType.Resilient:
                XElement resPropTrainerElem = feedForwardNetworkSettingsElem.Descendants("resPropTrainer").FirstOrDefault();
                if (resPropTrainerElem != null)
                {
                    RPropTrainerCfg = new RPropTrainerSettings(resPropTrainerElem);
                }
                else
                {
                    RPropTrainerCfg = new RPropTrainerSettings();
                }
                break;
            }
            return;
        }
예제 #7
0
            /// <summary>
            /// Creates the instance and initialize it from given xml element.
            /// </summary>
            /// <param name="elem">
            /// Xml data containing settings.
            /// Content of xml element is always validated against the xml schema.
            /// </param>
            public NeuronGroupSettings(XElement elem)
            {
                //Validation
                ElemValidator validator     = new ElemValidator();
                Assembly      assemblyRCNet = Assembly.GetExecutingAssembly();

                validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.SM.Preprocessing.PoolNeuronGroupSettings.xsd");
                validator.AddXsdFromResources(assemblyRCNet, "RCNet.RCNetTypes.xsd");
                XElement settingsElem = validator.Validate(elem, "rootElem");

                //Parsing
                //Name
                Name = settingsElem.Attribute("name").Value;
                //Role
                Role = CommonEnums.ParseNeuronRole(settingsElem.Attribute("role").Value);
                //Relative share
                RelativeShare = double.Parse(settingsElem.Attribute("relShare").Value, CultureInfo.InvariantCulture);
                //Augmented states
                AugmentedStates = bool.Parse(settingsElem.Attribute("augmentedStates").Value);
                //Activation settings
                ActivationCfg = ActivationFactory.LoadSettings(settingsElem.Descendants().First());
                //Bias
                BiasCfg = new RandomValueSettings(settingsElem.Descendants("bias").First());
                return;
            }
예제 #8
0
        /// <summary>
        /// Creates the instance and initialize it from given xml element.
        /// This is the preferred way to instantiate settings.
        /// </summary>
        /// <param name="elem">
        /// Xml data containing settings.
        /// Content of xml element is always validated against the xml schema.
        /// </param>
        public FeedForwardNetworkSettings(XElement elem)
        {
            //Validation
            ElemValidator validator     = new ElemValidator();
            Assembly      assemblyRCNet = Assembly.GetExecutingAssembly();

            validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.FF.FeedForwardNetworkSettings.xsd");
            validator.AddXsdFromResources(assemblyRCNet, "RCNet.RCNetTypes.xsd");
            XElement settingsElem = validator.Validate(elem, "rootElem");

            //Parsing
            OutputLayerActivation = ActivationFactory.LoadSettings(settingsElem.Descendants().First());
            if (!IsAllowedActivation(OutputLayerActivation, out Interval outputRange))
            {
                throw new ApplicationException($"Activation can't be used in FF network. Activation function has to be stateless and has to support derivative calculation.");
            }
            OutputRange = outputRange;
            //Hidden layers
            HiddenLayerCollection = new List <HiddenLayerSettings>();
            XElement hiddenLayersElem = settingsElem.Descendants("hiddenLayers").FirstOrDefault();

            if (hiddenLayersElem != null)
            {
                foreach (XElement layerElem in hiddenLayersElem.Descendants("layer"))
                {
                    HiddenLayerCollection.Add(new HiddenLayerSettings(layerElem));
                }
            }
            //Trainer configuration
            TrainerCfg = null;
            foreach (XElement candidate in settingsElem.Descendants())
            {
                if (candidate.Name.LocalName == "linRegrTrainer")
                {
                    TrainerCfg = new LinRegrTrainerSettings(candidate);
                }
                else if (candidate.Name.LocalName == "qrdRegrTrainer")
                {
                    TrainerCfg = new QRDRegrTrainerSettings(candidate);
                }
                else if (candidate.Name.LocalName == "ridgeRegrTrainer")
                {
                    TrainerCfg = new RidgeRegrTrainerSettings(candidate);
                }
                else if (candidate.Name.LocalName == "resPropTrainer")
                {
                    TrainerCfg = new RPropTrainerSettings(candidate);
                }
                if (TrainerCfg != null)
                {
                    break;
                }
            }
            if (TrainerCfg == null)
            {
                throw new Exception("Trainer settings not found.");
            }
            return;
        }
예제 #9
0
 /// <summary>
 /// The deep copy constructor
 /// </summary>
 /// <param name="source">Source instance</param>
 public FeedForwardNetworkSettings(FeedForwardNetworkSettings source)
 {
     OutputActivationCfg = ActivationFactory.DeepCloneActivationSettings(source.OutputActivationCfg);
     OutputRange         = source.OutputRange.DeepClone();
     HiddenLayersCfg     = (HiddenLayersSettings)source.HiddenLayersCfg.DeepClone();
     TrainerCfg          = source.TrainerCfg.DeepClone();
     return;
 }
    public static DInput isHurt(ResourceFightDNCreature p_cre)
    {
        DActivationFunction activate = ActivationFactory.generateSigmoid(1, 1, false, true, true);

        return(() =>
        {
            return activate(p_cre.m_health.Value / p_cre.m_health.Max);
        });
    }
예제 #11
0
 //Static methods
 /// <summary>
 /// Fuction tests 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(RCNetBaseSettings activationSettings, out Interval outputRange)
 {
     outputRange = ActivationFactory.GetInfo(activationSettings, out bool stateless, out bool supportsDerivative);
     if (!stateless || !supportsDerivative)
     {
         return(false);
     }
     return(true);
 }
    //Resource
    public static DInput isHungry(ResourceFightDNCreature p_cre)
    {
        DActivationFunction activate = ActivationFactory.generateSigmoid(1, 1, false, true, true);

        return(() =>
        {
            //Debug.Log(p_cre.m_energy.Value + " : " + activate(p_cre.m_energy.Value/p_cre.m_energy.Max));
            return activate(p_cre.m_energy.Value / p_cre.m_energy.Max);
        });
    }
예제 #13
0
 /// <summary>
 /// Copy constructor
 /// </summary>
 /// <param name="source">Source instance</param>
 public HiddenLayerSettings(HiddenLayerSettings source)
 {
     NumOfNeurons = source.NumOfNeurons;
     Activation   = null;
     if (source.Activation != null)
     {
         Activation = ActivationFactory.DeepCloneActivationSettings(source.Activation);
     }
     return;
 }
예제 #14
0
 /// <summary>
 /// Creates the instance and initializes it from given xml element.
 /// </summary>
 /// <param name="elem">
 /// Xml data containing the settings.
 /// </param>
 public HiddenLayerSettings(XElement elem)
 {
     NumOfNeurons = int.Parse(elem.Attribute("neurons").Value);
     Activation   = ActivationFactory.LoadSettings(elem.Descendants().First());
     if (!IsAllowedActivation(Activation, out Interval outputRange))
     {
         throw new ApplicationException($"Activation can't be used in FF network. Activation has to be time independent and has to support derivative.");
     }
     return;
 }
예제 #15
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);
        }
예제 #16
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);
        }
예제 #17
0
 /// <summary>
 /// The deep copy constructor
 /// </summary>
 /// <param name="source">Source instance</param>
 public NeuronGroupSettings(NeuronGroupSettings source)
 {
     Name            = source.Name;
     Role            = source.Role;
     RelativeShare   = source.RelativeShare;
     AugmentedStates = source.AugmentedStates;
     Count           = source.Count;
     ActivationCfg   = ActivationFactory.DeepCloneActivationSettings(source.ActivationCfg);
     BiasCfg         = source.BiasCfg.DeepClone();
     return;
 }
    public static DInput bulletsUpAhead(ResourceFightDNCreature p_cre)
    {
        DActivationFunction activate = ActivationFactory.generateSigmoid(5, 1, false, true, false);

        return(() =>
        {
            GameObject[] bullets = p_cre.sense("BULLET");
            // Debug.Log(bullets.Length + " : " + activate(bullets.Length));
            return activate(bullets.Length);
        });
    }
예제 #19
0
        /// <summary>
        /// Creates an initialized instance from given xml element.
        /// </summary>
        /// <param name="elem">Xml element containing the settings.</param>
        public HiddenLayerSettings(XElement elem)
        {
            //Validation
            XElement settingsElem = Validate(elem, XsdTypeName);

            //Parsing
            NumOfNeurons  = int.Parse(settingsElem.Attribute("neurons").Value);
            ActivationCfg = ActivationFactory.LoadSettings(settingsElem.Elements().First());
            Check();
            return;
        }
예제 #20
0
        public ActivationApplicationServiceTests()
        {
            activationFactory         = new ActivationFactory();
            identityResolver          = new FakeIdentityResolver();
            domainNotificationHandler = new DomainNotificationHandler();
            fakeUnitOfWork            = new FakeUnitOfWork();
            serviceBus           = new FakeServiceBus();
            domainBus            = new FakeDomainServiceBus();
            activationRepository = new FakeActivationRepository();

            service = new ActivationApplicationService(activationRepository, identityResolver, domainNotificationHandler, fakeUnitOfWork, serviceBus, domainBus);
        }
예제 #21
0
        public void ShouldReturnAnActivation()
        {
            IActivationFactory factory = new ActivationFactory();

            Guid companyId = Guid.NewGuid();
            Guid tenantId  = Guid.NewGuid();

            Activation activation = factory.CreateActivation(companyId, tenantId);

            Assert.IsNotNull(activation);
            Assert.AreEqual(companyId, activation.Id);
        }
예제 #22
0
 //Constructors
 /// <summary>
 /// Creates an initialized instance
 /// </summary>
 /// <param name="outputActivationCfg">Output layer activation configuration</param>
 /// <param name="hiddenLayersCfg">Hidden layers configuration. Hidden layers are optional.</param>
 /// <param name="trainerCfg">Configuration of associated trainer</param>
 public FeedForwardNetworkSettings(RCNetBaseSettings outputActivationCfg,
                                   HiddenLayersSettings hiddenLayersCfg,
                                   RCNetBaseSettings trainerCfg
                                   )
 {
     OutputActivationCfg = ActivationFactory.DeepCloneActivationSettings(outputActivationCfg);
     OutputRange         = ActivationFactory.GetInfo(OutputActivationCfg, out _, out _);
     HiddenLayersCfg     = hiddenLayersCfg == null ? new HiddenLayersSettings() : (HiddenLayersSettings)hiddenLayersCfg.DeepClone();
     TrainerCfg          = trainerCfg.DeepClone();
     Check();
     return;
 }
예제 #23
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;
 }
예제 #24
0
        /// <summary>
        /// Tests whether the activation function can be used as the FF network's hidden layer activation.
        /// </summary>
        /// <param name="activationCfg">The configuration of the activation function.</param>
        public static bool IsAllowedHiddenAF(IActivationSettings activationCfg)
        {
            if (activationCfg.TypeOfActivation != ActivationType.Analog)
            {
                return(false);
            }
            AFAnalogBase analogAF = (AFAnalogBase)ActivationFactory.CreateAF(activationCfg, new Random(0));

            if (!analogAF.SupportsDerivative || analogAF.DependsOnSorround)
            {
                return(false);
            }
            return(true);
        }
예제 #25
0
                public void brainAction()
                {
                    Matrix <float>      current_matrix = getInputValueMatrix() * m_weights[0];
                    DActivationFunction activator      = ActivationFactory.generateSigmoid(2, 2, true, false, false);

                    MatrixCalc.activate(activator, current_matrix);

                    for (int i = 1; i < m_weights.Length; i++)
                    {
                        current_matrix = current_matrix * m_weights[i];
                        MatrixCalc.activate(activator, current_matrix);
                    }

                    performOutputs(current_matrix);
                }
예제 #26
0
        /// <summary>
        /// Creates an initialized instance.
        /// </summary>
        /// <param name="numOfInputValues">The number of the network's input values.</param>
        /// <param name="numOfOutputValues">The number of the network's output values.</param>
        /// <param name="cfg">The configuration of the network and associated trainer.</param>
        public FeedForwardNetwork(int numOfInputValues, int numOfOutputValues, FeedForwardNetworkSettings cfg)
            : this(numOfInputValues, numOfOutputValues)
        {
            Random rand = new Random(1);

            //Initialize FF network
            for (int i = 0; i < cfg.HiddenLayersCfg.HiddenLayerCfgCollection.Count; i++)
            {
                AddLayer(cfg.HiddenLayersCfg.HiddenLayerCfgCollection[i].NumOfNeurons,
                         (AFAnalogBase)ActivationFactory.CreateAF(cfg.HiddenLayersCfg.HiddenLayerCfgCollection[i].ActivationCfg, rand)
                         );
            }
            FinalizeStructure((AFAnalogBase)ActivationFactory.CreateAF(cfg.OutputActivationCfg, rand));
            return;
        }
예제 #27
0
        /// <summary>
        /// Creates an initialized instance.
        /// </summary>
        /// <param name="elem">Xml element containing the initialization settings</param>
        public FeedForwardNetworkSettings(XElement elem)
        {
            //Validation
            XElement settingsElem = Validate(elem, XsdTypeName);

            //Parsing
            OutputActivationCfg = ActivationFactory.LoadSettings(settingsElem.Elements().First());
            OutputRange         = ActivationFactory.GetInfo(OutputActivationCfg, out _, out _);
            //Hidden layers
            XElement hiddenLayersElem = settingsElem.Elements("hiddenLayers").FirstOrDefault();

            if (hiddenLayersElem != null)
            {
                HiddenLayersCfg = new HiddenLayersSettings(hiddenLayersElem);
            }
            else
            {
                HiddenLayersCfg = new HiddenLayersSettings();
            }
            //Trainer configuration
            TrainerCfg = null;
            foreach (XElement candidate in settingsElem.Elements())
            {
                if (candidate.Name.LocalName == "qrdRegrTrainer")
                {
                    TrainerCfg = new QRDRegrTrainerSettings(candidate);
                    break;
                }
                else if (candidate.Name.LocalName == "ridgeRegrTrainer")
                {
                    TrainerCfg = new RidgeRegrTrainerSettings(candidate);
                    break;
                }
                else if (candidate.Name.LocalName == "elasticRegrTrainer")
                {
                    TrainerCfg = new ElasticRegrTrainerSettings(candidate);
                    break;
                }
                else if (candidate.Name.LocalName == "resPropTrainer")
                {
                    TrainerCfg = new RPropTrainerSettings(candidate);
                    break;
                }
            }
            Check();
            return;
        }
예제 #28
0
 //Constructors
 /// <summary>
 /// The deep copy constructor
 /// </summary>
 /// <param name="source">Source instance</param>
 public NeuronGroupSettings(NeuronGroupSettings source)
 {
     Name                     = source.Name;
     Role                     = source.Role;
     RelativeShare            = source.RelativeShare;
     ReadoutNeuronsDensity    = source.ReadoutNeuronsDensity;
     Count                    = source.Count;
     ActivationType           = source.ActivationType;
     ActivationCfg            = ActivationFactory.DeepCloneActivationSettings(source.ActivationCfg);
     SignalingRestriction     = source.SignalingRestriction;
     BiasCfg                  = source.BiasCfg?.DeepClone();
     AnalogFiringThreshold    = source.AnalogFiringThreshold;
     RetainmentNeuronsDensity = source.RetainmentNeuronsDensity;
     RetainmentStrengthCfg    = source.RetainmentStrengthCfg?.DeepClone();
     PredictorsCfg            = source.PredictorsCfg?.DeepClone();
     return;
 }
    public static DInput isStronger(ResourceFightDNCreature p_cre)
    {
        DActivationFunction activate = ActivationFactory.generateSigmoid(1f, 1, false, true, false);

        return(() =>
        {
            GameObject closest = p_cre.senseClosest("CREATURE");

            if (closest == null)
            {
                return 0;
            }

            ResourceFightDNCreature enemy = closest.GetComponent <ResourceFightDNCreature>();

            float strength_check = (p_cre.m_health.Value + (p_cre.m_damage * 5)) / (enemy.m_health.Value + (enemy.m_damage * 5));

            //Debug.Log( "[" + strength_check +"] " +  activate( strength_check-0.5f ) );

            return activate(strength_check - 0.5f); //Your mesure of toughness/ enemy mesure of toughness set up so double enemy gives 0 and half enemy 1
        });
    }
    //Dodging
    public static DInput bulletCollisionImminent(ResourceFightDNCreature p_cre)
    {
        DActivationFunction prox_activate  = ActivationFactory.generateSigmoid(1.5f, 2, false, true, true);
        DActivationFunction angle_activate = ActivationFactory.generateSigmoid(10f, 2, false, true, true);
        DActivationFunction full_activate  = ActivationFactory.generateSigmoid(1, 1, false, true, false);


        return(() =>
        {
            GameObject[] bullets = p_cre.sense("BULLET");

            List <GameObject> bullets_close_and_coming_towards = new List <GameObject>();

            foreach (GameObject bul in bullets)
            {
                if (Vector2Calc.proximity(bul.transform.position, p_cre.transform.position) < 2 && Vector2Calc.checkAngle(p_cre.transform.position - bul.transform.position, bul.GetComponent <Rigidbody2D>().velocity, 10))
                {
                    bullets_close_and_coming_towards.Add(bul);
                }
            }

            float activation = 0;

            foreach (GameObject bul in bullets_close_and_coming_towards)
            {
                float bul_prox = prox_activate(Vector2Calc.proximity(bul.transform.position, p_cre.transform.position) - 0.5f);
                float bul_angle = angle_activate(Mathf.Abs(Vector2Calc.getAngle(p_cre.transform.position - bul.transform.position, bul.GetComponent <Rigidbody2D>().velocity)));

                float bul_active = full_activate(bul_prox * bul_angle);
                if (bul_active > activation)
                {
                    activation = bul_active;
                }
            }
            //if(activation >0 ) Debug.Log(activation);

            return activation;
        });
    }