1
package dk.aau.cs.model.tapn;
3
import java.math.BigDecimal;
4
import java.util.ArrayList;
5
import java.util.HashMap;
7
import java.util.Map.Entry;
9
import dk.aau.cs.model.tapn.simulation.FiringMode;
10
import dk.aau.cs.util.Require;
12
// This class must remain immutable wrt. delays and transition firings!
13
public class LocalTimedMarking implements TimedMarking { // TODO: Consider removing the interface here?
14
private HashMap<TimedPlace, List<TimedToken>> placesToTokensMap;
15
private NetworkMarking parent;
17
public LocalTimedMarking() {
18
placesToTokensMap = new HashMap<TimedPlace, List<TimedToken>>();
21
public void setNetworkMarking(NetworkMarking marking){
22
this.parent = marking;
25
public void add(TimedToken token) {
26
if(token.place().isShared()) {
29
if (!placesToTokensMap.containsKey(token.place())) {
30
placesToTokensMap.put(token.place(), new ArrayList<TimedToken>());
33
List<TimedToken> tokens = placesToTokensMap.get(token.place());
38
private void add(List<TimedToken> producedTokens) {
39
for (TimedToken token : producedTokens) {
44
public void remove(TimedToken token) {
45
if(token.place().isShared()) {
47
} else if (placesToTokensMap.containsKey(token.place())) {
48
List<TimedToken> tokens = placesToTokensMap.get(token.place());
54
private void remove(List<TimedToken> tokensToConsume) {
55
for (TimedToken token : tokensToConsume) {
60
public void removePlaceFromMarking(TimedPlace place) {
62
parent.removePlaceFromMarking(place);
64
if(placesToTokensMap.containsKey(place)){
65
placesToTokensMap.remove(place);
70
private List<TimedToken> getTokensFor(LocalTimedPlace place) {
71
if (!placesToTokensMap.containsKey(place))
72
return new ArrayList<TimedToken>();
73
return placesToTokensMap.get(place);
76
public List<TimedToken> getTokensFor(TimedPlace place){
78
return parent.getTokensFor(place);
80
return getTokensFor((LocalTimedPlace)place);
84
public boolean isDelayPossible(BigDecimal delay) {
85
Require.that(delay.compareTo(BigDecimal.ZERO) >= 0, "cannot delay with negative numbers");
86
for (Entry<TimedPlace, List<TimedToken>> entry : placesToTokensMap.entrySet()) {
87
for (TimedToken token : entry.getValue()) {
88
TimeInvariant invariant = token.place().invariant();
89
if (!invariant.isSatisfied(token.age().add(delay))) {
97
public LocalTimedMarking clone() {
98
return delay(BigDecimal.ZERO);
101
public LocalTimedMarking delay(BigDecimal amount) {
102
Require.that(amount.compareTo(BigDecimal.ZERO) >= 0, "cannot delay with negative numbers");
103
Require.that(isDelayPossible(amount), "The specified delay is not possible due to an invariant.");
105
LocalTimedMarking clone = new LocalTimedMarking();
106
for (Entry<TimedPlace, List<TimedToken>> entry : placesToTokensMap.entrySet()) {
107
ArrayList<TimedToken> newTokens = new ArrayList<TimedToken>(entry.getValue().size());
108
for (TimedToken token : entry.getValue()) {
109
newTokens.add(token.delay(amount));
111
clone.placesToTokensMap.put(entry.getKey(), newTokens);
114
clone.parent = parent;
118
public LocalTimedMarking fireTransition(TimedTransition transition, List<TimedToken> tokensToConsume) {
119
Require.that(transition != null, "transition must not be null");
120
Require.that(transition.isEnabledBy(tokensToConsume), "Tokens do not enable transition");
122
LocalTimedMarking clone = clone();
124
List<TimedToken> producedTokens = transition.calculateProducedTokensFrom(tokensToConsume);
126
clone.remove(tokensToConsume);
127
clone.add(producedTokens);
132
public LocalTimedMarking fireTransition(TimedTransition transition, FiringMode firingMode) {
133
Require.that(transition != null, "transition must not be null");
134
Require.that(transition.isEnabled(), "Transition must be enabled");
136
List<TimedToken> tokensToConsume = transition.calculateConsumedTokens(this, firingMode);
138
return fireTransition(transition, tokensToConsume);
143
for (List<TimedToken> tokens : placesToTokensMap.values()) {
144
size += tokens.size();