Beispiel #1
0
 private void AddUniformMom(IReadMean fromList, MomList toList, int i, DateTime t)
 {
     if (i < fromList.Count && fromList.TimeI(i) == t)
     {
         return;
     }
     toList.AddMom(fromList.ToMomI(i == 0 ? 0 : i - 1, t));
 }
Beispiel #2
0
 private void MaxScalar(EditMom res, MomList mlist, int i, DateTime t)
 {
     if (res.ValueLess(mlist.MeanI(i)))
     {
         res.CopyValueFrom(mlist, i);
         res.Error = mlist.ErrorI(i);
     }
 }
Beispiel #3
0
 //Добавка мгновенного значения в список или клон
 //Возвращает количество реально добавленных значений
 internal override int AddMom(DateTime time, MomErr err)
 {
     if (!CheckMomTime(time, err))
     {
         return(0);
     }
     MomList.AddMom(BufMom);
     return(1);
 }
Beispiel #4
0
        //Агрегация по равномерным сегментам
        //На входе функция с параметрами: текущий результат, список и обрабатываемый номер
        private void Agregate(Action <EditMom, MomList, int, DateTime> fun)
        {
            double seglen = _pars[0].Real, segshift = _pars.Length < 2 ? 0 : _pars[1].Real * seglen;
            var    moms = _initialSignal.OutValue;

            if (moms.Count == 0)
            {
                return;
            }
            var mlist = MFactory.NewList(DataType);
            //Добавляем в список границы сегментов
            var t = Connect.PeriodBegin;
            int i = 0;

            while (t < Connect.PeriodEnd.AddMilliseconds(1))
            {
                while (i < moms.Count && moms.TimeI(i) < t)
                {
                    if (moms.TimeI(i) >= Connect.PeriodBegin && moms.TimeI(i) <= Connect.PeriodEnd)
                    {
                        mlist.AddMom(moms.ToMomI(i));
                    }
                    i++;
                }
                AddUniformMom(moms, mlist, i, t);
                t = t.AddSeconds(seglen);
            }
            if (i < moms.Count && moms.TimeI(i) == Connect.PeriodEnd)
            {
                mlist.AddMom(moms.ToMomI(i));
            }

            t = Connect.PeriodBegin;
            i = 0;
            while (t < Connect.PeriodEnd.AddMilliseconds(-1))
            {
                var me = new EditMom(DataType, t.AddSeconds(segshift));
                if (fun.Method.Name == "AverageScalar")
                {
                    me.Real = 0;
                }
                else
                {
                    me.CopyValueFrom(mlist, i);
                }
                t = t.AddSeconds(seglen);
                while (i < mlist.Count && mlist.TimeI(i) <= t)
                {
                    fun(me, mlist, i++, t);
                }
                if (i > 0 && mlist.TimeI(i - 1) == t)
                {
                    i--;
                }
                MomList.AddMom(me);
            }
        }
Beispiel #5
0
 //Добавляет значение среза на начало периода в список, возвращает 1, если срез был получен, иначе 0
 internal override int MakeBegin()
 {
     if (!HasBegin)
     {
         return(0);
     }
     MomList.AddMom(_beginMom);
     return(1);
 }
Beispiel #6
0
 //Очистка списка значений
 internal override void ClearMoments()
 {
     MomList.Clear();
     _endMom.Time = Static.MinDate;
     if (Connect.Provider == null || Connect.PeriodBegin != Connect.Provider.PrevProcessEnd)
     {
         _beginMom.Time = Static.MinDate;
     }
 }
Beispiel #7
0
        //Взятие бита, pars[0] - номер бита
        public void Bit()
        {
            int bit  = _pars[0].Integer;
            var moms = _initialSignal.OutValue;

            for (int i = 0; i < moms.Count; i++)
            {
                MomList.AddMom(moms.TimeI(i), moms.IntegerI(i).GetBit(bit), moms.ErrorI(i));
            }
        }
Beispiel #8
0
        //Взятие битов и сложение по Or, pars - номера битов
        public void BitOr()
        {
            var moms = _initialSignal.OutValue;

            for (int i = 0; i < moms.Count; i++)
            {
                var  v   = moms.IntegerI(i);
                bool res = false;
                foreach (var par in _pars)
                {
                    res |= v.GetBit(par.Integer);
                }
                MomList.AddMom(moms.TimeI(i), res, moms.ErrorI(i));
            }
        }
Beispiel #9
0
        public ISingleVal UniformPoints(ISingleVal[] par)
        {
            double   len    = ((Mom)par[1]).Real;
            double   shift  = ((Mom)par[2]).Real;
            var      points = new MomList(DataType.Value);
            DateTime t      = Thread.PeriodBegin.AddSeconds(len * shift);

            while (t < Thread.PeriodEnd)
            {
                points.AddMomValue(t);
                t = t.AddSeconds(len);
            }
            //_valueAtPointsFun = new FunComplexScalar();
            _valueAtPointsFun.MomCalculate = _valueAtPointsFun.ValueAtPoints;
            return(_valueAtPointsFun.CalculateSingle(new[] { par[0], points }));
        }
Beispiel #10
0
 //Добавка мгновенного значения в список или клон
 //Возвращает количество реально добавленных значений
 internal override int AddMom(DateTime time, MomErr err)
 {
     BufMom.Time  = time;
     BufMom.Error = err;
     if (time <= Connect.PeriodBegin)
     {
         if (_beginMom.Time <= time)
         {
             _beginMom.CopyAllFrom(BufMom);
         }
     }
     else if (time <= Connect.PeriodEnd)
     {
         if (_endMom.Time <= time)
         {
             _endMom.CopyAllFrom(BufMom);
         }
         MomList.AddMom(BufMom);
         return(1);
     }
     return(0);
 }
Beispiel #11
0
        //Вычисление значения функции
        public override ISingleVal CalculateSingle(ISingleVal[] par)
        {
            var mpar = new IMom[par.Length];
            var cpar = new bool[par.Length];

            for (int i = 0; i < par.Length; i++)
            {
                cpar[i] = false;
            }

            var  lists = new List <MList>();
            bool isMom = true;

            for (int i = 0; i < par.Length; i++)
            {
                var mom = par[i] as Mom;
                if (mom != null)
                {
                    mpar[i] = mom;
                }
                else
                {
                    isMom = false;
                    var moms = ((MomList)par[i]).Moments;
                    if (moms.Count == 0 && this is ScalarFunction)
                    {
                        return(new MomList(DataType));
                    }
                    lists.Add(new MList(moms, i));
                }
            }
            if (isMom)//Одно значение
            {
                var mres = new MomEdit(DataType, MaxError(mpar));
                MomCalculate(mpar, cpar, mres);
                return(mres.ToMom());
            }
            //Список значений
            var  rlist = new MomList(DataType);
            bool e     = true;

            while (e)
            {
                e = false;
                DateTime ctime = Different.MaxDate;
                foreach (var list in lists)
                {
                    if (list.NextTime < ctime)
                    {
                        ctime = list.NextTime;
                    }
                }
                if (ctime < Different.MaxDate)
                {
                    e = true;
                    for (int i = 0; i < cpar.Length; i++)
                    {
                        cpar[i] = false;
                    }
                    foreach (var list in lists)
                    {
                        if (list.NextTime == ctime)
                        {
                            list.Pos++;
                            cpar[list.Num] = true;
                        }
                        mpar[list.Num] = ((MomList)par[list.Num]).Interpolation(CalcParam.Interpolation, list.Pos, ctime);
                    }
                    var temp = new MomEdit(DataType, ctime, MinError(mpar));
                    if (MomCalculate(mpar, cpar, temp))
                    {
                        rlist.AddMomClone(temp);
                    }
                }
            }
            return(rlist);
        }
Beispiel #12
0
 private void LastScalar(EditMom res, MomList mlist, int i, DateTime t)
 {
     res.CopyValueFrom(mlist, i);
     res.Error = mlist.ErrorI(i);
 }
Beispiel #13
0
 private void FirstScalar(EditMom res, MomList mlist, int i, DateTime t)
 {
 }
Beispiel #14
0
        private void AverageScalar(EditMom res, MomList mlist, int i, DateTime t)
        {
            DateTime time = (i >= mlist.Count - 1 || mlist.TimeI(i + 1) > t) ? t : mlist.TimeI(i + 1);

            res.Real += mlist.RealI(i) * (time.Subtract(mlist.TimeI(i)).TotalSeconds) / _pars[0].Real;
        }