Example #1
0
        public static Pine operator /(double number, Pine pine)
        {
            Pine ret = new Pine();

            foreach (double num in pine)
            {
                ret.Add(number / num);
            }
            return(ret);
        }
Example #2
0
        public static Pine operator -(Pine pine, double number)
        {
            Pine ret = new Pine();

            foreach (double num in pine)
            {
                ret.Add(num - number);
            }
            return(ret);
        }
        public static Pine ToPine(this IEnumerable <double> source)
        {
            Pine ret = new Pine();

            foreach (double num in source)
            {
                ret.Add(num);
            }
            return(ret);
        }
Example #4
0
        public static Pine BarsSince(PineBool source)
        {
            Pine   ret   = new Pine();
            double count = 0;

            foreach (bool x in source)
            {
                if (x)
                {
                    count++;
                }
                else
                {
                    count = 0;
                }
                ret.Add(count);
            }
            return(ret);
        }
Example #5
0
        //public static Pine BarsSince(PineBool source)
        //{
        //    Pine ret = new Pine();

        //        foreach (bool x in source)
        //    {
        //        if (x)
        //            count++;
        //         else if()

        //        else
        //            count = 0;
        //        ret.Add(count);
        //    }
        //    return ret;

        //}


        public static Pine BarsSince(PineBool source)
        {
            Pine   buf   = new Pine();
            double count = 0;

            for (int i = 0; i < source.Count; i++)
            {
                if (source[i])
                {
                    count = 1;
                }
                else if (i > 0 && !source[i] && buf.ElementAt(i - 1) > 0)
                {
                    count++;
                }
                else
                {
                    count = 0;
                }
                buf.Add(count);
            }
            buf.Reverse();
            return(buf);
        }
        public static Pine ToPine(this IEnumerable <double?> source, Approximation approximation = Approximation.Linear)
        {
            switch (approximation)
            {
            case Approximation.Linear: return(LinearApproximation());

            case Approximation.Step: return(StepApproximation());

            default: return(null);
            }

            Pine LinearApproximation()
            {
                int countNum = source.Count(x => x != null); // количество имеющих значение в последовательности

                if (countNum == 0)
                {
                    return(Enumerable.Range(0, source.Count()).Select(x => 0.0).ToPine());
                }
                if (countNum == 1)
                {
                    double _value = source.First(x => x != null).Value;
                    return(Enumerable.Range(0, source.Count()).Select(x => _value).ToPine());
                }

                Pine   ret = new Pine();                                       // возвращаемый массив
                double value1 = 0, value2 = 0, delta = 0;                      // последние значащие и приращение на каждый шаг
                IEnumerable <double?> sour = source.SkipWhile(x => x == null); // текущее состояние последовательности = source.SkipWhile(x => x == null); // пропуск первых не значащих
                int numberCurr;                                                // номер обрабатываемого значения
                int countNull;                                                 // количество незначащих значений в следующем промежутке

                for
                (
                    numberCurr = 1; // номер обрабатываемого значения
                    numberCurr < countNum;
                    sour = sour.SkipWhile(x => x == null), numberCurr++
                )
                {
                    value1 = sour.First().Value; // первое значащае число
                    ret.Add(value1);
                    sour      = sour.Skip(1);
                    value2    = sour.First(x => x != null).Value;       // второе значащае число
                    countNull = sour.TakeWhile(x => x == null).Count(); // количество не имеющих значения между первым и вторым числом
                    delta     = (value2 - value1) / (countNull + 1);    // приращение на каждый шаг
                    for (int ind = 0; ind < countNull; ind++)
                    {
                        ret.Add(value1 += delta); // заполнение последовательности
                    }
                }

                // обработка конца последовательности
                ret.Add(value2);
                sour      = sour.Skip(1);
                countNull = sour.Count(); // количество последних не имеющих значения
                for (int ind = 0; ind < countNull; ind++)
                {
                    ret.Add(value2 += delta); // заполнение последовательности
                }
                return(ret);
            }

            Pine StepApproximation()
            {
                int countNum = source.Count(x => x != null); // количество имеющих значение в последовательности

                if (countNum == 0)
                {
                    return(Enumerable.Range(0, source.Count()).Select(x => 0.0).ToPine());
                }
                if (countNum == 1)
                {
                    double _value = source.First(x => x != null).Value;
                    return(Enumerable.Range(0, source.Count()).Select(x => _value).ToPine());
                }

                Pine   ret = new Pine();                                       // возвращаемый массив
                double value1 = 0, value2 = 0;                                 // последние значащие и приращение на каждый шаг
                IEnumerable <double?> sour = source.SkipWhile(x => x == null); // текущее состояние последовательности = source.SkipWhile(x => x == null); // пропуск первых не значащих
                int numberCurr;                                                // номер обрабатываемого значения
                int countNull;                                                 // количество незначащих значений в следующем промежутке

                for
                (
                    numberCurr = 1; // номер обрабатываемого значения
                    numberCurr < countNum;
                    sour = sour.SkipWhile(x => x == null), numberCurr++
                )
                {
                    value1 = sour.First().Value; // первое значащае число
                    ret.Add(value1);
                    sour      = sour.Skip(1);
                    value2    = sour.First(x => x != null).Value;       // второе значащае число
                    countNull = sour.TakeWhile(x => x == null).Count(); // количество не имеющих значения между первым и вторым числом
                    for (int ind = 0; ind < countNull; ind++)
                    {
                        ret.Add(value1); // заполнение последовательности
                    }
                }

                // обработка конца последовательности
                ret.Add(value2);
                sour      = sour.Skip(1);
                countNull = sour.Count(); // количество последних не имеющих значения
                for (int ind = 0; ind < countNull; ind++)
                {
                    ret.Add(value2); // заполнение последовательности
                }
                return(ret);
            }
        }