From 6ce4a67e037ef7504dc1549f542887668331fba3 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Tue, 16 Apr 2024 10:52:17 +0200 Subject: [PATCH 01/26] PF and PG quantifiers, for SMC --- include/PQL/Expressions.h | 73 +++++++++++++++++++++++++++++++++++++++ include/PQL/Visitor.h | 6 ++++ src/PQL/Expressions.cpp | 33 ++++++++++++++++++ src/PQL/PQLQueryParser.y | 30 ++++++++++++---- src/PQL/PQLQueryTokens.l | 30 +++++++++------- src/PQL/Visitor.cpp | 9 +++++ 6 files changed, 163 insertions(+), 18 deletions(-) diff --git a/include/PQL/Expressions.h b/include/PQL/Expressions.h index e441db9..37f40db 100644 --- a/include/PQL/Expressions.h +++ b/include/PQL/Expressions.h @@ -153,6 +153,28 @@ namespace unfoldtacpn { std::string _name; }; + class TimeBoundExpr : public Expr { + public: + TimeBoundExpr(int value) : _value(value) {} + void analyze(NamingContext& context) override {}; + void visit(Visitor& visitor) const override; + int getValue() const { return _value; } + void setValue(int value) { _value = value; } + private: + int _value; + }; + + class StepBoundExpr : public Expr { + public: + StepBoundExpr(int value) : _value(value) {} + void analyze(NamingContext& context) override {}; + void visit(Visitor& visitor) const override; + int getValue() const { return _value; } + void setValue(int value) { _value = value; } + private: + int _value; + }; + class ShallowCondition : public Condition { public: @@ -271,6 +293,57 @@ namespace unfoldtacpn { void visit(Visitor&) const override; }; + class ProbaCondition : public SimpleQuantifierCondition { + public: + ProbaCondition(Expr_ptr bound, Condition_ptr cond) + : SimpleQuantifierCondition(cond) { + _bound = bound; + } + void analyze(NamingContext& context) override; + virtual const Expr_ptr& bound() const { return _bound; } + protected: + Expr_ptr _bound; + }; + + class PFCondition : public ProbaCondition { + public: + using ProbaCondition::ProbaCondition; + void visit(Visitor&) const override; + }; + + class PGCondition : public ProbaCondition { + public: + using ProbaCondition::ProbaCondition; + void visit(Visitor&) const override; + }; + + /*class StaticProbaCompCondition : public SimpleQuantifierCondition { + public: + StaticProbaCompCondition(Condition_ptr cond, double comp) + : SimpleQuantifierCondition(cond) { + _comp = comp; + } + void visit(Visitor&) const override; + virtual const double bound() const { return _comp; } + protected: + double _comp; + }; + + class ProbaCompCondition : public QuantifierCondition { + public: + ProbaCompCondition(Condition_ptr cond1, Condition_ptr cond2) { + _cond1 = cond1; + _cond2 = cond2; + } + void visit(Visitor&) const override; + void analyze(NamingContext& context) override; + virtual const Condition_ptr& operator[] (size_t i) const override + { if(i == 0) return _cond1; return _cond2;} + protected: + Condition_ptr _cond1; + Condition_ptr _cond2; + };*/ + /******************** CONDITIONS ********************/ class LogicalCondition : public Condition { public: diff --git a/include/PQL/Visitor.h b/include/PQL/Visitor.h index f65407d..66af668 100644 --- a/include/PQL/Visitor.h +++ b/include/PQL/Visitor.h @@ -55,6 +55,8 @@ namespace unfoldtacpn virtual void _accept(const AXCondition*); virtual void _accept(const EUCondition*); virtual void _accept(const AUCondition*); + virtual void _accept(const PFCondition*); + virtual void _accept(const PGCondition*); // shallow elements, neither of these should exist in a compiled expression virtual void _accept(const KSafeCondition* element); @@ -69,6 +71,10 @@ namespace unfoldtacpn virtual void _accept(const MultiplyExpr* element) = 0; virtual void _accept(const MinusExpr* element) = 0; virtual void _accept(const SubtractExpr* element) = 0; + + // Not used unless for SMC, therefore default implementation (default is error) + virtual void _accept(const TimeBoundExpr* element); + virtual void _accept(const StepBoundExpr* element); // shallow expression, default to error virtual void _accept(const IdentifierExpr* element); diff --git a/src/PQL/Expressions.cpp b/src/PQL/Expressions.cpp index 448ab0b..7d67975 100644 --- a/src/PQL/Expressions.cpp +++ b/src/PQL/Expressions.cpp @@ -98,6 +98,18 @@ namespace unfoldtacpn { _cond2->analyze(context); } + void ProbaCondition::analyze(NamingContext &context) + { + _bound->analyze(context); + _cond->analyze(context); + } + + /*void ProbaCompCondition::analyze(NamingContext &context) + { + _cond1->analyze(context); + _cond2->analyze(context); + }*/ + void LogicalCondition::analyze(NamingContext& context) { for(auto& c : _conds) c->analyze(context); } @@ -170,6 +182,16 @@ namespace unfoldtacpn { ctx.accept(this); } + void PFCondition::visit(Visitor& ctx) const + { + ctx.accept(this); + } + + void PGCondition::visit(Visitor& ctx) const + { + ctx.accept(this); + } + void AndCondition::visit(Visitor& ctx) const { ctx.accept(this); @@ -241,6 +263,17 @@ namespace unfoldtacpn { ctx.accept(this); } + void TimeBoundExpr::visit(Visitor& ctx) const + { + ctx.accept(this); + } + + void StepBoundExpr::visit(Visitor& ctx) const + { + ctx.accept(this); + } + + void MinusExpr::visit(Visitor& ctx) const { ctx.accept(this); diff --git a/src/PQL/PQLQueryParser.y b/src/PQL/PQLQueryParser.y index 84790c2..45c2e1b 100644 --- a/src/PQL/PQLQueryParser.y +++ b/src/PQL/PQLQueryParser.y @@ -24,21 +24,21 @@ void pqlqerror(const char *s) { printf("ERROR: %s\n", s); std::exit(-1); } } /* Terminal type definition */ -%token ID INT -%token DEADLOCK TRUE FALSE -%token LPAREN RPAREN +%token ID INT FLOAT +%token DEADLOCK TRUE FALSE COUNT +%token LPAREN RPAREN LBRACK RBRACK %token AND OR NOT %token EQUAL NEQUAL LESS LESSEQUAL GREATER GREATEREQUAL %token PLUS MINUS MULTIPLY -%token EF AG AF EG CONTROL COLON +%token EF AG AF EG PF PG CONTROL COLON /* Terminal associativity */ %left AND OR %right NOT /* Nonterminal type definition */ -%type expr term factor -%type logic compare query +%type expr term factor bound +%type logic compare query proba /* Operator precedence, more possibly coming */ @@ -56,6 +56,8 @@ query : EF logic { $$ = new EFCondition(Condition_ptr($2)); } | AG logic { $$ = new AGCondition(Condition_ptr($2)); } | EG logic { $$ = new EGCondition(Condition_ptr($2)); } | AF logic { $$ = new AFCondition(Condition_ptr($2)); } +/* | proba_comp { $$ = $1; }*/ + | proba { $$ = $1; } ; logic : logic AND logic { $$ = new AndCondition(Condition_ptr($1), Condition_ptr($3)); } @@ -90,3 +92,19 @@ factor : LPAREN expr RPAREN { $$ = $2; } | INT { $$ = new LiteralExpr(atol($1->c_str())); delete $1; } | ID { $$ = new IdentifierExpr(*$1); delete $1; } ; + +/* +proba_comp + : proba GREATEREQUAL FLOAT { $$ = new StaticProbaCompCondition(Condition_ptr($1), atol($3->c_str())); delete $3; } + | proba GREATEREQUAL proba { $$ = new ProbaCompCondition(Condition_ptr($1), Condition_ptr($3)); } + | proba LESSEQUAL proba { $$ = new ProbaCompCondition(Condition_ptr($3), Condition_ptr($1)); } + ; +*/ + +proba : PF bound logic { $$ = new PFCondition(Expr_ptr($2), Condition_ptr($3)); } + | PG bound logic { $$ = new PGCondition(Expr_ptr($2), Condition_ptr($3)); } + ; + +bound : LBRACK LESSEQUAL INT RBRACK { $$ = new TimeBoundExpr(atol($3->c_str())); delete $3; } + | LBRACK COUNT LESSEQUAL INT RBRACK { $$ = new StepBoundExpr(atol($4->c_str())); delete $4; } + ; \ No newline at end of file diff --git a/src/PQL/PQLQueryTokens.l b/src/PQL/PQLQueryTokens.l index 0b17e8c..a604fef 100644 --- a/src/PQL/PQLQueryTokens.l +++ b/src/PQL/PQLQueryTokens.l @@ -26,24 +26,27 @@ digit [0-9] letter [a-zA-Z_] %% -[ \t\n\r] ; -"true" {return TOKEN(TRUE);} -"false" {return TOKEN(FALSE);} -"deadlock" {return TOKEN(DEADLOCK);} -"and" {return TOKEN(AND);} -"AND" {return TOKEN(AND);} -"or" {return TOKEN(OR);} -"OR" {return TOKEN(OR);} -"not" {return TOKEN(NOT);} -"NOT" {return TOKEN(NOT);} +[ \t\n\r] ; +"true" {return TOKEN(TRUE);} +"false" {return TOKEN(FALSE);} +"deadlock" {return TOKEN(DEADLOCK);} +"and" {return TOKEN(AND);} +"AND" {return TOKEN(AND);} +"or" {return TOKEN(OR);} +"OR" {return TOKEN(OR);} +"not" {return TOKEN(NOT);} +"NOT" {return TOKEN(NOT);} "AG" {return TOKEN(AG);} "EG" {return TOKEN(EG);} "AF" {return TOKEN(AF);} "EF" {return TOKEN(EF);} +"PG" {return TOKEN(PG);} +"PF" {return TOKEN(PF);} "control" {return TOKEN(CONTROL);} {letter}({letter}|{digit})* {SAVE_TOKEN; return ID;} -{digit}+ {SAVE_TOKEN; return INT;} -(\"(\\.|[^"])*\") {SAVE_QUOTED_TOKEN; return ID;} +{digit}+ {SAVE_TOKEN; return INT;} +{digit}+\.{digit}+ {SAVE_TOKEN; return FLOAT;} +(\"(\\.|[^"])*\") {SAVE_QUOTED_TOKEN; return ID;} "&&" {return TOKEN(AND);} "||" {return TOKEN(OR);} "!" {return TOKEN(NOT);} @@ -55,11 +58,14 @@ letter [a-zA-Z_] ">=" {return TOKEN(GREATEREQUAL);} "(" {return TOKEN(LPAREN);} ")" {return TOKEN(RPAREN);} +"[" {return TOKEN(LBRACK);} +"]" {return TOKEN(RBRACK);} "+" {return TOKEN(PLUS);} "-" {return TOKEN(MINUS);} "*" {return TOKEN(MULTIPLY);} "=" {return TOKEN(EQUAL);} ":" {return TOKEN(COLON);} +"#" {return TOKEN(COUNT);} . {printf("Unknown token %s!\n", pqlqtext); yyterminate();} %% diff --git a/src/PQL/Visitor.cpp b/src/PQL/Visitor.cpp index 227fdae..9f5b8a4 100644 --- a/src/PQL/Visitor.cpp +++ b/src/PQL/Visitor.cpp @@ -24,6 +24,10 @@ namespace unfoldtacpn { assert(false); std::cerr << "No accept for EUCondition" << std::endl; exit(0);} void Visitor::_accept(const AUCondition*) { assert(false); std::cerr << "No accept for AUCondition" << std::endl; exit(0);} + void Visitor::_accept(const PFCondition*) + { assert(false); std::cerr << "No accept for PFCondition" << std::endl; exit(0);} + void Visitor::_accept(const PGCondition*) + { assert(false); std::cerr << "No accept for PGCondition" << std::endl; exit(0);} // shallow elements, neither of these should exist in a compiled expression void Visitor::_accept(const KSafeCondition* element) @@ -36,6 +40,11 @@ namespace unfoldtacpn exit(0); } + void Visitor::_accept(const TimeBoundExpr*) + { assert(false); std::cerr << "No accept for PGCondition" << std::endl; exit(0);} + void Visitor::_accept(const StepBoundExpr*) + { assert(false); std::cerr << "No accept for PGCondition" << std::endl; exit(0);} + // shallow expression, default to error void Visitor::_accept(const IdentifierExpr* element) { assert(false); std::cerr << "No accept for IdentifierExpr" << std::endl; exit(0);} From 62a2a9c0d1e2ae576de448a3f76d915b5223935a Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Tue, 16 Apr 2024 11:21:57 +0200 Subject: [PATCH 02/26] Single bound class, simpler to process --- include/PQL/Expressions.h | 19 ++++++------------- include/PQL/Visitor.h | 3 +-- src/PQL/Expressions.cpp | 8 +------- src/PQL/PQLQueryParser.y | 4 ++-- src/PQL/Visitor.cpp | 4 +--- 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/include/PQL/Expressions.h b/include/PQL/Expressions.h index 37f40db..de891a3 100644 --- a/include/PQL/Expressions.h +++ b/include/PQL/Expressions.h @@ -153,25 +153,18 @@ namespace unfoldtacpn { std::string _name; }; - class TimeBoundExpr : public Expr { + enum BoundExprType { TimeBoundExpr, StepBoundExpr }; + class BoundExpr : public Expr { public: - TimeBoundExpr(int value) : _value(value) {} - void analyze(NamingContext& context) override {}; - void visit(Visitor& visitor) const override; - int getValue() const { return _value; } - void setValue(int value) { _value = value; } - private: - int _value; - }; - - class StepBoundExpr : public Expr { - public: - StepBoundExpr(int value) : _value(value) {} + BoundExpr(BoundExprType type, int value) : _type(type), _value(value) {} void analyze(NamingContext& context) override {}; void visit(Visitor& visitor) const override; int getValue() const { return _value; } void setValue(int value) { _value = value; } + BoundExprType getType() const { return _type; } + void setType(BoundExprType type) { _type = type; } private: + BoundExprType _type; int _value; }; diff --git a/include/PQL/Visitor.h b/include/PQL/Visitor.h index 66af668..4967d77 100644 --- a/include/PQL/Visitor.h +++ b/include/PQL/Visitor.h @@ -73,8 +73,7 @@ namespace unfoldtacpn virtual void _accept(const SubtractExpr* element) = 0; // Not used unless for SMC, therefore default implementation (default is error) - virtual void _accept(const TimeBoundExpr* element); - virtual void _accept(const StepBoundExpr* element); + virtual void _accept(const BoundExpr* element); // shallow expression, default to error virtual void _accept(const IdentifierExpr* element); diff --git a/src/PQL/Expressions.cpp b/src/PQL/Expressions.cpp index 7d67975..a35edd4 100644 --- a/src/PQL/Expressions.cpp +++ b/src/PQL/Expressions.cpp @@ -263,17 +263,11 @@ namespace unfoldtacpn { ctx.accept(this); } - void TimeBoundExpr::visit(Visitor& ctx) const + void BoundExpr::visit(Visitor& ctx) const { ctx.accept(this); } - void StepBoundExpr::visit(Visitor& ctx) const - { - ctx.accept(this); - } - - void MinusExpr::visit(Visitor& ctx) const { ctx.accept(this); diff --git a/src/PQL/PQLQueryParser.y b/src/PQL/PQLQueryParser.y index 45c2e1b..72fc153 100644 --- a/src/PQL/PQLQueryParser.y +++ b/src/PQL/PQLQueryParser.y @@ -105,6 +105,6 @@ proba : PF bound logic { $$ = new PFCondition(Expr_ptr($2), Condition_ptr($3) | PG bound logic { $$ = new PGCondition(Expr_ptr($2), Condition_ptr($3)); } ; -bound : LBRACK LESSEQUAL INT RBRACK { $$ = new TimeBoundExpr(atol($3->c_str())); delete $3; } - | LBRACK COUNT LESSEQUAL INT RBRACK { $$ = new StepBoundExpr(atol($4->c_str())); delete $4; } +bound : LBRACK LESSEQUAL INT RBRACK { $$ = new BoundExpr(TimeBoundExpr, atol($3->c_str())); delete $3; } + | LBRACK COUNT LESSEQUAL INT RBRACK { $$ = new BoundExpr(StepBoundExpr, atol($4->c_str())); delete $4; } ; \ No newline at end of file diff --git a/src/PQL/Visitor.cpp b/src/PQL/Visitor.cpp index 9f5b8a4..6f516f2 100644 --- a/src/PQL/Visitor.cpp +++ b/src/PQL/Visitor.cpp @@ -40,9 +40,7 @@ namespace unfoldtacpn exit(0); } - void Visitor::_accept(const TimeBoundExpr*) - { assert(false); std::cerr << "No accept for PGCondition" << std::endl; exit(0);} - void Visitor::_accept(const StepBoundExpr*) + void Visitor::_accept(const BoundExpr*) { assert(false); std::cerr << "No accept for PGCondition" << std::endl; exit(0);} // shallow expression, default to error From 063339d7672fb08402d92882e53a7b88ad74bc7c Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Tue, 16 Apr 2024 13:04:40 +0200 Subject: [PATCH 03/26] BoundExpr fix --- include/PQL/Expressions.h | 9 +++++---- src/PQL/Expressions.cpp | 12 ++++++------ src/PQL/PQLQueryParser.y | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/PQL/Expressions.h b/include/PQL/Expressions.h index de891a3..f50d122 100644 --- a/include/PQL/Expressions.h +++ b/include/PQL/Expressions.h @@ -288,14 +288,15 @@ namespace unfoldtacpn { class ProbaCondition : public SimpleQuantifierCondition { public: - ProbaCondition(Expr_ptr bound, Condition_ptr cond) + ProbaCondition(Expr* bound, Condition_ptr cond) : SimpleQuantifierCondition(cond) { - _bound = bound; + _bound = (BoundExpr*) bound; } + ~ProbaCondition() { delete _bound; } void analyze(NamingContext& context) override; - virtual const Expr_ptr& bound() const { return _bound; } + virtual const BoundExpr* bound() const { return _bound; } protected: - Expr_ptr _bound; + BoundExpr* _bound; }; class PFCondition : public ProbaCondition { diff --git a/src/PQL/Expressions.cpp b/src/PQL/Expressions.cpp index a35edd4..6550bbe 100644 --- a/src/PQL/Expressions.cpp +++ b/src/PQL/Expressions.cpp @@ -261,12 +261,7 @@ namespace unfoldtacpn { void UnfoldedIdentifierExpr::visit(Visitor& ctx) const { ctx.accept(this); - } - - void BoundExpr::visit(Visitor& ctx) const - { - ctx.accept(this); - } + } void MinusExpr::visit(Visitor& ctx) const { @@ -288,6 +283,11 @@ namespace unfoldtacpn { ctx.accept(this); } + void BoundExpr::visit(Visitor& ctx) const + { + ctx.accept(this); + } + /********************** CONSTRUCTORS *********************************/ AndCondition::AndCondition(std::vector&& conds) { diff --git a/src/PQL/PQLQueryParser.y b/src/PQL/PQLQueryParser.y index 72fc153..b8d07b0 100644 --- a/src/PQL/PQLQueryParser.y +++ b/src/PQL/PQLQueryParser.y @@ -101,8 +101,8 @@ proba_comp ; */ -proba : PF bound logic { $$ = new PFCondition(Expr_ptr($2), Condition_ptr($3)); } - | PG bound logic { $$ = new PGCondition(Expr_ptr($2), Condition_ptr($3)); } +proba : PF bound logic { $$ = new PFCondition($2, Condition_ptr($3)); } + | PG bound logic { $$ = new PGCondition($2, Condition_ptr($3)); } ; bound : LBRACK LESSEQUAL INT RBRACK { $$ = new BoundExpr(TimeBoundExpr, atol($3->c_str())); delete $3; } From 6b432f695c087889627e07f19d9d78db795f61fd Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 17 Apr 2024 09:19:29 +0200 Subject: [PATCH 04/26] Rate parameter for transitions --- include/Colored/ColoredNetStructures.h | 1 + include/Colored/ColoredPetriNetBuilder.h | 3 ++- src/Colored/ColoredPetriNetBuilder.cpp | 5 +++-- src/PetriParse/PNMLParser.cpp | 7 ++++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index 877fb33..8236eaf 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -52,6 +52,7 @@ namespace unfoldtacpn { bool urgent; std::vector arcs; std::vector transport; + float probabilityRate = -1; }; struct Place { diff --git a/include/Colored/ColoredPetriNetBuilder.h b/include/Colored/ColoredPetriNetBuilder.h index 6ad0b12..149a56b 100644 --- a/include/Colored/ColoredPetriNetBuilder.h +++ b/include/Colored/ColoredPetriNetBuilder.h @@ -39,7 +39,8 @@ namespace unfoldtacpn { int player, bool urgent, double x, - double y); + double y, + float rate = -1); void addArc(const std::string& source, const std::string& target, int weight, bool inhibitor, const unfoldtacpn::Colored::ArcExpression_ptr &expr, const std::vector& intervals); diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index 7e86b51..65fab85 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -61,10 +61,11 @@ namespace unfoldtacpn { int player, bool urgent, double x, - double y) { + double y, + float rate) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); - _transitions.emplace_back(Colored::Transition {name, guard, player, urgent}); + _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, .probabilityRate = rate}); _transitionnames[name] = next; _transitionlocations.push_back(std::tuple(x,y)); } diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index ef584fb..4f8edfa 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -771,6 +771,7 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { double x = 0, y = 0; bool urgent = false; int player = 0; + float rate = -1; unfoldtacpn::Colored::GuardExpression_ptr expr = nullptr; auto name = element->first_attribute("id")->value(); @@ -792,6 +793,10 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { player = atoi(pl_el->value()); } + auto rate_el = element->first_attribute("rate"); + if(rate_el != nullptr) { + rate = atof(rate_el->value()); + } for (auto it = element->first_node(); it; it = it->next_sibling()) { if (strcmp(it->name(), "graphics") == 0) { @@ -806,7 +811,7 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { exit(ErrorCode); } } - _builder->addTransition(name, expr, player, urgent, x, y); + _builder->addTransition(name, expr, player, urgent, x, y, rate); } void PNMLParser::parseValue(rapidxml::xml_node<>* element, std::string& text) { From d8aad38e46ed445090f142f6079415073fe1e615 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 17 Apr 2024 09:21:49 +0200 Subject: [PATCH 05/26] Removed named field initialization for compatibility <= CPP20 --- include/Colored/ColoredNetStructures.h | 2 +- src/Colored/ColoredPetriNetBuilder.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index 8236eaf..faea265 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -50,9 +50,9 @@ namespace unfoldtacpn { GuardExpression_ptr guard; int player; bool urgent; + float probabilityRate = -1; std::vector arcs; std::vector transport; - float probabilityRate = -1; }; struct Place { diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index 65fab85..d22db27 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -65,7 +65,7 @@ namespace unfoldtacpn { float rate) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); - _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, .probabilityRate = rate}); + _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, rate}); _transitionnames[name] = next; _transitionlocations.push_back(std::tuple(x,y)); } From 043a260826df49ad54583267f732ef9a9204da51 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 17 Apr 2024 09:21:49 +0200 Subject: [PATCH 06/26] Removed named field initialization for compatibility <= CPP20 --- include/Colored/ColoredNetStructures.h | 2 +- include/TAPNBuilderInterface.h | 2 +- src/Colored/ColoredPetriNetBuilder.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index 8236eaf..faea265 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -50,9 +50,9 @@ namespace unfoldtacpn { GuardExpression_ptr guard; int player; bool urgent; + float probabilityRate = -1; std::vector arcs; std::vector transport; - float probabilityRate = -1; }; struct Place { diff --git a/include/TAPNBuilderInterface.h b/include/TAPNBuilderInterface.h index 7f3b72f..1980470 100644 --- a/include/TAPNBuilderInterface.h +++ b/include/TAPNBuilderInterface.h @@ -39,7 +39,7 @@ namespace unfoldtacpn { // add a time transition with a unique name virtual void addTransition(const std::string &name, int player, bool urgent, - double, double) = 0; + double, double, float = -1) = 0; /* Add timed colored input arc with given arc expression*/ virtual void addInputArc(const std::string &place, diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index 65fab85..d22db27 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -65,7 +65,7 @@ namespace unfoldtacpn { float rate) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); - _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, .probabilityRate = rate}); + _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, rate}); _transitionnames[name] = next; _transitionlocations.push_back(std::tuple(x,y)); } From 6a65387a0b3d3059865c4a489cc33aed76999a7d Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 17 Apr 2024 09:57:56 +0200 Subject: [PATCH 07/26] Forgot rate implementation in unfolder --- src/Colored/ColoredPetriNetBuilder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index d22db27..fd4cb7a 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -315,7 +315,7 @@ namespace unfoldtacpn { (*_output_stream) << " \n"; } - builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset); + builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, transition.probabilityRate); _pttransitionnames[transition.name].push_back(name); for (auto& arc : transition.arcs) { unfoldArc(builder, arc, b, name); From f2431ba4ee5879c78fd8f88d27748bd7d2298a8d Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Tue, 23 Apr 2024 08:48:33 +0200 Subject: [PATCH 08/26] Support for PF and PG XML queries --- src/PetriParse/QueryXMLParser.cpp | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index 2bdfeb1..4841eae 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -338,6 +338,40 @@ Condition_ptr QueryXMLParser::parseBooleanFormula(rapidxml::xml_node<>* element return std::make_shared(cond); } } + } else if (elementName == "probability") { + if(getChildCount(element) != 2) { + assert(false); + return nullptr; + } + auto children = element->first_node(); + int i; + if (sscanf(children->value(), "%d", &i) == EOF) + { + assert(false); + return nullptr; + } + Expr* bound; + if(strcmp(children->name(), "time-bound") == 0) { + bound = new BoundExpr(TimeBoundExpr, i); + } else if(strcmp(children->name(), "step-bound") == 0) { + bound = new BoundExpr(StepBoundExpr, i); + } else { + assert(false); + return nullptr; + } + children = children->next_sibling(); + if(strcmp(children->name(), "finally") == 0) { + if ((cond = parseBooleanFormula(children->first_node())) != nullptr) { + return std::make_shared(bound, cond); + } + } else if(strcmp(children->name(), "globally") == 0) { + if ((cond = parseBooleanFormula(children->first_node())) != nullptr) { + return std::make_shared(bound, cond); + } + } else { + assert(false); + return nullptr; + } } else if (elementName == "conjunction") { auto children = element->first_node(); if (getChildCount(element) < 2) From 959cb1610a5e915a690b4ca1787a5dfafb88c9df Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 1 May 2024 10:04:33 +0200 Subject: [PATCH 09/26] Support for SMC settings inside Query XML, deprecated PQL SMC parsing --- include/PQL/Expressions.h | 37 +++++----- include/PQL/Visitor.h | 3 - include/PetriParse/QueryXMLParser.h | 4 + src/PQL/Expressions.cpp | 6 -- src/PQL/PQLQueryParser.y | 22 +----- src/PQL/Visitor.cpp | 3 - src/PetriParse/QueryXMLParser.cpp | 109 +++++++++++++++++++--------- 7 files changed, 96 insertions(+), 88 deletions(-) diff --git a/include/PQL/Expressions.h b/include/PQL/Expressions.h index f50d122..d8e1320 100644 --- a/include/PQL/Expressions.h +++ b/include/PQL/Expressions.h @@ -153,21 +153,6 @@ namespace unfoldtacpn { std::string _name; }; - enum BoundExprType { TimeBoundExpr, StepBoundExpr }; - class BoundExpr : public Expr { - public: - BoundExpr(BoundExprType type, int value) : _type(type), _value(value) {} - void analyze(NamingContext& context) override {}; - void visit(Visitor& visitor) const override; - int getValue() const { return _value; } - void setValue(int value) { _value = value; } - BoundExprType getType() const { return _type; } - void setType(BoundExprType type) { _type = type; } - private: - BoundExprType _type; - int _value; - }; - class ShallowCondition : public Condition { public: @@ -286,17 +271,29 @@ namespace unfoldtacpn { void visit(Visitor&) const override; }; + struct SMCSettings { + enum SMCBoundType { TimeBound, StepBound }; + SMCBoundType boundType; + int bound; + float falsePositives; + float falseNegatives; + float indifferenceRegionUp; + float indifferenceRegionDown; + float defaultRate; + float confidence; + float estimationIntervalWidth; + }; + class ProbaCondition : public SimpleQuantifierCondition { public: - ProbaCondition(Expr* bound, Condition_ptr cond) + ProbaCondition(SMCSettings settings, Condition_ptr cond) : SimpleQuantifierCondition(cond) { - _bound = (BoundExpr*) bound; + _settings = settings; } - ~ProbaCondition() { delete _bound; } void analyze(NamingContext& context) override; - virtual const BoundExpr* bound() const { return _bound; } + virtual const SMCSettings settings() const { return _settings; } protected: - BoundExpr* _bound; + SMCSettings _settings; }; class PFCondition : public ProbaCondition { diff --git a/include/PQL/Visitor.h b/include/PQL/Visitor.h index 4967d77..f43486c 100644 --- a/include/PQL/Visitor.h +++ b/include/PQL/Visitor.h @@ -71,9 +71,6 @@ namespace unfoldtacpn virtual void _accept(const MultiplyExpr* element) = 0; virtual void _accept(const MinusExpr* element) = 0; virtual void _accept(const SubtractExpr* element) = 0; - - // Not used unless for SMC, therefore default implementation (default is error) - virtual void _accept(const BoundExpr* element); // shallow expression, default to error virtual void _accept(const IdentifierExpr* element); diff --git a/include/PetriParse/QueryXMLParser.h b/include/PetriParse/QueryXMLParser.h index 66afefd..7d55d11 100644 --- a/include/PetriParse/QueryXMLParser.h +++ b/include/PetriParse/QueryXMLParser.h @@ -30,6 +30,8 @@ #include "PNMLParser.h" #include "QueryParser.h" +#include "PQL/Expressions.h" + using namespace unfoldtacpn::PQL; class QueryXMLParser { @@ -47,6 +49,8 @@ class QueryXMLParser { bool parseTags(rapidxml::xml_node<>* element); Condition_ptr parseFormula(rapidxml::xml_node<>* element); Condition_ptr parseBooleanFormula(rapidxml::xml_node<>* element); + SMCSettings parseSmcSettings(rapidxml::xml_node<>* smcNode); + Condition_ptr parseSmcFormula(SMCSettings settings, rapidxml::xml_node<>* element); Expr_ptr parseIntegerExpression(rapidxml::xml_node<>* element); std::string parsePlace(rapidxml::xml_node<>* element); void fatal_error(const std::string& token); diff --git a/src/PQL/Expressions.cpp b/src/PQL/Expressions.cpp index 6550bbe..a837d99 100644 --- a/src/PQL/Expressions.cpp +++ b/src/PQL/Expressions.cpp @@ -100,7 +100,6 @@ namespace unfoldtacpn { void ProbaCondition::analyze(NamingContext &context) { - _bound->analyze(context); _cond->analyze(context); } @@ -283,11 +282,6 @@ namespace unfoldtacpn { ctx.accept(this); } - void BoundExpr::visit(Visitor& ctx) const - { - ctx.accept(this); - } - /********************** CONSTRUCTORS *********************************/ AndCondition::AndCondition(std::vector&& conds) { diff --git a/src/PQL/PQLQueryParser.y b/src/PQL/PQLQueryParser.y index b8d07b0..d48adc1 100644 --- a/src/PQL/PQLQueryParser.y +++ b/src/PQL/PQLQueryParser.y @@ -37,8 +37,8 @@ void pqlqerror(const char *s) { printf("ERROR: %s\n", s); std::exit(-1); } %right NOT /* Nonterminal type definition */ -%type expr term factor bound -%type logic compare query proba +%type expr term factor +%type logic compare query /* Operator precedence, more possibly coming */ @@ -56,8 +56,6 @@ query : EF logic { $$ = new EFCondition(Condition_ptr($2)); } | AG logic { $$ = new AGCondition(Condition_ptr($2)); } | EG logic { $$ = new EGCondition(Condition_ptr($2)); } | AF logic { $$ = new AFCondition(Condition_ptr($2)); } -/* | proba_comp { $$ = $1; }*/ - | proba { $$ = $1; } ; logic : logic AND logic { $$ = new AndCondition(Condition_ptr($1), Condition_ptr($3)); } @@ -91,20 +89,4 @@ term : term MULTIPLY factor { $$ = new MultiplyExpr(std::vector({Expr_ factor : LPAREN expr RPAREN { $$ = $2; } | INT { $$ = new LiteralExpr(atol($1->c_str())); delete $1; } | ID { $$ = new IdentifierExpr(*$1); delete $1; } - ; - -/* -proba_comp - : proba GREATEREQUAL FLOAT { $$ = new StaticProbaCompCondition(Condition_ptr($1), atol($3->c_str())); delete $3; } - | proba GREATEREQUAL proba { $$ = new ProbaCompCondition(Condition_ptr($1), Condition_ptr($3)); } - | proba LESSEQUAL proba { $$ = new ProbaCompCondition(Condition_ptr($3), Condition_ptr($1)); } - ; -*/ - -proba : PF bound logic { $$ = new PFCondition($2, Condition_ptr($3)); } - | PG bound logic { $$ = new PGCondition($2, Condition_ptr($3)); } - ; - -bound : LBRACK LESSEQUAL INT RBRACK { $$ = new BoundExpr(TimeBoundExpr, atol($3->c_str())); delete $3; } - | LBRACK COUNT LESSEQUAL INT RBRACK { $$ = new BoundExpr(StepBoundExpr, atol($4->c_str())); delete $4; } ; \ No newline at end of file diff --git a/src/PQL/Visitor.cpp b/src/PQL/Visitor.cpp index 6f516f2..e86e301 100644 --- a/src/PQL/Visitor.cpp +++ b/src/PQL/Visitor.cpp @@ -40,9 +40,6 @@ namespace unfoldtacpn exit(0); } - void Visitor::_accept(const BoundExpr*) - { assert(false); std::cerr << "No accept for PGCondition" << std::endl; exit(0);} - // shallow expression, default to error void Visitor::_accept(const IdentifierExpr* element) { assert(false); std::cerr << "No accept for IdentifierExpr" << std::endl; exit(0);} diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index 4841eae..8df65d4 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -94,6 +94,7 @@ bool QueryXMLParser::parseProperty(rapidxml::xml_node<>* element) { string id; bool tagsOK = true; rapidxml::xml_node<>* formulaPtr = nullptr; + rapidxml::xml_node<>* smcPtr = nullptr; for (auto it = element->first_node(); it; it = it->next_sibling()) { if (strcmp(it->name(), "id") == 0) { id = it->value(); @@ -101,6 +102,8 @@ bool QueryXMLParser::parseProperty(rapidxml::xml_node<>* element) { formulaPtr = it; } else if (strcmp(it->name(), "tags") == 0) { tagsOK = parseTags(it); + } else if (strcmp(it->name(), "smc") == 0) { + smcPtr = it; } } @@ -111,11 +114,15 @@ bool QueryXMLParser::parseProperty(rapidxml::xml_node<>* element) { QueryItem queryItem; queryItem.id = id; - if(tagsOK) - { + if(tagsOK && smcPtr == nullptr) { queryItem.query = parseFormula(formulaPtr); assert(queryItem.query); queryItem.parsingResult = QueryItem::PARSING_OK; + } else if(tagsOK && smcPtr != nullptr) { + SMCSettings settings = parseSmcSettings(smcPtr); + queryItem.query = parseSmcFormula(settings, formulaPtr); + assert(queryItem.query); + queryItem.parsingResult = QueryItem::PARSING_OK; } else { queryItem.query = nullptr; queryItem.parsingResult = QueryItem::UNSUPPORTED_QUERY; @@ -338,40 +345,6 @@ Condition_ptr QueryXMLParser::parseBooleanFormula(rapidxml::xml_node<>* element return std::make_shared(cond); } } - } else if (elementName == "probability") { - if(getChildCount(element) != 2) { - assert(false); - return nullptr; - } - auto children = element->first_node(); - int i; - if (sscanf(children->value(), "%d", &i) == EOF) - { - assert(false); - return nullptr; - } - Expr* bound; - if(strcmp(children->name(), "time-bound") == 0) { - bound = new BoundExpr(TimeBoundExpr, i); - } else if(strcmp(children->name(), "step-bound") == 0) { - bound = new BoundExpr(StepBoundExpr, i); - } else { - assert(false); - return nullptr; - } - children = children->next_sibling(); - if(strcmp(children->name(), "finally") == 0) { - if ((cond = parseBooleanFormula(children->first_node())) != nullptr) { - return std::make_shared(bound, cond); - } - } else if(strcmp(children->name(), "globally") == 0) { - if ((cond = parseBooleanFormula(children->first_node())) != nullptr) { - return std::make_shared(bound, cond); - } - } else { - assert(false); - return nullptr; - } } else if (elementName == "conjunction") { auto children = element->first_node(); if (getChildCount(element) < 2) @@ -484,6 +457,70 @@ Condition_ptr QueryXMLParser::parseBooleanFormula(rapidxml::xml_node<>* element return nullptr; } +SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { + SMCSettings settings { + SMCSettings::StepBound, 100, + 0.05f, 0.05f, + 0.05f, 0.05f, + 0.1f, + 0.95f, 0.05f + }; + auto boundType = smcNode->first_attribute("bound-type"); + if(boundType != nullptr) + settings.boundType = strcmp(boundType->value(), "time") == 0 ? SMCSettings::TimeBound : SMCSettings::StepBound; + auto boundValue = smcNode->first_attribute("bound"); + if(boundValue != nullptr) + settings.bound = atoi(boundValue->value()); + auto falsePos = smcNode->first_attribute("false-positives"); + if(falsePos != nullptr) + settings.falsePositives = atof(falsePos->value()); + auto falseNeg = smcNode->first_attribute("false-negatives"); + if(falseNeg != nullptr) + settings.falseNegatives = atof(falseNeg->value()); + auto indifference = smcNode->first_attribute("indifference"); + if(indifference != nullptr) { + settings.indifferenceRegionDown = atof(indifference->value()); + settings.indifferenceRegionUp = atof(indifference->value()); + } + auto defaultRate = smcNode->first_attribute("default-rate"); + if(defaultRate != nullptr) + settings.defaultRate = atof(defaultRate->value()); + auto confidence = smcNode->first_attribute("confidence"); + if(confidence != nullptr) + settings.confidence = atof(confidence->value()); + auto intervalWidth = smcNode->first_attribute("interval-width"); + if(intervalWidth != nullptr) + settings.estimationIntervalWidth = atof(intervalWidth->value()); + return settings; +} + +Condition_ptr QueryXMLParser::parseSmcFormula(SMCSettings settings, rapidxml::xml_node<>* element) { + if (getChildCount(element) != 1) { + assert(false); + return nullptr; + } + auto child = element->first_node(); + string childName = child->name(); + Condition_ptr cond = nullptr; + if(childName == "finally") { + if (getChildCount(child) != 1) { + assert(false); + return nullptr; + } + if ((cond = parseBooleanFormula(child->first_node())) != nullptr) + return std::make_shared(settings, cond); + } else if(childName == "globally") { + if (getChildCount(child) != 1) { + assert(false); + return nullptr; + } + if ((cond = parseBooleanFormula(child->first_node())) != nullptr) + return std::make_shared(settings, cond); + } + assert(false); + return nullptr; +} + Expr_ptr QueryXMLParser::parseIntegerExpression(rapidxml::xml_node<>* element) { string elementName = element->name(); if (elementName == "integer-constant") { From 9f12822384b156263ab4faa5b6c182308aa5b338 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 1 May 2024 10:40:39 +0200 Subject: [PATCH 10/26] Moved SMC conditions to separate file for clarity --- include/PQL/Expressions.h | 64 ----------------------------- include/PQL/SMCExpressions.h | 47 +++++++++++++++++++++ include/PQL/Visitor.h | 1 + include/PetriParse/QueryXMLParser.h | 2 +- src/CMakeLists.txt | 2 +- src/PQL/CMakeLists.txt | 2 +- src/PQL/Expressions.cpp | 15 ------- src/PQL/SMCExpressions.cpp | 25 +++++++++++ src/PetriParse/QueryXMLParser.cpp | 1 + 9 files changed, 77 insertions(+), 82 deletions(-) create mode 100644 include/PQL/SMCExpressions.h create mode 100644 src/PQL/SMCExpressions.cpp diff --git a/include/PQL/Expressions.h b/include/PQL/Expressions.h index d8e1320..e441db9 100644 --- a/include/PQL/Expressions.h +++ b/include/PQL/Expressions.h @@ -271,70 +271,6 @@ namespace unfoldtacpn { void visit(Visitor&) const override; }; - struct SMCSettings { - enum SMCBoundType { TimeBound, StepBound }; - SMCBoundType boundType; - int bound; - float falsePositives; - float falseNegatives; - float indifferenceRegionUp; - float indifferenceRegionDown; - float defaultRate; - float confidence; - float estimationIntervalWidth; - }; - - class ProbaCondition : public SimpleQuantifierCondition { - public: - ProbaCondition(SMCSettings settings, Condition_ptr cond) - : SimpleQuantifierCondition(cond) { - _settings = settings; - } - void analyze(NamingContext& context) override; - virtual const SMCSettings settings() const { return _settings; } - protected: - SMCSettings _settings; - }; - - class PFCondition : public ProbaCondition { - public: - using ProbaCondition::ProbaCondition; - void visit(Visitor&) const override; - }; - - class PGCondition : public ProbaCondition { - public: - using ProbaCondition::ProbaCondition; - void visit(Visitor&) const override; - }; - - /*class StaticProbaCompCondition : public SimpleQuantifierCondition { - public: - StaticProbaCompCondition(Condition_ptr cond, double comp) - : SimpleQuantifierCondition(cond) { - _comp = comp; - } - void visit(Visitor&) const override; - virtual const double bound() const { return _comp; } - protected: - double _comp; - }; - - class ProbaCompCondition : public QuantifierCondition { - public: - ProbaCompCondition(Condition_ptr cond1, Condition_ptr cond2) { - _cond1 = cond1; - _cond2 = cond2; - } - void visit(Visitor&) const override; - void analyze(NamingContext& context) override; - virtual const Condition_ptr& operator[] (size_t i) const override - { if(i == 0) return _cond1; return _cond2;} - protected: - Condition_ptr _cond1; - Condition_ptr _cond2; - };*/ - /******************** CONDITIONS ********************/ class LogicalCondition : public Condition { public: diff --git a/include/PQL/SMCExpressions.h b/include/PQL/SMCExpressions.h new file mode 100644 index 0000000..a74cbf1 --- /dev/null +++ b/include/PQL/SMCExpressions.h @@ -0,0 +1,47 @@ +#ifndef SMCEXPRESSIONS_H +#define SMCEXPRESSIONS_H + +#include "Expressions.h" + +namespace unfoldtacpn::PQL { + + struct SMCSettings { + enum SMCBoundType { TimeBound, StepBound }; + SMCBoundType boundType; + int bound; + float falsePositives; + float falseNegatives; + float indifferenceRegionUp; + float indifferenceRegionDown; + float defaultRate; + float confidence; + float estimationIntervalWidth; + }; + + class ProbaCondition : public SimpleQuantifierCondition { + public: + ProbaCondition(SMCSettings settings, Condition_ptr cond) + : SimpleQuantifierCondition(cond) { + _settings = settings; + } + void analyze(NamingContext& context) override; + virtual const SMCSettings settings() const { return _settings; } + protected: + SMCSettings _settings; + }; + + class PFCondition : public ProbaCondition { + public: + using ProbaCondition::ProbaCondition; + void visit(Visitor&) const override; + }; + + class PGCondition : public ProbaCondition { + public: + using ProbaCondition::ProbaCondition; + void visit(Visitor&) const override; + }; + +} + +#endif \ No newline at end of file diff --git a/include/PQL/Visitor.h b/include/PQL/Visitor.h index f43486c..145f4d1 100644 --- a/include/PQL/Visitor.h +++ b/include/PQL/Visitor.h @@ -13,6 +13,7 @@ #define VISITOR_H #include "PQL/Expressions.h" +#include "PQL/SMCExpressions.h" #include #include diff --git a/include/PetriParse/QueryXMLParser.h b/include/PetriParse/QueryXMLParser.h index 7d55d11..3f10f09 100644 --- a/include/PetriParse/QueryXMLParser.h +++ b/include/PetriParse/QueryXMLParser.h @@ -30,7 +30,7 @@ #include "PNMLParser.h" #include "QueryParser.h" -#include "PQL/Expressions.h" +#include "PQL/SMCExpressions.h" using namespace unfoldtacpn::PQL; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bb1c258..ef7a4b3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,7 +15,7 @@ install(TARGETS unfoldtacpn PQL Colored PetriParse ARCHIVE DESTINATION lib/unfoldtacpn) install(FILES ../include/unfoldtacpn.h ../include/TAPNBuilderInterface.h DESTINATION include/) -install(FILES ../include/PQL/PQL.h ../include/PQL/Visitor.h ../include/PQL/Expressions.h DESTINATION include/PQL/) +install(FILES ../include/PQL/PQL.h ../include/PQL/Visitor.h ../include/PQL/Expressions.h ../include/PQL/SMCExpressions.h DESTINATION include/PQL/) install(FILES ../include/Colored/ColoredNetStructures.h ../include/Colored/ColoredPetriNetBuilder.h ../include/Colored/Colors.h diff --git a/src/PQL/CMakeLists.txt b/src/PQL/CMakeLists.txt index bd6fe84..b43d176 100644 --- a/src/PQL/CMakeLists.txt +++ b/src/PQL/CMakeLists.txt @@ -8,5 +8,5 @@ bison_target(pql_parser "${CMAKE_CURRENT_SOURCE_DIR}/PQLQueryParser.y" add_flex_bison_dependency(pql_lexer pql_parser) -add_library(PQL OBJECT ${BISON_pql_parser_OUTPUTS} ${FLEX_pql_lexer_OUTPUTS} Expressions.cpp PQL.cpp Contexts.cpp XMLPrinter.cpp Visitor.cpp) +add_library(PQL OBJECT ${BISON_pql_parser_OUTPUTS} ${FLEX_pql_lexer_OUTPUTS} Expressions.cpp PQL.cpp Contexts.cpp XMLPrinter.cpp Visitor.cpp SMCExpressions.cpp) diff --git a/src/PQL/Expressions.cpp b/src/PQL/Expressions.cpp index a837d99..e90a5ce 100644 --- a/src/PQL/Expressions.cpp +++ b/src/PQL/Expressions.cpp @@ -98,11 +98,6 @@ namespace unfoldtacpn { _cond2->analyze(context); } - void ProbaCondition::analyze(NamingContext &context) - { - _cond->analyze(context); - } - /*void ProbaCompCondition::analyze(NamingContext &context) { _cond1->analyze(context); @@ -181,16 +176,6 @@ namespace unfoldtacpn { ctx.accept(this); } - void PFCondition::visit(Visitor& ctx) const - { - ctx.accept(this); - } - - void PGCondition::visit(Visitor& ctx) const - { - ctx.accept(this); - } - void AndCondition::visit(Visitor& ctx) const { ctx.accept(this); diff --git a/src/PQL/SMCExpressions.cpp b/src/PQL/SMCExpressions.cpp new file mode 100644 index 0000000..9fbbc21 --- /dev/null +++ b/src/PQL/SMCExpressions.cpp @@ -0,0 +1,25 @@ +#include "PQL/SMCExpressions.h" + +#include "PQL/Contexts.h" +#include "PQL/Expressions.h" +#include "errorcodes.h" +#include "PQL/Visitor.h" + +namespace unfoldtacpn::PQL { + + void ProbaCondition::analyze(NamingContext &context) + { + _cond->analyze(context); + } + + void PFCondition::visit(Visitor& ctx) const + { + ctx.accept(this); + } + + void PGCondition::visit(Visitor& ctx) const + { + ctx.accept(this); + } + +} \ No newline at end of file diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index 8df65d4..c102c5a 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -18,6 +18,7 @@ #include "PetriParse/QueryXMLParser.h" #include "PQL/Expressions.h" +#include "PQL/SMCExpressions.h" #include "errorcodes.h" #include From 60e5996fc36f665d2c4aa583286bcae735c6cd71 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Thu, 2 May 2024 08:37:13 +0200 Subject: [PATCH 11/26] Support for SMC comparison to floats --- include/PQL/SMCExpressions.h | 2 ++ src/PetriParse/QueryXMLParser.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/PQL/SMCExpressions.h b/include/PQL/SMCExpressions.h index a74cbf1..b6d5179 100644 --- a/include/PQL/SMCExpressions.h +++ b/include/PQL/SMCExpressions.h @@ -16,6 +16,8 @@ namespace unfoldtacpn::PQL { float defaultRate; float confidence; float estimationIntervalWidth; + bool compareToFloat; + float geqThan; }; class ProbaCondition : public SimpleQuantifierCondition { diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index c102c5a..ce671c8 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -464,7 +464,8 @@ SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { 0.05f, 0.05f, 0.05f, 0.05f, 0.1f, - 0.95f, 0.05f + 0.95f, 0.05f, + false, 0.0f }; auto boundType = smcNode->first_attribute("bound-type"); if(boundType != nullptr) @@ -492,6 +493,11 @@ SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { auto intervalWidth = smcNode->first_attribute("interval-width"); if(intervalWidth != nullptr) settings.estimationIntervalWidth = atof(intervalWidth->value()); + auto compareToF = smcNode->first_attribute("compare-to"); + if(compareToF != nullptr) { + settings.compareToFloat = true; + settings.geqThan = atof(compareToF->value()); + } return settings; } From 607e7e21ac03bc64cf409c0aae6438b24b65ea56 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Wed, 8 May 2024 14:12:47 +0200 Subject: [PATCH 12/26] Support for smc semantics parameter parsing --- include/PQL/SMCExpressions.h | 2 ++ src/PetriParse/QueryXMLParser.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/PQL/SMCExpressions.h b/include/PQL/SMCExpressions.h index b6d5179..41f8d4a 100644 --- a/include/PQL/SMCExpressions.h +++ b/include/PQL/SMCExpressions.h @@ -7,6 +7,7 @@ namespace unfoldtacpn::PQL { struct SMCSettings { enum SMCBoundType { TimeBound, StepBound }; + enum SMCSemantics { Weak, Strong }; SMCBoundType boundType; int bound; float falsePositives; @@ -18,6 +19,7 @@ namespace unfoldtacpn::PQL { float estimationIntervalWidth; bool compareToFloat; float geqThan; + SMCSemantics semantics; }; class ProbaCondition : public SimpleQuantifierCondition { diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index ce671c8..8434d61 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -465,11 +465,15 @@ SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { 0.05f, 0.05f, 0.1f, 0.95f, 0.05f, - false, 0.0f + false, 0.0f, + SMCSettings::Weak }; auto boundType = smcNode->first_attribute("bound-type"); if(boundType != nullptr) settings.boundType = strcmp(boundType->value(), "time") == 0 ? SMCSettings::TimeBound : SMCSettings::StepBound; + auto semantics = smcNode->first_attribute("semantics"); + if(semantics != nullptr) + settings.semantics = strcmp(semantics->value(), "strong") == 0 ? SMCSettings::Strong : SMCSettings::Weak; auto boundValue = smcNode->first_attribute("bound"); if(boundValue != nullptr) settings.bound = atoi(boundValue->value()); From 4b71143368639fd7925c5fab22e57c251c4665c0 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Fri, 28 Jun 2024 09:30:58 +0200 Subject: [PATCH 13/26] Support for parsing distributions on transitions --- include/Colored/ColoredNetStructures.h | 16 ++++++++++++++- include/Colored/ColoredPetriNetBuilder.h | 3 ++- include/TAPNBuilderInterface.h | 2 +- src/Colored/ColoredPetriNetBuilder.cpp | 7 ++++--- src/PetriParse/PNMLParser.cpp | 26 +++++++++++++++++++++++- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index faea265..e5ec505 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -25,6 +25,19 @@ namespace unfoldtacpn { namespace Colored { + namespace SMC { + enum Distribution { + Constant, + Uniform, + Exponential, + Normal, + }; + struct DistributionParameters { + double param1; + double param2; + }; + } + struct Arc { uint32_t place; uint32_t transition; @@ -50,7 +63,8 @@ namespace unfoldtacpn { GuardExpression_ptr guard; int player; bool urgent; - float probabilityRate = -1; + SMC::Distribution distribution; + SMC::DistributionParameters distributionParams; std::vector arcs; std::vector transport; }; diff --git a/include/Colored/ColoredPetriNetBuilder.h b/include/Colored/ColoredPetriNetBuilder.h index 149a56b..391b225 100644 --- a/include/Colored/ColoredPetriNetBuilder.h +++ b/include/Colored/ColoredPetriNetBuilder.h @@ -40,7 +40,8 @@ namespace unfoldtacpn { bool urgent, double x, double y, - float rate = -1); + Colored::SMC::Distribution distrib = Colored::SMC::Constant, + Colored::SMC::DistributionParameters params = { 0.0, 0.0 }); void addArc(const std::string& source, const std::string& target, int weight, bool inhibitor, const unfoldtacpn::Colored::ArcExpression_ptr &expr, const std::vector& intervals); diff --git a/include/TAPNBuilderInterface.h b/include/TAPNBuilderInterface.h index 1980470..5a4096b 100644 --- a/include/TAPNBuilderInterface.h +++ b/include/TAPNBuilderInterface.h @@ -39,7 +39,7 @@ namespace unfoldtacpn { // add a time transition with a unique name virtual void addTransition(const std::string &name, int player, bool urgent, - double, double, float = -1) = 0; + double, double, int distrib = 0, double distribParam1 = 1, double distribParam2 = 1) = 0; /* Add timed colored input arc with given arc expression*/ virtual void addInputArc(const std::string &place, diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index fd4cb7a..741858c 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -62,10 +62,11 @@ namespace unfoldtacpn { bool urgent, double x, double y, - float rate) { + Colored::SMC::Distribution distrib, + Colored::SMC::DistributionParameters params) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); - _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, rate}); + _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, distrib, params}); _transitionnames[name] = next; _transitionlocations.push_back(std::tuple(x,y)); } @@ -315,7 +316,7 @@ namespace unfoldtacpn { (*_output_stream) << " \n"; } - builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, transition.probabilityRate); + builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2); _pttransitionnames[transition.name].push_back(name); for (auto& arc : transition.arcs) { unfoldArc(builder, arc, b, name); diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index 4f8edfa..fe154d9 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -774,6 +774,8 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { float rate = -1; unfoldtacpn::Colored::GuardExpression_ptr expr = nullptr; auto name = element->first_attribute("id")->value(); + Colored::SMC::Distribution distrib = Colored::SMC::Constant; + Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0 }; auto posX = element->first_attribute("positionX"); if (posX != nullptr){ @@ -798,6 +800,28 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { rate = atof(rate_el->value()); } + auto distrib_el = element->first_attribute("distribution"); + if(distrib_el != nullptr && !urgent) { + char* distrib_name = distrib_el->value(); + if(strcmp(distrib_name, "constant") == 0) { + distrib = Colored::SMC::Constant; + distrib_params.param1 = atof(element->first_attribute("value")->value()); + } else if(strcmp(distrib_name, "uniform") == 0) { + distrib = Colored::SMC::Uniform; + distrib_params.param1 = atof(element->first_attribute("a")->value()); + distrib_params.param2 = atof(element->first_attribute("b")->value()); + } else if(strcmp(distrib_name, "exponential") == 0) { + distrib = Colored::SMC::Exponential; + distrib_params.param1 = atof(element->first_attribute("rate")->value()); + } else if(strcmp(distrib_name, "normal") == 0) { + distrib = Colored::SMC::Normal; + distrib_params.param1 = atof(element->first_attribute("mean")->value()); + distrib_params.param2 = atof(element->first_attribute("stddev")->value()); + } + } else if(urgent) { + distrib_params.param1 = 0; + } + for (auto it = element->first_node(); it; it = it->next_sibling()) { if (strcmp(it->name(), "graphics") == 0) { parsePosition(it, x, y); @@ -811,7 +835,7 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { exit(ErrorCode); } } - _builder->addTransition(name, expr, player, urgent, x, y, rate); + _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params); } void PNMLParser::parseValue(rapidxml::xml_node<>* element, std::string& text) { From e720af41258a67341100db58850088dc5a8e9fa1 Mon Sep 17 00:00:00 2001 From: Tanguy Dubois Date: Fri, 28 Jun 2024 10:13:24 +0200 Subject: [PATCH 14/26] Rate is now useless so removed it --- include/PQL/SMCExpressions.h | 1 - src/PetriParse/PNMLParser.cpp | 6 ------ src/PetriParse/QueryXMLParser.cpp | 4 ---- 3 files changed, 11 deletions(-) diff --git a/include/PQL/SMCExpressions.h b/include/PQL/SMCExpressions.h index 41f8d4a..fcb6ef3 100644 --- a/include/PQL/SMCExpressions.h +++ b/include/PQL/SMCExpressions.h @@ -14,7 +14,6 @@ namespace unfoldtacpn::PQL { float falseNegatives; float indifferenceRegionUp; float indifferenceRegionDown; - float defaultRate; float confidence; float estimationIntervalWidth; bool compareToFloat; diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index fe154d9..b7f4412 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -771,7 +771,6 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { double x = 0, y = 0; bool urgent = false; int player = 0; - float rate = -1; unfoldtacpn::Colored::GuardExpression_ptr expr = nullptr; auto name = element->first_attribute("id")->value(); Colored::SMC::Distribution distrib = Colored::SMC::Constant; @@ -795,11 +794,6 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { player = atoi(pl_el->value()); } - auto rate_el = element->first_attribute("rate"); - if(rate_el != nullptr) { - rate = atof(rate_el->value()); - } - auto distrib_el = element->first_attribute("distribution"); if(distrib_el != nullptr && !urgent) { char* distrib_name = distrib_el->value(); diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index 8434d61..197875a 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -463,7 +463,6 @@ SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { SMCSettings::StepBound, 100, 0.05f, 0.05f, 0.05f, 0.05f, - 0.1f, 0.95f, 0.05f, false, 0.0f, SMCSettings::Weak @@ -488,9 +487,6 @@ SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { settings.indifferenceRegionDown = atof(indifference->value()); settings.indifferenceRegionUp = atof(indifference->value()); } - auto defaultRate = smcNode->first_attribute("default-rate"); - if(defaultRate != nullptr) - settings.defaultRate = atof(defaultRate->value()); auto confidence = smcNode->first_attribute("confidence"); if(confidence != nullptr) settings.confidence = atof(confidence->value()); From b0041c3c7e8606c12afb803e2aeb51281fa380d2 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Thu, 11 Jul 2024 14:52:34 +0200 Subject: [PATCH 15/26] Update build-macos.yml to macos-12 --- .github/workflows/build-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 2c9a26b..657f39c 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -15,7 +15,7 @@ concurrency: jobs: build: if: github.event.pull_request.draft == false - runs-on: macos-11 + runs-on: macos-12 steps: - uses: actions/checkout@v2 From eb9ff07ed8c6307c111fc930cb8cce7929b18dfc Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Thu, 11 Jul 2024 15:01:16 +0200 Subject: [PATCH 16/26] Update build-macos.yml --- .github/workflows/build-macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 657f39c..52b27df 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -35,5 +35,5 @@ jobs: cmakeGenerator: UnixMakefiles buildDirectory: '${{runner.workspace}}/build' env: - CC: gcc-10 - CXX: g++-10 + CC: gcc-11 + CXX: g++-11 From 86f051ac476747cd81d231dc2359bbe42f43f0c2 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Tue, 6 Aug 2024 08:29:29 +0200 Subject: [PATCH 17/26] Support for 2 bounds --- include/PQL/SMCExpressions.h | 7 ++----- src/PetriParse/QueryXMLParser.cpp | 18 +++++++----------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/include/PQL/SMCExpressions.h b/include/PQL/SMCExpressions.h index fcb6ef3..fe18d28 100644 --- a/include/PQL/SMCExpressions.h +++ b/include/PQL/SMCExpressions.h @@ -6,10 +6,8 @@ namespace unfoldtacpn::PQL { struct SMCSettings { - enum SMCBoundType { TimeBound, StepBound }; - enum SMCSemantics { Weak, Strong }; - SMCBoundType boundType; - int bound; + int timeBound; + int stepBound; float falsePositives; float falseNegatives; float indifferenceRegionUp; @@ -18,7 +16,6 @@ namespace unfoldtacpn::PQL { float estimationIntervalWidth; bool compareToFloat; float geqThan; - SMCSemantics semantics; }; class ProbaCondition : public SimpleQuantifierCondition { diff --git a/src/PetriParse/QueryXMLParser.cpp b/src/PetriParse/QueryXMLParser.cpp index 197875a..bfcae74 100644 --- a/src/PetriParse/QueryXMLParser.cpp +++ b/src/PetriParse/QueryXMLParser.cpp @@ -460,22 +460,18 @@ Condition_ptr QueryXMLParser::parseBooleanFormula(rapidxml::xml_node<>* element SMCSettings QueryXMLParser::parseSmcSettings(rapidxml::xml_node<>* smcNode) { SMCSettings settings { - SMCSettings::StepBound, 100, + std::numeric_limits::max(), std::numeric_limits::max(), 0.05f, 0.05f, 0.05f, 0.05f, 0.95f, 0.05f, false, 0.0f, - SMCSettings::Weak }; - auto boundType = smcNode->first_attribute("bound-type"); - if(boundType != nullptr) - settings.boundType = strcmp(boundType->value(), "time") == 0 ? SMCSettings::TimeBound : SMCSettings::StepBound; - auto semantics = smcNode->first_attribute("semantics"); - if(semantics != nullptr) - settings.semantics = strcmp(semantics->value(), "strong") == 0 ? SMCSettings::Strong : SMCSettings::Weak; - auto boundValue = smcNode->first_attribute("bound"); - if(boundValue != nullptr) - settings.bound = atoi(boundValue->value()); + auto timeBound = smcNode->first_attribute("time-bound"); + if(timeBound != nullptr) + settings.timeBound = atoi(timeBound->value()); + auto stepBound = smcNode->first_attribute("step-bound"); + if(stepBound != nullptr) + settings.stepBound = atoi(stepBound->value()); auto falsePos = smcNode->first_attribute("false-positives"); if(falsePos != nullptr) settings.falsePositives = atof(falsePos->value()); From abc255b31e8cccd7db44f270fe305ed17b42aed4 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Wed, 7 Aug 2024 10:01:55 +0200 Subject: [PATCH 18/26] Priority, and Gamma distribution --- include/Colored/ColoredNetStructures.h | 5 ++++- include/Colored/ColoredPetriNetBuilder.h | 3 ++- include/TAPNBuilderInterface.h | 3 ++- src/Colored/ColoredPetriNetBuilder.cpp | 5 +++-- src/PetriParse/PNMLParser.cpp | 18 ++++++++++++++++-- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index e5ec505..bbf78e7 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -30,11 +30,13 @@ namespace unfoldtacpn { Constant, Uniform, Exponential, - Normal, + Normal, + Gamma }; struct DistributionParameters { double param1; double param2; + bool discrete = false; }; } @@ -65,6 +67,7 @@ namespace unfoldtacpn { bool urgent; SMC::Distribution distribution; SMC::DistributionParameters distributionParams; + double priority; std::vector arcs; std::vector transport; }; diff --git a/include/Colored/ColoredPetriNetBuilder.h b/include/Colored/ColoredPetriNetBuilder.h index 391b225..4ce83dd 100644 --- a/include/Colored/ColoredPetriNetBuilder.h +++ b/include/Colored/ColoredPetriNetBuilder.h @@ -41,7 +41,8 @@ namespace unfoldtacpn { double x, double y, Colored::SMC::Distribution distrib = Colored::SMC::Constant, - Colored::SMC::DistributionParameters params = { 0.0, 0.0 }); + Colored::SMC::DistributionParameters params = { 0.0, 0.0 }, + double priority = 1.0); void addArc(const std::string& source, const std::string& target, int weight, bool inhibitor, const unfoldtacpn::Colored::ArcExpression_ptr &expr, const std::vector& intervals); diff --git a/include/TAPNBuilderInterface.h b/include/TAPNBuilderInterface.h index 5a4096b..9bc094d 100644 --- a/include/TAPNBuilderInterface.h +++ b/include/TAPNBuilderInterface.h @@ -39,7 +39,8 @@ namespace unfoldtacpn { // add a time transition with a unique name virtual void addTransition(const std::string &name, int player, bool urgent, - double, double, int distrib = 0, double distribParam1 = 1, double distribParam2 = 1) = 0; + double, double, + int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, double priority = 1.0) = 0; /* Add timed colored input arc with given arc expression*/ virtual void addInputArc(const std::string &place, diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index 741858c..61a179e 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -63,7 +63,8 @@ namespace unfoldtacpn { double x, double y, Colored::SMC::Distribution distrib, - Colored::SMC::DistributionParameters params) { + Colored::SMC::DistributionParameters params, + double priority) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, distrib, params}); @@ -316,7 +317,7 @@ namespace unfoldtacpn { (*_output_stream) << " \n"; } - builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2); + builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.priority); _pttransitionnames[transition.name].push_back(name); for (auto& arc : transition.arcs) { unfoldArc(builder, arc, b, name); diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index b7f4412..0c3b0f8 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -774,7 +774,8 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { unfoldtacpn::Colored::GuardExpression_ptr expr = nullptr; auto name = element->first_attribute("id")->value(); Colored::SMC::Distribution distrib = Colored::SMC::Constant; - Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0 }; + Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0, false }; + double priority = 1.0; auto posX = element->first_attribute("positionX"); if (posX != nullptr){ @@ -811,11 +812,24 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { distrib = Colored::SMC::Normal; distrib_params.param1 = atof(element->first_attribute("mean")->value()); distrib_params.param2 = atof(element->first_attribute("stddev")->value()); + } else if(strcmp(distrib_name, "gamma") == 0) { + distrib = Colored::SMC::Gamma; + distrib_params.param1 = atof(element->first_attribute("shape")->value()); + distrib_params.param2 = atof(element->first_attribute("scale")->value()); + } + auto discrete_el = element->first_attribute("discrete"); + if(discrete_el != nullptr) { + distrib_params.discrete = stringToBool(discrete_el->value()); } } else if(urgent) { distrib_params.param1 = 0; } + auto prio_el = element->first_attribute("priority"); + if(prio_el != nullptr) { + priority = atof(prio_el->value()); + } + for (auto it = element->first_node(); it; it = it->next_sibling()) { if (strcmp(it->name(), "graphics") == 0) { parsePosition(it, x, y); @@ -829,7 +843,7 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { exit(ErrorCode); } } - _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params); + _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params, priority); } void PNMLParser::parseValue(rapidxml::xml_node<>* element, std::string& text) { From 7c10e3dc8746e383a89cb0409ff3acb9e2a94da6 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Wed, 7 Aug 2024 10:07:57 +0200 Subject: [PATCH 19/26] Discrete distrib fix for builder --- include/TAPNBuilderInterface.h | 2 +- src/Colored/ColoredPetriNetBuilder.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/TAPNBuilderInterface.h b/include/TAPNBuilderInterface.h index 9bc094d..46a755a 100644 --- a/include/TAPNBuilderInterface.h +++ b/include/TAPNBuilderInterface.h @@ -40,7 +40,7 @@ namespace unfoldtacpn { // add a time transition with a unique name virtual void addTransition(const std::string &name, int player, bool urgent, double, double, - int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, double priority = 1.0) = 0; + int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, bool discrete = false, double priority = 1.0) = 0; /* Add timed colored input arc with given arc expression*/ virtual void addInputArc(const std::string &place, diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index 61a179e..3833b4b 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -317,7 +317,8 @@ namespace unfoldtacpn { (*_output_stream) << " \n"; } - builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.priority); + builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, + transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.distributionParams.discrete, transition.priority); _pttransitionnames[transition.name].push_back(name); for (auto& arc : transition.arcs) { unfoldArc(builder, arc, b, name); From b8ce27f9fdec695734ebd06db41ddb83b24191e3 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Wed, 7 Aug 2024 13:02:33 +0200 Subject: [PATCH 20/26] Code cleanup --- include/Colored/ColoredNetStructures.h | 3 +- include/Colored/ColoredPetriNetBuilder.h | 2 +- include/PetriParse/PNMLParser.h | 1 + include/TAPNBuilderInterface.h | 2 +- src/Colored/ColoredPetriNetBuilder.cpp | 6 +-- src/PetriParse/PNMLParser.cpp | 64 +++++++++++++----------- 6 files changed, 42 insertions(+), 36 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index bbf78e7..12a2eab 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -36,7 +36,6 @@ namespace unfoldtacpn { struct DistributionParameters { double param1; double param2; - bool discrete = false; }; } @@ -67,7 +66,7 @@ namespace unfoldtacpn { bool urgent; SMC::Distribution distribution; SMC::DistributionParameters distributionParams; - double priority; + double weight; std::vector arcs; std::vector transport; }; diff --git a/include/Colored/ColoredPetriNetBuilder.h b/include/Colored/ColoredPetriNetBuilder.h index 4ce83dd..b574e97 100644 --- a/include/Colored/ColoredPetriNetBuilder.h +++ b/include/Colored/ColoredPetriNetBuilder.h @@ -42,7 +42,7 @@ namespace unfoldtacpn { double y, Colored::SMC::Distribution distrib = Colored::SMC::Constant, Colored::SMC::DistributionParameters params = { 0.0, 0.0 }, - double priority = 1.0); + double weight = 1.0); void addArc(const std::string& source, const std::string& target, int weight, bool inhibitor, const unfoldtacpn::Colored::ArcExpression_ptr &expr, const std::vector& intervals); diff --git a/include/PetriParse/PNMLParser.h b/include/PetriParse/PNMLParser.h index 14da177..bf2dd64 100644 --- a/include/PetriParse/PNMLParser.h +++ b/include/PetriParse/PNMLParser.h @@ -80,6 +80,7 @@ class PNMLParser { void parseValue(rapidxml::xml_node<>* element, std::string& text); uint32_t parseNumberConstant(rapidxml::xml_node<>* element); void parsePosition(rapidxml::xml_node<>* element, double& x, double& y); + std::tuple parseDistribution(rapidxml::xml_node<>* element); bool isTransition(const std::string& s); void checkKeyword(const char* id); unfoldtacpn::ColoredPetriNetBuilder* _builder; diff --git a/include/TAPNBuilderInterface.h b/include/TAPNBuilderInterface.h index 46a755a..beee170 100644 --- a/include/TAPNBuilderInterface.h +++ b/include/TAPNBuilderInterface.h @@ -40,7 +40,7 @@ namespace unfoldtacpn { // add a time transition with a unique name virtual void addTransition(const std::string &name, int player, bool urgent, double, double, - int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, bool discrete = false, double priority = 1.0) = 0; + int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, double weight = 1.0) = 0; /* Add timed colored input arc with given arc expression*/ virtual void addInputArc(const std::string &place, diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index 3833b4b..ff7cbf2 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -64,10 +64,10 @@ namespace unfoldtacpn { double y, Colored::SMC::Distribution distrib, Colored::SMC::DistributionParameters params, - double priority) { + double weight) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); - _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, distrib, params}); + _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, distrib, params, weight}); _transitionnames[name] = next; _transitionlocations.push_back(std::tuple(x,y)); } @@ -318,7 +318,7 @@ namespace unfoldtacpn { } builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, - transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.distributionParams.discrete, transition.priority); + transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.weight); _pttransitionnames[transition.name].push_back(name); for (auto& arc : transition.arcs) { unfoldArc(builder, arc, b, name); diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index 0c3b0f8..da05399 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -774,8 +774,8 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { unfoldtacpn::Colored::GuardExpression_ptr expr = nullptr; auto name = element->first_attribute("id")->value(); Colored::SMC::Distribution distrib = Colored::SMC::Constant; - Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0, false }; - double priority = 1.0; + Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0 }; + double weight = 1.0; auto posX = element->first_attribute("positionX"); if (posX != nullptr){ @@ -795,8 +795,39 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { player = atoi(pl_el->value()); } + if(!urgent) { + auto dist_data = parseDistribution(element); + + } else if(urgent) { + distrib_params.param1 = 0; + } + + auto weight_el = element->first_attribute("weight"); + if(weight_el != nullptr) { + weight = atof(weight_el->value()); + } + + for (auto it = element->first_node(); it; it = it->next_sibling()) { + if (strcmp(it->name(), "graphics") == 0) { + parsePosition(it, x, y); + } else if (strcmp(it->name(), "condition") == 0) { + expr = parseGuardExpression(it->first_node("structure"), &_global_scope); + } else if (strcmp(it->name(), "conditions") == 0) { + std::cerr << "ERROR: Conditions not supported" << std::endl; + exit(ErrorCode); + } else if (strcmp(it->name(), "assignments") == 0) { + std::cerr << "ERROR: Assignments not supported" << std::endl; + exit(ErrorCode); + } + } + _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params, weight); +} + +std::tuple PNMLParser::parseDistribution(rapidxml::xml_node<>* element) { + Colored::SMC::Distribution distrib = Colored::SMC::Constant; + Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0 }; auto distrib_el = element->first_attribute("distribution"); - if(distrib_el != nullptr && !urgent) { + if(distrib_el != nullptr) { char* distrib_name = distrib_el->value(); if(strcmp(distrib_name, "constant") == 0) { distrib = Colored::SMC::Constant; @@ -817,33 +848,8 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { distrib_params.param1 = atof(element->first_attribute("shape")->value()); distrib_params.param2 = atof(element->first_attribute("scale")->value()); } - auto discrete_el = element->first_attribute("discrete"); - if(discrete_el != nullptr) { - distrib_params.discrete = stringToBool(discrete_el->value()); - } - } else if(urgent) { - distrib_params.param1 = 0; - } - - auto prio_el = element->first_attribute("priority"); - if(prio_el != nullptr) { - priority = atof(prio_el->value()); - } - - for (auto it = element->first_node(); it; it = it->next_sibling()) { - if (strcmp(it->name(), "graphics") == 0) { - parsePosition(it, x, y); - } else if (strcmp(it->name(), "condition") == 0) { - expr = parseGuardExpression(it->first_node("structure"), &_global_scope); - } else if (strcmp(it->name(), "conditions") == 0) { - std::cerr << "ERROR: Conditions not supported" << std::endl; - exit(ErrorCode); - } else if (strcmp(it->name(), "assignments") == 0) { - std::cerr << "ERROR: Assignments not supported" << std::endl; - exit(ErrorCode); - } } - _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params, priority); + return std::make_pair(distrib, distrib_params); } void PNMLParser::parseValue(rapidxml::xml_node<>* element, std::string& text) { From 71ab9f7ea149115533d22318a99ad745acd069eb Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Wed, 7 Aug 2024 13:06:59 +0200 Subject: [PATCH 21/26] Correct distribution parsing --- src/PetriParse/PNMLParser.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index da05399..8850807 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -797,7 +797,8 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { if(!urgent) { auto dist_data = parseDistribution(element); - + distrib = std::get<0>(dist_data); + distrib_params = std::get<1>(dist_data); } else if(urgent) { distrib_params.param1 = 0; } From 213e1442e5173a3fc3cb0a3d0e0e73363432b47f Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Fri, 9 Aug 2024 14:10:15 +0200 Subject: [PATCH 22/26] Discrete Uniform --- include/Colored/ColoredNetStructures.h | 3 ++- src/PetriParse/PNMLParser.cpp | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index 12a2eab..0111fb6 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -31,7 +31,8 @@ namespace unfoldtacpn { Uniform, Exponential, Normal, - Gamma + Gamma, + DiscreteUniform }; struct DistributionParameters { double param1; diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index 8850807..8f160e1 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -848,6 +848,10 @@ std::tuple PNM distrib = Colored::SMC::Gamma; distrib_params.param1 = atof(element->first_attribute("shape")->value()); distrib_params.param2 = atof(element->first_attribute("scale")->value()); + } else if(strcmp(distrib_name, "discrete uniform") == 0) { + distrib = Colored::SMC::DiscreteUniform; + distrib_params.param1 = atof(element->first_attribute("a")->value()); + distrib_params.param2 = atof(element->first_attribute("b")->value()); } } return std::make_pair(distrib, distrib_params); From 84ed7f15f195eabaa07a9bf10e18e33158fd8573 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Mon, 19 Aug 2024 09:36:03 +0200 Subject: [PATCH 23/26] FiringMode parsing --- include/Colored/ColoredNetStructures.h | 6 ++++++ include/Colored/ColoredPetriNetBuilder.h | 3 ++- include/TAPNBuilderInterface.h | 2 +- src/Colored/ColoredPetriNetBuilder.cpp | 7 ++++--- src/PetriParse/PNMLParser.cpp | 26 +++++++++++++++++------- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index 0111fb6..c7a033f 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -38,6 +38,11 @@ namespace unfoldtacpn { double param1; double param2; }; + enum FiringMode { + Oldest, + Youngest, + Random + }; } struct Arc { @@ -68,6 +73,7 @@ namespace unfoldtacpn { SMC::Distribution distribution; SMC::DistributionParameters distributionParams; double weight; + SMC::FiringMode firingMode; std::vector arcs; std::vector transport; }; diff --git a/include/Colored/ColoredPetriNetBuilder.h b/include/Colored/ColoredPetriNetBuilder.h index b574e97..7989001 100644 --- a/include/Colored/ColoredPetriNetBuilder.h +++ b/include/Colored/ColoredPetriNetBuilder.h @@ -42,7 +42,8 @@ namespace unfoldtacpn { double y, Colored::SMC::Distribution distrib = Colored::SMC::Constant, Colored::SMC::DistributionParameters params = { 0.0, 0.0 }, - double weight = 1.0); + double weight = 1.0, + Colored::SMC::FiringMode firingMode = Colored::SMC::Oldest); void addArc(const std::string& source, const std::string& target, int weight, bool inhibitor, const unfoldtacpn::Colored::ArcExpression_ptr &expr, const std::vector& intervals); diff --git a/include/TAPNBuilderInterface.h b/include/TAPNBuilderInterface.h index beee170..e5523fc 100644 --- a/include/TAPNBuilderInterface.h +++ b/include/TAPNBuilderInterface.h @@ -40,7 +40,7 @@ namespace unfoldtacpn { // add a time transition with a unique name virtual void addTransition(const std::string &name, int player, bool urgent, double, double, - int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, double weight = 1.0) = 0; + int distrib = 0, double distribParam1 = 1, double distribParam2 = 1, double weight = 1.0, int firingMode = 0) = 0; /* Add timed colored input arc with given arc expression*/ virtual void addInputArc(const std::string &place, diff --git a/src/Colored/ColoredPetriNetBuilder.cpp b/src/Colored/ColoredPetriNetBuilder.cpp index ff7cbf2..cc6c54e 100644 --- a/src/Colored/ColoredPetriNetBuilder.cpp +++ b/src/Colored/ColoredPetriNetBuilder.cpp @@ -64,10 +64,11 @@ namespace unfoldtacpn { double y, Colored::SMC::Distribution distrib, Colored::SMC::DistributionParameters params, - double weight) { + double weight, + Colored::SMC::FiringMode firingMode) { if (_transitionnames.count(name) == 0) { uint32_t next = _transitionnames.size(); - _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, distrib, params, weight}); + _transitions.emplace_back(Colored::Transition {name, guard, player, urgent, distrib, params, weight, firingMode}); _transitionnames[name] = next; _transitionlocations.push_back(std::tuple(x,y)); } @@ -318,7 +319,7 @@ namespace unfoldtacpn { } builder.addTransition(name, transition.player, transition.urgent, std::get<0>(transitionPos), std::get<1>(transitionPos) + offset, - transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.weight); + transition.distribution, transition.distributionParams.param1, transition.distributionParams.param2, transition.weight, transition.firingMode); _pttransitionnames[transition.name].push_back(name); for (auto& arc : transition.arcs) { unfoldArc(builder, arc, b, name); diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index 8f160e1..2727c88 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -776,6 +776,7 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { Colored::SMC::Distribution distrib = Colored::SMC::Constant; Colored::SMC::DistributionParameters distrib_params = { 1.0, 0.0 }; double weight = 1.0; + Colored::SMC::FiringMode firingMode = Colored::SMC::Oldest; auto posX = element->first_attribute("positionX"); if (posX != nullptr){ @@ -808,6 +809,17 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { weight = atof(weight_el->value()); } + auto firing_el = element->first_attribute("firingMode"); + if(firing_el != nullptr) { + if (strcasecmp(firing_el->value(), "oldest") == 0) { + firingMode = Colored::SMC::Oldest; + } else if (strcasecmp(firing_el->value(), "youngest") == 0) { + firingMode = Colored::SMC::Youngest; + } else if (strcasecmp(firing_el->value(), "random") == 0) { + firingMode = Colored::SMC::Random; + } + } + for (auto it = element->first_node(); it; it = it->next_sibling()) { if (strcmp(it->name(), "graphics") == 0) { parsePosition(it, x, y); @@ -821,7 +833,7 @@ void PNMLParser::parseTransition(rapidxml::xml_node<>* element) { exit(ErrorCode); } } - _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params, weight); + _builder->addTransition(name, expr, player, urgent, x, y, distrib, distrib_params, weight, firingMode); } std::tuple PNMLParser::parseDistribution(rapidxml::xml_node<>* element) { @@ -830,25 +842,25 @@ std::tuple PNM auto distrib_el = element->first_attribute("distribution"); if(distrib_el != nullptr) { char* distrib_name = distrib_el->value(); - if(strcmp(distrib_name, "constant") == 0) { + if(strcasecmp(distrib_name, "constant") == 0) { distrib = Colored::SMC::Constant; distrib_params.param1 = atof(element->first_attribute("value")->value()); - } else if(strcmp(distrib_name, "uniform") == 0) { + } else if(strcasecmp(distrib_name, "uniform") == 0) { distrib = Colored::SMC::Uniform; distrib_params.param1 = atof(element->first_attribute("a")->value()); distrib_params.param2 = atof(element->first_attribute("b")->value()); - } else if(strcmp(distrib_name, "exponential") == 0) { + } else if(strcasecmp(distrib_name, "exponential") == 0) { distrib = Colored::SMC::Exponential; distrib_params.param1 = atof(element->first_attribute("rate")->value()); - } else if(strcmp(distrib_name, "normal") == 0) { + } else if(strcasecmp(distrib_name, "normal") == 0) { distrib = Colored::SMC::Normal; distrib_params.param1 = atof(element->first_attribute("mean")->value()); distrib_params.param2 = atof(element->first_attribute("stddev")->value()); - } else if(strcmp(distrib_name, "gamma") == 0) { + } else if(strcasecmp(distrib_name, "gamma") == 0) { distrib = Colored::SMC::Gamma; distrib_params.param1 = atof(element->first_attribute("shape")->value()); distrib_params.param2 = atof(element->first_attribute("scale")->value()); - } else if(strcmp(distrib_name, "discrete uniform") == 0) { + } else if(strcasecmp(distrib_name, "discrete uniform") == 0) { distrib = Colored::SMC::DiscreteUniform; distrib_params.param1 = atof(element->first_attribute("a")->value()); distrib_params.param2 = atof(element->first_attribute("b")->value()); From e88dfb39625219bb594176aaa071d6683bb3407e Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Tue, 20 Aug 2024 10:08:05 +0200 Subject: [PATCH 24/26] XML printing of PF/PG --- include/PQL/XMLPrinter.h | 4 ++++ src/PQL/XMLPrinter.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/PQL/XMLPrinter.h b/include/PQL/XMLPrinter.h index 6e9496c..1de9c0e 100644 --- a/include/PQL/XMLPrinter.h +++ b/include/PQL/XMLPrinter.h @@ -73,6 +73,10 @@ namespace unfoldtacpn { void _accept(const AFCondition *condition) override; + void _accept(const PGCondition *condition) override; + + void _accept(const PFCondition *condition) override; + void _accept(const EXCondition *condition) override; void _accept(const AXCondition *condition) override; diff --git a/src/PQL/XMLPrinter.cpp b/src/PQL/XMLPrinter.cpp index bd94237..d97b7dd 100644 --- a/src/PQL/XMLPrinter.cpp +++ b/src/PQL/XMLPrinter.cpp @@ -183,6 +183,18 @@ namespace unfoldtacpn { closeXmlTag("all-paths"); } + void XMLPrinter::_accept(const PGCondition *element) { + openXmlTag("globally"); + (*element)[0]->visit(*this); + closeXmlTag("globally"); + } + + void XMLPrinter::_accept(const PFCondition *element) { + openXmlTag("finally"); + (*element)[0]->visit(*this); + closeXmlTag("finally"); + } + void XMLPrinter::_accept(const ControlCondition *element) { openXmlTag("control"); (*element)[0]->visit(*this); From 7da063c4d50cd2dfbca4ed93906b7f78fa7f1f9f Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Tue, 20 Aug 2024 10:14:09 +0200 Subject: [PATCH 25/26] Updated MAC gcc version --- .github/workflows/build-macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 52b27df..6851c46 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -35,5 +35,5 @@ jobs: cmakeGenerator: UnixMakefiles buildDirectory: '${{runner.workspace}}/build' env: - CC: gcc-11 - CXX: g++-11 + CC: gcc-12 + CXX: g++-12 From 6add20a2bb44dc4a718aa8d752a9e33f1dc8ef41 Mon Sep 17 00:00:00 2001 From: TanguyDubois Date: Thu, 22 Aug 2024 14:54:17 +0200 Subject: [PATCH 26/26] Erlang and geometric --- include/Colored/ColoredNetStructures.h | 4 +++- src/PetriParse/PNMLParser.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/Colored/ColoredNetStructures.h b/include/Colored/ColoredNetStructures.h index c7a033f..a012950 100644 --- a/include/Colored/ColoredNetStructures.h +++ b/include/Colored/ColoredNetStructures.h @@ -32,7 +32,9 @@ namespace unfoldtacpn { Exponential, Normal, Gamma, - DiscreteUniform + Erlang, + DiscreteUniform, + Geometric }; struct DistributionParameters { double param1; diff --git a/src/PetriParse/PNMLParser.cpp b/src/PetriParse/PNMLParser.cpp index 2727c88..6413c18 100644 --- a/src/PetriParse/PNMLParser.cpp +++ b/src/PetriParse/PNMLParser.cpp @@ -860,10 +860,17 @@ std::tuple PNM distrib = Colored::SMC::Gamma; distrib_params.param1 = atof(element->first_attribute("shape")->value()); distrib_params.param2 = atof(element->first_attribute("scale")->value()); + } else if(strcasecmp(distrib_name, "erlang") == 0) { + distrib = Colored::SMC::Erlang; + distrib_params.param1 = atof(element->first_attribute("shape")->value()); + distrib_params.param2 = atof(element->first_attribute("scale")->value()); } else if(strcasecmp(distrib_name, "discrete uniform") == 0) { distrib = Colored::SMC::DiscreteUniform; distrib_params.param1 = atof(element->first_attribute("a")->value()); distrib_params.param2 = atof(element->first_attribute("b")->value()); + } else if(strcasecmp(distrib_name, "geometric") == 0) { + distrib = Colored::SMC::Geometric; + distrib_params.param1 = atof(element->first_attribute("p")->value()); } } return std::make_pair(distrib, distrib_params);