ripple-down-rules 0.1.62__tar.gz → 0.1.64__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/PKG-INFO +1 -1
  2. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/pyproject.toml +1 -1
  3. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/datastructures/case.py +2 -2
  4. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/experts.py +1 -1
  5. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/rdr.py +18 -14
  6. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/rules.py +1 -1
  7. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules.egg-info/PKG-INFO +1 -1
  8. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_rdr_world.py +6 -6
  9. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/LICENSE +0 -0
  10. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/README.md +0 -0
  11. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/setup.cfg +0 -0
  12. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/__init__.py +0 -0
  13. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/datasets.py +0 -0
  14. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/datastructures/__init__.py +0 -0
  15. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/datastructures/callable_expression.py +0 -0
  16. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/datastructures/dataclasses.py +0 -0
  17. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/datastructures/enums.py +0 -0
  18. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/failures.py +0 -0
  19. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/helpers.py +0 -0
  20. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/prompt.py +0 -0
  21. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/rdr_decorators.py +0 -0
  22. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules/utils.py +0 -0
  23. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules.egg-info/SOURCES.txt +0 -0
  24. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules.egg-info/dependency_links.txt +0 -0
  25. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/src/ripple_down_rules.egg-info/top_level.txt +0 -0
  26. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_json_serialization.py +0 -0
  27. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_on_mutagenic.py +0 -0
  28. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_rdr.py +0 -0
  29. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_rdr_alchemy.py +0 -0
  30. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_relational_rdr.py +0 -0
  31. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_relational_rdr_alchemy.py +0 -0
  32. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.64}/test/test_sql_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ripple_down_rules
3
- Version: 0.1.62
3
+ Version: 0.1.64
4
4
  Summary: Implements the various versions of Ripple Down Rules (RDR) for knowledge representation and reasoning.
5
5
  Author-email: Abdelrhman Bassiouny <abassiou@uni-bremen.de>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "ripple_down_rules"
9
- version = "0.1.62"
9
+ version = "0.1.64"
10
10
  description = "Implements the various versions of Ripple Down Rules (RDR) for knowledge representation and reasoning."
11
11
  readme = "README.md"
12
12
  authors = [{ name = "Abdelrhman Bassiouny", email = "abassiou@uni-bremen.de" }]
@@ -307,7 +307,7 @@ def show_current_and_corner_cases(case: Any, targets: Optional[Dict[str, Any]] =
307
307
  """
308
308
  corner_case = None
309
309
  targets = {f"target_{name}": value for name, value in targets.items()} if targets else {}
310
- current_conclusions = {name: value for name, value in current_conclusions.items} if current_conclusions else {}
310
+ current_conclusions = {name: value for name, value in current_conclusions.items()} if current_conclusions else {}
311
311
  if last_evaluated_rule:
312
312
  action = "Refinement" if last_evaluated_rule.fired else "Alternative"
313
313
  print(f"{action} needed for rule: {last_evaluated_rule}\n")
@@ -324,7 +324,7 @@ def show_current_and_corner_cases(case: Any, targets: Optional[Dict[str, Any]] =
324
324
  corner_row_dict = corner_case
325
325
 
326
326
  if corner_row_dict:
327
- corner_conclusion = last_evaluated_rule.conclusion
327
+ corner_conclusion = last_evaluated_rule.conclusion(case)
328
328
  corner_row_dict.update({corner_conclusion.__class__.__name__: corner_conclusion})
329
329
  print(table_rows_as_str(corner_row_dict))
330
330
  print("=" * 50)
@@ -122,7 +122,7 @@ class Human(Expert):
122
122
  last_evaluated_rule: Optional[Rule] = None) \
123
123
  -> CallableExpression:
124
124
  if not self.use_loaded_answers:
125
- show_current_and_corner_cases(case_query.case, {case_query.attribute_name: case_query.target},
125
+ show_current_and_corner_cases(case_query.case, {case_query.attribute_name: case_query.target_value},
126
126
  last_evaluated_rule=last_evaluated_rule)
127
127
  return self._get_conditions(case_query)
128
128
 
@@ -217,13 +217,16 @@ class RDRWithCodeWriter(RippleDownRules, ABC):
217
217
  for rule in [self.start_rule] + list(self.start_rule.descendants):
218
218
  if not rule.conditions:
219
219
  continue
220
- if rule.conditions.scope is None or len(rule.conditions.scope) == 0:
221
- continue
222
- for k, v in rule.conditions.scope.items():
223
- new_imports = f"from {v.__module__} import {v.__name__}\n"
224
- if new_imports in imports:
220
+ for scope in [rule.conditions.scope, rule.conclusion.scope]:
221
+ if scope is None:
225
222
  continue
226
- imports += new_imports
223
+ for k, v in scope.items():
224
+ if not hasattr(v, "__module__") or not hasattr(v, "__name__"):
225
+ continue
226
+ new_imports = f"from {v.__module__} import {v.__name__}\n"
227
+ if new_imports in imports:
228
+ continue
229
+ imports += new_imports
227
230
  return imports
228
231
 
229
232
  def get_rdr_classifier_from_python_file(self, package_name: str) -> Callable[[Any], Any]:
@@ -722,7 +725,7 @@ class GeneralRDR(RippleDownRules):
722
725
  def start_rules(self) -> List[Union[SingleClassRule, MultiClassTopRule]]:
723
726
  return [rdr.start_rule for rdr in self.start_rules_dict.values()]
724
727
 
725
- def classify(self, case: Union[Case, SQLTable]) -> Optional[List[Any]]:
728
+ def classify(self, case: Any) -> Optional[Dict[str, Any]]:
726
729
  """
727
730
  Classify a case by going through all RDRs and adding the categories that are classified, and then restarting
728
731
  the classification until no more categories can be added.
@@ -734,7 +737,7 @@ class GeneralRDR(RippleDownRules):
734
737
 
735
738
  @staticmethod
736
739
  def _classify(classifiers_dict: Dict[str, Union[ModuleType, RippleDownRules]],
737
- case: Union[Case, SQLTable]) -> Optional[Dict[str, Any]]:
740
+ case: Any) -> Dict[str, Any]:
738
741
  """
739
742
  Classify a case by going through all classifiers and adding the categories that are classified,
740
743
  and then restarting the classification until no more categories can be added.
@@ -775,7 +778,7 @@ class GeneralRDR(RippleDownRules):
775
778
  return conclusions
776
779
 
777
780
  def fit_case(self, case_queries: List[CaseQuery], expert: Optional[Expert] = None, **kwargs) \
778
- -> List[Union[CaseAttribute, CallableExpression]]:
781
+ -> Dict[str, Any]:
779
782
  """
780
783
  Fit the GRDR on a case, if the target is a new type of category, a new RDR is created for it,
781
784
  else the existing RDR of that type will be fitted on the case, and then classification is done and all
@@ -790,7 +793,7 @@ class GeneralRDR(RippleDownRules):
790
793
  :return: The categories that the case belongs to.
791
794
  """
792
795
  expert = expert if expert else Human()
793
- case_queries = [case_queries] if not isinstance(case_queries, list) else case_queries
796
+ case_queries = make_list(case_queries)
794
797
  assert len(case_queries) > 0, "No case queries provided"
795
798
  case = case_queries[0].case
796
799
  assert all([case is case_query.case for case_query in case_queries]), ("fit_case requires only one case,"
@@ -823,10 +826,11 @@ class GeneralRDR(RippleDownRules):
823
826
  else:
824
827
  conclusions = self.start_rules_dict[rdr_attribute_name].fit_case(case_query_cp, expert,
825
828
  **kwargs)
826
- if conclusions is not None or (is_iterable(conclusions) and len(conclusions) > 0):
827
- conclusions = {rdr_attribute_name: conclusions}
828
- case_query_cp.mutually_exclusive = True if isinstance(rdr, SingleClassRDR) else False
829
- self.update_case(case_query_cp, conclusions)
829
+ if conclusions is not None:
830
+ if (not is_iterable(conclusions)) or len(conclusions) > 0:
831
+ conclusions = {rdr_attribute_name: conclusions}
832
+ case_query_cp.mutually_exclusive = True if isinstance(rdr, SingleClassRDR) else False
833
+ self.update_case(case_query_cp, conclusions)
830
834
  case_query.conditions = case_query_cp.conditions
831
835
 
832
836
  return self.classify(case)
@@ -288,7 +288,7 @@ class MultiClassStopRule(Rule, HasAlternativeRule):
288
288
 
289
289
  def __init__(self, *args, **kwargs):
290
290
  super(MultiClassStopRule, self).__init__(*args, **kwargs)
291
- self.conclusion = Stop.stop
291
+ self.conclusion = CallableExpression(conclusion_type=(Stop,), conclusion=Stop.stop)
292
292
 
293
293
  def evaluate_next_rule(self, x: Case) -> Optional[Union[MultiClassStopRule, MultiClassTopRule]]:
294
294
  if self.fired:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ripple_down_rules
3
- Version: 0.1.62
3
+ Version: 0.1.64
4
4
  Summary: Implements the various versions of Ripple Down Rules (RDR) for knowledge representation and reasoning.
5
5
  Author-email: Abdelrhman Bassiouny <abassiou@uni-bremen.de>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -7,8 +7,8 @@ from unittest import TestCase
7
7
 
8
8
  from ripple_down_rules.datastructures.dataclasses import CaseQuery
9
9
  from ripple_down_rules.experts import Human
10
- from ripple_down_rules.rdr import SingleClassRDR, GeneralRDR
11
10
  from ripple_down_rules.helpers import is_matching
11
+ from ripple_down_rules.rdr import GeneralRDR
12
12
 
13
13
 
14
14
  @dataclass
@@ -94,7 +94,7 @@ class TestRDRWorld(TestCase):
94
94
 
95
95
  handle = Handle('h1', world=world)
96
96
  handle_2 = Handle('h2', world=world)
97
- container_1 = Container('c1',world=world)
97
+ container_1 = Container('c1', world=world)
98
98
  container_2 = Container('c2', world=world)
99
99
  connection_1 = FixedConnection(container_1, handle, world=world)
100
100
  connection_2 = PrismaticConnection(container_2, container_1, world=world)
@@ -109,7 +109,7 @@ class TestRDRWorld(TestCase):
109
109
  all_possible_drawers.append(view)
110
110
 
111
111
  print(all_possible_drawers)
112
- cls.drawer_case_queries = [CaseQuery(possible_drawer, "correct", bool, True, default_value=False)
112
+ cls.drawer_case_queries = [CaseQuery(possible_drawer, "correct", (bool,), True, default_value=False)
113
113
  for possible_drawer in all_possible_drawers]
114
114
 
115
115
  def test_view_rdr(self):
@@ -123,12 +123,12 @@ class TestRDRWorld(TestCase):
123
123
  expert.load_answers(filename)
124
124
  rdr = GeneralRDR()
125
125
  try:
126
- rdr.fit_case(CaseQuery(self.world, "views", View, False), expert=expert,
127
- add_extra_conclusions=True)
126
+ rdr.fit_case([CaseQuery(self.world, "views", (View,), False)], expert=expert,
127
+ add_extra_conclusions=True)
128
128
  except Exception as e:
129
129
  if append:
130
130
  expert.use_loaded_answers = False
131
- rdr.fit_case(CaseQuery(self.world, "views", View, False), expert=expert,
131
+ rdr.fit_case([CaseQuery(self.world, "views", (View,), False)], expert=expert,
132
132
  add_extra_conclusions=True)
133
133
  else:
134
134
  raise e