/Integrator/CLRI/Cerebrum.Samples.Objects-01/FastSymbolNeuron.cs
C# | 275 lines | 216 code | 32 blank | 27 comment | 13 complexity | b0168a0c6e5e8acca0e10a5fe194a0d9 MD5 | raw file
- using System;
-
- namespace Cerebrum.Samples.Objects01
- {
- /// <summary>
- /// Summary description for FastSymbolNeuron.
- /// </summary>
- public class FastSymbolNeuron : Cerebrum.Integrator.GenericComponent, Cerebrum.IPersistent, Cerebrum.IDiscovery, ILineralTreeNodeEx
- {
- private System.Collections.ArrayList m_Precedents;
- private System.Collections.ArrayList m_Dependents;
- private int m_Symbol;
- private bool m_IsChanged;
-
- public FastSymbolNeuron()
- {
- m_IsChanged = true;
- }
-
- #region ILineralTreeNodeEx Members
-
- public void FindAllLeafs(System.Collections.ArrayList leafs)
- {
- bool hasDependents = false;
- //находим все дочерние узлы
- foreach(Cerebrum.ObjectHandle h in m_Dependents)
- {
- using(Cerebrum.IConnector connector = this.DomainContext.AttachConnector(h))
- {
- ILineralTreeNodeEx node = connector.Component as ILineralTreeNodeEx;
- if(node!=null)
- {
- //рекурсивный вызов этой же функции но уже у другого нейрона
- node.FindAllLeafs(leafs);
- hasDependents = true;
- }
- }
- }
- //если это последний узел то у него нет зависимых - печатаем себ€.
- if(!hasDependents)
- {
- leafs.AddRange(this.RestoreStrings());
- }
- }
-
- #endregion
-
- #region INeuronLinks Members
-
- public void AddPrecedent(Cerebrum.ObjectHandle h)
- {
- m_Precedents.Add(h);
- m_IsChanged = true;
- }
-
- public void AddDependent(Cerebrum.ObjectHandle h)
- {
- m_Dependents.Add(h);
- m_IsChanged = true;
- }
-
- public void DelPrecedent(Cerebrum.ObjectHandle h)
- {
- m_Precedents.Remove(h);
- m_IsChanged = true;
- }
-
- public void DelDependent(Cerebrum.ObjectHandle h)
- {
- m_Dependents.Remove(h);
- m_IsChanged = true;
- }
-
- #endregion
-
- #region ILineralTreeNode Members
-
- public Cerebrum.ObjectHandle[] GenerateDependents(Cerebrum.IComposite outer, string text)
- {
- //провер€ем входные параметры
- if(text==null || text.Length<1) return null;
-
- //вырезаем первый символ из строки
- char symbol = text[0];
-
- //если первый символ совпадает с тем что разпознает этот нейрон - это наша строка
- if(this.Symbol!=symbol) return null;
-
- //получаем остаток строки
- string tail = text.Substring(1);
-
- if(tail.Length>0)
- {
- //пытаемс€ найти нейроны, распознающие остаток строки
- foreach(Cerebrum.ObjectHandle h in m_Dependents)
- {
- using(Cerebrum.IComposite connector = this.DomainContext.AttachConnector(h))
- {
- ILineralTreeNode node = connector.Component as ILineralTreeNode;
- if(node!=null)
- {
- //рекурсивный вызов этой же функции но уже у другого нейрона
- Cerebrum.ObjectHandle[] hs = node.GenerateDependents(connector, tail);
- if(hs!=null)
- {
- Cerebrum.ObjectHandle[] hs2 = new Cerebrum.ObjectHandle[hs.Length + 1];
- hs.CopyTo(hs2, 1);
- hs2[0] = outer.PlasmaHandle;
- return hs2;
- }
- }
- }
- }
- //если мы здесь, то найти ничего не удалось - создаем то чего нехватает (обучаем сеть).
-
- // создаем ID дл€ нового нейрона
- Cerebrum.ObjectHandle h0 = this.DomainContext.Workspace.NextSequence();
- // создаем новый экземпл€р нейрона
- using(Cerebrum.IComposite connector = this.DomainContext.Workspace.CreateConnector(h0, Cerebrum.Samples.Objects01.Specialized.Concepts.SymbolNeuronType(this.DomainContext)))
- {
- // а здесь мы приводим к ILineralTreeNodeEx
- // это надо чтоб добратьс€ до функции AddPrecedent котора€ не описана в интерфейсе ILineralTreeNode
- ILineralTreeNodeEx node = connector.Component as ILineralTreeNodeEx;
- if(node!=null)
- {
- //задаем нейрону его символ дл€ распознавани€
- node.Symbol = tail[0];
- //св€зываем созданный нейрон с собой - добавл€ем себ€ в его коллекцию Precedents и его в свою коллекцию Dependents
- node.AddPrecedent(outer.PlasmaHandle);
- this.AddDependent(connector.PlasmaHandle);
-
- //рекурсивный вызов этой же функции но уже у нового нейрона
- Cerebrum.ObjectHandle[] hs = node.GenerateDependents(connector, tail);
- if(hs!=null)
- {
- Cerebrum.ObjectHandle[] hs2 = new Cerebrum.ObjectHandle[hs.Length + 1];
- hs.CopyTo(hs2, 1);
- hs2[0] = outer.PlasmaHandle;
- return hs2;
- }
- }
- }
- }
- // мы были последними в списке - дальше распознавать нечего, возвращаем себ€
- return new Cerebrum.ObjectHandle[] {outer.PlasmaHandle};
- }
-
- public string[] RestoreStrings()
- {
- //опрашиваем всех предшественников и получаем строки, которые они распознают
- System.Collections.ArrayList result = new System.Collections.ArrayList();
- foreach(Cerebrum.ObjectHandle h in m_Precedents)
- {
- using(Cerebrum.IConnector connector = this.DomainContext.AttachConnector(h))
- {
- ILineralTreeNode node = connector.Component as ILineralTreeNode;
- if(node!=null)
- {
- //рекурсивный вызов этой же функции но уже у другого нейрона
- string [] heads = node.RestoreStrings();
- //обычно в heads может быть только одна строка - так как обычно предшественник в дереве только один
- //на случай поддержки многозначности и нескольких путей распространени€ волны возбуждени€ предусматриваем
- //более сложный вариант со многими предшественниками
- foreach(string head in heads)
- {
- result.Add(head + this.Symbol.ToString());
- }
- }
- }
- }
- // это корневой узел без предшественников - добавл€ем себ€ в начало строки
- if(result.Count<1)
- {
- result.Add(this.Symbol.ToString());
- }
- return (string[]) result.ToArray(typeof(string));
- }
-
- public char Symbol
- {
- get
- {
- return Convert.ToChar(m_Symbol);
- }
- set
- {
- m_Symbol = (int) value;
- m_IsChanged = true;
- }
- }
-
- #endregion
-
- #region IPersistent Members
-
- public void Serialize(Cerebrum.SerializeDirection direction, Cerebrum.IConnector connector, System.IO.Stream stream)
- {
- switch(direction)
- {
- case Cerebrum.SerializeDirection.Load:
- {
- m_Symbol = Cerebrum.ObjectHandle.ReadFrom(stream).ToInt32();
- break;
- }
- case Cerebrum.SerializeDirection.Save:
- {
- Cerebrum.ObjectHandle.WriteTo(stream, new Cerebrum.ObjectHandle(m_Symbol));
- break;
- }
- }
-
- SerializeArrayList(direction, stream, ref m_Precedents);
- SerializeArrayList(direction, stream, ref m_Dependents);
-
- m_IsChanged = false;
- }
-
- #endregion
-
- protected override void SetConnector(Cerebrum.SerializeDirection direction, Cerebrum.IConnector connector)
- {
- base.SetConnector (direction, connector);
- switch(direction)
- {
- case Cerebrum.SerializeDirection.Init:
- {
- m_Precedents = new System.Collections.ArrayList();
- m_Dependents = new System.Collections.ArrayList();
- m_IsChanged = true;
- break;
- }
- }
- }
-
- private static void SerializeArrayList(Cerebrum.SerializeDirection direction, System.IO.Stream stream, ref System.Collections.ArrayList list)
- {
- switch(direction)
- {
- case Cerebrum.SerializeDirection.Load:
- {
- int count;
- Cerebrum.ObjectHandle hcnt = Cerebrum.ObjectHandle.ReadFrom(stream);
- count = hcnt.ToInt32();
- list = new System.Collections.ArrayList(count);
- for(int i=0;i<count;i++)
- {
- list.Add(Cerebrum.ObjectHandle.ReadFrom(stream));
- }
- break;
- }
- case Cerebrum.SerializeDirection.Save:
- {
- Cerebrum.ObjectHandle.WriteTo(stream, new Cerebrum.ObjectHandle(list.Count));
- foreach(Cerebrum.ObjectHandle h in list)
- {
- Cerebrum.ObjectHandle.WriteTo(stream, h);
- }
- break;
- }
- }
- }
-
- #region IDiscovery Members
-
- public bool IsChanged
- {
- get
- {
- return this.m_IsChanged;
- }
- }
-
- #endregion
- }
- }