Skip to content

Commit c286f9e

Browse files
authored
import parameter mapping from .ssm and inline (#904)
* import parameter mapping from .ssm and inline * change temp directory * export inline parameter mapping to ssd
1 parent e814c71 commit c286f9e

14 files changed

Lines changed: 1065 additions & 75 deletions

File tree

src/OMSimulatorLib/System.cpp

Lines changed: 145 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,21 @@ oms_status_enu_t oms::System::importFromSSD(const pugi::xml_node& node, const st
528528
}
529529
else
530530
{
531-
// store the ssv files and process it later while handling the connection, so all the components are loaded
532-
ssvFileSources.push_back(ssvFileSource);
531+
// store the ssv and ssm files and process it later while handling the connection, so all the components are loaded
532+
pugi::xml_node parameterMapping = parameterBindingNode.child(oms::ssp::Version1_0::ssd::parameter_mapping);
533+
534+
// check for parameterMapping (e.g) <ssd:ParameterMapping>
535+
if (parameterMapping)
536+
{
537+
// parameterMapping provided
538+
std::string ssmFileSource = parameterMapping.attribute("source").as_string();
539+
startValuesFileSources[ssvFileSource] = ssmFileSource;
540+
}
541+
else
542+
{
543+
// no parameterMapping
544+
startValuesFileSources[ssvFileSource] = "";
545+
}
533546
}
534547
}
535548
}
@@ -718,8 +731,8 @@ oms_status_enu_t oms::System::importFromSSD(const pugi::xml_node& node, const st
718731
return logError("wrong xml schema detected: " + name);
719732
}
720733

721-
// check for ssvFileSource exist and set the values before the connections
722-
if (!ssvFileSources.empty())
734+
// check for ssv FileSource exist and set the values before the connections
735+
if (!startValuesFileSources.empty())
723736
{
724737
importStartValuesFromSSV();
725738
}
@@ -2343,57 +2356,157 @@ oms_status_enu_t oms::System::importBusConnectorGeometry(const pugi::xml_node& n
23432356

23442357
oms_status_enu_t oms::System::importStartValuesFromSSV()
23452358
{
2346-
for (const auto& ssvFileSource : ssvFileSources)
2359+
for (const auto& file : startValuesFileSources)
23472360
{
2348-
std::string tempdir = getModel()->getTempDirectory();
2349-
filesystem::path temp_root(tempdir);
2350-
pugi::xml_document ssvdoc;
2351-
pugi::xml_parse_result result = ssvdoc.load_file((temp_root / ssvFileSource).string().c_str());
2352-
pugi::xml_node parameterSet, parameters;
2361+
// mapping between a parameter in the source and a parameter of the system or component being parametrized
2362+
std::multimap<ComRef, ComRef> mappedEntry;
23532363

2354-
if (result) // check from ssv file
2355-
{
2356-
parameterSet = ssvdoc.document_element(); // ssv:ParameterSet
2357-
parameters = parameterSet.child(oms::ssp::Version1_0::ssv::parameters);
2358-
}
2359-
else if (getModel()->getSnapshot().child(oms::ssp::Version1_0::ssv_file)) // check in memory oms:ssv_file
2364+
// check for parameter mapping file ".ssm file"
2365+
if (!file.second.empty())
23602366
{
2361-
parameterSet = getModel()->getSnapshot().child(oms::ssp::Version1_0::ssv_file).child(oms::ssp::Version1_0::ssv::parameter_set); // ssv:ParameterSet
2362-
parameters = parameterSet.child(oms::ssp::Version1_0::ssv::parameters);
2367+
importParamterMappingFromSSM(file.second, mappedEntry);
2368+
importStartValuesFromSSVHelper(file.first, mappedEntry);
23632369
}
23642370
else
23652371
{
2366-
return logError("loading \"" + std::string(ssvFileSource) + "\" failed (" + std::string(result.description()) + ")");
2372+
// no mapping file provided, apply the values from ssv file
2373+
importStartValuesFromSSVHelper(file.first, mappedEntry);
23672374
}
2375+
}
23682376

2369-
if (parameters)
2377+
return oms_status_ok;
2378+
}
2379+
2380+
oms_status_enu_t oms::System::importStartValuesFromSSVHelper(std::string fileName, std::multimap<ComRef, ComRef> &mappedEntry)
2381+
{
2382+
std::string tempdir = getModel()->getTempDirectory();
2383+
filesystem::path temp_root(tempdir);
2384+
pugi::xml_document ssvdoc;
2385+
pugi::xml_parse_result result = ssvdoc.load_file((temp_root / fileName).string().c_str());
2386+
pugi::xml_node parameterSet, parameters;
2387+
2388+
if (result) // check from ssv file
2389+
{
2390+
parameterSet = ssvdoc.document_element(); // ssv:ParameterSet
2391+
parameters = parameterSet.child(oms::ssp::Version1_0::ssv::parameters);
2392+
}
2393+
else if (getModel()->getSnapshot().child(oms::ssp::Version1_0::ssv_file)) // check in memory oms:ssv_file
2394+
{
2395+
parameterSet = getModel()->getSnapshot().child(oms::ssp::Version1_0::ssv_file).child(oms::ssp::Version1_0::ssv::parameter_set); // ssv:ParameterSet
2396+
parameters = parameterSet.child(oms::ssp::Version1_0::ssv::parameters);
2397+
}
2398+
else
2399+
{
2400+
return logError("loading \"" + std::string(fileName) + "\" failed (" + std::string(result.description()) + ")");
2401+
}
2402+
2403+
if (parameters)
2404+
{
2405+
for (pugi::xml_node_iterator itparameters = parameters.begin(); itparameters != parameters.end(); ++itparameters)
23702406
{
2371-
for(pugi::xml_node_iterator itparameters = parameters.begin(); itparameters != parameters.end(); ++itparameters)
2407+
std::string name = itparameters->name();
2408+
std::vector<ComRef> mappedcrefs;
2409+
if (name == oms::ssp::Version1_0::ssv::parameter)
23722410
{
2373-
std::string name = itparameters->name();
2374-
if (name == oms::ssp::Version1_0::ssv::parameter)
2411+
ComRef cref = ComRef(itparameters->attribute("name").as_string());
2412+
// check cref has any mapping entry
2413+
if (!mappedEntry.empty())
23752414
{
2376-
ComRef cref = ComRef(itparameters->attribute("name").as_string());
2377-
if (itparameters->child(oms::ssp::Version1_0::ssv::real_type))
2415+
auto mapfind = mappedEntry.equal_range(cref);
2416+
for (auto it = mapfind.first; it != mapfind.second; ++it)
23782417
{
2379-
double value = itparameters->child(oms::ssp::Version1_0::ssv::real_type).attribute("value").as_double();
2418+
mappedcrefs.push_back(it->second);
2419+
}
2420+
}
2421+
2422+
if (itparameters->child(oms::ssp::Version1_0::ssv::real_type))
2423+
{
2424+
double value = itparameters->child(oms::ssp::Version1_0::ssv::real_type).attribute("value").as_double();
2425+
if (!mappedcrefs.empty())
2426+
{
2427+
for (const auto &mappedcref : mappedcrefs)
2428+
{
2429+
setReal(mappedcref, value);
2430+
}
2431+
}
2432+
else
2433+
{
2434+
// no mapping entry found, apply the default cref found in ssv file
23802435
setReal(cref, value);
23812436
}
2382-
else if(itparameters->child(oms::ssp::Version1_0::ssv::integer_type))
2437+
}
2438+
else if (itparameters->child(oms::ssp::Version1_0::ssv::integer_type))
2439+
{
2440+
int value = itparameters->child(oms::ssp::Version1_0::ssv::integer_type).attribute("value").as_int();
2441+
if (!mappedcrefs.empty())
23832442
{
2384-
int value = itparameters->child(oms::ssp::Version1_0::ssv::integer_type).attribute("value").as_int();
2443+
for (const auto &mappedcref : mappedcrefs)
2444+
{
2445+
setInteger(mappedcref, value);
2446+
}
2447+
}
2448+
else
2449+
{
2450+
// no mapping entry found, apply the default cref found in ssv file
23852451
setInteger(cref, value);
23862452
}
2387-
else if(itparameters->child(oms::ssp::Version1_0::ssv::boolean_type))
2453+
}
2454+
else if (itparameters->child(oms::ssp::Version1_0::ssv::boolean_type))
2455+
{
2456+
bool value = itparameters->child(oms::ssp::Version1_0::ssv::boolean_type).attribute("value").as_bool();
2457+
if (!mappedcrefs.empty())
23882458
{
2389-
bool value = itparameters->child(oms::ssp::Version1_0::ssv::boolean_type).attribute("value").as_bool();
2390-
setBoolean(cref, value);
2459+
for (const auto &mappedcref : mappedcrefs)
2460+
{
2461+
setBoolean(mappedcref, value);
2462+
}
23912463
}
23922464
else
23932465
{
2394-
logError("Failed to import " + std::string(oms::ssp::Version1_0::ssv::parameter) + ":Unknown ParameterBinding-type");
2466+
// no mapping entry found, apply the default cref found in ssv file
2467+
setBoolean(cref, value);
23952468
}
23962469
}
2470+
else
2471+
{
2472+
logError("Failed to import " + std::string(oms::ssp::Version1_0::ssv::parameter) + ":Unknown ParameterBinding-type");
2473+
}
2474+
}
2475+
}
2476+
}
2477+
2478+
return oms_status_ok;
2479+
}
2480+
2481+
oms_status_enu_t oms::System::importParamterMappingFromSSM(std::string fileName, std::multimap<ComRef, ComRef> &mappedEntry)
2482+
{
2483+
std::string tempdir = getModel()->getTempDirectory();
2484+
filesystem::path temp_root(tempdir);
2485+
pugi::xml_document ssmdoc;
2486+
pugi::xml_parse_result result = ssmdoc.load_file((temp_root / fileName).string().c_str());
2487+
pugi::xml_node parameterMapping;
2488+
2489+
if (result) // check from ssm file
2490+
{
2491+
parameterMapping = ssmdoc.document_element(); // ssm:ParameterMapping
2492+
}
2493+
2494+
if (parameterMapping)
2495+
{
2496+
for (pugi::xml_node_iterator itparametermapping = parameterMapping.begin(); itparametermapping != parameterMapping.end(); ++itparametermapping)
2497+
{
2498+
std::string name = itparametermapping->name();
2499+
if (name == oms::ssp::Version1_0::ssm::parameter_mapping_entry)
2500+
{
2501+
ComRef source = itparametermapping->attribute("source").as_string();
2502+
if (!source.isEmpty())
2503+
{
2504+
mappedEntry.insert(std::make_pair(source, itparametermapping->attribute("target").as_string()));
2505+
}
2506+
else
2507+
{
2508+
// default value will be applied
2509+
}
23972510
}
23982511
}
23992512
}

src/OMSimulatorLib/System.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ namespace oms
164164
ctpl::thread_pool& getThreadPool();
165165

166166
std::string getUniqueID() const;
167-
std::vector<std::string> ssvFileSources;
167+
std::map<std::string, std::string> startValuesFileSources; ///< ssvFileSource mapped with ssmFilesource if mapping is provided, otherwise only ssvFilesource entry is made
168168
protected:
169169
System(const ComRef& cref, oms_system_enu_t type, Model* parentModel, System* parentSystem, oms_solver_enu_t solverMethod);
170170

@@ -215,6 +215,8 @@ namespace oms
215215
oms_status_enu_t importBusConnectorSignals(const pugi::xml_node& node);
216216
oms_status_enu_t importBusConnectorGeometry(const pugi::xml_node& node);
217217
oms_status_enu_t importStartValuesFromSSV();
218+
oms_status_enu_t importStartValuesFromSSVHelper(std::string fileName, std::multimap<ComRef, ComRef> &mappedEntry);
219+
oms_status_enu_t importParamterMappingFromSSM(std::string fileName, std::multimap<ComRef, ComRef> &mappedEntry);
218220
};
219221
}
220222

0 commit comments

Comments
 (0)