public void Output(ArchitectureGraph architecture, List<OutputEntry> warnings)
        {
            architecture.Vertices.ForEach((proj, i) => ids.Add(proj, i + 1));

            var result = new DotStringBuilder("Architecture");

            architecture.Vertices.ForEach(v => result.AppendNode(v, v, "shape", "box"));

            result.AppendSpace();

            var deps = new HashSet<GroupDependency>(architecture.Edges);
            var inversible = new HashSet<GroupDependency>(deps.Where(d => deps.Contains(new GroupDependency(d.Target, d.Source))));

            architecture.Edges.ForEach(d => result.AppendEdge(d.Source, d.Target, "style", GetStyle(d), "color", GetColor(d, inversible)));

            File.WriteAllText(file, result.ToString());
        }
        //private DependencyGraph Sample(DependencyGraph aGraph, List<OutputEntry> aWarnings, int percent)
        //{
        //    var rand = new Random();
        //    var selected = new HashSet<Library>(aWarnings.SelectMany(w => w.Projects)
        //        .Concat(aGraph.Vertices.Where(v => rand.Next(100) < percent)));
        //    var result = new DependencyGraph();
        //    result.AddVertexRange(selected);
        //    result.AddEdgeRange(aGraph.Edges.Where(e => selected.Contains(e.Source) && selected.Contains(e.Target)));
        //    return result;
        //}
        private string GenerateDot()
        {
            var result = new DotStringBuilder("Dependencies");

            result.AppendConfig("concentrate", "true");

            int clusterIndex = 1;

            foreach (var group in graph.Vertices.Where(a => a.GroupElement != null)
                .GroupBy(a => a.GroupElement.Name))
            {
                var groupName = @group.Key;
                var clusterName = "cluster" + clusterIndex++;

                var groupInfo = new GroupInfo(clusterName + "_top", clusterName + "_bottom");
                groupInfos.Add(groupName, groupInfo);

                result.StartSubgraph(clusterName);

                result.AppendConfig("label", groupName);
                result.AppendConfig("color", "lightgray");
                result.AppendConfig("style", "filled");
                result.AppendConfig("fontsize", "20");

                result.AppendSpace();

                AppendGroupNode(result, "min", groupInfo.TopNode);

                result.AppendSpace();

                var projs = new HashSet<Library>(group);

                projs.ForEach(a => AppendProject(result, a));

                result.AppendSpace();

                graph.Edges.Where(e => projs.Contains(e.Source) && projs.Contains(e.Target))
                    .ForEach(d => AppendDependency(result, d));

                result.AppendSpace();

                AppendGroupNode(result, "max", groupInfo.BottomNode);

                result.EndSubgraph();

                result.AppendSpace();
            }

            graph.Vertices.Where(a => a.GroupElement == null)
                .ForEach(a => AppendProject(result, a));

            result.AppendSpace();

            graph.Edges.Where(e => AreFromDifferentGroups(e.Source, e.Target))
                .ForEach(d => AppendDependency(result, d));

            result.AppendSpace();

            AddDependenciesBetweenGroups(result);

            return result.ToString();
        }