From 89eb8bdd0b1e701fed1b7b006f99376999a47363 Mon Sep 17 00:00:00 2001
From: sacardoz <sacardoz@uwaterloo.ca>
Date: Sat, 30 Dec 2023 02:49:34 -0500
Subject: [PATCH] PDM WORKS

---
 experiments/test_notebook.ipynb               | 148 +++++++++++-------
 .../ml_planner_agents_observation.yaml        |  26 +++
 .../observation/ml_planner_agents.py          |  81 ++++++----
 3 files changed, 169 insertions(+), 86 deletions(-)

diff --git a/experiments/test_notebook.ipynb b/experiments/test_notebook.ipynb
index 1b183ce..60cbb31 100644
--- a/experiments/test_notebook.ipynb
+++ b/experiments/test_notebook.ipynb
@@ -26,7 +26,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/tmp/ipykernel_235422/4095267831.py:5: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n",
+      "/tmp/ipykernel_16674/4095267831.py:5: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n",
       "  from IPython.core.display import display, HTML\n"
      ]
     }
@@ -105,18 +105,23 @@
    "metadata": {},
    "outputs": [
     {
-     "data": {
-      "text/plain": [
-       "'/media/sacardoz/Storage/nuplan-devkit/experiments'"
-      ]
-     },
-     "execution_count": 3,
-     "metadata": {},
-     "output_type": "execute_result"
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/media/sacardoz/Storage/nuplan-devkit\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/IPython/core/magics/osm.py:417: UserWarning: using dhist requires you to install the `pickleshare` library.\n",
+      "  self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n"
+     ]
     }
    ],
    "source": [
-    "%pwd"
+    "%cd .."
    ]
   },
   {
@@ -173,7 +178,7 @@
     "    f\"planner.pdm_hybrid_planner.checkpoint_path={hybrid_ckpt}\" ,\n",
     "    'observation.model_config=${model}',\n",
     "    f'observation.checkpoint_path={ckpt_dir}',\n",
-    "    f'observation.planner_type=pdm_closed',\n",
+    "    f'observation.planner_type=pdm_hybrid',\n",
     "    f'observation.pdm_hybrid_ckpt={hybrid_ckpt}',\n",
     "    f'observation.occlusions=true',\n",
     "    'worker=sequential',\n",
@@ -205,34 +210,34 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "2023-12-23 20:52:26,435 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:19}  Building WorkerPool...\n",
-      "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:101}  Worker: Sequential\n",
-      "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:102}  Number of nodes: 1\n",
+      "2023-12-30 01:57:45,114 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:19}  Building WorkerPool...\n",
+      "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:101}  Worker: Sequential\n",
+      "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:102}  Number of nodes: 1\n",
       "Number of CPUs per node: 1\n",
       "Number of GPUs per node: 0\n",
       "Number of threads across all nodes: 1\n",
-      "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:27}  Building WorkerPool...DONE!\n",
-      "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:32}  Building experiment folders...\n",
-      "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:35}  \n",
+      "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:27}  Building WorkerPool...DONE!\n",
+      "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:32}  Building experiment folders...\n",
+      "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:35}  \n",
       "\n",
-      "\tFolder where all results are stored: /media/sacardoz/Storage/nuplan/exp/exp/simulation/closed_loop_multiagent/2023.12.23.20.52.26\n",
+      "\tFolder where all results are stored: /media/sacardoz/Storage/nuplan/exp/exp/simulation/closed_loop_multiagent/2023.12.30.01.57.44\n",
       "\n",
-      "2023-12-23 20:52:26,438 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:70}  Building experiment folders...DONE!\n",
-      "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:52}  Building AbstractCallback...\n",
-      "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:68}  Building AbstractCallback: 0...DONE!\n",
-      "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:49}  Building simulations...\n",
-      "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:55}  Extracting scenarios...\n",
-      "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/common/utils/distributed_scenario_filter.py:83}  Building Scenarios in mode DistributedMode.SINGLE_NODE\n",
-      "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:18}  Building AbstractScenarioBuilder...\n",
-      "2023-12-23 20:52:26,452 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:21}  Building AbstractScenarioBuilder...DONE!\n",
-      "2023-12-23 20:52:26,452 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:35}  Building ScenarioFilter...\n",
-      "2023-12-23 20:52:26,453 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:44}  Building ScenarioFilter...DONE!\n",
-      "2023-12-23 20:52:26,470 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:76}  Building metric engines...\n",
-      "2023-12-23 20:52:26,498 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:78}  Building metric engines...DONE\n",
-      "2023-12-23 20:52:26,498 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:82}  Building simulations from 1 scenarios...\n",
-      "2023-12-23 20:52:26,633 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:18}  Building TorchModuleWrapper...\n",
-      "2023-12-23 20:52:26,669 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:21}  Building TorchModuleWrapper...DONE!\n",
-      "2023-12-23 20:52:27,238 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:142}  Building simulations...DONE!\n"
+      "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:70}  Building experiment folders...DONE!\n",
+      "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:52}  Building AbstractCallback...\n",
+      "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:68}  Building AbstractCallback: 0...DONE!\n",
+      "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:49}  Building simulations...\n",
+      "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:55}  Extracting scenarios...\n",
+      "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/common/utils/distributed_scenario_filter.py:83}  Building Scenarios in mode DistributedMode.SINGLE_NODE\n",
+      "2023-12-30 01:57:45,118 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:18}  Building AbstractScenarioBuilder...\n",
+      "2023-12-30 01:57:45,129 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:21}  Building AbstractScenarioBuilder...DONE!\n",
+      "2023-12-30 01:57:45,130 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:35}  Building ScenarioFilter...\n",
+      "2023-12-30 01:57:45,131 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:44}  Building ScenarioFilter...DONE!\n",
+      "2023-12-30 01:57:45,149 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:76}  Building metric engines...\n",
+      "2023-12-30 01:57:45,181 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:78}  Building metric engines...DONE\n",
+      "2023-12-30 01:57:45,181 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:82}  Building simulations from 1 scenarios...\n",
+      "2023-12-30 01:57:45,315 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:18}  Building TorchModuleWrapper...\n",
+      "2023-12-30 01:57:45,353 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:21}  Building TorchModuleWrapper...DONE!\n",
+      "2023-12-30 01:57:45,912 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:142}  Building simulations...DONE!\n"
      ]
     }
    ],
@@ -445,8 +450,8 @@
     "\n",
     "while runner.simulation.is_simulation_running():\n",
     "\n",
-    "    if runner.simulation._time_controller.get_iteration().index == 10:\n",
-    "        runner.simulation._observations.add_agent_to_scene(inserted_agent, inserted_goal, iteration.time_point)\n",
+    "    #if runner.simulation._time_controller.get_iteration().index == 10:\n",
+    "    #    runner.simulation._observations.add_agent_to_scene(inserted_agent, inserted_goal, iteration.time_point)\n",
     "\n",
     "    # Execute specific callback\n",
     "    runner.simulation.callback.on_step_start(runner.simulation.setup, runner.planner)\n",
@@ -466,7 +471,6 @@
     "    iteration = runner.simulation._time_controller.get_iteration()\n",
     "    print(iteration)\n",
     "    runner.simulation.propagate(trajectory)\n",
-    "\n",
     "    # Execute specific callback\n",
     "    runner.simulation.callback.on_step_end(runner.simulation.setup, runner.planner, runner.simulation.history.last())\n",
     "\n",
@@ -476,10 +480,8 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e6c22f5f",
-   "metadata": {
-    "scrolled": true
-   },
+   "id": "ee4f6784",
+   "metadata": {},
    "outputs": [
     {
      "name": "stderr",
@@ -498,7 +500,7 @@
        "  (function() {\n",
        "    const xhr = new XMLHttpRequest()\n",
        "    xhr.responseType = 'blob';\n",
-       "    xhr.open('GET', \"http://localhost:5009/autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5009&resources=none\", true);\n",
+       "    xhr.open('GET', \"http://localhost:5003/autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5003&resources=none\", true);\n",
        "    xhr.onload = function (event) {\n",
        "      const script = document.createElement('script');\n",
        "      const src = URL.createObjectURL(event.target.response);\n",
@@ -512,7 +514,7 @@
      },
      "metadata": {
       "application/vnd.bokehjs_exec.v0+json": {
-       "server_id": "7d9bc83475124657aff7017705e9f4df"
+       "server_id": "bb87f5db2a334639a9b38e52166acc51"
       }
      },
      "output_type": "display_data"
@@ -521,26 +523,54 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "2023-12-23 20:59:59,909 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'run_sim_closed_loop/training_raster_experiment/train_default_raster/2023.11.14.22.55.23/hparams.yaml'. Is this a 'parquet' file?: Could not open Parquet input source 'run_sim_closed_loop/training_raster_experiment/train_default_raster/2023.11.14.22.55.23/hparams.yaml': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,910 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,910 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'pretrained_checkpoints/gc_pgp_checkpoint.ckpt'. Is this a 'parquet' file?: Could not open Parquet input source 'pretrained_checkpoints/gc_pgp_checkpoint.ckpt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,912 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-12-23 20:59:59,914 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py:172}  Minimum frame time=0.017 s\n"
+      "2023-12-30 02:47:05,264 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n",
+      "2023-12-30 02:47:05,265 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'tutorials/media/nuplan_flow.svg'. Is this a 'parquet' file?: Could not open Parquet input source 'tutorials/media/nuplan_flow.svg': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,268 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,268 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from '.github/ISSUE_TEMPLATE/bug_report.md'. Is this a 'parquet' file?: Could not open Parquet input source '.github/ISSUE_TEMPLATE/bug_report.md': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,268 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,269 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,269 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,269 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,278 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'nuplan/BUILD'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan/BUILD': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,279 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'nuplan_devkit.egg-info/PKG-INFO'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan_devkit.egg-info/PKG-INFO': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,279 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'tox/requirements_pythonlint.txt'. Is this a 'parquet' file?: Could not open Parquet input source 'tox/requirements_pythonlint.txt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,280 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,280 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'docs/Makefile'. Is this a 'parquet' file?: Could not open Parquet input source 'docs/Makefile': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,281 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,281 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,281 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,283 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,283 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'experiments/bulk_running_experiments.ipynb'. Is this a 'parquet' file?: Could not open Parquet input source 'experiments/bulk_running_experiments.ipynb': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,283 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from '.git/COMMIT_EDITMSG'. Is this a 'parquet' file?: Could not open Parquet input source '.git/COMMIT_EDITMSG': Parquet file size is 5 bytes, smaller than the minimum file footer (8 bytes)\n",
+      "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n",
+      "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,289 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-12-30 02:47:05,300 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py:172}  Minimum frame time=0.017 s\n"
      ]
     },
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "Rendering a scenario: 100%|██████████| 1/1 [00:00<00:00, 30.44it/s]\n",
+      "Rendering a scenario: 100%|██████████| 1/1 [00:00<00:00, 43.62it/s]\n",
       "WARNING:bokeh.core.validation.check:W-1000 (MISSING_RENDERERS): Plot has no renderers: Figure(id='1005', ...)\n",
-      "INFO:tornado.access:200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5009&resources=none (::1) 1063.26ms\n",
-      "INFO:tornado.access:101 GET /ws?id=cd802e51-de22-41c8-bc8e-99ef2dff2bff&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.62ms\n",
+      "INFO:tornado.access:200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5003&resources=none (::1) 1044.77ms\n",
       "INFO:bokeh.server.views.ws:WebSocket connection opened\n",
+      "INFO:tornado.access:101 GET /ws?id=1473284a-b32b-43ae-9821-e330d67bdb31&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.82ms\n",
       "INFO:bokeh.server.views.ws:ServerConnection created\n"
      ]
     },
@@ -548,15 +578,15 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "2023-12-23 21:00:00,955 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5009&resources=none (::1) 1063.26ms\n",
-      "2023-12-23 21:00:00,986 INFO {/media/sacardoz/Storage/nuplan-devkit/tutorials/utils/tutorial_utils.py:267}  Done rendering!\n",
-      "2023-12-23 21:00:00,987 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  101 GET /ws?id=cd802e51-de22-41c8-bc8e-99ef2dff2bff&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.62ms\n"
+      "2023-12-30 02:47:06,295 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5003&resources=none (::1) 1044.77ms\n",
+      "2023-12-30 02:47:06,344 INFO {/media/sacardoz/Storage/nuplan-devkit/tutorials/utils/tutorial_utils.py:267}  Done rendering!\n",
+      "2023-12-30 02:47:06,351 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  101 GET /ws?id=1473284a-b32b-43ae-9821-e330d67bdb31&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.82ms\n"
      ]
     }
    ],
    "source": [
     "from tutorials.utils.tutorial_utils import visualize_history\n",
-    "visualize_history(runner.simulation._history, runner.scenario, bokeh_port=5009)"
+    "visualize_history(runner.simulation._history, runner.scenario, bokeh_port=5003)"
    ]
   }
  ],
diff --git a/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml b/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml
index fe8ec0e..eb6c5fa 100644
--- a/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml
+++ b/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml
@@ -6,3 +6,29 @@ checkpoint_path: ???  # Path to trained model checkpoint
 occlusions: false  # Boolean to determine whether occlusions should be enabled
 planner_type: "ml"  # String to determine planner type (one of "ml", "idm", "pdm_closed", "pdm_hybrid")
 pdm_hybrid_ckpt: null  # Path to trained PDM hybrid model checkpoint
+
+tracker: 
+  _target_: nuplan.planning.simulation.controller.tracker.lqr.LQRTracker
+  _convert_: 'all'
+
+  # LQR tuning
+  q_longitudinal: [10.0]      # velocity tracking cost gain
+  r_longitudinal: [1.0]       # acceleration tracking cost gain
+  q_lateral: [1.0, 10.0, 0.0] # [lateral_error, heading_error, steering_angle] tracking cost gains
+  r_lateral: [1.0]            # steering_rate tracking cost gain
+  discretization_time: 0.1    # [s] The time interval used for discretizing the continuous time dynamics.
+  tracking_horizon: 10        # The number of time steps (at discretization_time interval) ahead we consider for LQR.
+
+  # Parameters for velocity and curvature estimation.
+  jerk_penalty: 1e-4            # Penalty for jerk in velocity profile estimation.
+  curvature_rate_penalty: 1e-2  # Penalty for curvature rate in curvature profile estimation.
+
+  # Stopping logic
+  stopping_proportional_gain: 0.5 # Proportional controller tuning for stopping controller
+  stopping_velocity: 0.2          # [m/s] Velocity threshold for stopping
+  
+motion_model: 
+  _target_: nuplan.planning.simulation.controller.motion_model.kinematic_bicycle.KinematicBicycleModel
+  _convert_: 'all'
+
+  vehicle: ${scenario_builder.vehicle_parameters}
diff --git a/nuplan/planning/simulation/observation/ml_planner_agents.py b/nuplan/planning/simulation/observation/ml_planner_agents.py
index 79354eb..b07f94f 100644
--- a/nuplan/planning/simulation/observation/ml_planner_agents.py
+++ b/nuplan/planning/simulation/observation/ml_planner_agents.py
@@ -11,10 +11,14 @@ from nuplan.common.actor_state.state_representation import StateSE2, StateVector
 from nuplan.common.actor_state.tracked_objects import TrackedObject, TrackedObjects
 from nuplan.common.actor_state.tracked_objects_types import TrackedObjectType
 from nuplan.common.actor_state.vehicle_parameters import VehicleParameters
+from nuplan.common.geometry.transform import translate_longitudinally
 from nuplan.common.maps.abstract_map import AbstractMap
-from nuplan.common.maps.abstract_map_objects import LaneGraphEdgeMapObject, RoadBlockGraphEdgeMapObject
+from nuplan.common.maps.abstract_map_objects import LaneGraphEdgeMapObject
 
 from nuplan.planning.scenario_builder.abstract_scenario import AbstractScenario
+from nuplan.planning.simulation.controller.motion_model.abstract_motion_model import AbstractMotionModel
+from nuplan.planning.simulation.controller.tracker.abstract_tracker import AbstractTracker
+from nuplan.planning.simulation.controller.two_stage_controller import TwoStageController
 from nuplan.planning.simulation.history.simulation_history_buffer import SimulationHistoryBuffer
 from nuplan.planning.simulation.observation.abstract_observation import AbstractObservation
 from nuplan.planning.simulation.observation.observation_type import Observation
@@ -25,6 +29,7 @@ from nuplan.planning.simulation.planner.idm_planner import IDMPlanner
 
 from nuplan.planning.simulation.planner.ml_planner.ml_planner import MLPlanner
 from nuplan.planning.simulation.simulation_time_controller.simulation_iteration import SimulationIteration
+from nuplan.planning.simulation.trajectory.abstract_trajectory import AbstractTrajectory
 from nuplan.planning.training.modeling.torch_module_wrapper import TorchModuleWrapper
 
 from nuplan.planning.simulation.trajectory.trajectory_sampling import TrajectorySampling
@@ -56,24 +61,30 @@ IDM_AGENT_CONFIG = {
 PDM_CLOSED_AGENT_CONFIG = {  
     "trajectory_sampling": TrajectorySampling(num_poses=80, interval_length= 0.1),
     "proposal_sampling": TrajectorySampling(num_poses=40, interval_length= 0.1),
-    "idm_policies": BatchIDMPolicy(speed_limit_fraction= [0.2,0.4,0.6,0.8,1.0], 
-                                    fallback_target_velocity= 15.0, 
-                                    min_gap_to_lead_agent= 1.0,
-                                    headway_time= 1.5,
-                                    accel_max= 1.5,
-                                    decel_max= 3.0),
     "lateral_offsets": [-1.0, 1.0], 
     "map_radius": 50,
 }
 
+PDM_BATCH_IDM_CONFIG = {
+    "speed_limit_fraction":[0.2,0.4,0.6,0.8,1.0], 
+    "fallback_target_velocity":15.0, 
+    "min_gap_to_lead_agent":1.0,
+    "headway_time":1.5,
+    "accel_max":1.5,
+    "decel_max":3.0
+}
+
+PDM_OFFSET_MODEL_CONFIG = {
+    "trajectory_sampling": TrajectorySampling(num_poses=16, interval_length=0.5), 
+    "history_sampling": TrajectorySampling(num_poses=10, interval_length=0.2),
+    "planner": None,
+    "centerline_samples": 120,
+    "centerline_interval": 1.0,
+    "hidden_dim": 512
+}
+
 PDM_HYBRID_AGENT_CONFIG = {  
-    "model":PDMOffsetModel(trajectory_sampling=TrajectorySampling(num_poses=16, interval_length=0.5), 
-                        history_sampling=TrajectorySampling(num_poses=10, interval_length=0.2),
-                        planner=None,
-                        centerline_samples=120,
-                        centerline_interval=1.0,
-                        hidden_dim=512),
-    "correction_horizon":2.0,
+    "correction_horizon": 2.0,
 }
 
 
@@ -82,7 +93,7 @@ class MLPlannerAgents(AbstractObservation):
     Simulate agents based on an ML model.
     """
 
-    def __init__(self, model: TorchModuleWrapper, scenario: AbstractScenario, occlusions: bool, planner_type: str, pdm_hybrid_ckpt: str) -> None:
+    def __init__(self, model: TorchModuleWrapper, scenario: AbstractScenario, occlusions: bool, planner_type: str, pdm_hybrid_ckpt: str, tracker: AbstractTracker, motion_model: AbstractMotionModel) -> None:
         """
         Initializes the MLPlannerAgents class.
         :param model: Model to use for inference.
@@ -100,6 +111,8 @@ class MLPlannerAgents(AbstractObservation):
         self._inference_frequency: float = 0.2
         self._full_inference_distance: float = 30
 
+        self._motion_controller = TwoStageController(scenario, tracker, motion_model)
+
     def reset(self) -> None:
         """Inherited, see superclass."""
         self.current_iteration = 0
@@ -202,9 +215,21 @@ class MLPlannerAgents(AbstractObservation):
                 planner_input = PlannerInput(iteration=iteration, history=history_input, traffic_light_data=traffic_light_data)                    
                 trajectory = agent_data['planner'].compute_trajectory(planner_input)
                 self._trajectory_cache[agent_token] = (next_iteration.time_point.time_s, trajectory)
-
-            agent_data['ego_state'] = trajectory.get_state_at_time(next_iteration.time_point)
+                
+            agent_data['ego_state'] = self._get_new_state_from_trajectory(iteration, next_iteration, agent_data['ego_state'], trajectory)
             self._ego_state_history[agent_token][next_iteration.time_point] = agent_data['ego_state']
+
+
+    def _get_new_state_from_trajectory(self, current_iteration: SimulationIteration,
+                                                next_iteration: SimulationIteration,
+                                                ego_state: EgoState,
+                                                trajectory: AbstractTrajectory) -> EgoState:
+        """
+        Gets the state of the agent at a given timepoint from a trajectory.
+        """
+        self._motion_controller.reset()
+        self._motion_controller.update_state(current_iteration, next_iteration, ego_state, trajectory)
+        return self._motion_controller.get_state()
             
     def _build_ego_state_from_agent(self, agent: Agent, time_point: TimePoint) -> EgoState:
         """
@@ -219,10 +244,11 @@ class MLPlannerAgents(AbstractObservation):
             self._ego_state_history[agent.metadata.track_token] = {}
 
         # Most of this is just eyeballed, so there may be a more principled way of setting these values.
-        output = EgoState.build_from_center(
-            center=agent.center,
-            center_velocity_2d=agent.velocity if self.planner_type != "idm" else StateVector2D(agent.velocity.magnitude(), 0),
-            center_acceleration_2d=StateVector2D(0, 0),
+            
+        output = EgoState.build_from_rear_axle(
+            rear_axle_pose=translate_longitudinally(agent.center, agent.box.length * 1 / 5 - agent.box.length / 2),
+            rear_axle_velocity_2d=StateVector2D(agent.velocity.magnitude(), 0), #EgoState and Agent uses different velocity representations. It's very weird.
+            rear_axle_acceleration_2d=StateVector2D(0, 0),
             tire_steering_angle=0,
             time_point=time_point,
             vehicle_parameters=VehicleParameters(
@@ -244,12 +270,14 @@ class MLPlannerAgents(AbstractObservation):
         """
         Builds agent state from corresponding ego state. Unlike the inverse this process is well-defined.
         """
+        track_heading = ego_state.car_footprint.oriented_box.center.heading
+        velocity = ego_state.dynamic_car_state.center_velocity_2d
 
         agent_state = Agent(
             metadata=scene_object_metadata,
             tracked_object_type=TrackedObjectType.VEHICLE,
             oriented_box=ego_state.car_footprint.oriented_box,
-            velocity=ego_state.dynamic_car_state.center_velocity_2d,
+            velocity=StateVector2D(np.cos(track_heading) * velocity.magnitude(), np.sin(track_heading) * velocity.magnitude())
         )
         return agent_state
     
@@ -317,12 +345,10 @@ class MLPlannerAgents(AbstractObservation):
         """
         # TODO: Inject IDM agents (and non-ML agents more broadly)
 
-        self._agents[agent.metadata.track_token] = self._build_agent_record(agent, timepoint_record)
-
         route_plan = self._get_roadblock_path(agent, goal)
 
         if route_plan:
-            self._agents[agent.metadata.track_token] = self._build_agent_record(agent, self._scenario.start_time)
+            self._agents[agent.metadata.track_token] = self._build_agent_record(agent, timepoint_record)
 
             # Initialize planner.
             planner_init = PlannerInitialization(
@@ -340,10 +366,11 @@ class MLPlannerAgents(AbstractObservation):
         elif self.planner_type == "idm":
             planner = IDMPlanner(**IDM_AGENT_CONFIG)
         elif self.planner_type == "pdm_closed":
-            planner = PDMClosedPlanner(**PDM_CLOSED_AGENT_CONFIG)
+            planner = PDMClosedPlanner(**PDM_CLOSED_AGENT_CONFIG, idm_policies=BatchIDMPolicy(**PDM_BATCH_IDM_CONFIG))
         elif self.planner_type == "pdm_hybrid":
             assert self.pdm_hybrid_ckpt, "Must provide checkpoint path for PDM hybrid planner."
-            planner = PDMHybridPlanner(**PDM_CLOSED_AGENT_CONFIG, **PDM_HYBRID_AGENT_CONFIG, checkpoint_path=self.pdm_hybrid_ckpt)
+            planner = PDMHybridPlanner(**PDM_CLOSED_AGENT_CONFIG, idm_policies=BatchIDMPolicy(**PDM_BATCH_IDM_CONFIG), \
+                                       **PDM_HYBRID_AGENT_CONFIG, model= PDMOffsetModel(**PDM_OFFSET_MODEL_CONFIG), checkpoint_path=self.pdm_hybrid_ckpt)
         else:
             raise ValueError("Invalid planner type.")
 
-- 
GitLab