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:
@@ -11,7 +11,7 @@ from core.sheerka.services.SheerkaHistoryManager import SheerkaHistoryManager
|
||||
from core.sheerka.services.SheerkaMemory import SheerkaMemory
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
|
||||
CONCEPTS_FILE_FULL = "full.sb"
|
||||
CONCEPTS_FILE_FULL = "full.sb" # .sb for sheerka backup
|
||||
CONCEPTS_FILE_TO_USE = CONCEPTS_FILE_FULL
|
||||
|
||||
|
||||
@@ -22,24 +22,24 @@ class SheerkaAdmin(BaseService):
|
||||
super().__init__(sheerka)
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.caches_names, False)
|
||||
self.sheerka.bind_service_method(self.cache, False)
|
||||
self.sheerka.bind_service_method(self.restore, True)
|
||||
self.sheerka.bind_service_method(self.concepts, False)
|
||||
self.sheerka.bind_service_method(self.desc, False)
|
||||
self.sheerka.bind_service_method(self.desc_evaluators, False)
|
||||
self.sheerka.bind_service_method(self.desc_parsers, False)
|
||||
self.sheerka.bind_service_method(self.extended_isinstance, False)
|
||||
self.sheerka.bind_service_method(self.is_container, False)
|
||||
self.sheerka.bind_service_method(self.format_rules, False)
|
||||
self.sheerka.bind_service_method(self.exec_rules, False)
|
||||
self.sheerka.bind_service_method(self.admin_push_ontology, True, as_name="push_ontology")
|
||||
self.sheerka.bind_service_method(self.admin_pop_ontology, True, as_name="pop_ontology")
|
||||
self.sheerka.bind_service_method(self.ontologies, False)
|
||||
self.sheerka.bind_service_method(self.in_memory, False)
|
||||
self.sheerka.bind_service_method(self.admin_history, False, as_name="history")
|
||||
self.sheerka.bind_service_method(self.sdp, False)
|
||||
self.sheerka.bind_service_method(self.atomic_def, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.caches_names, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.cache, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.restore, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.concepts, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.builtins, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.desc, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.desc_evaluators, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.desc_parsers, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.extended_isinstance, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.is_container, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.format_rules, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.exec_rules, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.admin_push_ontology, True, as_name="push_ontology")
|
||||
self.sheerka.bind_service_method(self.NAME, self.admin_pop_ontology, True, as_name="pop_ontology")
|
||||
self.sheerka.bind_service_method(self.NAME, self.ontologies, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.in_memory, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.admin_history, False, as_name="history")
|
||||
self.sheerka.bind_service_method(self.NAME, self.sdp, False)
|
||||
|
||||
def caches_names(self):
|
||||
"""
|
||||
@@ -138,9 +138,11 @@ class SheerkaAdmin(BaseService):
|
||||
self.sheerka.save_execution_context = False
|
||||
enable_process_return_values_previous_value = self.sheerka.enable_process_return_values
|
||||
self.sheerka.enable_process_return_values = False
|
||||
self.sheerka.add_to_context(BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED)
|
||||
|
||||
nb_lines, nb_instructions, nb_lines_in_error, min_time, max_time = restore_from_file(backup_file)
|
||||
|
||||
self.sheerka.remove_fom_context(BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED)
|
||||
self.sheerka.enable_process_return_values = enable_process_return_values_previous_value
|
||||
self.sheerka.save_execution_context = True
|
||||
self.sheerka.during_restore = False
|
||||
@@ -167,6 +169,10 @@ class SheerkaAdmin(BaseService):
|
||||
concepts = sorted(self.sheerka.om.list(self.sheerka.CONCEPTS_BY_ID_ENTRY), key=lambda item: int(item.id))
|
||||
return self.sheerka.new(BuiltinConcepts.TO_LIST, body=concepts)
|
||||
|
||||
def builtins(self):
|
||||
builtins = sorted(self.sheerka.sheerka_methods.values(), key=lambda builtin_method: builtin_method.name)
|
||||
return self.sheerka.new(BuiltinConcepts.TO_LIST, body=builtins)
|
||||
|
||||
def desc_evaluators(self):
|
||||
evaluators = {k: sorted(v[0].items(), reverse=True)
|
||||
for k, v in self.sheerka.services[SheerkaExecute.NAME].grouped_evaluators_cache.items()}
|
||||
@@ -241,20 +247,6 @@ class SheerkaAdmin(BaseService):
|
||||
|
||||
return self.sheerka.isinstance(a, b)
|
||||
|
||||
@staticmethod
|
||||
def atomic_def(a):
|
||||
"""
|
||||
Return the 'atomic definition' of a concept
|
||||
a concept key stripped from its 'var' tokens
|
||||
>>> assert atomic_def(Concept('a plus b').def_var("a").def_var("b")) == "plus"
|
||||
>>> assert atomic_def(Concept('x is a y').def_var("x").def_var("y")) == "is a"
|
||||
:param a:
|
||||
:return:
|
||||
"""
|
||||
ensure_concept(a)
|
||||
|
||||
return a.get_atomic_def()
|
||||
|
||||
@staticmethod
|
||||
def is_container(obj):
|
||||
"""
|
||||
|
||||
@@ -47,12 +47,12 @@ class SheerkaComparisonManager(BaseService):
|
||||
cache = Cache().auto_configure(self.RESOLVED_COMPARISON_ENTRY)
|
||||
self.sheerka.om.register_cache(self.RESOLVED_COMPARISON_ENTRY, cache, persist=False)
|
||||
|
||||
self.sheerka.bind_service_method(self.set_is_greater_than, True)
|
||||
self.sheerka.bind_service_method(self.set_is_less_than, True)
|
||||
self.sheerka.bind_service_method(self.set_is_lesser, True)
|
||||
self.sheerka.bind_service_method(self.set_is_greatest, True)
|
||||
self.sheerka.bind_service_method(self.get_partition, False)
|
||||
self.sheerka.bind_service_method(self.get_weights, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_is_greater_than, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_is_less_than, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_is_lesser, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_is_greatest, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_partition, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_weights, False)
|
||||
|
||||
@staticmethod
|
||||
def _compute_key(prop_name, comparison_context):
|
||||
|
||||
@@ -113,26 +113,26 @@ class SheerkaConceptManager(BaseService):
|
||||
self.compiled_concepts_by_regex = []
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.create_new_concept, True)
|
||||
self.sheerka.bind_service_method(self.modify_concept, True)
|
||||
self.sheerka.bind_service_method(self.remove_concept, True)
|
||||
self.sheerka.bind_service_method(self.set_id_if_needed, True)
|
||||
self.sheerka.bind_service_method(self.set_attr, True)
|
||||
self.sheerka.bind_service_method(self.get_attr, False)
|
||||
self.sheerka.bind_service_method(self.smart_get_attr, False)
|
||||
self.sheerka.bind_service_method(self.set_property, True, as_name="set_prop")
|
||||
self.sheerka.bind_service_method(self.get_property, False, as_name="get_prop")
|
||||
self.sheerka.bind_service_method(self.get_by_key, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_by_name, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_by_hash, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_by_id, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.is_not_a_concept_name, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.is_a_concept_name, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_concepts_by_first_token, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_concepts_by_first_regex, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_concepts_bnf_definitions, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.clear_bnf_definition, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.set_precedence, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.create_new_concept, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.modify_concept, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.remove_concept, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_id_if_needed, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_attr, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_attr, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.smart_get_attr, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_property, True, as_name="set_prop")
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_property, False, as_name="get_prop")
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_by_key, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_by_name, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_by_hash, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_by_id, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.is_not_a_concept_name, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.is_a_concept_name, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_concepts_by_first_token, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_concepts_by_first_regex, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_concepts_bnf_definitions, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.clear_bnf_definition, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_precedence, True)
|
||||
|
||||
register_concept_cache = self.sheerka.om.register_concept_cache
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ from operator import attrgetter
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.builtin_helpers import ensure_concept
|
||||
from core.concept import Concept
|
||||
from core.sheerka.Sheerka import Sheerka
|
||||
from core.sheerka.services.SheerkaConceptManager import SheerkaConceptManager
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
|
||||
@@ -28,9 +27,9 @@ class SheerkaConceptsAlgebra(BaseService):
|
||||
super().__init__(sheerka)
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.cadd, False)
|
||||
self.sheerka.bind_service_method(self.csub, False)
|
||||
self.sheerka.bind_service_method(self.recognize, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.cadd, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.csub, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.recognize, False)
|
||||
|
||||
def cadd(self, context, *concepts):
|
||||
"""
|
||||
|
||||
@@ -320,22 +320,22 @@ class SheerkaDebugManager(BaseService):
|
||||
}
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.set_debug, True)
|
||||
self.sheerka.bind_service_method(self.inspect, False)
|
||||
self.sheerka.bind_service_method(self.get_value, False)
|
||||
self.sheerka.bind_service_method(self.get_debugger, False)
|
||||
self.sheerka.bind_service_method(self.reset_debug, False)
|
||||
self.sheerka.bind_service_method(self.set_debug_var, True)
|
||||
self.sheerka.bind_service_method(self.set_debug_rule, True)
|
||||
self.sheerka.bind_service_method(self.set_debug_concept, True)
|
||||
self.sheerka.bind_service_method(self.list_debug_vars, True)
|
||||
self.sheerka.bind_service_method(self.list_debug_rules, True)
|
||||
self.sheerka.bind_service_method(self.list_debug_concepts, True)
|
||||
self.sheerka.bind_service_method(self.register_debug_vars, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.register_debug_rules, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.register_debug_concepts, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_debug, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.inspect, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_value, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_debugger, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.reset_debug, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_debug_var, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_debug_rule, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_debug_concept, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.list_debug_vars, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.list_debug_rules, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.list_debug_concepts, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.register_debug_vars, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.register_debug_rules, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.register_debug_concepts, True, visible=False)
|
||||
|
||||
# self.sheerka.bind_service_method(self.get_debug_settings, False, as_name="debug_settings")
|
||||
# self.sheerka.bind_service_method(self.NAME,self.get_debug_settings, False, as_name="debug_settings")
|
||||
# register what can be registered
|
||||
from parsers.BnfNodeParser import BnfNodeParser
|
||||
from evaluators.DefConceptEvaluator import DefConceptEvaluator
|
||||
@@ -349,8 +349,8 @@ class SheerkaDebugManager(BaseService):
|
||||
self.register_debug_vars(DefConceptEvaluator.NAME, "get_variables", "possible_vars")
|
||||
self.register_debug_vars(PythonEvaluator.NAME, "eval", "globals")
|
||||
self.register_debug_vars(PythonEvaluator.NAME, "eval", "ret")
|
||||
self.register_debug_vars("Exceptions", PythonEvaluator.NAME+"-eval", "exception")
|
||||
self.register_debug_vars("Exceptions", PythonEvaluator.NAME+"-eval", "trace")
|
||||
self.register_debug_vars("Exceptions", PythonEvaluator.NAME + "-eval", "exception")
|
||||
self.register_debug_vars("Exceptions", PythonEvaluator.NAME + "-eval", "trace")
|
||||
self.register_debug_vars(SyaNodeParser.NAME, "parse", "*")
|
||||
self.register_debug_vars(MultipleSuccessEvaluator.NAME, "matches", "return_values")
|
||||
|
||||
@@ -919,4 +919,3 @@ class SheerkaDebugManager(BaseService):
|
||||
del res["self"]
|
||||
|
||||
return res
|
||||
|
||||
|
||||
@@ -20,8 +20,11 @@ class SheerkaDump(BaseService):
|
||||
super().__init__(sheerka)
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.dump_desc, True, "old_desc") # has_side_effect 'cause concept is evaluated
|
||||
self.sheerka.bind_service_method(self.dump_sdp, False, "dump_sdp")
|
||||
self.sheerka.bind_service_method(self.NAME,
|
||||
self.dump_desc,
|
||||
True,
|
||||
"old_desc") # has_side_effect 'cause concept is evaluated
|
||||
self.sheerka.bind_service_method(self.NAME, self.dump_sdp, False, "dump_sdp")
|
||||
|
||||
def dump_desc(self, *concept_names, eval=False):
|
||||
first = True
|
||||
|
||||
@@ -46,10 +46,10 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
self.rule_evaluator = None
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.evaluate_concept, True)
|
||||
self.sheerka.bind_service_method(self.call_concept, True)
|
||||
self.sheerka.bind_service_method(self.call_concept, False, as_name="evaluate_question")
|
||||
self.sheerka.bind_service_method(self.set_auto_eval, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.evaluate_concept, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.call_concept, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.call_concept, False, as_name="evaluate_question")
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_auto_eval, True)
|
||||
|
||||
def initialize_deferred(self, context, is_first_time):
|
||||
self.rule_evaluator = self.sheerka.services[SheerkaEvaluateRules.NAME]
|
||||
@@ -499,9 +499,7 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
|
||||
if current_prop in (ConceptParts.WHERE, ConceptParts.PRE):
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_UNTIL_SUCCESS_REQUESTED)
|
||||
|
||||
if current_prop == ConceptParts.WHERE:
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_QUESTION_REQUESTED)
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVALUATING_PRE_OR_WHERE_CLAUSE)
|
||||
|
||||
# when it's a concept, evaluate it
|
||||
if isinstance(to_resolve, Concept) and \
|
||||
@@ -642,6 +640,9 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
if context.sheerka.isa(concept, context.sheerka.new(BuiltinConcepts.AUTO_EVAL)):
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
||||
|
||||
if context.in_context(BuiltinConcepts.EVALUATING_PRE_OR_WHERE_CLAUSE):
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_QUESTION_REQUESTED)
|
||||
|
||||
sub_context.add_to_short_term_memory(CURRENT_OBJ, concept)
|
||||
|
||||
try:
|
||||
@@ -764,6 +765,13 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
:param kwargs:
|
||||
:return:
|
||||
"""
|
||||
if concept.get_hints().use_copy or not concept.get_hints().is_instance:
|
||||
concept = concept.copy()
|
||||
concept.get_hints().use_copy = False
|
||||
concept.get_hints().is_instance = True
|
||||
concept.get_hints().is_evaluated = False # force evaluation
|
||||
|
||||
# TODO : update the variables before calling the concept
|
||||
|
||||
evaluated = self.evaluate_concept(context, concept)
|
||||
if self.sheerka.has_error(context, evaluated):
|
||||
|
||||
@@ -18,8 +18,8 @@ class SheerkaEvaluateRules(BaseService):
|
||||
self.network = ReteNetwork()
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.evaluate_format_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.evaluate_exec_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.evaluate_format_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.evaluate_exec_rules, False, visible=False)
|
||||
self.reset_evaluators()
|
||||
self.sheerka.subscribe(EVENT_RULE_CREATED, self.on_rule_created)
|
||||
self.sheerka.subscribe(EVENT_RULE_DELETED, self.on_rule_deleted)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from threading import RLock
|
||||
|
||||
from core.global_symbols import NotFound
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
|
||||
@@ -16,8 +17,8 @@ class SheerkaEventManager(BaseService):
|
||||
self.subscribers = {}
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.subscribe, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.publish, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.subscribe, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.publish, True, visible=False)
|
||||
|
||||
def save_state(self, context):
|
||||
with self._lock:
|
||||
|
||||
@@ -221,12 +221,12 @@ class SheerkaExecute(BaseService):
|
||||
self.rules_eval_service = None
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.execute, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.execute_rules, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.parse_unrecognized, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.parse_function, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.parse_python, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.parse_expression, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.execute, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.execute_rules, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.parse_unrecognized, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.parse_function, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.parse_python, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.parse_expression, False, visible=False)
|
||||
|
||||
self.reset_registered_evaluators()
|
||||
self.reset_registered_parsers()
|
||||
|
||||
@@ -11,8 +11,8 @@ class SheerkaHasAManager(BaseService):
|
||||
super().__init__(sheerka, order=22)
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.set_hasa, True)
|
||||
self.sheerka.bind_service_method(self.hasa, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_hasa, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.hasa, True)
|
||||
|
||||
def set_hasa(self, context, concept_a, concept_b):
|
||||
"""
|
||||
@@ -37,8 +37,13 @@ class SheerkaHasAManager(BaseService):
|
||||
concept=concept_a))
|
||||
|
||||
merged_concepts = merge_sets(concept_a.get_prop(BuiltinConcepts.HASA), {concept_b})
|
||||
to_add = {"props": {BuiltinConcepts.HASA: merged_concepts}}
|
||||
return self.sheerka.modify_concept(context, concept_a, to_add, modify_source=True)
|
||||
|
||||
if context.in_context(BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED):
|
||||
to_add = {"props": {BuiltinConcepts.HASA: merged_concepts}}
|
||||
return self.sheerka.modify_concept(context, concept_a, to_add, modify_source=True)
|
||||
else:
|
||||
concept_a.set_prop(BuiltinConcepts.HASA, merged_concepts)
|
||||
return self.sheerka.ret(self.NAME, True, concept_a)
|
||||
|
||||
def hasa(self, concept_a, concept_b):
|
||||
"""
|
||||
|
||||
@@ -19,12 +19,12 @@ class SheerkaIsAManager(BaseService):
|
||||
super().__init__(sheerka, order=21)
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.set_isa, True)
|
||||
self.sheerka.bind_service_method(self.get_set_elements, True) # concepts are evaluated
|
||||
self.sheerka.bind_service_method(self.add_concept_to_set, True)
|
||||
self.sheerka.bind_service_method(self.isinset, False)
|
||||
self.sheerka.bind_service_method(self.isa, False)
|
||||
self.sheerka.bind_service_method(self.isaset, True) # concept is evaluated, need to change the code
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_isa, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_set_elements, True) # concepts are evaluated
|
||||
self.sheerka.bind_service_method(self.NAME, self.add_concept_to_set, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.isinset, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.isa, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.isaset, True) # concept is evaluated, need to change the code
|
||||
|
||||
cache = SetCache().auto_configure(self.CONCEPTS_GROUPS_ENTRY)
|
||||
self.sheerka.om.register_cache(self.CONCEPTS_GROUPS_ENTRY, cache)
|
||||
@@ -53,16 +53,20 @@ class SheerkaIsAManager(BaseService):
|
||||
# KSI 20200709 add the concept, not its 'id' or 'key'
|
||||
# It will allow conditions handling if concept set has its WHERE or PRE set to something
|
||||
new_concept_set = merge_sets(concept.get_prop(BuiltinConcepts.ISA), {concept_set})
|
||||
to_add = {"props": {BuiltinConcepts.ISA: new_concept_set}}
|
||||
res = self.sheerka.modify_concept(context, concept, to_add, modify_source=True)
|
||||
if not res.status:
|
||||
|
||||
if context.in_context(BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED):
|
||||
to_add = {"props": {BuiltinConcepts.ISA: new_concept_set}}
|
||||
res = self.sheerka.modify_concept(context, concept, to_add, modify_source=True)
|
||||
if not res.status:
|
||||
return res
|
||||
else:
|
||||
concept = res.body.body
|
||||
|
||||
res = self.add_concept_to_set(context, concept, concept_set)
|
||||
return res
|
||||
else:
|
||||
concept = res.body.body
|
||||
|
||||
res = self.add_concept_to_set(context, concept, concept_set)
|
||||
|
||||
return res
|
||||
concept.set_prop(BuiltinConcepts.ISA, new_concept_set)
|
||||
return self.sheerka.ret(self.NAME, True, concept)
|
||||
|
||||
def add_concept_to_set(self, context, concept, concept_set):
|
||||
"""
|
||||
@@ -270,7 +274,7 @@ class SheerkaIsAManager(BaseService):
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
||||
errors = []
|
||||
for element_id in ids:
|
||||
concept = self.sheerka.fast_resolve((None, element_id))
|
||||
concept = self.sheerka.fast_resolve((None, element_id), force_instance=True)
|
||||
if concept:
|
||||
if len(concept.get_metadata().variables) == 0:
|
||||
evaluated = self.sheerka.evaluate_concept(sub_context, concept)
|
||||
|
||||
@@ -36,21 +36,23 @@ class SheerkaMemory(BaseService):
|
||||
super().__init__(sheerka, order=13)
|
||||
self.short_term_objects = FastCache()
|
||||
self.registration = {}
|
||||
self.enable_memory_registration = True
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.get_from_short_term_memory, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_all_short_term_memory, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.add_to_short_term_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.remove_context, True, as_name="clear_short_term_memory", visible=False)
|
||||
self.sheerka.bind_service_method(self.add_to_memory, True)
|
||||
self.sheerka.bind_service_method(self.add_many_to_short_term_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_from_memory, False)
|
||||
self.sheerka.bind_service_method(self.get_last_from_memory, False)
|
||||
self.sheerka.bind_service_method(self.register_object, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.unregister_object, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.commit_registered_objects, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.memory, False)
|
||||
self.sheerka.bind_service_method(self.mem, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_from_short_term_memory, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_all_short_term_memory, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.add_to_short_term_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.remove_context, True, as_name="clear_short_term_memory",
|
||||
visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.add_to_memory, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.add_many_to_short_term_memory, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_from_memory, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_last_from_memory, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.register_object, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.unregister_object, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.commit_registered_objects, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.memory, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.mem, False)
|
||||
|
||||
cache = ListIfNeededCache().auto_configure(self.OBJECTS_ENTRY)
|
||||
self.sheerka.om.register_cache(self.OBJECTS_ENTRY, cache, persist=True, use_ref=True)
|
||||
@@ -187,7 +189,7 @@ class SheerkaMemory(BaseService):
|
||||
:param concept:
|
||||
:return:
|
||||
"""
|
||||
if self.sheerka.during_initialisation or self.sheerka.during_restore:
|
||||
if not self.enable_memory_registration or self.sheerka.during_initialisation or self.sheerka.during_restore:
|
||||
return
|
||||
self.registration[key] = concept
|
||||
|
||||
@@ -220,39 +222,48 @@ class SheerkaMemory(BaseService):
|
||||
:param name:
|
||||
:return:
|
||||
"""
|
||||
name_to_use = name.name if isinstance(name, Concept) else name
|
||||
self.unregister_object(context, name_to_use)
|
||||
self.enable_memory_registration = False
|
||||
try:
|
||||
name_to_use = name.name if isinstance(name, Concept) else name
|
||||
self.unregister_object(context, name_to_use)
|
||||
|
||||
# first try direct access
|
||||
obj = self.get_last_from_memory(context, name_to_use)
|
||||
if obj is not NotFound:
|
||||
return obj.obj
|
||||
# first try direct access
|
||||
obj = self.get_last_from_memory(context, name_to_use)
|
||||
if obj is not NotFound:
|
||||
return obj.obj
|
||||
|
||||
all_objects = self.sheerka.om.list(SheerkaMemory.OBJECTS_ENTRY) # not always a list of list
|
||||
all_objects_copy = [] # to transform into list of list
|
||||
for obj in all_objects:
|
||||
if isinstance(obj, list):
|
||||
all_objects_copy.append(obj.copy())
|
||||
else:
|
||||
all_objects_copy.append([obj])
|
||||
# only filter if it's a valid predicate
|
||||
from parsers.BaseExpressionParser import VariableNode, NameExprNode
|
||||
parsed_ret_val = self.sheerka.parse_expression(context, name_to_use, auto_compile=False)
|
||||
if parsed_ret_val.status and not isinstance(parsed_ret_val.body.body, (VariableNode, NameExprNode)):
|
||||
|
||||
while len(all_objects_copy) > 0:
|
||||
current_list = []
|
||||
temp = []
|
||||
for obj in all_objects_copy:
|
||||
current_list.append(obj.pop(-1))
|
||||
if len(obj) > 0:
|
||||
temp.append(obj)
|
||||
all_objects = self.sheerka.om.list(SheerkaMemory.OBJECTS_ENTRY) # not always a list of list
|
||||
all_objects_copy = [] # to transform into list of list
|
||||
for obj in all_objects:
|
||||
if isinstance(obj, list):
|
||||
all_objects_copy.append(obj.copy())
|
||||
else:
|
||||
all_objects_copy.append([obj])
|
||||
|
||||
all_objects_copy = temp # list constructed with the last item of each item
|
||||
current_list = sorted(current_list, key=lambda o: o.timestamp, reverse=True)
|
||||
current_objects = [o.obj for o in current_list]
|
||||
while len(all_objects_copy) > 0:
|
||||
current_list = []
|
||||
temp = []
|
||||
for obj in all_objects_copy:
|
||||
current_list.append(obj.pop(-1))
|
||||
if len(obj) > 0:
|
||||
temp.append(obj)
|
||||
|
||||
res = self.sheerka.filter_objects(context, current_objects, name_to_use)
|
||||
if len(res) > 0:
|
||||
return res[0] # only the first, as it should have a better timestamp
|
||||
all_objects_copy = temp # list constructed with the last item of each item
|
||||
current_list = sorted(current_list, key=lambda o: o.timestamp, reverse=True)
|
||||
current_objects = [o.obj for o in current_list]
|
||||
|
||||
return self.sheerka.new(BuiltinConcepts.NOT_FOUND, body={"#name": name_to_use})
|
||||
res = self.sheerka.filter_objects(context, current_objects, name_to_use)
|
||||
if len(res) > 0:
|
||||
return res[0] # only the first, as it should have a better timestamp
|
||||
|
||||
return self.sheerka.new(BuiltinConcepts.NOT_FOUND, body={"#name": name_to_use})
|
||||
finally:
|
||||
self.enable_memory_registration = True
|
||||
|
||||
def mem(self):
|
||||
keys = sorted([k for k in self.sheerka.om.list(SheerkaMemory.OBJECTS_ENTRY)])
|
||||
|
||||
@@ -13,7 +13,7 @@ class SheerkaOut(BaseService):
|
||||
self.out_visitors = [ConsoleVisitor(expand_mode="all_but_first")]
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.process_return_values, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.process_return_values, False)
|
||||
self.sheerka.register_debug_vars("Visitor", "create_out_tree", "Exception")
|
||||
self.sheerka.register_debug_vars(SheerkaOut.NAME, "create_out_tree", "out_tree")
|
||||
|
||||
|
||||
@@ -26,13 +26,13 @@ class SheerkaQueryManager(BaseService):
|
||||
self.rule_evaluator = None
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.filter_objects, False)
|
||||
self.sheerka.bind_service_method(self.select_objects, False)
|
||||
self.sheerka.bind_service_method(self.collect_attributes, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.filter_objects, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.select_objects, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.collect_attributes, False)
|
||||
|
||||
self.sheerka.bind_service_method(self.filter_objects, False, as_name="pipe_where")
|
||||
self.sheerka.bind_service_method(self.select_objects, False, as_name="pipe_select")
|
||||
self.sheerka.bind_service_method(self.collect_attributes, False, as_name="pipe_props")
|
||||
self.sheerka.bind_service_method(self.NAME, self.filter_objects, False, as_name="pipe_where")
|
||||
self.sheerka.bind_service_method(self.NAME, self.select_objects, False, as_name="pipe_select")
|
||||
self.sheerka.bind_service_method(self.NAME, self.collect_attributes, False, as_name="pipe_props")
|
||||
|
||||
self.sheerka.register_debug_vars(SheerkaQueryManager.NAME, "filter_objects", "query")
|
||||
|
||||
@@ -59,12 +59,13 @@ class SheerkaQueryManager(BaseService):
|
||||
if k == "__type":
|
||||
conditions.append(f"get_type(self) == {current_variable_name}")
|
||||
|
||||
elif k == "atomic_def":
|
||||
conditions.append(f"atomic_def(self) == {current_variable_name}")
|
||||
|
||||
elif k in ("__self", "_"):
|
||||
conditions.append(f"self == {current_variable_name}")
|
||||
|
||||
elif k.endswith("_contains"):
|
||||
prop_name = k[:-9]
|
||||
conditions.append(f"{current_variable_name} in self.{prop_name}")
|
||||
|
||||
else:
|
||||
conditions.append(f"self.{k} == {current_variable_name}")
|
||||
|
||||
@@ -91,6 +92,7 @@ class SheerkaQueryManager(BaseService):
|
||||
objects = objects.body
|
||||
|
||||
debugger.debug_entering(nb_objects=len(objects), predicate=predicate, **kwargs)
|
||||
|
||||
local_namespace = {}
|
||||
query_by_kwargs = self.get_query_by_kwargs(local_namespace, **kwargs)
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.concept import Concept
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
|
||||
|
||||
@@ -10,7 +9,7 @@ class SheerkaQuestion(BaseService):
|
||||
super().__init__(sheerka)
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.is_question, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.is_question, False)
|
||||
|
||||
@staticmethod
|
||||
def is_question(context):
|
||||
|
||||
@@ -31,14 +31,15 @@ class SheerkaResultManager(BaseService):
|
||||
self.state_vars = ["last_created_concept_id", "last_error_event_id"]
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.get_results_by_digest, True) # digest is recorded
|
||||
self.sheerka.bind_service_method(self.get_results_by_command, True) # digest is recorded
|
||||
self.sheerka.bind_service_method(self.get_last_results, True) # digest is recorded
|
||||
self.sheerka.bind_service_method(self.get_results, False)
|
||||
self.sheerka.bind_service_method(self.get_execution_item, False)
|
||||
self.sheerka.bind_service_method(self.get_last_return_value, False, as_name="last_ret")
|
||||
self.sheerka.bind_service_method(self.get_last_created_concept, False, as_name="last_created_concept")
|
||||
self.sheerka.bind_service_method(self.get_last_error, False, as_name="last_err")
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_results_by_digest, True) # digest is recorded
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_results_by_command, True) # digest is recorded
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_last_results, True) # digest is recorded
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_results, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_execution_item, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_last_return_value, False, as_name="last_ret")
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_last_created_concept, False,
|
||||
as_name="last_created_concept")
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_last_error, False, as_name="last_err")
|
||||
|
||||
self.sheerka.subscribe(EVENT_USER_INPUT_EVALUATED, self.user_input_evaluated)
|
||||
self.sheerka.subscribe(EVENT_CONCEPT_CREATED, self.new_concept_created)
|
||||
@@ -77,6 +78,7 @@ class SheerkaResultManager(BaseService):
|
||||
"""
|
||||
if len(kwargs) == 0:
|
||||
return None
|
||||
|
||||
res = []
|
||||
if "filter" in kwargs:
|
||||
res.append(kwargs["filter"])
|
||||
@@ -90,6 +92,10 @@ class SheerkaResultManager(BaseService):
|
||||
v = '"' + v.translate(str.maketrans({'"': r'\"'})) + '"'
|
||||
res.append(f"{k} == {v}")
|
||||
predicate = " and ".join(res)
|
||||
|
||||
if predicate.strip() == "":
|
||||
return None
|
||||
|
||||
return compile(ast.parse(predicate, mode="eval"), "<SheerkaResultManager.get_predicate>", mode="eval")
|
||||
|
||||
@staticmethod
|
||||
@@ -380,15 +386,16 @@ class SheerkaResultManager(BaseService):
|
||||
|
||||
folder = os.getenv(SHEERKA_BACKUP_FOLDER)
|
||||
if folder is None:
|
||||
print(f"{CCM['red']}Cannot backup command. Backup folder (env SHEERKA_BACKUP_FOLDER) is not defined.{CCM['reset']}")
|
||||
print(
|
||||
f"{CCM['red']}Cannot backup command. Backup folder (env SHEERKA_BACKUP_FOLDER) is not defined.{CCM['reset']}")
|
||||
return
|
||||
|
||||
file = os.getenv(SHEERKA_BACKUP_FILE)
|
||||
if file is None:
|
||||
print(f"{CCM['red']}Cannot backup command. Backup file (env SHEERKA_BACKUP_FILE) is not defined.{CCM['reset']}")
|
||||
print(
|
||||
f"{CCM['red']}Cannot backup command. Backup file (env SHEERKA_BACKUP_FILE) is not defined.{CCM['reset']}")
|
||||
return
|
||||
|
||||
full_path = os.path.join(folder, file)
|
||||
with open(full_path, "a") as f:
|
||||
f.write(f"{execution_context.event.message}\n")
|
||||
|
||||
|
||||
@@ -82,13 +82,13 @@ class SheerkaRuleManager(BaseService):
|
||||
self.expression_parser = LogicalOperatorParser()
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.create_new_rule, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.remove_rule, True)
|
||||
self.sheerka.bind_service_method(self.get_rule_by_id, False)
|
||||
self.sheerka.bind_service_method(self.get_rule_by_name, False)
|
||||
self.sheerka.bind_service_method(self.get_format_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.get_exec_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.resolve_rule, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.create_new_rule, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.remove_rule, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_rule_by_id, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_rule_by_name, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_format_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_exec_rules, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.resolve_rule, False, visible=False)
|
||||
|
||||
cache = Cache().auto_configure(self.FORMAT_RULE_ENTRY)
|
||||
self.sheerka.om.register_cache(self.FORMAT_RULE_ENTRY, cache, True, True)
|
||||
|
||||
@@ -53,14 +53,14 @@ class SheerkaVariableManager(BaseService):
|
||||
}
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.record_var, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.load_var, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.record_internal_var, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.load_internal_var, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.delete_var, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.set_var, True)
|
||||
self.sheerka.bind_service_method(self.get_var, False)
|
||||
self.sheerka.bind_service_method(self.list_vars, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.record_var, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.load_var, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.record_internal_var, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.load_internal_var, False, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.delete_var, True, visible=False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.set_var, True)
|
||||
self.sheerka.bind_service_method(self.NAME, self.get_var, False)
|
||||
self.sheerka.bind_service_method(self.NAME, self.list_vars, False)
|
||||
|
||||
cache = Cache().auto_configure(self.VARIABLES_ENTRY)
|
||||
self.sheerka.om.register_cache(self.VARIABLES_ENTRY, cache, True, True)
|
||||
|
||||
Reference in New Issue
Block a user