BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
StochasticScenario.h
Go to the documentation of this file.
1#ifndef BPMNOS_Model_StochasticScenario_H
2#define BPMNOS_Model_StochasticScenario_H
3
4#include <bpmn++.h>
5#include "Scenario.h"
8#include <memory>
9#include <random>
10#include <set>
11#include <map>
12
13namespace BPMNOS::Model {
14
15/**
16 * @brief Structure representing a pending disclosure.
17 *
18 * Stores a pre-computed value to be revealed at disclosure time.
19 * The value is computed at parse time using only global attributes.
20 */
22 const Attribute* attribute; ///< The attribute to initialize
23 BPMNOS::number disclosureTime; ///< Time when this attribute is disclosed
24 BPMNOS::number value; ///< Pre-computed value to reveal at disclosure time
25};
26
27/**
28 * @brief Structure representing an arrival expression.
29 *
30 * Stores the compiled expression to evaluate when a token arrives at an activity.
31 */
33 const Attribute* attribute; ///< The attribute to initialize
34 std::unique_ptr<Expression> expression; ///< Compiled expression to evaluate at arrival time
35};
36
37/**
38 * @brief Structure representing a completion expression.
39 *
40 * Stores the compiled expression to evaluate when a task completes.
41 */
43 const Attribute* attribute; ///< The attribute to update
44 std::unique_ptr<Expression> expression; ///< Compiled expression to evaluate at completion time
45};
46
47/**
48 * @brief A scenario implementation supporting stochastic behavior.
49 *
50 * StochasticScenario supports:
51 * - Random functions in INITIALIZATION, DISCLOSURE, and COMPLETION expressions
52 * - Per (instance, node) RNG for reproducibility
53 * - Downward compatible with static (3-column) and dynamic (4-column) CSV formats
54 */
56
59
60public:
62 const Model* model,
65 const std::unordered_map<const Attribute*, BPMNOS::number>& globalValueMap,
66 unsigned int seed = 0
67 );
68
70 bool isCompleted(const BPMNOS::number currentTime) const override;
71
72 std::vector<std::tuple<const BPMN::Process*, BPMNOS::Values, BPMNOS::Values>> getCurrentInstantiations(const BPMNOS::number currentTime) const override;
73
74 std::vector<const InstanceData*> getCreatedInstances(const BPMNOS::number currentTime) const override;
75 std::vector<const InstanceData*> getKnownInstances(const BPMNOS::number currentTime) const override;
76
77 std::optional<BPMNOS::number> getKnownValue(const Scenario::InstanceData* instance, const BPMNOS::Model::Attribute* attribute, const BPMNOS::number currentTime) const override;
78 std::optional<BPMNOS::number> getKnownValue(const BPMNOS::number instanceId, const BPMNOS::Model::Attribute* attribute, const BPMNOS::number currentTime) const override;
79
80 std::optional<BPMNOS::Values> getKnownValues(const BPMNOS::number instanceId, const BPMN::Node* node, const BPMNOS::number currentTime) const override;
81 std::optional<BPMNOS::Values> getKnownData(const BPMNOS::number instanceId, const BPMN::Node* node, const BPMNOS::number currentTime) const override;
82
83 /**
84 * @brief Store the completion status when a task enters BUSY state.
85 *
86 * Evaluates COMPLETION expressions immediately and stores the final result.
87 * Uses per-(instance, node) RNG for reproducibility.
88 */
90 const BPMNOS::number instanceId,
91 const BPMN::Node* task,
92 BPMNOS::Values status
93 ) const override;
94
95 void revealData(BPMNOS::number currentTime) const;
96
97 /**
98 * @brief Initialize arrival data when a token arrives at an activity.
99 *
100 * Evaluates ARRIVAL expressions using the parent scope's context and stores
101 * the computed values. Called by ScenarioUpdater when token enters ARRIVED
102 * or CREATED state at an Activity.
103 */
105 BPMNOS::number instanceId,
106 const BPMN::Node* node,
107 const Values& status,
108 const Values& data,
109 const Values& globals
110 ) const override;
111
112protected:
113 Values getKnownInitialStatus(const InstanceData*, const BPMNOS::number time) const override;
114 Values getKnownInitialData(const InstanceData*, const BPMNOS::number time) const override;
115
116 void addInstance(const BPMN::Process* process, const BPMNOS::number instanceId, BPMNOS::number instantiationTime);
117 void setValue(const BPMNOS::number instanceId, const Attribute* attribute, std::optional<BPMNOS::number> value);
118 void setDisclosure(const BPMNOS::number instanceId, const BPMN::Node* node, BPMNOS::number disclosureTime);
119 void addPendingDisclosure(const BPMNOS::number instanceId, StochasticPendingDisclosure&& pending);
120 void addCompletionExpression(const BPMNOS::number instanceId, const BPMN::Node* task, CompletionExpression&& expr);
121 void addArrivalExpression(const BPMNOS::number instanceId, const BPMN::Node* node, ArrivalExpression&& expr);
122
123 /// Get or create RNG for (instance, node) pair
124 std::mt19937& getRng(size_t instanceId, const BPMN::Node* node) const;
125
126 mutable std::unordered_map<size_t, InstanceData> instances;
127 std::unordered_map<size_t, std::unordered_map<const BPMN::Node*, BPMNOS::number>> disclosure; ///< Instance ID -> Node -> disclosure time
128 mutable std::unordered_map<size_t, std::vector<StochasticPendingDisclosure>> pendingDisclosures; ///< Instance ID -> pending disclosures
129 mutable std::set<std::pair<size_t, const Attribute*>> disclosedAttributes; ///< Track which attributes have been disclosed
130
131 /// Arrival expressions per (instance, node)
132 std::unordered_map<size_t, std::unordered_map<const BPMN::Node*, std::vector<ArrivalExpression>>> arrivalExpressions;
133
134 /// Completion expressions per (instance, node)
135 std::unordered_map<size_t, std::unordered_map<const BPMN::Node*, std::vector<CompletionExpression>>> completionExpressions;
136
137 /// Per (instance, node) RNG for reproducibility
138 mutable std::map<std::pair<size_t, const BPMN::Node*>, std::mt19937> rngs;
139
140 unsigned int scenarioSeed;
143
144 /// RandomDistributionFactory for expression evaluation (set by provider)
146};
147
148} // namespace BPMNOS::Model
149
150#endif // BPMNOS_Model_StochasticScenario_H
Represents a BPMN model with all its processes.
Definition Model.h:22
Abstract base class for scenarios holding data for all BPMN instances.
Definition Scenario.h:21
const Model * model
Pointer to the BPMN model.
Definition Scenario.h:148
BPMNOS::Values globals
Definition Scenario.h:144
Data provider supporting stochastic behavior.
std::unordered_map< size_t, std::vector< StochasticPendingDisclosure > > pendingDisclosures
Instance ID -> pending disclosures.
std::unordered_map< size_t, std::unordered_map< const BPMN::Node *, std::vector< ArrivalExpression > > > arrivalExpressions
Arrival expressions per (instance, node)
void revealData(BPMNOS::number currentTime) const
void setValue(const BPMNOS::number instanceId, const Attribute *attribute, std::optional< BPMNOS::number > value)
void addArrivalExpression(const BPMNOS::number instanceId, const BPMN::Node *node, ArrivalExpression &&expr)
void addInstance(const BPMN::Process *process, const BPMNOS::number instanceId, BPMNOS::number instantiationTime)
Values getKnownInitialData(const InstanceData *, const BPMNOS::number time) const override
Method returning the initial data attributes for process instantiation.
BPMNOS::number getEarliestInstantiationTime() const override
Method returning the time of the earliest instantiation.
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.
std::unordered_map< size_t, InstanceData > instances
void addPendingDisclosure(const BPMNOS::number instanceId, StochasticPendingDisclosure &&pending)
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 setTaskCompletionStatus(const BPMNOS::number instanceId, const BPMN::Node *task, BPMNOS::Values status) const override
Store the completion status when a task enters BUSY state.
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.
void setDisclosure(const BPMNOS::number instanceId, const BPMN::Node *node, BPMNOS::number disclosureTime)
std::set< std::pair< size_t, const Attribute * > > disclosedAttributes
Track which attributes have been disclosed.
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.
std::map< std::pair< size_t, const BPMN::Node * >, std::mt19937 > rngs
Per (instance, node) RNG for reproducibility.
Values getKnownInitialStatus(const InstanceData *, const BPMNOS::number time) const override
Method returning the initial status attributes for process instantiation.
bool isCompleted(const BPMNOS::number currentTime) const override
Method returning true if the currentTime exceeds the completion time.
RandomDistributionFactory * randomFactory
RandomDistributionFactory for expression evaluation (set by provider)
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::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.
std::mt19937 & getRng(size_t instanceId, const BPMN::Node *node) const
Get or create RNG for (instance, node) pair.
void initializeArrivalData(BPMNOS::number instanceId, const BPMN::Node *node, const Values &status, const Values &data, const Values &globals) const override
Initialize arrival data when a token arrives at an activity.
void addCompletionExpression(const BPMNOS::number instanceId, const BPMN::Node *task, CompletionExpression &&expr)
StochasticScenario(const Model *model, BPMNOS::number earliestInstantiationTime, BPMNOS::number latestInstantiationTime, const std::unordered_map< const Attribute *, BPMNOS::number > &globalValueMap, unsigned int seed=0)
std::unordered_map< size_t, std::unordered_map< const BPMN::Node *, BPMNOS::number > > disclosure
Instance ID -> Node -> disclosure time.
std::unordered_map< size_t, std::unordered_map< const BPMN::Node *, std::vector< CompletionExpression > > > completionExpressions
Completion expressions per (instance, node)
Factory for random distribution functions in LIMEX expressions.
Base class for all nodes in a BPMN model.
Definition bpmn++.h:16444
BPMNOS_NUMBER_TYPE number
Definition Number.h:50
Structure representing an arrival expression.
std::unique_ptr< Expression > expression
Compiled expression to evaluate at arrival time.
const Attribute * attribute
The attribute to initialize.
Structure representing a completion expression.
const Attribute * attribute
The attribute to update.
std::unique_ptr< Expression > expression
Compiled expression to evaluate at completion time.
Structure representing a pending disclosure.
const Attribute * attribute
The attribute to initialize.
BPMNOS::number disclosureTime
Time when this attribute is disclosed.
BPMNOS::number value
Pre-computed value to reveal at disclosure time.