20 , reader(
CSVReader(instanceFileOrString) )
22 for (
auto& [ attributeId, attribute ] :
attributes[
nullptr] ) {
23 if ( attribute->expression ) {
24 if ( attribute->expression->compiled.getVariables().size() || attribute->expression->compiled.getCollections().size() ) {
25 throw std::runtime_error(
"StaticDataProvider: initial value of global attribute '" + attribute->id +
"' must not be derived from other attributes");
27 globalValueMap[ attribute ] = attribute->expression->compiled.evaluate();
37 enum {PROCESS_ID, INSTANCE_ID, ATTRIBUTE_ID, VALUE};
40 if ( table.empty() ) {
44 for (
auto &row : table | std::views::drop(1)) {
48 if ( row.size() != 4 ) {
49 throw std::runtime_error(
"StaticDataProvider: illegal number of cells");
51 if ( !std::holds_alternative<std::string>(row.at(PROCESS_ID)) ) {
52 throw std::runtime_error(
"StaticDataProvider: illegal process id");
54 std::string processId = std::get<std::string>(row.at(PROCESS_ID));
56 if ( processId.size() ) {
58 auto processIt = std::find_if(
59 model->processes.begin(),
60 model->processes.end(),
61 [&processId](
const std::unique_ptr<BPMN::Process>& process) { return process->id == processId;}
63 if ( processIt ==
model->processes.end() ) {
64 throw std::runtime_error(
"StaticDataProvider: model has no process '" + processId +
"'");
67 auto process = processIt->get();
69 if ( !std::holds_alternative<std::string>(row.at(INSTANCE_ID)) ) {
70 throw std::runtime_error(
"StaticDataProvider: illegal instance id");
82 if ( !std::holds_alternative<std::string>(row.at(ATTRIBUTE_ID)) ) {
83 throw std::runtime_error(
"StaticDataProvider: illegal attribute id");
85 std::string attributeId = std::get<std::string>(row.at(ATTRIBUTE_ID));
88 if ( attributeId ==
"" ) {
93 if ( !
attributes[process].contains(attributeId) ) {
94 throw std::runtime_error(
"StaticDataProvider: process '" + processId +
"' has no node with attribute '" + attributeId +
"'");
97 auto attribute =
attributes[process][attributeId];
98 if ( attribute->expression ) {
99 throw std::runtime_error(
"StaticDataProvider: value of attribute '" + attributeId +
"' is initialized by expression and must not be provided explicitly");
102 if ( !std::holds_alternative<BPMNOS::number>(row.at(VALUE)) ) {
103 throw std::runtime_error(
"StaticDataProvider: illegal value");
105 instance.data[ attribute ] = std::get<BPMNOS::number>(row.at(VALUE));
110 if ( !std::holds_alternative<std::string>(row.at(ATTRIBUTE_ID)) ) {
111 throw std::runtime_error(
"StaticDataProvider: illegal attribute id");
113 std::string attributeId = std::get<std::string>(row.at(ATTRIBUTE_ID));
115 auto attribute =
attributes[
nullptr][attributeId];
116 if ( !std::holds_alternative<BPMNOS::number>(row.at(VALUE)) ) {
117 throw std::runtime_error(
"StaticDataProvider: illegal value");
119 globalValueMap[attribute] = std::get<BPMNOS::number>(row.at(VALUE));
170 for (
auto& [
id, instance] :
instances ) {
172 auto& instantiation = instance.data[timestampAttribute];
173 scenario->addInstance(instance.process,
id, { {}, {{earliestInstantiation, instantiation}} });
174 for (
auto& [attribute, value] : instance.data ) {
175 scenario->setRealization( scenario->getAttributeData(
id, attribute), {earliestInstantiation, value} );