ripple-down-rules 0.5.89__tar.gz → 0.5.90__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 (152) hide show
  1. ripple_down_rules-0.5.90/.gitignore +2 -0
  2. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/PKG-INFO +1 -1
  3. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/__init__.py +1 -1
  4. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/case.py +7 -6
  5. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/experts.py +8 -6
  6. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/prompt.py +23 -20
  7. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/PKG-INFO +1 -1
  8. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/SOURCES.txt +1 -0
  9. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/.github/workflows/build_and_deploy_doc.yml +0 -0
  10. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/.github/workflows/ci.yml +0 -0
  11. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/.github/workflows/publish-to-test-pypi.yml +0 -0
  12. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/.idea/shelf/Uncommitted_changes_before_Checkout_at_2_4_25,_6_32_PM_[Changes]/shelved.patch +0 -0
  13. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/.idea/shelf/Uncommitted_changes_before_Checkout_at_2_4_25,_6_32_PM_[Changes]1/shelved.patch +0 -0
  14. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/LICENSE +0 -0
  15. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/README.md +0 -0
  16. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/doc/_config.yml +0 -0
  17. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/doc/_toc.yml +0 -0
  18. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/doc/bibliography.md +0 -0
  19. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/doc/intro.md +0 -0
  20. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/doc/references.bib +0 -0
  21. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/doc/requirements.txt +0 -0
  22. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/__init__.py +0 -0
  23. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/animal_species.py +0 -0
  24. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/__init__.py +0 -0
  25. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/rdr_metadata/part_containment_rdr.json +0 -0
  26. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/robot_contained_objects_mcrdr.py +0 -0
  27. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/robot_contained_objects_mcrdr_defs.py +0 -0
  28. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/robot_rdr.py +0 -0
  29. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/examples/relational_example.py +0 -0
  30. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/images/scrdr.dot +0 -0
  31. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/images/scrdr.png +0 -0
  32. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/images/thinking_pr2.jpg +0 -0
  33. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/pyproject.toml +0 -0
  34. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/pytest.ini +0 -0
  35. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/requirements-dev-ci.txt +0 -0
  36. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/requirements-dev.txt +0 -0
  37. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/requirements-gui.txt +0 -0
  38. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/requirements-viz.txt +0 -0
  39. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/requirements.txt +0 -0
  40. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_mcrdr_extra.dot +0 -0
  41. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_mcrdr_extra.png +0 -0
  42. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_only.dot +0 -0
  43. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_only.png +0 -0
  44. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_plus_rule.dot +0 -0
  45. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_plus_rule.png +0 -0
  46. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_scrdr.dot +0 -0
  47. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_scrdr.png +0 -0
  48. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_scrdr_2.dot +0 -0
  49. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_scrdr_2.png +0 -0
  50. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_scrdr_3.dot +0 -0
  51. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/complete_scrdr_3.png +0 -0
  52. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/grdr_Habitat.dot +0 -0
  53. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/grdr_Habitat.png +0 -0
  54. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/grdr_Species.dot +0 -0
  55. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/grdr_Species.png +0 -0
  56. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/mcrdr_extra.dot +0 -0
  57. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/mcrdr_extra.png +0 -0
  58. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/mcrdr_extra_classify.dot +0 -0
  59. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/mcrdr_extra_classify.png +0 -0
  60. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/mcrdr_stop_plus_rule_combined.dot +0 -0
  61. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/mcrdr_stop_plus_rule_combined.png +0 -0
  62. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/partial_mcrdr_extra.dot +0 -0
  63. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/partial_mcrdr_extra.png +0 -0
  64. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/relational_scrdr_classify.dot +0 -0
  65. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/results/relational_scrdr_classify.png +0 -0
  66. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/setup.cfg +0 -0
  67. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/__init__.py +0 -0
  68. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/callable_expression.py +0 -0
  69. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/dataclasses.py +0 -0
  70. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/enums.py +0 -0
  71. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/helpers.py +0 -0
  72. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/rdr.py +0 -0
  73. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/rdr_decorators.py +0 -0
  74. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/rules.py +0 -0
  75. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/start-code-server.sh +0 -0
  76. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/__init__.py +0 -0
  77. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/gui.py +0 -0
  78. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/ipython_custom_shell.py +0 -0
  79. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/object_diagram.py +0 -0
  80. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/template_file_creator.py +0 -0
  81. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules/utils.py +0 -0
  82. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/dependency_links.txt +0 -0
  83. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/requires.txt +0 -0
  84. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/top_level.txt +0 -0
  85. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/__init__.py +0 -0
  86. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/conf/__init__.py +0 -0
  87. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/conf/world/__init__.py +0 -0
  88. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/conf/world/base_config.py +0 -0
  89. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/conf/world/handles_and_containers.py +0 -0
  90. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/conftest.py +0 -0
  91. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/datasets.py +0 -0
  92. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/factories/__init__.py +0 -0
  93. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/factories/world/__init__.py +0 -0
  94. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/factories/world/handles_and_containers.py +0 -0
  95. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/correct_drawer_rdr_expert_answers_fit.json +0 -0
  96. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/drawer_cabinet_expert_answers_fit.json +0 -0
  97. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_classify.json +0 -0
  98. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_fit.json +0 -0
  99. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_fit_extra.json +0 -0
  100. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_fit_no_targets.json +0 -0
  101. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_expert_answers_classify.json +0 -0
  102. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_expert_answers_fit_no_targets.json +0 -0
  103. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_expert_answers_stop_only_fit.json +0 -0
  104. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_extra_expert_answers_classify.json +0 -0
  105. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_extra_expert_answers_fit.json +0 -0
  106. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_multi_line_expert_answers_fit.json +0 -0
  107. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_stop_only_answers_fit.json +0 -0
  108. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_stop_plus_rule_answers_fit.json +0 -0
  109. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_stop_plus_rule_combined_expert_answers_fit.json +0 -0
  110. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_stop_plus_rule_expert_answers_fit.json +0 -0
  111. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/mutagenic_expert_answers.json +0 -0
  112. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/relational_scrdr_expert_answers_classify.json +0 -0
  113. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_expert_answers_classify.json +0 -0
  114. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_expert_answers_fit.json +0 -0
  115. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_expert_answers_fit_no_targets.json +0 -0
  116. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_multi_line_expert_answers_fit.json +0 -0
  117. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_world_expert_answers_fit.json +0 -0
  118. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_generated_rdrs/__init__.py +0 -0
  119. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_helpers/__init__.py +0 -0
  120. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_helpers/helpers.py +0 -0
  121. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_helpers/object_diagram_case_query.png +0 -0
  122. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_helpers/object_diagram_person.png +0 -0
  123. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_json_serialization.py +0 -0
  124. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_object_diagram.py +0 -0
  125. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_on_mutagenic.py +0 -0
  126. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr.py +0 -0
  127. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr_alchemy.py +0 -0
  128. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr_decorators.py +0 -0
  129. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr_helpers_rdrs.py +0 -0
  130. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr_world/__init__.py +0 -0
  131. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr_world/conftest.py +0 -0
  132. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_rdr_world/test_rdr_world.py +0 -0
  133. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_relational_rdr.py +0 -0
  134. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_relational_rdr_alchemy.py +0 -0
  135. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_is_a_robot/__init__.py +0 -0
  136. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_is_a_robot/physical_object_is_a_robot_output__scrdr.py +0 -0
  137. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_is_a_robot/physical_object_is_a_robot_output__scrdr_defs.py +0 -0
  138. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_is_a_robot/physical_object_is_a_robot_rdr.py +0 -0
  139. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_is_a_robot/rdr_metadata/datasets_physical_object_is_a_robot.json +0 -0
  140. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_select_objects_that_are_parts_of_robot/__init__.py +0 -0
  141. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_select_objects_that_are_parts_of_robot/physical_object_select_objects_that_are_parts_of_robot_output__mcrdr.py +0 -0
  142. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_select_objects_that_are_parts_of_robot/physical_object_select_objects_that_are_parts_of_robot_output__mcrdr_defs.py +0 -0
  143. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_select_objects_that_are_parts_of_robot/physical_object_select_objects_that_are_parts_of_robot_rdr.py +0 -0
  144. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_results/datasets_physical_object_select_objects_that_are_parts_of_robot/rdr_metadata/datasets_physical_object_select_objects_that_are_parts_of_robot.json +0 -0
  145. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_sql_model.py +0 -0
  146. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_template_file_creator.py +0 -0
  147. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_user_interface/__init__.py +0 -0
  148. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_user_interface/test_ipython.py +0 -0
  149. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_user_interface/test_ipython_copilot.py +0 -0
  150. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_user_interface/test_prompt.py +0 -0
  151. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_user_interface/test_qt_gui_inline.py +0 -0
  152. {ripple_down_rules-0.5.89 → ripple_down_rules-0.5.90}/test/test_utils.py +0 -0
@@ -0,0 +1,2 @@
1
+ *.pyc
2
+ *.egg-info
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ripple_down_rules
3
- Version: 0.5.89
3
+ Version: 0.5.90
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
@@ -1,4 +1,4 @@
1
- __version__ = "0.5.89"
1
+ __version__ = "0.5.90"
2
2
 
3
3
  import logging
4
4
  logger = logging.Logger("rdr")
@@ -329,9 +329,9 @@ def create_case_attribute_from_iterable_attribute(attr_value: Any, name: str, ob
329
329
 
330
330
  def show_current_and_corner_cases(case: Any, targets: Optional[Dict[str, Any]] = None,
331
331
  current_conclusions: Optional[Dict[str, Any]] = None,
332
- last_evaluated_rule: Optional[Rule] = None) -> None:
332
+ last_evaluated_rule: Optional[Rule] = None) -> str:
333
333
  """
334
- Show the data of the new case and if last evaluated rule exists also show that of the corner case.
334
+ Get the the data to show of the new case and if last evaluated rule exists also show that of the corner case.
335
335
 
336
336
  :param case: The new case.
337
337
  :param targets: The target attribute of the case.
@@ -341,9 +341,10 @@ def show_current_and_corner_cases(case: Any, targets: Optional[Dict[str, Any]] =
341
341
  corner_case = None
342
342
  targets = {f"target_{name}": value for name, value in targets.items()} if targets else {}
343
343
  current_conclusions = {name: value for name, value in current_conclusions.items()} if current_conclusions else {}
344
+ information = ""
344
345
  if last_evaluated_rule:
345
346
  action = "Refinement" if last_evaluated_rule.fired else "Alternative"
346
- print(f"{action} needed for rule: {last_evaluated_rule}\n")
347
+ information += f"{action} needed for rule: {last_evaluated_rule}\n"
347
348
  corner_case = last_evaluated_rule.corner_case
348
349
 
349
350
  corner_row_dict = None
@@ -367,6 +368,6 @@ def show_current_and_corner_cases(case: Any, targets: Optional[Dict[str, Any]] =
367
368
  corner_conclusion = last_evaluated_rule.conclusion(case)
368
369
  corner_row_dict.update({corner_conclusion.__class__.__name__: corner_conclusion})
369
370
  all_table_rows.append(corner_row_dict)
370
- # print(table_rows_as_str(corner_row_dict))
371
- print("\n" + "=" * 50)
372
- print(table_rows_as_str(all_table_rows))
371
+ information += "\n" + "=" * 50 + "\n"
372
+ information += "\n" + table_rows_as_str(all_table_rows) + "\n"
373
+ return information
@@ -225,12 +225,13 @@ class Human(Expert):
225
225
  def ask_for_conditions(self, case_query: CaseQuery,
226
226
  last_evaluated_rule: Optional[Rule] = None) \
227
227
  -> CallableExpression:
228
+ data_to_show = None
228
229
  if (not self.use_loaded_answers or len(self.all_expert_answers) == 0) and self.user_prompt.viewer is None:
229
- show_current_and_corner_cases(case_query.case, {case_query.attribute_name: case_query.target_value},
230
+ data_to_show = show_current_and_corner_cases(case_query.case, {case_query.attribute_name: case_query.target_value},
230
231
  last_evaluated_rule=last_evaluated_rule)
231
- return self._get_conditions(case_query)
232
+ return self._get_conditions(case_query, data_to_show)
232
233
 
233
- def _get_conditions(self, case_query: CaseQuery) \
234
+ def _get_conditions(self, case_query: CaseQuery, data_to_show: Optional[str] = None) \
234
235
  -> CallableExpression:
235
236
  """
236
237
  Ask the expert to provide the differentiating features between two cases or unique features for a case
@@ -251,7 +252,7 @@ class Human(Expert):
251
252
  case_query.scope.update(loaded_scope)
252
253
  condition = CallableExpression(user_input, bool, scope=case_query.scope)
253
254
  else:
254
- user_input, condition = self.user_prompt.prompt_user_for_expression(case_query, PromptFor.Conditions)
255
+ user_input, condition = self.user_prompt.prompt_user_for_expression(case_query, PromptFor.Conditions, prompt_str=data_to_show)
255
256
  if user_input == 'exit':
256
257
  exit()
257
258
  if not self.use_loaded_answers:
@@ -283,9 +284,10 @@ class Human(Expert):
283
284
  except IndexError:
284
285
  self.use_loaded_answers = False
285
286
  if not self.use_loaded_answers:
287
+ data_to_show = None
286
288
  if self.user_prompt.viewer is None:
287
- show_current_and_corner_cases(case_query.case)
288
- expert_input, expression = self.user_prompt.prompt_user_for_expression(case_query, PromptFor.Conclusion)
289
+ data_to_show = show_current_and_corner_cases(case_query.case)
290
+ expert_input, expression = self.user_prompt.prompt_user_for_expression(case_query, PromptFor.Conclusion, prompt_str=data_to_show)
289
291
  if expert_input is None:
290
292
  self.all_expert_answers.append(({}, None))
291
293
  elif expert_input != 'exit':
@@ -20,14 +20,14 @@ from ..datastructures.dataclasses import CaseQuery
20
20
  from ..datastructures.enums import PromptFor
21
21
  from .ipython_custom_shell import IPythonShell
22
22
  from ..utils import make_list
23
- from threading import Lock
23
+ from threading import RLock
24
24
 
25
25
 
26
26
  class UserPrompt:
27
27
  """
28
28
  A class to handle user prompts for the RDR.
29
29
  """
30
- shell_lock: Lock = Lock() # To ensure that only one thread can access the shell at a time
30
+ shell_lock: RLock = RLock() # To ensure that only one thread can access the shell at a time
31
31
 
32
32
  def __init__(self, viewer: Optional[RDRCaseViewer] = None):
33
33
  """
@@ -52,8 +52,8 @@ class UserPrompt:
52
52
  prev_user_input: Optional[str] = None
53
53
  callable_expression: Optional[CallableExpression] = None
54
54
  while True:
55
- user_input, expression_tree = self.prompt_user_about_case(case_query, prompt_for, prompt_str,
56
- code_to_modify=prev_user_input)
55
+ with self.shell_lock:
56
+ user_input, expression_tree = self.prompt_user_about_case(case_query, prompt_for, prompt_str, code_to_modify=prev_user_input)
57
57
  if user_input is None:
58
58
  if prompt_for == PromptFor.Conclusion:
59
59
  self.print_func(f"{Fore.YELLOW}No conclusion provided. Exiting.{Style.RESET_ALL}")
@@ -95,23 +95,26 @@ class UserPrompt:
95
95
  :param code_to_modify: The code to modify. If given will be used as a start for user to modify.
96
96
  :return: The user input, and the executable expression that was parsed from the user input.
97
97
  """
98
- if prompt_str is None:
99
- if prompt_for == PromptFor.Conclusion:
100
- prompt_str = f"Give possible value(s) for:"
101
- else:
102
- prompt_str = f"Give conditions on when can the rule be evaluated for:"
98
+ self.print_func("Entered shell")
99
+ prompt_str = f"{Fore.WHITE}{prompt_str}" if prompt_str is not None else ''
100
+ if prompt_for == PromptFor.Conclusion:
101
+ prompt_str += f"\n{Fore.MAGENTA}Give possible value(s) for:"
102
+ else:
103
+ prompt_str += f"\n{Fore.MAGENTA}Give conditions on when can the rule be evaluated for:"
103
104
  case_query.scope.update({'case': case_query.case})
104
105
  shell = None
105
- with self.shell_lock:
106
- if self.viewer is None:
107
- prompt_str = self.construct_prompt_str_for_shell(case_query, prompt_for, prompt_str)
108
- shell = IPythonShell(header=prompt_str, prompt_for=prompt_for, case_query=case_query,
109
- code_to_modify=code_to_modify)
110
- else:
106
+ if self.viewer is None:
107
+ prompt_str = self.construct_prompt_str_for_shell(case_query, prompt_for, prompt_str)
108
+ shell = IPythonShell(header=prompt_str, prompt_for=prompt_for, case_query=case_query,
109
+ code_to_modify=code_to_modify)
110
+ else:
111
+
112
+ self.viewer.update_for_case_query(case_query, prompt_str,
113
+ prompt_for=prompt_for, code_to_modify=code_to_modify)
114
+ user_input, expression_tree = self.prompt_user_input_and_parse_to_expression(shell=shell)
115
+ self.print_func("Exited shell")
116
+ return user_input, expression_tree
111
117
 
112
- self.viewer.update_for_case_query(case_query, prompt_str,
113
- prompt_for=prompt_for, code_to_modify=code_to_modify)
114
- return self.prompt_user_input_and_parse_to_expression(shell=shell)
115
118
 
116
119
 
117
120
  def construct_prompt_str_for_shell(self, case_query: CaseQuery, prompt_for: PromptFor,
@@ -129,9 +132,9 @@ class UserPrompt:
129
132
  prompt_str += (f"\ne.g. `{Fore.GREEN}return {Fore.BLUE}len{Fore.RESET}(case.attribute) > {Fore.BLUE}0` "
130
133
  f"{Fore.MAGENTA}\nOR `{Fore.GREEN}return {Fore.YELLOW}True`{Fore.MAGENTA} (If you want the"
131
134
  f" rule to be always evaluated) \n"
132
- f"You can also do {Fore.YELLOW}%edit{Fore.MAGENTA} for more complex conditions.")
135
+ f"You can also do {Fore.YELLOW}%edit{Fore.MAGENTA} for more complex conditions.\n")
133
136
 
134
- prompt_str = f"{Fore.MAGENTA}{prompt_str}{Fore.YELLOW}\n(Write %help for guide){Fore.RESET}"
137
+ prompt_str = f"{Fore.MAGENTA}{prompt_str}{Fore.YELLOW}\n(Write %help for guide){Fore.RESET}\n"
135
138
  return prompt_str
136
139
 
137
140
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ripple_down_rules
3
- Version: 0.5.89
3
+ Version: 0.5.90
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
@@ -1,3 +1,4 @@
1
+ .gitignore
1
2
  LICENSE
2
3
  README.md
3
4
  pyproject.toml