public GcTypeHeap Merge(int minimumSize)
{
var minimumSizeBytes = minimumSize * 1000;
Console.WriteLine("merging type nodes smaller than {0}kb", minimumSize);
var merged = new BidirectionalGraph<GcType,MergedEdge<GcType,GcTypeEdge>>(false, this.graph.VertexCount);
var merger = new EdgeMergeCondensationGraphAlgorithm<GcType, GcTypeEdge>(
this.graph,
merged,
delegate(GcType type)
{
return type.Size >= minimumSizeBytes;
});
merger.Compute();
var clone = new BidirectionalGraph<GcType, GcTypeEdge>(
false,
merged.VertexCount);
foreach (var type in merged.Vertices)
clone.AddVertex(type);
foreach (var medge in merged.Edges)
{
GcTypeEdge edge = new GcTypeEdge(medge.Source, medge.Target);
foreach (GcTypeEdge e in medge.Edges)
edge.Count += e.Count;
clone.AddEdge(edge);
}
Console.WriteLine("resulting {0} types, {1} edges", clone.VertexCount, clone.EdgeCount);
return new GcTypeHeap(clone);
}
#endregion