Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for vector sum connections #517

Merged
merged 10 commits into from
Feb 6, 2020
429 changes: 229 additions & 200 deletions src/cpp/cse_config_parser.cpp

Large diffs are not rendered by default.

85 changes: 19 additions & 66 deletions src/cpp/xsd/OspSystemStructure.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -46,20 +46,6 @@
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="SumConnection" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Sources">
<xs:complexType>
<xs:sequence>
<xs:element name="Source" maxOccurs="unbounded" type="osp:variableEndpoint"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Target" type="osp:variableEndpoint"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="variableEndpoint">
Expand Down Expand Up @@ -118,59 +104,26 @@
</xs:complexType>
<xs:complexType name="functions">
<xs:sequence>
<xs:element name="Function" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Parameters" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Parameter" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Signals">
<xs:complexType>
<xs:sequence>
<xs:element name="Signal" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="causality" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SignalGroups" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="SignalGroup" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Signal" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="LinearTransformation" type="osp:linearTransformationFunction" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="Sum" type="osp:sumFunction" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="VectorSum" type="osp:vectorSumFunction" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="linearTransformationFunction">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="factor" type="xs:double"/>
<xs:attribute name="offset" type="xs:double"/>
</xs:complexType>
<xs:complexType name="sumFunction">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="inputCount" use="required" type="xs:positiveInteger"/>
</xs:complexType>
<xs:complexType name="vectorSumFunction">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="inputCount" use="required" type="xs:positiveInteger"/>
<xs:attribute name="dimension" use="required" type="xs:positiveInteger"/>
</xs:complexType>


</xs:schema>
1 change: 1 addition & 0 deletions test/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ set(tests
"monitor_modified_variables_test"
"scenario_manager_test"
"synchronized_xy_series_test"
"vector_sum_test"
)

if(CSECORE_WITH_FMUPROXY AND CSECORE_TEST_FMUPROXY)
Expand Down
69 changes: 69 additions & 0 deletions test/cpp/vector_sum_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include <cse/connection/sum_connection.hpp>
#include <cse/cse_config_parser.hpp>
#include <cse/log/simple.hpp>
#include <cse/observer/last_value_observer.hpp>
#include <cse/orchestration.hpp>

#include <boost/filesystem.hpp>

#include <cstdlib>
#include <exception>


#define REQUIRE(test) \
if (!(test)) throw std::runtime_error("Requirement not satisfied: " #test)

void test(const boost::filesystem::path& configPath)
{
auto resolver = cse::default_model_uri_resolver();
auto simulation = cse::load_cse_config(*resolver, configPath, cse::to_time_point(0.0));
auto& execution = simulation.first;
auto& simulator_map = simulation.second;

REQUIRE(simulator_map.size() == 4);

auto obs = std::make_shared<cse::last_value_observer>();
execution.add_observer(obs);

auto i1 = simulator_map.at("vector1").index;
auto i2 = simulator_map.at("vector2").index;
auto i3 = simulator_map.at("vector3").index;
execution.set_real_initial_value(i1, 0, 1.0);
execution.set_real_initial_value(i1, 1, 2.0);
execution.set_real_initial_value(i1, 2, 3.0);
execution.set_real_initial_value(i2, 0, 4.0);
execution.set_real_initial_value(i2, 1, 5.0);
execution.set_real_initial_value(i2, 2, 6.0);
execution.set_real_initial_value(i3, 0, 7.0);
execution.set_real_initial_value(i3, 1, 8.0);
execution.set_real_initial_value(i3, 2, 9.0);

execution.step();
execution.step();

cse::simulator_index lastOne = simulator_map.at("vector4").index;
double realValues[3];
cse::value_reference references[] = {3, 4, 5};
obs->get_real(lastOne, gsl::make_span(references), gsl::make_span(realValues));

double exptectedValues[]{12.0, 15.0, 18.0};
for (int i = 0; i < 3; i++) {
REQUIRE(realValues[i] == exptectedValues[i]);
}
}

int main()
{
try {
cse::log::setup_simple_console_logging();
cse::log::set_global_output_level(cse::log::info);

const auto testDataDir = std::getenv("TEST_DATA_DIR");
REQUIRE(testDataDir);
test(boost::filesystem::path(testDataDir) / "msmi" / "OspSystemStructure_vectorSum.xml");
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what();
return 1;
}
return 0;
}
Binary file added test/data/fmi2/vector.fmu
Binary file not shown.
12 changes: 1 addition & 11 deletions test/data/msmi/CraneController_OspModelDescription.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<Variable name="p_Crane.f[2]"/>
<Variable name="p_Crane.f[3]"/>
</VariableGroup>
<VariableGroup type="abstract" name="actuatorLimits">
<VariableGroup type="generic" name="actuatorLimits">
<Variable name="Act_Limits[1]"/>
<Variable name="Act_Limits[2]"/>
<Variable name="Act_Limits[3]"/>
Expand All @@ -16,15 +16,5 @@
<Variable name="p_Crane.e[2]"/>
<Variable name="p_Crane.e[3]"/>
</VariableGroup>

<!--<Bond name="mechanical">
<BondSockets>
<BondSocket name="velocity"/>
</BondSockets>
<BondPlugs>
<BondPlug name="force"/>
</BondPlugs>
</Bond>-->

</VariableGroups>
</OspModelDescription>
12 changes: 1 addition & 11 deletions test/data/msmi/KnuckleBoomCrane_OspModelDescription.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,10 @@
<Variable name="p_Crane.f[2]"/>
<Variable name="p_Crane.f[3]"/>
</VariableGroup>
<VariableGroup type="abstract" name="actuatorLimits">
<VariableGroup type="generic" name="actuatorLimits">
<Variable name="Act_Limits[1]"/>
<Variable name="Act_Limits[2]"/>
<Variable name="Act_Limits[3]"/>
</VariableGroup>
<!-- <Bonds>-->
<!-- <Bond name="mechanical">-->
<!-- <BondPlugs>-->
<!-- <BondPlug name="velocity"/>-->
<!-- </BondPlugs>-->
<!-- <BondSockets>-->
<!-- <BondSocket name="force"/>-->
<!-- </BondSockets>-->
<!-- </Bond>-->
<!-- </Bonds>-->
</VariableGroups>
</OspModelDescription>
28 changes: 6 additions & 22 deletions test/data/msmi/OspSystemStructure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,8 @@
</Simulator>
</Simulators>
<Functions>
<Function name="mySum" type="sum">
<Signals>
<Signal name="0" type="real" causality="input"/>
<Signal name="1" type="real" causality="input"/>
<Signal name="2" type="real" causality="input"/>
<Signal name="sum" type="real" causality="output"/>
</Signals>
</Function>
<Function type="lineartransformation" name="myScaling">
<Parameters>
<Parameter name="factor" value="0.1" type="real"/>
<Parameter name="offset" value="123.4" type="real"/>
</Parameters>
<Signals>
<Signal type="real" causality="input" name="in"/>
<Signal type="real" causality="output" name="out"/>
</Signals>
</Function>
<LinearTransformation name="myScaling" factor="0.1" offset="123.4"/>
<Sum name="mySum" inputCount="3"/>
</Functions>
<Connections>
<VariableConnection>
Expand All @@ -61,18 +45,18 @@

<SignalConnection>
<Variable simulator="KnuckleBoomCrane" name="p_Crane.f[1]"/>
<Signal function="mySum" name="0"/>
<Signal function="mySum" name="in[0]"/>
</SignalConnection>
<SignalConnection>
<Variable simulator="KnuckleBoomCrane" name="p_Crane.f[2]"/>
<Signal function="mySum" name="1"/>
<Signal function="mySum" name="in[1]"/>
</SignalConnection>
<SignalConnection>
<Variable simulator="KnuckleBoomCrane" name="p_Crane.f[3]"/>
<Signal function="mySum" name="2"/>
<Signal function="mySum" name="in[2]"/>
</SignalConnection>
<SignalConnection>
<Signal function="mySum" name="sum"/>
<Signal function="mySum" name="out"/>
<Variable simulator="CraneController" name="p_Crane.f[1]"/>
</SignalConnection>

Expand Down
36 changes: 36 additions & 0 deletions test/data/msmi/OspSystemStructure_vectorSum.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" ?>
<OspSystemStructure
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://opensimulationplatform.com/MSMI/OSPSystemStructure ../../../src/cpp/xsd/OspSystemStructure.xsd"
xmlns="http://opensimulationplatform.com/MSMI/OSPSystemStructure">
<StartTime>0.0</StartTime>
<BaseStepSize>1e-1</BaseStepSize>
<Algorithm>fixedStep</Algorithm>
<Simulators>
<Simulator name="vector1" source="../fmi2/vector.fmu"/>
<Simulator name="vector2" source="../fmi2/vector.fmu"/>
<Simulator name="vector3" source="../fmi2/vector.fmu"/>
<Simulator name="vector4" source="../fmi2/vector.fmu"/>
</Simulators>
<Functions>
<VectorSum name="myVectorSum" inputCount="3" dimension="3"/>
</Functions>
<Connections>
<SignalGroupConnection>
<VariableGroup simulator="vector1" name="output"/>
<SignalGroup function="myVectorSum" name="in[0]"/>
</SignalGroupConnection>
<SignalGroupConnection>
<VariableGroup simulator="vector2" name="output"/>
<SignalGroup function="myVectorSum" name="in[1]"/>
</SignalGroupConnection>
<SignalGroupConnection>
<VariableGroup simulator="vector3" name="output"/>
<SignalGroup function="myVectorSum" name="in[2]"/>
</SignalGroupConnection>
<SignalGroupConnection>
<SignalGroup function="myVectorSum" name="out"/>
<VariableGroup simulator="vector4" name="input"/>
</SignalGroupConnection>
</Connections>
</OspSystemStructure>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<OspModelDescription xmlns="http://opensimulationplatform.com/MSMI/OSPModelDescription">
<VariableGroups>
<VariableGroup type="generic" name="input">
<Variable name="input[0]"/>
<Variable name="input[1]"/>
<Variable name="input[2]"/>
</VariableGroup>
<VariableGroup type="generic" name="output">
<Variable name="output[0]"/>
<Variable name="output[1]"/>
<Variable name="output[2]"/>
</VariableGroup>
</VariableGroups>
</OspModelDescription>
Loading