2
* File: InterestingTransitionVisitor.cpp.cc
3
* Author: Nikolaj J. Ulrik <nikolaj@njulrik.dk>
5
* Created on 03/02/2021
8
#include "PetriEngine/Stubborn/InterestingTransitionVisitor.h"
10
namespace PetriEngine {
12
void InterestingTransitionVisitor::_accept(const PQL::SimpleQuantifierCondition *element) {
13
(*element)[0]->visit(*this);
16
void InterestingTransitionVisitor::_accept(const PQL::UntilCondition *element) {
17
element->getCond1()->visit(*this);
19
element->getCond1()->visit(*this);
21
element->getCond2()->visit(*this);
25
void InterestingTransitionVisitor::_accept(const PQL::AndCondition *element) {
26
if (!negated) { // and
27
for (auto &c : *element) {
28
if (!c->isSatisfied()) {
34
for (auto &c : *element) c->visit(*this);
38
void InterestingTransitionVisitor::_accept(const PQL::OrCondition *element) {
40
for (auto &c : *element) c->visit(*this);
42
for (auto &c : *element) {
43
if (c->isSatisfied()) {
51
void InterestingTransitionVisitor::_accept(const PQL::CompareConjunction *element) {
53
auto neg = negated != element->isNegated();
54
int32_t cand = std::numeric_limits<int32_t>::max();
56
for (auto &c : *element) {
57
auto val = _stubborn.getParent()[c._place];
58
if (c._lower == c._upper) {
60
if (val != c._lower) continue;
61
_stubborn.postsetOf(c._place, true);
62
_stubborn.presetOf(c._place, true);
64
if (val == c._lower) continue;
75
if (val < c._lower && c._lower != 0) {
81
if (val > c._upper && c._upper != std::numeric_limits<uint32_t>::max()) {
87
if (val >= c._lower && c._lower != 0) {
88
_stubborn.postsetOf(c._place, true);
91
if (val <= c._upper && c._upper != std::numeric_limits<uint32_t>::max()) {
92
_stubborn.presetOf(c._place, true);
96
if (cand != std::numeric_limits<int32_t>::max()) {
97
if (pre && _stubborn.seenPre(cand))
99
else if (!pre && _stubborn.seenPost(cand))
103
if (cand != std::numeric_limits<int32_t>::max()) {
105
_stubborn.presetOf(cand, true);
107
_stubborn.postsetOf(cand, true);
112
void InterestingTransitionVisitor::_accept(const PQL::EqualCondition *element) {
113
if (!negated) { // equal
114
if (element->getExpr1()->getEval() == element->getExpr2()->getEval()) { return; }
115
if (element->getExpr1()->getEval() > element->getExpr2()->getEval()) {
116
element->getExpr1()->visit(decr);
117
element->getExpr2()->visit(incr);
119
element->getExpr1()->visit(incr);
120
element->getExpr2()->visit(decr);
122
} else { // not equal
123
if (element->getExpr1()->getEval() != element->getExpr2()->getEval()) { return; }
124
element->getExpr1()->visit(incr);
125
element->getExpr1()->visit(decr);
126
element->getExpr2()->visit(incr);
127
element->getExpr2()->visit(decr);
131
void InterestingTransitionVisitor::_accept(const PQL::NotEqualCondition *element) {
132
if (!negated) { // not equal
133
if (element->getExpr1()->getEval() != element->getExpr2()->getEval()) { return; }
134
element->getExpr1()->visit(incr);
135
element->getExpr1()->visit(decr);
136
element->getExpr2()->visit(incr);
137
element->getExpr2()->visit(decr);
139
if (element->getExpr1()->getEval() == element->getExpr2()->getEval()) { return; }
140
if (element->getExpr1()->getEval() > element->getExpr2()->getEval()) {
141
element->getExpr1()->visit(decr);
142
element->getExpr2()->visit(incr);
144
element->getExpr1()->visit(incr);
145
element->getExpr2()->visit(decr);
150
void InterestingTransitionVisitor::_accept(const PQL::LessThanCondition *element) {
151
if (!negated) { // less than
152
if (element->getExpr1()->getEval() < element->getExpr2()->getEval()) { return; }
153
element->getExpr1()->visit(decr);
154
element->getExpr2()->visit(incr);
155
} else { // greater than or equal
156
if (element->getExpr1()->getEval() >= element->getExpr2()->getEval()) { return; }
157
element->getExpr1()->visit(incr);
158
element->getExpr2()->visit(decr);
162
void InterestingTransitionVisitor::_accept(const PQL::LessThanOrEqualCondition *element) {
163
if (!negated) { // less than or equal
164
if (element->getExpr1()->getEval() <= element->getExpr2()->getEval()) { return; }
165
element->getExpr1()->visit(decr);
166
element->getExpr2()->visit(incr);
167
} else { // greater than
168
if (element->getExpr1()->getEval() > element->getExpr2()->getEval()) { return; }
169
element->getExpr1()->visit(incr);
170
element->getExpr2()->visit(decr);
174
void InterestingTransitionVisitor::_accept(const PQL::NotCondition *element) {
176
(*element)[0]->visit(*this);
180
void InterestingTransitionVisitor::_accept(const PQL::BooleanCondition *element) {
184
void InterestingTransitionVisitor::_accept(const PQL::DeadlockCondition *element) {
185
if (!element->isSatisfied()) {
186
_stubborn.postPresetOf(_stubborn.leastDependentEnabled(), true);
187
} // else add nothing
191
InterestingTransitionVisitor::_accept(const PQL::UnfoldedUpperBoundsCondition *element) {
192
for (auto &p : element->places())
194
_stubborn.presetOf(p._place);
197
void InterestingTransitionVisitor::_accept(const PQL::EFCondition *condition)
199
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
202
void InterestingTransitionVisitor::_accept(const PQL::EGCondition *condition)
204
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
207
void InterestingTransitionVisitor::_accept(const PQL::AGCondition *condition)
209
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
212
void InterestingTransitionVisitor::_accept(const PQL::AFCondition *condition)
214
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
217
void InterestingTransitionVisitor::_accept(const PQL::EXCondition *condition)
219
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
222
void InterestingTransitionVisitor::_accept(const PQL::AXCondition *condition)
224
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
227
void InterestingTransitionVisitor::_accept(const PQL::EUCondition *condition)
229
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
232
void InterestingTransitionVisitor::_accept(const PQL::AUCondition *condition)
234
_accept((PetriEngine::PQL::SimpleQuantifierCondition*) condition);
237
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::PlusExpr *element) {
238
for(auto& i : element->places()) _stubborn.presetOf(i.first, true);
239
for(auto& e : element->expressions()) e->visit(*this);
242
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::PlusExpr *element) {
243
for(auto& i : element->places()) _stubborn.postsetOf(i.first, true);
244
for(auto& e : element->expressions()) e->visit(*this);
247
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::SubtractExpr *element) {
249
for(auto& e : element->expressions())
259
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::SubtractExpr *element) {
261
for(auto& e : element->expressions())
271
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::MultiplyExpr *element) {
272
if((element->places().size() + element->expressions().size()) == 1)
274
for(auto& i : element->places()) _stubborn.presetOf(i.first, true);
275
for(auto& e : element->expressions()) e->visit(*this);
279
for(auto& i : element->places())
281
_stubborn.presetOf(i.first, true);
282
_stubborn.postsetOf(i.first, true);
284
for(auto& e : element->expressions())
292
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::MultiplyExpr *element) {
293
if((element->places().size() + element->expressions().size()) == 1)
295
for(auto& i : element->places()) _stubborn.postsetOf(i.first, true);
296
for(auto& e : element->expressions()) e->visit(*this);
299
element->visit(*incr);
302
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::MinusExpr *element) {
303
// TODO not implemented
306
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::MinusExpr *element) {
307
// TODO not implemented
310
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::LiteralExpr *element) {
314
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::LiteralExpr *element) {
318
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::UnfoldedIdentifierExpr *element) {
319
_stubborn.presetOf(element->offset(), true);
322
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::UnfoldedIdentifierExpr *element) {
323
_stubborn.postsetOf(element->offset(), true);
b'\\ No newline at end of file'