PageRenderTime 78ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/Integrator/CLRI/Cerebrum.Samples.Objects-01/FastSymbolNeuron.cs

#
C# | 275 lines | 216 code | 32 blank | 27 comment | 13 complexity | b0168a0c6e5e8acca0e10a5fe194a0d9 MD5 | raw file
Possible License(s): AGPL-3.0
  1. using System;
  2. namespace Cerebrum.Samples.Objects01
  3. {
  4. /// <summary>
  5. /// Summary description for FastSymbolNeuron.
  6. /// </summary>
  7. public class FastSymbolNeuron : Cerebrum.Integrator.GenericComponent, Cerebrum.IPersistent, Cerebrum.IDiscovery, ILineralTreeNodeEx
  8. {
  9. private System.Collections.ArrayList m_Precedents;
  10. private System.Collections.ArrayList m_Dependents;
  11. private int m_Symbol;
  12. private bool m_IsChanged;
  13. public FastSymbolNeuron()
  14. {
  15. m_IsChanged = true;
  16. }
  17. #region ILineralTreeNodeEx Members
  18. public void FindAllLeafs(System.Collections.ArrayList leafs)
  19. {
  20. bool hasDependents = false;
  21. //находим все дочерние узлы
  22. foreach(Cerebrum.ObjectHandle h in m_Dependents)
  23. {
  24. using(Cerebrum.IConnector connector = this.DomainContext.AttachConnector(h))
  25. {
  26. ILineralTreeNodeEx node = connector.Component as ILineralTreeNodeEx;
  27. if(node!=null)
  28. {
  29. //рекурсивный вызов этой же функции но уже у другого нейрона
  30. node.FindAllLeafs(leafs);
  31. hasDependents = true;
  32. }
  33. }
  34. }
  35. //если это последний узел то у него нет зависимых - печатаем себ€.
  36. if(!hasDependents)
  37. {
  38. leafs.AddRange(this.RestoreStrings());
  39. }
  40. }
  41. #endregion
  42. #region INeuronLinks Members
  43. public void AddPrecedent(Cerebrum.ObjectHandle h)
  44. {
  45. m_Precedents.Add(h);
  46. m_IsChanged = true;
  47. }
  48. public void AddDependent(Cerebrum.ObjectHandle h)
  49. {
  50. m_Dependents.Add(h);
  51. m_IsChanged = true;
  52. }
  53. public void DelPrecedent(Cerebrum.ObjectHandle h)
  54. {
  55. m_Precedents.Remove(h);
  56. m_IsChanged = true;
  57. }
  58. public void DelDependent(Cerebrum.ObjectHandle h)
  59. {
  60. m_Dependents.Remove(h);
  61. m_IsChanged = true;
  62. }
  63. #endregion
  64. #region ILineralTreeNode Members
  65. public Cerebrum.ObjectHandle[] GenerateDependents(Cerebrum.IComposite outer, string text)
  66. {
  67. //провер€ем входные параметры
  68. if(text==null || text.Length<1) return null;
  69. //вырезаем первый символ из строки
  70. char symbol = text[0];
  71. //если первый символ совпадает с тем что разпознает этот нейрон - это наша строка
  72. if(this.Symbol!=symbol) return null;
  73. //получаем остаток строки
  74. string tail = text.Substring(1);
  75. if(tail.Length>0)
  76. {
  77. //пытаемс€ найти нейроны, распознающие остаток строки
  78. foreach(Cerebrum.ObjectHandle h in m_Dependents)
  79. {
  80. using(Cerebrum.IComposite connector = this.DomainContext.AttachConnector(h))
  81. {
  82. ILineralTreeNode node = connector.Component as ILineralTreeNode;
  83. if(node!=null)
  84. {
  85. //рекурсивный вызов этой же функции но уже у другого нейрона
  86. Cerebrum.ObjectHandle[] hs = node.GenerateDependents(connector, tail);
  87. if(hs!=null)
  88. {
  89. Cerebrum.ObjectHandle[] hs2 = new Cerebrum.ObjectHandle[hs.Length + 1];
  90. hs.CopyTo(hs2, 1);
  91. hs2[0] = outer.PlasmaHandle;
  92. return hs2;
  93. }
  94. }
  95. }
  96. }
  97. //если мы здесь, то найти ничего не удалось - создаем то чего нехватает (обучаем сеть).
  98. // создаем ID дл€ нового нейрона
  99. Cerebrum.ObjectHandle h0 = this.DomainContext.Workspace.NextSequence();
  100. // создаем новый экземпл€р нейрона
  101. using(Cerebrum.IComposite connector = this.DomainContext.Workspace.CreateConnector(h0, Cerebrum.Samples.Objects01.Specialized.Concepts.SymbolNeuronType(this.DomainContext)))
  102. {
  103. // а здесь мы приводим к ILineralTreeNodeEx
  104. // это надо чтоб добратьс€ до функции AddPrecedent котора€ не описана в интерфейсе ILineralTreeNode
  105. ILineralTreeNodeEx node = connector.Component as ILineralTreeNodeEx;
  106. if(node!=null)
  107. {
  108. //задаем нейрону его символ дл€ распознавани€
  109. node.Symbol = tail[0];
  110. //св€зываем созданный нейрон с собой - добавл€ем себ€ в его коллекцию Precedents и его в свою коллекцию Dependents
  111. node.AddPrecedent(outer.PlasmaHandle);
  112. this.AddDependent(connector.PlasmaHandle);
  113. //рекурсивный вызов этой же функции но уже у нового нейрона
  114. Cerebrum.ObjectHandle[] hs = node.GenerateDependents(connector, tail);
  115. if(hs!=null)
  116. {
  117. Cerebrum.ObjectHandle[] hs2 = new Cerebrum.ObjectHandle[hs.Length + 1];
  118. hs.CopyTo(hs2, 1);
  119. hs2[0] = outer.PlasmaHandle;
  120. return hs2;
  121. }
  122. }
  123. }
  124. }
  125. // мы были последними в списке - дальше распознавать нечего, возвращаем себ€
  126. return new Cerebrum.ObjectHandle[] {outer.PlasmaHandle};
  127. }
  128. public string[] RestoreStrings()
  129. {
  130. //опрашиваем всех предшественников и получаем строки, которые они распознают
  131. System.Collections.ArrayList result = new System.Collections.ArrayList();
  132. foreach(Cerebrum.ObjectHandle h in m_Precedents)
  133. {
  134. using(Cerebrum.IConnector connector = this.DomainContext.AttachConnector(h))
  135. {
  136. ILineralTreeNode node = connector.Component as ILineralTreeNode;
  137. if(node!=null)
  138. {
  139. //рекурсивный вызов этой же функции но уже у другого нейрона
  140. string [] heads = node.RestoreStrings();
  141. //обычно в heads может быть только одна строка - так как обычно предшественник в дереве только один
  142. //на случай поддержки многозначности и нескольких путей распространени€ волны возбуждени€ предусматриваем
  143. //более сложный вариант со многими предшественниками
  144. foreach(string head in heads)
  145. {
  146. result.Add(head + this.Symbol.ToString());
  147. }
  148. }
  149. }
  150. }
  151. // это корневой узел без предшественников - добавл€ем себ€ в начало строки
  152. if(result.Count<1)
  153. {
  154. result.Add(this.Symbol.ToString());
  155. }
  156. return (string[]) result.ToArray(typeof(string));
  157. }
  158. public char Symbol
  159. {
  160. get
  161. {
  162. return Convert.ToChar(m_Symbol);
  163. }
  164. set
  165. {
  166. m_Symbol = (int) value;
  167. m_IsChanged = true;
  168. }
  169. }
  170. #endregion
  171. #region IPersistent Members
  172. public void Serialize(Cerebrum.SerializeDirection direction, Cerebrum.IConnector connector, System.IO.Stream stream)
  173. {
  174. switch(direction)
  175. {
  176. case Cerebrum.SerializeDirection.Load:
  177. {
  178. m_Symbol = Cerebrum.ObjectHandle.ReadFrom(stream).ToInt32();
  179. break;
  180. }
  181. case Cerebrum.SerializeDirection.Save:
  182. {
  183. Cerebrum.ObjectHandle.WriteTo(stream, new Cerebrum.ObjectHandle(m_Symbol));
  184. break;
  185. }
  186. }
  187. SerializeArrayList(direction, stream, ref m_Precedents);
  188. SerializeArrayList(direction, stream, ref m_Dependents);
  189. m_IsChanged = false;
  190. }
  191. #endregion
  192. protected override void SetConnector(Cerebrum.SerializeDirection direction, Cerebrum.IConnector connector)
  193. {
  194. base.SetConnector (direction, connector);
  195. switch(direction)
  196. {
  197. case Cerebrum.SerializeDirection.Init:
  198. {
  199. m_Precedents = new System.Collections.ArrayList();
  200. m_Dependents = new System.Collections.ArrayList();
  201. m_IsChanged = true;
  202. break;
  203. }
  204. }
  205. }
  206. private static void SerializeArrayList(Cerebrum.SerializeDirection direction, System.IO.Stream stream, ref System.Collections.ArrayList list)
  207. {
  208. switch(direction)
  209. {
  210. case Cerebrum.SerializeDirection.Load:
  211. {
  212. int count;
  213. Cerebrum.ObjectHandle hcnt = Cerebrum.ObjectHandle.ReadFrom(stream);
  214. count = hcnt.ToInt32();
  215. list = new System.Collections.ArrayList(count);
  216. for(int i=0;i<count;i++)
  217. {
  218. list.Add(Cerebrum.ObjectHandle.ReadFrom(stream));
  219. }
  220. break;
  221. }
  222. case Cerebrum.SerializeDirection.Save:
  223. {
  224. Cerebrum.ObjectHandle.WriteTo(stream, new Cerebrum.ObjectHandle(list.Count));
  225. foreach(Cerebrum.ObjectHandle h in list)
  226. {
  227. Cerebrum.ObjectHandle.WriteTo(stream, h);
  228. }
  229. break;
  230. }
  231. }
  232. }
  233. #region IDiscovery Members
  234. public bool IsChanged
  235. {
  236. get
  237. {
  238. return this.m_IsChanged;
  239. }
  240. }
  241. #endregion
  242. }
  243. }