BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
BestMatchingMessageDelivery.cpp
Go to the documentation of this file.
5#include <cassert>
6
7using namespace BPMNOS::Execution;
8
13
21
22std::shared_ptr<Event> BestMatchingMessageDelivery::dispatchEvent( [[maybe_unused]] const SystemState* systemState ) {
23 for ( auto& [ token_ptr, request_ptr, message_ptr, decision ] : decisionsWithoutEvaluation ) {
24 assert(decision);
25 if ( decision ) {
26//std::cerr << "Re-evaluate message delivery decision: " << decision->jsonify().dump() << std::endl;
27 auto evaluation = decision->evaluate();
28 addEvaluation( token_ptr, request_ptr, message_ptr, std::move(decision), evaluation );
29 }
30 }
32
33
34/*
35 for ( auto [ cost, token_ptr, request_ptr, message_ptr, event_ptr ] : evaluatedDecisions ) {
36if ( cost < 1000 )
37std::cerr << "Message delivery decision " << event_ptr.lock()->jsonify() << " evaluated with " << cost << std::endl;
38 }
39*/
40 for ( auto [ cost, token_ptr, request_ptr, message_ptr, event_ptr ] : evaluatedDecisions ) {
41 // return best evaluated decision
42//std::cerr << "\nBest message delivery decision " << event_ptr.lock()->jsonify() << " evaluated with " << cost << std::endl;
43 return event_ptr.lock();
44 }
45
46//std::cerr << "No evaluated message delivery decision" << std::endl;
47 return nullptr;
48}
49
52 auto request = static_cast<const DecisionRequest*>(observable);
53 assert(request->token->node);
54//std::cerr << "MessageDeliveryRequest: " << request->token->jsonify().dump() << std::endl;
55
56 auto messageDefinition = request->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>()->getMessageDefinition(request->token->status);
57 auto recipientHeader = messageDefinition->getRecipientHeader(request->token->getAttributeRegistry(),request->token->status,*request->token->data,request->token->globals);
58 requests.emplace_back( request->token->weak_from_this(), request->weak_from_this(), recipientHeader );
59
60 auto senderCandidates = request->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>()->messageCandidates;
61 // determine candidate decisions
62 for ( auto& [ message_ptr ] : messages ) {
63//std::cerr << "Candidate: " <<std::make_shared<MessageDeliveryDecision>(request->token, message_ptr.lock().get(), evaluator)->jsonify().dump() << std::endl;
64 if ( auto message = message_ptr.lock();
65 message &&
66 std::ranges::contains(senderCandidates, message->origin) &&
67 message->matches(recipientHeader)
68 ) {
69//std::cerr << "match" << std::endl;
70 auto decision = std::make_shared<MessageDeliveryDecision>(request->token, message.get(), evaluator);
71 decisionsWithoutEvaluation.emplace_back( request->token->weak_from_this(), request->weak_from_this(), message_ptr, decision );
72 }
73 }
74 }
75 else if ( observable->getObservableType() == Observable::Type::Message ) {
76 auto message = static_cast<const Message*>(observable);
77//std::cerr << "Message: " << message->jsonify().dump() << std::endl;
78 if ( message->state == Message::State::CREATED ) {
79 messages.emplace_back( message->weak_from_this() );
80 // add new decision
81 auto recipientCandidates = message->origin->extensionElements->as<BPMNOS::Model::ExtensionElements>()->messageCandidates;
82 for ( auto& [token_ptr, request_ptr, recipientHeader ] : requests ) {
83//std::cerr << "Candidate: " <<std::make_shared<MessageDeliveryDecision>(token_ptr.lock().get(), message, evaluator)->jsonify().dump() << std::endl;
84 if ( auto token = token_ptr.lock();
85 token &&
86 std::ranges::contains(recipientCandidates, token->node) &&
87 message->matches(recipientHeader)
88 ) {
89//std::cerr << "match" << std::endl;
90 auto decision = std::make_shared<MessageDeliveryDecision>(token.get(), message, evaluator);
91 decisionsWithoutEvaluation.emplace_back( token_ptr, request_ptr, message->weak_from_this(), decision );
92 }
93 }
94 }
95 }
96 else {
97 GreedyDispatcher::notice(observable);
98 }
99}
100
std::shared_ptr< Event > dispatchEvent(const SystemState *systemState) override
void notice(const Observable *observable) override
Represents an abstract base class for a pending Evaluator.
Definition Evaluator.h:15
Class for dispatching the event with the best evaluation.
void notice(const Observable *observable) override
void connect(Mediator *mediator) override
void addSubscriber(Observer *subscriber, ObservableTypes... observableTypes)
Definition Notifier.h:16
A class representing the state that the execution or simulation of a given scenario is in.
Definition SystemState.h:21
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