public static OLSResult OLS(PieceConstIntensityResult res)
        {
            int index = 0;

            List <double> ts = res.Results.Select(x => (x.ConfInterval.Left + x.ConfInterval.Right) / 2).ToList();

            List <ParamEstimation> parameters = new List <ParamEstimation>();
            Func <double, List <ParamEstimation>, double> f = (t, ps) => ps[0].Value + ps[1].Value * t + ps[2].Value * t * t;

            double        _t        = ts.Average();
            double        _t2       = ts.Average(x => x * x);
            double        _t3       = ts.Average(x => x * x * x);
            double        _t4       = ts.Average(x => x * x * x * x);
            double        _l        = res.Results.Average(x => x.ConfInterval.Value);
            var           qts       = res.Results.Zip(ts, (x, t) => new { Index = t, Value = x.ConfInterval.Value });
            double        _lt       = qts.Average(x => x.Index * x.Value);
            double        _lt2      = qts.Average(x => x.Index * x.Index * x.Value);
            List <double> numParams = SlauSolver.Solve(new List <double[]>
            {
                new double[] { 1, _t, _t2 },
                new double[] { _t, _t2, _t3 },
                new double[] { _t2, _t3, _t4 }
            }, new List <double> {
                _l, _lt, _lt2
            });

            parameters.Add(new ParamEstimation("A", numParams[0]));
            parameters.Add(new ParamEstimation("B", numParams[1]));
            parameters.Add(new ParamEstimation("C", numParams[2]));

            return(new OLSResult(parameters, f));
        }
        public static ProbPieceConstIntensityResult ProbPieceIntensity(PieceConstIntensityResult res)
        {
            int i = 0, cls = 0;
            List <ProbPieceConstIntensityClassResult> newlst = new List <ProbPieceConstIntensityClassResult>();

            while (i < res.Results.Count)
            {
                cls++;
                List <PieceConstIntensityClassResult> lst = new List <PieceConstIntensityClassResult>();
                lst.Add(res.Results[i]);
                if (i + 1 == res.Results.Count)
                {
                    newlst.Add(new ProbPieceConstIntensityClassResult(lst, cls, res.Results[i].ConfInterval.Value));
                    break;
                }

                int    nextNs = res.Results[i].Number;
                double nextL  = res.Results[i].ConfInterval.Value;
                do
                {
                    int        _ns = nextNs, ns = res.Results[i + 1].Number;
                    double     _l = nextL, l = res.Results[i + 1].ConfInterval.Value;
                    double     t = (l - _l) / Math.Sqrt((_ns - 1) * l * l + (ns - 1) * _l * _l) * Math.Sqrt((ns * _ns * (ns + _ns - 2)) / (ns + _ns));
                    Hypothesis h = Hypothesis.Student(t, ns + _ns - 2);
                    if (h.IsAccepted)
                    {
                        nextNs += ns;
                        nextL   = (ns * l + _ns * _l) / (ns + _ns);
                        lst.Add(res.Results[i + 1]);
                        i++;
                    }
                    if (!h.IsAccepted || i + 1 == res.Results.Count)
                    {
                        lst.ForEach(x => x.ConfInterval.ChangeValue(nextL));
                        newlst.Add(new ProbPieceConstIntensityClassResult(lst, cls, nextL));
                        i++;
                        break;
                    }
                } while (true);
            }

            return(new ProbPieceConstIntensityResult(newlst));
        }