Пример #1
0
        public override void Compute(MSSInput input, out MSSOutput output)
        {
            output = new MSSOutput(input);
            var checker = new ShortcutChecker(input, output);

            output.Shortcuts = ShortcutSetBuilder.FindShortcuts(checker, true);
        }
Пример #2
0
        public override IShortcutSet GetShortcuts(int level, double epsilon)
        {
            var input = new MSSInput(Input.Trajectory, new List <double> {
                epsilon
            })
            {
                PrunedPoints    = prunedPoints,
                SearchIntervals = searchIntervals
            };

            MSSOutput output;

            Algorithm.Compute(input, out output);

            var shortcuts = output.GetShortcuts(1);

            if (Cumulative)
            {
                if (prunedShortcuts != null)
                {
                    shortcuts.Except(prunedShortcuts);
                    prunedShortcuts.Union(shortcuts);
                }
                else
                {
                    prunedShortcuts = shortcuts;
                }
            }

            //Output.LogLine(output.LogString);
            Output.LogObject("Number of shortcuts found on level " + level, shortcuts.Count);

            return(shortcuts);
        }
        public MSSimpleShortcutSet(MSSInput input, ShortcutSetFactory shortcutSetFactory)
        {
            ShortcutSetFactory = shortcutSetFactory;
            Shortcuts          = new Dictionary <int, IShortcutSet>();

            for (var level = 1; level <= input.NumLevels; level++)
            {
                Shortcuts[level] = shortcutSetFactory.Create(input.Trajectory);
            }
        }
Пример #4
0
        public MSCompactShortcutSet(MSSInput input, ShortcutSetFactory shortcutSetFactory)
        {
            ShortcutSetFactory = shortcutSetFactory;
            Input       = input;
            LevelCounts = new JDictionary <int, int>();
            MinLevels   = new JDictionary <Shortcut, int>();

            for (var level = 1; level <= input.NumLevels; level++)
            {
                LevelCounts.Add(level, 0);
            }
        }
Пример #5
0
        public override void Init(MSInput inp, MSOutput outp, bool cumulative)
        {
            base.Init(inp, outp, cumulative);

            var algorithmInput = new MSSInput(inp.Trajectory, inp.Epsilons)
            {
                Cumulative = cumulative
            };

            algorithm.Compute(algorithmInput, out algorithmOutput);

            //Output.LogLine(algorithmOutput.LogString);
        }
        private async void computeErrorDistribution_Click(object sender, EventArgs e)
        {
            var trajectory = input.Trajectory;

            var builder = new MSSCompleteCompactError
            {
                ShortcutSetFactory = new ShortcutIntervalSetFactory()
            };

            var inp = new MSSInput(trajectory, new List <double> {
                0.0
            });
            var outp = new MSSOutput(inp);

            outp.Logged += str =>
            {
                this.InvokeIfRequired(() =>
                {
                    str = shortcutFindingProgressLabel.Text = str;
                });
            };

            await Task.Run(() =>
            {
                this.InvokeIfRequired(() => shortcutFindingProgressLabel.Text = "Started...");

                var errors = (MSCompactErrorShortcutSet)builder.FindShortcuts(new MSSConvexHull.ShortcutChecker(inp, outp), true);
                maxErrors  = errors.MaxErrors.Values.ToList();

                this.InvokeIfRequired(() => shortcutFindingProgressLabel.Text = "Sorting...");

                maxErrors.Sort();
            });

            shortcutFindingProgressLabel.Text = "Finished";

            string illegalChars        = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
            Regex  illegalCharsRegex   = new Regex(string.Format("[{0}]", Regex.Escape(illegalChars)));
            string santitizedInputName = illegalCharsRegex.Replace(input.Name, "");

            string fileName = "Error list - " + santitizedInputName + ".json";

            using (StreamWriter file = File.CreateText(fileName))
                using (JsonTextWriter textWriter = new JsonTextWriter(file))
                {
                    var serializer = JsonSerializer.Create(new JsonSerializerSettings());
                    serializer.Serialize(textWriter, maxErrors);
                }

            BuildErrorDistribution();
        }
        private async void computeShortcutsButton_Click(object sender, System.EventArgs e)
        {
            var epsilon = (double)errorUpDown.Value;

            var inp = new MSSInput
            {
                Trajectory = input.Trajectory,
                Epsilons   = new List <double> {
                    epsilon
                }
            };

            var outp = new MSSOutput(inp);

            var builder = new MSCompleteSimple
            {
                ShortcutSetFactory = (ShortcutSetFactory)shortcutSetFactoryComboBox.SelectedItem
            };

            var checker = new MSSChinChan.ShortcutChecker(inp, outp);

            outp.Logged += str =>
            {
                this.InvokeIfRequired(() =>
                {
                    shortcutFindingProgressLabel.Text = str;
                });
            };

            await Task.Run(() =>
            {
                outp.LogLine("Started...");
                var shortcutSet   = (MSSimpleShortcutSet)builder.FindShortcuts(checker, true);
                input.ShortcutSet = shortcutSet.ExtractShortcuts(1);
            });

            if (input.ShortcutSet is ShortcutIntervalSet)
            {
                var intervalSet = (ShortcutIntervalSet)input.ShortcutSet;
                shortcutFindingProgressLabel.Text = "Shortcuts: " + intervalSet.Count + " Intervals: " + intervalSet.IntervalCount;
            }
            else if (input.ShortcutSet is ShortcutGraph)
            {
                shortcutFindingProgressLabel.Text = "Shortcuts: " + input.ShortcutSet.Count;
            }

            UpdateSourceAndTarget();
        }
        public override void Compute(MSInput input, out MSOutput output)
        {
            output = new MSOutput();
            var trajectory = input.Trajectory;

            ShortcutProvider.Init(input, output, false);

            var onDemandShortcutProvider = (ShortcutsOnDemand)ShortcutProvider;
            var prevTrajectory           = trajectory;

            for (var level = 1; level <= input.NumLevels; level++)
            {
                var epsilon = input.GetEpsilon(level);

                var shortcutAlgo  = onDemandShortcutProvider.Algorithm;
                var shortcutInput = new MSSInput(prevTrajectory, new List <double> {
                    epsilon
                });
                MSSOutput shortcutOutput;

                shortcutAlgo.Compute(shortcutInput, out shortcutOutput);
                var levelShortcuts = shortcutOutput.GetShortcuts(1);

                output.LogObject("Number of shortcuts found on level " + level, levelShortcuts.Count);

                var levelShortestPath = ShortestPathProvider.FindShortestPath(levelShortcuts, prevTrajectory.First(), prevTrajectory.Last()).Points;
                levelShortestPath.AddFirst(prevTrajectory.First());

                //O(n)
                var levelTrajectory = new Trajectory2D(levelShortestPath);

                //report level trajectory
                output.SetTrajectoryAtLevel(level, levelTrajectory);

                prevTrajectory = levelTrajectory;
            }
        }
Пример #9
0
 public ShortcutChecker(MSSInput input, MSSOutput output) : base(input, output)
 {
 }
Пример #10
0
 public MSCompactErrorShortcutSet(MSSInput input, ShortcutSetFactory shortcutSetFactory)
 {
     ShortcutSetFactory = shortcutSetFactory;
     Input     = input;
     MaxErrors = new JDictionary <Shortcut, double>();
 }
Пример #11
0
        public override void Compute(MSSInput input, out MSSOutput output)
        {
            output = new MSSOutput(input);
            var trajectory = input.Trajectory;
            var errors     = new double[trajectory.Count - 2][];

            for (var i = 0; i < trajectory.Count - 2; i++)
            {
                errors[i] = new double[trajectory.Count - i - 1];
                var pointI = trajectory[i];
                var hull   = new EnhancedConvexHull(pointI);

                for (var j = i + 1; j < trajectory.Count; j++)
                {
                    var pointJ = trajectory[j];

                    hull.Insert(pointJ);

                    if (Math.Abs(j - i) > 1)
                    {
                        errors[i][j - i - 1] = hull.GetMinEpsilon(pointJ, true);
                    }
                }
            }

            for (var i = trajectory.Count - 1; i >= 2; i--)
            {
                var pointI = trajectory[i];
                var hull   = new EnhancedConvexHull(pointI);

                for (var j = i - 1; j >= 0; j--)
                {
                    var pointJ = trajectory[j];

                    hull.Insert(pointJ);

                    if (Math.Abs(j - i) > 1)
                    {
                        errors[j][i - j - 1] = Math.Max(errors[j][i - j - 1], hull.GetMinEpsilon(pointJ, false));
                    }
                }
            }

            var shortcutSet = new MSSimpleShortcutSet(input, ShortcutSetBuilder.ShortcutSetFactory);

            for (var level = 1; level <= input.NumLevels; level++)
            {
                output.LogLine("Dumping level " + level);
                var shortcuts = ShortcutSetBuilder.ShortcutSetFactory.Create(input.Trajectory);

                for (var i = 0; i < trajectory.Count - 1; i++)
                {
                    shortcuts.PrependShortcut(trajectory[i], trajectory[i + 1]);
                }

                for (var i = 0; i < trajectory.Count - 2; i++)
                {
                    var pointI = trajectory[i];

                    for (var j = i + 2; j < trajectory.Count; j++)
                    {
                        var pointJ = trajectory[j];

                        if (errors[i][j - i - 1] <= input.GetEpsilon(level))
                        {
                            shortcuts.AppendShortcut(pointI, pointJ);
                        }
                    }
                }

                shortcutSet.Shortcuts[level] = shortcuts;
            }

            output.Shortcuts = shortcutSet;
        }
 protected MSShortcutChecker(MSSInput input, MSSOutput output)
 {
     Input   = input;
     Output  = output;
     Forward = true;
 }