ripple-down-rules 0.5.88__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.88 → ripple_down_rules-0.5.90}/PKG-INFO +1 -1
  3. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/__init__.py +1 -1
  4. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/case.py +7 -6
  5. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/experts.py +8 -6
  6. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/prompt.py +30 -27
  7. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/PKG-INFO +1 -1
  8. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/SOURCES.txt +1 -0
  9. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/.github/workflows/build_and_deploy_doc.yml +0 -0
  10. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/.github/workflows/ci.yml +0 -0
  11. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/.github/workflows/publish-to-test-pypi.yml +0 -0
  12. {ripple_down_rules-0.5.88 → 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.88 → 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.88 → ripple_down_rules-0.5.90}/LICENSE +0 -0
  15. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/README.md +0 -0
  16. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/doc/_config.yml +0 -0
  17. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/doc/_toc.yml +0 -0
  18. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/doc/bibliography.md +0 -0
  19. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/doc/intro.md +0 -0
  20. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/doc/references.bib +0 -0
  21. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/doc/requirements.txt +0 -0
  22. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/__init__.py +0 -0
  23. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/animal_species.py +0 -0
  24. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/__init__.py +0 -0
  25. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/rdr_metadata/part_containment_rdr.json +0 -0
  26. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/robot_contained_objects_mcrdr.py +0 -0
  27. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/robot_contained_objects_mcrdr_defs.py +0 -0
  28. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/part_containment_rdr/robot_rdr.py +0 -0
  29. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/examples/relational_example.py +0 -0
  30. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/images/scrdr.dot +0 -0
  31. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/images/scrdr.png +0 -0
  32. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/images/thinking_pr2.jpg +0 -0
  33. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/pyproject.toml +0 -0
  34. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/pytest.ini +0 -0
  35. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/requirements-dev-ci.txt +0 -0
  36. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/requirements-dev.txt +0 -0
  37. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/requirements-gui.txt +0 -0
  38. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/requirements-viz.txt +0 -0
  39. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/requirements.txt +0 -0
  40. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_mcrdr_extra.dot +0 -0
  41. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_mcrdr_extra.png +0 -0
  42. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_only.dot +0 -0
  43. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_only.png +0 -0
  44. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_plus_rule.dot +0 -0
  45. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_mcrdr_stop_plus_rule.png +0 -0
  46. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_scrdr.dot +0 -0
  47. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_scrdr.png +0 -0
  48. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_scrdr_2.dot +0 -0
  49. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_scrdr_2.png +0 -0
  50. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_scrdr_3.dot +0 -0
  51. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/complete_scrdr_3.png +0 -0
  52. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/grdr_Habitat.dot +0 -0
  53. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/grdr_Habitat.png +0 -0
  54. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/grdr_Species.dot +0 -0
  55. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/grdr_Species.png +0 -0
  56. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/mcrdr_extra.dot +0 -0
  57. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/mcrdr_extra.png +0 -0
  58. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/mcrdr_extra_classify.dot +0 -0
  59. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/mcrdr_extra_classify.png +0 -0
  60. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/mcrdr_stop_plus_rule_combined.dot +0 -0
  61. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/mcrdr_stop_plus_rule_combined.png +0 -0
  62. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/partial_mcrdr_extra.dot +0 -0
  63. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/partial_mcrdr_extra.png +0 -0
  64. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/relational_scrdr_classify.dot +0 -0
  65. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/results/relational_scrdr_classify.png +0 -0
  66. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/setup.cfg +0 -0
  67. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/__init__.py +0 -0
  68. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/callable_expression.py +0 -0
  69. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/dataclasses.py +0 -0
  70. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/datastructures/enums.py +0 -0
  71. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/helpers.py +0 -0
  72. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/rdr.py +0 -0
  73. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/rdr_decorators.py +0 -0
  74. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/rules.py +0 -0
  75. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/start-code-server.sh +0 -0
  76. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/__init__.py +0 -0
  77. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/gui.py +0 -0
  78. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/ipython_custom_shell.py +0 -0
  79. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/object_diagram.py +0 -0
  80. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/user_interface/template_file_creator.py +0 -0
  81. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules/utils.py +0 -0
  82. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/dependency_links.txt +0 -0
  83. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/requires.txt +0 -0
  84. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/src/ripple_down_rules.egg-info/top_level.txt +0 -0
  85. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/__init__.py +0 -0
  86. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/conf/__init__.py +0 -0
  87. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/conf/world/__init__.py +0 -0
  88. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/conf/world/base_config.py +0 -0
  89. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/conf/world/handles_and_containers.py +0 -0
  90. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/conftest.py +0 -0
  91. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/datasets.py +0 -0
  92. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/factories/__init__.py +0 -0
  93. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/factories/world/__init__.py +0 -0
  94. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/factories/world/handles_and_containers.py +0 -0
  95. {ripple_down_rules-0.5.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/drawer_cabinet_expert_answers_fit.json +0 -0
  97. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_classify.json +0 -0
  98. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_fit.json +0 -0
  99. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/grdr_expert_answers_fit_extra.json +0 -0
  100. {ripple_down_rules-0.5.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_expert_answers_classify.json +0 -0
  102. {ripple_down_rules-0.5.88 → 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.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_extra_expert_answers_classify.json +0 -0
  105. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_extra_expert_answers_fit.json +0 -0
  106. {ripple_down_rules-0.5.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/mcrdr_stop_only_answers_fit.json +0 -0
  108. {ripple_down_rules-0.5.88 → 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.88 → 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.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/mutagenic_expert_answers.json +0 -0
  112. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/relational_scrdr_expert_answers_classify.json +0 -0
  113. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_expert_answers_classify.json +0 -0
  114. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_expert_answers_fit.json +0 -0
  115. {ripple_down_rules-0.5.88 → 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.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_expert_answers/scrdr_world_expert_answers_fit.json +0 -0
  118. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_generated_rdrs/__init__.py +0 -0
  119. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_helpers/__init__.py +0 -0
  120. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_helpers/helpers.py +0 -0
  121. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_helpers/object_diagram_case_query.png +0 -0
  122. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_helpers/object_diagram_person.png +0 -0
  123. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_json_serialization.py +0 -0
  124. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_object_diagram.py +0 -0
  125. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_on_mutagenic.py +0 -0
  126. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr.py +0 -0
  127. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr_alchemy.py +0 -0
  128. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr_decorators.py +0 -0
  129. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr_helpers_rdrs.py +0 -0
  130. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr_world/__init__.py +0 -0
  131. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr_world/conftest.py +0 -0
  132. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_rdr_world/test_rdr_world.py +0 -0
  133. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_relational_rdr.py +0 -0
  134. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_relational_rdr_alchemy.py +0 -0
  135. {ripple_down_rules-0.5.88 → 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.88 → 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.88 → 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.88 → 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.88 → 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.88 → 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.88 → 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.88 → 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.88 → 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.88 → 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.88 → ripple_down_rules-0.5.90}/test/test_sql_model.py +0 -0
  146. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_template_file_creator.py +0 -0
  147. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_user_interface/__init__.py +0 -0
  148. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_user_interface/test_ipython.py +0 -0
  149. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_user_interface/test_ipython_copilot.py +0 -0
  150. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_user_interface/test_prompt.py +0 -0
  151. {ripple_down_rules-0.5.88 → ripple_down_rules-0.5.90}/test/test_user_interface/test_qt_gui_inline.py +0 -0
  152. {ripple_down_rules-0.5.88 → 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.88
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.88"
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,22 +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
106
  if self.viewer is None:
106
107
  prompt_str = self.construct_prompt_str_for_shell(case_query, prompt_for, prompt_str)
107
108
  shell = IPythonShell(header=prompt_str, prompt_for=prompt_for, case_query=case_query,
108
- code_to_modify=code_to_modify)
109
+ code_to_modify=code_to_modify)
109
110
  else:
110
111
 
111
112
  self.viewer.update_for_case_query(case_query, prompt_str,
112
- prompt_for=prompt_for, code_to_modify=code_to_modify)
113
- return self.prompt_user_input_and_parse_to_expression(shell=shell)
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
117
+
114
118
 
115
119
 
116
120
  def construct_prompt_str_for_shell(self, case_query: CaseQuery, prompt_for: PromptFor,
@@ -128,9 +132,9 @@ class UserPrompt:
128
132
  prompt_str += (f"\ne.g. `{Fore.GREEN}return {Fore.BLUE}len{Fore.RESET}(case.attribute) > {Fore.BLUE}0` "
129
133
  f"{Fore.MAGENTA}\nOR `{Fore.GREEN}return {Fore.YELLOW}True`{Fore.MAGENTA} (If you want the"
130
134
  f" rule to be always evaluated) \n"
131
- 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")
132
136
 
133
- 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"
134
138
  return prompt_str
135
139
 
136
140
 
@@ -167,16 +171,15 @@ class UserPrompt:
167
171
  :param shell: The Ipython shell to use for prompting the user.
168
172
  :return: The user input.
169
173
  """
170
- with self.shell_lock:
171
- if self.viewer is None:
172
- shell = IPythonShell() if shell is None else shell
173
- shell.run()
174
- user_input = shell.user_input
175
- else:
176
- app = QApplication.instance()
177
- if app is None:
178
- raise RuntimeError("QApplication instance is None. Please run the application first.")
179
- self.viewer.show()
180
- app.exec()
181
- user_input = self.viewer.user_input
182
- return user_input
174
+ if self.viewer is None:
175
+ shell = IPythonShell() if shell is None else shell
176
+ shell.run()
177
+ user_input = shell.user_input
178
+ else:
179
+ app = QApplication.instance()
180
+ if app is None:
181
+ raise RuntimeError("QApplication instance is None. Please run the application first.")
182
+ self.viewer.show()
183
+ app.exec()
184
+ user_input = self.viewer.user_input
185
+ return user_input
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ripple_down_rules
3
- Version: 0.5.88
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