Skip to content

Commit a06c112

Browse files
authored
fix signalFilter regex for array variables (#1321)
1 parent 637a1c9 commit a06c112

14 files changed

Lines changed: 418 additions & 3 deletions

src/OMSimulatorLib/Model.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1553,6 +1553,27 @@ void oms::Model::exportEnumerationDefinitionsToSSD(pugi::xml_node& node) const
15531553

15541554
}
15551555

1556+
std::string oms::Model::escapeSpecialCharacters(const std::string& regex)
1557+
{
1558+
std::string escapedRegex;
1559+
for (char c : regex)
1560+
{
1561+
/* https://github.com/OpenModelica/OMSimulator/issues/1320
1562+
If the character is a special regex character, add a backslash before it
1563+
(e.g) model.root.A.a[1] => model\.root\.A\.a\[1\]
1564+
model.root.testArray.der(x)=>model\.root\.testArray\.der\(x\)
1565+
*/
1566+
if (c == '.' || c == '[' || c == ']' || c == '(' || c == ')' ||
1567+
c == '{' || c == '}' || c == '*' || c == '+' || c == '?' ||
1568+
c == '^' || c == '$' || c == '|')
1569+
{
1570+
escapedRegex += '\\'; // Add escape character
1571+
}
1572+
escapedRegex += c; // Add the original character
1573+
}
1574+
return escapedRegex;
1575+
}
1576+
15561577
oms_status_enu_t oms::Model::importSignalFilter(const std::string& filename, const Snapshot& snapshot)
15571578
{
15581579
if (".*" == filename) // avoid error messages for older ssp files
@@ -1570,7 +1591,7 @@ oms_status_enu_t oms::Model::importSignalFilter(const std::string& filename, con
15701591
for (pugi::xml_node_iterator it = oms_signalfilter.begin(); it != oms_signalfilter.end(); ++it)
15711592
{
15721593
if (std::string(it->name()) == oms::ssp::Version1_0::oms_Variable)
1573-
addSignalsToResults(it->attribute("name").as_string());
1594+
addSignalsToResults(escapeSpecialCharacters(it->attribute("name").as_string()).c_str());
15741595
}
15751596

15761597
return oms_status_ok;

src/OMSimulatorLib/Model.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ namespace oms
122122
oms_status_enu_t emit(double time, bool force=false, bool* emitted=NULL);
123123
oms_status_enu_t addSignalsToResults(const char* regex);
124124
oms_status_enu_t removeSignalsFromResults(const char* regex);
125+
std::string escapeSpecialCharacters(const std::string& regex);
125126

126127
bool validState(int validStates) const {return (modelState & validStates);}
127128

testsuite/resources/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ tlm.mass \
6060
tlm.massSpring \
6161
tlm.source \
6262
tlm.UpperPendulum \
63+
testArray \
6364
ypipe \
6465

6566
SSPs = \
36.3 KB
Binary file not shown.
61.9 KB
Binary file not shown.
605 KB
Binary file not shown.
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<fmiModelDescription
3+
fmiVersion="2.0"
4+
modelName="testArray"
5+
guid="{13ed711e-8560-455c-9844-3df620b52293}"
6+
description=""
7+
version=""
8+
generationTool="OpenModelica Compiler OpenModelica v1.25.0-dev-72-g9024c1601a (64-bit)"
9+
generationDateAndTime="2024-10-23T13:56:35Z"
10+
variableNamingConvention="structured"
11+
numberOfEventIndicators="0">
12+
<ModelExchange
13+
modelIdentifier="testArray"
14+
needsExecutionTool="false"
15+
completedIntegratorStepNotNeeded="false"
16+
canBeInstantiatedOnlyOncePerProcess="false"
17+
canNotUseMemoryManagementFunctions="false"
18+
canGetAndSetFMUstate="false"
19+
canSerializeFMUstate="false"
20+
providesDirectionalDerivative="false">
21+
<SourceFiles>
22+
<File name="testArray.c" />
23+
<File name="testArray_functions.c" />
24+
<File name="testArray_records.c" />
25+
<File name="testArray_01exo.c" />
26+
<File name="testArray_02nls.c" />
27+
<File name="testArray_03lsy.c" />
28+
<File name="testArray_04set.c" />
29+
<File name="testArray_05evt.c" />
30+
<File name="testArray_06inz.c" />
31+
<File name="testArray_07dly.c" />
32+
<File name="testArray_08bnd.c" />
33+
<File name="testArray_09alg.c" />
34+
<File name="testArray_10asr.c" />
35+
<File name="testArray_11mix.c" />
36+
<File name="testArray_12jac.c" />
37+
<File name="testArray_13opt.c" />
38+
<File name="testArray_14lnz.c" />
39+
<File name="testArray_15syn.c" />
40+
<File name="testArray_16dae.c" />
41+
<File name="testArray_17inl.c" />
42+
<File name="testArray_18spd.c" />
43+
<File name="testArray_init_fmu.c" />
44+
<File name="testArray_FMU.c" />
45+
<File name="./gc/memory_pool.c" />
46+
<File name="./gc/omc_gc.c" />
47+
<File name="./util/base_array.c" />
48+
<File name="./util/boolean_array.c" />
49+
<File name="./util/context.c" />
50+
<File name="./util/division.c" />
51+
<File name="./util/doubleEndedList.c" />
52+
<File name="./util/generic_array.c" />
53+
<File name="./util/index_spec.c" />
54+
<File name="./util/integer_array.c" />
55+
<File name="./util/list.c" />
56+
<File name="./util/modelica_string_lit.c" />
57+
<File name="./util/modelica_string.c" />
58+
<File name="./util/ModelicaUtilities.c" />
59+
<File name="./util/omc_error.c" />
60+
<File name="./util/omc_file.c" />
61+
<File name="./util/omc_init.c" />
62+
<File name="./util/omc_mmap.c" />
63+
<File name="./util/omc_msvc.c" />
64+
<File name="./util/omc_numbers.c" />
65+
<File name="./util/parallel_helper.c" />
66+
<File name="./util/rational.c" />
67+
<File name="./util/real_array.c" />
68+
<File name="./util/ringbuffer.c" />
69+
<File name="./util/simulation_options.c" />
70+
<File name="./util/string_array.c" />
71+
<File name="./util/utility.c" />
72+
<File name="./util/varinfo.c" />
73+
<File name="./math-support/pivot.c" />
74+
<File name="./simulation/jacobian_util.c" />
75+
<File name="./simulation/omc_simulation_util.c" />
76+
<File name="./simulation/options.c" />
77+
<File name="./simulation/simulation_info_json.c" />
78+
<File name="./simulation/simulation_omc_assert.c" />
79+
<File name="./simulation/solver/delay.c" />
80+
<File name="./simulation/solver/fmi_events.c" />
81+
<File name="./simulation/solver/model_help.c" />
82+
<File name="./simulation/solver/omc_math.c" />
83+
<File name="./simulation/solver/spatialDistribution.c" />
84+
<File name="./simulation/solver/stateset.c" />
85+
<File name="./simulation/solver/synchronous.c" />
86+
<File name="./simulation/solver/initialization/initialization.c" />
87+
<File name="./meta/meta_modelica_catch.c" />
88+
</SourceFiles>
89+
</ModelExchange>
90+
<CoSimulation
91+
modelIdentifier="testArray"
92+
needsExecutionTool="false"
93+
canHandleVariableCommunicationStepSize="true"
94+
canInterpolateInputs="true"
95+
maxOutputDerivativeOrder="1"
96+
canRunAsynchronuously = "false"
97+
canBeInstantiatedOnlyOncePerProcess="false"
98+
canNotUseMemoryManagementFunctions="false"
99+
canGetAndSetFMUstate="false"
100+
canSerializeFMUstate="false"
101+
providesDirectionalDerivative="false">
102+
<SourceFiles>
103+
<File name="testArray.c" />
104+
<File name="testArray_functions.c" />
105+
<File name="testArray_records.c" />
106+
<File name="testArray_01exo.c" />
107+
<File name="testArray_02nls.c" />
108+
<File name="testArray_03lsy.c" />
109+
<File name="testArray_04set.c" />
110+
<File name="testArray_05evt.c" />
111+
<File name="testArray_06inz.c" />
112+
<File name="testArray_07dly.c" />
113+
<File name="testArray_08bnd.c" />
114+
<File name="testArray_09alg.c" />
115+
<File name="testArray_10asr.c" />
116+
<File name="testArray_11mix.c" />
117+
<File name="testArray_12jac.c" />
118+
<File name="testArray_13opt.c" />
119+
<File name="testArray_14lnz.c" />
120+
<File name="testArray_15syn.c" />
121+
<File name="testArray_16dae.c" />
122+
<File name="testArray_17inl.c" />
123+
<File name="testArray_18spd.c" />
124+
<File name="testArray_init_fmu.c" />
125+
<File name="testArray_FMU.c" />
126+
<File name="./gc/memory_pool.c" />
127+
<File name="./gc/omc_gc.c" />
128+
<File name="./util/base_array.c" />
129+
<File name="./util/boolean_array.c" />
130+
<File name="./util/context.c" />
131+
<File name="./util/division.c" />
132+
<File name="./util/doubleEndedList.c" />
133+
<File name="./util/generic_array.c" />
134+
<File name="./util/index_spec.c" />
135+
<File name="./util/integer_array.c" />
136+
<File name="./util/list.c" />
137+
<File name="./util/modelica_string_lit.c" />
138+
<File name="./util/modelica_string.c" />
139+
<File name="./util/ModelicaUtilities.c" />
140+
<File name="./util/omc_error.c" />
141+
<File name="./util/omc_file.c" />
142+
<File name="./util/omc_init.c" />
143+
<File name="./util/omc_mmap.c" />
144+
<File name="./util/omc_msvc.c" />
145+
<File name="./util/omc_numbers.c" />
146+
<File name="./util/parallel_helper.c" />
147+
<File name="./util/rational.c" />
148+
<File name="./util/real_array.c" />
149+
<File name="./util/ringbuffer.c" />
150+
<File name="./util/simulation_options.c" />
151+
<File name="./util/string_array.c" />
152+
<File name="./util/utility.c" />
153+
<File name="./util/varinfo.c" />
154+
<File name="./math-support/pivot.c" />
155+
<File name="./simulation/jacobian_util.c" />
156+
<File name="./simulation/omc_simulation_util.c" />
157+
<File name="./simulation/options.c" />
158+
<File name="./simulation/simulation_info_json.c" />
159+
<File name="./simulation/simulation_omc_assert.c" />
160+
<File name="./simulation/solver/delay.c" />
161+
<File name="./simulation/solver/fmi_events.c" />
162+
<File name="./simulation/solver/model_help.c" />
163+
<File name="./simulation/solver/omc_math.c" />
164+
<File name="./simulation/solver/spatialDistribution.c" />
165+
<File name="./simulation/solver/stateset.c" />
166+
<File name="./simulation/solver/synchronous.c" />
167+
<File name="./simulation/solver/initialization/initialization.c" />
168+
<File name="./meta/meta_modelica_catch.c" />
169+
</SourceFiles>
170+
</CoSimulation>
171+
<LogCategories>
172+
<Category name="logEvents" />
173+
<Category name="logSingularLinearSystems" />
174+
<Category name="logNonlinearSystems" />
175+
<Category name="logDynamicStateSelection" />
176+
<Category name="logStatusWarning" />
177+
<Category name="logStatusDiscard" />
178+
<Category name="logStatusError" />
179+
<Category name="logStatusFatal" />
180+
<Category name="logStatusPending" />
181+
<Category name="logAll" />
182+
<Category name="logFmi2Call" />
183+
</LogCategories>
184+
<DefaultExperiment startTime="0.0" stopTime="1.0" tolerance="1e-6" stepSize="0.002"/>
185+
<ModelVariables>
186+
<!-- Index of variable = "1" -->
187+
<ScalarVariable
188+
name="x"
189+
valueReference="0"
190+
initial="exact">
191+
<Real start="0.0"/>
192+
</ScalarVariable>
193+
<!-- Index of variable = "2" -->
194+
<ScalarVariable
195+
name="der(x)"
196+
valueReference="1"
197+
>
198+
<Real derivative="1"/>
199+
</ScalarVariable>
200+
<!-- Index of variable = "3" -->
201+
<ScalarVariable
202+
name="a[1]"
203+
valueReference="2"
204+
initial="exact">
205+
<Real start="0.0"/>
206+
</ScalarVariable>
207+
<!-- Index of variable = "4" -->
208+
<ScalarVariable
209+
name="a[2]"
210+
valueReference="3"
211+
initial="exact">
212+
<Real start="0.0"/>
213+
</ScalarVariable>
214+
<!-- Index of variable = "5" -->
215+
<ScalarVariable
216+
name="a[3]"
217+
valueReference="4"
218+
initial="exact">
219+
<Real start="0.0"/>
220+
</ScalarVariable>
221+
</ModelVariables>
222+
<ModelStructure>
223+
<Derivatives>
224+
<Unknown index="2" dependencies="" dependenciesKind="" />
225+
</Derivatives>
226+
<InitialUnknowns>
227+
<Unknown index="2" dependencies="" dependenciesKind="" />
228+
</InitialUnknowns>
229+
</ModelStructure>
230+
</fmiModelDescription>

testsuite/simulation/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import_export_parameters2.lua \
3737
import_export_parameters3.lua \
3838
import_export_parameters4.lua \
3939
import_export_signalFilter.lua \
40+
import_export_signalFilter2.lua \
4041
import_export_snapshot.lua \
4142
import_hierarchical_ssv_sources.lua \
4243
import_hierarchical_ssv_sources1.lua \

testsuite/simulation/importSuppressUnitConversion.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,10 @@ oms_delete("model")
265265
-- type="Real"
266266
-- kind="unknown" />
267267
-- <oms:Variable
268+
-- name="model.root.A.der(x)"
269+
-- type="Real"
270+
-- kind="unknown" />
271+
-- <oms:Variable
268272
-- name="model.root.A.u"
269273
-- type="Real"
270274
-- kind="input" />

0 commit comments

Comments
 (0)