ripple-down-rules 0.1.62__tar.gz → 0.1.63__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.63}/PKG-INFO +1 -1
  2. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/pyproject.toml +1 -1
  3. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/datastructures/case.py +2 -2
  4. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/experts.py +1 -1
  5. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/rdr.py +9 -8
  6. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules.egg-info/PKG-INFO +1 -1
  7. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_rdr_world.py +6 -6
  8. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/LICENSE +0 -0
  9. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/README.md +0 -0
  10. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/setup.cfg +0 -0
  11. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/__init__.py +0 -0
  12. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/datasets.py +0 -0
  13. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/datastructures/__init__.py +0 -0
  14. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/datastructures/callable_expression.py +0 -0
  15. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/datastructures/dataclasses.py +0 -0
  16. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/datastructures/enums.py +0 -0
  17. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/failures.py +0 -0
  18. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/helpers.py +0 -0
  19. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/prompt.py +0 -0
  20. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/rdr_decorators.py +0 -0
  21. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/rules.py +0 -0
  22. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules/utils.py +0 -0
  23. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules.egg-info/SOURCES.txt +0 -0
  24. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules.egg-info/dependency_links.txt +0 -0
  25. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/src/ripple_down_rules.egg-info/top_level.txt +0 -0
  26. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_json_serialization.py +0 -0
  27. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_on_mutagenic.py +0 -0
  28. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_rdr.py +0 -0
  29. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_rdr_alchemy.py +0 -0
  30. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_relational_rdr.py +0 -0
  31. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/test/test_relational_rdr_alchemy.py +0 -0
  32. {ripple_down_rules-0.1.62 → ripple_down_rules-0.1.63}/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.63
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.63"
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
 
@@ -722,7 +722,7 @@ class GeneralRDR(RippleDownRules):
722
722
  def start_rules(self) -> List[Union[SingleClassRule, MultiClassTopRule]]:
723
723
  return [rdr.start_rule for rdr in self.start_rules_dict.values()]
724
724
 
725
- def classify(self, case: Union[Case, SQLTable]) -> Optional[List[Any]]:
725
+ def classify(self, case: Any) -> Optional[Dict[str, Any]]:
726
726
  """
727
727
  Classify a case by going through all RDRs and adding the categories that are classified, and then restarting
728
728
  the classification until no more categories can be added.
@@ -734,7 +734,7 @@ class GeneralRDR(RippleDownRules):
734
734
 
735
735
  @staticmethod
736
736
  def _classify(classifiers_dict: Dict[str, Union[ModuleType, RippleDownRules]],
737
- case: Union[Case, SQLTable]) -> Optional[Dict[str, Any]]:
737
+ case: Any) -> Dict[str, Any]:
738
738
  """
739
739
  Classify a case by going through all classifiers and adding the categories that are classified,
740
740
  and then restarting the classification until no more categories can be added.
@@ -775,7 +775,7 @@ class GeneralRDR(RippleDownRules):
775
775
  return conclusions
776
776
 
777
777
  def fit_case(self, case_queries: List[CaseQuery], expert: Optional[Expert] = None, **kwargs) \
778
- -> List[Union[CaseAttribute, CallableExpression]]:
778
+ -> Dict[str, Any]:
779
779
  """
780
780
  Fit the GRDR on a case, if the target is a new type of category, a new RDR is created for it,
781
781
  else the existing RDR of that type will be fitted on the case, and then classification is done and all
@@ -790,7 +790,7 @@ class GeneralRDR(RippleDownRules):
790
790
  :return: The categories that the case belongs to.
791
791
  """
792
792
  expert = expert if expert else Human()
793
- case_queries = [case_queries] if not isinstance(case_queries, list) else case_queries
793
+ case_queries = make_list(case_queries)
794
794
  assert len(case_queries) > 0, "No case queries provided"
795
795
  case = case_queries[0].case
796
796
  assert all([case is case_query.case for case_query in case_queries]), ("fit_case requires only one case,"
@@ -823,10 +823,11 @@ class GeneralRDR(RippleDownRules):
823
823
  else:
824
824
  conclusions = self.start_rules_dict[rdr_attribute_name].fit_case(case_query_cp, expert,
825
825
  **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)
826
+ if conclusions is not None:
827
+ if (not is_iterable(conclusions)) or len(conclusions) > 0:
828
+ conclusions = {rdr_attribute_name: conclusions}
829
+ case_query_cp.mutually_exclusive = True if isinstance(rdr, SingleClassRDR) else False
830
+ self.update_case(case_query_cp, conclusions)
830
831
  case_query.conditions = case_query_cp.conditions
831
832
 
832
833
  return self.classify(case)
@@ -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.63
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