BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
DecisionTask.cpp
Go to the documentation of this file.
1#include "DecisionTask.h"
3#include <cassert>
4
5using namespace BPMNOS::Model;
6
8 : BPMN::Node(task)
9 , BPMN::FlowNode(task,parent)
10 , BPMN::Task(task,parent)
11{
12}
13
14template <typename DataType>
15std::vector<std::vector<BPMNOS::number>> DecisionTask::enumerateAlternatives(const BPMNOS::Values& status, const DataType& data, const BPMNOS::Values& globals) const {
16 assert(extensionElements->represents<ExtensionElements>());
18 assert(!extensionElements->choices.empty());
19
20 BPMNOS::Values statusCopy = status;
21 BPMNOS::Values dataCopy = data;
22 BPMNOS::Values globalsCopy = globals;
23 std::vector<std::vector<BPMNOS::number>> alternativeChoices;
24 std::vector<BPMNOS::number> tmp(extensionElements->choices.size());
25 determineAlternatives(alternativeChoices, extensionElements, statusCopy, dataCopy, globalsCopy, tmp, 0);
26
27 return alternativeChoices;
28}
29
30template std::vector<std::vector<BPMNOS::number>> DecisionTask::enumerateAlternatives<BPMNOS::Values>(const BPMNOS::Values& status, const BPMNOS::Values& data, const BPMNOS::Values& globals) const;
31
32template std::vector<std::vector<BPMNOS::number>> DecisionTask::enumerateAlternatives<BPMNOS::SharedValues>(const BPMNOS::Values& status, const BPMNOS::SharedValues& data, const BPMNOS::Values& globals) const;
33
34
35void DecisionTask::determineAlternatives(
36 std::vector<std::vector<BPMNOS::number>>& alternatives,
37 const ExtensionElements* extensionElements,
38 BPMNOS::Values& status,
39 BPMNOS::Values& data,
40 BPMNOS::Values& globals,
41 std::vector<number>& choices,
42 size_t index
43) {
44 assert(index < choices.size());
45 auto& choice = extensionElements->choices[index];
46
47 auto choose = [&](number value) -> void {
48 choices[index] = value;
49 choice->attributeRegistry.setValue(choice->attribute, status, data, globals, value);
50 if ( index + 1 == choices.size() ) {
51 alternatives.push_back(choices);
52 }
53 else {
54 determineAlternatives(alternatives, extensionElements, status, data, globals, choices, index + 1);
55 }
56 };
57
58 if ( !choice->enumeration.empty() || choice->multipleOf ) {
59 // iterate through all given alternatives
60 for (auto value : choice->getEnumeration(status, data, globals) ) {
61 choose(value);
62 }
63 }
64 else if ( choice->lowerBound.has_value() && choice->upperBound.has_value() ) {
65 auto [min, max] = choice->getBounds(status, data, globals);
66 if ( min == max ) {
67 choose(min);
68 }
69 else if ( min < max ) {
70 choose(min);
71 choose(max);
72 }
73 }
74}
std::vector< std::vector< number > > enumerateAlternatives(const BPMNOS::Values &status, const DataType &data, const BPMNOS::Values &globals) const
DecisionTask(XML::bpmn::tTask *task, BPMN::Scope *parent)
Class holding extension elements representing execution data for nodes.
std::unique_ptr< ExtensionElements > extensionElements
Definition bpmn++.h:16299
Base class for BPMN elements that may contain a ChildNode elements.
Definition bpmn++.h:16510
BPMNOS_NUMBER_TYPE number
Definition Number.h:50
The BPMN namespace contains linked classes representing a BPMN model.
Definition bpmn++.h:16221