BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
SeededGreedyController.cpp
Go to the documentation of this file.
3//#include <iostream>
4
5using namespace BPMNOS::Execution;
6
8 : SeededController(flattenedGraph)
9 , evaluator(evaluator)
10{
11 choiceDispatcher = std::make_unique<BisectionalChoice>(evaluator);
12}
13
15//std::cerr << "SeededGreedyController::notice" << std::endl;
16 SeededController::notice(observable);
17 if ( observable->getObservableType() == Observable::Type::Message ) {
18 auto message = static_cast<const Message*>(observable);
19 if ( message->state == Message::State::CREATED ) {
20//std::cerr << "Message created: " << message->jsonify() << std::endl;
21 messages.emplace_back( message->weak_from_this() );
22 }
23 }
24//std::cerr << "SeededGreedyController::noticed" << std::endl;
25}
26
27std::shared_ptr<Event> SeededGreedyController::createEntryEvent([[maybe_unused]] const SystemState* systemState, const Token* token, [[maybe_unused]] const Vertex* vertex) {
28 // instant entry ( if feasible )
29 auto decision = std::make_shared<EntryDecision>(token, evaluator);
30 auto reward = decision->evaluate();
31 if ( reward.has_value() ) {
32 return decision;
33 }
34 return nullptr;
35}
36
37std::shared_ptr<Event> SeededGreedyController::createExitEvent([[maybe_unused]] const SystemState* systemState, const Token* token, [[maybe_unused]] const Vertex* vertex) {
38 // instant exit ( if feasible )
39 auto decision = std::make_shared<ExitDecision>(token, evaluator);
40 auto reward = decision->evaluate();
41 if ( reward.has_value() ) {
42 return decision;
43 }
44 return nullptr;
45}
46
47std::shared_ptr<Event> SeededGreedyController::createChoiceEvent([[maybe_unused]] const SystemState* systemState, const Token* token, [[maybe_unused]] const Vertex* vertex) {
48 // instant choice
49 auto best = choiceDispatcher->determineBestChoices(token->decisionRequest);
50 if (!best) {
51 // no feasible choices found
52 return nullptr;
53 // return std::make_shared<ErrorEvent>(token);
54 }
55
56 return best;
57}
58
59std::shared_ptr<Event> SeededGreedyController::createMessageDeliveryEvent([[maybe_unused]] const SystemState* systemState, const Token* token, [[maybe_unused]] const Vertex* vertex) {
60//std::cerr << "SeededGreedyController::createMessageDeliveryEvent" << std::endl;
61 // obtain message candidates
62 auto messageDefinition = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>()->getMessageDefinition(token->status);
63 auto recipientHeader = messageDefinition->getRecipientHeader(token->getAttributeRegistry(),token->status,*token->data,token->globals);
64 auto senderCandidates = token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>()->messageCandidates;
65 std::list< std::shared_ptr<const Message> > candidates;
66//std::cerr << "Messages: " << !messages.empty() << std::endl;
67//std::cerr << "senderCandidate: " << senderCandidates.front()->id << std::endl;
68 // determine candidate messages
69 for ( auto& [ message_ptr ] : messages ) {
70//std::cerr << "Message: " << message_ptr.lock()->jsonify() << "/" << message_ptr.lock()->origin->id << "/" << message_ptr.lock()->matches(recipientHeader) << std::endl;
71 if( auto message = message_ptr.lock();
72 message &&
73 std::ranges::contains(senderCandidates, message->origin) &&
74 message->matches(recipientHeader)
75 ) {
76//std::cerr << "Candidate: " << message->jsonify() << std::endl;
77 candidates.emplace_back( message );
78 }
79 }
80
81 // evaluate message candidates
82 std::shared_ptr<MessageDeliveryDecision> best = nullptr;
83 for ( auto& message : candidates ) {
84 auto decision = std::make_shared<MessageDeliveryDecision>(token, message.get(), evaluator);
85 auto reward = decision->evaluate();
86 if (
87 reward.has_value() &&
88 ( !best || best->reward.value() < reward.value() )
89 ) {
90 best = decision;
91 }
92 }
93
94 if (!best) {
95 // no message can be delivered
96 if ( token->node->represents<BPMN::MessageStartEvent>() ) {
97 assert( vertex->exit<BPMN::MessageStartEvent>() );
98//std::cerr << "MessageStartEvent is not triggered: " << vertex->shortReference() << std::endl;
99 }
100 return nullptr;
101// return std::make_shared<ErrorEvent>(token);
102 }
103
104 return best;
105}
106
Represents an abstract base class for an evaluator determining feasibility and reward of a decision.
Definition Evaluator.h:15
Represents a graph containing all BPMN nodes that may receive a token during execution of a scenario.
A controller dispatching decisions in the order derived from a given seed.
void notice(const Observable *observable) override
void notice(const Observable *observable) override
auto_list< std::weak_ptr< const Message > > messages
std::unique_ptr< BisectionalChoice > choiceDispatcher
std::shared_ptr< Event > createChoiceEvent(const SystemState *systemState, const Token *token, const Vertex *vertex) override
Method creating a choice event.
std::shared_ptr< Event > createEntryEvent(const SystemState *systemState, const Token *token, const Vertex *vertex) override
Method creating an initial sequence of vertices.
SeededGreedyController(const BPMNOS::Execution::FlattenedGraph *flattenedGraph, Evaluator *evaluator)
std::shared_ptr< Event > createExitEvent(const SystemState *systemState, const Token *token, const Vertex *vertex) override
Method creating a choice event.
std::shared_ptr< Event > createMessageDeliveryEvent(const SystemState *systemState, const Token *token, const Vertex *vertex) override
Method creating a choice event.
A class representing the state that the execution or simulation of a given scenario is in.
Definition SystemState.h:21
Represents a token running through a (sub)process.
Definition Token.h:35
const BPMN::FlowNode * node
Definition Token.h:46
const BPMNOS::Model::AttributeRegistry & getAttributeRegistry() const
Definition Token.cpp:139
SharedValues * data
Pointer to the data of the owner or owned state machine subprocesses)
Definition Token.h:58
std::shared_ptr< DecisionRequest > decisionRequest
Definition Token.h:60
Class holding extension elements representing execution data for nodes.
std::unique_ptr< ExtensionElements > extensionElements
Definition bpmn++.h:16299
T * represents()
Attempts to cast the element to the specified type T.
Definition bpmn++.h:16236
virtual constexpr Type getObservableType() const =0