def _capturations(): for key, value in self.value.items(): if value.__class__.__name__ == "C": value.key = key capture_valueset.value.add((key, value)) for idx, fact in factlist.facts.items(): captured_context = capture_valueset.matches(fact) if captured_context: yield Capturation(**{str(idx): captured_context})
def test_Rule_with_only_one_NOT_match_InitialFact_if_fact_is_not_present(): from pyknow.rule import NOT, Rule from pyknow.factlist import FactList from pyknow.fact import Fact, InitialFact, L from pyknow.match import Capturation r = Rule(NOT(Fact(something=L(True)))) fl = FactList() fl.declare(InitialFact()) assert next(r.get_activations(fl, Capturation()), None) is not None
def test_capturations_add(): """ Test __add__ method of capturations """ from pyknow.match import Capturation, Context cap1 = Capturation({ "1": Context({"1": "foo"}), "2": Context({"1": "bar"}) }) cap2 = Capturation({ "1": Context({"2": "foo"}), "3": Context({"1": "foo"}) }) result = cap1 + cap2 assert result == Capturation({ "1": Context({ "1": "foo", "2": "foo" }), "2": Context({"1": "bar"}), "3": Context({"1": "foo"}) })
def test_facts_produce_activations_without_capturation(): """ A fact produces activations if no capturations are provided """ from pyknow.fact import Fact, L from pyknow.factlist import FactList from pyknow.match import Capturation flist = FactList() flist.declare(Fact(a=L(1))) caps = list(Fact(a=L(1)).get_activations(flist, Capturation())) assert len(caps) == 1
def test_Rule_empty_matches_with_initial_fact(): from pyknow.rule import Rule from pyknow.factlist import FactList from pyknow.fact import InitialFact from pyknow.activation import Activation from pyknow.match import Capturation r = Rule() fl = FactList() fl.declare(InitialFact()) assert Activation(None, (0, )) in list(r.get_activations(fl, Capturation()))
def test_facts_produce_activations_that_are_Activations(): """ A fact produces activations that are Activation objects """ from pyknow.fact import Fact, L from pyknow.factlist import FactList from pyknow.match import Capturation from pyknow.activation import Activation flist = FactList() flist.declare(Fact(a=L(1))) caps = list(Fact(a=L(1)).get_activations(flist, Capturation())) assert len(caps) == 1 assert isinstance(caps[0], Activation) assert caps[0].facts == (0,)
def get_capturations(self, factlist): """ Returns ``Capturation`` objects, relating facts with its matching context """ FACT_WATCHER.debug("Getting capturations") capture_valueset = ValueSet(self, 'C') def _capturations(): for key, value in self.value.items(): if value.__class__.__name__ == "C": value.key = key capture_valueset.value.add((key, value)) for idx, fact in factlist.facts.items(): captured_context = capture_valueset.matches(fact) if captured_context: yield Capturation(**{str(idx): captured_context}) return sum(_capturations(), Capturation())
def get_activations(self, factlist, capturations=Capturation()): """ For this :obj:`pyknow.rule.Rule`, returns all the :obj:`pyknow.activation.Activation`, for the provided factlist. :param factlist: :obj:`pyknow.factlist.FactList` to match against. :return: Tuple of unique :obj:`pyknow.activation.Activation` matches. """ if not isinstance(factlist, FactList): raise ValueError("Factlist must be a factlist instance") def _all_activations(): """ Tengo un problema aqui al sacar las activaciones. El InitialFact tambien matchea y entra dentro del product(), entonces acabo con una activación con el initialfact y otra sin el en el caso de los or """ for cond in self._conds: yield (a for a in cond.get_activations(factlist, capturations)) return (sum_objs(iter(a)) for a in product(*_all_activations()))
def get_capturations(self, factlist): """ Return captured values with its facts from all our children """ return sum((cond.get_capturations(factlist) for cond in self._conds), Capturation())