pre { | |
var id = 0; | |
var num_nets = 1; | |
// Two random numbers 0..total | |
var quant = nextAddTo(2, total).sortBy(q | q); | |
var num_p = 1 + quant.at(0); // Min 2 Places | |
// For each transition we need two arcs | |
var num_t = (quant.at(1)/3).ceiling(); | |
} | |
$instances num_nets | |
@list net | |
operation PetriNet create() { | |
self.name = "RandomActions"; | |
} | |
$instances num_p | |
operation Place create() { | |
self.name = nextFromList("nouns") + " " + nextFromList("places"); | |
} | |
$instances num_t | |
operation Transition create() { | |
self.name = nextFromList("nouns") + " " + nextFromList("transitions"); | |
nextFromList("net").transitions.add(self); | |
} | |
// Create an arc to connect the transition to 2 places, make sure the places and transitions use the same noun | |
$probability 1/num_nets | |
pattern Transition | |
net:PetriNet, | |
tra:Transition | |
from: net.transitions | |
{ | |
onmatch { | |
var size = 0; | |
var nound = tra.name.split(" ").at(0); | |
var matchingPlaces = Place.all().select(p | nound.isSubstringOf(p.name)); | |
var freeSources = matchingPlaces.select(p | p.incoming.size() == size); | |
while (freeSources.isEmpty()) { | |
size += 1; | |
freeSources = matchingPlaces.select(p | p.incoming.size() == size); | |
} | |
size = 0; | |
var freeTarget = matchingPlaces.select(p | p.incoming.size() == size); | |
while (freeTarget.isEmpty()) { | |
size += 1; | |
freeTarget = matchingPlaces.select(p | p.incoming.size() == size); | |
} | |
var source = nextFromCollection(freeSources); | |
var target = nextFromCollection(freeTarget); | |
var a1:Arc = new PlaceToTransArc(); | |
a1.weight = nextInteger(10); | |
a1.source = source; | |
net.places.add(source); | |
a1.target = tra; | |
net.arcs.add(a1); | |
var a2:Arc = new TransToPlaceArc(); | |
a1.weight = nextInteger(10); | |
a2.source = tra; | |
a2.target = target; | |
net.places.add(target); | |
net.arcs.add(a2); | |
} | |
} | |
post { | |
"GenDone".println(); | |
} |