/// <summary> /// Comparing /// </summary> async Task<Congruence[]> CompareParallel(Signature mainSign, Signature[] signs) { if (mainSigns == null || signs == null || signs.Length == 0) return null; IEnumerable<Congruence> ret = null; object retLock = new object(); Log(String.Format("Parallel compare. Delta is Sigma * {0:0.00}", NSigm)); Recognition.Initialize(); Stopwatch sw = new Stopwatch(); sw.Start(); int k = 1, n = signs.Length; await Task.Factory.StartNew(() => { Parallel.For(0, signs.Length, delegate(int i) { if(signs[i].FreqRate != mainSign.FreqRate) { Log(String.Format("Error: \"{0}\" is uncomparable with \"{1}\"", signs[i].ToString(), mainSign.ToString())); return; } else if (signs[i].BaseFileInfo.SampleRate != mainSign.BaseFileInfo.SampleRate) { Log("Warning: basic rates is not equal:"); Log(String.Format("{0} [{1} Hz] : {2} [{3} Hz]", mainSign.ToString(), mainSign.BaseFileInfo.SampleRate, signs[i].ToString(), signs[i].BaseFileInfo.SampleRate)); } // Сравнение Congruence[] cong = mainSign.CompareTo(signs[i], NSigm); #region Вывод StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}/{1}]:\t{2} {3}", k++, n, signs[i].ToString(), Environment.NewLine); if (cong == null) { sb.Append("\t\t[NULL]"); lock (logLock) Log(sb.ToString()); return; } for (int j = 0; j < cong.Length - 1; j++) { sb.AppendFormat("\t\t{0:T}; sigms: {1:0.00} {2}", mainSign.ToTimeSpan(cong[j].Coord), cong[j].SignSigma, Environment.NewLine); } sb.AppendFormat("\t\t{0:T}; sigms: {1:0.00}", mainSign.ToTimeSpan(cong[cong.Length - 1].Coord), cong[cong.Length - 1].SignSigma); lock (logLock) Log(sb.ToString()); #endregion lock (retLock) { if (ret == null) ret = cong.AsEnumerable(); else ret = ret.Concat(cong); } }); }); sw.Stop(); Log("Elapsed: " + sw.Elapsed + Environment.NewLine + "Compare complete."); return ret == null ? null : ret.ToArray(); }
/// <summary> /// Set new sign info on dataSignInfo /// </summary> private void ShowSignInfo(Signature sign) { dataSignInfo.Rows.Clear(); dataSignInfo.Rows.Add("Файл", sign.ToString()); dataSignInfo.Rows.Add("Сигнатур в секунду", sign.FreqRate); dataSignInfo.Rows.Add("Частота источника", sign.BaseFileInfo.SampleRate); dataSignInfo.Rows.Add("Оконная функция", sign.WindowFunction.ToString()); dataSignInfo.Rows.Add("Длительность", sign.ToTimeSpan().ToString()); }