BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
GuidedEvaluator.cpp
Go to the documentation of this file.
1#include "GuidedEvaluator.h"
6
7using namespace BPMNOS::Execution;
8
9
10bool GuidedEvaluator::updateValues(EntryDecision* decision, Values& status, Values& data, Values& globals) {
11 if ( !LocalEvaluator::updateValues(decision,status,data,globals) ) {
12//std::cerr << "GuidedEvaluator: infeasible entry " << decision->token->node->id << std::endl;
13 return false;
14 }
15
16 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
17 assert(extensionElements);
18 if ( !extensionElements->entryGuidance ) {
19//std::cerr << "GuidedEvaluator: No entry guidance" << std::endl;
20 return true;
21 }
22
23 // apply guidance
24 auto guidance = extensionElements->entryGuidance.value().get();
25 auto systemState = decision->token->owner->systemState;
26 guidance->apply(systemState->scenario, systemState->currentTime, decision->token->owner->root->instance.value(), decision->token->node, status, data, globals);
27//std::cerr << "GuidedEvaluator: guidance " << guidance->restrictionsSatisfied(decision->token->node,status,data,globals) << ": " << decision->token->node->id << std::endl;
28
29 return guidance->restrictionsSatisfied(decision->token->node,status,data,globals);
30}
31
32bool GuidedEvaluator::updateValues(ExitDecision* decision, Values& status, Values& data, Values& globals) {
33 if ( !LocalEvaluator::updateValues(decision,status,data,globals) ) {
34//std::cerr << "GuidedEvaluator: infeasible exit " << decision->token->node->id << std::endl;
35 return false;
36 }
37
38 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
39 assert(extensionElements);
40 if ( !extensionElements->exitGuidance ) {
41//std::cerr << "GuidedEvaluator: No exit guidance" << std::endl;
42 return true;
43 }
44
45 // apply guidance
46 auto guidance = extensionElements->exitGuidance.value().get();
47 auto systemState = decision->token->owner->systemState;
48 guidance->apply(systemState->scenario, systemState->currentTime, decision->token->owner->root->instance.value(), decision->token->node, status, data, globals);
49
50 return guidance->restrictionsSatisfied(decision->token->node,status,data,globals);
51}
52
53
54bool GuidedEvaluator::updateValues(ChoiceDecision* decision, Values& status, Values& data, Values& globals) {
55 if ( !LocalEvaluator::updateValues(decision,status,data,globals) ) {
56 return false;
57 }
58
59 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
60 assert(extensionElements);
61 if ( !extensionElements->choiceGuidance ) {
62 return true;
63 }
64
65 // apply guidance
66 auto guidance = extensionElements->choiceGuidance.value().get();
67 auto systemState = decision->token->owner->systemState;
68 guidance->apply(systemState->scenario, systemState->currentTime, decision->token->owner->root->instance.value(), decision->token->node, status, data, globals);
69
70 return guidance->restrictionsSatisfied(decision->token->node,status,data,globals);
71}
72
73
75 if ( !LocalEvaluator::updateValues(decision,status,data,globals) ) {
76 return false;
77 }
78
79 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
80 assert(extensionElements);
81 if ( !extensionElements->messageDeliveryGuidance ) {
82 return true;
83 }
84
85 // apply guidance
86 auto guidance = extensionElements->messageDeliveryGuidance.value().get();
87 auto systemState = decision->token->owner->systemState;
88 guidance->apply(systemState->scenario, systemState->currentTime, decision->token->owner->root->instance.value(), decision->token->node, status, data, globals);
89
90 return guidance->restrictionsSatisfied(decision->token->node,status,data,globals);
91}
92
93std::optional<double> GuidedEvaluator::evaluate(EntryDecision* decision) {
94 auto token = decision->token;
95 assert( token->ready() );
96 auto extensionElements = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
97 assert(extensionElements);
98 Values status = token->status;
99 status[BPMNOS::Model::ExtensionElements::Index::Timestamp] = token->owner->systemState->currentTime;
100 Values data(*token->data);
101 Values globals = token->globals;
102 double evaluation = (double)extensionElements->getObjective(status,data,globals);
103//std::cerr << "Decision: " << decision->jsonify() << std::endl;
104//std::cerr << "Token: " << decision->token->jsonify() << std::endl;
105//std::cerr << "Initial evaluation: " << evaluation << std::endl;
106
107 bool feasible = updateValues(decision,status,data,globals);
108 if ( !feasible ) {
109 return std::nullopt;
110 }
111//std::cerr << "GuidedEvaluator: unguided evaluation " << extensionElements->getObjective(status,data,globals) << std::endl;
112
113 if ( !extensionElements->entryGuidance ) {
114 return evaluation - extensionElements->getObjective(status,data,globals);
115 }
116 // return evaluation of entry
117//std::cerr << "GuidedEvaluator: guided evaluation " << extensionElements->entryGuidance.value()->getObjective(status,data,globals) << std::endl;
118 return evaluation - extensionElements->entryGuidance.value()->getObjective(status,data,globals);
119}
120
121std::optional<double> GuidedEvaluator::evaluate(ExitDecision* decision) {
122 auto token = decision->token;
123 assert( token->completed() );
124 auto extensionElements = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
125 assert(extensionElements);
126 Values status = token->status;
127 status[BPMNOS::Model::ExtensionElements::Index::Timestamp] = token->owner->systemState->currentTime;
128 Values data(*token->data);
129 Values globals = token->globals;
130 double evaluation = (double)extensionElements->getObjective(status,data,globals);
131
132 bool feasible = updateValues(decision,status,data,globals);
133 if ( !feasible ) {
134//std::cerr << "GuidedEvaluator: Infeasible exit " << token->jsonify() << std::endl;
135 return std::nullopt;
136 }
137
138 if ( !extensionElements->exitGuidance ) {
139 return evaluation - extensionElements->getObjective(status,data,globals);
140 }
141
142 return evaluation - extensionElements->exitGuidance.value()->getObjective(status,data,globals);
143}
144
145std::optional<double> GuidedEvaluator::evaluate(ChoiceDecision* decision) {
146 auto token = decision->token;
147 assert( token->busy() );
148 auto extensionElements = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
149 assert(extensionElements);
150 auto evaluation = (double)extensionElements->getObjective(token->status, *token->data, token->globals);
151
152 assert( dynamic_cast<const ChoiceEvent*>(decision) );
153 Values status(token->status);
154 status[BPMNOS::Model::ExtensionElements::Index::Timestamp] = token->owner->systemState->currentTime;
155 Values data(*token->data);
156 Values globals = token->globals;
157 // apply choices
158 for (size_t i = 0; i < extensionElements->choices.size(); i++) {
159 extensionElements->attributeRegistry.setValue( extensionElements->choices[i]->attribute, status, data, globals, decision->choices[i] );
160 }
161
162 bool feasible = updateValues(decision,status,data,globals);
163 if ( !feasible ) {
164 return std::nullopt;
165 }
166
167 if ( !extensionElements->choiceGuidance ) {
168 return evaluation - extensionElements->getObjective(status,data,globals);
169 }
170
171 return evaluation - extensionElements->choiceGuidance.value()->getObjective(status,data,globals);
172}
173
174std::optional<double> GuidedEvaluator::evaluate(MessageDeliveryDecision* decision) {
175 auto token = decision->token;
176 assert( token->busy() );
177
178 auto extensionElements = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
179 assert(extensionElements);
180 Values status = token->status;
181 status[BPMNOS::Model::ExtensionElements::Index::Timestamp] = token->owner->systemState->currentTime;
182 Values data(*token->data);
183 Values globals = token->globals;
184 double evaluation = (double)extensionElements->getObjective(status,data,globals);
185//std::cerr << "Decision: " << decision->jsonify() << std::endl;
186//std::cerr << "Token: " << decision->token->jsonify() << std::endl;
187//std::cerr << "Initial evaluation:\n" << evaluation << std::endl;
188
189 bool feasible = updateValues(decision,status,data,globals);
190 if ( !feasible ) {
191 return std::nullopt;
192 }
193//std::cerr << "Local evaluation:\n" << extensionElements->getObjective(status,data,globals) << std::endl;
194
195 if ( !extensionElements->messageDeliveryGuidance ) {
196 return evaluation - extensionElements->getObjective(status,data,globals);
197 }
198//std::cerr << "Guided evaluation:\n" << extensionElements->messageDeliveryGuidance.value()->getObjective(status,data,globals) << std::endl;
199//if ( evaluation - extensionElements->messageDeliveryGuidance.value()->getObjective(status,data,globals) > 800 ) exit(0);
200 return evaluation - extensionElements->messageDeliveryGuidance.value()->getObjective(status,data,globals);
201}
202
203
204std::set<const BPMNOS::Model::Attribute*> GuidedEvaluator::getDependencies(EntryDecision* decision) {
205 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
206 assert(extensionElements);
207
208 std::set<const BPMNOS::Model::Attribute*> dependencies = LocalEvaluator::getDependencies(decision);
209 // add guidance dependencies
210 if ( extensionElements->entryGuidance.has_value() ) {
211 dependencies.insert(extensionElements->entryGuidance.value()->dependencies.begin(), extensionElements->entryGuidance.value()->dependencies.end());
212 }
213
214 return dependencies;
215}
216
217std::set<const BPMNOS::Model::Attribute*> GuidedEvaluator::getDependencies(ExitDecision* decision) {
218 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
219 assert(extensionElements);
220
221 std::set<const BPMNOS::Model::Attribute*> dependencies = LocalEvaluator::getDependencies(decision);
222 // add guidance dependencies
223 if ( extensionElements->exitGuidance.has_value() ) {
224 dependencies.insert(extensionElements->exitGuidance.value()->dependencies.begin(), extensionElements->exitGuidance.value()->dependencies.end());
225 }
226
227 return dependencies;
228}
229
230std::set<const BPMNOS::Model::Attribute*> GuidedEvaluator::getDependencies(ChoiceDecision* decision) {
231 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
232 assert(extensionElements);
233
234 std::set<const BPMNOS::Model::Attribute*> dependencies = LocalEvaluator::getDependencies(decision);
235 // add guidance dependencies
236 if ( extensionElements->choiceGuidance.has_value() ) {
237 dependencies.insert(extensionElements->choiceGuidance.value()->dependencies.begin(), extensionElements->choiceGuidance.value()->dependencies.end());
238 }
239
240 return dependencies;
241}
242
243std::set<const BPMNOS::Model::Attribute*> GuidedEvaluator::getDependencies(MessageDeliveryDecision* decision) {
244 auto extensionElements = decision->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
245 assert(extensionElements);
246
247 std::set<const BPMNOS::Model::Attribute*> dependencies = LocalEvaluator::getDependencies(decision);
248 // add guidance dependencies
249 if ( extensionElements->messageDeliveryGuidance.has_value() ) {
250 dependencies.insert(extensionElements->messageDeliveryGuidance.value()->dependencies.begin(), extensionElements->messageDeliveryGuidance.value()->dependencies.end());
251 }
252
253 return dependencies;
254}
255
std::optional< double > evaluate(EntryDecision *decision) override
std::set< const BPMNOS::Model::Attribute * > getDependencies(EntryDecision *decision) override
bool updateValues(EntryDecision *decision, Values &status, Values &data, Values &globals) override
std::set< const BPMNOS::Model::Attribute * > getDependencies(EntryDecision *decision) override
virtual bool updateValues(EntryDecision *decision, Values &status, Values &data, Values &globals)
const SystemState * systemState
const StateMachine * root
Pointer to the root state machine.
std::optional< BPMNOS::number > instance
Numeric representation of instance id (TODO: can we const this?)
const BPMN::FlowNode * node
Definition Token.h:46
const StateMachine * owner
State machine owning the token.
Definition Token.h:44
Class holding extension elements representing execution data for nodes.
std::unique_ptr< ExtensionElements > extensionElements
Definition bpmn++.h:16299
Represents the event that choices are made for a DecisionTask.
Represents the event that choices are made for a DecisionTask.
Definition ChoiceEvent.h:15
Represents the event of a token entering a node.
const Token * token
Definition Event.h:18
Represents the event of a token exiting a node.
Represents the event of a message from the message pool being delivered.