1#ifndef BPMNOS_Execution_CPModel_H
2#define BPMNOS_Execution_CPModel_H
14#include <unordered_map>
26friend class CPSolutionObserver;
27friend class CPController;
29 using Vertex = FlattenedGraph::Vertex;
32 bool instantEntry =
false;
33 bool instantChoices =
true;
34 bool instantExit =
true;
36 static Config default_config() {
return {}; }
39 const CP::Model& getModel()
const {
return model; }
44 const FlattenedGraph* flattenedGraph;
45 std::vector<const Vertex*> vertices;
46 std::unordered_map< const Vertex*, size_t > indexMap;
49 LIMEX::Handle<CP::Expression,CP::Expression> limexHandle;
52 void createGlobalVariables();
53 void createMessageFlowVariables();
54 void createMessagingConstraints();
55 void createMessageHeader(
const Vertex* vertex);
56 void createMessageContent(
const Vertex* vertex);
57 void createVertexVariables(
const Vertex* vertex);
58 void createEntryVariables(
const Vertex* vertex);
59 void createExitVariables(
const Vertex* vertex);
60 void createSequenceFlowVariables(
const Vertex* source,
const Vertex* target,
const BPMNOS::Model::Gatekeeper* gatekeeper =
nullptr);
61 void createStatusFlowVariables(
const Vertex* source,
const Vertex* target);
63 void createSequenceConstraints(
const Vertex* vertex);
64 void createRestrictions(
const Vertex* vertex);
65 CP::Expression createExpression(
const Vertex* vertex,
const Model::Expression& expression);
67 void createGlobalIndexVariable(
const Vertex* vertex);
68 void createDataVariables(
const Vertex* vertex);
69 void createDataIndexVariables(
const Vertex* vertex);
71 void constrainGlobalVariables();
72 void constrainDataVariables(
const FlattenedGraph::Vertex* vertex);
73 void constrainSequentialActivities();
74 void constrainEventBasedGateway(
const FlattenedGraph::Vertex* gateway);
75 void constrainTypedStartEvent(
const FlattenedGraph::Vertex* startEvent);
77 struct AttributeVariables {
78 const CP::Variable& defined;
79 const CP::Variable& value;
81 AttributeVariables(
const CP::Variable& defined,
const CP::Variable& value)
82 : defined(defined), value(value) {}
84 AttributeVariables(
const AttributeVariables& other)
85 : defined(other.defined), value(other.value) {}
87 AttributeVariables operator=(
const AttributeVariables& other) {
88 return AttributeVariables(other.defined,other.value);
92 struct IndexedAttributeVariables {
93 CP::IndexedVariables& defined;
94 CP::IndexedVariables& value;
98 void addObjectiveCoefficients(
const Vertex* vertex);
100 struct AttributeEvaluation {
101 AttributeEvaluation(std::expected< double, std::string > defined, std::expected< double, std::string > value) : _defined(defined), _value(value) {}
102 inline bool defined()
const {
return (
bool)_defined.value(); }
103 inline double value()
const {
return _value.value(); }
105 explicit operator bool()
const {
106 return static_cast<bool>(_defined) &&
static_cast<bool>(_value);
109 std::expected< double, std::string > _defined;
110 std::expected< double, std::string > _value;
113 void createStatus(
const Vertex* vertex);
114 void addAttributes(
const Vertex* vertex, std::vector<AttributeVariables>& variables,
const BPMNOS::Model::Attribute* loopIndex =
nullptr);
115 void createEntryStatus(
const Vertex* vertex);
116 void createExitStatus(
const Vertex* vertex);
117 void createLocalAttributeVariables(
const Vertex* vertex);
118 CP::Expression createOperatorExpression(
const Model::Expression& operator_, std::tuple< std::vector<AttributeVariables>, std::vector<AttributeVariables>, std::vector<AttributeVariables> >& localVariables );
119 std::pair< CP::Expression, CP::Expression > getLocalAttributeVariables(
const Model::Attribute* attribute, std::tuple< std::vector<AttributeVariables>, std::vector<AttributeVariables>, std::vector<AttributeVariables> >& localVariables );
125 std::vector<CPModel::AttributeVariables> createUniquelyDeducedEntryStatus(
const Vertex* vertex,
const BPMNOS::Model::AttributeRegistry& attributeRegistry, std::vector<AttributeVariables>& inheritedStatus);
126 std::vector<AttributeVariables> createAlternativeEntryStatus(
const Vertex* vertex,
const BPMNOS::Model::AttributeRegistry& attributeRegistry, std::vector< std::pair<
const CP::Variable&, std::vector<AttributeVariables>& > > alternatives);
127 std::vector<AttributeVariables> createMergedStatus(
const Vertex* vertex,
const BPMNOS::Model::AttributeRegistry& attributeRegistry, std::vector< std::pair<
const CP::Variable&, std::vector<AttributeVariables>& > > inputs);
128 CP::Expression getLoopIndex(
const Vertex* vertex);
129 void createLoopEntryStatus(
const Vertex* vertex);
130 std::vector<CPModel::AttributeVariables> createLoopExitStatus(
const Vertex* vertex);
133 template <
class T1,
class T2>
134 std::size_t operator () (
const std::pair<T1,T2> &p)
const {
135 auto h1 = std::hash<T1>{}(p.first);
136 auto h2 = std::hash<T2>{}(p.second);
141 return h1 ^ (h2 * 2654435761u);
145 std::vector<const Vertex*> messageRecipients;
146 std::vector<const Vertex*> messageSenders;
148 std::unordered_map< const Vertex*, const CP::Variable& > position;
149 std::unordered_map< const Vertex*, const CP::Variable& > visit;
151 std::unordered_map< std::pair< const Vertex*, const Vertex* >,
const CP::Variable&, pair_hash > tokenFlow;
152 std::unordered_map< std::pair< const Vertex*, const Vertex* >,
const CP::Variable&, pair_hash > messageFlow;
154 std::unordered_map< const Vertex*, std::unordered_map< std::string, AttributeVariables> > messageHeader;
155 std::unordered_map< const Vertex*, std::unordered_map< std::string, AttributeVariables> > messageContent;
157 std::vector< IndexedAttributeVariables > globals;
158 std::unordered_map< const Vertex*, const CP::Variable& > globalIndex;
160 std::unordered_map< std::pair< const Vertex*, const Model::Attribute*>, IndexedAttributeVariables, pair_hash > data;
161 std::unordered_map< const Vertex*, CP::reference_vector< const CP::Variable > > dataIndex;
163 std::unordered_map< const Vertex*, std::vector<AttributeVariables> > status;
164 std::unordered_map< const Vertex*, std::vector< std::tuple< std::vector<AttributeVariables>, std::vector<AttributeVariables>, std::vector<AttributeVariables> > > > locals;
166 std::unordered_map< std::pair< const Vertex*, const Model::Attribute*>,
const CP::Variable&, pair_hash > discretizerMap;
168 std::unordered_map< std::pair< const Vertex*, const Vertex* >, std::vector<AttributeVariables>, pair_hash > statusFlow;
170 std::optional< BPMN::Activity::LoopCharacteristics > getLoopCharacteristics(
const Vertex* vertex)
const;
171 std::optional< BPMNOS::number > getTimestamp(
const Vertex* vertex )
const;
172 std::pair< CP::Expression, CP::Expression > getAttributeVariables(
const Vertex* vertex,
const Model::Attribute* attribute);
174 std::string stringify()
const {
return model.stringify(); };
176 const Vertex* entry(
const Vertex* vertex)
const {
return flattenedGraph->
entry(vertex); };
177 const Vertex* exit(
const Vertex* vertex)
const {
return flattenedGraph->
exit(vertex); };
Represents a graph containing all BPMN nodes that may receive a token during execution of a scenario.
const Vertex * exit(const Vertex *vertex) const
const Vertex * entry(const Vertex *vertex) const
Class representing a choice to be made within a BPMNOS::Model::DecisionTask.
Class holding extension elements representing gatekeeper conditions for sequence flows.
Abstract base class for scenarios holding data for all BPMN instances.