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)); }
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); } }
//Добавка мгновенного значения в список или клон //Возвращает количество реально добавленных значений internal override int AddMom(DateTime time, MomErr err) { if (!CheckMomTime(time, err)) { return(0); } MomList.AddMom(BufMom); return(1); }
//Агрегация по равномерным сегментам //На входе функция с параметрами: текущий результат, список и обрабатываемый номер 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); } }
//Добавляет значение среза на начало периода в список, возвращает 1, если срез был получен, иначе 0 internal override int MakeBegin() { if (!HasBegin) { return(0); } MomList.AddMom(_beginMom); return(1); }
//Очистка списка значений internal override void ClearMoments() { MomList.Clear(); _endMom.Time = Static.MinDate; if (Connect.Provider == null || Connect.PeriodBegin != Connect.Provider.PrevProcessEnd) { _beginMom.Time = Static.MinDate; } }
//Взятие бита, 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)); } }
//Взятие битов и сложение по 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)); } }
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 })); }
//Добавка мгновенного значения в список или клон //Возвращает количество реально добавленных значений 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); }
//Вычисление значения функции 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); }
private void LastScalar(EditMom res, MomList mlist, int i, DateTime t) { res.CopyValueFrom(mlist, i); res.Error = mlist.ErrorI(i); }
private void FirstScalar(EditMom res, MomList mlist, int i, DateTime t) { }
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; }