public HierarchicalOptimalGrid()
        {
            grid = new ColorableGrid();
            WrapControl(grid);

            Name     = "Imai Iri Hierarchical - Graph Weights";
            Priority = 4;

            VisualizableState = RunState.OutputAvailable;

            grid.PreviewKeyDown += HandlePreviewKeyDown;
            grid.KeyDown        += HandleArrowKeys;
            grid.Paint          += DrawInfo;

            BeforeStateReachedHandler = run =>
            {
                Visible = false;
            };

            AfterStateReachedHandler = run =>
            {
                Visible = true;

                this.run     = run;
                currentLevel = 1;
                DrawGrid();
            };
        }
        public MSSGridExplorer()
        {
            grid = new ColorableGrid();
            WrapControl(grid);

            Name     = "Colored Grid";
            Priority = 1;

            VisualizableState = RunState.OutputAvailable;

            grid.PreviewKeyDown += HandlePreviewKeyDown;
            grid.KeyDown        += HandleArrowKeys;
            grid.Paint          += DrawInfo;

            BeforeStateReachedHandler = run =>
            {
                Visible = false;
            };

            AfterStateReachedHandler = run =>
            {
                Visible = true;

                this.run     = run;
                currentLevel = 1;
                DrawGrid();
            };
        }
        private void DrawGrid()
        {
            var shortcutGraph = Output.Graphs[currentLevel];

            var trajectory = run.Input.Trajectory;
            var numPoints  = run.Input.Trajectory.Count;

            var gradientSize  = 1000;
            var colorGradient = ColorableGrid.CreateColorGradient(gradientSize, new [] { Color.Black, Color.Red, Color.Yellow, Color.White });
            //var colorGradient = ColorableGrid.CreateColorGradient(gradientSize, new[] { Color.White, Color.Black });
            var maxWeight = 0;
            var minWeight = int.MaxValue;

            foreach (var shortcut in shortcutGraph.Shortcuts.Keys)
            {
                var weight = ((WeightedEdge)shortcutGraph.Shortcuts[shortcut]).Data;
                maxWeight = Math.Max(maxWeight, weight);
                minWeight = Math.Min(minWeight, weight);
            }

            var weightRange = maxWeight - minWeight;

            grid.SetDimensions(numPoints, numPoints);
            for (var i = 0; i < numPoints; i++)
            {
                for (var j = 0; j < numPoints; j++)
                {
                    Color color;

                    if (i == j)
                    {
                        color = colorGradient[0];
                    }
                    else if (weightRange == 0)
                    {
                        color = colorGradient[colorGradient.Count - 1];
                    }
                    else
                    {
                        var shortcut = j > i ? new Shortcut(trajectory[i], trajectory[j]) : new Shortcut(trajectory[j], trajectory[i]);
                        if (shortcutGraph.Shortcuts.ContainsKey(shortcut))
                        {
                            var weight = ((WeightedEdge)shortcutGraph.Shortcuts[shortcut]).Data;

                            if (j == numPoints - 1 && j > i)
                            {
                                Debug.WriteLine(weight);
                            }

                            var weightFraction = ((double)weight - minWeight) / weightRange;
                            var index          = (int)(weightFraction * (gradientSize - 1));
                            color = colorGradient[index];
                        }
                        else
                        {
                            color = Color.White;
                        }
                    }

                    grid.ColorCell(i, j, color);
                }
            }
            grid.DrawGrid();
        }