void Connect(Link pre,Node post,Weight weight) { Connection i=new Connection(weight); pre.Next[Utility.FirstNull(pre.Next)]=i; post.Previous[Utility.FirstNull(post.Previous)]=i; i.Previous=pre; i.Next=post; i.Identity=string.Format("{0} --> {1}",i.Previous.Identity,i.Next.Identity); }
void Map(Link a,Link b,Weight weight,Dictionary<Link,List<Connection>> map) { Connection connection=new Connection(weight,a,(NeuronBase)b); if(!map.ContainsKey(a)) map[a]=new List<Connection>(); map[a].Add(connection); if(!map.ContainsKey(b)) map[b]=new List<Connection>(); map[b].Add(connection); }
public override void Pulse(Connection sender,double value) { PendingValue+=sender.Calculate(value); if(++SignalsReceived<Previous.Length) return; SignalsReceived=0; double output=Func.Activation(PendingValue); LastInputSignal=PendingValue; LastOutputSignal=output; if(Inspector!=null && Inspector.TraceLevel>=1) Inspector.Trace(this,"Input sum={0}, output={1}",PendingValue,output); if(Next!=null) foreach(Connection i in Next) i.Next.Pulse(i,output); PendingValue=0; }
protected NetworkStructure GetStructure(XElement root) { var unitElems=root.Elements("unit"); var weightElems=root.Elements("weight"); Dictionary<string,Tuple<Link,int>> unitsMap=GetUnits(unitElems).ToDictionary(pair => pair.Item1.GetDescription() ,pair => pair); Dictionary<string,Weight> weightsMap=GetWeights(weightElems).ToDictionary(pair => pair.Item1,pair => pair.Item2); var connectionElems=root.Elements("connection"); Dictionary<Link,List<Connection>> mapNext=new Dictionary<Link,List<Connection>>(); Dictionary<Link,List<Connection>> mapPrevious=new Dictionary<Link,List<Connection>>(); foreach(XElement element in connectionElems){ Connection c=new Connection(weightsMap[element.Value],unitsMap[element.Attribute("from").Value].Item1,(NeuronBase)unitsMap[element.Attribute("to").Value].Item1); if(!mapNext.ContainsKey(c.Previous)) mapNext.Add(c.Previous,new List<Connection>()); mapNext[c.Previous].Add(c); if(!mapPrevious.ContainsKey(c.Next)) mapPrevious.Add(c.Next,new List<Connection>()); mapPrevious[c.Next].Add(c); } Link[] structure=unitsMap.Select(x => x.Value.Item1).ToArray(); foreach(Link link in structure) { if(mapNext.ContainsKey(link)) link.Next=mapNext[link].ToArray(); if(link is NeuronBase) if(mapPrevious.ContainsKey(link)) ((NeuronBase)link).Previous=mapPrevious[link].ToArray(); } Bias bias=unitsMap.Select(x => x.Value.Item1).FirstOrDefault(x => x is Bias) as Bias; int layersCount=int.Parse(root.Element("layers").Value); List<List<Link>> layers=new List<List<Link>>(layersCount); for(var i=0;i<layersCount;i++) layers.Add(new List<Link>()); foreach(var kvp in unitsMap) { int l=kvp.Value.Item2; if(l!=-1) layers[l].Add(kvp.Value.Item1); } return new NetworkStructure(layers.Select(x => x.ToArray()).ToArray(),bias); }
public override void Pulse(Connection sender,double value) { throw new NotImplementedException(); //todo }
public abstract void Pulse(Connection sender,double value);