BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
BestEnumeratedChoice.cpp
Go to the documentation of this file.
6#include <cassert>
7//#include <iostream>
8
9using namespace BPMNOS::Execution;
10
15
22
23
26 assert( dynamic_cast<const DecisionRequest*>(observable) );
27 auto request = static_cast<const DecisionRequest*>(observable);
28 // create pseudo decision
29 auto decision = std::make_shared<ChoiceDecision>(request->token, std::vector<number>{}, evaluator);
30 decisionsWithoutEvaluation.emplace_back( request->token->weak_from_this(), request->weak_from_this(), decision );
31 }
32 else {
33 GreedyDispatcher::notice(observable);
34 }
35}
36
37std::shared_ptr<Event> BestEnumeratedChoice::dispatchEvent( [[maybe_unused]] const SystemState* systemState ) {
38//std::cout << "BestEnumeratedChoice::dispatchEvent" << std::endl;
39 if ( systemState->currentTime > timestamp ) {
40 timestamp = systemState->currentTime;
41 clockTick();
42 }
43
44 for ( auto& [ token_ptr, request_ptr, _ ] : decisionsWithoutEvaluation ) {
45 auto request = request_ptr.lock();
46 assert( request );
47 // forget previous decision and find new best decision for the request
48 auto decision = determineBestChoices( request );
49 if ( decision ) {
50 addEvaluation( token_ptr, request_ptr, std::move(decision), decision->reward );
51 }
52 }
54
55 for ( auto [ cost, token_ptr, request_ptr, event_ptr ] : evaluatedDecisions ) {
56//std::cerr << "Best choice decision " << event_ptr.lock()->jsonify() << " evaluated with " << cost << std::endl;
57 return event_ptr.lock();
58 }
59
60//std::cerr << "No evaluated choice decision" << std::endl;
61 return nullptr;
62}
63
64std::shared_ptr<Decision> BestEnumeratedChoice::determineBestChoices(std::shared_ptr<const DecisionRequest> request) {
65 auto token = request->token;
66 assert( token->node );
67 assert( token->node->represents<BPMNOS::Model::DecisionTask>() );
68 auto decisionTask = token->node->as<BPMNOS::Model::DecisionTask>();
69 assert( token->node->extensionElements->represents<BPMNOS::Model::ExtensionElements>() );
70 auto extensionElements = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>();
71 assert( extensionElements->choices.size() );
72
73 auto alternativeChoices = decisionTask->enumerateAlternatives(token->status, *token->data, token->globals);
74 std::shared_ptr<Decision> bestDecision = nullptr;
75 for ( auto& choices : alternativeChoices ) {
76 auto decision = std::make_shared<ChoiceDecision>(token, std::move(choices), evaluator);
77 decision->evaluate();
78 if (
79 decision->reward.has_value() &&
80 ( !bestDecision || decision->reward.value() > bestDecision->reward.value() )
81 ) {
82 bestDecision = decision;
83 }
84 }
85
86 // determine best alternative
87 return bestDecision;
88}
89
void connect(Mediator *mediator) override
std::shared_ptr< Decision > determineBestChoices(std::shared_ptr< const DecisionRequest > request)
void notice(const Observable *observable) override
std::shared_ptr< Event > dispatchEvent(const SystemState *systemState) override
Represents an abstract base class for an evaluator determining feasibility and reward of a decision.
Definition Evaluator.h:15
Class for dispatching the event with the best evaluation.
void addEvaluation(WeakPtrs..., std::shared_ptr< Decision > decision, std::optional< double > reward)
void notice(const Observable *observable) override
void connect(Mediator *mediator) override
void addSubscriber(Observer *subscriber, ObservableTypes... observableTypes)
Definition Notifier.h:17
A class representing the state that the execution or simulation of a given scenario is in.
Definition SystemState.h:21
Class representing a task in which one or more choices have to be made.
Class holding extension elements representing execution data for nodes.
Represents a pending decision.
Represents an abstract base class for a class that is an event listener and notifier.
Definition Mediator.h:13
virtual constexpr Type getObservableType() const =0