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:
2021-07-31 08:52:00 +02:00
parent 7dcaa9c111
commit e69745adc8
70 changed files with 1561 additions and 455 deletions
+25 -33
View File
@@ -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
+5 -2
View File
@@ -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:
+6 -6
View File
@@ -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 -15
View File
@@ -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)
+52 -41
View File
@@ -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)])
+1 -1
View File
@@ -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 -2
View File
@@ -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)