Fixed #100 : SheerkaAdmin: Add builtins() command
Fixed #99 : SheerkaQueryManager: I can manage contains predicate when filtering objects Fixed #97 : ERROR: list indices must be integers or slices, not Concept Fixed #96 : SequenceNodeParser: SequenceNodeParser must correctly handle concept definition Fixed #95 : ResolveAmbiguity must not remove concepts that do not require evaluation Fixed #94 : Concepts with the same key are lost when new ontology Fixed #93 : Introduce BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED Fixed #92 : ExpressionParser: Implement compile_disjunctions() Fixed #91 : Implement get_concepts_complexity(context, concepts, concept_parts) Fixed #90 : ResolveAmbiguity : where predicate is not used to resolve ambiguity Fixed #89 : ResolveAmbiguityEvaluator: Concepts embedded in ConceptNode are not resolved Fixed #88: SyaNodeParser: Parse multiple parameters when some of the are not recognized Fixed #87: SyaNodeParser : Parse the multiple parameters
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
import pytest
|
||||
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.concept import Concept
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from evaluators.BaseEvaluator import BaseEvaluator
|
||||
from evaluators.ResolveAmbiguityEvaluator import ResolveAmbiguityEvaluator
|
||||
|
||||
from parsers.ExactConceptParser import ExactConceptParser
|
||||
from parsers.SyaNodeParser import SyaNodeParser
|
||||
from tests.BaseTest import BaseTest
|
||||
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
||||
|
||||
|
||||
pretval = BaseTest.pretval
|
||||
|
||||
|
||||
@@ -21,6 +24,37 @@ class TestResolveAmbiguityEvaluator(TestUsingMemoryBasedSheerka):
|
||||
context = self.get_context()
|
||||
assert ResolveAmbiguityEvaluator().matches(context, return_values) == expected
|
||||
|
||||
def test_i_can_match_when_the_input_comes_from_an_evaluator(self):
|
||||
ret_val1 = pretval(Concept("foo"), source="source", parser=BaseEvaluator.get_name("evaluator"))
|
||||
ret_val2 = pretval(Concept("bar"), source="source", parser=BaseEvaluator.get_name("evaluator"))
|
||||
return_values = [ret_val1, ret_val2]
|
||||
|
||||
context = self.get_context()
|
||||
assert ResolveAmbiguityEvaluator().matches(context, return_values)
|
||||
|
||||
def test_i_can_match_when_concept_nodes(self):
|
||||
sheerka, context, a, foo_1, foo_2 = self.init_concepts(
|
||||
Concept("a"),
|
||||
Concept("foo x").def_var("x"),
|
||||
Concept("foo y").def_var("y"),
|
||||
create_new=True
|
||||
)
|
||||
|
||||
return_values = SyaNodeParser().parse(context, ParserInput("foo a"))
|
||||
assert ResolveAmbiguityEvaluator().matches(context, return_values)
|
||||
|
||||
def test_i_can_match_when_concept_node_mixed_with_concept(self):
|
||||
sheerka, context, a, foo_1, foo_a = self.init_concepts(
|
||||
Concept("a"),
|
||||
Concept("foo x").def_var("x"),
|
||||
Concept("foo a"),
|
||||
create_new=True
|
||||
)
|
||||
|
||||
sya_return_value = SyaNodeParser().parse(context, ParserInput("foo a"))
|
||||
|
||||
assert ResolveAmbiguityEvaluator().matches(context, [sya_return_value, pretval(foo_a, source="foo a")])
|
||||
|
||||
def test_i_can_manage_when_no_source(self):
|
||||
context = self.get_context()
|
||||
return_values = [BaseTest.retval(Concept("foo"))]
|
||||
@@ -53,6 +87,44 @@ class TestResolveAmbiguityEvaluator(TestUsingMemoryBasedSheerka):
|
||||
return_values[2],
|
||||
]
|
||||
|
||||
@pytest.mark.parametrize("concepts, expected", [
|
||||
([Concept("c1"), Concept("c2", where="True")], "c2"),
|
||||
([Concept("c1"), Concept("c2", pre="True")], "c2"),
|
||||
([Concept("c1"), Concept("c2", where="False")], "c1"),
|
||||
([Concept("c1"), Concept("c2", pre="False")], "c1"),
|
||||
([Concept("c1", pre="True"), Concept("c2", where="True")], "c1"),
|
||||
([Concept("c1", pre="False"), Concept("c2", where="True")], "c2"),
|
||||
([Concept("c1", pre="False"), Concept("c2", where="False")], BuiltinConcepts.NO_RESULT),
|
||||
])
|
||||
def test_i_can_eval_2(self, concepts, expected):
|
||||
context = self.get_context()
|
||||
return_values = [self.pretval(c, source="foo") for c in concepts]
|
||||
|
||||
evaluator = ResolveAmbiguityEvaluator()
|
||||
evaluator.matches(context, return_values)
|
||||
res = evaluator.eval(context, return_values)
|
||||
|
||||
assert len(res) == 1
|
||||
if expected != BuiltinConcepts.NO_RESULT:
|
||||
selected_concept = res[0].body.body
|
||||
assert selected_concept.name == expected
|
||||
else:
|
||||
assert res[0].body == BuiltinConcepts.NO_RESULT
|
||||
|
||||
@pytest.mark.parametrize("concepts", [
|
||||
[Concept("c1"), Concept("c2")],
|
||||
[Concept("c1", pre="True"), Concept("c2", pre="True")],
|
||||
])
|
||||
def test_i_can_eval_when_same_complexity(self, concepts):
|
||||
context = self.get_context()
|
||||
return_values = [self.pretval(c, "foo") for c in concepts]
|
||||
|
||||
evaluator = ResolveAmbiguityEvaluator()
|
||||
evaluator.matches(context, return_values)
|
||||
res = evaluator.eval(context, return_values)
|
||||
|
||||
assert res is None
|
||||
|
||||
def test_i_can_eval_all_fail(self):
|
||||
context = self.get_context()
|
||||
return_values = [
|
||||
@@ -91,3 +163,70 @@ class TestResolveAmbiguityEvaluator(TestUsingMemoryBasedSheerka):
|
||||
res = evaluator.eval(context, return_values)
|
||||
|
||||
assert res is None
|
||||
|
||||
def test_i_can_eval_to_the_simplest_concept(self):
|
||||
"""
|
||||
def concept foo x where x
|
||||
def concept foo a
|
||||
|
||||
When the input is foo a, 'foo x' must be discarded as concept 'foo a' is more accurate
|
||||
:return:
|
||||
"""
|
||||
|
||||
sheerka, context, a, foo_1, foo_a = self.init_concepts(
|
||||
Concept("a"),
|
||||
Concept("foo x").def_var("x"),
|
||||
Concept("foo a"),
|
||||
create_new=True
|
||||
)
|
||||
|
||||
sya_return_value = SyaNodeParser().parse(context, ParserInput("foo a"))
|
||||
exact_concept_return_value = pretval(foo_a, source="foo a")
|
||||
return_values = [sya_return_value, exact_concept_return_value]
|
||||
evaluator = ResolveAmbiguityEvaluator()
|
||||
|
||||
evaluator.matches(context, return_values)
|
||||
res = evaluator.eval(context, return_values)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].who == evaluator.name
|
||||
assert res[0].body == exact_concept_return_value.body
|
||||
assert res[0].parents == return_values
|
||||
|
||||
def test_i_can_eval_to_the_simplest_concept_when_concept_nodes(self):
|
||||
"""
|
||||
Same explanation than test_i_can_eval_to_the_simplest_concept()
|
||||
:return:
|
||||
"""
|
||||
sheerka, context, a, b, foo_1, foo_2 = self.init_concepts(
|
||||
Concept("a"),
|
||||
Concept("b"),
|
||||
Concept("foo x y").def_var("x").def_var("y"),
|
||||
Concept("foo a x").def_var("x"),
|
||||
create_new=True
|
||||
)
|
||||
|
||||
return_values = SyaNodeParser().parse(context, ParserInput("foo a b"))
|
||||
evaluator = ResolveAmbiguityEvaluator()
|
||||
|
||||
evaluator.matches(context, return_values)
|
||||
res = evaluator.eval(context, return_values)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].who == evaluator.name
|
||||
assert sheerka.isinstance(res[0].body.body[0].concept, foo_2)
|
||||
|
||||
def test_i_can_eval_when_non_instance_concepts(self):
|
||||
sheerka, context, foo_1, foo_2 = self.init_concepts(
|
||||
Concept("foo x", body="1", pre="True").def_var("x"),
|
||||
Concept("foo x", body="2", pre="True").def_var("x"),
|
||||
create_new=True
|
||||
)
|
||||
|
||||
exact_parser_return_values = ExactConceptParser().parse(context, ParserInput("c:foo x:"))
|
||||
evaluator = ResolveAmbiguityEvaluator()
|
||||
|
||||
evaluator.matches(context, exact_parser_return_values)
|
||||
res = evaluator.eval(context, exact_parser_return_values)
|
||||
|
||||
assert res is None # means that there is nothing to resolve as the concepts are not instances
|
||||
|
||||
Reference in New Issue
Block a user