//Constructor /// <summary> /// Creates initialized instance /// </summary> /// <param name="sourceNeuron">Source neuron</param> /// <param name="targetNeuron">Target neuron</param> /// <param name="role">Synapse role</param> /// <param name="synapseCfg">Synapse general configuration</param> /// <param name="rand">Random object</param> public Synapse(INeuron sourceNeuron, INeuron targetNeuron, SynRole role, SynapseSettings synapseCfg, Random rand ) { //Neurons to be connected SourceNeuron = sourceNeuron; TargetNeuron = targetNeuron; //Synapse role Role = role; //Euclidean distance Distance = EuclideanDistance.Compute(SourceNeuron.Location.ReservoirCoordinates, TargetNeuron.Location.ReservoirCoordinates); //The rest _efficacyComputer = null; if (TargetNeuron.TypeOfActivation == ActivationType.Spiking) { //Spiking target if (Role == SynRole.Input) { DelayMethod = synapseCfg.SpikingTargetCfg.InputSynCfg.DelayMethod; _maxDelay = synapseCfg.SpikingTargetCfg.InputSynCfg.MaxDelay; if (SourceNeuron.TypeOfActivation == ActivationType.Analog) { //Analog source Weight = rand.NextDouble(synapseCfg.SpikingTargetCfg.InputSynCfg.AnalogSourceCfg.WeightCfg); } else { //Spiking source Weight = rand.NextDouble(synapseCfg.SpikingTargetCfg.InputSynCfg.SpikingSourceCfg.WeightCfg); _efficacyComputer = PlasticityCommon.GetEfficacyComputer(SourceNeuron, synapseCfg.SpikingTargetCfg.InputSynCfg.SpikingSourceCfg.PlasticityCfg.DynamicsCfg ); } } else if (Role == SynRole.Excitatory) { DelayMethod = synapseCfg.SpikingTargetCfg.ExcitatorySynCfg.DelayMethod; _maxDelay = synapseCfg.SpikingTargetCfg.ExcitatorySynCfg.MaxDelay; if (SourceNeuron.TypeOfActivation == ActivationType.Analog) { //Analog source Weight = rand.NextDouble(synapseCfg.SpikingTargetCfg.ExcitatorySynCfg.AnalogSourceCfg.WeightCfg); } else { //Spiking source Weight = rand.NextDouble(synapseCfg.SpikingTargetCfg.ExcitatorySynCfg.SpikingSourceCfg.WeightCfg); _efficacyComputer = PlasticityCommon.GetEfficacyComputer(SourceNeuron, synapseCfg.SpikingTargetCfg.ExcitatorySynCfg.SpikingSourceCfg.PlasticityCfg.DynamicsCfg ); } } else if (Role == SynRole.Inhibitory) { DelayMethod = synapseCfg.SpikingTargetCfg.InhibitorySynCfg.DelayMethod; _maxDelay = synapseCfg.SpikingTargetCfg.InhibitorySynCfg.MaxDelay; if (SourceNeuron.TypeOfActivation == ActivationType.Analog) { //Analog source Weight = -rand.NextDouble(synapseCfg.SpikingTargetCfg.InhibitorySynCfg.AnalogSourceCfg.WeightCfg); } else { //Spiking source Weight = -rand.NextDouble(synapseCfg.SpikingTargetCfg.InhibitorySynCfg.SpikingSourceCfg.WeightCfg); _efficacyComputer = PlasticityCommon.GetEfficacyComputer(SourceNeuron, synapseCfg.SpikingTargetCfg.InhibitorySynCfg.SpikingSourceCfg.PlasticityCfg.DynamicsCfg ); } } else { throw new ArgumentException($"Invalid synapse role {role}.", "role"); } } else { //Analog target if (Role == SynRole.Input) { DelayMethod = synapseCfg.AnalogTargetCfg.InputSynCfg.DelayMethod; _maxDelay = synapseCfg.AnalogTargetCfg.InputSynCfg.MaxDelay; if (SourceNeuron.TypeOfActivation == ActivationType.Analog) { //Analog source Weight = rand.NextDouble(synapseCfg.AnalogTargetCfg.InputSynCfg.AnalogSourceCfg.WeightCfg); } else { //Spiking source Weight = rand.NextSign() * rand.NextDouble(synapseCfg.AnalogTargetCfg.InputSynCfg.SpikingSourceCfg.WeightCfg); _efficacyComputer = PlasticityCommon.GetEfficacyComputer(SourceNeuron, synapseCfg.AnalogTargetCfg.InputSynCfg.SpikingSourceCfg.PlasticityCfg.DynamicsCfg ); } } else if (Role == SynRole.Indifferent) { DelayMethod = synapseCfg.AnalogTargetCfg.IndifferentSynCfg.DelayMethod; _maxDelay = synapseCfg.AnalogTargetCfg.IndifferentSynCfg.MaxDelay; if (SourceNeuron.TypeOfActivation == ActivationType.Analog) { //Analog source Weight = rand.NextSign() * rand.NextDouble(synapseCfg.AnalogTargetCfg.IndifferentSynCfg.AnalogSourceCfg.WeightCfg); } else { //Spiking source Weight = rand.NextSign() * rand.NextDouble(synapseCfg.AnalogTargetCfg.IndifferentSynCfg.SpikingSourceCfg.WeightCfg); _efficacyComputer = PlasticityCommon.GetEfficacyComputer(SourceNeuron, synapseCfg.AnalogTargetCfg.IndifferentSynCfg.SpikingSourceCfg.PlasticityCfg.DynamicsCfg ); } } else { throw new ArgumentException($"Invalid synapse role {role}.", "role"); } } //Source neuron - output data and signal index _sourceNeuronOutputData = SourceNeuron.OutputData; _analogSourceSignal = TargetNeuron.TypeOfActivation == ActivationType.Analog; //Efficacy statistics EfficacyStat = new BasicStat(false); Reset(true); return; }
/// <summary> /// The deep copy constructor. /// </summary> /// <param name="source">The source instance.</param> public SynapseSettings(SynapseSettings source) : this(source.SpikingTargetCfg, source.AnalogTargetCfg) { return; }