diff --git a/mira/metamodel/ops.py b/mira/metamodel/ops.py index a765644a..4252f955 100644 --- a/mira/metamodel/ops.py +++ b/mira/metamodel/ops.py @@ -768,12 +768,20 @@ def add_observable_pattern( : A template model with the observable added. """ - if refinement_func is None: - refinement_func = get_dkg_refinement_closure().is_ontological_child observable_concepts = [] + identifiers = set(concept_pattern.identifiers.items()) + contexts = set(concept_pattern.context.items()) + name_only = (not identifiers) and (not contexts) for key, concept in template_model.get_concepts_map().items(): - if concept.refinement_of(concept_pattern, refinement_func): - observable_concepts.append(concept) + if name_only: + if concept.name == concept_pattern.name: + observable_concepts.append(concept) + else: + if (not identifiers) or identifiers.issubset( + set(concept.identifiers.items())): + if (not contexts) or contexts.issubset( + set(concept.context.items())): + observable_concepts.append(concept) obs = get_observable_for_concepts(observable_concepts, name) template_model.observables[name] = obs return template_model diff --git a/tests/test_ops.py b/tests/test_ops.py index a469c08e..867d9731 100644 --- a/tests/test_ops.py +++ b/tests/test_ops.py @@ -611,3 +611,8 @@ def test_add_observable_pattern(): assert 'obs' in tm.observables obs = tm.observables['obs'] assert obs.expression.args[0] == sympy.Symbol('A_old') + sympy.Symbol('A_young') + + add_observable_pattern(tm, Concept(name='young', context={'age': 'young'}), 'obs2') + assert 'obs2' in tm.observables + obs = tm.observables['obs2'] + assert obs.expression.args[0] == sympy.Symbol('A_young') + sympy.Symbol('B_young')