Guest User

Untitled

a guest
Feb 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.36 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using Hardware.misc;
  7. using Hardware.processing.math;
  8. using Hardware.messenger;
  9.  
  10. namespace Hardware.processing.recognition
  11. {
  12. public class SubstanceDetectionProcessor : IDataProcessor
  13. {
  14. private readonly DataStreamDifferentiator[] _differentiators;
  15. private readonly DataStreamDifferentiator[] _prefetchDifferentiators;
  16. private const int DifferentiatorWindowLength = 60;
  17. private const double RecognitionTime = 10000;
  18. private const double WarmupThresholdTime = 6e4;
  19. private const double MinimumCleanupTime = 0;//6e4;
  20.  
  21. private double _lastEventDuringWarmup = 0;
  22. private ISubstanceRecognitionProcessor _recognitionProcessor = null;
  23.  
  24. public ISubstanceRecognitionProcessor RecognitionProcessor
  25. {
  26. get { return _recognitionProcessor; }
  27. set { _recognitionProcessor = value; }
  28. }
  29.  
  30. //StreamWriter sr = new StreamWriter(@"D:\tmp_data_" + TimestampHelper.DateTimeToTimestamp(DateTime.Now) + ".csv");
  31. //StreamWriter srd = new StreamWriter(@"D:\tmp_diff_" + TimestampHelper.DateTimeToTimestamp(DateTime.Now) + ".csv");
  32. //StreamWriter srt = new StreamWriter(@"D:\tmp_evts_" + TimestampHelper.DateTimeToTimestamp(DateTime.Now) + ".csv");
  33.  
  34.  
  35. private enum State
  36. {
  37. Stabilizing, // Waiting for sensors to settle (warmup)
  38. Waiting, // Currently in clean athmosphere, waiting for contaminant
  39. Recognizing, // Contaminant detected, waiting for sensors to settle
  40. Exposed // Currently in contaminated athmosphere, waiting for a contaminant to disappear
  41. } ;
  42.  
  43. private readonly double[] _zeros; // Unexposed state of sensors
  44. private double _lockinTimestamp;
  45. private State _currentState;
  46.  
  47.  
  48. public SubstanceDetectionProcessor()
  49. {
  50. _differentiators = new DataStreamDifferentiator[SensorDataHelper.GetParticipatingSensorNum()];
  51. _prefetchDifferentiators = new DataStreamDifferentiator[SensorDataHelper.GetParticipatingSensorNum()];
  52.  
  53. for (var i = 0; i < _differentiators.Length; ++i)
  54. {
  55. _differentiators[i] = new DataStreamDifferentiator(DifferentiatorWindowLength);
  56. _prefetchDifferentiators[i] = new DataStreamDifferentiator(DifferentiatorWindowLength);
  57. }
  58.  
  59. _zeros = new double[SensorDataHelper.GetParticipatingSensorNum()];
  60. _currentState = State.Waiting;
  61. }
  62.  
  63. public void Process(double timestamp, double[] readings)
  64. {
  65. var workingSet = GetWorkingSet(readings);
  66.  
  67. if (_differentiators[0].Length == 0)
  68. {
  69. for (var i = 0; i < workingSet.Length; ++i)
  70. {
  71. _differentiators[i].Fill(workingSet[i]);
  72. _prefetchDifferentiators[i].Fill(workingSet[i]);
  73. }
  74.  
  75. _lastEventDuringWarmup = timestamp;
  76.  
  77. Messenger.EnqueueMessage(new FasolMessage("Ожидание окончания прогрева сенсоров.", "Fasol", 5));
  78.  
  79. return;
  80. }
  81.  
  82. for (var i = 0; i < workingSet.Length; ++i)
  83. {
  84. _prefetchDifferentiators[i].AddNewPoint(timestamp, _differentiators[i].FirstY);
  85. _differentiators[i].AddNewPoint(timestamp, workingSet[i]);
  86. }
  87.  
  88. /* sr.Write(timestamp.ToString() + "\t");
  89. srd.Write(timestamp.ToString() + "\t");
  90.  
  91. foreach (var d in workingSet)
  92. {
  93. sr.Write(d.ToString());
  94. sr.Write("\t");
  95. }
  96.  
  97. foreach (var dataStreamDifferentiator in _differentiators)
  98. {
  99. srd.Write(dataStreamDifferentiator.Derivative);
  100. srd.Write("\t");
  101. }
  102. sr.WriteLine();
  103. srd.WriteLine();
  104. sr.Flush();
  105. srd.Flush();*/
  106.  
  107.  
  108. ProcessStateMachine(timestamp);
  109. }
  110.  
  111. private void ProcessStateMachine(double timestamp)
  112. {
  113. //srt.Write(timestamp.ToString() + " ");
  114. switch (_currentState)
  115. {
  116. case State.Stabilizing:
  117. {
  118. //srt.WriteLine("S");
  119. if (timestamp - _lastEventDuringWarmup >= WarmupThresholdTime)
  120. {
  121. Messenger.EnqueueMessage(new FasolMessage("Прогрев сенсоров завершен.", "Fasol", 5));
  122. _currentState = State.Waiting;
  123. }
  124. else if (CheckRisingThresholds(timestamp))
  125. {
  126. _lastEventDuringWarmup = timestamp;
  127. }
  128. }
  129. break;
  130.  
  131. case State.Waiting:
  132. {
  133. //srt.WriteLine("W");
  134. if (CheckRisingThresholds(timestamp))
  135. {
  136. for (var i = 0; i < _differentiators.Length; ++i)
  137. {
  138. _zeros[i] = _prefetchDifferentiators[i].GetLinearApproximation((_prefetchDifferentiators[i].LastX + _prefetchDifferentiators[i].FirstX) / 2);
  139. }
  140. _lockinTimestamp = timestamp;
  141. _currentState = State.Recognizing;
  142. Messenger.EnqueueMessage(new FasolMessage("Изменился состав атмосферы...", "Fasol", 5));
  143. }
  144. }
  145. break;
  146.  
  147. case State.Recognizing:
  148. {
  149. //srt.WriteLine("R");
  150. if (timestamp - _lockinTimestamp >= RecognitionTime)
  151. {
  152. double[] set = GenerateNeuralInput();
  153.  
  154. _recognitionProcessor.Recognize(timestamp, set);
  155. //Console.WriteLine("Some shit recognized with imaginary recognizer");
  156. _currentState = State.Exposed;
  157. }
  158. }
  159.  
  160.  
  161. break;
  162.  
  163. case State.Exposed:
  164. {
  165. //srt.WriteLine("E");
  166. if ((timestamp - _lockinTimestamp) >= MinimumCleanupTime && CheckForCleanAir(timestamp))
  167. {
  168. //Console.WriteLine("Some shit disappeared");
  169. Messenger.EnqueueMessage(
  170. new FasolMessage("Атмосфера очистилась. Возможно детектирование нового вещества...",
  171. "Fasol", 5));
  172. _currentState = State.Waiting;
  173. }
  174. }
  175. break;
  176. }
  177.  
  178. //srt.Flush();
  179. }
  180.  
  181. private bool CheckForCleanAir(double timestamp)
  182. {
  183. var deltaT = timestamp - _lockinTimestamp;
  184.  
  185. if (deltaT < MinimumCleanupTime)
  186. {
  187. return false;
  188. }
  189.  
  190. for (var i = 0; i < _zeros.Length; ++i)
  191. {
  192. var deltaR = _differentiators[i].LastY - _zeros[i];
  193.  
  194. if (Math.Abs(deltaR) >
  195. SensorDataHelper.GetReleaseThreshold(i) + SensorDataHelper.GetReleaseDrift(i)*deltaT)
  196. {
  197. return false;
  198. }
  199. }
  200.  
  201. return true;
  202. }
  203.  
  204. private bool CheckRisingThresholds(double timestamp)
  205. {
  206.  
  207. for (var i = 0; i < _differentiators.Length; ++i)
  208. {
  209. if (Math.Abs(_differentiators[i].Derivative) > SensorDataHelper.GetDetectionThreshold(i))
  210. {
  211. return true;
  212. }
  213. }
  214.  
  215. return false;
  216. }
  217.  
  218. private static double[] GetWorkingSet(double[] readings)
  219. {
  220. var ret = new double[SensorDataHelper.GetParticipatingSensorNum()];
  221.  
  222. var j = 0;
  223.  
  224. for (var i = 0; i < SensorDataHelper.GetInstalledSensorNum(); ++i)
  225. {
  226. if (SensorDataHelper.IsParticipatingInRecognition(i))
  227. {
  228. ret[j] = readings[i]; // 65535.0 / (readings[i] + 1); // Ololo
  229. ++j;
  230. }
  231. }
  232.  
  233. return ret;
  234. }
  235.  
  236. private double[] GenerateNeuralInput()
  237. {
  238. var neuralInput = new double[_zeros.Length];
  239.  
  240. for (var i = 0; i < _zeros.Length; ++i)
  241. {
  242. neuralInput[i] = _differentiators[i].GetLinearApproximation(_differentiators[i].LastX) - _zeros[i];
  243. }
  244.  
  245. double max = Math.Max(neuralInput.Max(), -neuralInput.Min());
  246.  
  247. for (var i = 0; i < _zeros.Length; ++i)
  248. {
  249. neuralInput[i] /= max;
  250. }
  251.  
  252. return neuralInput;
  253. }
  254. }
  255. }
Add Comment
Please, Sign In to add comment