From 360be75435cc5d56256234fdb174f14cd60d0c7c Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Tue, 19 Apr 2022 18:05:04 +0800 Subject: [PATCH] update name; doc --- README.md | 3 +- docs/figs/di-smartcross_banner.png | Bin 0 -> 51114 bytes docs/source/envs/cf_grid_env.rst | 2 + docs/source/faq.rst | 15 + docs/source/index.rst | 22 +- docs/source/installation.rst | 26 +- docs/source/quick_start.rst | 78 +- docs/source/rl_environments.rst | 51 + smartcross/envs/action/sumo_action.py | 2 +- smartcross/envs/action/sumo_action_runner.py | 2 +- smartcross/envs/obs/sumo_obs_runner.py | 2 +- smartcross/envs/reward/sumo_reward.py | 2 +- smartcross/envs/reward/sumo_reward_runner.py | 2 +- .../route/1100/2_eg.rou.xml | 14490 ---------------- ...aml => sumo_arterial7_default_config.yaml} | 2 +- .../sumo_arterial7_multi_agent_config.yaml | 2 +- .../standard.net.xml | 0 .../standard.sumocfg | 0 smartcross/envs/sumo_env.py | 2 +- .../detector/detector1_lane_end.add.xml | 0 .../detector/detector1_lane_start.add.xml | 0 .../detector2_length_49_freq_60.add.xml | 0 .../detector2_length_7_freq_1.add.xml | 0 .../detector/detector3.add.xml | 0 .../{wj3 => sumo_wj3}/edge_measure.add.xml | 0 smartcross/envs/{wj3 => sumo_wj3}/rl_wj.ini | 0 .../envs/{wj3 => sumo_wj3}/rl_wj.net.xml | 0 .../envs/{wj3 => sumo_wj3}/rl_wj.sumocfg | 0 smartcross/envs/{wj3 => sumo_wj3}/summary.xml | 0 .../envs/{wj3 => sumo_wj3}/testflow.rou.xml | 0 .../envs/{wj3 => sumo_wj3}/testflow.trip.xml | 0 .../{wj3 => sumo_wj3}/testflow.turndefs.xml | 0 smartcross/envs/sumo_wj3_default_config.yaml | 2 +- .../envs/sumo_wj3_multi_agent_config.yaml | 2 +- smartcross/envs/tests/test_sumo_env.py | 7 +- 35 files changed, 193 insertions(+), 14521 deletions(-) create mode 100644 docs/figs/di-smartcross_banner.png create mode 100644 docs/source/envs/cf_grid_env.rst create mode 100644 docs/source/faq.rst delete mode 100644 smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml rename smartcross/envs/{sumo_rl_arterial_7roads_default_config.yaml => sumo_arterial7_default_config.yaml} (89%) rename smartcross/envs/{rl_arterial_7roads => sumo_arterial_7roads}/standard.net.xml (100%) rename smartcross/envs/{rl_arterial_7roads => sumo_arterial_7roads}/standard.sumocfg (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector1_lane_end.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector1_lane_start.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector2_length_49_freq_60.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector2_length_7_freq_1.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector3.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/edge_measure.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/rl_wj.ini (100%) rename smartcross/envs/{wj3 => sumo_wj3}/rl_wj.net.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/rl_wj.sumocfg (100%) rename smartcross/envs/{wj3 => sumo_wj3}/summary.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/testflow.rou.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/testflow.trip.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/testflow.turndefs.xml (100%) diff --git a/README.md b/README.md index bbcc674..087651c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DI-smartcross -icon +icon DI-smartcross - Decision Intelligence Platform for Traffic Crossing Signal Control. @@ -84,6 +84,7 @@ We appreciate all contributions to improve DI-smartcross, both algorithms and sy DI-smartcross released under the Apache 2.0 license. ## Citation + ```latex @misc{smartcross, title={{DI-smartcross: OpenDILab} Decision Intelligence platform for Traffic Crossing Signal Control}, diff --git a/docs/figs/di-smartcross_banner.png b/docs/figs/di-smartcross_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..dfafdb7b62d7c2f4c7d848010d24d9aac90fa8b3 GIT binary patch literal 51114 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 FV1kK$H?aT! literal 0 HcmV?d00001 diff --git a/docs/source/envs/cf_grid_env.rst b/docs/source/envs/cf_grid_env.rst new file mode 100644 index 0000000..d13c549 --- /dev/null +++ b/docs/source/envs/cf_grid_env.rst @@ -0,0 +1,2 @@ +CityFlow Grid Env +##################### \ No newline at end of file diff --git a/docs/source/faq.rst b/docs/source/faq.rst new file mode 100644 index 0000000..b90795e --- /dev/null +++ b/docs/source/faq.rst @@ -0,0 +1,15 @@ +FAQ +############## + +.. toctree:: + :maxdepth: 2 + + +Q1: SUMO environment always showing `Retrying in 1 seconds` +------------------------------------------------------------------ + +:A1: + SUMO environments and `traci` lib is slow to reset when running with large roadnets. + It only check the collection after reset for 1 sec. DI-smartcross provides an easy way + to change the retry timeout for `traci`. You can run `modify_traci_connect_timeout.sh` + file. It will automatically diff --git a/docs/source/index.rst b/docs/source/index.rst index f7f7903..1f5abb2 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,4 +1,4 @@ -.. DI-drive documentation master file, created by +.. DI-smartcross documentation master file, created by sphinx-quickstart on Mon Jan 25 13:49:15 2021. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. @@ -14,15 +14,14 @@ DI-smartcross Documentation installation quick_start rl_environments + faq - -.. figure:: ../figs/di-smartcross_logo.png +.. figure:: ../figs/di-smartcross_banner.png :alt: DI-smartcross - :width: 500px Decision Intelligence Platform for Traffic Crossing Signal Control. -Last updated on 2022.03.20 +Last updated on 2022.04.16 ----- @@ -50,10 +49,13 @@ Content ============== `Installation `_ --------------------------------------- +------------------------------------------ + +`Quick Start `_ +------------------------------------- -`Quick Start `_ ------------------------------ +`RL Environments `_ +------------------------------------------------- -`RL Environments `_ ----------------------------------------- +`FAQ `_ +-------------------- diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 13a3e7a..52f5c65 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -4,10 +4,17 @@ Installation .. toctree:: :maxdepth: 2 +Here we provide easy installation for **DI-smartcross** and all simulators supported. + +.. note:: + + You can choose one of the simulators to run your experiments. Only chosen one needs to be installed. + + SUMO installation ===================== -**DI-smartcross** support SUMO version >= 1.6.0. Here we show two easy guides +**DI-smartcross** supports SUMO version >= 1.6.0. Here we show two easy guides of SUMO installation on Linux. Install SUMO via apt-get or homebrew @@ -92,6 +99,23 @@ If successful, the following message will be shown in the shell. License EPL-2.0: Eclipse Public License Version 2 Use --help to get the list of options. + +CityFlow Installation +========================== + +CityFlow simulator can be installed from source code via `CMake `_. +Please make sure it is correctly worked in your system. + +Simply download their source code and run ``pip install`` in the root folder to install CityFlow. + +.. code:: bash + + git clone https://github.com/cityflow-project/CityFlow.git + cd CityFlow + pip install . + +You can check installation by running ``import cityflow`` in python. + Install DI-smartcross ========================== diff --git a/docs/source/quick_start.rst b/docs/source/quick_start.rst index ffb72a1..f87ea51 100644 --- a/docs/source/quick_start.rst +++ b/docs/source/quick_start.rst @@ -15,11 +15,13 @@ to get detail instructions of these configs. train RL policies -------------------- +The type of policy can be automatically parsed from the config file. + .. code:: usage: sumo_train [-h] -d DING_CFG -e ENV_CFG [-s SEED] [--dynamic-flow] - [-cn COLLECT_ENV_NUM] [-en EVALUATE_ENV_NUM] - [--exp-name EXP_NAME] + [-cn COLLECT_ENV_NUM] [-en EVALUATE_ENV_NUM] + [--exp-name EXP_NAME] DI-smartcross training script @@ -40,6 +42,10 @@ train RL policies Example of running DQN in wj3 env with default config. +.. note:: + + Running with dynamic flow is only supported for arterial7 env currently. + .. code:: bash sumo_train -e smartcross/envs/sumo_wj3_default_config.yaml -d entry/config/sumo_wj3_dqn_default_config.py @@ -47,11 +53,14 @@ Example of running DQN in wj3 env with default config. evaluate existing policies -------------------------------- +We provide two eval policies: random and fixed-time. You can choose one to evaluate +as comparison. It is suggested to use the `eval_default_config` for each env. + .. code:: usage: sumo_eval [-h] [-d DING_CFG] -e ENV_CFG [-s SEED] - [-p {random,fix,dqn,rainbow,ppo}] [--dynamic-flow] - [-n ENV_NUM] [--gui] [-c CKPT_PATH] + [-p {random,fix,dqn,rainbow,ppo}] [--dynamic-flow] + [-n ENV_NUM] [--gui] [-c CKPT_PATH] DI-smartcross testing script @@ -76,4 +85,63 @@ Example of running random policy in wj3 env. .. code:: bash - sumo_eval -p random -e smartcross/envs/sumo_wj3_default_config.yaml \ No newline at end of file + sumo_eval -p random -e smartcross/envs/sumo_wj3_default_config.yaml + + +CityFlow Entries +================= + +**DI-smartcross** provides a simple DQN and Off-policy PPO demo for CityFlow env. Each +policy comes with a default **DI-engine** configs is provided for each policy. You can +check the document of DI-engine to get detail instructions of these configs. + +train RL policies +-------------------- + +.. code:: + + usage: cityflow_train [-h] -d DING_CFG -e ENV_CFG [-s SEED] + [-cn COLLECT_ENV_NUM] [-en EVALUATE_ENV_NUM] + [--exp-name EXP_NAME] + + DI-smartcross training script + + optional arguments: + -h, --help show this help message and exit + -d DING_CFG, --ding-cfg DING_CFG + DI-engine configuration path + -e ENV_CFG, --env-cfg ENV_CFG + cityflow json configuration path + -s SEED, --seed SEED random seed + -cn COLLECT_ENV_NUM, --collect-env-num COLLECT_ENV_NUM + collector env num for training + -en EVALUATE_ENV_NUM, --evaluate-env-num EVALUATE_ENV_NUM + evaluator env num for training + --exp-name EXP_NAME experiment name to save log and ckpt + +evaluate existing policies +-------------------------------- + +Note that CityFlow will run in fixed-time mode by default when not in rl mode. +So the fix policy runs with an `auto_config.json`. + +.. code:: + + usage: cityflow_eval [-h] [-d DING_CFG] -e ENV_CFG [-s SEED] + [-p {fix,dqn,ppo}] [-n ENV_NUM] [-c CKPT_PATH] + + DI-smartcross training script + + optional arguments: + -h, --help show this help message and exit + -d DING_CFG, --ding-cfg DING_CFG + DI-engine configuration path + -e ENV_CFG, --env-cfg ENV_CFG + sumo environment configuration path + -s SEED, --seed SEED random seed for sumo + -p {fix,dqn,ppo}, --policy-type {fix,dqn,ppo} + RL policy type + -n ENV_NUM, --env-num ENV_NUM + sumo env num for evaluation + -c CKPT_PATH, --ckpt-path CKPT_PATH + model ckpt path diff --git a/docs/source/rl_environments.rst b/docs/source/rl_environments.rst index a25fad1..4ea7b4f 100644 --- a/docs/source/rl_environments.rst +++ b/docs/source/rl_environments.rst @@ -82,3 +82,54 @@ Roadnets envs/wj3_env envs/rl_arterial7_env + + +CityFlow environments +============================= + +configuration +----------------- + +CityFlow simulator has its own config `json` file, with roadnet file, flow file and replay file defined in it. +DI-smartcross adds some extra configs together with CityFlow's config file path in DI-engine's env config. + +.. code:: python + + main_config = dict( + env=dict( + obs_type=['phase', 'lane_vehicle_num', 'lane_waiting_vehicle_num'], + max_episode_duration=1000, + green_duration=30, + yellow_duration=5, + red_duration=0, + ... + ), + ... + ) + +Observation +---------------- + +We provide several types of observations of each cross. + +- phase: One-hot phase vector of current cross signal +- lane_vehicle_num: vehicle nums of each incoming lane +- lane_waiting_vehicle_num: waiting vehicle nums of each incoming lane + +Action +------------- + +CityFlow environment supports changing cross signal to target phase. The action space is set to multi-discrete for each cross to reduce action num. + +Reward +------------- + +CityFlow environment uses pressure of each cross as reward + +Roadnets +------------- + +.. toctree:: + :maxdepth: 2 + + envs/cf_grid_env diff --git a/smartcross/envs/action/sumo_action.py b/smartcross/envs/action/sumo_action.py index 6160ee7..187e3e4 100644 --- a/smartcross/envs/action/sumo_action.py +++ b/smartcross/envs/action/sumo_action.py @@ -22,7 +22,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: Overview: init the sumo action environment with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ self._env = env self._cfg = cfg diff --git a/smartcross/envs/action/sumo_action_runner.py b/smartcross/envs/action/sumo_action_runner.py index 88de9f1..98ea53f 100644 --- a/smartcross/envs/action/sumo_action_runner.py +++ b/smartcross/envs/action/sumo_action_runner.py @@ -15,7 +15,7 @@ def _init(self, engine: BaseEnv, cfg: Dict) -> None: Overview: init the sumo observation helper with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ # set self._core and other state variable self._engine = engine diff --git a/smartcross/envs/obs/sumo_obs_runner.py b/smartcross/envs/obs/sumo_obs_runner.py index 3ed9fdf..4b077a0 100644 --- a/smartcross/envs/obs/sumo_obs_runner.py +++ b/smartcross/envs/obs/sumo_obs_runner.py @@ -20,7 +20,7 @@ def _init(self, engine: BaseEnv, cfg: dict) -> None: Overview: init the sumo observation helper with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ # set self._core and other state variable self._engine = engine diff --git a/smartcross/envs/reward/sumo_reward.py b/smartcross/envs/reward/sumo_reward.py index 82fa44e..a38c4ac 100644 --- a/smartcross/envs/reward/sumo_reward.py +++ b/smartcross/envs/reward/sumo_reward.py @@ -22,7 +22,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: Overview: init the sumo reward environment with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ self._env = env self._cfg = cfg diff --git a/smartcross/envs/reward/sumo_reward_runner.py b/smartcross/envs/reward/sumo_reward_runner.py index bbce310..914bac6 100644 --- a/smartcross/envs/reward/sumo_reward_runner.py +++ b/smartcross/envs/reward/sumo_reward_runner.py @@ -21,7 +21,7 @@ def _init(self, engine: BaseEnv, cfg: dict) -> None: Overview: init the sumo reward environment with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ self._engine = engine self._core = SumoReward(engine, cfg) diff --git a/smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml b/smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml deleted file mode 100644 index 03f41df..0000000 --- a/smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml +++ /dev/null @@ -1,14490 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml b/smartcross/envs/sumo_arterial7_default_config.yaml similarity index 89% rename from smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml rename to smartcross/envs/sumo_arterial7_default_config.yaml index 8fd2d20..fe493b2 100644 --- a/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml +++ b/smartcross/envs/sumo_arterial7_default_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'rl_arterial_7roads/standard.sumocfg' + sumocfg_path: 'sumo_arterial_7roads/standard.sumocfg' gui: False inference: False dynamic_flow: False diff --git a/smartcross/envs/sumo_arterial7_multi_agent_config.yaml b/smartcross/envs/sumo_arterial7_multi_agent_config.yaml index ddf8fe7..4a49cf1 100644 --- a/smartcross/envs/sumo_arterial7_multi_agent_config.yaml +++ b/smartcross/envs/sumo_arterial7_multi_agent_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'rl_arterial_7roads/standard.sumocfg' + sumocfg_path: 'sumo_arterial_7roads/standard.sumocfg' gui: False inference: False dynamic_flow: True diff --git a/smartcross/envs/rl_arterial_7roads/standard.net.xml b/smartcross/envs/sumo_arterial_7roads/standard.net.xml similarity index 100% rename from smartcross/envs/rl_arterial_7roads/standard.net.xml rename to smartcross/envs/sumo_arterial_7roads/standard.net.xml diff --git a/smartcross/envs/rl_arterial_7roads/standard.sumocfg b/smartcross/envs/sumo_arterial_7roads/standard.sumocfg similarity index 100% rename from smartcross/envs/rl_arterial_7roads/standard.sumocfg rename to smartcross/envs/sumo_arterial_7roads/standard.sumocfg diff --git a/smartcross/envs/sumo_env.py b/smartcross/envs/sumo_env.py index f9504a8..6cf534b 100644 --- a/smartcross/envs/sumo_env.py +++ b/smartcross/envs/sumo_env.py @@ -9,7 +9,7 @@ import traci from sumolib import checkBinary -from ding.envs import BaseEnv, BaseEnvTimestep #, BaseEnvInfo +from ding.envs import BaseEnv, BaseEnvTimestep # , BaseEnvInfo from ding.utils import ENV_REGISTRY from ding.torch_utils import to_ndarray, to_tensor from smartcross.envs.crossing import Crossing diff --git a/smartcross/envs/wj3/detector/detector1_lane_end.add.xml b/smartcross/envs/sumo_wj3/detector/detector1_lane_end.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector1_lane_end.add.xml rename to smartcross/envs/sumo_wj3/detector/detector1_lane_end.add.xml diff --git a/smartcross/envs/wj3/detector/detector1_lane_start.add.xml b/smartcross/envs/sumo_wj3/detector/detector1_lane_start.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector1_lane_start.add.xml rename to smartcross/envs/sumo_wj3/detector/detector1_lane_start.add.xml diff --git a/smartcross/envs/wj3/detector/detector2_length_49_freq_60.add.xml b/smartcross/envs/sumo_wj3/detector/detector2_length_49_freq_60.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector2_length_49_freq_60.add.xml rename to smartcross/envs/sumo_wj3/detector/detector2_length_49_freq_60.add.xml diff --git a/smartcross/envs/wj3/detector/detector2_length_7_freq_1.add.xml b/smartcross/envs/sumo_wj3/detector/detector2_length_7_freq_1.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector2_length_7_freq_1.add.xml rename to smartcross/envs/sumo_wj3/detector/detector2_length_7_freq_1.add.xml diff --git a/smartcross/envs/wj3/detector/detector3.add.xml b/smartcross/envs/sumo_wj3/detector/detector3.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector3.add.xml rename to smartcross/envs/sumo_wj3/detector/detector3.add.xml diff --git a/smartcross/envs/wj3/edge_measure.add.xml b/smartcross/envs/sumo_wj3/edge_measure.add.xml similarity index 100% rename from smartcross/envs/wj3/edge_measure.add.xml rename to smartcross/envs/sumo_wj3/edge_measure.add.xml diff --git a/smartcross/envs/wj3/rl_wj.ini b/smartcross/envs/sumo_wj3/rl_wj.ini similarity index 100% rename from smartcross/envs/wj3/rl_wj.ini rename to smartcross/envs/sumo_wj3/rl_wj.ini diff --git a/smartcross/envs/wj3/rl_wj.net.xml b/smartcross/envs/sumo_wj3/rl_wj.net.xml similarity index 100% rename from smartcross/envs/wj3/rl_wj.net.xml rename to smartcross/envs/sumo_wj3/rl_wj.net.xml diff --git a/smartcross/envs/wj3/rl_wj.sumocfg b/smartcross/envs/sumo_wj3/rl_wj.sumocfg similarity index 100% rename from smartcross/envs/wj3/rl_wj.sumocfg rename to smartcross/envs/sumo_wj3/rl_wj.sumocfg diff --git a/smartcross/envs/wj3/summary.xml b/smartcross/envs/sumo_wj3/summary.xml similarity index 100% rename from smartcross/envs/wj3/summary.xml rename to smartcross/envs/sumo_wj3/summary.xml diff --git a/smartcross/envs/wj3/testflow.rou.xml b/smartcross/envs/sumo_wj3/testflow.rou.xml similarity index 100% rename from smartcross/envs/wj3/testflow.rou.xml rename to smartcross/envs/sumo_wj3/testflow.rou.xml diff --git a/smartcross/envs/wj3/testflow.trip.xml b/smartcross/envs/sumo_wj3/testflow.trip.xml similarity index 100% rename from smartcross/envs/wj3/testflow.trip.xml rename to smartcross/envs/sumo_wj3/testflow.trip.xml diff --git a/smartcross/envs/wj3/testflow.turndefs.xml b/smartcross/envs/sumo_wj3/testflow.turndefs.xml similarity index 100% rename from smartcross/envs/wj3/testflow.turndefs.xml rename to smartcross/envs/sumo_wj3/testflow.turndefs.xml diff --git a/smartcross/envs/sumo_wj3_default_config.yaml b/smartcross/envs/sumo_wj3_default_config.yaml index 6553ef6..f342faa 100644 --- a/smartcross/envs/sumo_wj3_default_config.yaml +++ b/smartcross/envs/sumo_wj3_default_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'wj3/rl_wj.sumocfg' + sumocfg_path: 'sumo_wj3/rl_wj.sumocfg' gui: False inference: False max_episode_steps: 1500 diff --git a/smartcross/envs/sumo_wj3_multi_agent_config.yaml b/smartcross/envs/sumo_wj3_multi_agent_config.yaml index d18bad5..a86dfd9 100644 --- a/smartcross/envs/sumo_wj3_multi_agent_config.yaml +++ b/smartcross/envs/sumo_wj3_multi_agent_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'wj3/rl_wj.sumocfg' + sumocfg_path: 'sumo_wj3/rl_wj.sumocfg' gui: False inference: False max_episode_steps: 1500 diff --git a/smartcross/envs/tests/test_sumo_env.py b/smartcross/envs/tests/test_sumo_env.py index bb6fd4b..5c3b6d2 100644 --- a/smartcross/envs/tests/test_sumo_env.py +++ b/smartcross/envs/tests/test_sumo_env.py @@ -20,17 +20,16 @@ def setup_config(): class TestSumoEnv: def get_random_action(self, action_space): - min, max, shape = action_space.value['min'], action_space.value['max'], action_space.shape - action = np.random.randint(min, max, shape) + action = action_space.sample() action = [torch.LongTensor([v]) for v in action] return action def test_naive(self, setup_config): env = SumoEnv(setup_config) obs = env.reset() - assert (len(obs) == env.info().obs_space.shape) + assert (len(obs) == env.observation_space.shape[0]) for i in range(10): - action = self.get_random_action(env.info().act_space) + action = self.get_random_action(env.action_space) timestep = env.step(action) print(timestep.reward) print('step {} with action {}'.format(i, action))