From 5ff0fe3c213a198f5d6848a0ba9e5f8652673c25 Mon Sep 17 00:00:00 2001 From: petermeisrimelmodelon Date: Thu, 4 Dec 2025 12:08:19 +0000 Subject: [PATCH 1/2] fix: fmi3 get_model_variables with filter ingored aliases --- src/pyfmi/fmi2.pyx | 2 +- src/pyfmi/fmi3.pyx | 36 ++++++++++++++++++++++-------------- tests/test_fmi3.py | 9 +++++++++ 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/pyfmi/fmi2.pyx b/src/pyfmi/fmi2.pyx index 9b1033d6..c0361cb8 100644 --- a/src/pyfmi/fmi2.pyx +++ b/src/pyfmi/fmi2.pyx @@ -1770,7 +1770,7 @@ cdef class FMUModelBase2(FMI_BASE.ModelBase): cdef int selected_type = 0 #If a type has been selected cdef int selected_variability = 0 #If a variability has been selected cdef int selected_causality = 0 #If a causality has been selected - cdef int has_start, is_fixed + cdef int has_start cdef int i, j cdef int selected_filter = 1 if filter else 0 cdef int length_filter = 0 diff --git a/src/pyfmi/fmi3.pyx b/src/pyfmi/fmi3.pyx index 3e1585fe..fe84b81b 100644 --- a/src/pyfmi/fmi3.pyx +++ b/src/pyfmi/fmi3.pyx @@ -1902,7 +1902,6 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): Default: None (i.e all). include_alias -- - Currently not supported (does nothing). If alias should be included or not. Default: True @@ -1969,7 +1968,7 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): variable_filter = filter # TODO: Can we rename the keyword arg 'type' to variable_type? variable_type = type - cdef list filter_list, variable_return_list = [] + cdef list filter_list = [] variable_dict = {} variable_list = FMIL3.fmi3_import_get_variable_list(self._fmu, 0) @@ -2013,23 +2012,25 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): if user_specified_causality and (data_causality != causality): continue + _add_variable = True if variable_filter: for pattern in filter_list: if pattern.match(name): break else: - continue - - variable_dict[name] = FMI3ModelVariable( - name, - value_ref, - data_type, - description, - data_variability, - data_causality, - False, # alias - data_initial - ) + _add_variable = False + + if _add_variable: + variable_dict[name] = FMI3ModelVariable( + name, + value_ref, + data_type, + description, + data_variability, + data_causality, + False, # alias + data_initial + ) if include_alias and FMIL3.fmi3_import_get_variable_has_alias(variable): alias_list = FMIL3.fmi3_import_get_variable_alias_list(variable) @@ -2037,6 +2038,13 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): for idx in range(alias_list_size): alias_var = FMIL3.fmi3_import_get_alias(alias_list, idx) alias_name = pyfmi_util.decode(FMIL3.fmi3_import_get_alias_variable_name(alias_var)) + + if variable_filter: + for pattern in filter_list: + if pattern.match(alias_name): + break + else: + continue alias_descr = self._get_alias_description(alias_var) variable_dict[alias_name] = FMI3ModelVariable( diff --git a/tests/test_fmi3.py b/tests/test_fmi3.py index c173ac39..b7495b8b 100644 --- a/tests/test_fmi3.py +++ b/tests/test_fmi3.py @@ -1459,6 +1459,15 @@ def test_get_description_of_alias(self): assert self.fmu.get_variable_description("v5_a1") == "" assert self.fmu.get_variable_description("v5_a2") == "v5_a2_desc" + def test_get_model_variables_filter_including_alias(self): + variables = self.fmu.get_model_variables(filter="v5_*", include_alias = True) + assert set(variables) == set(["v5_a1", "v5_a2"]) + + def test_get_model_variables_filter_excluding_alias(self): + variables = self.fmu.get_model_variables(filter="v5_*", include_alias = False) + assert set(variables) == set() + + class Test_FMUModelBase3: def test_declared_enumeration_type(self): fmu = _get_fmu(FMI3_REF_FMU_PATH / "Feedthrough.fmu", _connect_dll = False) From bd015b4c3eb786e115d232c0d26bf6a9a7a21737 Mon Sep 17 00:00:00 2001 From: petermeisrimelmodelon Date: Mon, 8 Dec 2025 15:34:03 +0000 Subject: [PATCH 2/2] Review fix --- src/pyfmi/fmi3.pyx | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/pyfmi/fmi3.pyx b/src/pyfmi/fmi3.pyx index fe84b81b..bb657a91 100644 --- a/src/pyfmi/fmi3.pyx +++ b/src/pyfmi/fmi3.pyx @@ -1941,6 +1941,15 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): filter = filter ) + def _variable_name_matches_filter(self, variable_name: str, filter_list: Union[list, None]) -> bool: + """Checks if a given variable_name matches any pattern in the filter_list.""" + if filter_list is None: + return True + for pattern in filter_list: + if pattern.match(variable_name): + return True + return False + @enable_caching def _get_model_variables(self, type, @@ -1964,18 +1973,16 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): cdef FMIL3.fmi3_import_alias_variable_t* alias_var cdef int has_start = 0 - # TODO: Can we rename the keyword arg 'filter' to variable_filter? - variable_filter = filter # TODO: Can we rename the keyword arg 'type' to variable_type? variable_type = type - cdef list filter_list = [] + cdef list filter_list = None variable_dict = {} variable_list = FMIL3.fmi3_import_get_variable_list(self._fmu, 0) variable_list_size = FMIL3.fmi3_import_get_variable_list_size(variable_list) - if variable_filter: - filter_list = self._convert_filter(variable_filter) + if filter: + filter_list = self._convert_filter(filter) user_specified_type = isinstance(variable_type, int) user_specified_variability = isinstance(variability, int) @@ -2012,15 +2019,7 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): if user_specified_causality and (data_causality != causality): continue - _add_variable = True - if variable_filter: - for pattern in filter_list: - if pattern.match(name): - break - else: - _add_variable = False - - if _add_variable: + if self._variable_name_matches_filter(name, filter_list): variable_dict[name] = FMI3ModelVariable( name, value_ref, @@ -2039,12 +2038,8 @@ cdef class FMUModelBase3(FMI_BASE.ModelBase): alias_var = FMIL3.fmi3_import_get_alias(alias_list, idx) alias_name = pyfmi_util.decode(FMIL3.fmi3_import_get_alias_variable_name(alias_var)) - if variable_filter: - for pattern in filter_list: - if pattern.match(alias_name): - break - else: - continue + if not self._variable_name_matches_filter(alias_name, filter_list): + continue alias_descr = self._get_alias_description(alias_var) variable_dict[alias_name] = FMI3ModelVariable(