private void CheckCorrectOrderingAndNoOverlap(LayoutVertexToPointMap vertexCenters)
        {
            foreach (var layer in Layers)
            {
                for (var i = 0; i < layer.Count - 1; i++)
                {
                    var vertex1          = layer[i];
                    var vertex1HalfWidth = vertex1.Width / 2;
                    var vertex1Center    = vertexCenters.Get(vertex1).X;

                    var vertex2          = layer[i + 1];
                    var vertex2HalfWidth = vertex2.Width / 2;
                    var vertex2Center    = vertexCenters.Get(vertex2).X;

                    var vertex1RightSide = vertex1Center + vertex1HalfWidth;
                    var vertex2LeftSide  = vertex2Center - vertex2HalfWidth;

                    if (vertex1RightSide > vertex2LeftSide)
                    {
                        throw new Exception($"{vertex1} overlaps {vertex2}.");
                    }
                }
            }
        }
        private void CheckThatParentsAreCentered(LayoutVertexToPointMap vertexCenters)
        {
            foreach (var vertex in ProperLayoutGraph.Vertices)
            {
                if (ProperLayoutGraph.HasPrimaryChildren(vertex))
                {
                    var childrenBlockRect = ProperLayoutGraph.GetPrimaryChildren(vertex)
                                            .Select(i => Rect2D.CreateFromCenterAndSize(vertexCenters.Get(i), i.Size))
                                            .Union();

                    if (!vertexCenters.Get(vertex).X.IsEqualWithTolerance(childrenBlockRect.Center.X))
                    {
                        throw new Exception($"{vertex} is not centered to its children.");
                    }
                }
            }
        }