12 , attributes(attributes)
13 , inception(inception)
14 , completion(completion)
17 for (
auto& [ attribute, value ] : globalValueMap ) {
18 globals[attribute->index] = value;
25 , attributes(other.attributes)
26 , inception(other.inception)
27 , completion(other.completion)
30 for (
auto& [identifier, instance] : other.
instances) {
31 std::unordered_map< const Attribute*, Data > data;
32 for ( auto& [attribute, attributeData] : instance.data ) {
33 data[attribute] = attributeData;
35 instances[(
long unsigned int)identifier] = {instance.process,instance.id,instance.instantiation,data};
41 instances[(
long unsigned int)instanceId] = {process,(
long unsigned int)instanceId,instantiation,{}};
42 auto& instanceData =
instances[(
long unsigned int)instanceId];
45 for (
auto& [
id,attribute] :
attributes.at(process) ) {
46 instanceData.data[attribute] = { {}, std::nullopt };
52 auto& instanceData =
instances[(
long unsigned int)instanceId];
53 if ( instanceData.instantiation.realization ) {
54 throw std::runtime_error(
"Scenario: illegal removal of instance '" +
BPMNOS::to_string(instanceId,
STRING) +
"'with known realization");
56 instances.erase((
long unsigned int)instanceId);
61 throw std::runtime_error(
"Scenario: disclosures must be provided in strictly increasing order");
84 std::vector< const Scenario::InstanceData* > knownInstances;
86 for (
auto& [
id, instance] :
instances ) {
87 if ( instance.instantiation.realization
88 && instance.instantiation.realization->disclosure <= currentTime
89 && instance.instantiation.realization->value.value() <= currentTime
91 knownInstances.push_back(&instance);
94 return knownInstances;
98 std::vector< const Scenario::InstanceData* > knownInstances;
100 for (
auto& [
id, instance] :
instances ) {
101 if ( instance.instantiation.realization
102 && instance.instantiation.realization->disclosure <= currentTime
104 knownInstances.push_back(&instance);
107 return knownInstances;
111 std::vector< const Scenario::InstanceData* > anticipatedInstances;
113 for (
auto& [
id, instance] :
instances ) {
114 if ( instance.instantiation.realization
115 && instance.instantiation.realization->disclosure <= currentTime
120 else if ( instance.instantiation.anticipations.size()
121 && instance.instantiation.anticipations.front().disclosure <= currentTime
123 anticipatedInstances.push_back(&instance);
126 return anticipatedInstances;
130 std::vector< std::tuple<const BPMN::Process*, BPMNOS::Values, BPMNOS::Values> > instantiations;
132 for (
auto& [
id, instance] :
instances ) {
133 if ( instance.instantiation.realization
134 && instance.instantiation.realization->value.value() == currentTime
140 return instantiations;
144 std::vector< std::tuple<const BPMN::Process*, BPMNOS::Values, BPMNOS::Values> > instantiations;
146 for (
auto& [
id, instance] :
instances ) {
147 if ( instance.instantiation.realization
148 && instance.instantiation.realization->disclosure <= currentTime
149 && instance.instantiation.realization->value.value() == assumedTime
154 else if ( instance.instantiation.anticipations.size()
155 && instance.instantiation.anticipations.front().disclosure <= currentTime
163 return instantiations;
169 assert( instance->
data.contains(attribute.get()) );
170 auto& data = instance->
data.at(attribute.get());
171 if ( data.realization.has_value() && data.realization.value().disclosure > currentTime ) {
175 initalStatus.push_back(
getKnownValue(instance,attribute.get(),currentTime) );
183 assert( instance->
data.contains(attribute.get()) );
184 auto& data = instance->
data.at(attribute.get());
185 if ( data.realization.has_value() && data.realization.value().disclosure > currentTime ) {
189 initalData.push_back(
getKnownValue(instance,attribute.get(),currentTime) );
195 auto& data = instance->
data.at(attribute);
197 if ( data.realization.has_value() ) {
198 auto realization = data.realization.value();
199 if ( realization.disclosure > currentTime ) {
204 return realization.value;
213 auto& instanceData =
instances.at((
size_t)instanceId);
219 auto& instanceData =
instances.at((
size_t)instanceId);
223 assert( instanceData.data.contains(attribute.get()) );
224 values.push_back(
getKnownValue(&instanceData,attribute.get(),currentTime) );
232 auto& instanceData =
instances.at((
size_t)instanceId);
236 assert( instanceData.data.contains(attribute.get()) );
237 values.push_back(
getKnownValue(&instanceData,attribute.get(),currentTime) );
244 auto& data = instance->
data.at(attribute);
245 if ( data.realization && data.realization->disclosure <= currentTime ) {
247 return data.realization->value;
249 else if ( data.anticipations.size() && data.anticipations.front().disclosure <= currentTime ) {
259 auto& instanceData =
instances.at((
size_t)instanceId);
266 assert( instance->
data.contains(attribute.get()) );
275 assert( instance->
data.contains(attribute.get()) );
283 auto& instanceData =
instances.at((
size_t)instanceId);
288 assert( instanceData.data.contains(attribute.get()) );
295 auto& instanceData =
instances.at((
size_t)instanceId);
306 auto it = std::upper_bound(data.begin(), data.end(), currentTime,
309 if (it == data.begin()) {
310 throw std::runtime_error(
"Scenario: illegal request for latest disclosure");
319 auto& instanceData =
instances[(size_t)instanceId];
320 return instanceData.instantiation;
324 auto& instanceData =
instances[(size_t)instanceId];
325 return instanceData.data[attribute];
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.
std::vector< std::unique_ptr< Attribute > > attributes
Vector containing new global attributes declared for the model.
The Scenario class holds data for all BPMN instances.
BPMNOS::number inception
Time earliest time in execution.
std::vector< std::tuple< const BPMN::Process *, BPMNOS::Values, BPMNOS::Values > > getCurrentInstantiations(const BPMNOS::number currentTime) const
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
Method returning the initial status of a known instantiation at the given time.
Values getKnownInitialData(const InstanceData *, const BPMNOS::number time) const
Method returning the initial data attributes of a known instantiation at the given time.
std::optional< BPMNOS::number > getAnticipatedValue(const Scenario::InstanceData *instance, const BPMNOS::Model::Attribute *attribute, const BPMNOS::number currentTime) const
Method returning disclosed value of an attribute.
std::vector< const InstanceData * > getCreatedInstances(const BPMNOS::number currentTime) const
Method returning a vector of all instances that have been created until the given time.
std::optional< BPMNOS::Values > getKnownData(const BPMNOS::number instanceId, const BPMN::Node *node, const BPMNOS::number currentTime) const
Method returning all known values of new attributes.
Data & getAttributeData(const BPMNOS::number instanceId, const Attribute *attribute)
const DataInput & attributes
Map holding all attributes in the model with keys being the process and attribute id.
BPMNOS::number completion
The latest time in execution at which an instantiation can happen.
const Scenario::Disclosure & getLatestDisclosure(const std::vector< Scenario::Disclosure > &data, const BPMNOS::number currentTime) const
bool isCompleted(const BPMNOS::number currentTime) const
Method returning true if the currentTime exceeds the completion time.
std::unordered_map< size_t, InstanceData > instances
Map of instances with key being the instance id.
BPMNOS::Values getAnticipatedInitialStatus(const InstanceData *, const BPMNOS::number currentTime) const
Method returning the initial status of an anticipated instantiation at the given time.
void setRealization(Data &data, Disclosure realization)
const Model * getModel() const
Scenario(const Model *model, BPMNOS::number inception, BPMNOS::number completion, const DataInput &attributes, const std::unordered_map< const Attribute *, BPMNOS::number > &globalValueMap, unsigned int index=0)
Constructor for Scenario.
void removeAnticipatedInstance(const BPMNOS::number instanceId)
std::optional< BPMNOS::Values > getKnownValues(const BPMNOS::number instanceId, const BPMN::Node *node, const BPMNOS::number currentTime) const
Method returning all known values of new attributes.
void addAnticipation(Data &data, Disclosure anticipation)
Data & getInstantiationData(const BPMNOS::number instanceId)
void addInstance(const BPMN::Process *process, const BPMNOS::number instanceId, Data instantiation)
std::vector< const InstanceData * > getAnticipatedInstances(const BPMNOS::number currentTime) const
Method returning a vector of all instances that are anticipated and not known for sure at the given t...
std::vector< const InstanceData * > getKnownInstances(const BPMNOS::number currentTime) const
Method returning a vector of all instances that have been created or are known for sure until the giv...
std::vector< std::tuple< const BPMN::Process *, BPMNOS::Values, BPMNOS::Values > > getAnticipatedInstantiations(const BPMNOS::number currentTime, const BPMNOS::number assumedTime) const
Method returning a vector of all instances that are anticipated to be instantiated at the assumed tim...
BPMNOS::Values getAnticipatedInitialData(const InstanceData *, const BPMNOS::number currentTime) const
Method returning the initial data attributes of an anticipated instantiation at the given time.
BPMNOS::Values getAnticipatedData(const BPMNOS::number instanceId, const BPMN::Node *node, const BPMNOS::number currentTime) const
Method returning the disclosed values of new attributes.
std::optional< BPMNOS::number > getKnownValue(const Scenario::InstanceData *instance, const BPMNOS::Model::Attribute *attribute, const BPMNOS::number currentTime) const
Method returning a known value of an attribute.
BPMNOS::Values getAnticipatedValues(const BPMNOS::number instanceId, const BPMN::Node *node, const BPMNOS::number currentTime) const
Method returning the disclosed values of new attributes.
const Model * model
Pointer to the BPMN model.
BPMNOS::number getInception() const
Method returning the time of the earliest instantiation.
std::unique_ptr< ExtensionElements > extensionElements
Base class for all nodes in a BPMN model.
std::unordered_map< const BPMN::Process *, std::unordered_map< std::string, const Attribute * > > DataInput
std::string to_string(number numericValue, const ValueType &type)
Converts a number to a string.
BPMNOS_NUMBER_TYPE number
std::optional< Disclosure > realization
std::vector< Disclosure > anticipations
BPMNOS::number disclosure
Time at which the value is disclosed.
std::optional< BPMNOS::number > value
Value that the attribute takes at the time of disclosed.
std::unordered_map< const Attribute *, Data > data
Data regarding attribute values.
const BPMN::Process * process
size_t id
Instance identifier.