BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
StaticScenario.cpp
Go to the documentation of this file.
1#include "StaticScenario.h"
4
5using namespace BPMNOS::Model;
6
7StaticScenario::StaticScenario(const Model* model, BPMNOS::number earliestInstantiationTime, BPMNOS::number latestInstantiationTime, const std::unordered_map< const Attribute*, BPMNOS::number >& globalValueMap)
8 : earliestInstantiationTime(earliestInstantiationTime)
9 , latestInstantiationTime(latestInstantiationTime)
10{
11 this->model = model;
12 globals.resize(model->attributes.size());
13 for ( auto& [attribute, value] : globalValueMap ) {
14 globals[attribute->index] = value;
15 }
16}
17
18void StaticScenario::addInstance(const BPMN::Process* process, const BPMNOS::number instanceId, BPMNOS::number instantiationTime) {
19 instances[(size_t)instanceId] = {process, (size_t)instanceId, instantiationTime, {}};
20}
21
22void StaticScenario::setValue(const BPMNOS::number instanceId, const Attribute* attribute, std::optional<BPMNOS::number> value) {
23 instances[(size_t)instanceId].values[attribute] = value;
24}
25
29
30bool StaticScenario::isCompleted(const BPMNOS::number currentTime) const {
31 return currentTime > latestInstantiationTime;
32}
33
34std::vector< const Scenario::InstanceData* > StaticScenario::getCreatedInstances(const BPMNOS::number currentTime) const {
35 std::vector< const Scenario::InstanceData* > result;
36 for ( auto& [id, instance] : instances ) {
37 if ( instance.instantiationTime <= currentTime ) {
38 result.push_back(&instance);
39 }
40 }
41 return result;
42}
43
44std::vector< const Scenario::InstanceData* > StaticScenario::getKnownInstances([[maybe_unused]] const BPMNOS::number currentTime) const {
45 // All instances are known from the start
46 std::vector< const Scenario::InstanceData* > result;
47 for ( auto& [id, instance] : instances ) {
48 result.push_back(&instance);
49 }
50 return result;
51}
52
53std::vector< std::tuple<const BPMN::Process*, BPMNOS::Values, BPMNOS::Values> > StaticScenario::getCurrentInstantiations(const BPMNOS::number currentTime) const {
54 std::vector< std::tuple<const BPMN::Process*, BPMNOS::Values, BPMNOS::Values> > result;
55 for ( auto& [id, instance] : instances ) {
56 if ( instance.instantiationTime == currentTime ) {
57 result.push_back({instance.process, getKnownInitialStatus(&instance, currentTime), getKnownInitialData(&instance, currentTime)});
58 }
59 }
60 return result;
61}
62
64 BPMNOS::Values result;
65 for ( auto& attribute : instance->process->extensionElements->as<const BPMNOS::Model::ExtensionElements>()->attributes ) {
66 result.push_back( getKnownValue(instance, attribute.get(), currentTime) );
67 }
68 return result;
69}
70
72 BPMNOS::Values result;
73 for ( auto& attribute : instance->process->extensionElements->as<const BPMNOS::Model::ExtensionElements>()->data ) {
74 result.push_back( getKnownValue(instance, attribute.get(), currentTime) );
75 }
76 return result;
77}
78
79std::optional<BPMNOS::number> StaticScenario::getKnownValue(const Scenario::InstanceData* instance, const BPMNOS::Model::Attribute* attribute, [[maybe_unused]] const BPMNOS::number currentTime) const {
80 if ( attribute->expression && attribute->expression->type == Expression::Type::ASSIGN ) {
81 // Value is computed from an expression
82 std::vector<double> variableValues;
83 for ( auto input : attribute->expression->variables ) {
84 if ( !input->isImmutable ) {
85 return std::nullopt;
86 }
87 auto value = getKnownValue(instance, input, currentTime);
88 if ( !value.has_value() ) {
89 return std::nullopt;
90 }
91 variableValues.push_back( (double)value.value() );
92 }
93
94 std::vector<std::vector<double>> collectionValues;
95 for ( auto input : attribute->expression->collections ) {
96 if ( !input->isImmutable ) {
97 return std::nullopt;
98 }
99 collectionValues.push_back( {} );
100 auto collection = getKnownValue(instance, input, currentTime);
101 if ( !collection.has_value() ) {
102 return std::nullopt;
103 }
104 for ( auto value : collectionRegistry[(size_t)collection.value()] ) {
105 collectionValues.back().push_back( value );
106 }
107 }
108
109 return number(attribute->expression->compiled.evaluate(variableValues, collectionValues));
110 }
111 else {
112 // Return stored value directly
113 if ( instance->values.contains(attribute) ) {
114 return instance->values.at(attribute);
115 }
116 }
117 return std::nullopt;
118}
119
120std::optional<BPMNOS::number> StaticScenario::getKnownValue(const BPMNOS::number instanceId, const BPMNOS::Model::Attribute* attribute, const BPMNOS::number currentTime) const {
121 return getKnownValue(&instances.at((size_t)instanceId), attribute, currentTime);
122}
123
124std::optional<BPMNOS::Values> StaticScenario::getKnownValues(const BPMNOS::number instanceId, const BPMN::Node* node, const BPMNOS::number currentTime) const {
125 auto& instance = instances.at((size_t)instanceId);
126 Values result;
127 for ( auto& attribute : node->extensionElements->as<const BPMNOS::Model::ExtensionElements>()->attributes ) {
128 result.push_back( getKnownValue(&instance, attribute.get(), currentTime) );
129 }
130 return result;
131}
132
133std::optional<BPMNOS::Values> StaticScenario::getKnownData(const BPMNOS::number instanceId, const BPMN::Node* node, const BPMNOS::number currentTime) const {
134 auto& instance = instances.at((size_t)instanceId);
135 Values result;
136 for ( auto& attribute : node->extensionElements->as<const BPMNOS::Model::ExtensionElements>()->data ) {
137 result.push_back( getKnownValue(&instance, attribute.get(), currentTime) );
138 }
139 return result;
140}
CollectionRegistry collectionRegistry
std::unique_ptr< const Expression > expression
Definition Attribute.h:31
Class holding extension elements representing execution data for nodes.
std::vector< std::unique_ptr< Attribute > > attributes
Vector containing new status attributes declared for the node.
std::vector< std::unique_ptr< Attribute > > data
Vector containing data attributes declared for data objects within the node's scope.
Represents a BPMN model with all its processes.
Definition Model.h:22
std::vector< std::unique_ptr< Attribute > > attributes
Vector containing new global attributes declared for the model.
Definition Model.h:70
const Model * model
Pointer to the BPMN model.
Definition Scenario.h:148
BPMNOS::Values globals
Definition Scenario.h:144
std::unordered_map< size_t, InstanceData > instances
std::optional< BPMNOS::number > getKnownValue(const Scenario::InstanceData *instance, const BPMNOS::Model::Attribute *attribute, const BPMNOS::number currentTime) const override
Method returning a known value of an attribute.
std::vector< const InstanceData * > getKnownInstances(const BPMNOS::number currentTime) const override
Method returning a vector of all instances that have been created or are known for sure until the giv...
void setValue(const BPMNOS::number instanceId, const Attribute *attribute, std::optional< BPMNOS::number > value)
std::vector< const InstanceData * > getCreatedInstances(const BPMNOS::number currentTime) const override
Method returning a vector of all instances that have been created until the given time.
void addInstance(const BPMN::Process *process, const BPMNOS::number instanceId, BPMNOS::number instantiationTime)
BPMNOS::number earliestInstantiationTime
std::optional< BPMNOS::Values > getKnownValues(const BPMNOS::number instanceId, const BPMN::Node *node, const BPMNOS::number currentTime) const override
Method returning all known values of new attributes.
BPMNOS::number latestInstantiationTime
std::optional< BPMNOS::Values > getKnownData(const BPMNOS::number instanceId, const BPMN::Node *node, const BPMNOS::number currentTime) const override
Method returning all known values of new attributes.
Values getKnownInitialData(const InstanceData *, const BPMNOS::number time) const override
Method returning the initial data attributes for process instantiation.
bool isCompleted(const BPMNOS::number currentTime) const override
Method returning true if the currentTime exceeds the completion time.
BPMNOS::number getEarliestInstantiationTime() const override
Method returning the time of the earliest instantiation.
StaticScenario(const Model *model, BPMNOS::number earliestInstantiationTime, BPMNOS::number latestInstantiationTime, const std::unordered_map< const Attribute *, BPMNOS::number > &globalValueMap)
std::vector< std::tuple< const BPMN::Process *, BPMNOS::Values, BPMNOS::Values > > getCurrentInstantiations(const BPMNOS::number currentTime) const override
Method returning a vector of all instances that are known to be instantiated at the given time.
Values getKnownInitialStatus(const InstanceData *, const BPMNOS::number time) const override
Method returning the initial status attributes for process instantiation.
std::unique_ptr< ExtensionElements > extensionElements
Definition bpmn++.h:16299
Base class for all nodes in a BPMN model.
Definition bpmn++.h:16444
BPMNOS_NUMBER_TYPE number
Definition Number.h:50
std::unordered_map< const Attribute *, std::optional< BPMNOS::number > > values
Attribute values.
Definition Scenario.h:27
const BPMN::Process * process
Definition Scenario.h:24