示例#1
0
 public SigmaInterval(SigmaInterval origin)
 {
     Name        = origin.Name;
     Bound1      = origin.Bound1;
     Bound2      = origin.Bound2;
     ValuesCount = origin.ValuesCount;
 }
示例#2
0
 private SigmaInterval GenerateInterval(
     IList <SigmaInterval> intervals, double value)
 {
     if (value >= median)
     {
         SigmaInterval interval = new SigmaInterval();
         interval.Bound2 = median;
         interval.Bound1 = median + sampling * sigma;
         interval.Name   = String.Format("+{0}σ", sampling);
         int samplingCounter = 1;
         while (!interval.Belongs(value))
         {
             if (!intervals.Any(i => i.Name == interval.Name))
             {
                 intervals.Add(new SigmaInterval(interval));
             }
             interval.Bound1 += sampling * sigma;
             interval.Bound2 += sampling * sigma;
             samplingCounter++;
             interval.Name = String.Format("+{0}σ",
                                           samplingCounter * sampling);
         }
         return(interval);
     }
     else if (value < median)
     {
         SigmaInterval interval = new SigmaInterval();
         interval.Bound1 = median;
         interval.Bound2 = median - sampling * sigma;
         interval.Name   = String.Format("-{0}σ", sampling);
         int samplingCounter = 1;
         while (!interval.Belongs(value))
         {
             if (!intervals.Any(i => i.Name == interval.Name))
             {
                 intervals.Add(new SigmaInterval(interval));
             }
             interval.Bound1 -= sampling * sigma;
             interval.Bound2 -= sampling * sigma;
             samplingCounter++;
             interval.Name = String.Format("-{0}σ",
                                           samplingCounter * sampling);
         }
         return(interval);
     }
     throw new Exception("Something is wrong");
 }
示例#3
0
        public IDictionary <string, long> Distribute()
        {
            IList <SigmaInterval> intervals = new List <SigmaInterval>();

            foreach (double value in source)
            {
                if (!intervals.Any(i => i.Belongs(value)))
                {
                    SigmaInterval interval = GenerateInterval(intervals, value);
                    interval.ValuesCount++;
                    intervals.Add(interval);
                }
                else
                {
                    intervals.First(i => i.Belongs(value)).ValuesCount++;
                }
            }
            return(GetDictionary(intervals.
                                 OrderBy(i => (i.Bound1 + i.Bound2) / 2).ToList()));
        }