2
* File: InterestingTransitionVisitor.cpp.cc
3
* Author: Nikolaj J. Ulrik <nikolaj@njulrik.dk>
5
* Created on 03/02/2021
1
/* Copyright (C) 2021 Nikolaj J. Ulrik <nikolaj@njulrik.dk>,
2
* Simon M. Virenfeldt <simon@simwir.dk>
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation, either version 3 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program. If not, see <http://www.gnu.org/licenses/>.
8
18
#include "PetriEngine/Stubborn/InterestingTransitionVisitor.h"
10
20
namespace PetriEngine {
12
void InterestingTransitionVisitor::_accept(const PQL::SimpleQuantifierCondition *element) {
22
void InterestingTransitionVisitor::_accept(const PQL::SimpleQuantifierCondition *element)
13
24
(*element)[0]->visit(*this);
16
void InterestingTransitionVisitor::_accept(const PQL::UntilCondition *element) {
27
void InterestingTransitionVisitor::_accept(const PQL::UntilCondition *element)
17
29
element->getCond1()->visit(*this);
19
31
element->getCond1()->visit(*this);
174
void InterestingTransitionVisitor::_accept(const PQL::NotCondition *element) {
193
void InterestingTransitionVisitor::_accept(const PQL::NotCondition *element)
176
196
(*element)[0]->visit(*this);
180
void InterestingTransitionVisitor::_accept(const PQL::BooleanCondition *element) {
200
void InterestingTransitionVisitor::_accept(const PQL::BooleanCondition *element)
184
void InterestingTransitionVisitor::_accept(const PQL::DeadlockCondition *element) {
205
void InterestingTransitionVisitor::_accept(const PQL::DeadlockCondition *element)
185
207
if (!element->isSatisfied()) {
186
_stubborn.postPresetOf(_stubborn.leastDependentEnabled(), true);
208
_stubborn.postPresetOf(_stubborn.leastDependentEnabled(), closure);
187
209
} // else add nothing
191
InterestingTransitionVisitor::_accept(const PQL::UnfoldedUpperBoundsCondition *element) {
213
InterestingTransitionVisitor::_accept(const PQL::UnfoldedUpperBoundsCondition *element)
192
215
for (auto &p : element->places())
193
216
if (!p._maxed_out)
194
217
_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) {
220
void InterestingTransitionVisitor::_accept(const PQL::GCondition *element)
223
(*element)[0]->visit(*this);
227
void InterestingTransitionVisitor::_accept(const PQL::FCondition *element)
229
(*element)[0]->visit(*this);
232
void InterestingTransitionVisitor::_accept(const PQL::EFCondition *condition) {
233
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
236
void InterestingTransitionVisitor::_accept(const PQL::EGCondition *condition) {
237
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
240
void InterestingTransitionVisitor::_accept(const PQL::AGCondition *condition) {
241
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
244
void InterestingTransitionVisitor::_accept(const PQL::AFCondition *condition) {
245
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
248
void InterestingTransitionVisitor::_accept(const PQL::EXCondition *condition) {
249
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
252
void InterestingTransitionVisitor::_accept(const PQL::AXCondition *condition) {
253
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
256
void InterestingTransitionVisitor::_accept(const PQL::ACondition *condition) {
257
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
260
void InterestingTransitionVisitor::_accept(const PQL::ECondition *condition) {
261
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
264
void InterestingTransitionVisitor::_accept(const PQL::XCondition *condition) {
265
_accept(static_cast<const PQL::SimpleQuantifierCondition*>(condition));
268
void InterestingTransitionVisitor::_accept(const PQL::AUCondition *condition) {
269
_accept(static_cast<const PQL::UntilCondition*>(condition));
272
void InterestingTransitionVisitor::_accept(const PQL::EUCondition *condition) {
273
_accept(static_cast<const PQL::UntilCondition*>(condition));
276
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::PlusExpr *element)
278
for (auto &i : element->places()) _stubborn.presetOf(i.first, closure);
279
for (auto &e : element->expressions()) e->visit(*this);
282
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::PlusExpr *element)
284
for (auto &i : element->places()) _stubborn.postsetOf(i.first, closure);
285
for (auto &e : element->expressions()) e->visit(*this);
288
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::SubtractExpr *element)
248
290
bool first = true;
249
for(auto& e : element->expressions())
291
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);
312
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::MultiplyExpr *element)
314
if ((element->places().size() + element->expressions().size()) == 1) {
315
for (auto &i : element->places()) _stubborn.presetOf(i.first, closure);
316
for (auto &e : element->expressions()) e->visit(*this);
318
for (auto &i : element->places()) {
319
_stubborn.presetOf(i.first, closure);
320
_stubborn.postsetOf(i.first, closure);
284
for(auto& e : element->expressions())
322
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);
329
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::MultiplyExpr *element)
331
if ((element->places().size() + element->expressions().size()) == 1) {
332
for (auto &i : element->places()) _stubborn.postsetOf(i.first, closure);
333
for (auto &e : element->expressions()) e->visit(*this);
299
335
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);
338
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::MinusExpr *element)
340
// TODO not implemented
343
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::MinusExpr *element)
345
// TODO not implemented
348
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::LiteralExpr *element)
353
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::LiteralExpr *element)
358
void InterestingTransitionVisitor::IncrVisitor::_accept(const PQL::UnfoldedIdentifierExpr *element)
360
_stubborn.presetOf(element->offset(), closure);
363
void InterestingTransitionVisitor::DecrVisitor::_accept(const PQL::UnfoldedIdentifierExpr *element)
365
_stubborn.postsetOf(element->offset(), closure);
368
void InterestingLTLTransitionVisitor::_accept(const PQL::LessThanCondition *element)
370
negate_if_satisfied<PQL::LessThanCondition>(element);
373
void InterestingLTLTransitionVisitor::_accept(const PQL::LessThanOrEqualCondition *element)
375
negate_if_satisfied<PQL::LessThanOrEqualCondition>(element);
378
void InterestingLTLTransitionVisitor::_accept(const PQL::EqualCondition *element)
380
negate_if_satisfied<PQL::EqualCondition>(element);
383
void InterestingLTLTransitionVisitor::_accept(const PQL::NotEqualCondition *element)
385
negate_if_satisfied<PQL::NotEqualCondition>(element);
388
void InterestingLTLTransitionVisitor::_accept(const PQL::CompareConjunction *element)
390
negate_if_satisfied<PQL::CompareConjunction>(element);
393
template<typename Condition>
394
void InterestingLTLTransitionVisitor::negate_if_satisfied(const Condition *element)
396
// TODO: There may be leftover information in isSatisfied that has not been updated in this marking. It is most like needed to evalAndSet the entire tree everytime instead of as now where it may gain a result in a node and therefore not explore the remaining children.
397
auto isSatisfied = element->getSatisfied();
398
assert(isSatisfied != PQL::Condition::RUNKNOWN);
399
if ((isSatisfied == PQL::Condition::RTRUE) != negated) {
401
InterestingTransitionVisitor::_accept(element);
404
InterestingTransitionVisitor::_accept(element);
b'\\ No newline at end of file'