예제 #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);
        }
        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();
        }
예제 #4
0
 public ShortcutChecker(MSSInput input, MSSOutput output) : base(input, output)
 {
 }
예제 #5
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;
 }