blob: 12aa0406bbb19549751402d88d28c8a0e1f79dcb [file] [log] [blame]
pre {
// Make sure we have less edges in the connected graph than the total of nodes.
var p = (3+(8*max-3).pow(0.5))/(2.5*max);
p.println("p ");
var cNodes = (p * max).floor();
cNodes.println("cNodes ");
var cEdges = ((cNodes-1)*(cNodes-2)/2 + 1); // (n-1)(n-2)/2 + 1 for a fully connected graph
cEdges.println("cEdges ");
var free = max-cNodes-cEdges-2; // We have two graphs, we want max elements in total
var dEdges = free/2;
dEdges.println("dEdges ");
// Total nodes =
var n = cNodes + free - dEdges;
n.println("n ");
}
// Graph0 is connected
operation Graph create()
{
self.name = "Connected";
}
// Graph1 is disconnected
operation Graph create()
{
self.name = "Disconnected";
}
$instances n
operation Node create() {
self.label=nextCapitalisedString("LETTER_LOWER", 5);
}
// (n-1)(n-2)/2 + 1 edges to connect a 30 nodes graph
$instances cEdges
@list connected
operation Edge create() {
}
$instances dEdges
@list disconnected
operation Edge create() {
}
$number cNodes
pattern G0Nodes
g:Graph
guard : g.name="Connected",
n:Node
{
onmatch {
g.element.add(n);
}
}
pattern G1Nodes
g:Graph
guard : g.name == "Disconnected",
n:Node
guard: n.graph == null
{
onmatch {
g.element.add(n);
}
}
$number cEdges
pattern ConnectedGraph
g:Graph
guard: g.name == "Connected",
sn:Node
from: g.element.select(n:Node | true),
tn:Node
from: g.element.select(n:Node | true).excluding(sn),
e:Edge
from: nextFromListAsSample("connected")
{
onmatch {
e.source = sn;
e.target = tn;
e.graph = g;
}
}
$number dEdges
pattern DisconnectedGraph
g:Graph
guard: g.name == "Disconnected",
sn:Node
from: g.element.select(n:Node | true),
tn:Node
from: g.element.select(n:Node | true).excluding(sn),
e:Edge
from: nextFromListAsSample("disconnected")
{
onmatch {
e.source = sn;
e.target = tn;
e.graph = g;
}
}