///<summary> /// Random graph generator for sparse graphs. ///</summary> private void GenerateSparseGraph(IGraph G) { G.Clear(); IMapper <IPortOwner, int> index = new DictionaryMapper <IPortOwner, int>(); int n = NodeCount; int m = Math.Min(GetMaxEdges(), EdgeCount); INode[] V = new INode[n]; for (int i = 0; i < n; i++) { V[i] = G.CreateNode(); index[V[i]] = i; } RandomSupport.Permutate(random, V); int count = m; while (count > 0) { int vi = random.Next(n); INode v = V[vi]; INode w = V[random.Next(n)]; if (G.GetEdge(v, w) != null || (v == w && (!AllowSelfLoops || !AllowCycles))) { continue; } G.CreateEdge(v, w); count--; } if (!AllowCycles) { foreach (IEdge edge in G.Edges) { IPort sourcePort = edge.SourcePort; IPort targetPort = edge.TargetPort; if (index[sourcePort.Owner] > index[targetPort.Owner]) { G.SetEdgePorts(edge, targetPort, sourcePort); } } } }
///<summary> /// Random graph generator for dense graphs. ///</summary> private void GenerateDenseGraph(IGraph g) { g.Clear(); INode[] nodes = new INode[NodeCount]; for (int i = 0; i < NodeCount; i++) { nodes[i] = g.CreateNode(); } RandomSupport.Permutate(random, nodes); int m = Math.Min(GetMaxEdges(), EdgeCount); int n = NodeCount; int adder = (AllowSelfLoops && AllowCycles) ? 0 : 1; bool[] edgeWanted = RandomSupport.GetBoolArray(random, GetMaxEdges(), m); for (int i = 0, k = 0; i < n; i++) { for (int j = i + adder; j < n; j++, k++) { if (edgeWanted[k]) { if (AllowCycles && random.NextDouble() > 0.5f) { g.CreateEdge(nodes[j], nodes[i]); } else { g.CreateEdge(nodes[i], nodes[j]); } } } } }