gr-libs 0.1.8__tar.gz → 0.2.2__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 (96) hide show
  1. {gr_libs-0.1.8 → gr_libs-0.2.2}/PKG-INFO +84 -29
  2. {gr_libs-0.1.8 → gr_libs-0.2.2}/README.md +83 -28
  3. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/__init__.py +3 -1
  4. gr_libs-0.2.2/gr_libs/_evaluation/__init__.py +1 -0
  5. gr_libs-0.1.8/evaluation/analyze_results_cross_alg_cross_domain.py → gr_libs-0.2.2/gr_libs/_evaluation/_analyze_results_cross_alg_cross_domain.py +81 -88
  6. gr_libs-0.1.8/evaluation/generate_experiments_results.py → gr_libs-0.2.2/gr_libs/_evaluation/_generate_experiments_results.py +6 -6
  7. gr_libs-0.1.8/evaluation/generate_task_specific_statistics_plots.py → gr_libs-0.2.2/gr_libs/_evaluation/_generate_task_specific_statistics_plots.py +11 -14
  8. gr_libs-0.1.8/evaluation/get_plans_images.py → gr_libs-0.2.2/gr_libs/_evaluation/_get_plans_images.py +3 -4
  9. gr_libs-0.1.8/evaluation/increasing_and_decreasing_.py → gr_libs-0.2.2/gr_libs/_evaluation/_increasing_and_decreasing_.py +3 -1
  10. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/_version.py +2 -2
  11. gr_libs-0.2.2/gr_libs/all_experiments.py +294 -0
  12. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/environment/__init__.py +14 -1
  13. {gr_libs-0.1.8/gr_libs/environment/utils → gr_libs-0.2.2/gr_libs/environment/_utils}/utils.py +1 -1
  14. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/environment/environment.py +257 -22
  15. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/metrics/__init__.py +2 -0
  16. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/metrics/metrics.py +166 -31
  17. gr_libs-0.2.2/gr_libs/ml/__init__.py +3 -0
  18. gr_libs-0.2.2/gr_libs/ml/base/__init__.py +3 -0
  19. gr_libs-0.2.2/gr_libs/ml/base/rl_agent.py +122 -0
  20. gr_libs-0.2.2/gr_libs/ml/neural/__init__.py +1 -0
  21. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/neural/deep_rl_learner.py +227 -67
  22. gr_libs-0.2.2/gr_libs/ml/neural/utils/__init__.py +1 -0
  23. {gr_libs-0.1.8/gr_libs/ml/planner/mcts/utils → gr_libs-0.2.2/gr_libs/ml/planner/mcts/_utils}/tree.py +1 -1
  24. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/planner/mcts/mcts_model.py +71 -34
  25. gr_libs-0.1.8/gr_libs/ml/sequential/lstm_model.py → gr_libs-0.2.2/gr_libs/ml/sequential/_lstm_model.py +11 -14
  26. gr_libs-0.2.2/gr_libs/ml/tabular/__init__.py +1 -0
  27. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/tabular/tabular_q_learner.py +27 -9
  28. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/tabular/tabular_rl_agent.py +22 -9
  29. gr_libs-0.2.2/gr_libs/ml/utils/__init__.py +5 -0
  30. gr_libs-0.2.2/gr_libs/ml/utils/format.py +31 -0
  31. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/utils/math.py +3 -2
  32. gr_libs-0.2.2/gr_libs/ml/utils/storage.py +141 -0
  33. gr_libs-0.2.2/gr_libs/odgr_executor.py +268 -0
  34. {gr_libs-0.1.8/gr_libs/recognizer/utils → gr_libs-0.2.2/gr_libs/recognizer/_utils}/format.py +2 -2
  35. gr_libs-0.2.2/gr_libs/recognizer/gr_as_rl/__init__.py +0 -0
  36. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/recognizer/gr_as_rl/gr_as_rl_recognizer.py +116 -36
  37. gr_libs-0.2.2/gr_libs/recognizer/graml/__init__.py +0 -0
  38. gr_libs-0.1.8/gr_libs/recognizer/graml/gr_dataset.py → gr_libs-0.2.2/gr_libs/recognizer/graml/_gr_dataset.py +11 -11
  39. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/recognizer/graml/graml_recognizer.py +172 -29
  40. gr_libs-0.2.2/gr_libs/recognizer/recognizer.py +105 -0
  41. gr_libs-0.2.2/gr_libs/tutorials/draco_panda_tutorial.py +58 -0
  42. gr_libs-0.2.2/gr_libs/tutorials/draco_parking_tutorial.py +56 -0
  43. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/gcdraco_panda_tutorial.py +5 -9
  44. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/gcdraco_parking_tutorial.py +3 -7
  45. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/graml_minigrid_tutorial.py +2 -2
  46. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/graml_panda_tutorial.py +5 -10
  47. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/graml_parking_tutorial.py +5 -9
  48. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/graml_point_maze_tutorial.py +2 -1
  49. {gr_libs-0.1.8 → gr_libs-0.2.2/gr_libs}/tutorials/graql_minigrid_tutorial.py +2 -2
  50. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs.egg-info/PKG-INFO +84 -29
  51. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs.egg-info/SOURCES.txt +28 -27
  52. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs.egg-info/top_level.txt +1 -2
  53. gr_libs-0.2.2/tests/test_draco.py +14 -0
  54. gr_libs-0.2.2/tests/test_gcdraco.py +10 -0
  55. gr_libs-0.2.2/tests/test_graml.py +20 -0
  56. gr_libs-0.2.2/tests/test_graql.py +5 -0
  57. gr_libs-0.1.8/evaluation/create_minigrid_map_image.py +0 -38
  58. gr_libs-0.1.8/evaluation/file_system.py +0 -53
  59. gr_libs-0.1.8/evaluation/generate_experiments_results_new_ver1.py +0 -238
  60. gr_libs-0.1.8/evaluation/generate_experiments_results_new_ver2.py +0 -331
  61. gr_libs-0.1.8/gr_libs/ml/__init__.py +0 -8
  62. gr_libs-0.1.8/gr_libs/ml/base/__init__.py +0 -1
  63. gr_libs-0.1.8/gr_libs/ml/base/rl_agent.py +0 -57
  64. gr_libs-0.1.8/gr_libs/ml/neural/__init__.py +0 -3
  65. gr_libs-0.1.8/gr_libs/ml/neural/utils/__init__.py +0 -2
  66. gr_libs-0.1.8/gr_libs/ml/neural/utils/penv.py +0 -60
  67. gr_libs-0.1.8/gr_libs/ml/sequential/__init__.py +0 -1
  68. gr_libs-0.1.8/gr_libs/ml/tabular/__init__.py +0 -3
  69. gr_libs-0.1.8/gr_libs/ml/utils/__init__.py +0 -12
  70. gr_libs-0.1.8/gr_libs/ml/utils/format.py +0 -108
  71. gr_libs-0.1.8/gr_libs/ml/utils/storage.py +0 -194
  72. gr_libs-0.1.8/gr_libs/recognizer/recognizer.py +0 -56
  73. gr_libs-0.1.8/gr_libs/recognizer/utils/__init__.py +0 -1
  74. gr_libs-0.1.8/tests/test_gcdraco.py +0 -10
  75. gr_libs-0.1.8/tests/test_graml.py +0 -20
  76. gr_libs-0.1.8/tests/test_graql.py +0 -5
  77. {gr_libs-0.1.8/gr_libs/environment/utils → gr_libs-0.2.2/gr_libs/environment/_utils}/__init__.py +0 -0
  78. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/agent.py +0 -0
  79. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/consts.py +0 -0
  80. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/neural/utils/dictlist.py +0 -0
  81. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/planner/__init__.py +0 -0
  82. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/planner/mcts/__init__.py +0 -0
  83. {gr_libs-0.1.8/gr_libs/ml/planner/mcts/utils → gr_libs-0.2.2/gr_libs/ml/planner/mcts/_utils}/__init__.py +0 -0
  84. {gr_libs-0.1.8/gr_libs/ml/planner/mcts/utils → gr_libs-0.2.2/gr_libs/ml/planner/mcts/_utils}/node.py +0 -0
  85. {gr_libs-0.1.8/gr_libs/problems → gr_libs-0.2.2/gr_libs/ml/sequential}/__init__.py +0 -0
  86. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/tabular/state.py +0 -0
  87. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/utils/env.py +0 -0
  88. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/ml/utils/other.py +2 -2
  89. {gr_libs-0.1.8/gr_libs/recognizer → gr_libs-0.2.2/gr_libs/problems}/__init__.py +0 -0
  90. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs/problems/consts.py +2 -2
  91. {gr_libs-0.1.8/gr_libs/recognizer/gr_as_rl → gr_libs-0.2.2/gr_libs/recognizer}/__init__.py +0 -0
  92. {gr_libs-0.1.8/gr_libs/recognizer/graml → gr_libs-0.2.2/gr_libs/recognizer/_utils}/__init__.py +0 -0
  93. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs.egg-info/dependency_links.txt +0 -0
  94. {gr_libs-0.1.8 → gr_libs-0.2.2}/gr_libs.egg-info/requires.txt +0 -0
  95. {gr_libs-0.1.8 → gr_libs-0.2.2}/pyproject.toml +0 -0
  96. {gr_libs-0.1.8 → gr_libs-0.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gr_libs
3
- Version: 0.1.8
3
+ Version: 0.2.2
4
4
  Summary: Package with goal recognition frameworks baselines
5
5
  Author: Ben Nageris
6
6
  Author-email: Matan Shamir <matan.shamir@live.biu.ac.il>, Osher Elhadad <osher.elhadad@live.biu.ac.il>
@@ -106,6 +106,25 @@ If you prefer using Conda, follow these steps:
106
106
 
107
107
  For any issues or troubleshooting, please refer to the repository's issue tracker.
108
108
 
109
+ ## Supported Algorithms
110
+
111
+ Successors of algorithms that don't differ in their specifics are added in parentheses after the algorithm name. For example, since GC-DRACO and DRACO share the same column values, they're written on one line as DRACO (GC).
112
+
113
+ | **Algorithm** | **Supervised** | **Reinforcement Learning** | **Discrete States** | **Continuous States** | **Discrete Actions** | **Continuous Actions** | **Model-Based** | **Model-Free** | **Action-Only** |
114
+ |--------------|--------------|------------------------|------------------|------------------|--------------|--------------|--------------|--------------|--------------|
115
+ | GRAQL | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
116
+ | DRACO (GC) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
117
+ | GRAML (GC, BG) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
118
+
119
+ ## Supported Domains
120
+
121
+ | **Domain** | **Action Space** | **State Space** |
122
+ |------------|----------------|----------------|
123
+ | Minigrid | Discrete | Discrete |
124
+ | PointMaze | Continuous | Continuous |
125
+ | Parking | Continuous | Continuous |
126
+ | Panda | Continuous | Continuous |
127
+
109
128
  ## Usage Guide
110
129
 
111
130
  After installing GRLib, you will have access to custom Gym environments, allowing you to set up and execute an Online Dynamic Goal Recognition (ODGR) scenario with the algorithm of your choice.
@@ -116,9 +135,10 @@ Tutorials demonstrating basic ODGR scenarios is available in the sub-package `tu
116
135
  gr_libs also includes a library of trained agents for the various supported environments within the package.
117
136
  To get the dataset of trained agents, you can run:
118
137
  ```sh
138
+ pip install gdown
119
139
  python download_dataset.py
120
140
  ```
121
-
141
+ Alternatively, you can visit the google-drive links where download_dataset.py points to and manually download the zipped folders, and unzip them into the project directory.
122
142
  An alternative is to use our docker image, which includes the dataset in it.
123
143
  You can:
124
144
  1. pull the image:
@@ -191,42 +211,77 @@ docker run -it ghcr.io/MatanShamir1/gr_test_base:latest bash
191
211
 
192
212
  The `consts.py` file contains predefined ODGR problem configurations. You can use existing configurations or define new ones.
193
213
 
194
- To execute a single task using the configuration file:
214
+ To execute an ODGR problem using the configuration file, you specify a recognizer, a domain, a gym environment within that domain and the task:
195
215
  ```sh
196
- python odgr_executor.py --recognizer MCTSBasedGraml --domain minigrid --task L1 --minigrid_env MinigridSimple
216
+ python odgr_executor.py --recognizer ExpertBasedGraml --domain minigrid --task L1 --env_name MiniGrid-SimpleCrossingS13N4
197
217
  ```
198
218
 
199
- ## Supported Algorithms
219
+ If you also add the flag:
220
+ ```sh
221
+ --collect_stats
222
+ ```
223
+ to the cmd, 3 kinds of outputs will be generated from the ODGR problem's execution:
224
+ a. Into:
225
+ ```sh
226
+ outputs\\minigrid\MiniGrid-SimpleCrossingS13N4\MiniGrid-SimpleCrossingS13N4\L1\experiment_results
227
+ ```
228
+ a .pkl and a .txt summary in a dictionary format will be generated, including the summary of all ODGR executions, including runtime and overall accuracies for all lengths and types of input sequences.
200
229
 
201
- Successors of algorithms that don't differ in their specifics are added in parentheses after the algorithm name. For example, since GC-DRACO and DRACO share the same column values, they're written on one line as DRACO (GC).
230
+ b. Into:
231
+ ```sh
232
+ outputs\ExpertBasedGraml\minigrid\MiniGrid-SimpleCrossingS13N4\policy_sequences\MiniGrid-SimpleCrossingS13N4-DynamicGoal-1x11-v0_inference_seq/plan_image.png
233
+ ```
234
+ a visulzation of the sequence the agent generated will be dumped, either in a png or an mp4 format, depending on the domain, for debugability.
202
235
 
203
- | **Algorithm** | **Supervised** | **Reinforcement Learning** | **Discrete States** | **Continuous States** | **Discrete Actions** | **Continuous Actions** | **Model-Based** | **Model-Free** | **Action-Only** |
204
- |--------------|--------------|------------------------|------------------|------------------|--------------|--------------|--------------|--------------|--------------|
205
- | GRAQL | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
206
- | DRACO (GC) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
207
- | GRAML (GC, BG) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
236
+ c. Into:
237
+ either:
238
+ ```sh
239
+ outputs\ExpertBasedGraml\minigrid\MiniGrid-SimpleCrossingS13N4\goal_embeddings
240
+ ```
241
+ In Graml algorithms, or:
242
+ ```sh
243
+ outputs\Graql\minigrid\MiniGrid-SimpleCrossingS13N4\confidence
244
+ ```
245
+ In GRAsRL algorithms,
246
+ pickled results from which confidence of the results can be obtained, for offline analysis.
208
247
 
209
- ## Supported Domains
248
+ For GRAsRL outputs, for every possible goal, the likelihood of it being the true goal from the input sequence, based on the policy distance metric.
210
249
 
211
- | **Domain** | **Action Space** | **State Space** |
212
- |------------|----------------|----------------|
213
- | Minigrid | Discrete | Discrete |
214
- | PointMaze | Continuous | Continuous |
215
- | Parking | Continuous | Continuous |
216
- | Panda | Continuous | Continuous |
250
+ For GRAML outputs, the embeddings of the sequences are pickled for every goal-directed sequence. Offline, since, since in the embdding space of GRAML's metric model- sequences towards the same sequences are close and vice versa, one could reproduce the most likely goal by measuring the elementwise vector distance of the embeddings, and retrieve a confidence of it.
217
251
 
218
252
  ## Running Experiments
219
253
 
220
- The repository provides benchmark domains and scripts for analyzing experimental results. The `scripts` directory contains tools for processing and visualizing results.
254
+ In light of the previous section, the user should already know how to scale the experiments using odgr_executor, and they should also understand how to use the 3 types of outputs for offline analysis of the algorithms.
255
+ gr_libs also provides another scaling method to run odgr_executor on multiple domains and environments, for many ODGR problems, as well as python scripts for analysis of these results, to create plots and statistics over the executions.
256
+
257
+ ### Scaling odgr_executor runs
258
+ A part of the contribution of this package is standardizing the evaluations of MDP-based GR frameworks.
259
+ consts.py provides a set of ODGR problems on which the framework can be evaluated.
260
+ The 'evaluations' sub-package provides scripts to analyze the results of the all_experiments.py execution, done over the ODGR the problems defined at consts.py.
221
261
 
222
- 1. **`analyze_results_cross_alg_cross_domain.py`**
223
- - Runs without arguments.
224
- - Reads data from `get_experiment_results_path` (e.g., `dataset/graml/minigrid/continuing/.../experiment_results.pkl`).
225
- - Generates plots comparing algorithm performance across domains.
262
+ In order to parallelize executions of odgr_executor.py, you can edit all_experiments.py with your combination of domains, environments and tasks.
263
+ This script use multiprocessing to simultaniously execute many odgr_executor.py python executions as child processes.
226
264
 
227
- 2. **`generate_task_specific_statistics_plots.py`**
228
- - Produces task-specific accuracy and confidence plots.
229
- - Generates a confusion matrix displaying confidence levels.
230
- - Example output paths:
231
- - `figures/point_maze/obstacles/graql_point_maze_obstacles_fragmented_stats.png`
232
- - `figures/point_maze/obstacles/graml_point_maze_obstacles_conf_mat.png`
265
+ It logs failures and successful executions for debugability.
266
+
267
+ After execution, another level of abstraction for the results is created. For example, when running for Graql in the minigrid domain:
268
+ ```sh
269
+ outputs\summaries\detailed_summary_minigrid_Graql.txt
270
+ ```
271
+ Will show the accuracies for every ODGR problem, for every percentage and type of input in a table-like .txt format, whike:
272
+ ```sh
273
+ outputs\summaries\compiled_summary_minigrid_Graql.txt
274
+ ```
275
+ Will show the same results in a more compact summary.
276
+
277
+ ### Using analysis scripts
278
+ The repository provides benchmark domains and scripts for analyzing experimental results. The `evaluation` directory contains tools for processing and visualizing the results from odgr_executor.py and all_experiments.py.
279
+ Please follow the README.md file in the 'evaluation' directory for more details.
280
+
281
+ ## For Developers
282
+ Developers will need to work slightly different: instead of installing the packages, they need to clone the repos and either install them as editables or add their paths to PYTHONPATH so they will function as packages effectively.
283
+ Additional packages to install as a developer:
284
+ ```sh
285
+ pip install pre-commit
286
+ pre-commit install
287
+ ```
@@ -77,6 +77,25 @@ If you prefer using Conda, follow these steps:
77
77
 
78
78
  For any issues or troubleshooting, please refer to the repository's issue tracker.
79
79
 
80
+ ## Supported Algorithms
81
+
82
+ Successors of algorithms that don't differ in their specifics are added in parentheses after the algorithm name. For example, since GC-DRACO and DRACO share the same column values, they're written on one line as DRACO (GC).
83
+
84
+ | **Algorithm** | **Supervised** | **Reinforcement Learning** | **Discrete States** | **Continuous States** | **Discrete Actions** | **Continuous Actions** | **Model-Based** | **Model-Free** | **Action-Only** |
85
+ |--------------|--------------|------------------------|------------------|------------------|--------------|--------------|--------------|--------------|--------------|
86
+ | GRAQL | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
87
+ | DRACO (GC) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
88
+ | GRAML (GC, BG) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
89
+
90
+ ## Supported Domains
91
+
92
+ | **Domain** | **Action Space** | **State Space** |
93
+ |------------|----------------|----------------|
94
+ | Minigrid | Discrete | Discrete |
95
+ | PointMaze | Continuous | Continuous |
96
+ | Parking | Continuous | Continuous |
97
+ | Panda | Continuous | Continuous |
98
+
80
99
  ## Usage Guide
81
100
 
82
101
  After installing GRLib, you will have access to custom Gym environments, allowing you to set up and execute an Online Dynamic Goal Recognition (ODGR) scenario with the algorithm of your choice.
@@ -87,9 +106,10 @@ Tutorials demonstrating basic ODGR scenarios is available in the sub-package `tu
87
106
  gr_libs also includes a library of trained agents for the various supported environments within the package.
88
107
  To get the dataset of trained agents, you can run:
89
108
  ```sh
109
+ pip install gdown
90
110
  python download_dataset.py
91
111
  ```
92
-
112
+ Alternatively, you can visit the google-drive links where download_dataset.py points to and manually download the zipped folders, and unzip them into the project directory.
93
113
  An alternative is to use our docker image, which includes the dataset in it.
94
114
  You can:
95
115
  1. pull the image:
@@ -162,42 +182,77 @@ docker run -it ghcr.io/MatanShamir1/gr_test_base:latest bash
162
182
 
163
183
  The `consts.py` file contains predefined ODGR problem configurations. You can use existing configurations or define new ones.
164
184
 
165
- To execute a single task using the configuration file:
185
+ To execute an ODGR problem using the configuration file, you specify a recognizer, a domain, a gym environment within that domain and the task:
166
186
  ```sh
167
- python odgr_executor.py --recognizer MCTSBasedGraml --domain minigrid --task L1 --minigrid_env MinigridSimple
187
+ python odgr_executor.py --recognizer ExpertBasedGraml --domain minigrid --task L1 --env_name MiniGrid-SimpleCrossingS13N4
168
188
  ```
169
189
 
170
- ## Supported Algorithms
190
+ If you also add the flag:
191
+ ```sh
192
+ --collect_stats
193
+ ```
194
+ to the cmd, 3 kinds of outputs will be generated from the ODGR problem's execution:
195
+ a. Into:
196
+ ```sh
197
+ outputs\\minigrid\MiniGrid-SimpleCrossingS13N4\MiniGrid-SimpleCrossingS13N4\L1\experiment_results
198
+ ```
199
+ a .pkl and a .txt summary in a dictionary format will be generated, including the summary of all ODGR executions, including runtime and overall accuracies for all lengths and types of input sequences.
171
200
 
172
- Successors of algorithms that don't differ in their specifics are added in parentheses after the algorithm name. For example, since GC-DRACO and DRACO share the same column values, they're written on one line as DRACO (GC).
201
+ b. Into:
202
+ ```sh
203
+ outputs\ExpertBasedGraml\minigrid\MiniGrid-SimpleCrossingS13N4\policy_sequences\MiniGrid-SimpleCrossingS13N4-DynamicGoal-1x11-v0_inference_seq/plan_image.png
204
+ ```
205
+ a visulzation of the sequence the agent generated will be dumped, either in a png or an mp4 format, depending on the domain, for debugability.
173
206
 
174
- | **Algorithm** | **Supervised** | **Reinforcement Learning** | **Discrete States** | **Continuous States** | **Discrete Actions** | **Continuous Actions** | **Model-Based** | **Model-Free** | **Action-Only** |
175
- |--------------|--------------|------------------------|------------------|------------------|--------------|--------------|--------------|--------------|--------------|
176
- | GRAQL | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
177
- | DRACO (GC) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
178
- | GRAML (GC, BG) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
207
+ c. Into:
208
+ either:
209
+ ```sh
210
+ outputs\ExpertBasedGraml\minigrid\MiniGrid-SimpleCrossingS13N4\goal_embeddings
211
+ ```
212
+ In Graml algorithms, or:
213
+ ```sh
214
+ outputs\Graql\minigrid\MiniGrid-SimpleCrossingS13N4\confidence
215
+ ```
216
+ In GRAsRL algorithms,
217
+ pickled results from which confidence of the results can be obtained, for offline analysis.
179
218
 
180
- ## Supported Domains
219
+ For GRAsRL outputs, for every possible goal, the likelihood of it being the true goal from the input sequence, based on the policy distance metric.
181
220
 
182
- | **Domain** | **Action Space** | **State Space** |
183
- |------------|----------------|----------------|
184
- | Minigrid | Discrete | Discrete |
185
- | PointMaze | Continuous | Continuous |
186
- | Parking | Continuous | Continuous |
187
- | Panda | Continuous | Continuous |
221
+ For GRAML outputs, the embeddings of the sequences are pickled for every goal-directed sequence. Offline, since, since in the embdding space of GRAML's metric model- sequences towards the same sequences are close and vice versa, one could reproduce the most likely goal by measuring the elementwise vector distance of the embeddings, and retrieve a confidence of it.
188
222
 
189
223
  ## Running Experiments
190
224
 
191
- The repository provides benchmark domains and scripts for analyzing experimental results. The `scripts` directory contains tools for processing and visualizing results.
225
+ In light of the previous section, the user should already know how to scale the experiments using odgr_executor, and they should also understand how to use the 3 types of outputs for offline analysis of the algorithms.
226
+ gr_libs also provides another scaling method to run odgr_executor on multiple domains and environments, for many ODGR problems, as well as python scripts for analysis of these results, to create plots and statistics over the executions.
227
+
228
+ ### Scaling odgr_executor runs
229
+ A part of the contribution of this package is standardizing the evaluations of MDP-based GR frameworks.
230
+ consts.py provides a set of ODGR problems on which the framework can be evaluated.
231
+ The 'evaluations' sub-package provides scripts to analyze the results of the all_experiments.py execution, done over the ODGR the problems defined at consts.py.
192
232
 
193
- 1. **`analyze_results_cross_alg_cross_domain.py`**
194
- - Runs without arguments.
195
- - Reads data from `get_experiment_results_path` (e.g., `dataset/graml/minigrid/continuing/.../experiment_results.pkl`).
196
- - Generates plots comparing algorithm performance across domains.
233
+ In order to parallelize executions of odgr_executor.py, you can edit all_experiments.py with your combination of domains, environments and tasks.
234
+ This script use multiprocessing to simultaniously execute many odgr_executor.py python executions as child processes.
197
235
 
198
- 2. **`generate_task_specific_statistics_plots.py`**
199
- - Produces task-specific accuracy and confidence plots.
200
- - Generates a confusion matrix displaying confidence levels.
201
- - Example output paths:
202
- - `figures/point_maze/obstacles/graql_point_maze_obstacles_fragmented_stats.png`
203
- - `figures/point_maze/obstacles/graml_point_maze_obstacles_conf_mat.png`
236
+ It logs failures and successful executions for debugability.
237
+
238
+ After execution, another level of abstraction for the results is created. For example, when running for Graql in the minigrid domain:
239
+ ```sh
240
+ outputs\summaries\detailed_summary_minigrid_Graql.txt
241
+ ```
242
+ Will show the accuracies for every ODGR problem, for every percentage and type of input in a table-like .txt format, whike:
243
+ ```sh
244
+ outputs\summaries\compiled_summary_minigrid_Graql.txt
245
+ ```
246
+ Will show the same results in a more compact summary.
247
+
248
+ ### Using analysis scripts
249
+ The repository provides benchmark domains and scripts for analyzing experimental results. The `evaluation` directory contains tools for processing and visualizing the results from odgr_executor.py and all_experiments.py.
250
+ Please follow the README.md file in the 'evaluation' directory for more details.
251
+
252
+ ## For Developers
253
+ Developers will need to work slightly different: instead of installing the packages, they need to clone the repos and either install them as editables or add their paths to PYTHONPATH so they will function as packages effectively.
254
+ Additional packages to install as a developer:
255
+ ```sh
256
+ pip install pre-commit
257
+ pre-commit install
258
+ ```
@@ -1,5 +1,7 @@
1
+ """gr_libs: Baselines for goal recognition executions on gym environments."""
2
+
3
+ from gr_libs.recognizer.gr_as_rl.gr_as_rl_recognizer import Draco, GCDraco, Graql
1
4
  from gr_libs.recognizer.graml.graml_recognizer import ExpertBasedGraml, GCGraml
2
- from gr_libs.recognizer.gr_as_rl.gr_as_rl_recognizer import Graql, Draco, GCDraco
3
5
 
4
6
  try:
5
7
  from ._version import version as __version__
@@ -0,0 +1 @@
1
+ """ This is a directory that includes scripts for analysis of GR results. """
@@ -1,16 +1,13 @@
1
1
  import copy
2
- import sys
3
- import matplotlib.pyplot as plt
4
- import numpy as np
5
2
  import os
3
+
6
4
  import dill
5
+ import matplotlib.pyplot as plt
6
+ import numpy as np
7
7
  from scipy.interpolate import make_interp_spline
8
8
  from scipy.ndimage import gaussian_filter1d
9
- from gr_libs.ml.utils.storage import (
10
- get_experiment_results_path,
11
- set_global_storage_configs,
12
- )
13
- from scripts.generate_task_specific_statistics_plots import get_figures_dir_path
9
+
10
+ from gr_libs.ml.utils.storage import get_experiment_results_path
14
11
 
15
12
 
16
13
  def smooth_line(x, y, num_points=300):
@@ -23,55 +20,25 @@ def smooth_line(x, y, num_points=300):
23
20
  if __name__ == "__main__":
24
21
 
25
22
  fragmented_accuracies = {
26
- "graml": {
27
- "panda": {
28
- "gd_agent": {
29
- "0.3": [], # every list here should have number of tasks accuracies in it, since we done experiments for L111-L555. remember each accuracy is an average of #goals different tasks.
30
- "0.5": [],
31
- "0.7": [],
32
- "0.9": [],
33
- "1": [],
34
- },
35
- "gc_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
36
- },
23
+ "ExpertBasedGraml": {
37
24
  "minigrid": {
38
25
  "obstacles": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
39
26
  "lava_crossing": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
40
- },
41
- "point_maze": {
42
- "obstacles": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
43
- "four_rooms": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
44
- },
45
- "parking": {
46
- "gd_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
47
- "gc_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
48
- },
27
+ }
49
28
  },
50
- "graql": {
51
- "panda": {
52
- "gd_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
53
- "gc_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
54
- },
29
+ "Graql": {
55
30
  "minigrid": {
56
31
  "obstacles": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
57
32
  "lava_crossing": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
58
- },
59
- "point_maze": {
60
- "obstacles": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
61
- "four_rooms": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
62
- },
63
- "parking": {
64
- "gd_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
65
- "gc_agent": {"0.3": [], "0.5": [], "0.7": [], "0.9": [], "1": []},
66
- },
33
+ }
67
34
  },
68
35
  }
69
36
 
70
37
  continuing_accuracies = copy.deepcopy(fragmented_accuracies)
71
38
 
72
39
  # domains = ['panda', 'minigrid', 'point_maze', 'parking']
73
- domains = ["minigrid", "point_maze", "parking"]
74
- tasks = ["L111", "L222", "L333", "L444", "L555"]
40
+ domains = ["minigrid"]
41
+ tasks = ["L1", "L2", "L3", "L4", "L5"]
75
42
  percentages = ["0.3", "0.5", "1"]
76
43
 
77
44
  for partial_obs_type, accuracies, is_same_learn in zip(
@@ -80,80 +47,106 @@ if __name__ == "__main__":
80
47
  [False, True],
81
48
  ):
82
49
  for domain in domains:
83
- for env in accuracies["graml"][domain].keys():
50
+ for env in accuracies["ExpertBasedGraml"][domain].keys():
84
51
  for task in tasks:
85
- set_global_storage_configs(
86
- recognizer_str="graml",
87
- is_fragmented=partial_obs_type,
88
- is_inference_same_length_sequences=True,
89
- is_learn_same_length_sequences=is_same_learn,
90
- )
91
- graml_res_file_path = (
92
- f"{get_experiment_results_path(domain, env, task)}.pkl"
93
- )
94
- set_global_storage_configs(
95
- recognizer_str="graql", is_fragmented=partial_obs_type
96
- )
52
+ graml_res_file_path = f"{get_experiment_results_path(domain, env, task, 'ExpertBasedGraml')}.pkl"
97
53
  graql_res_file_path = (
98
- f"{get_experiment_results_path(domain, env, task)}.pkl"
54
+ f"{get_experiment_results_path(domain, env, task, 'Graql')}.pkl"
99
55
  )
100
56
  if os.path.exists(graml_res_file_path):
101
57
  with open(graml_res_file_path, "rb") as results_file:
102
58
  results = dill.load(results_file)
103
- for percentage in accuracies["graml"][domain][env].keys():
104
- accuracies["graml"][domain][env][percentage].append(
105
- results[percentage]["accuracy"]
106
- )
59
+ for percentage in accuracies["expertbasedgraml"][domain][
60
+ env
61
+ ].keys():
62
+ accuracies["expertbasedgraml"][domain][env][
63
+ percentage
64
+ ].append(results[percentage]["accuracy"])
107
65
  else:
108
- assert (False, f"no file for {graml_res_file_path}")
66
+ assert False, f"no file for {graml_res_file_path}"
109
67
  if os.path.exists(graql_res_file_path):
110
68
  with open(graql_res_file_path, "rb") as results_file:
111
69
  results = dill.load(results_file)
112
- for percentage in accuracies["graml"][domain][env].keys():
113
- accuracies["graql"][domain][env][percentage].append(
70
+ for percentage in accuracies["expertbasedgraml"][domain][
71
+ env
72
+ ].keys():
73
+ accuracies["Graql"][domain][env][percentage].append(
114
74
  results[percentage]["accuracy"]
115
75
  )
116
76
  else:
117
- assert (False, f"no file for {graql_res_file_path}")
77
+ assert False, f"no file for {graql_res_file_path}"
118
78
 
119
79
  plot_styles = {
120
- ("graml", "fragmented", 0.3): "g--o", # Green dashed line with circle markers
121
- ("graml", "fragmented", 0.5): "g--s", # Green dashed line with square markers
122
80
  (
123
- "graml",
81
+ "expertbasedgraml",
82
+ "fragmented",
83
+ 0.3,
84
+ ): "g--o", # Green dashed line with circle markers
85
+ (
86
+ "expertbasedgraml",
87
+ "fragmented",
88
+ 0.5,
89
+ ): "g--s", # Green dashed line with square markers
90
+ (
91
+ "expertbasedgraml",
124
92
  "fragmented",
125
93
  0.7,
126
94
  ): "g--^", # Green dashed line with triangle-up markers
127
- ("graml", "fragmented", 0.9): "g--d", # Green dashed line with diamond markers
128
- ("graml", "fragmented", 1.0): "g--*", # Green dashed line with star markers
129
- ("graml", "continuing", 0.3): "g-o", # Green solid line with circle markers
130
- ("graml", "continuing", 0.5): "g-s", # Green solid line with square markers
131
95
  (
132
- "graml",
96
+ "expertbasedgraml",
97
+ "fragmented",
98
+ 0.9,
99
+ ): "g--d", # Green dashed line with diamond markers
100
+ (
101
+ "expertbasedgraml",
102
+ "fragmented",
103
+ 1.0,
104
+ ): "g--*", # Green dashed line with star markers
105
+ (
106
+ "expertbasedgraml",
107
+ "continuing",
108
+ 0.3,
109
+ ): "g-o", # Green solid line with circle markers
110
+ (
111
+ "expertbasedgraml",
112
+ "continuing",
113
+ 0.5,
114
+ ): "g-s", # Green solid line with square markers
115
+ (
116
+ "expertbasedgraml",
133
117
  "continuing",
134
118
  0.7,
135
119
  ): "g-^", # Green solid line with triangle-up markers
136
- ("graml", "continuing", 0.9): "g-d", # Green solid line with diamond markers
137
- ("graml", "continuing", 1.0): "g-*", # Green solid line with star markers
138
- ("graql", "fragmented", 0.3): "b--o", # Blue dashed line with circle markers
139
- ("graql", "fragmented", 0.5): "b--s", # Blue dashed line with square markers
140
120
  (
141
- "graql",
121
+ "expertbasedgraml",
122
+ "continuing",
123
+ 0.9,
124
+ ): "g-d", # Green solid line with diamond markers
125
+ (
126
+ "expertbasedgraml",
127
+ "continuing",
128
+ 1.0,
129
+ ): "g-*", # Green solid line with star markers
130
+ ("Graql", "fragmented", 0.3): "b--o", # Blue dashed line with circle markers
131
+ ("Graql", "fragmented", 0.5): "b--s", # Blue dashed line with square markers
132
+ (
133
+ "Graql",
142
134
  "fragmented",
143
135
  0.7,
144
136
  ): "b--^", # Blue dashed line with triangle-up markers
145
- ("graql", "fragmented", 0.9): "b--d", # Blue dashed line with diamond markers
146
- ("graql", "fragmented", 1.0): "b--*", # Blue dashed line with star markers
147
- ("graql", "continuing", 0.3): "b-o", # Blue solid line with circle markers
148
- ("graql", "continuing", 0.5): "b-s", # Blue solid line with square markers
149
- ("graql", "continuing", 0.7): "b-^", # Blue solid line with triangle-up markers
150
- ("graql", "continuing", 0.9): "b-d", # Blue solid line with diamond markers
151
- ("graql", "continuing", 1.0): "b-*", # Blue solid line with star markers
137
+ ("Graql", "fragmented", 0.9): "b--d", # Blue dashed line with diamond markers
138
+ ("Graql", "fragmented", 1.0): "b--*", # Blue dashed line with star markers
139
+ ("Graql", "continuing", 0.3): "b-o", # Blue solid line with circle markers
140
+ ("Graql", "continuing", 0.5): "b-s", # Blue solid line with square markers
141
+ ("Graql", "continuing", 0.7): "b-^", # Blue solid line with triangle-up markers
142
+ ("Graql", "continuing", 0.9): "b-d", # Blue solid line with diamond markers
143
+ ("Graql", "continuing", 1.0): "b-*", # Blue solid line with star markers
152
144
  }
153
145
 
154
146
  def average_accuracies(accuracies, domain):
155
147
  avg_acc = {
156
- algo: {perc: [] for perc in percentages} for algo in ["graml", "graql"]
148
+ algo: {perc: [] for perc in percentages}
149
+ for algo in ["ExpertBasedGraml", "Graql"]
157
150
  }
158
151
 
159
152
  for algo in avg_acc.keys():
@@ -186,7 +179,7 @@ if __name__ == "__main__":
186
179
  x_vals = np.arange(1, 6) # Number of goals
187
180
 
188
181
  # Create "waves" (shaded regions) for each algorithm
189
- for algo in ["graml", "graql"]:
182
+ for algo in ["ExpertBasedGraml", "Graql"]:
190
183
  fragmented_y_vals_by_percentage = []
191
184
  continuing_y_vals_by_percentage = []
192
185
 
@@ -1,14 +1,14 @@
1
1
  import copy
2
- import sys
3
- import matplotlib.pyplot as plt
4
- import numpy as np
5
2
  import os
3
+
6
4
  import dill
5
+ import matplotlib.pyplot as plt
6
+ import numpy as np
7
+
7
8
  from gr_libs.ml.utils.storage import (
8
9
  get_experiment_results_path,
9
10
  set_global_storage_configs,
10
11
  )
11
- from scripts.generate_task_specific_statistics_plots import get_figures_dir_path
12
12
 
13
13
 
14
14
  def gen_graph(
@@ -71,7 +71,7 @@ def gen_graph(
71
71
  results[percentage]["accuracy"]
72
72
  )
73
73
  else:
74
- assert (False, f"no file for {graml_res_file_path}")
74
+ assert False, f"no file for {graml_res_file_path}"
75
75
  if os.path.exists(graql_res_file_path):
76
76
  with open(graql_res_file_path, "rb") as results_file:
77
77
  results = dill.load(results_file)
@@ -79,7 +79,7 @@ def gen_graph(
79
79
  results[percentage]["accuracy"]
80
80
  )
81
81
  else:
82
- assert (False, f"no file for {graql_res_file_path}")
82
+ assert False, f"no file for {graql_res_file_path}"
83
83
 
84
84
  def plot_accuracies(accuracies, partial_obs_type):
85
85
  plt.figure(figsize=(10, 6))