1 package de.yasc.example.petrinet;
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Collections;
7 import java.util.Random;
8 import java.util.stream.Collectors;
10 public final class Petrinet {
12 private static final class Place {
30 private static final class Transition {
32 final List<Place> preset;
33 final List<Place> postset;
35 public Transition(List<Place> preset, List<Place> postset) {
37 this.postset = postset;
41 return preset.stream().noneMatch(Place::empty);
45 preset.forEach(Place::dec);
46 postset.forEach(Place::inc);
50 final private Random prng = new Random();
51 final private Place[] places;
52 final private List<Transition> transitions;
54 public Petrinet(int places) {
55 this.places = new Place[places];
56 for (int i = 0 ; i < places ; i++)
57 this.places[i] = new Place();
58 transitions = new ArrayList<>();
61 public void addTransistion(Integer[] preset, Integer[] postset) {
62 transitions.add(new Transition(
63 Arrays.stream(preset).map((i) -> places[i]).collect(Collectors.toList()),
64 Arrays.stream(postset).map((i) -> places[i]).collect(Collectors.toList())
68 public void addMarking(Integer ... marking) {
69 Arrays.stream(marking).forEach((i) -> places[i].inc());
72 public boolean step() {
73 var enabledTransitions = transitions.stream().filter(Transition::enabled).collect(Collectors.toList());
74 if (enabledTransitions.isEmpty()) {
77 transitions.get(prng.nextInt(enabledTransitions.size())).fire();
82 public int step(int k) {
92 public Integer[] getMarking() {
93 final var marking = new ArrayList<Integer>();
94 for (int p = 0 ; p < places.length ; p++) {
95 Collections.nCopies(places[p].tokens, p).forEach(marking::add);
97 return marking.toArray(new Integer[0]);