From 204bee05c9aab636cec287c411a932f8c80df843 Mon Sep 17 00:00:00 2001 From: cpdmulde Date: Fri, 6 Dec 2019 16:25:35 +0100 Subject: [PATCH 1/2] make repeated modifying based on name possible --- experta/engine.py | 16 +++++++++------- experta/factlist.py | 8 ++++++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/experta/engine.py b/experta/engine.py index 108859b..1c43a03 100644 --- a/experta/engine.py +++ b/experta/engine.py @@ -75,12 +75,12 @@ def modify(self, declared_fact, **modifiers): >>> ke.modify(my_fact, _0="hello", _1="world", other_key="!") """ - self.retract(declared_fact) + idx = self.retract(declared_fact) newfact = declared_fact.copy() newfact.update(dict(self._get_real_modifiers(**modifiers))) - return self.declare(newfact) + return self.declare(newfact, idx=idx) def duplicate(self, template_fact, **modifiers): """Create a new fact from an existing one.""" @@ -121,11 +121,13 @@ def retract(self, idx_or_declared_fact): .. note:: This updates the agenda """ - self.facts.retract(idx_or_declared_fact) + idx = self.facts.retract(idx_or_declared_fact) if not self.running: added, removed = self.get_activations() self.strategy.update_agenda(self.agenda, added, removed) + + return idx def run(self, steps=float('inf')): """ @@ -209,7 +211,7 @@ def reset(self, **kwargs): self.running = False - def __declare(self, *facts): + def __declare(self, *facts, idx=None): """ Internal declaration method. Used for ``declare`` and ``deffacts`` """ @@ -222,7 +224,7 @@ def __declare(self, *facts): else: last_inserted = None for fact in facts: - last_inserted = self.facts.declare(fact) + last_inserted = self.facts.declare(fact, idx=idx) if not self.running: added, removed = self.get_activations() @@ -230,7 +232,7 @@ def __declare(self, *facts): return last_inserted - def declare(self, *facts): + def declare(self, *facts, idx=None): """ Declare from inside a fact, equivalent to ``assert`` in clips. @@ -241,4 +243,4 @@ def declare(self, *facts): if not self.facts: watchers.ENGINE.warning("Declaring fact before reset()") - return self.__declare(*facts) + return self.__declare(*facts, idx=idx) diff --git a/experta/factlist.py b/experta/factlist.py index 287c01e..2a497a8 100644 --- a/experta/factlist.py +++ b/experta/factlist.py @@ -47,7 +47,7 @@ def _get_fact_id(fact): for k, v in fact.items() if not fact.is_special(k)]) - def declare(self, fact): + def declare(self, fact, idx=None): """ Assert (in clips terminology) a fact. @@ -73,7 +73,11 @@ def declare(self, fact): if self.duplication or fact_id not in self.reference_counter: # Assign the ID to the fact - idx = self.last_index + if idx is None: + idx = self.last_index + else: + idx = idx + fact.__factid__ = idx # Insert the fact in the factlist From 034fc3a5ec3abbdfe7498a8cc96cd9f74c9e5622 Mon Sep 17 00:00:00 2001 From: cpdmulde Date: Mon, 13 Apr 2020 13:10:44 +0200 Subject: [PATCH 2/2] fix whitespaces --- experta/engine.py | 1 - experta/factlist.py | 1 - 2 files changed, 2 deletions(-) diff --git a/experta/engine.py b/experta/engine.py index 1c43a03..45d3751 100644 --- a/experta/engine.py +++ b/experta/engine.py @@ -126,7 +126,6 @@ def retract(self, idx_or_declared_fact): if not self.running: added, removed = self.get_activations() self.strategy.update_agenda(self.agenda, added, removed) - return idx def run(self, steps=float('inf')): diff --git a/experta/factlist.py b/experta/factlist.py index 2a497a8..62f339e 100644 --- a/experta/factlist.py +++ b/experta/factlist.py @@ -77,7 +77,6 @@ def declare(self, fact, idx=None): idx = self.last_index else: idx = idx - fact.__factid__ = idx # Insert the fact in the factlist