public ITrajectory eval(ITrajectoryBundle tb)
        {
            SortedList <double, double> alltimes = tb.Times;

            ITrajectory mean = new Trajectory(tb.Name + SUFFIX, tb.TemporalGranularityThreshold, 0.0, 0.0);

            foreach (double t in alltimes.Keys)
            {
                double val = 0.0;
                double ct  = 0.0;
                foreach (ITrajectory traj in tb.Trajectories)
                {
                    val += traj.eval(t);
                    ct  += 1.0;
                }
                mean.add(t, val / ct);
            }
            return(mean);
        }
        public ITrajectory eval(ITrajectoryBundle tb)
        {
            ITrajectory mean = tb.MeanTrajectory;

            SortedList <double, double> alltimes = tb.Times;
            ITrajectory std = new Trajectory(tb.Name + SUFFIX, tb.TemporalGranularityThreshold, 0.0, 0.0);

            foreach (double t in alltimes.Keys)
            {
                double val = 0.0;
                double ct  = 0.0;
                foreach (ITrajectory traj in tb.Trajectories)
                {
                    double y    = traj.eval(t);
                    double ybar = mean.eval(t);
                    val += (y - ybar) * (y - ybar);
                    ct  += 1.0;
                }
                std.add(t, Math.Sqrt(val / ct));
            }
            return(std);
        }
Exemple #3
0
        public ITrajectory eval(ITrajectory orig)
        {
            double finish = orig.MaximumTime;
            // double start = orig.MinimumTime;

            ITrajectory Hurst = new Trajectory(orig.Name + "-Hurst(" + _timeWindow + "," + _timeStep + ")", 0.0, 0.0, 0.0);

            /*
             * for (double t = start; t <= finish; t+= _timeStep) {
             *      double exponent = ComputeHurstExponent(t, orig);
             *      if ( ! Double.IsNaN (exponent)) {
             *              Hurst.add(t, exponent);
             *      }
             * }
             */

            double exponent = ComputeHurstExponent(finish, orig);

            SingletonLogger.Instance().InfoLog(typeof(TrajectoryTransformer_Hurst), "Hurst exponent: " + exponent);

            return(Hurst);
        }
Exemple #4
0
        public ITrajectory eval(ITrajectoryBundle tb)
        {
            SortedList <double, double> alltimes = tb.Times;

            ITrajectory avesep = new Trajectory(tb.Name + SUFFIX, tb.TemporalGranularityThreshold, 0.0, 0.0);

            foreach (double t in alltimes.Keys)
            {
                double val = 0.0;
                double ct  = 0.0;

                foreach (ITrajectory traj1 in tb.Trajectories)
                {
                    if (traj1.Times.Count == 0)
                    {
                        continue;
                    }

                    foreach (ITrajectory traj2 in tb.Trajectories)
                    {
                        if (traj1 == traj2)
                        {
                            continue;
                        }
                        if (traj2.Times.Count == 0)
                        {
                            continue;
                        }

                        val += Math.Abs(traj1.eval(t) - traj2.eval(t));
                        ct  += 1.0;
                    }
                }
                avesep.add(t, val / ct);
            }
            return(avesep);
        }
Exemple #5
0
        private double ComputeHurstExponent(double timeOfInterest, ITrajectory orig)
        {
            double finish = timeOfInterest;
            double start  = Math.Max(finish - _timeWindow, orig.MinimumTime);

            int n = 0;

            for (double t = start; t <= finish; t += _timeStep)
            {
                n++;
            }

            if (n < 1)
            {
                SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "n<1");
                return(Double.NaN);
            }

            int numpoints = 0;
            int t2count   = INITIAL_T2COUNT;

            while (t2count < n)
            {
                numpoints++;
                t2count = (int)((double)t2count * EXPSCALE);
            }
            if (numpoints < MIN_REG_POINTS)
            {
                SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "numpoints = " + numpoints);
                return(Double.NaN);
            }



            ITrajectory X      = new Trajectory("X", 0.0, 0.0, 0.0);
            double      sigmaX = 0.0;

            n = 0;
            for (double t = start; t <= finish; t += _timeStep)
            {
                double Xt = orig.eval(t);
                X.add(t, Xt);
                sigmaX += Xt;
                n++;
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "X:" + X.ToStringLong());

            if (n == 0)
            {
                throw new Exception("Divide by n=0");
            }
            double m = sigmaX / (double)n;

            ITrajectory Y = new Trajectory("Y", 0.0, 0.0, 0.0);

            foreach (double t in X.Times)
            {
                Y.add(t, X.eval(t) - m);
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "Y:" + Y.ToStringLong());

            ITrajectory Z      = new Trajectory("Z", 0.0, 0.0, 0.0);
            double      sigmaY = 0.0;

            foreach (double t in Y.Times)
            {
                sigmaY += Y.eval(t);
                Z.add(t, sigmaY);
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "Z:" + Z.ToStringLong());

            ITrajectory R    = new Trajectory("R", 0.0, 0.0, 0.0);
            double      Zmax = Double.MinValue;
            double      Zmin = Double.MaxValue;

            foreach (double t in Z.Times)
            {
                double Zt = Z.eval(t);
                Zmax = Math.Max(Zmax, Zt);
                Zmin = Math.Min(Zmin, Zt);
                R.add(t, Zmax - Zmin);
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "R:" + R.ToStringLong());

            ITrajectory U = new Trajectory("U", 0.0, 0.0, 0.0);

            sigmaX = 0.0;
            int tcounter = 0;

            foreach (double t in X.Times)
            {
                sigmaX += X.eval(t);
                tcounter++;
                U.add(t, sigmaX / (double)tcounter);
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "U:" + U.ToStringLong());

            ITrajectory S           = new Trajectory("S", 0.0, 0.0, 0.0);
            double      sigmaDevXU2 = 0.0;

            tcounter = 0;
            foreach (double t in X.Times)
            {
                double DevXU = (X.eval(t) - U.eval(t));
                sigmaDevXU2 += (DevXU * DevXU);
                tcounter++;
                S.add(t, Math.Sqrt(sigmaDevXU2 / (double)tcounter));
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "S:" + S.ToStringLong());

            double EPSI = 0.00001;

            ITrajectory RoverS = new Trajectory("R/S", 0.0, 0.0, 0.0);

            foreach (double t in R.Times)
            {
                double St = S.eval(t);
                double Rt = R.eval(t);
                if (St < EPSI)
                {
                    if (Rt < EPSI)
                    {
                        RoverS.add(t, 0.0);
                    }
                    else
                    {
                        // throw new Exception("Divide Rt!=0 by St=0");
                    }
                }
                else
                {
                    RoverS.add(t, Rt / St);
                    SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "At t=" + t + ", R=" + Rt + " and S=" + St + " hence R/S=" + Rt / St);
                }
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "xxx R/S:" + RoverS.ToStringLong());

            double[] xvalues = new double[n];
            double[] yvalues = new double[n];

            for (int point = 0; point < n; point++)
            {
                double t = start + (point * _timeStep);
                xvalues[point] = (double)point + 1.0;
                yvalues[point] = RoverS.eval(t);
                SingletonLogger.Instance().InfoLog(typeof(TrajectoryTransformer_Hurst), "t=" + xvalues[point] + " RS=" + yvalues[point]);
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "EXPONENTIALIZED");

            double[] xvaluesAve = new double[n];
            double[] yvaluesAve = new double[n];
            int      cutoff     = INITIAL_T2COUNT;
            double   sumX       = 0.0;
            double   sumY       = 0.0;
            int      averaged   = 0;
            int      bins       = 0;

            for (int point = cutoff; point < n; point++)
            {
                if (xvalues[point] == 0.0)
                {
                    SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "Skipping t=" + xvalues[point] + " RS=" + yvalues[point]);
                    continue;
                }

                if (yvalues[point] == 0.0)
                {
                    SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "Skipping t=" + xvalues[point] + " RS=" + yvalues[point]);
                    continue;
                }

                sumX += xvalues[point];
                sumY += yvalues[point];
                averaged++;

                if (point == cutoff)
                {
                    xvaluesAve[bins] = sumX / (double)averaged;
                    yvaluesAve[bins] = sumY / (double)averaged;

                    SingletonLogger.Instance().InfoLog(typeof(TrajectoryTransformer_Hurst), "_t=" + xvaluesAve[bins] + " _RS=" + yvaluesAve[bins]);

                    cutoff   = (int)((double)cutoff * EXPSCALE);
                    sumX     = 0.0;
                    sumY     = 0.0;
                    averaged = 0;
                    bins++;
                }
            }

            SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "LOGGED");

            double[] xvaluesLog = new double[bins];
            double[] yvaluesLog = new double[bins];
            t2count = INITIAL_T2COUNT;

            for (int point = 0; point < bins; point++)
            {
                if (xvaluesAve[point] == 0.0)
                {
                    SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "Skipping t=" + xvaluesAve[point] + " RS=" + yvaluesAve[point]);
                    continue;
                }
                xvaluesLog[point] = Math.Log(xvaluesAve[point]) / LOG2;

                if (yvaluesAve[point] == 0.0)
                {
                    SingletonLogger.Instance().DebugLog(typeof(TrajectoryTransformer_Hurst), "Skipping t=" + xvaluesAve[point] + " RS=" + yvaluesAve[point]);
                    continue;
                }
                yvaluesLog[point] = Math.Log(yvaluesAve[point]) / LOG2;

                SingletonLogger.Instance().InfoLog(typeof(TrajectoryTransformer_Hurst), "logt=" + xvaluesLog[point] + " logRS=" + yvaluesLog[point]);
            }

            double slope, yintercept;

            DoLinearRegression(xvaluesLog, yvaluesLog, out slope, out yintercept);

            return(slope);
        }