Guest User

Untitled

a guest
Feb 5th, 2016
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.03 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MathNet.Numerics.Interpolation;
  6. using MathNet.Numerics.LinearRegression;
  7. using System.IO;
  8. using MathNet.Numerics;
  9.  
  10. namespace ClockDriftAnalyzer
  11. {
  12.     class Program
  13.     {
  14.         class Sample
  15.         {
  16.             public uint Epoch { get; set; }
  17.             public uint Time { get; set; }
  18.             public DateTime Reference { get; set; }
  19.         }
  20.  
  21.         static void Main(string[] args)
  22.         {
  23.             var samples = new List<Sample>();
  24.  
  25.             using (var reader = new BinaryReader(File.OpenRead(@"E:\testdata\clock1.raw")))
  26.             {
  27.                 while (reader.BaseStream.Position < reader.BaseStream.Length)
  28.                 {
  29.                     samples.Add(new Sample()
  30.                     {
  31.                         Epoch = reader.ReadUInt32(),
  32.                         Time = reader.ReadUInt32(),
  33.                         Reference = DateTime.FromBinary(reader.ReadInt64())
  34.                     });
  35.                 }
  36.             }
  37.             var initRef = samples.First().Reference;
  38.             var initTime = samples.First().Time;
  39.             var initEpoch = samples.First().Epoch;
  40.  
  41.             var samplesRelat = samples.Select(s => new {
  42.                 Epoch = s.Epoch - initEpoch,
  43.                 Time = s.Time - initTime,
  44.                 Ref = s.Reference - initRef
  45.             }).ToArray();
  46.  
  47.             using (TextWriter writer = new StreamWriter(@"E:\testdata\dump.txt"))
  48.             {
  49.                 foreach (var sample in samplesRelat)
  50.                 {
  51.                     writer.WriteLine("{0}\t{1}\t{2}", sample.Epoch, sample.Time, sample.Ref);
  52.                 }
  53.             }
  54.  
  55.             var refVsTime = samplesRelat.Select(s => new Tuple<double, double>(s.Ref.TotalMilliseconds, s.Time));
  56.             var spline = SimpleRegression.Fit(refVsTime);
  57.             Console.WriteLine("Лин.регрессия, коэф A: {0:0.0000}", spline.Item2);
  58.             var last = refVsTime.Last();
  59.             Console.WriteLine("Расхождение в конце: {0:0.0} с", (last.Item2 - last.Item1) / 1000.0);
  60.  
  61.             var rs = GoodnessOfFit.RSquared(refVsTime.Select(t => t.Item1 * spline.Item2), refVsTime.Select(t => t.Item2));
  62.             Console.WriteLine("R^2: {0}", rs);
  63.  
  64.             var refVsCurTime = samplesRelat
  65.                 .Select(s => new Tuple<double, uint>(s.Ref.TotalSeconds, s.Epoch))
  66.                 .DistinctBy(s => s.Item2)
  67.                 .ToArray();
  68.  
  69.             var ordered = refVsCurTime.Pairwise().OrderBy(t => t.Item2.Item1 - t.Item1.Item1);
  70.  
  71.             Console.WriteLine("\r\nНаименьшие шаги CurTimeEx:");
  72.             foreach (var e in ordered.Take(20))
  73.             {
  74.                 Console.WriteLine("Ref: {0:0.0} - {1:0.0}, CurTime: {2} - {3}", e.Item1.Item1, e.Item2.Item1, e.Item1.Item2, e.Item2.Item2);
  75.             }
  76.  
  77.             Console.WriteLine("\r\nНаибольшие шаги CurTimeEx:");
  78.             foreach (var e in ordered.Reverse().Where(e => samplesRelat.Reverse().SkipWhile(s => s.Epoch != e.Item2.Item2).TakeWhile(s => s.Epoch != e.Item1.Item2).Count() > 1).Take(20))
  79.             {
  80.                 Console.WriteLine("Ref: {0:0.0} - {1:0.0}, CurTime: {2} - {3}", e.Item1.Item1, e.Item2.Item1, e.Item1.Item2, e.Item2.Item2);
  81.             }
  82.         }
  83.     }
  84.  
  85.     static class Extensions
  86.     {
  87.         public static IEnumerable<TSource> DistinctBy<TSource, TKey>
  88.             (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
  89.         {
  90.             HashSet<TKey> knownKeys = new HashSet<TKey>();
  91.             foreach (TSource element in source)
  92.             {
  93.                 if (knownKeys.Add(keySelector(element)))
  94.                 {
  95.                     yield return element;
  96.                 }
  97.             }
  98.         }
  99.  
  100.         public static IEnumerable<Tuple<T, T>> Pairwise<T>(this IEnumerable<T> source)
  101.         {
  102.             return source.Zip(source.Skip(1), (a, b) => Tuple.Create(a, b));
  103.         }
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment