2
* To change this license header, choose License Headers in Project Properties.
3
* To change this template file, choose Tools | Templates
4
* and open the template in the editor.
11
* Created on February 19, 2018, 7:00 PM
14
#ifndef COLORED_EXPRESSIONS_H
15
#define COLORED_EXPRESSIONS_H
18
#include <unordered_map>
28
#include "../errorcodes.h"
30
namespace PetriEngine {
31
class ColoredPetriNetBuilder;
34
struct ExpressionContext {
35
typedef std::unordered_map<std::string, const Color*> BindingMap;
38
std::unordered_map<std::string, ColorType*>& colorTypes;
40
const Color* findColor(const std::string& color) const {
41
if (color.compare("dot") == 0)
42
return DotConstant::dotConstant();
43
for (auto& elem : colorTypes) {
44
auto col = (*elem.second)[color];
48
printf("Could not find color: %s\nCANNOT_COMPUTE\n", color.c_str());
52
ProductType* findProductColorType(const std::vector<const ColorType*>& types) const {
53
for (auto& elem : colorTypes) {
54
auto* pt = dynamic_cast<ProductType*>(elem.second);
55
if (pt && pt->containsTypes(types)) {
63
class WeightException : public std::exception {
67
explicit WeightException(std::string message) : _message(message) {}
69
const char* what() const noexcept override {
70
return ("Undefined weight: " + _message).c_str();
78
virtual void getVariables(std::set<Variable*>& variables) const {
81
virtual void expressionType() {
82
std::cout << "Expression" << std::endl;
85
virtual std::string toString() const {
90
class ColorExpression : public Expression {
93
virtual ~ColorExpression() {}
95
virtual const Color* eval(ExpressionContext& context) const = 0;
98
class DotConstantExpression : public ColorExpression {
100
const Color* eval(ExpressionContext& context) const override {
101
return DotConstant::dotConstant();
105
typedef std::shared_ptr<ColorExpression> ColorExpression_ptr;
107
class VariableExpression : public ColorExpression {
112
const Color* eval(ExpressionContext& context) const override {
113
return context.binding[_variable->name];
116
void getVariables(std::set<Variable*>& variables) const override {
117
variables.insert(_variable);
120
std::string toString() const override {
121
return _variable->name;
124
VariableExpression(Variable* variable)
125
: _variable(variable) {}
128
class UserOperatorExpression : public ColorExpression {
130
const Color* _userOperator;
133
const Color* eval(ExpressionContext& context) const override {
134
return _userOperator;
137
std::string toString() const override {
138
return _userOperator->toString();
141
UserOperatorExpression(const Color* userOperator)
142
: _userOperator(userOperator) {}
145
class UserSortExpression : public Expression {
147
ColorType* _userSort;
150
ColorType* eval(ExpressionContext& context) const {
154
std::string toString() const override {
155
return _userSort->getName();
158
UserSortExpression(ColorType* userSort)
159
: _userSort(userSort) {}
162
typedef std::shared_ptr<UserSortExpression> UserSortExpression_ptr;
164
class NumberConstantExpression : public Expression {
169
uint32_t eval(ExpressionContext& context) const {
173
NumberConstantExpression(uint32_t number)
177
typedef std::shared_ptr<NumberConstantExpression> NumberConstantExpression_ptr;
179
class SuccessorExpression : public ColorExpression {
181
ColorExpression_ptr _color;
184
const Color* eval(ExpressionContext& context) const override {
185
return &++(*_color->eval(context));
188
void getVariables(std::set<Variable*>& variables) const override {
189
_color->getVariables(variables);
192
std::string toString() const override {
193
return _color->toString() + "++";
196
SuccessorExpression(ColorExpression_ptr&& color)
197
: _color(std::move(color)) {}
200
class PredecessorExpression : public ColorExpression {
202
ColorExpression_ptr _color;
205
const Color* eval(ExpressionContext& context) const override {
206
return &--(*_color->eval(context));
209
void getVariables(std::set<Variable*>& variables) const override {
210
_color->getVariables(variables);
213
std::string toString() const override {
214
return _color->toString() + "--";
217
PredecessorExpression(ColorExpression_ptr&& color)
218
: _color(std::move(color)) {}
221
class TupleExpression : public ColorExpression {
223
std::vector<ColorExpression_ptr> _colors;
226
const Color* eval(ExpressionContext& context) const override {
227
std::vector<const Color*> colors;
228
std::vector<const ColorType*> types;
229
for (auto color : _colors) {
230
colors.push_back(color->eval(context));
231
types.push_back(colors.back()->getColorType());
233
ProductType* pt = context.findProductColorType(types);
235
const Color* col = pt->getColor(colors);
236
assert(col != nullptr);
240
void getVariables(std::set<Variable*>& variables) const override {
241
for (auto elem : _colors) {
242
elem->getVariables(variables);
246
std::string toString() const override {
247
std::string res = "(" + _colors[0]->toString();
248
for (uint32_t i = 1; i < _colors.size(); ++i) {
249
res += "," + _colors[i]->toString();
255
TupleExpression(std::vector<ColorExpression_ptr>&& colors)
256
: _colors(std::move(colors)) {}
259
class GuardExpression : public Expression {
262
virtual ~GuardExpression() {}
264
virtual bool eval(ExpressionContext& context) const = 0;
267
typedef std::shared_ptr<GuardExpression> GuardExpression_ptr;
269
class LessThanExpression : public GuardExpression {
271
ColorExpression_ptr _left;
272
ColorExpression_ptr _right;
275
bool eval(ExpressionContext& context) const override {
276
return _left->eval(context) < _right->eval(context);
279
void getVariables(std::set<Variable*>& variables) const override {
280
_left->getVariables(variables);
281
_right->getVariables(variables);
284
LessThanExpression(ColorExpression_ptr&& left, ColorExpression_ptr&& right)
285
: _left(std::move(left)), _right(std::move(right)) {}
288
class GreaterThanExpression : public GuardExpression {
290
ColorExpression_ptr _left;
291
ColorExpression_ptr _right;
294
bool eval(ExpressionContext& context) const override {
295
return _left->eval(context) > _right->eval(context);
298
void getVariables(std::set<Variable*>& variables) const override {
299
_left->getVariables(variables);
300
_right->getVariables(variables);
303
GreaterThanExpression(ColorExpression_ptr&& left, ColorExpression_ptr&& right)
304
: _left(std::move(left)), _right(std::move(right)) {}
307
class LessThanEqExpression : public GuardExpression {
309
ColorExpression_ptr _left;
310
ColorExpression_ptr _right;
313
bool eval(ExpressionContext& context) const override {
314
return _left->eval(context) <= _right->eval(context);
317
void getVariables(std::set<Variable*>& variables) const override {
318
_left->getVariables(variables);
319
_right->getVariables(variables);
322
LessThanEqExpression(ColorExpression_ptr&& left, ColorExpression_ptr&& right)
323
: _left(std::move(left)), _right(std::move(right)) {}
326
class GreaterThanEqExpression : public GuardExpression {
328
ColorExpression_ptr _left;
329
ColorExpression_ptr _right;
332
bool eval(ExpressionContext& context) const override {
333
return _left->eval(context) >= _right->eval(context);
336
void getVariables(std::set<Variable*>& variables) const override {
337
_left->getVariables(variables);
338
_right->getVariables(variables);
341
GreaterThanEqExpression(ColorExpression_ptr&& left, ColorExpression_ptr&& right)
342
: _left(std::move(left)), _right(std::move(right)) {}
345
class EqualityExpression : public GuardExpression {
347
ColorExpression_ptr _left;
348
ColorExpression_ptr _right;
351
bool eval(ExpressionContext& context) const override {
352
return _left->eval(context) == _right->eval(context);
355
void getVariables(std::set<Variable*>& variables) const override {
356
_left->getVariables(variables);
357
_right->getVariables(variables);
360
EqualityExpression(ColorExpression_ptr&& left, ColorExpression_ptr&& right)
361
: _left(std::move(left)), _right(std::move(right)) {}
364
class InequalityExpression : public GuardExpression {
366
ColorExpression_ptr _left;
367
ColorExpression_ptr _right;
370
bool eval(ExpressionContext& context) const override {
371
return _left->eval(context) != _right->eval(context);
374
void getVariables(std::set<Variable*>& variables) const override {
375
_left->getVariables(variables);
376
_right->getVariables(variables);
379
InequalityExpression(ColorExpression_ptr&& left, ColorExpression_ptr&& right)
380
: _left(std::move(left)), _right(std::move(right)) {}
383
class NotExpression : public GuardExpression {
385
GuardExpression_ptr _expr;
388
bool eval(ExpressionContext& context) const override {
389
return !_expr->eval(context);
392
void getVariables(std::set<Variable*>& variables) const override {
393
_expr->getVariables(variables);
396
NotExpression(GuardExpression_ptr&& expr) : _expr(std::move(expr)) {}
399
class AndExpression : public GuardExpression {
401
GuardExpression_ptr _left;
402
GuardExpression_ptr _right;
405
bool eval(ExpressionContext& context) const override {
406
return _left->eval(context) && _right->eval(context);
409
void getVariables(std::set<Variable*>& variables) const override {
410
_left->getVariables(variables);
411
_right->getVariables(variables);
414
AndExpression(GuardExpression_ptr&& left, GuardExpression_ptr&& right)
415
: _left(left), _right(right) {}
418
class OrExpression : public GuardExpression {
420
GuardExpression_ptr _left;
421
GuardExpression_ptr _right;
424
bool eval(ExpressionContext& context) const override {
425
return _left->eval(context) || _right->eval(context);
428
void getVariables(std::set<Variable*>& variables) const override {
429
_left->getVariables(variables);
430
_right->getVariables(variables);
433
OrExpression(GuardExpression_ptr&& left, GuardExpression_ptr&& right)
434
: _left(std::move(left)), _right(std::move(right)) {}
437
class ArcExpression : public Expression {
440
virtual ~ArcExpression() {}
442
virtual Multiset eval(ExpressionContext& context) const = 0;
444
virtual void expressionType() override {
445
std::cout << "ArcExpression" << std::endl;
448
virtual uint32_t weight() const = 0;
451
typedef std::shared_ptr<ArcExpression> ArcExpression_ptr;
453
class AllExpression : public Expression {
458
virtual ~AllExpression() {};
459
std::vector<const Color*> eval(ExpressionContext& context) const {
460
std::vector<const Color*> colors;
461
assert(_sort != nullptr);
462
for (size_t i = 0; i < _sort->size(); i++) {
463
colors.push_back(&(*_sort)[i]);
468
size_t size() const {
469
return _sort->size();
472
std::string toString() const override {
473
return _sort->getName() + ".all";
476
AllExpression(ColorType* sort) : _sort(sort)
478
assert(sort != nullptr);
482
typedef std::shared_ptr<AllExpression> AllExpression_ptr;
484
class NumberOfExpression : public ArcExpression {
487
std::vector<ColorExpression_ptr> _color;
488
AllExpression_ptr _all;
491
Multiset eval(ExpressionContext& context) const override {
492
std::vector<const Color*> colors;
493
if (!_color.empty()) {
494
for (auto elem : _color) {
495
colors.push_back(elem->eval(context));
497
} else if (_all != nullptr) {
498
colors = _all->eval(context);
500
std::vector<std::pair<const Color*,uint32_t>> col;
501
for (auto elem : colors) {
502
col.push_back(std::make_pair(elem, _number));
504
return Multiset(col);
507
void getVariables(std::set<Variable*>& variables) const override {
510
for (auto elem : _color) {
511
elem->getVariables(variables);
515
uint32_t weight() const override {
517
return _number * _color.size();
519
return _number * _all->size();
526
bool isSingleColor() const {
527
return !isAll() && _color.size() == 1;
530
uint32_t number() const {
534
std::string toString() const override {
536
return std::to_string(_number) + "'(" + _all->toString() + ")";
537
std::string res = std::to_string(_number) + "'(" + _color[0]->toString() + ")";
538
for (uint32_t i = 1; i < _color.size(); ++i) {
540
res += std::to_string(_number) + "'(" + _color[i]->toString() + ")";
545
NumberOfExpression(std::vector<ColorExpression_ptr>&& color, uint32_t number = 1)
546
: _number(number), _color(std::move(color)), _all(nullptr) {}
547
NumberOfExpression(AllExpression_ptr&& all, uint32_t number = 1)
548
: _number(number), _color(), _all(std::move(all)) {}
551
typedef std::shared_ptr<NumberOfExpression> NumberOfExpression_ptr;
553
class AddExpression : public ArcExpression {
555
std::vector<ArcExpression_ptr> _constituents;
558
Multiset eval(ExpressionContext& context) const override {
560
for (auto expr : _constituents) {
561
ms += expr->eval(context);
566
void getVariables(std::set<Variable*>& variables) const override {
567
for (auto elem : _constituents) {
568
elem->getVariables(variables);
572
uint32_t weight() const override {
574
for (auto expr : _constituents) {
575
res += expr->weight();
580
std::string toString() const override {
581
std::string res = _constituents[0]->toString();
582
for (uint32_t i = 1; i < _constituents.size(); ++i) {
583
res += " + " + _constituents[i]->toString();
588
AddExpression(std::vector<ArcExpression_ptr>&& constituents)
589
: _constituents(std::move(constituents)) {}
592
class SubtractExpression : public ArcExpression {
594
ArcExpression_ptr _left;
595
ArcExpression_ptr _right;
598
Multiset eval(ExpressionContext& context) const override {
599
return _left->eval(context) - _right->eval(context);
602
void getVariables(std::set<Variable*>& variables) const override {
603
_left->getVariables(variables);
604
_right->getVariables(variables);
607
uint32_t weight() const override {
608
auto* left = dynamic_cast<NumberOfExpression*>(_left.get());
609
if (!left || !left->isAll()) {
610
throw WeightException("Left constituent of subtract is not an all expression!");
612
auto* right = dynamic_cast<NumberOfExpression*>(_right.get());
613
if (!right || !right->isSingleColor()) {
614
throw WeightException("Right constituent of subtract is not a single color number of expression!");
617
uint32_t val = std::min(left->number(), right->number());
618
return _left->weight() - val;
621
std::string toString() const override {
622
return _left->toString() + " - " + _right->toString();
625
SubtractExpression(ArcExpression_ptr&& left, ArcExpression_ptr&& right)
626
: _left(std::move(left)), _right(std::move(right)) {}
629
class ScalarProductExpression : public ArcExpression {
632
ArcExpression_ptr _expr;
635
Multiset eval(ExpressionContext& context) const override {
636
return _expr->eval(context) * _scalar;
639
void getVariables(std::set<Variable*>& variables) const override {
640
_expr->getVariables(variables);
643
uint32_t weight() const override {
644
return _scalar * _expr->weight();
647
std::string toString() const override {
648
return std::to_string(_scalar) + " * " + _expr->toString();
651
ScalarProductExpression(ArcExpression_ptr&& expr, uint32_t scalar)
652
: _scalar(std::move(scalar)), _expr(expr) {}
657
#endif /* COLORED_EXPRESSIONS_H */