示例#1
0
        public Probability GetProbability(MonthDay infoStart, MonthDay infoFinish, IEnumerable <int> years, int key, CountIdentity identity)
        {
            var intervals     = GetIntarvalsFor(infoStart, infoFinish, years).OrderBy(x => x.DateStart);
            var probabilities = new List <ProbabilityItem>();

            foreach (var year in years)
            {
                var    yearData     = GetYearData(intervals, infoStart, infoFinish, year);
                double top          = 0;
                double down         = 0;
                double max          = -10 ^ 6;
                double min          = 10 ^ 6;
                double sum          = 0;
                double periodResult = 0;
                foreach (var yearItem in yearData)
                {
                    var days = (yearItem.DateFinish.Day - yearItem.DateStart.Day) + 1;

                    top  += (days * yearItem.IntervalValue[key]);
                    down += days;

                    if (yearItem.IntervalValue[key] > max)
                    {
                        max = yearItem.IntervalValue[key];
                    }
                    if (yearItem.IntervalValue[key] < min)
                    {
                        min = yearItem.IntervalValue[key];
                    }
                    sum += yearItem.IntervalValue[key];
                }
                if (yearData.Any())
                {
                    if (identity == CountIdentity.Av)
                    {
                        periodResult = top / down;
                    }
                    else if (identity == CountIdentity.Sum)
                    {
                        periodResult = sum;
                    }
                    else if (identity == CountIdentity.Max)
                    {
                        periodResult = max;
                    }
                    else if (identity == CountIdentity.Min)
                    {
                        periodResult = min;
                    }

                    probabilities.Add(new ProbabilityItem(year, periodResult));
                }
            }

            var result = new Probability(infoStart, infoFinish, key);

            result.Probabilities = CountProbobilityValueInList(probabilities).ToList();

            return(result);
        }
示例#2
0
 public List <Interval> GetIntarvalsFor(MonthDay infoStart, MonthDay infoFinish, IEnumerable <int> years)
 {
     if (infoStart.Month > infoFinish.Month)
     {
         return(GetIntervalsForOutside(infoStart, infoFinish, years));
     }
     else
     {
         return(GetIntervalsForInside(infoStart, infoFinish, years));
     }
 }
示例#3
0
        private List <Interval> GetYearData(IEnumerable <Interval> intervals, MonthDay infoStart, MonthDay infoFinish, int year)
        {
            var targetYear = year;

            if (infoStart.Month > infoFinish.Month)
            {
                targetYear = year + 1;
            }

            return(intervals.Where(x =>
                                   x.DateStart >= new DateTime(year, infoStart.Month, infoStart.Day) &&
                                   x.DateFinish <= new DateTime(targetYear, infoFinish.Month, infoFinish.Day))
                   .ToList());
        }
示例#4
0
        public List <Probability> GetProbabilities(string riverName, MonthDay infoStart, MonthDay infoFinish, int key, CountIdentity identity)
        {
            List <Probability> result;
            var river = rivers.FirstOrDefault(x => x.Name == riverName);

            if (river == null)
            {
                return(null);
            }

            result = new List <Probability>();
            result.Add(river.GetProbability(infoStart, infoFinish, years, key, identity));

            return(result);
        }
示例#5
0
        private List <Interval> GetIntervalsForInside(MonthDay infoStart, MonthDay infoFinish, IEnumerable <int> years)
        {
            var resultInterval = new List <Interval>();

            foreach (var year in years)
            {
                //var temp = Intervals.Where(x =>
                //    x.DateStart.Year >= year &&
                //    x.DateStart.Month >= infoStart.Month &&
                //    x.DateStart.Day >= infoStart.Day &&
                //    x.DateFinish.Year <= year &&
                //    x.DateFinish.Month <= infoFinish.Month &&
                //    x.DateFinish.Day <= infoFinish.Day);

                var temp = Intervals.Where(x =>
                                           x.DateStart >= new DateTime(year, infoStart.Month, infoStart.Day) &&
                                           x.DateFinish <= new DateTime(year, infoFinish.Month, infoFinish.Day));

                if (temp.Any())
                {
                    resultInterval.AddRange(temp);
                }
            }

            //var restrictBottom = Intervals.Where(x =>
            //    x.DateStart.Month >= infoStart.Month &&
            //    x.DateStart.Day >= infoStart.Day)
            //.ToDictionary(p => p.DateStart);

            //var restrictUp = Intervals.Where(x =>
            //    x.DateFinish.Month <= infoFinish.Month &&
            //    x.DateFinish.Day <= infoFinish.Day)
            //.ToDictionary(p => p.DateStart);

            //var restrictBottomKeys = restrictBottom.Keys.ToList();
            //var restrictUpKeys = restrictUp.Keys.ToList();
            //var allKeys = restrictBottomKeys.Union(restrictUpKeys).Distinct();

            //foreach (var idx in allKeys)
            //{
            //    restrictBottom.TryGetValue(idx, out var bottom);
            //    restrictUp.TryGetValue(idx, out var up);
            //    if (bottom != null && up != null)
            //    {
            //        resultInterval.Add(bottom);
            //    }
            //}
            return(resultInterval);


            //var unionList = restrictBottom.Union(restrictUp).ToList();

            //return restrictBottom.Union(restrictUp).Distinct().ToList();

            //var intervals = Intervals.Where(x =>
            //    x.DateStart.Month >= infoStart.Month &&
            //    x.DateStart.Day >= infoStart.Day &&
            //    x.DateFinish.Month <= infoFinish.Month &&
            //    x.DateFinish.Day <= infoFinish.Day)
            //.ToList();

            //return intervals;
        }
示例#6
0
 private List <Interval> GetIntervalsForOutside(MonthDay infoStart, MonthDay infoFinish, IEnumerable <int> years)
 {
     return(GetIntervalsForInside(infoStart, new MonthDay(12, 31), years)
            .Concat(GetIntervalsForInside(new MonthDay(1, 1), infoFinish, years))
            .ToList());
 }
示例#7
0
 public Probability(MonthDay _monthDayStart, MonthDay _monthDayFinish, int key)
 {
     monthDayStart  = _monthDayStart;
     monthDayFinish = _monthDayFinish;
     Init(key);
 }