diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 5f706445..958de340 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -12,114 +12,89 @@ on:
jobs:
setup:
+ name: Setup
runs-on: ubuntu-latest
+ outputs:
+ cache-hit: ${{ steps.setup_uv.outputs.cache-hit }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- - name: Set up Python
- uses: actions/setup-python@v5
+ - name: Install uv (+ enable cache)
+ id: setup_uv
+ uses: astral-sh/setup-uv@v6
with:
- python-version: 3.12
+ enable-cache: true
- - name: Cache pip
- uses: actions/cache@v4
- with:
- path: ~/.cache/pip
- key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
- restore-keys: |
- ${{ runner.os }}-pip-
+ - name: Sync dependencies
+ run: uv sync --locked --dev
- - name: Cache virtual environment
- uses: actions/cache@v4
- with:
- path: .venv
- key: ${{ runner.os }}-venv-${{ hashFiles('**/poetry.lock') }}
- restore-keys: |
- ${{ runner.os }}-venv-
-
- - name: Install dependencies
- run: |
- python -m venv .venv
- source .venv/bin/activate
- pip install --upgrade pip
- pip install poetry
- poetry install
+ - name: Prune uv cache (optimized for CI)
+ run: uv cache prune --ci
ruff-format:
+ name: ruff-format
needs: setup
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- - name: Restore virtual environment cache
- uses: actions/cache@v4
+ - name: Install uv + restore cache
+ uses: astral-sh/setup-uv@v6
with:
- path: .venv
- key: ${{ runner.os }}-venv-${{ hashFiles('**/poetry.lock') }}
- restore-keys: |
- ${{ runner.os }}-venv-
-
- - name: Check ruff version
- run: |
- source .venv/bin/activate
- poetry run ruff --version
+ enable-cache: true
- - name: Run ruff format check
- run: |
- source .venv/bin/activate
- poetry run ruff format --check .
+ - name: Check ruff formatting
+ run: uv run ruff format --check .
ruff-lint:
+ name: ruff-lint
needs: setup
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- - name: Restore virtual environment cache
- uses: actions/cache@v4
+ - name: Install uv + restore cache
+ uses: astral-sh/setup-uv@v6
with:
- path: .venv
- key: ${{ runner.os }}-venv-${{ hashFiles('**/poetry.lock') }}
- restore-keys: |
- ${{ runner.os }}-venv-
-
- - name: Set up Python environment
- run: source .venv/bin/activate
-
- - name: Check ruff version
- run: |
- source .venv/bin/activate
- poetry run ruff --version
+ enable-cache: true
- name: Run ruff lint
- run: |
- source .venv/bin/activate
- poetry run ruff check --output-format=github .
+ run: uv run ruff check --output-format=github .
mypy-type-check:
+ name: mypy-type-check
needs: setup
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- - name: Restore virtual environment cache
- uses: actions/cache@v4
+ - name: Install uv + restore cache
+ uses: astral-sh/setup-uv@v6
+ with:
+ enable-cache: true
+
+ - name: Run mypy
+ run: uv run --frozen mypy .
+
+ publish:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
with:
- path: .venv
- key: ${{ runner.os }}-venv-${{ hashFiles('**/poetry.lock') }}
- restore-keys: |
- ${{ runner.os }}-venv-
-
- - name: Check mypy version
- run: |
- source .venv/bin/activate
- poetry run mypy --version
-
- - name: Run mypy type check
- run: |
- source .venv/bin/activate
- poetry run mypy .
+ java-version: "17"
+ distribution: "temurin"
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v3
+
+ - name: Publish package
+ run: cd java && ./gradlew publish
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/document.yaml b/.github/workflows/document.yaml
new file mode 100644
index 00000000..a70bca90
--- /dev/null
+++ b/.github/workflows/document.yaml
@@ -0,0 +1,70 @@
+name: document
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ - develop
+ paths:
+ - "docs/**"
+ pull_request:
+ branches:
+ - main
+ - develop
+ paths:
+ - "docs/**"
+
+concurrency:
+ group: "pages"
+ cancel-in-progress: true
+
+permissions:
+ contents: write
+ pull-requests: write
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: 3.12
+
+ - name: Cache virtual environment
+ id: cached-virtualenv
+ uses: actions/cache@v4
+ with:
+ path: .venv
+ key: ${{ runner.os }}-venv-${{ hashFiles('**/uv.lock') }}
+
+ - name: Install dependencies
+ if: steps.cached-virtualenv.outputs.cache-hit != 'true'
+ run: |
+ python -m venv .venv
+ source .venv/bin/activate
+ pip install --upgrade pip
+ pip install uv
+ uv sync
+
+ - name: Build documentation
+ run: |
+ source .venv/bin/activate
+ cd docs
+ python build.py
+
+ - name: Redirect to the en documentation
+ run: |
+ username=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 1)
+ repository=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 2)
+ echo '' > ./docs/pages/index.html
+
+ - name: Deploy documentation
+ uses: peaceiris/actions-gh-pages@v4
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./docs/pages
diff --git a/.gitignore b/.gitignore
index 5268a8be..ab0dc67d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -159,7 +159,17 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
-#.idea/
+.idea/
# ruff
.ruff_cache/
+
+# vscode
+.vscode/
+
+# MacOS
+.DS_Store
+
+# ADF
+agent.log*
+!java/lib/src/main/java/adf_core_python/core/agent/precompute
diff --git a/.python-version b/.python-version
new file mode 100644
index 00000000..24ee5b1b
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.13
diff --git a/README.md b/README.md
index d0692ebb..d0f490a8 100644
--- a/README.md
+++ b/README.md
@@ -1,26 +1,41 @@
# adf-core-python
+## Documentation
+
+[ADF Core Python Documentation](https://adf-python.github.io/adf-core-python/)
+
## Development Environment
### Prerequisites
-- Python (3.12 or higher)
-- Poetry (1.8.3 or higher)
+- Python (3.13 or higher)
+- uv (0.8.2 or higher)
### Installation
```bash
-poetry install
+uv sync
+```
+
+### Run Agent
+
+```bash
+uv run python ./adf_core_python/launcher.py
+
+# get help
+uv run python ./adf_core_python/launcher.py -h
```
### Build
```bash
-poetry build
+uv build
```
### Pre Commit
```bash
-poetry run task precommit
+uv run ruff format .
+uv run ruff check .
+uv run mypy .
```
diff --git a/adf_core_python/main.py b/adf_core_python/main.py
deleted file mode 100644
index 7df869a1..00000000
--- a/adf_core_python/main.py
+++ /dev/null
@@ -1 +0,0 @@
-print("Hello, World!")
diff --git a/config/development.json b/config/development.json
new file mode 100644
index 00000000..d0ae716d
--- /dev/null
+++ b/config/development.json
@@ -0,0 +1,3 @@
+{
+ "test": "test"
+}
diff --git a/config/launcher.yaml b/config/launcher.yaml
new file mode 100644
index 00000000..7423a6c3
--- /dev/null
+++ b/config/launcher.yaml
@@ -0,0 +1,44 @@
+kernel:
+ host: localhost
+ port: 27931
+
+gateway:
+ host: localhost
+ port: 27941
+
+team:
+ name: AIT-Rescue
+
+adf:
+ launcher:
+ precompute: false
+ debug:
+ flag: false
+ agent:
+ moduleconfig:
+ filename: config/module.yaml
+ precompute:
+ dir_name: precompute
+
+ develop:
+ flag: true
+ filename: config/development.json
+
+ team:
+ platoon:
+ ambulance:
+ count: 100
+ fire:
+ count: 100
+ police:
+ count: 100
+ office:
+ ambulance:
+ count: 5
+ fire:
+ count: 5
+ police:
+ count: 5
+
+ gateway:
+ flag: false
diff --git a/config/module.yaml b/config/module.yaml
new file mode 100644
index 00000000..7d00fd80
--- /dev/null
+++ b/config/module.yaml
@@ -0,0 +1,85 @@
+DefaultTacticsAmbulanceTeam:
+ HumanDetector: adf_core_python.implement.module.complex.default_human_detector.DefaultHumanDetector
+ Search: adf_core_python.implement.module.complex.default_search.DefaultSearch
+ ExtendActionTransport: adf_core_python.implement.action.default_extend_action_transport.DefaultExtendActionTransport
+ ExtendActionMove: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove
+ CommandExecutorAmbulance: adf_core_python.implement.centralized.default_command_executor_ambulance.DefaultCommandExecutorAmbulance
+ CommandExecutorScout: adf_core_python.implement.centralized.default_command_executor_scout.DefaultCommandExecutorScout
+
+DefaultTacticsFireBrigade:
+ HumanDetector: adf_core_python.implement.module.complex.default_human_detector.DefaultHumanDetector
+ Search: adf_core_python.implement.module.complex.default_search.DefaultSearch
+ ExtendActionRescue: adf_core_python.implement.action.default_extend_action_rescue.DefaultExtendActionRescue
+ ExtendActionMove: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove
+ CommandExecutorFire: adf_core_python.implement.centralized.default_command_executor_fire.DefaultCommandExecutorFire
+ CommandExecutorScout: adf_core_python.implement.centralized.default_command_executor_scout.DefaultCommandExecutorScout
+
+DefaultTacticsPoliceForce:
+ RoadDetector: adf_core_python.implement.module.complex.default_road_detector.DefaultRoadDetector
+ Search: adf_core_python.implement.module.complex.default_search.DefaultSearch
+ ExtendActionClear: adf_core_python.implement.action.default_extend_action_clear.DefaultExtendActionClear
+ ExtendActionMove: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove
+ CommandExecutorPolice: adf_core_python.implement.centralized.default_command_executor_police.DefaultCommandExecutorPolice
+ CommandExecutorScout: adf_core_python.implement.centralized.default_command_executor_scout.DefaultCommandExecutorScout
+
+DefaultTacticsAmbulanceCenter:
+ TargetAllocator: adf_core_python.implement.module.complex.default_ambulance_target_allocator.DefaultAmbulanceTargetAllocator
+ CommandPicker: adf_core_python.implement.centralized.default_command_picker_ambulance.DefaultCommandPickerAmbulance
+
+DefaultTacticsFireStation:
+ TargetAllocator: adf_core_python.implement.module.complex.default_fire_target_allocator.DefaultFireTargetAllocator
+ CommandPicker: adf_core_python.implement.centralized.default_command_picker_fire.DefaultCommandPickerFire
+
+DefaultTacticsPoliceOffice:
+ TargetAllocator: adf_core_python.implement.module.complex.default_police_target_allocator.DefaultPoliceTargetAllocator
+ CommandPicker: adf_core_python.implement.centralized.default_command_picker_police.DefaultCommandPickerPolice
+
+DefaultSearch:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+ Clustering: adf_core_python.implement.module.algorithm.k_means_clustering.KMeansClustering
+
+DefaultRoadDetector:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+
+DefaultHumanDetector:
+ Clustering: adf_core_python.implement.module.algorithm.k_means_clustering.KMeansClustering
+
+DefaultExtendActionClear:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+
+DefaultExtendActionRescue:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+
+DefaultExtendActionMove:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+
+DefaultExtendActionTransport:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+
+DefaultCommandExecutorAmbulance:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+ ExtendActionTransport: adf_core_python.implement.action.default_extend_action_transport.DefaultExtendActionTransport
+ ExtendActionMove: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove
+
+DefaultCommandExecutorFire:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+ ExtendActionFireRescue: adf_core_python.implement.action.default_extend_action_rescue.DefaultExtendActionRescue
+ ExtendActionMove: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove
+
+DefaultCommandExecutorPolice:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+ ExtendActionClear: adf_core_python.implement.action.default_extend_action_clear.DefaultExtendActionClear
+ ExtendActionMove: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove
+
+DefaultCommandExecutorScout:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+
+DefaultCommandExecutorScoutPolice:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+ ExtendActionClear: adf_core_python.implement.action.default_extend_action_clear.DefaultExtendActionClear
+
+MessageManager:
+ PlatoonChannelSubscriber: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber
+ CenterChannelSubscriber: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber
+ PlatoonMessageCoordinator: adf_core_python.implement.module.communication.default_message_coordinator.DefaultMessageCoordinator
+ CenterMessageCoordinator: adf_core_python.implement.module.communication.default_message_coordinator.DefaultMessageCoordinator
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000..be436389
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,2 @@
+source/adf_core_python.*
+pages
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 00000000..d0c3cbf1
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 00000000..4d78f237
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,8 @@
+# sphinx-documentation
+
+## Generate documentation
+
+```bash
+sphinx-apidoc -f -o ./docs/source/adf_core_python ./adf_core_python
+sphinx-build -M html ./docs/source/adf_core_python ./docs/build -a
+```
diff --git a/docs/build.py b/docs/build.py
new file mode 100644
index 00000000..920d1d21
--- /dev/null
+++ b/docs/build.py
@@ -0,0 +1,43 @@
+import os
+import subprocess
+import yaml
+
+# a single build step, which keeps conf.py and versions.yaml at the main branch
+# in generall we use environment variables to pass values to conf.py, see below
+# and runs the build as we did locally
+def build_doc(version, language, tag):
+ os.environ["current_version"] = version
+ os.environ["current_language"] = language
+ subprocess.run("git checkout " + tag, shell=True)
+ subprocess.run("git checkout main -- conf.py", shell=True)
+ subprocess.run("git checkout main -- versions.yaml", shell=True)
+ subprocess.run("doxygen Doxyfile", shell=True)
+ os.environ['SPHINXOPTS'] = "-D language='{}'".format(language)
+ subprocess.run("make html", shell=True)
+
+# a move dir method because we run multiple builds and bring the html folders to a
+# location which we then push to github pages
+def move_dir(src, dst):
+ subprocess.run(["mkdir", "-p", dst])
+ subprocess.run("mv "+src+'* ' + dst, shell=True)
+
+# to separate a single local build from all builds we have a flag, see conf.py
+os.environ["build_all_docs"] = str(True)
+os.environ["pages_root"] = "https://adf-python.github.io/adf-core-python/"
+
+# manually the main branch build in the current supported languages
+build_doc("latest", "en", "main")
+move_dir("./build/html/", "./pages/en")
+build_doc("latest", "ja", "main")
+move_dir("./build/html/", "./pages/ja/")
+
+# reading the yaml file
+with open("versions.yaml", "r") as yaml_file:
+ docs = yaml.safe_load(yaml_file)
+
+# and looping over all values to call our build with version, language and its tag
+# for version, details in docs.items():
+# tag = details.get('tag', '')
+# for language in details.get('languages', []):
+# build_doc(version, language, version)
+# move_dir("./build/html/", "./pages/"+version+'/'+language+'/')
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 00000000..747ffb7b
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/source/_static/.gitkeep b/docs/source/_static/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/source/_templates/versions.html b/docs/source/_templates/versions.html
new file mode 100644
index 00000000..0b3a1c81
--- /dev/null
+++ b/docs/source/_templates/versions.html
@@ -0,0 +1,96 @@
+
+
+
+
+ Language: {{ current_language }}
+
+
+
+ {% if languages|length >= 1 %}
+
+ - {{ _('Languages') }}
+ -
+ {% for the_language, url in languages %}
+ {{ the_language }}
+ {% endfor %}
+
+
+ {% endif %}
+
+
+
+
+
diff --git a/docs/source/adf_core_python/adf_core_python.cli.rst b/docs/source/adf_core_python/adf_core_python.cli.rst
new file mode 100644
index 00000000..202435d6
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.cli.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.cli package
+=============================
+
+Submodules
+----------
+
+adf\_core\_python.cli.cli module
+--------------------------------
+
+.. automodule:: adf_core_python.cli.cli
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.cli
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.action.ambulance.rst b/docs/source/adf_core_python/adf_core_python.core.agent.action.ambulance.rst
new file mode 100644
index 00000000..6850cac0
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.action.ambulance.rst
@@ -0,0 +1,37 @@
+adf\_core\_python.core.agent.action.ambulance package
+=====================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.action.ambulance.action\_load module
+-----------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.ambulance.action_load
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.action.ambulance.action\_rescue module
+-------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.ambulance.action_rescue
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.action.ambulance.action\_unload module
+-------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.ambulance.action_unload
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.action.ambulance
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.action.common.rst b/docs/source/adf_core_python/adf_core_python.core.agent.action.common.rst
new file mode 100644
index 00000000..28fdba8d
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.action.common.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.core.agent.action.common package
+==================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.action.common.action\_move module
+--------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.common.action_move
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.action.common.action\_rest module
+--------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.common.action_rest
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.action.common
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.action.fire.rst b/docs/source/adf_core_python/adf_core_python.core.agent.action.fire.rst
new file mode 100644
index 00000000..c3fe550b
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.action.fire.rst
@@ -0,0 +1,37 @@
+adf\_core\_python.core.agent.action.fire package
+================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.action.fire.action\_extinguish module
+------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.fire.action_extinguish
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.action.fire.action\_refill module
+--------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.fire.action_refill
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.action.fire.action\_rescue module
+--------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.fire.action_rescue
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.action.fire
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.action.police.rst b/docs/source/adf_core_python/adf_core_python.core.agent.action.police.rst
new file mode 100644
index 00000000..c3d899c1
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.action.police.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.core.agent.action.police package
+==================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.action.police.action\_clear module
+---------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.police.action_clear
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.action.police.action\_clear\_area module
+---------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.police.action_clear_area
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.action.police
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.action.rst b/docs/source/adf_core_python/adf_core_python.core.agent.action.rst
new file mode 100644
index 00000000..fbb4898c
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.action.rst
@@ -0,0 +1,32 @@
+adf\_core\_python.core.agent.action package
+===========================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.agent.action.ambulance
+ adf_core_python.core.agent.action.common
+ adf_core_python.core.agent.action.fire
+ adf_core_python.core.agent.action.police
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.action.action module
+-------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.action.action
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.action
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.communication.rst b/docs/source/adf_core_python/adf_core_python.core.agent.communication.rst
new file mode 100644
index 00000000..8b8db00b
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.communication.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.core.agent.communication package
+==================================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.agent.communication.standard
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.communication.message\_manager module
+------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.message_manager
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.communication
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.centralized.rst b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.centralized.rst
new file mode 100644
index 00000000..45fa534e
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.centralized.rst
@@ -0,0 +1,53 @@
+adf\_core\_python.core.agent.communication.standard.bundle.centralized package
+==============================================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.communication.standard.bundle.centralized.command\_ambulance module
+------------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.centralized.command_ambulance
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.centralized.command\_fire module
+-------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.centralized.command_fire
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.centralized.command\_police module
+---------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.centralized.command_police
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.centralized.command\_scout module
+--------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.centralized.command_scout
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.centralized.message\_report module
+---------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.centralized.message_report
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.centralized
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.information.rst b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.information.rst
new file mode 100644
index 00000000..1866f085
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.information.rst
@@ -0,0 +1,61 @@
+adf\_core\_python.core.agent.communication.standard.bundle.information package
+==============================================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.communication.standard.bundle.information.message\_ambulance\_team module
+------------------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information.message_ambulance_team
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.information.message\_building module
+-----------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information.message_building
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.information.message\_civilian module
+-----------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information.message_civilian
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.information.message\_fire\_brigade module
+----------------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information.message_fire_brigade
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.information.message\_police\_force module
+----------------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information.message_police_force
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.information.message\_road module
+-------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information.message_road
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.information
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.rst b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.rst
new file mode 100644
index 00000000..e5a03c50
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.bundle.rst
@@ -0,0 +1,38 @@
+adf\_core\_python.core.agent.communication.standard.bundle package
+==================================================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.agent.communication.standard.bundle.centralized
+ adf_core_python.core.agent.communication.standard.bundle.information
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.communication.standard.bundle.standard\_message module
+-----------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.standard_message
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.bundle.standard\_message\_priority module
+---------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle.standard_message_priority
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.bundle
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.rst b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.rst
new file mode 100644
index 00000000..d3fd611e
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.rst
@@ -0,0 +1,30 @@
+adf\_core\_python.core.agent.communication.standard package
+===========================================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.agent.communication.standard.bundle
+ adf_core_python.core.agent.communication.standard.utility
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.communication.standard.standard\_communication\_module module
+------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.standard_communication_module
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.utility.rst b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.utility.rst
new file mode 100644
index 00000000..afb37b3f
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.communication.standard.utility.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.core.agent.communication.standard.utility package
+===================================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.communication.standard.utility.apply\_to\_world\_info module
+-----------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.utility.apply_to_world_info
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.communication.standard.utility.bitarray\_with\_exits\_flag module
+----------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.communication.standard.utility
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.config.rst b/docs/source/adf_core_python/adf_core_python.core.agent.config.rst
new file mode 100644
index 00000000..baf652d5
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.config.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.agent.config package
+===========================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.config.module\_config module
+---------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.config.module_config
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.config
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.develop.rst b/docs/source/adf_core_python/adf_core_python.core.agent.develop.rst
new file mode 100644
index 00000000..3ab6ca9f
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.develop.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.agent.develop package
+============================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.develop.develop\_data module
+---------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.develop.develop_data
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.develop
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.info.rst b/docs/source/adf_core_python/adf_core_python.core.agent.info.rst
new file mode 100644
index 00000000..9bf3a658
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.info.rst
@@ -0,0 +1,37 @@
+adf\_core\_python.core.agent.info package
+=========================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.info.agent\_info module
+----------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.info.agent_info
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.info.scenario\_info module
+-------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.info.scenario_info
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.info.world\_info module
+----------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.info.world_info
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.info
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.module.rst b/docs/source/adf_core_python/adf_core_python.core.agent.module.rst
new file mode 100644
index 00000000..a9711493
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.module.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.agent.module package
+===========================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.module.module\_manager module
+----------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.module.module_manager
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.module
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.platoon.rst b/docs/source/adf_core_python/adf_core_python.core.agent.platoon.rst
new file mode 100644
index 00000000..ce60c8f6
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.platoon.rst
@@ -0,0 +1,45 @@
+adf\_core\_python.core.agent.platoon package
+============================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.platoon.platoon module
+---------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.platoon.platoon
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.platoon.platoon\_ambulance module
+--------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.platoon.platoon_ambulance
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.platoon.platoon\_fire module
+---------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.platoon.platoon_fire
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.agent.platoon.platoon\_police module
+-----------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.platoon.platoon_police
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.platoon
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.precompute.rst b/docs/source/adf_core_python/adf_core_python.core.agent.precompute.rst
new file mode 100644
index 00000000..1e1c752d
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.precompute.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.agent.precompute package
+===============================================
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.precompute.precompute\_data module
+---------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.agent.precompute.precompute_data
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent.precompute
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.agent.rst b/docs/source/adf_core_python/adf_core_python.core.agent.rst
new file mode 100644
index 00000000..c62ed6d8
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.agent.rst
@@ -0,0 +1,36 @@
+adf\_core\_python.core.agent package
+====================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.agent.action
+ adf_core_python.core.agent.communication
+ adf_core_python.core.agent.config
+ adf_core_python.core.agent.develop
+ adf_core_python.core.agent.info
+ adf_core_python.core.agent.module
+ adf_core_python.core.agent.platoon
+ adf_core_python.core.agent.precompute
+
+Submodules
+----------
+
+adf\_core\_python.core.agent.agent module
+-----------------------------------------
+
+.. automodule:: adf_core_python.core.agent.agent
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.agent
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.action.rst b/docs/source/adf_core_python/adf_core_python.core.component.action.rst
new file mode 100644
index 00000000..41a180b4
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.action.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.component.action package
+===============================================
+
+Submodules
+----------
+
+adf\_core\_python.core.component.action.extend\_action module
+-------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.action.extend_action
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component.action
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.communication.rst b/docs/source/adf_core_python/adf_core_python.core.component.communication.rst
new file mode 100644
index 00000000..92879f4a
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.communication.rst
@@ -0,0 +1,45 @@
+adf\_core\_python.core.component.communication package
+======================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.component.communication.channel\_subscriber module
+-------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.communication.channel_subscriber
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.communication.communication\_message module
+----------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.communication.communication_message
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.communication.communication\_module module
+---------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.communication.communication_module
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.communication.message\_coordinator module
+--------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.communication.message_coordinator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component.communication
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.module.algorithm.rst b/docs/source/adf_core_python/adf_core_python.core.component.module.algorithm.rst
new file mode 100644
index 00000000..6ad25d3f
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.module.algorithm.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.core.component.module.algorithm package
+=========================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.component.module.algorithm.clustering module
+-------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.algorithm.clustering
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.algorithm.path\_planning module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.algorithm.path_planning
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component.module.algorithm
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.module.complex.rst b/docs/source/adf_core_python/adf_core_python.core.component.module.complex.rst
new file mode 100644
index 00000000..86de2b82
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.module.complex.rst
@@ -0,0 +1,77 @@
+adf\_core\_python.core.component.module.complex package
+=======================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.component.module.complex.ambulance\_target\_allocator module
+-----------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.ambulance_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.fire\_target\_allocator module
+------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.fire_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.human\_detector module
+----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.human_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.police\_target\_allocator module
+--------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.police_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.road\_detector module
+---------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.road_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.search module
+-------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.search
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.target\_allocator module
+------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.module.complex.target\_detector module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.complex.target_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component.module.complex
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.module.rst b/docs/source/adf_core_python/adf_core_python.core.component.module.rst
new file mode 100644
index 00000000..f07feacf
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.module.rst
@@ -0,0 +1,30 @@
+adf\_core\_python.core.component.module package
+===============================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.component.module.algorithm
+ adf_core_python.core.component.module.complex
+
+Submodules
+----------
+
+adf\_core\_python.core.component.module.abstract\_module module
+---------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.module.abstract_module
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component.module
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.rst b/docs/source/adf_core_python/adf_core_python.core.component.rst
new file mode 100644
index 00000000..c33224e9
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.rst
@@ -0,0 +1,32 @@
+adf\_core\_python.core.component package
+========================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.component.action
+ adf_core_python.core.component.communication
+ adf_core_python.core.component.module
+ adf_core_python.core.component.tactics
+
+Submodules
+----------
+
+adf\_core\_python.core.component.abstract\_loader module
+--------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.abstract_loader
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.component.tactics.rst b/docs/source/adf_core_python/adf_core_python.core.component.tactics.rst
new file mode 100644
index 00000000..d640551d
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.component.tactics.rst
@@ -0,0 +1,77 @@
+adf\_core\_python.core.component.tactics package
+================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.component.tactics.tactics\_agent module
+--------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_agent
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_ambulance\_center module
+--------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_ambulance_center
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_ambulance\_team module
+------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_ambulance_team
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_center module
+---------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_center
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_fire\_brigade module
+----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_fire_brigade
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_fire\_station module
+----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_fire_station
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_police\_force module
+----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_police_force
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.component.tactics.tactics\_police\_office module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.component.tactics.tactics_police_office
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.component.tactics
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.config.rst b/docs/source/adf_core_python/adf_core_python.core.config.rst
new file mode 100644
index 00000000..5806b37c
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.config.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.config package
+=====================================
+
+Submodules
+----------
+
+adf\_core\_python.core.config.config module
+-------------------------------------------
+
+.. automodule:: adf_core_python.core.config.config
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.config
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.algorithm.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.algorithm.rst
new file mode 100644
index 00000000..2197aef2
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.algorithm.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.core.gateway.component.module.algorithm package
+=================================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.gateway.component.module.algorithm.gateway\_clustering module
+------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.algorithm.gateway_clustering
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.algorithm.gateway\_path\_planning module
+----------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.algorithm.gateway_path_planning
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.algorithm
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.complex.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.complex.rst
new file mode 100644
index 00000000..819f4acf
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.complex.rst
@@ -0,0 +1,77 @@
+adf\_core\_python.core.gateway.component.module.complex package
+===============================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_ambulance\_target\_allocator module
+----------------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_ambulance_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_fire\_target\_allocator module
+-----------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_fire_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_human\_detector module
+---------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_human_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_police\_target\_allocator module
+-------------------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_police_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_road\_detector module
+--------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_road_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_search module
+------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_search
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_target\_allocator module
+-----------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.component.module.complex.gateway\_target\_detector module
+----------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex.gateway_target_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.complex
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.rst
new file mode 100644
index 00000000..4d69a966
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.component.module.rst
@@ -0,0 +1,30 @@
+adf\_core\_python.core.gateway.component.module package
+=======================================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.gateway.component.module.algorithm
+ adf_core_python.core.gateway.component.module.complex
+
+Submodules
+----------
+
+adf\_core\_python.core.gateway.component.module.gateway\_abstract\_module module
+--------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.component.module.gateway_abstract_module
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway.component.module
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.component.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.component.rst
new file mode 100644
index 00000000..29a66e8c
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.component.rst
@@ -0,0 +1,18 @@
+adf\_core\_python.core.gateway.component package
+================================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.gateway.component.module
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway.component
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.message.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.message.rst
new file mode 100644
index 00000000..265575ac
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.message.rst
@@ -0,0 +1,77 @@
+adf\_core\_python.core.gateway.message package
+==============================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.gateway.message.urn
+
+Submodules
+----------
+
+adf\_core\_python.core.gateway.message.am\_agent module
+-------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.am_agent
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.message.am\_exec module
+------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.am_exec
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.message.am\_module module
+--------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.am_module
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.message.am\_update module
+--------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.am_update
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.message.ma\_exec\_response module
+----------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.ma_exec_response
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.message.ma\_module\_response module
+------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.ma_module_response
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.message.moduleMessageFactory module
+------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.moduleMessageFactory
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway.message
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.message.urn.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.message.urn.rst
new file mode 100644
index 00000000..fa3e1e85
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.message.urn.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.gateway.message.urn package
+==================================================
+
+Submodules
+----------
+
+adf\_core\_python.core.gateway.message.urn.urn module
+-----------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.message.urn.urn
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway.message.urn
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.gateway.rst b/docs/source/adf_core_python/adf_core_python.core.gateway.rst
new file mode 100644
index 00000000..ca47556e
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.gateway.rst
@@ -0,0 +1,54 @@
+adf\_core\_python.core.gateway package
+======================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.gateway.component
+ adf_core_python.core.gateway.message
+
+Submodules
+----------
+
+adf\_core\_python.core.gateway.gateway\_agent module
+----------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.gateway_agent
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.gateway\_launcher module
+-------------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.gateway_launcher
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.gateway\_module module
+-----------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.gateway_module
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.gateway.module\_dict module
+--------------------------------------------------
+
+.. automodule:: adf_core_python.core.gateway.module_dict
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.gateway
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.launcher.connect.rst b/docs/source/adf_core_python/adf_core_python.core.launcher.connect.rst
new file mode 100644
index 00000000..63501ff1
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.launcher.connect.rst
@@ -0,0 +1,85 @@
+adf\_core\_python.core.launcher.connect package
+===============================================
+
+Submodules
+----------
+
+adf\_core\_python.core.launcher.connect.component\_launcher module
+------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.component_launcher
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connection module
+---------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connection
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector module
+--------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector\_ambulance\_center module
+---------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector_ambulance_center
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector\_ambulance\_team module
+-------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector_ambulance_team
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector\_fire\_brigade module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector_fire_brigade
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector\_fire\_station module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector_fire_station
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector\_police\_force module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector_police_force
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.connect.connector\_police\_office module
+------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.connect.connector_police_office
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.launcher.connect
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.launcher.rst b/docs/source/adf_core_python/adf_core_python.core.launcher.rst
new file mode 100644
index 00000000..e93773be
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.launcher.rst
@@ -0,0 +1,37 @@
+adf\_core\_python.core.launcher package
+=======================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.launcher.connect
+
+Submodules
+----------
+
+adf\_core\_python.core.launcher.agent\_launcher module
+------------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.agent_launcher
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.core.launcher.config\_key module
+--------------------------------------------------
+
+.. automodule:: adf_core_python.core.launcher.config_key
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.launcher
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.logger.rst b/docs/source/adf_core_python/adf_core_python.core.logger.rst
new file mode 100644
index 00000000..a0bf1f5b
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.logger.rst
@@ -0,0 +1,21 @@
+adf\_core\_python.core.logger package
+=====================================
+
+Submodules
+----------
+
+adf\_core\_python.core.logger.logger module
+-------------------------------------------
+
+.. automodule:: adf_core_python.core.logger.logger
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core.logger
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.core.rst b/docs/source/adf_core_python/adf_core_python.core.rst
new file mode 100644
index 00000000..78f49554
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.core.rst
@@ -0,0 +1,23 @@
+adf\_core\_python.core package
+==============================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.core.agent
+ adf_core_python.core.component
+ adf_core_python.core.config
+ adf_core_python.core.gateway
+ adf_core_python.core.launcher
+ adf_core_python.core.logger
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.core
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.action.rst b/docs/source/adf_core_python/adf_core_python.implement.action.rst
new file mode 100644
index 00000000..e26c2e67
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.action.rst
@@ -0,0 +1,45 @@
+adf\_core\_python.implement.action package
+==========================================
+
+Submodules
+----------
+
+adf\_core\_python.implement.action.default\_extend\_action\_clear module
+------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.action.default_extend_action_clear
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.action.default\_extend\_action\_move module
+-----------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.action.default_extend_action_move
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.action.default\_extend\_action\_rescue module
+-------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.action.default_extend_action_rescue
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.action.default\_extend\_action\_transport module
+----------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.action.default_extend_action_transport
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement.action
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.module.algorithm.rst b/docs/source/adf_core_python/adf_core_python.implement.module.algorithm.rst
new file mode 100644
index 00000000..ce3486d2
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.module.algorithm.rst
@@ -0,0 +1,37 @@
+adf\_core\_python.implement.module.algorithm package
+====================================================
+
+Submodules
+----------
+
+adf\_core\_python.implement.module.algorithm.a\_star\_path\_planning module
+---------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.algorithm.a_star_path_planning
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.algorithm.dijkstra\_path\_planning module
+----------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.algorithm.dijkstra_path_planning
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.algorithm.k\_means\_clustering module
+------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.algorithm.k_means_clustering
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement.module.algorithm
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.module.communication.rst b/docs/source/adf_core_python/adf_core_python.implement.module.communication.rst
new file mode 100644
index 00000000..bca31007
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.module.communication.rst
@@ -0,0 +1,29 @@
+adf\_core\_python.implement.module.communication package
+========================================================
+
+Submodules
+----------
+
+adf\_core\_python.implement.module.communication.default\_channel\_subscriber module
+------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.communication.default_channel_subscriber
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.communication.default\_message\_coordinator module
+-------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.communication.default_message_coordinator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement.module.communication
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.module.complex.rst b/docs/source/adf_core_python/adf_core_python.implement.module.complex.rst
new file mode 100644
index 00000000..7c28aa18
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.module.complex.rst
@@ -0,0 +1,61 @@
+adf\_core\_python.implement.module.complex package
+==================================================
+
+Submodules
+----------
+
+adf\_core\_python.implement.module.complex.default\_ambulance\_target\_allocator module
+---------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.complex.default_ambulance_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.complex.default\_fire\_target\_allocator module
+----------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.complex.default_fire_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.complex.default\_human\_detector module
+--------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.complex.default_human_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.complex.default\_police\_target\_allocator module
+------------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.complex.default_police_target_allocator
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.complex.default\_road\_detector module
+-------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.complex.default_road_detector
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.module.complex.default\_search module
+-----------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.module.complex.default_search
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement.module.complex
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.module.rst b/docs/source/adf_core_python/adf_core_python.implement.module.rst
new file mode 100644
index 00000000..12058ced
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.module.rst
@@ -0,0 +1,20 @@
+adf\_core\_python.implement.module package
+==========================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.implement.module.algorithm
+ adf_core_python.implement.module.communication
+ adf_core_python.implement.module.complex
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement.module
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.rst b/docs/source/adf_core_python/adf_core_python.implement.rst
new file mode 100644
index 00000000..83e213ce
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.rst
@@ -0,0 +1,31 @@
+adf\_core\_python.implement package
+===================================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.implement.action
+ adf_core_python.implement.module
+ adf_core_python.implement.tactics
+
+Submodules
+----------
+
+adf\_core\_python.implement.default\_loader module
+--------------------------------------------------
+
+.. automodule:: adf_core_python.implement.default_loader
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.implement.tactics.rst b/docs/source/adf_core_python/adf_core_python.implement.tactics.rst
new file mode 100644
index 00000000..8076aea9
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.implement.tactics.rst
@@ -0,0 +1,61 @@
+adf\_core\_python.implement.tactics package
+===========================================
+
+Submodules
+----------
+
+adf\_core\_python.implement.tactics.default\_tactics\_ambulance\_center module
+------------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.tactics.default_tactics_ambulance_center
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.tactics.default\_tactics\_ambulance\_team module
+----------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.tactics.default_tactics_ambulance_team
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.tactics.default\_tactics\_fire\_brigade module
+--------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.tactics.default_tactics_fire_brigade
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.tactics.default\_tactics\_fire\_station module
+--------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.tactics.default_tactics_fire_station
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.tactics.default\_tactics\_police\_force module
+--------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.tactics.default_tactics_police_force
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+adf\_core\_python.implement.tactics.default\_tactics\_police\_office module
+---------------------------------------------------------------------------
+
+.. automodule:: adf_core_python.implement.tactics.default_tactics_police_office
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python.implement.tactics
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/adf_core_python.rst b/docs/source/adf_core_python/adf_core_python.rst
new file mode 100644
index 00000000..774319a2
--- /dev/null
+++ b/docs/source/adf_core_python/adf_core_python.rst
@@ -0,0 +1,31 @@
+adf\_core\_python package
+=========================
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python.cli
+ adf_core_python.core
+ adf_core_python.implement
+
+Submodules
+----------
+
+adf\_core\_python.launcher module
+---------------------------------
+
+.. automodule:: adf_core_python.launcher
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: adf_core_python
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/adf_core_python/modules.rst b/docs/source/adf_core_python/modules.rst
new file mode 100644
index 00000000..d0160b5d
--- /dev/null
+++ b/docs/source/adf_core_python/modules.rst
@@ -0,0 +1,7 @@
+adf_core_python
+===============
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 00000000..fc0ea646
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,92 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+import os
+import sys
+import yaml
+
+sys.path.insert(0, os.path.abspath("../../"))
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = "adf-core-python"
+copyright = "2024, Haruki Uehara, Yuki Shimada"
+author = "Haruki Uehara, Yuki Shimada"
+release = "0.1.0"
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.napoleon",
+ "sphinx.ext.autosummary",
+ "sphinx_copybutton",
+ "sphinx_togglebutton",
+ "myst_parser",
+ "sphinxcontrib.mermaid",
+]
+
+templates_path = ["_templates"]
+exclude_patterns = []
+
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = "sphinx_book_theme"
+
+html_sidebars = {
+ "**": ["navbar-logo.html", "versions.html", "search-button-field.html", "sbt-sidebar-nav.html"]
+}
+
+html_static_path = ["_static"]
+
+locale_dirs = ["locale"]
+language = "en"
+
+# get the environment variable build_all_docs and pages_root
+build_all_docs = os.environ.get("build_all_docs")
+pages_root = os.environ.get("pages_root", "")
+
+# if not there, we dont call this
+if build_all_docs is not None:
+ # we get the current language and version
+ current_language = os.environ.get("current_language")
+ current_version = os.environ.get("current_version")
+
+ # we set the html_context wit current language and version
+ # and empty languages and versions for now
+ html_context = {
+ 'current_language' : current_language,
+ 'languages' : [],
+ 'current_version' : current_version,
+ 'versions' : [],
+ }
+
+
+ # and we append all versions and langauges accordingly
+ # we treat t he main branch as latest
+ if (current_version == 'latest'):
+ html_context['languages'].append(['en', pages_root])
+ html_context['languages'].append(['ja', pages_root+'/ja'])
+
+ if (current_language == 'en'):
+ html_context['versions'].append(['latest', pages_root])
+ if (current_language == 'ja'):
+ html_context['versions'].append(['latest', pages_root+'/ja'])
+
+ # and loop over all other versions from our yaml file
+ # to set versions and languages
+ with open("../versions.yaml", "r") as yaml_file:
+ docs = yaml.safe_load(yaml_file)
+
+ if (current_version != 'latest'):
+ for language in docs[current_version].get('languages', []):
+ html_context['languages'].append([language, pages_root+'/'+current_version+'/'+language])
+
+ for version, details in docs.items():
+ html_context['versions'].append([version, pages_root+'/'+version+'/'+current_language])
diff --git a/docs/source/download/cluster_plot.zip b/docs/source/download/cluster_plot.zip
new file mode 100644
index 00000000..122b555b
Binary files /dev/null and b/docs/source/download/cluster_plot.zip differ
diff --git a/docs/source/download/tutorial_map.zip b/docs/source/download/tutorial_map.zip
new file mode 100644
index 00000000..429d2fea
Binary files /dev/null and b/docs/source/download/tutorial_map.zip differ
diff --git a/docs/source/hands-on/clustering.md b/docs/source/hands-on/clustering.md
new file mode 100644
index 00000000..df3962ab
--- /dev/null
+++ b/docs/source/hands-on/clustering.md
@@ -0,0 +1,362 @@
+# クラスタリングモジュール
+
+## クラスタリングモジュールの目的
+
+複数のエージェントを動かす場合は、それらのエージェントにどのように協調させるかが重要になります。RRSでは多くのチームが、エージェントに各々の担当地域を持たせ役割分担をおこなう協調を取り入れています(他の手段による協調も取り入れています)。担当地域を割り振るためには、地図上のオブジェクトをいくつかのグループに分ける必要があります。このようなグループ分けをしてそれらを管理する場合には、クラスタリングモジュールと呼ばれるモジュールを用います。
+
+本資料では、多くの世界大会参加チームが使用しているアルゴリズムを用いたクラスタリングモジュールの実装をおこないます。
+
+## 開発するクラスタリングモジュールの概要
+
+本資料で開発するモジュールは下の画像のように、
+
+1. k-means++アルゴリズムによって地図上のオブジェクトをエージェント数分の区画に分けます。
+1. Hungarianアルゴリズムによってそれらの区画とエージェントを (間の距離の総和が最も小さくなるように)1対1で結びつけます。
+
+
+
+## クラスタリングモジュールの実装
+
+```{note}
+以降の作業では、カレントディレクトリがプロジェクトのルートディレクトリであることを前提としています。
+```
+
+まず、クラスタリングモジュールを記述するためのファイルを作成します。
+
+```bash
+mkdir -p src//module/algorithm
+touch src//module/algorithm/k_means_pp_clustering.py
+```
+
+次に、クラスタリングモジュールの実装を行います。 以下のコードを `k_means_pp_clustering.py` に記述してください。
+
+```python
+import numpy as np
+from adf_core_python.core.agent.develop.develop_data import DevelopData
+from adf_core_python.core.agent.info.agent_info import AgentInfo
+from adf_core_python.core.agent.info.scenario_info import ScenarioInfo, ScenarioInfoKeys
+from adf_core_python.core.agent.info.world_info import WorldInfo
+from adf_core_python.core.agent.module.module_manager import ModuleManager
+from adf_core_python.core.component.module.algorithm.clustering import Clustering
+from adf_core_python.core.logger.logger import get_logger
+from rcrs_core.connection.URN import Entity as EntityURN
+from rcrs_core.entities.ambulanceCenter import AmbulanceCentre
+from rcrs_core.entities.building import Building
+from rcrs_core.entities.entity import Entity
+from rcrs_core.entities.fireStation import FireStation
+from rcrs_core.entities.gasStation import GasStation
+from rcrs_core.entities.hydrant import Hydrant
+from rcrs_core.entities.policeOffice import PoliceOffice
+from rcrs_core.entities.refuge import Refuge
+from rcrs_core.entities.road import Road
+from rcrs_core.worldmodel.entityID import EntityID
+from scipy.optimize import linear_sum_assignment
+from sklearn.cluster import KMeans
+
+# クラスタリングのシード値
+SEED = 42
+
+
+class KMeansPPClustering(Clustering):
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+ # ロガーの取得
+ self._logger = get_logger(f"{self.__class__.__name__}")
+
+ # クラスター数の設定
+ self._cluster_number: int = 1
+ match agent_info.get_myself().get_urn():
+ # エージェントのクラスに応じてクラスター数を設定
+ case EntityURN.AMBULANCE_TEAM:
+ self._cluster_number = scenario_info.get_value(
+ ScenarioInfoKeys.SCENARIO_AGENTS_AT,
+ 1,
+ )
+ case EntityURN.POLICE_FORCE:
+ self._cluster_number = scenario_info.get_value(
+ ScenarioInfoKeys.SCENARIO_AGENTS_PF,
+ 1,
+ )
+ case EntityURN.FIRE_BRIGADE:
+ self._cluster_number = scenario_info.get_value(
+ ScenarioInfoKeys.SCENARIO_AGENTS_FB,
+ 1,
+ )
+
+ # 自分と同じクラスのエージェントのリストを取得
+ self._agents: list[Entity] = world_info.get_entities_of_types(
+ [
+ agent_info.get_myself().__class__,
+ ]
+ )
+
+ # クラスタリング結果を保持する変数
+ self._cluster_entities: list[list[Entity]] = []
+
+ # クラスタリング対象のエンティティのリストを取得
+ self._entities: list[Entity] = world_info.get_entities_of_types(
+ [
+ AmbulanceCentre,
+ FireStation,
+ GasStation,
+ Hydrant,
+ PoliceOffice,
+ Refuge,
+ Road,
+ Building,
+ ]
+ )
+
+ def calculate(self) -> Clustering:
+ return self
+
+ def get_cluster_number(self) -> int:
+ """
+ クラスター数を取得する
+
+ Returns
+ -------
+ int
+ クラスター数
+ """
+ return self._cluster_number
+
+ def get_cluster_index(self, entity_id: EntityID) -> int:
+ """
+ エージェントに割り当てられたクラスターのインデックスを取得する
+
+ Parameters
+ ----------
+ entity_id : EntityID
+ エージェントのID
+
+ Returns
+ -------
+ int
+ クラスターのインデックス
+ """
+ return self._agent_cluster_indices.get(entity_id, 0)
+
+ def get_cluster_entities(self, cluster_index: int) -> list[Entity]:
+ """
+ クラスターのエンティティのリストを取得する
+
+ Parameters
+ ----------
+ cluster_index : int
+ クラスターのインデックス
+
+ Returns
+ -------
+ list[Entity]
+ クラスターのエンティティのリスト
+ """
+ if cluster_index >= len(self._cluster_entities):
+ return []
+ return self._cluster_entities[cluster_index]
+
+ def get_cluster_entity_ids(self, cluster_index: int) -> list[EntityID]:
+ """
+ クラスターのエンティティのIDのリストを取得する
+
+ Parameters
+ ----------
+ cluster_index : int
+ クラスターのインデックス
+
+ Returns
+ -------
+ list[EntityID]
+ クラスターのエンティティのIDのリスト
+ """
+ if cluster_index >= len(self._cluster_entities):
+ return []
+ return [entity.get_id() for entity in self._cluster_entities[cluster_index]]
+
+ def prepare(self) -> Clustering:
+ """
+ エージェントの起動時に一回のみ実行される処理
+ """
+ super().prepare()
+ if self.get_count_prepare() > 1:
+ return self
+
+ # クラスタリングを実行
+ kmeans_pp = self._perform_kmeans_pp(self._entities, self._cluster_number)
+
+ # クラスタリング結果を保持
+ self._cluster_entities = [[] for _ in range(self._cluster_number)]
+ for entity, cluster_index in zip(self._entities, kmeans_pp.labels_):
+ self._cluster_entities[cluster_index].append(entity)
+
+ # エージェントとクラスターのエンティティの距離を計算し、最も全体の合計の距離が短くなるようにエージェントとクラスターを対応付ける
+ agent_cluster_indices = self._agent_cluster_assignment(
+ self._agents, kmeans_pp.cluster_centers_
+ )
+
+ # エージェントとクラスターの対応付け結果を保持
+ self._agent_cluster_indices = {
+ entity.get_id(): cluster_index
+ for entity, cluster_index in zip(self._agents, agent_cluster_indices)
+ }
+
+ # デバッグ用のログ出力
+ self._logger.info(
+ f"Clustered entities: {[[entity.get_id().get_value() for entity in cluster] for cluster in self._cluster_entities]}"
+ )
+
+ self._logger.info(
+ f"Agent cluster indices: {[([self._world_info.get_entity(entity_id).get_x(), self._world_info.get_entity(entity_id).get_y()], int(cluster_index)) for entity_id, cluster_index in self._agent_cluster_indices.items()]}"
+ )
+
+ return self
+
+ def _perform_kmeans_pp(self, entities: list[Entity], n_clusters: int = 1) -> KMeans:
+ """
+ K-means++法によるクラスタリングを実行する
+
+ Parameters
+ ----------
+ entities : list[Entity]
+ クラスタリング対象のエンティティのリスト
+
+ n_clusters : int, optional
+ クラスター数, by default 1
+
+ Returns
+ -------
+ KMeans
+ クラスタリング結果
+ """
+ entity_positions: np.ndarray = np.array(
+ [
+ [entity.get_x(), entity.get_y()]
+ for entity in entities
+ if entity.get_x() is not None and entity.get_y() is not None
+ ]
+ )
+
+ entity_positions = entity_positions.reshape(-1, 2)
+ kmeans_pp = KMeans(
+ n_clusters=n_clusters,
+ init="k-means++",
+ random_state=SEED,
+ )
+ kmeans_pp.fit(entity_positions)
+ return kmeans_pp
+
+ def _agent_cluster_assignment(
+ self, agents: list[Entity], cluster_positions: np.ndarray
+ ) -> np.ndarray:
+ """
+ エージェントとクラスターの対応付けを行う
+
+ Parameters
+ ----------
+ agents : list[Entity]
+ エージェントのリスト
+
+ cluster_positions : np.ndarray
+ クラスターの位置のリスト
+
+ Returns
+ -------
+ np.ndarray
+ エージェントとクラスターの対応付け結果
+ """
+ # エージェントの位置のリストを取得
+ agent_positions = np.array(
+ [
+ [agent.get_x(), agent.get_y()]
+ for agent in agents
+ if agent.get_x() is not None and agent.get_y() is not None
+ ]
+ )
+
+ # エージェントとクラスターの距離行列を計算
+ agent_positions = agent_positions.reshape(-1, 2)
+ cost_matrix = np.linalg.norm(
+ agent_positions[:, np.newaxis] - cluster_positions, axis=2
+ )
+ # ハンガリアンアルゴリズムによりエージェントとクラスターの対応付けを行う
+ _, col_ind = linear_sum_assignment(cost_matrix)
+ return col_ind
+```
+
+k-means++の実装は、scikit-learnの`KMeans`クラスを使用しています。`KMeans`クラスは、`n_clusters`で指定したクラスター数によって地図上のオブジェクトをクラスタリングします。クラスタリング結果は、`labels_`属性に格納されます。また、`cluster_centers_`属性には各クラスターの中心座標が格納されます。
+
+hungarianアルゴリズムの実装は、scipyの`linear_sum_assignment`関数を使用しています。`linear_sum_assignment`関数は、コスト行列を引数として受け取り、最適な割り当てを行います。
+
+次に、作成したモジュールを登録します。`config/module.yaml` を以下のように編集してください。
+
+```yaml
+SampleSearch:
+ PathPlanning: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning
+ Clustering: src..module.algorithm.k_means_pp_clustering.KMeansPPClustering
+
+SampleHumanDetector:
+ Clustering: src..module.algorithm.k_means_pp_clustering.KMeansPPClustering
+```
+
+ターミナルを2つ起動します。
+
+片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:
+
+```bash
+# Terminal A
+cd WORKING_DIR/rcrs-server/scripts
+./start-comprun.sh -m ../maps/tutorial_ambulance_team_only/map -c ../maps/tutorial_ambulance_team_only/config
+```
+
+その後、別のターミナルを開き、エージェントを起動します:
+
+```bash
+# Terminal B
+cd WORKING_DIR/
+python main.py
+```
+
+エージェントが起動すると、標準出力にクラスタリング結果が表示されます。
+
+```bash
+[info ] Clustered entities: [[257, 259, 262, 263, 270, 278, 280, 297, 336, 913, 914, 915, 916, 917, 918, 919, 933, 941, 942, 943, 944, 945, 946, 947, 974, 250, 253], [349, 896, 899, 902, 934, 960, 968, 969, 970, 971, 248, 251], [258, 266, 268, 269, 274, 275, 279, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 932, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 975, 976, 254, 255], [256, 271, 273, 281, 296, 298, 314, 330, 903, 904, 905, 910, 911, 912, 935, 936, 937, 938, 939, 940, 247, 249]] [KMeansPPClustering]
+[info ] Agent cluster indices: [([89544, 19925], 1), ([69989, 120063], 0), ([130029, 50380], 2), ([29898, 59056], 3)] [KMeansPPClustering]
+```
+
+このままだと、クラスタリング結果がわかりにくいので、クラスタリング結果を地図上に表示してみましょう。
+
+{download}`クラスターの可視化用スクリプト <./../download/cluster_plot.zip>`をダウンロードして解凍し、中の`main.py`の以下の部分に
+
+```python
+# クラスタリング結果
+clusters = []
+```
+
+出力の`Clustered entities: `の後ろの部分の配列をコピーして貼り付けてください。
+
+例
+
+```python
+# クラスタリング結果
+clusters = [[257, 259, 262, 263, 270, 278, 280, 297, 336, 913, 914, 915, 916, 917, 918, 919, 933, 941, 942, 943, 944, 945, 946, 947, 974, 250, 253], [349, 896, 899, 902, 934, 960, 968, 969, 970, 971, 248, 251], [258, 266, 268, 269, 274, 275, 279, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 932, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 975, 976, 254, 255], [256, 271, 273, 281, 296, 298, 314, 330, 903, 904, 905, 910, 911, 912, 935, 936, 937, 938, 939, 940, 247, 249]]
+```
+
+貼り付けたら、以下のコマンドを実行してください。
+
+```bash
+pip install -r requirements.txt
+python main.py
+```
+
+以下のような画像が出力されます。
+
+
diff --git a/docs/source/hands-on/search.md b/docs/source/hands-on/search.md
new file mode 100644
index 00000000..8bd4ba50
--- /dev/null
+++ b/docs/source/hands-on/search.md
@@ -0,0 +1,383 @@
+# サーチモジュール
+
+## サーチモジュールの概要
+
+今回開発するモジュールは、`KMeansPPClustering` モジュールを用いた情報探索対象決定 (`Search`) モジュールです。 クラスタリングモジュールによってエージェント間で担当地域の分割をおこない、 担当地域内からランダムに探索対象として選択します。
+
+## サーチモジュールの実装の準備
+
+```{note}
+以降の作業では、カレントディレクトリがプロジェクトのルートディレクトリであることを前提としています。
+```
+
+まず、サーチモジュールを記述するためのファイルを作成します。
+
+```bash
+touch src//module/complex/k_means_pp_search.py
+```
+
+次に、サーチモジュールの実装を行います。 以下のコードを `k_means_pp_search.py` に記述してください。
+これが今回実装するサーチモジュールの雛形になります。
+
+```python
+import random
+from typing import Optional, cast
+
+from rcrs_core.entities.building import Building
+from rcrs_core.entities.entity import Entity
+from rcrs_core.entities.refuge import Refuge
+from rcrs_core.worldmodel.entityID import EntityID
+
+from adf_core_python.core.agent.develop.develop_data import DevelopData
+from adf_core_python.core.agent.info.agent_info import AgentInfo
+from adf_core_python.core.agent.info.scenario_info import ScenarioInfo
+from adf_core_python.core.agent.info.world_info import WorldInfo
+from adf_core_python.core.agent.module.module_manager import ModuleManager
+from adf_core_python.core.component.module.algorithm.clustering import Clustering
+from adf_core_python.core.component.module.complex.search import Search
+from adf_core_python.core.logger.logger import get_agent_logger
+
+
+class KMeansPPSearch(Search):
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+ self._result: Optional[EntityID] = None
+ # ロガーの取得
+ self._logger = get_agent_logger(
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
+ self._agent_info,
+ )
+
+ def calculate(self) -> Search:
+ return self
+
+ def get_target_entity_id(self) -> Optional[EntityID]:
+ return self._result
+```
+
+## モジュールの登録
+
+次に、作成したモジュールを登録します。
+以下のように`config/module.yaml`の該当箇所を変更してください
+
+```yaml
+DefaultTacticsAmbulanceTeam:
+ Search: src..module.complex.k_means_pp_search.KMeansPPSearch
+
+DefaultTacticsFireBrigade:
+ Search: src..module.complex.k_means_pp_search.KMeansPPSearch
+
+DefaultTacticsPoliceForce:
+ Search: src..module.complex.k_means_pp_search.KMeansPPSearch
+```
+
+## モジュールの実装
+
+まず、`KMeansPPClustering` モジュールを呼び出せるようにします。
+
+以下のコードを`config/module.yaml`に追記してください。
+
+```yaml
+KMeansPPSearch:
+ Clustering: src..module.algorithm.k_means_pp_clustering.KMeansPPClustering
+```
+
+次に、`KMeansPPSearch` モジュールで `KMeansPPClustering` モジュールを呼び出せるようにします。
+
+以下のコードを `k_means_pp_search.py` に追記してください。
+
+```python
+class KMeansPPSearch(Search):
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+ self._result: Optional[EntityID] = None
+
+ # ロガーの取得
+ self._logger = get_agent_logger(
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
+ self._agent_info,
+ )
+
+ # クラスタリングモジュールの読み込み
+ self._clustering: Clustering = cast(
+ Clustering,
+ module_manager.get_module(
+ # config.yamlに登録したkey
+ "KMeansPPSearch.Clustering",
+ # 上記のkeyが登録されていなかった場合のデフォルトモジュール
+ "adf_core_python.implement.module.algorithm.k_means_clustering.KMeansClustering",
+ ),
+ )
+
+ # クラスタリングモジュールの登録
+ self.register_sub_module(self._clustering)
+```
+
+そして、`calculate` メソッドでクラスタリングモジュールを呼び出し、探索対象を決定するように変更します。
+
+以下のコードを `k_means_pp_search.py` に追記してください。
+
+```python
+ def calculate(self) -> Search:
+ # 自エージェントのエンティティIDを取得
+ me: EntityID = self._agent_info.get_entity_id()
+ # 自エージェントが所属するクラスターのインデックスを取得
+ allocated_cluster_index: int = self._clustering.get_cluster_index(me)
+ # クラスター内のエンティティIDを取得
+ cluster_entity_ids: list[EntityID] = self._clustering.get_cluster_entity_ids(
+ allocated_cluster_index
+ )
+ # 乱数で選択
+ if cluster_entity_ids:
+ self._result = random.choice(cluster_entity_ids)
+
+ # ログ出力
+ self._logger.info(f"Target entity ID: {self._result}")
+
+ return self
+```
+
+以上で、`KMeansPPClustering` モジュールを用いた `KMeansPPSearch` モジュールの実装が完了しました。
+
+ターミナルを2つ起動します。
+
+片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:
+
+```bash
+# Terminal A
+cd WORKING_DIR/rcrs-server/scripts
+./start-comprun.sh -m ../maps/tutorial_ambulance_team_only/map -c ../maps/tutorial_ambulance_team_only/config
+```
+
+その後、別のターミナルを開き、エージェントを起動します:
+
+```bash
+# Terminal B
+cd WORKING_DIR/
+python main.py
+```
+
+## モジュールの改善
+
+`KMeansPPSearch` モジュールは、クラスタリングモジュールを用いて担当地域内からランダムに探索対象を選択しています。
+そのため、以下のような問題があります。
+
+- 探索対象がステップごとに変わってしまう
+ - 目標にたどり着く前に探索対象が変わってしまうため、なかなか目標にたどり着けない
+ - 色んなところにランダムに探索対象を選択することで、効率的な探索ができない
+- すでに探索したエンティティを再度探索対象として選択してしまうため、効率的な探索ができない
+- 近くに未探索のエンティティがあるのに、遠くのエンティティを探索対象として選択してしまう
+
+などの問題があります。
+
+## 課題
+
+`KMeansPPSearch` モジュールを改善し、より効率的な探索を行うモジュールを実装して見てください。
+
+```{warning}
+ここに上げた問題以外にも、改善すべき点が存在すると思うので、それを改善していただいても構いません。
+```
+
+```{warning}
+プログラム例のプログラムにも一部改善点があるので、余裕があったら修正してみてください。
+```
+
+### 探索対象がステップごとに変わってしまう問題
+
+```{admonition} 方針のヒント
+:class: hint dropdown
+
+一度選択した探索対象に到達するまで、探索対象を変更しないようにする
+```
+
+```{admonition} プログラム例
+:class: hint dropdown
+
+````python
+ def calculate(self) -> Search:
+ # 自エージェントのエンティティIDを取得
+ me: EntityID = self._agent_info.get_entity_id()
+ # 自エージェントが所属するクラスターのインデックスを取得
+ allocated_cluster_index: int = self._clustering.get_cluster_index(me)
+ # クラスター内のエンティティIDを取得
+ cluster_entity_ids: list[EntityID] = self._clustering.get_cluster_entity_ids(
+ allocated_cluster_index
+ )
+
+ # 探索対象をすでに選んでいる場合
+ if self._result:
+ # 自エージェントのいる場所のエンティティIDを取得
+ my_position = self._agent_info.get_position_entity_id()
+ # 探索対象の場所のエンティティIDを取得
+ target_position = self._world_info.get_entity_position(self._result)
+ # 自エージェントのいる場所と探索対象の場所が一致している場合、探索対象をリセット
+ if my_position == target_position:
+ # 探索対象をリセット
+ self._result = None
+
+ # 探索対象が未選択の場合
+ if not self._result and cluster_entity_ids:
+ self._result = random.choice(cluster_entity_ids)
+
+ # ログ出力
+ self._logger.info(f"Target entity ID: {self._result}")
+
+ return self
+```
+
+### すでに探索したエンティティを再度探索対象として選択してしまう問題
+
+```{admonition} 方針のヒント
+:class: hint dropdown
+
+すでに探索したエンティティを何かしらの方法で記録し、再度探索対象として選択しないようにする
+```
+
+```{admonition} プログラム例
+:class: hint dropdown
+
+````python
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+ self._result: Optional[EntityID] = None
+
+ # ロガーの取得
+ self._logger = get_agent_logger(
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
+ self._agent_info,
+ )
+
+ # クラスタリングモジュールの読み込み
+ self._clustering: Clustering = cast(
+ Clustering,
+ module_manager.get_module(
+ # config.yamlに登録したkey
+ "KMeansPPSearch.Clustering",
+ # 上記のkeyが登録されていなかった場合のデフォルトモジュール
+ "adf_core_python.implement.module.algorithm.k_means_clustering.KMeansClustering",
+ ),
+ )
+
+ # クラスタリングモジュールの要録
+ self.register_sub_module(self._clustering)
+
+ # 探索したいエンティティIDのリスト(追加)
+ self._search_entity_ids: list[EntityID] = []
+
+ def calculate(self) -> Search:
+ # 探索したいエンティティIDのリストが空の場合
+ if not self._search_entity_ids:
+ # 自エージェントのエンティティIDを取得
+ me: EntityID = self._agent_info.get_entity_id()
+ # 自エージェントが所属するクラスターのインデックスを取得
+ allocated_cluster_index: int = self._clustering.get_cluster_index(me)
+ # クラスター内のエンティティIDを取得(変更)
+ self._search_entity_ids: list[EntityID] = (
+ self._clustering.get_cluster_entity_ids(allocated_cluster_index)
+ )
+
+ # 探索対象をすでに選んでいる場合
+ if self._result:
+ # 自エージェントのいる場所のエンティティIDを取得
+ my_position = self._agent_info.get_position_entity_id()
+ # 探索対象の場所のエンティティIDを取得
+ target_position = self._world_info.get_entity_position(self._result)
+ # 自エージェントのいる場所と探索対象の場所が一致している場合、探索対象をリセット
+ if my_position == target_position:
+ # 探索したいエンティティIDのリストから探索対象を削除
+ self._search_entity_ids.remove(self._result)
+ # 探索対象をリセット
+ self._result = None
+
+ # 探索対象が未選択の場合(変更)
+ if not self._result and self._search_entity_ids:
+ self._result = random.choice(self._search_entity_ids)
+
+ # ログ出力
+ self._logger.info(f"Target entity ID: {self._result}")
+
+ return self
+```
+
+### 近くに未探索のエンティティがあるのに、遠くのエンティティを探索対象として選択してしまう
+
+```{admonition} 方針のヒント
+:class: hint dropdown
+
+エンティティ間の距離を計算し、もっとも近いエンティティを探索対象として選択する
+```
+
+```{admonition} プログラム例
+:class: hint dropdown
+
+````python
+ def calculate(self) -> Search:
+ # 探索したいエンティティIDのリストが空の場合
+ if not self._search_entity_ids:
+ # 自エージェントのエンティティIDを取得
+ me: EntityID = self._agent_info.get_entity_id()
+ # 自エージェントが所属するクラスターのインデックスを取得
+ allocated_cluster_index: int = self._clustering.get_cluster_index(me)
+ # クラスター内のエンティティIDを取得
+ self._search_entity_ids: list[EntityID] = (
+ self._clustering.get_cluster_entity_ids(allocated_cluster_index)
+ )
+
+ # 探索対象をすでに選んでいる場合
+ if self._result:
+ # 自エージェントのいる場所のエンティティIDを取得
+ my_position = self._agent_info.get_position_entity_id()
+ # 探索対象の場所のエンティティIDを取得
+ target_position = self._world_info.get_entity_position(self._result)
+ # 自エージェントのいる場所と探索対象の場所が一致している場合、探索対象をリセット
+ if my_position == target_position:
+ # 探索したいエンティティIDのリストから探索対象を削除
+ self._search_entity_ids.remove(self._result)
+ # 探索対象をリセット
+ self._result = None
+
+ # 探索対象が未選択の場合
+ if not self._result and self._search_entity_ids:
+ nearest_entity_id: Optional[EntityID] = None
+ nearest_distance: float = float("inf")
+ me: EntityID = self._agent_info.get_entity_id()
+ # 探索対象の中で自エージェントに最も近いエンティティIDを選択(変更)
+ for entity_id in self._search_entity_ids:
+ distance = self._world_info.get_distance(me, entity_id)
+ if distance < nearest_distance:
+ nearest_entity_id = entity_id
+ nearest_distance = distance
+ self._result = nearest_entity_id
+
+ # ログ出力
+ self._logger.info(f"Target entity ID: {self._result}")
+
+ return self
+```
diff --git a/docs/source/images/agent_control.jpg b/docs/source/images/agent_control.jpg
new file mode 100644
index 00000000..a641c8d0
Binary files /dev/null and b/docs/source/images/agent_control.jpg differ
diff --git a/docs/source/images/agent_flow.png b/docs/source/images/agent_flow.png
new file mode 100644
index 00000000..fb5720f5
Binary files /dev/null and b/docs/source/images/agent_flow.png differ
diff --git a/docs/source/images/cluster.png b/docs/source/images/cluster.png
new file mode 100644
index 00000000..4e0b9fb8
Binary files /dev/null and b/docs/source/images/cluster.png differ
diff --git a/docs/source/images/clustering_image.jpg b/docs/source/images/clustering_image.jpg
new file mode 100644
index 00000000..6fb37ebd
Binary files /dev/null and b/docs/source/images/clustering_image.jpg differ
diff --git a/docs/source/images/entity.png b/docs/source/images/entity.png
new file mode 100644
index 00000000..503c34cf
Binary files /dev/null and b/docs/source/images/entity.png differ
diff --git a/docs/source/images/human_detector_flow.png b/docs/source/images/human_detector_flow.png
new file mode 100644
index 00000000..13856ce9
Binary files /dev/null and b/docs/source/images/human_detector_flow.png differ
diff --git a/docs/source/images/launch_server.png b/docs/source/images/launch_server.png
new file mode 100644
index 00000000..2b60ab33
Binary files /dev/null and b/docs/source/images/launch_server.png differ
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 00000000..e10fb8d4
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,80 @@
+.. adf-core-python documentation master file, created by
+ sphinx-quickstart on Mon Oct 14 00:15:07 2024.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+adf-core-pythonのドキュメント
+==============================
+
+.. warning::
+
+ 現在このパッケージは開発中です。破壊的な変更が行われる可能性があります。
+
+.. warning::
+
+ パッケージとしてまだ公開していないため、pip でインストールすることはできません。
+
+.. warning::
+
+ 以下の言語のドキュメントは機械翻訳を使用しています。翻訳の正確性については保証できません。
+ 英語
+
+
+概要
+----
+adf-core-pythonは、RoboCup Rescue Simulation(RRS)におけるエージェント開発を支援するためのライブラリ及びフレームワークです。
+adf-core-pythonを使用することで、エージェントの開発を効率化し、再利用性を向上させることができます。
+
+特徴
+----
+adf-core-pythonには以下のような特徴があります。
+
+- **モジュール単位での開発**: モジュール単位でエージェント開発を行い、モジュールの入れ替えが容易です。
+- **モジュールの再利用**: 他のエージェントで使用されているモジュールを再利用することができます。
+- **エージェントの開発に集中**: シミュレーションサーバーとの通信やログ出力などの共通処理をライブラリが提供します。
+
+はじめに
+--------
+adf-core-pythonを始めるには、インストールに従い、このドキュメントに記載されているチュートリアルやハンズオンを参照してください。
+
+.. toctree::
+ :maxdepth: 1
+ :caption: インストール
+
+ install/environment/environment
+ install/install/install
+
+.. toctree::
+ :maxdepth: 1
+ :caption: クイックスタート
+
+ quickstart/quickstart
+
+.. toctree::
+ :maxdepth: 1
+ :caption: チュートリアル
+
+ tutorial/environment/environment
+ tutorial/agent/agent
+ tutorial/agent/agent_control
+ tutorial/config/config
+ tutorial/module/module
+
+.. toctree::
+ :maxdepth: 1
+ :caption: ハンズオン
+
+ hands-on/clustering
+ hands-on/search
+
+.. toctree::
+ :maxdepth: 1
+ :caption: APIドキュメント
+
+ modindex
+ search
+
+.. automodule:: adf_core_python
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/install/environment/environment.md b/docs/source/install/environment/environment.md
new file mode 100644
index 00000000..e9cf04b7
--- /dev/null
+++ b/docs/source/install/environment/environment.md
@@ -0,0 +1,56 @@
+# 環境構築
+
+adf-core-pythonをインストールするには以下の必要条件が必要です。
+既にお使いのPCにインストールされている場合は再度インストールする必要はありません。
+
+## 必要条件
+
+- Git
+- Python 3.12 以上
+- OpenJDK 17
+
+各OSでのインストール方法は以下のページをそれぞれ参照してください
+
+[Windowsでの必要条件のインストール方法](./windows/install.md)
+
+[MacOSでの必要条件のインストール方法](./mac/install.md)
+
+[Linuxでの必要条件のインストール方法](./linux/install.md)
+
+## シミュレーションサーバーのインストール
+
+次にRoboCup Rescue Simulationのシミュレーションサーバーをインストールします。
+
+```{note}
+WORKING_DIR は任意のディレクトリを作成、指定してください。
+```
+
+```bash
+mkdir WORKING_DIR
+cd WORKING_DIR
+git clone https://github.com/roborescue/rcrs-server.git
+cd rcrs-server
+./gradlew completeBuild
+```
+
+ビルドした際に以下のようなメッセージが表示されたら成功です。
+
+```bash
+BUILD SUCCESSFUL in ...
+```
+
+## シミュレーションサーバーの動作確認
+
+```bash
+cd scripts
+./start-comprun.sh -m ../maps/test/map -c ../maps/test/config
+```
+
+
+
+上記のように何個かのウィンドウが表示されたら成功です。
+コマンドラインで `Ctrl + C` (MacOSの場合は `Command + C` ) を押すとシミュレーションサーバーが終了します。
+
+```{warning}
+シミュレーションサーバーを停止させたあとは、プロセスが残ってしまう場合があるので`./kill.sh` を実行してください。
+```
diff --git a/docs/source/install/environment/linux/install.md b/docs/source/install/environment/linux/install.md
new file mode 100644
index 00000000..e431db1e
--- /dev/null
+++ b/docs/source/install/environment/linux/install.md
@@ -0,0 +1,140 @@
+# Linuxでの環境構築
+
+## 1. Gitのインストール
+
+1. Terminalを起動し、以下のコマンドを実行します。
+ ```bash
+ git --version
+ ```
+
+2. もし、`command not found`などのエラーが出た場合、OS標準のパッケージマネージャーを使用してインストールします。
+ - DebianベースのOSの場合(Ubuntuなど)
+ ```bash
+ sudo apt update
+ sudo apt upgrade -y
+ sudo apt install git
+ ```
+ - Red HatベースのOSの場合(Fedoraなど)
+ ```bash
+ sudo yum install git
+ ```
+
+ ```bash
+ sudo dnf install git
+ ```
+
+3. 以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ git --version
+ ```
+
+## 2. Pythonのインストール
+
+1. Terminalを起動し、以下のコマンドを実行します。また、バージョンが3.12以上になっていることを確認します。
+ ```bash
+ python --version
+ ```
+
+2. もし、`command not found`などのエラーが出た場合やバージョンが低い場合、Pythonのバージョン管理ツールであるpyenvを使用してインストールします
+
+ ```{warning}
+ インストール方法の内容が最新ではない場合があるため、[https://github.com/pyenv/pyenv](https://github.com/pyenv/pyenv)を参照してください。
+ ```
+
+ 1. 以下のコマンドを実行します。
+ ```bash
+ curl https://pyenv.run | bash
+ ```
+
+ 2. 次に以下のコマンドを実行して、使用しているShellを確認します。
+ ```bash
+ echo $SHELL
+ ```
+
+ 3. 表示されたShellに従ってコマンドを実行してください。
+
+ `bash`が表示された方は以下のコマンドを実行してください
+ ```bash
+ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
+ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
+ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
+
+ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
+ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
+
+ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
+ echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
+ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
+ ```
+
+ `zsh`が表示された方は以下のコマンドを実行してください
+ ```bash
+ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
+ echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
+ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
+ ```
+
+ `fish`が表示された方は以下のコマンドを実行してください
+ ```bash
+ set -Ux PYENV_ROOT $HOME/.pyenv
+ fish_add_path $PYENV_ROOT/bin
+ pyenv init - | source
+ ```
+
+ 4. 必要パッケージのインストール
+ - DebianベースのOSの場合(Ubuntuなど)
+ ```bash
+ sudo apt update
+ sudo apt upgrade -y
+ sudo apt install make libssl-dev build-essential zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
+ ```
+ - Red HatベースのOSの場合(Fedoraなど)
+ ```bash
+ sudo yum install gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite-devel tk-devel
+ ```
+
+ ```bash
+ sudo dnf install gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite-devel tk-devel
+ ```
+
+ 5. python3.12のインストール
+ ```bash
+ exec "$SHELL"
+ pyenv install 3.12
+ pyenv global 3.12
+ ```
+
+
+
+3. 以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ python --version
+ ```
+
+## 3. OpenJDKのインストール
+
+1. Terminalを起動し、以下のコマンドを実行します。また、バージョンが17になっていることを確認します。
+ ```bash
+ java --version
+ ```
+
+2. もし、`command not found`などのエラーが出た場合やバージョンが異なる場合、OS標準のパッケージマネージャーを使用してインストールします
+ - DebianベースのOSの場合(Ubuntuなど)
+ ```bash
+ sudo apt update
+ sudo apt upgrade -y
+ sudo apt install openjdk-17-jdk
+ ```
+ - Red HatベースのOSの場合(Fedoraなど)
+ ```bash
+ sudo yum install java-17-openjdk-devel
+ ```
+
+ ```bash
+ sudo dnf install java-17-openjdk-devel
+ ```
+
+3. 以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ java --version
+ ```
diff --git a/docs/source/install/environment/mac/install.md b/docs/source/install/environment/mac/install.md
new file mode 100644
index 00000000..179406d8
--- /dev/null
+++ b/docs/source/install/environment/mac/install.md
@@ -0,0 +1,61 @@
+# Macでの環境構築
+## 1. Homebrewのインストール
+1. Terminalを起動し、以下のコマンドを実行します。
+ ```bash
+ brew -v
+ ```
+
+2. もし、`command not found`などのエラーが出た場合、以下のコマンドを実行します。
+ ```bash
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+ ```
+
+3. もう一度、以下のコマンドを実行してバージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ brew -v
+ ```
+
+## 2. Gitのインストール
+
+1. Terminalを起動し、以下のコマンドを実行します。
+ ```bash
+ git --version
+ ```
+2. もし、`command not found`などのエラーが出た場合、以下のコマンドを実行します。
+ ```bash
+ brew install git
+ ```
+3. 以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ git --version
+ ```
+
+## 3. Pythonのインストール
+
+1. Terminalを起動し、以下のコマンドを実行します。また、バージョンが3.12以上になっていることを確認します。
+ ```bash
+ python --version
+ ```
+2. もし、`command not found`などのエラーが出た場合やバージョンが低い場合、以下のコマンドを実行します。
+ ```bash
+ brew install python
+ ```
+3. 以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ python --version
+ ```
+
+## 3. OpenJDKのインストール
+
+1. Terminalを起動し、以下のコマンドを実行します。また、バージョンが17になっていることを確認します。
+ ```bash
+ java --version
+ ```
+2. もし、`command not found`などのエラーが出た場合やバージョンが異なる場合、以下のコマンドを実行します。
+ ```bash
+ brew install openjdk@17
+ ```
+3. 以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)
+ ```bash
+ java --version
+ ```
diff --git a/docs/source/install/environment/windows/install.md b/docs/source/install/environment/windows/install.md
new file mode 100644
index 00000000..f2f8bd01
--- /dev/null
+++ b/docs/source/install/environment/windows/install.md
@@ -0,0 +1,46 @@
+# Windowsでの環境構築
+
+## 1. Gitのインストール
+
+1. [Git for Windows](https://gitforwindows.org/)の公式サイトにアクセスします。
+2. トップページの"Download"をクリックします
+3. ダウンロードが完了した後、インストーラーを実行します。
+4. 全て"Next"をクリックします。
+5. インストールが完了するまで待ちます。
+6. インストールが完了したら"Finish"をクリックします。
+7. 検索バーに"Git Bash"と入力し、Git Bashを実行します。
+8. 画面が表示されていたらインストール成功です。
+
+## 2. Pythonのインストール
+
+1. [Python](https://www.python.org/)の公式サイトにアクセスします。
+2. トップページの"Download Python ~"をクリックします
+3. ダウンロードが完了した後、インストーラーを実行します。
+4. "Add python.exe to PATH"にチェックが入っていることを確認した後、"Install Now"をクリックします。
+5. インストールが完了するまで待ちます。
+6. インストールが完了したら"Close"をクリックします。
+7. Git Bashを開き、`python --version`と入力し、`Python [バージョン]`が表示されたら成功です。(もし表示されない場合はGit Bashを開き直してください)
+
+## 3. OpenJDKのインストール
+
+1. [OpenJDK](https://jdk.java.net/archive/)のダウンロードページにアクセスします。
+2. 17.0.2のWindowsの横にある"zip"をクリックします。
+3. ダウンロードしたzipを展開(解凍)します。
+4. 展開(解凍)すると"jdk-17.0.2"のようなフォルダができるのを確認します。
+5. このフォルダ"jdk-17.0.2"を`C:¥`の直下に移動させます。
+6. Windowsでコマンドプロンプトを管理者として実行します。
+7. 開いたら以下のコマンドを実行します。
+ ```
+ powershell -command "[System.Environment]::SetEnvironmentVariable(\"JAVA_HOME\", \"c:\jdk-17.0.2\", \"Machine\")"
+ ```
+8. 次に以下のコマンドを実行します。
+ ```
+ powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";c:\jdk-17.0.2\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
+ ```
+9. Git Bashを開き、`java -version`と入力します。
+ 以下のような文字が表示されたらインストール成功です。
+ ```
+ openjdk version "17.0.2" 2022-01-18
+ OpenJDK Runtime Environment (build 17.0.2+8-86)
+ OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)
+ ```
\ No newline at end of file
diff --git a/docs/source/install/install/install.md b/docs/source/install/install/install.md
new file mode 100644
index 00000000..032e22cc
--- /dev/null
+++ b/docs/source/install/install/install.md
@@ -0,0 +1,28 @@
+# インストール
+
+このセクションでは、パッケージのインストール方法について説明します。
+
+## 前提条件
+
+インストールする前に、以下の前提条件を確認してください:
+
+- Python 3.12 以上
+- pip
+
+## パッケージのインストール
+
+パッケージをインストールするには、次のコマンドを実行します:
+
+```bash
+pip install git+https://github.com/adf-python/adf-core-python.git
+```
+
+## インストールの確認
+
+インストールを確認するには、次のコマンドを実行します:
+
+```bash
+pip show adf_core_python
+```
+
+パッケージが正しくインストールされている場合、パッケージのバージョン番号などが表示されます。
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.cli.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.cli.po
new file mode 100644
index 00000000..b20a78ca
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.cli.po
@@ -0,0 +1,38 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.cli.rst:2
+msgid "adf\\_core\\_python.cli package"
+msgstr ""
+
+#: ../../source/adf_core_python.cli.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.cli.rst:8
+msgid "adf\\_core\\_python.cli.cli module"
+msgstr ""
+
+#: ../../source/adf_core_python.cli.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.ambulance.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.ambulance.po
new file mode 100644
index 00000000..fe4db961
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.ambulance.po
@@ -0,0 +1,52 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.action.ambulance.rst:2
+msgid "adf\\_core\\_python.core.agent.action.ambulance package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.ambulance.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.ambulance.rst:8
+msgid "adf\\_core\\_python.core.agent.action.ambulance.action\\_load module"
+msgstr ""
+
+#: adf_core_python.core.agent.action.ambulance.action_load.ActionLoad:1
+#: adf_core_python.core.agent.action.ambulance.action_rescue.ActionRescue:1
+#: adf_core_python.core.agent.action.ambulance.action_unload.ActionUnload:1 of
+msgid "Bases: :py:class:`~adf_core_python.core.agent.action.action.Action`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.ambulance.rst:16
+msgid "adf\\_core\\_python.core.agent.action.ambulance.action\\_rescue module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.ambulance.rst:24
+msgid "adf\\_core\\_python.core.agent.action.ambulance.action\\_unload module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.ambulance.rst:32
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.common.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.common.po
new file mode 100644
index 00000000..75bd5e4d
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.common.po
@@ -0,0 +1,47 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.action.common.rst:2
+msgid "adf\\_core\\_python.core.agent.action.common package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.common.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.common.rst:8
+msgid "adf\\_core\\_python.core.agent.action.common.action\\_move module"
+msgstr ""
+
+#: adf_core_python.core.agent.action.common.action_move.ActionMove:1
+#: adf_core_python.core.agent.action.common.action_rest.ActionRest:1 of
+msgid "Bases: :py:class:`~adf_core_python.core.agent.action.action.Action`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.common.rst:16
+msgid "adf\\_core\\_python.core.agent.action.common.action\\_rest module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.common.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.fire.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.fire.po
new file mode 100644
index 00000000..bb9922cb
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.fire.po
@@ -0,0 +1,52 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.action.fire.rst:2
+msgid "adf\\_core\\_python.core.agent.action.fire package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.fire.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.fire.rst:8
+msgid "adf\\_core\\_python.core.agent.action.fire.action\\_extinguish module"
+msgstr ""
+
+#: adf_core_python.core.agent.action.fire.action_extinguish.ActionExtinguish:1
+#: adf_core_python.core.agent.action.fire.action_refill.ActionRefill:1
+#: adf_core_python.core.agent.action.fire.action_rescue.ActionRescue:1 of
+msgid "Bases: :py:class:`~adf_core_python.core.agent.action.action.Action`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.fire.rst:16
+msgid "adf\\_core\\_python.core.agent.action.fire.action\\_refill module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.fire.rst:24
+msgid "adf\\_core\\_python.core.agent.action.fire.action\\_rescue module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.fire.rst:32
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.po
new file mode 100644
index 00000000..b6471d88
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.action.rst:2
+msgid "adf\\_core\\_python.core.agent.action package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.rst:16
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.rst:19
+msgid "adf\\_core\\_python.core.agent.action.action module"
+msgstr ""
+
+#: adf_core_python.core.agent.action.action.Action:1 of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.rst:27
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.police.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.police.po
new file mode 100644
index 00000000..c1e631fb
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.action.police.po
@@ -0,0 +1,48 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.action.police.rst:2
+msgid "adf\\_core\\_python.core.agent.action.police package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.police.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.police.rst:8
+msgid "adf\\_core\\_python.core.agent.action.police.action\\_clear module"
+msgstr ""
+
+#: adf_core_python.core.agent.action.police.action_clear.ActionClear:1
+#: adf_core_python.core.agent.action.police.action_clear_area.ActionClearArea:1
+#: of
+msgid "Bases: :py:class:`~adf_core_python.core.agent.action.action.Action`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.police.rst:16
+msgid "adf\\_core\\_python.core.agent.action.police.action\\_clear\\_area module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.action.police.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.po
new file mode 100644
index 00000000..93f8b721
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.po
@@ -0,0 +1,251 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.communication.rst:2
+msgid "adf\\_core\\_python.core.agent.communication package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst:13
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst:16
+msgid "adf\\_core\\_python.core.agent.communication.message\\_manager module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.add_heard_agent_help_message_count:1
+#: of
+msgid "Add the heard agent help message count."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.add_message:1
+#: of
+msgid "Add the message."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.add_message:3
+#: of
+msgid "The message."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.add_received_message:1
+#: of
+msgid "Add the received message."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.add_received_message:3
+#: of
+msgid "The received message."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.coordinate_message:1
+#: of
+msgid "Coordinate the message."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.coordinate_message:3
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.subscribe:3
+#: of
+msgid "The agent info."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.coordinate_message:5
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.subscribe:5
+#: of
+msgid "The world info."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.coordinate_message:7
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.subscribe:7
+#: of
+msgid "The scenario info."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_channel_send_message_list:1
+#: of
+msgid "Get the channel send message list."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_channel_send_message_list:3
+#: of
+msgid "The channel send message list."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst
+msgid "Return type"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_channel_subscriber:1
+#: of
+msgid "Get the channel subscriber."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_channel_subscriber:3
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_channel_subscriber:3
+#: of
+msgid "The channel subscriber."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_heard_agent_help_message_count:1
+#: of
+msgid "Get the heard agent help message count."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_heard_agent_help_message_count:3
+#: of
+msgid "The heard agent help message count."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_is_subscribed:1
+#: of
+msgid "Get the flag to indicate if the agent is subscribed to the channel."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_is_subscribed:3
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_is_subscribed:3
+#: of
+msgid "The flag to indicate if the agent is subscribed to the channel."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_message_class:1
+#: of
+msgid "Get the message class."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_message_class:3
+#: of
+msgid "The index."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_message_class:6
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_message_class_index:3
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.register_message_class:3
+#: of
+msgid "The message class."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_message_class_index:1
+#: of
+msgid "Get the message class index."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_message_class_index:6
+#: of
+msgid "The message class index."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_received_message_list:1
+#: of
+msgid "Get the received message list."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_received_message_list:3
+#: of
+msgid "The received message list."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_send_message_list:1
+#: of
+msgid "Get the send message list."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_send_message_list:3
+#: of
+msgid "The send message list."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_subscribed_channels:1
+#: of
+msgid "Get the subscribed channels."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.get_subscribed_channels:3
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_subscribed_channels:3
+#: of
+msgid "The subscribed channels."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.refresh:1
+#: of
+msgid "Refresh the message manager."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.register_message_class:1
+#: of
+msgid "Register the message class."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_channel_subscriber:1
+#: of
+msgid "Set the channel subscriber."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_is_subscribed:1
+#: of
+msgid "Set the flag to indicate if the agent is subscribed to the channel."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_message_coordinator:1
+#: of
+msgid "Set the message coordinator."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_message_coordinator:3
+#: of
+msgid "The message coordinator."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.set_subscribed_channels:1
+#: of
+msgid "Set the subscribed channels."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.subscribe:1
+#: of
+msgid "Subscribe to the channel."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.message_manager.MessageManager.subscribe:11
+#: of
+msgid "If the ChannelSubscriber is not set."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.centralized.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.centralized.po
new file mode 100644
index 00000000..8796bc33
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.centralized.po
@@ -0,0 +1,77 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:2
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.centralized "
+"package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:8
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.centralized.command\\_ambulance"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.bundle.centralized.command_ambulance.CommandAmbulance:1
+#: adf_core_python.core.agent.communication.standard.bundle.centralized.command_fire.CommandFire:1
+#: adf_core_python.core.agent.communication.standard.bundle.centralized.command_police.CommandPolice:1
+#: adf_core_python.core.agent.communication.standard.bundle.centralized.command_scout.CommandScout:1
+#: adf_core_python.core.agent.communication.standard.bundle.centralized.message_report.MessageReport:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.agent.communication.standard.bundle.standard_message.StandardMessage`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:16
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.centralized.command\\_fire"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:24
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.centralized.command\\_police"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:32
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.centralized.command\\_scout"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:40
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.centralized.message\\_report"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.centralized.rst:48
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.information.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.information.po
new file mode 100644
index 00000000..46d33d0d
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.information.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:2
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information "
+"package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:8
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information.message\\_ambulance\\_team"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.bundle.information.message_ambulance_team.MessageAmbulanceTeam:1
+#: adf_core_python.core.agent.communication.standard.bundle.information.message_building.MessageBuilding:1
+#: adf_core_python.core.agent.communication.standard.bundle.information.message_civilian.MessageCivilian:1
+#: adf_core_python.core.agent.communication.standard.bundle.information.message_fire_brigade.MessageFireBrigade:1
+#: adf_core_python.core.agent.communication.standard.bundle.information.message_police_force.MessagePoliceForce:1
+#: adf_core_python.core.agent.communication.standard.bundle.information.message_road.MessageRoad:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.agent.communication.standard.bundle.standard_message.StandardMessage`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:16
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information.message\\_building"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:24
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information.message\\_civilian"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:32
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information.message\\_fire\\_brigade"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:40
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information.message\\_police\\_force"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:48
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.information.message\\_road"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.information.rst:56
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.po
new file mode 100644
index 00000000..29b826dc
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.bundle.po
@@ -0,0 +1,67 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.rst:2
+msgid "adf\\_core\\_python.core.agent.communication.standard.bundle package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.rst:14
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.rst:17
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.standard\\_message"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.bundle.standard_message.StandardMessage:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.communication.communication_message.CommunicationMessage`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.rst:25
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.bundle.standard\\_message\\_priority"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.bundle.standard_message_priority.StandardMessagePriority:1
+#: of
+msgid "Bases: :py:class:`~enum.Enum`"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.bundle.standard_message_priority.StandardMessagePriority:1
+#: of
+msgid "Standard message priorities."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.bundle.rst:33
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.po
new file mode 100644
index 00000000..0e0d1293
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.po
@@ -0,0 +1,51 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.communication.standard.rst:2
+msgid "adf\\_core\\_python.core.agent.communication.standard package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.rst:14
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.rst:17
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.standard\\_communication\\_module"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.standard_communication_module.StandardCommunicationModule:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.communication.communication_module.CommunicationModule`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.rst:25
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.utility.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.utility.po
new file mode 100644
index 00000000..69e19d9b
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.communication.standard.utility.po
@@ -0,0 +1,133 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst:2
+msgid "adf\\_core\\_python.core.agent.communication.standard.utility package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst:8
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.utility.apply\\_to\\_world\\_info"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.apply_to_world_info.apply_to_world_info:1
+#: of
+msgid "Apply to world info."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.apply_to_world_info.apply_to_world_info:3
+#: of
+msgid "The world info to apply to."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.apply_to_world_info.apply_to_world_info:5
+#: of
+msgid "The standard message to apply to world info."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst:16
+msgid ""
+"adf\\_core\\_python.core.agent.communication.standard.utility.bitarray\\_with\\_exits\\_flag"
+" module"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.read_with_exist_flag:1
+#: of
+msgid ""
+"Read value from bit_array with an exist flag. If the first bit is "
+"IS_NOT_EXIST_FLAG, return None. If the first bit is IS_EXIST_FLAG, read "
+"and return value from bit_array."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.read_with_exist_flag:5
+#: of
+msgid "The bitarray to read from."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.read_with_exist_flag:7
+#: of
+msgid "The number of bits to read to get value."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.read_with_exist_flag:10
+#: of
+msgid "The value read from bit_array."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst
+msgid "Return type"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst
+msgid "Raises"
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.read_with_exist_flag:13
+#: of
+msgid "If the first bit is not IS_EXIST_FLAG or IS_NOT_EXIST_FLAG."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.write_with_exist_flag:1
+#: of
+msgid ""
+"Write value to bit_array with an exist flag. If value is None, write "
+"IS_NOT_EXIST_FLAG to bit_array. If value is not None, write IS_EXIST_FLAG"
+" to bit_array and then write value to bit_array."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.write_with_exist_flag:5
+#: of
+msgid "The bitarray to write to."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.write_with_exist_flag:7
+#: of
+msgid "The value to write."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.write_with_exist_flag:9
+#: of
+msgid "The number of bits to use to write value."
+msgstr ""
+
+#: adf_core_python.core.agent.communication.standard.utility.bitarray_with_exits_flag.write_with_exist_flag:12
+#: of
+msgid "If value is too large to fit into bit_size bits."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.communication.standard.utility.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.config.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.config.po
new file mode 100644
index 00000000..e647ed2b
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.config.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.config.rst:2
+msgid "adf\\_core\\_python.core.agent.config package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.config.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.config.rst:8
+msgid "adf\\_core\\_python.core.agent.config.module\\_config module"
+msgstr ""
+
+#: adf_core_python.core.agent.config.module_config.ModuleConfig:1 of
+msgid "Bases: :py:class:`~rcrs_core.config.config.Config`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.config.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.develop.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.develop.po
new file mode 100644
index 00000000..70a33eee
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.develop.po
@@ -0,0 +1,78 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.develop.rst:2
+msgid "adf\\_core\\_python.core.agent.develop package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.develop.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.develop.rst:8
+msgid "adf\\_core\\_python.core.agent.develop.develop\\_data module"
+msgstr ""
+
+#: adf_core_python.core.agent.develop.develop_data.DevelopData:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: adf_core_python.core.agent.develop.develop_data.DevelopData.get_value:1 of
+msgid ""
+"Get value from develop data If develop mode is disabled, return default "
+"value"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.develop.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.agent.develop.develop_data.DevelopData.get_value:4 of
+msgid "Key"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.develop.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.agent.develop.develop_data.DevelopData.get_value:7 of
+msgid "Value"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.develop.rst
+msgid "Return type"
+msgstr ""
+
+#: adf_core_python.core.agent.develop.develop_data.DevelopData.is_develop_mode:1
+#: of
+msgid "Check if develop mode is enabled"
+msgstr ""
+
+#: adf_core_python.core.agent.develop.develop_data.DevelopData.is_develop_mode:3
+#: of
+msgid "True if develop mode is enabled"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.develop.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.info.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.info.po
new file mode 100644
index 00000000..e50dbf13
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.info.po
@@ -0,0 +1,317 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.info.rst:2
+msgid "adf\\_core\\_python.core.agent.info package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst:8
+msgid "adf\\_core\\_python.core.agent.info.agent\\_info module"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo:1
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo:1
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfoKeys:1
+#: adf_core_python.core.agent.info.world_info.WorldInfo:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_change_set:1
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_change_set:1 of
+msgid "Get the change set"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_change_set:3
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_change_set:3
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_change_set:3
+#: adf_core_python.core.agent.info.world_info.WorldInfo.set_change_set:3 of
+msgid "Change set"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst
+msgid "Return type"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_entity_id:1 of
+msgid "Get the entity ID of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_entity_id:3 of
+msgid "Entity ID of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_executed_action:1
+#: of
+msgid "Get the executed action at the given time"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_executed_action:3
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_executed_action:3
+#: of
+msgid "Time"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_heard_commands:1 of
+msgid "Get the heard commands"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_heard_commands:3
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_heard_commands:3 of
+msgid "Heard commands"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_myself:1 of
+msgid "Get the entity of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_myself:3 of
+msgid "Entity of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_position_entity_id:1
+#: of
+msgid "Get the position entity ID of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_position_entity_id:3
+#: of
+msgid "Position entity ID of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_think_time:1 of
+msgid "Get the time taken for thinking"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_think_time:3 of
+msgid "Time taken for thinking"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_time:1 of
+msgid "Get the current time of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.get_time:3
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_time:3 of
+msgid "Current time"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.record_think_start_time:1
+#: of
+msgid "Record the start time of thinking"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_change_set:1
+#: adf_core_python.core.agent.info.world_info.WorldInfo.set_change_set:1 of
+msgid "Set the change set"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_executed_action:1
+#: of
+msgid "Set the executed action at the given time"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_executed_action:5
+#: of
+msgid "Executed action"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_heard_commands:1 of
+msgid "Set the heard commands"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.set_time:1 of
+msgid "Set the current time of the agent"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.some_one_on_board:1 of
+msgid "Get the human if someone is on board"
+msgstr ""
+
+#: adf_core_python.core.agent.info.agent_info.AgentInfo.some_one_on_board:3 of
+msgid "Human if someone is on board, None otherwise"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst:16
+msgid "adf\\_core\\_python.core.agent.info.scenario\\_info module"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.Mode:1 of
+msgid "Bases: :py:class:`~enum.IntEnum`"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_config:1 of
+msgid "Get the configuration"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_config:3
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.set_config:3 of
+msgid "Configuration"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_mode:1 of
+msgid "Get the mode of the scenario"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_mode:3 of
+msgid "Mode of the scenario"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_value:1 of
+msgid "Get the value of the configuration"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_value:3 of
+msgid "Key of the configuration"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_value:5 of
+msgid "Default value of the configuration"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.get_value:8 of
+msgid "Value of the configuration"
+msgstr ""
+
+#: adf_core_python.core.agent.info.scenario_info.ScenarioInfo.set_config:1 of
+msgid "Set the configuration"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst:24
+msgid "adf\\_core\\_python.core.agent.info.world\\_info module"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.add_entity:1 of
+msgid "Add the entity"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.add_entity:3
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity:6 of
+msgid "Entity"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_blockades:1 of
+msgid "Get the blockades in the area"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_blockades:3 of
+msgid "Blockade"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_distance:1 of
+msgid "Get the distance between two entities"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_distance:3 of
+msgid "Entity ID 1"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_distance:5 of
+msgid "Entity ID 2"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_distance:8 of
+msgid "Distance"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst
+msgid "Raises"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_distance:11 of
+msgid "If one or both entities are invalid or the location is invalid"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entities_of_types:1
+#: of
+msgid "Get the entities of the specified types"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entities_of_types:3
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_ids_of_types:3
+#: of
+msgid "List of entity types"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entities_of_types:6
+#: of
+msgid "Entities"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity:1 of
+msgid "Get the entity"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity:3
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_position:3
+#: of
+msgid "Entity ID"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_ids_of_types:1
+#: of
+msgid "Get the entity IDs of the specified types"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_ids_of_types:6
+#: of
+msgid "Entity IDs"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_position:1
+#: of
+msgid "Get the entity position"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_position:6
+#: of
+msgid "Entity position"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_entity_position:9
+#: of
+msgid "If the entity is invalid"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_world_model:1 of
+msgid "Get the world model"
+msgstr ""
+
+#: adf_core_python.core.agent.info.world_info.WorldInfo.get_world_model:3 of
+msgid "World model"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.info.rst:32
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.module.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.module.po
new file mode 100644
index 00000000..b98e2fc0
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.module.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.module.rst:2
+msgid "adf\\_core\\_python.core.agent.module package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.module.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.module.rst:8
+msgid "adf\\_core\\_python.core.agent.module.module\\_manager module"
+msgstr ""
+
+#: adf_core_python.core.agent.module.module_manager.ModuleManager:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.module.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.platoon.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.platoon.po
new file mode 100644
index 00000000..fee57f72
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.platoon.po
@@ -0,0 +1,60 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:2
+msgid "adf\\_core\\_python.core.agent.platoon package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:8
+msgid "adf\\_core\\_python.core.agent.platoon.platoon module"
+msgstr ""
+
+#: adf_core_python.core.agent.platoon.platoon.Platoon:1 of
+msgid "Bases: :py:class:`~adf_core_python.core.agent.agent.Agent`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:16
+msgid "adf\\_core\\_python.core.agent.platoon.platoon\\_ambulance module"
+msgstr ""
+
+#: adf_core_python.core.agent.platoon.platoon_ambulance.PlatoonAmbulance:1
+#: adf_core_python.core.agent.platoon.platoon_fire.PlatoonFire:1
+#: adf_core_python.core.agent.platoon.platoon_police.PlatoonPolice:1 of
+msgid "Bases: :py:class:`~adf_core_python.core.agent.platoon.platoon.Platoon`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:24
+msgid "adf\\_core\\_python.core.agent.platoon.platoon\\_fire module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:32
+msgid "adf\\_core\\_python.core.agent.platoon.platoon\\_police module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.platoon.rst:40
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.po
new file mode 100644
index 00000000..d9d8a76e
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.rst:2
+msgid "adf\\_core\\_python.core.agent package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.rst:20
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.rst:23
+msgid "adf\\_core\\_python.core.agent.agent module"
+msgstr ""
+
+#: adf_core_python.core.agent.agent.Agent:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.rst:31
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.precompute.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.precompute.po
new file mode 100644
index 00000000..67620c43
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.agent.precompute.po
@@ -0,0 +1,93 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.agent.precompute.rst:2
+msgid "adf\\_core\\_python.core.agent.precompute package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst:8
+msgid "adf\\_core\\_python.core.agent.precompute.precompute\\_data module"
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.is_available:1
+#: of
+msgid "Check if the precompute data is available."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.is_available:3
+#: of
+msgid "True if the precompute data is available, False otherwise."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst
+msgid "Return type"
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.read_json_data:1
+#: of
+msgid "Read the precompute data from the file."
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.read_json_data:3
+#: of
+msgid "The precompute data."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst
+msgid "Raises"
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.remove_precompute_data:1
+#: of
+msgid "Remove the precompute data file."
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.write_json_data:1
+#: of
+msgid "Write the precompute data to the file."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.agent.precompute.precompute_data.PrecomputeData.write_json_data:3
+#: of
+msgid "The data to write."
+msgstr ""
+
+#: ../../source/adf_core_python.core.agent.precompute.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.action.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.action.po
new file mode 100644
index 00000000..6d326d0b
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.action.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.action.rst:2
+msgid "adf\\_core\\_python.core.component.action package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.action.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.action.rst:8
+msgid "adf\\_core\\_python.core.component.action.extend\\_action module"
+msgstr ""
+
+#: adf_core_python.core.component.action.extend_action.ExtendAction:1 of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.action.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.communication.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.communication.po
new file mode 100644
index 00000000..1e125a3d
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.communication.po
@@ -0,0 +1,103 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.communication.rst:2
+msgid "adf\\_core\\_python.core.component.communication package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst:8
+msgid ""
+"adf\\_core\\_python.core.component.communication.channel\\_subscriber "
+"module"
+msgstr ""
+
+#: adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber:1
+#: adf_core_python.core.component.communication.communication_message.CommunicationMessage:1
+#: adf_core_python.core.component.communication.communication_module.CommunicationModule:1
+#: adf_core_python.core.component.communication.message_coordinator.MessageCoordinator:1
+#: of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber.subscribe:1
+#: of
+msgid "Subscribe to the channel."
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber.subscribe:3
+#: of
+msgid "The agent info."
+msgstr ""
+
+#: adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber.subscribe:5
+#: of
+msgid "The world info."
+msgstr ""
+
+#: adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber.subscribe:7
+#: of
+msgid "The scenario info."
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber.subscribe:10
+#: of
+msgid "The list of subscribed channels."
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst
+msgid "Return type"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst:16
+msgid ""
+"adf\\_core\\_python.core.component.communication.communication\\_message "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst:24
+msgid ""
+"adf\\_core\\_python.core.component.communication.communication\\_module "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst:32
+msgid ""
+"adf\\_core\\_python.core.component.communication.message\\_coordinator "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.communication.rst:40
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.algorithm.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.algorithm.po
new file mode 100644
index 00000000..33fd90eb
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.algorithm.po
@@ -0,0 +1,50 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.module.algorithm.rst:2
+msgid "adf\\_core\\_python.core.component.module.algorithm package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.algorithm.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.algorithm.rst:8
+msgid "adf\\_core\\_python.core.component.module.algorithm.clustering module"
+msgstr ""
+
+#: adf_core_python.core.component.module.algorithm.clustering.Clustering:1
+#: adf_core_python.core.component.module.algorithm.path_planning.PathPlanning:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.abstract_module.AbstractModule`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.algorithm.rst:16
+msgid "adf\\_core\\_python.core.component.module.algorithm.path\\_planning module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.algorithm.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.complex.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.complex.po
new file mode 100644
index 00000000..65e3113d
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.complex.po
@@ -0,0 +1,122 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:2
+msgid "adf\\_core\\_python.core.component.module.complex package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:8
+msgid ""
+"adf\\_core\\_python.core.component.module.complex.ambulance\\_target\\_allocator"
+" module"
+msgstr ""
+
+#: adf_core_python.core.component.module.complex.ambulance_target_allocator.AmbulanceTargetAllocator:1
+#: adf_core_python.core.component.module.complex.fire_target_allocator.FireTargetAllocator:1
+#: adf_core_python.core.component.module.complex.police_target_allocator.PoliceTargetAllocator:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.target_allocator.TargetAllocator`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:16
+msgid ""
+"adf\\_core\\_python.core.component.module.complex.fire\\_target\\_allocator"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:24
+msgid "adf\\_core\\_python.core.component.module.complex.human\\_detector module"
+msgstr ""
+
+#: adf_core_python.core.component.module.complex.human_detector.HumanDetector:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.target_detector.TargetDetector`\\"
+" [:py:class:`~rcrs_core.entities.human.Human`]"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:32
+msgid ""
+"adf\\_core\\_python.core.component.module.complex.police\\_target\\_allocator"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:40
+msgid "adf\\_core\\_python.core.component.module.complex.road\\_detector module"
+msgstr ""
+
+#: adf_core_python.core.component.module.complex.road_detector.RoadDetector:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.target_detector.TargetDetector`\\"
+" [:py:class:`~rcrs_core.entities.road.Road`]"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:48
+msgid "adf\\_core\\_python.core.component.module.complex.search module"
+msgstr ""
+
+#: adf_core_python.core.component.module.complex.search.Search:1 of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.target_detector.TargetDetector`\\"
+" [:py:class:`~rcrs_core.entities.area.Area`]"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:56
+msgid ""
+"adf\\_core\\_python.core.component.module.complex.target\\_allocator "
+"module"
+msgstr ""
+
+#: adf_core_python.core.component.module.complex.target_allocator.TargetAllocator:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.abstract_module.AbstractModule`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:64
+msgid "adf\\_core\\_python.core.component.module.complex.target\\_detector module"
+msgstr ""
+
+#: adf_core_python.core.component.module.complex.target_detector.TargetDetector:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.abstract_module.AbstractModule`,"
+" :py:class:`~typing.Generic`\\ "
+"[:py:obj:`~adf_core_python.core.component.module.complex.target_detector.T`]"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.complex.rst:72
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.po
new file mode 100644
index 00000000..4a2d3ba3
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.module.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.module.rst:2
+msgid "adf\\_core\\_python.core.component.module package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.rst:14
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.rst:17
+msgid "adf\\_core\\_python.core.component.module.abstract\\_module module"
+msgstr ""
+
+#: adf_core_python.core.component.module.abstract_module.AbstractModule:1 of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.module.rst:25
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.po
new file mode 100644
index 00000000..448531cf
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.rst:2
+msgid "adf\\_core\\_python.core.component package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.rst:16
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.rst:19
+msgid "adf\\_core\\_python.core.component.abstract\\_loader module"
+msgstr ""
+
+#: adf_core_python.core.component.abstract_loader.AbstractLoader:1 of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.rst:27
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.tactics.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.tactics.po
new file mode 100644
index 00000000..c32d3193
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.component.tactics.po
@@ -0,0 +1,95 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.component.tactics.rst:2
+msgid "adf\\_core\\_python.core.component.tactics package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:8
+msgid "adf\\_core\\_python.core.component.tactics.tactics\\_agent module"
+msgstr ""
+
+#: adf_core_python.core.component.tactics.tactics_agent.TacticsAgent:1
+#: adf_core_python.core.component.tactics.tactics_center.TacticsCenter:1 of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:16
+msgid ""
+"adf\\_core\\_python.core.component.tactics.tactics\\_ambulance\\_center "
+"module"
+msgstr ""
+
+#: adf_core_python.core.component.tactics.tactics_ambulance_center.TacticsAmbulanceCenter:1
+#: adf_core_python.core.component.tactics.tactics_fire_station.TacticsFireStation:1
+#: adf_core_python.core.component.tactics.tactics_police_office.TacticsPoliceOffice:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_center.TacticsCenter`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:24
+msgid ""
+"adf\\_core\\_python.core.component.tactics.tactics\\_ambulance\\_team "
+"module"
+msgstr ""
+
+#: adf_core_python.core.component.tactics.tactics_ambulance_team.TacticsAmbulanceTeam:1
+#: adf_core_python.core.component.tactics.tactics_fire_brigade.TacticsFireBrigade:1
+#: adf_core_python.core.component.tactics.tactics_police_force.TacticsPoliceForce:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_agent.TacticsAgent`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:32
+msgid "adf\\_core\\_python.core.component.tactics.tactics\\_center module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:40
+msgid "adf\\_core\\_python.core.component.tactics.tactics\\_fire\\_brigade module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:48
+msgid "adf\\_core\\_python.core.component.tactics.tactics\\_fire\\_station module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:56
+msgid "adf\\_core\\_python.core.component.tactics.tactics\\_police\\_force module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:64
+msgid ""
+"adf\\_core\\_python.core.component.tactics.tactics\\_police\\_office "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.component.tactics.rst:72
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.config.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.config.po
new file mode 100644
index 00000000..47ee2ded
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.config.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.config.rst:2
+msgid "adf\\_core\\_python.core.config package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.config.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.config.rst:8
+msgid "adf\\_core\\_python.core.config.config module"
+msgstr ""
+
+#: adf_core_python.core.config.config.Config:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.config.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.launcher.connect.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.launcher.connect.po
new file mode 100644
index 00000000..dc9c05d7
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.launcher.connect.po
@@ -0,0 +1,134 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:2
+msgid "adf\\_core\\_python.core.launcher.connect package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:8
+msgid "adf\\_core\\_python.core.launcher.connect.component\\_launcher module"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.component_launcher.ComponentLauncher:1
+#: adf_core_python.core.launcher.connect.connection.Connection:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:16
+msgid "adf\\_core\\_python.core.launcher.connect.connection module"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connection.Connection.connect:1 of
+msgid "Connect to the kernel"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst
+msgid "Raises"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connection.Connection.connect:3 of
+msgid "If the connection times out"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connection.Connection.connect:4 of
+msgid "If there is an error connecting to the socket"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connection.Connection.parse_message_from_kernel:1
+#: of
+msgid "Parse messages from the kernel"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connection.Connection.parse_message_from_kernel:3
+#: of
+msgid "If there is an error reading from the socket"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connection.Connection.parse_message_from_kernel:4
+#: of
+msgid "If there is an error in the agent calculation"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:24
+msgid "adf\\_core\\_python.core.launcher.connect.connector module"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connector.Connector:1 of
+msgid "Bases: :py:class:`~abc.ABC`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:32
+msgid ""
+"adf\\_core\\_python.core.launcher.connect.connector\\_ambulance\\_center "
+"module"
+msgstr ""
+
+#: adf_core_python.core.launcher.connect.connector_ambulance_center.ConnectorAmbulanceCenter:1
+#: adf_core_python.core.launcher.connect.connector_ambulance_team.ConnectorAmbulanceTeam:1
+#: adf_core_python.core.launcher.connect.connector_fire_brigade.ConnectorFireBrigade:1
+#: adf_core_python.core.launcher.connect.connector_fire_station.ConnectorFireStation:1
+#: adf_core_python.core.launcher.connect.connector_police_force.ConnectorPoliceForce:1
+#: adf_core_python.core.launcher.connect.connector_police_office.ConnectorPoliceOffice:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.launcher.connect.connector.Connector`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:40
+msgid ""
+"adf\\_core\\_python.core.launcher.connect.connector\\_ambulance\\_team "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:48
+msgid ""
+"adf\\_core\\_python.core.launcher.connect.connector\\_fire\\_brigade "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:56
+msgid ""
+"adf\\_core\\_python.core.launcher.connect.connector\\_fire\\_station "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:64
+msgid ""
+"adf\\_core\\_python.core.launcher.connect.connector\\_police\\_force "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:72
+msgid ""
+"adf\\_core\\_python.core.launcher.connect.connector\\_police\\_office "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.connect.rst:80
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.launcher.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.launcher.po
new file mode 100644
index 00000000..ae5e4512
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.launcher.po
@@ -0,0 +1,51 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.launcher.rst:2
+msgid "adf\\_core\\_python.core.launcher package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.rst:13
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.rst:16
+msgid "adf\\_core\\_python.core.launcher.agent\\_launcher module"
+msgstr ""
+
+#: adf_core_python.core.launcher.agent_launcher.AgentLauncher:1
+#: adf_core_python.core.launcher.config_key.ConfigKey:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.rst:24
+msgid "adf\\_core\\_python.core.launcher.config\\_key module"
+msgstr ""
+
+#: ../../source/adf_core_python.core.launcher.rst:32
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.logger.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.logger.po
new file mode 100644
index 00000000..0890f2a4
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.logger.po
@@ -0,0 +1,79 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.logger.rst:2
+msgid "adf\\_core\\_python.core.logger package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.logger.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.core.logger.rst:8
+msgid "adf\\_core\\_python.core.logger.logger module"
+msgstr ""
+
+#: adf_core_python.core.logger.logger.get_agent_logger:1 of
+msgid ""
+"Get a logger with the given name and agent information. For agent "
+"logging, use this function to get a logger."
+msgstr ""
+
+#: ../../source/adf_core_python.core.logger.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.core.logger.logger.get_agent_logger:4
+#: adf_core_python.core.logger.logger.get_logger:4 of
+msgid "The name of the logger."
+msgstr ""
+
+#: adf_core_python.core.logger.logger.get_agent_logger:6 of
+msgid "The agent information."
+msgstr ""
+
+#: ../../source/adf_core_python.core.logger.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.core.logger.logger.get_agent_logger:9 of
+msgid "The logger with the given name and agent information."
+msgstr ""
+
+#: ../../source/adf_core_python.core.logger.rst
+msgid "Return type"
+msgstr ""
+
+#: adf_core_python.core.logger.logger.get_logger:1 of
+msgid ""
+"Get a logger with the given name. For kernel logging, use this function "
+"to get a logger."
+msgstr ""
+
+#: adf_core_python.core.logger.logger.get_logger:7 of
+msgid "The logger with the given name."
+msgstr ""
+
+#: ../../source/adf_core_python.core.logger.rst:16
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.po
new file mode 100644
index 00000000..5da18eb8
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.core.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.core.rst:2
+msgid "adf\\_core\\_python.core package"
+msgstr ""
+
+#: ../../source/adf_core_python.core.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.core.rst:17
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.action.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.action.po
new file mode 100644
index 00000000..f8504891
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.action.po
@@ -0,0 +1,68 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.action.rst:2
+msgid "adf\\_core\\_python.implement.action package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.action.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.action.rst:8
+msgid ""
+"adf\\_core\\_python.implement.action.default\\_extend\\_action\\_clear "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.action.default_extend_action_clear.DefaultExtendActionClear:1
+#: adf_core_python.implement.action.default_extend_action_move.DefaultExtendActionMove:1
+#: adf_core_python.implement.action.default_extend_action_rescue.DefaultExtendActionRescue:1
+#: adf_core_python.implement.action.default_extend_action_transport.DefaultExtendActionTransport:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.action.extend_action.ExtendAction`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.action.rst:16
+msgid ""
+"adf\\_core\\_python.implement.action.default\\_extend\\_action\\_move "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.action.rst:24
+msgid ""
+"adf\\_core\\_python.implement.action.default\\_extend\\_action\\_rescue "
+"module"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.action.rst:32
+msgid ""
+"adf\\_core\\_python.implement.action.default\\_extend\\_action\\_transport"
+" module"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.action.rst:40
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.algorithm.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.algorithm.po
new file mode 100644
index 00000000..5bab5300
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.algorithm.po
@@ -0,0 +1,60 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.module.algorithm.rst:2
+msgid "adf\\_core\\_python.implement.module.algorithm package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.algorithm.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.algorithm.rst:8
+msgid ""
+"adf\\_core\\_python.implement.module.algorithm.a\\_star\\_path\\_planning"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.algorithm.path_planning.PathPlanning`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.algorithm.rst:16
+msgid ""
+"adf\\_core\\_python.implement.module.algorithm.k\\_means\\_clustering "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.module.algorithm.k_means_clustering.KMeansClustering:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.algorithm.clustering.Clustering`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.algorithm.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.communication.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.communication.po
new file mode 100644
index 00000000..a598623e
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.communication.po
@@ -0,0 +1,97 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.module.communication.rst:2
+msgid "adf\\_core\\_python.implement.module.communication package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst:8
+msgid ""
+"adf\\_core\\_python.implement.module.communication.default\\_channel\\_subscriber"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.communication.channel_subscriber.ChannelSubscriber`"
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber.subscribe:1
+#: of
+msgid "Subscribe to the channel."
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst
+msgid "Parameters"
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber.subscribe:3
+#: of
+msgid "The agent info."
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber.subscribe:5
+#: of
+msgid "The world info."
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber.subscribe:7
+#: of
+msgid "The scenario info."
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst
+msgid "Returns"
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_channel_subscriber.DefaultChannelSubscriber.subscribe:10
+#: of
+msgid "The list of subscribed channels."
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst
+msgid "Return type"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst:16
+msgid ""
+"adf\\_core\\_python.implement.module.communication.default\\_message\\_coordinator"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.module.communication.default_message_coordinator.DefaultMessageCoordinator:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.communication.message_coordinator.MessageCoordinator`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.communication.rst:24
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.complex.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.complex.po
new file mode 100644
index 00000000..1c260b94
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.complex.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.module.complex.rst:2
+msgid "adf\\_core\\_python.implement.module.complex package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:8
+msgid ""
+"adf\\_core\\_python.implement.module.complex.default\\_ambulance\\_target\\_allocator"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_ambulance_target_allocator.DefaultAmbulanceTargetAllocator:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.ambulance_target_allocator.AmbulanceTargetAllocator`"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_ambulance_target_allocator.DefaultAmbulanceTargetAllocator.AmbulanceTeamInfo:1
+#: adf_core_python.implement.module.complex.default_fire_target_allocator.DefaultFireTargetAllocator.FireBrigadeInfo:1
+#: adf_core_python.implement.module.complex.default_police_target_allocator.DefaultPoliceTargetAllocator.PoliceForceInfo:1
+#: of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:16
+msgid ""
+"adf\\_core\\_python.implement.module.complex.default\\_fire\\_target\\_allocator"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_fire_target_allocator.DefaultFireTargetAllocator:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.fire_target_allocator.FireTargetAllocator`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:24
+msgid ""
+"adf\\_core\\_python.implement.module.complex.default\\_human\\_detector "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_human_detector.DefaultHumanDetector:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.human_detector.HumanDetector`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:32
+msgid ""
+"adf\\_core\\_python.implement.module.complex.default\\_police\\_target\\_allocator"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_police_target_allocator.DefaultPoliceTargetAllocator:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.police_target_allocator.PoliceTargetAllocator`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:40
+msgid ""
+"adf\\_core\\_python.implement.module.complex.default\\_road\\_detector "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_road_detector.DefaultRoadDetector:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.road_detector.RoadDetector`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:48
+msgid "adf\\_core\\_python.implement.module.complex.default\\_search module"
+msgstr ""
+
+#: adf_core_python.implement.module.complex.default_search.DefaultSearch:1 of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.module.complex.search.Search`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.complex.rst:56
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.po
new file mode 100644
index 00000000..8f4619a5
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.module.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.module.rst:2
+msgid "adf\\_core\\_python.implement.module package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.module.rst:15
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.po
new file mode 100644
index 00000000..2d6cdd9f
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.po
@@ -0,0 +1,48 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.rst:2
+msgid "adf\\_core\\_python.implement package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.rst:15
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.rst:18
+msgid "adf\\_core\\_python.implement.default\\_loader module"
+msgstr ""
+
+#: adf_core_python.implement.default_loader.DefaultLoader:1 of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.abstract_loader.AbstractLoader`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.rst:26
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.tactics.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.tactics.po
new file mode 100644
index 00000000..27c82fc0
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.implement.tactics.po
@@ -0,0 +1,112 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.implement.tactics.rst:2
+msgid "adf\\_core\\_python.implement.tactics package"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:5
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:8
+msgid ""
+"adf\\_core\\_python.implement.tactics.default\\_tactics\\_ambulance\\_center"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.tactics.default_tactics_ambulance_center.DefaultTacticsAmbulanceCenter:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_ambulance_center.TacticsAmbulanceCenter`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:16
+msgid ""
+"adf\\_core\\_python.implement.tactics.default\\_tactics\\_ambulance\\_team"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.tactics.default_tactics_ambulance_team.DefaultTacticsAmbulanceTeam:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_ambulance_team.TacticsAmbulanceTeam`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:24
+msgid ""
+"adf\\_core\\_python.implement.tactics.default\\_tactics\\_fire\\_brigade "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.tactics.default_tactics_fire_brigade.DefaultTacticsFireBrigade:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_fire_brigade.TacticsFireBrigade`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:32
+msgid ""
+"adf\\_core\\_python.implement.tactics.default\\_tactics\\_fire\\_station "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.tactics.default_tactics_fire_station.DefaultTacticsFireStation:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_fire_station.TacticsFireStation`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:40
+msgid ""
+"adf\\_core\\_python.implement.tactics.default\\_tactics\\_police\\_force "
+"module"
+msgstr ""
+
+#: adf_core_python.implement.tactics.default_tactics_police_force.DefaultTacticsPoliceForce:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_police_force.TacticsPoliceForce`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:48
+msgid ""
+"adf\\_core\\_python.implement.tactics.default\\_tactics\\_police\\_office"
+" module"
+msgstr ""
+
+#: adf_core_python.implement.tactics.default_tactics_police_office.DefaultTacticsPoliceOffice:1
+#: of
+msgid ""
+"Bases: "
+":py:class:`~adf_core_python.core.component.tactics.tactics_police_office.TacticsPoliceOffice`"
+msgstr ""
+
+#: ../../source/adf_core_python.implement.tactics.rst:56
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/adf_core_python.po b/docs/source/locale/en/LC_MESSAGES/adf_core_python.po
new file mode 100644
index 00000000..537693c5
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/adf_core_python.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/adf_core_python.rst:2
+msgid "adf\\_core\\_python package"
+msgstr ""
+
+#: ../../source/adf_core_python.rst:5
+msgid "Subpackages"
+msgstr ""
+
+#: ../../source/adf_core_python.rst:15
+msgid "Submodules"
+msgstr ""
+
+#: ../../source/adf_core_python.rst:18
+msgid "adf\\_core\\_python.launcher module"
+msgstr ""
+
+#: adf_core_python.launcher.Launcher:1 of
+msgid "Bases: :py:class:`object`"
+msgstr ""
+
+#: ../../source/adf_core_python.rst:26
+msgid "Module contents"
+msgstr ""
+
diff --git a/docs/source/locale/en/LC_MESSAGES/hands-on.po b/docs/source/locale/en/LC_MESSAGES/hands-on.po
new file mode 100644
index 00000000..47429b6f
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/hands-on.po
@@ -0,0 +1,284 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/hands-on/clustering.md:1
+msgid "クラスタリングモジュール"
+msgstr "Clustering Module"
+
+#: ../../source/hands-on/clustering.md:3
+msgid "クラスタリングモジュールの目的"
+msgstr "Purpose of the Clustering Module"
+
+#: ../../source/hands-on/clustering.md:5
+msgid "複数のエージェントを動かす場合は、それらのエージェントにどのように協調させるかが重要になります。RRSでは多くのチームが、エージェントに各々の担当地域を持たせ役割分担をおこなう協調を取り入れています(他の手段による協調も取り入れています)。担当地域を割り振るためには、地図上のオブジェクトをいくつかのグループに分ける必要があります。このようなグループ分けをしてそれらを管理する場合には、クラスタリングモジュールと呼ばれるモジュールを用います。"
+msgstr "When operating multiple agents, it is crucial to determine how to coordinate them. In RRS, many teams adopt coordination methods that assign each agent a designated area of responsibility (as well as other coordination methods). To assign these areas, objects on the map need to be divided into several groups. A module called the clustering module is used to manage these groupings."
+
+#: ../../source/hands-on/clustering.md:7
+msgid "本資料では、多くの世界大会参加チームが使用しているアルゴリズムを用いたクラスタリングモジュールの実装をおこないます。"
+msgstr "In this document, we will implement a clustering module using algorithms commonly employed by many teams participating in world championships."
+
+#: ../../source/hands-on/clustering.md:9
+msgid "開発するクラスタリングモジュールの概要"
+msgstr "Overview of the Clustering Module to Be Developed"
+
+#: ../../source/hands-on/clustering.md:11
+msgid "本資料で開発するモジュールは下の画像のように、"
+msgstr "The module developed in this document, as shown in the image below,"
+
+#: ../../source/hands-on/clustering.md:13
+msgid "k-means++アルゴリズムによって地図上のオブジェクトをエージェント数分の区画に分けます。"
+msgstr "Divides the objects on the map into sections equal to the number of agents using the k-means++ algorithm."
+
+#: ../../source/hands-on/clustering.md:14
+msgid "Hungarianアルゴリズムによってそれらの区画とエージェントを (間の距離の総和が最も小さくなるように)1対1で結びつけます。"
+msgstr "Assigns the sections to the agents in a one-to-one manner using the Hungarian algorithm, minimizing the total distance between them."
+
+#: ../../source/hands-on/clustering.md:16
+msgid ""
+msgstr ""
+
+#: ../../source/hands-on/clustering.md:16
+#: ../../source/hands-on/clustering.md:362
+msgid "クラスタリングの画像"
+msgstr "Clustering Image"
+
+#: ../../source/hands-on/clustering.md:18
+msgid "クラスタリングモジュールの実装"
+msgstr "Implementation of the Clustering Module"
+
+#: ../../source/hands-on/clustering.md:21 ../../source/hands-on/search.md:10
+msgid "以降の作業では、カレントディレクトリがプロジェクトのルートディレクトリであることを前提としています。"
+msgstr "The following tasks assume that the current directory is the root directory of the project."
+
+#: ../../source/hands-on/clustering.md:24
+msgid "まず、クラスタリングモジュールを記述するためのファイルを作成します。"
+msgstr "First, create a file to write the clustering module."
+
+#: ../../source/hands-on/clustering.md:31
+msgid "次に、クラスタリングモジュールの実装を行います。 以下のコードを `k_means_pp_clustering.py` に記述してください。"
+msgstr "Next, implement the clustering module. Write the following code into `k_means_pp_clustering.py`."
+
+#: ../../source/hands-on/clustering.md:295
+msgid "k-means++の実装は、scikit-learnの`KMeans`クラスを使用しています。`KMeans`クラスは、`n_clusters`で指定したクラスター数によって地図上のオブジェクトをクラスタリングします。クラスタリング結果は、`labels_`属性に格納されます。また、`cluster_centers_`属性には各クラスターの中心座標が格納されます。"
+msgstr "The implementation of k-means++ uses the `KMeans` class from scikit-learn. The `KMeans` class clusters objects on the map based on the number of clusters specified by `n_clusters`. The clustering results are stored in the `labels_` attribute, and the coordinates of each cluster center are stored in the `cluster_centers_` attribute."
+
+#: ../../source/hands-on/clustering.md:297
+msgid "hungarianアルゴリズムの実装は、scipyの`linear_sum_assignment`関数を使用しています。`linear_sum_assignment`関数は、コスト行列を引数として受け取り、最適な割り当てを行います。"
+msgstr "The implementation of the Hungarian algorithm uses the `linear_sum_assignment` function from scipy. The `linear_sum_assignment` function takes a cost matrix as an argument and performs optimal assignment."
+
+#: ../../source/hands-on/clustering.md:299
+msgid "次に、作成したモジュールを登録します。`config/module.yaml` を以下のように編集してください。"
+msgstr "Next, register the created module. Edit `config/module.yaml` as follows."
+
+#: ../../source/hands-on/clustering.md:310 ../../source/hands-on/search.md:160
+msgid "ターミナルを2つ起動します。"
+msgstr "Open two terminals."
+
+#: ../../source/hands-on/clustering.md:312 ../../source/hands-on/search.md:162
+msgid "片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:"
+msgstr "Open one terminal and start the simulation server with the following command:"
+
+#: ../../source/hands-on/clustering.md:320 ../../source/hands-on/search.md:170
+msgid "その後、別のターミナルを開き、エージェントを起動します:"
+msgstr "Then open another terminal and start the agent:"
+
+#: ../../source/hands-on/clustering.md:328
+msgid "エージェントが起動すると、標準出力にクラスタリング結果が表示されます。"
+msgstr "When the agent starts, the clustering results will be displayed in the standard output."
+
+#: ../../source/hands-on/clustering.md:335
+msgid "このままだと、クラスタリング結果がわかりにくいので、クラスタリング結果を地図上に表示してみましょう。"
+msgstr "As it is, the clustering results are not very clear, so let's display the clustering results on the map."
+
+#: ../../source/hands-on/clustering.md:337
+msgid "{download}`クラスターの可視化用スクリプト <./../download/cluster_plot.zip>`をダウンロードして解凍し、中の`main.py`の以下の部分に"
+msgstr "{download}`Download the cluster visualization script <./../download/cluster_plot.zip>` and extract it. Then, in `main.py`, modify the following part."
+
+#: ../../source/hands-on/clustering.md:344
+msgid "出力の`Clustered entities: `の後ろの部分の配列をコピーして貼り付けてください。"
+msgstr "Copy the array after `Clustered entities:` in the output and paste it."
+
+#: ../../source/hands-on/clustering.md:346
+msgid "例"
+msgstr "Example"
+
+#: ../../source/hands-on/clustering.md:353
+msgid "貼り付けたら、以下のコマンドを実行してください。"
+msgstr "After pasting, execute the following command."
+
+#: ../../source/hands-on/clustering.md:360
+msgid "以下のような画像が出力されます。"
+msgstr "An image like the one below will be output."
+
+#: ../../source/hands-on/clustering.md:362
+msgid ""
+msgstr ""
+
+#: ../../source/hands-on/search.md:1
+msgid "サーチモジュール"
+msgstr "Search Module"
+
+#: ../../source/hands-on/search.md:3
+msgid "サーチモジュールの概要"
+msgstr "Overview of the Search Module"
+
+#: ../../source/hands-on/search.md:5
+msgid ""
+"今回開発するモジュールは、`KMeansPPClustering` モジュールを用いた情報探索対象決定 (`Search`) モジュールです。 "
+"クラスタリングモジュールによってエージェント間で担当地域の分割をおこない、 担当地域内からランダムに探索対象として選択します。"
+msgstr ""
+"The module to be developed this time is the information search target determination (`Search`) module using the `KMeansPPClustering` module. "
+"The clustering module divides the areas of responsibility among agents and randomly selects search targets within the assigned areas."
+
+#: ../../source/hands-on/search.md:7
+msgid "サーチモジュールの実装の準備"
+msgstr "Preparation for Implementing the Search Module"
+
+#: ../../source/hands-on/search.md:13
+msgid "まず、サーチモジュールを記述するためのファイルを作成します。"
+msgstr "First, create a file to write the search module."
+
+#: ../../source/hands-on/search.md:19
+msgid ""
+"次に、サーチモジュールの実装を行います。 以下のコードを `k_means_pp_search.py` に記述してください。 "
+"これが今回実装するサーチモジュールの雛形になります。"
+msgstr ""
+"Next, implement the search module. Write the following code into `k_means_pp_search.py`. "
+"This will be the template for the search module to be implemented this time."
+
+#: ../../source/hands-on/search.md:67
+msgid "モジュールの登録"
+msgstr "Module Registration"
+
+#: ../../source/hands-on/search.md:69
+msgid "次に、作成したモジュールを登録します。 以下のように`config/module.yaml`の該当箇所を変更してください"
+msgstr "Next, register the created module. Modify the relevant section of `config/module.yaml` as follows."
+
+#: ../../source/hands-on/search.md:83
+msgid "モジュールの実装"
+msgstr "Module Implementation"
+
+#: ../../source/hands-on/search.md:85
+msgid "まず、`KMeansPPClustering` モジュールを呼び出せるようにします。"
+msgstr "First, make it possible to call the `KMeansPPClustering` module."
+
+#: ../../source/hands-on/search.md:87
+msgid "以下のコードを`config/module.yaml`に追記してください。"
+msgstr "Add the following code to `config/module.yaml`."
+
+#: ../../source/hands-on/search.md:94
+msgid "次に、`KMeansPPSearch` モジュールで `KMeansPPClustering` モジュールを呼び出せるようにします。"
+msgstr "Next, make it possible to call the `KMeansPPClustering` module in the `KMeansPPSearch` module."
+
+#: ../../source/hands-on/search.md:96 ../../source/hands-on/search.md:136
+msgid "以下のコードを `k_means_pp_search.py` に追記してください。"
+msgstr "Add the following code to `k_means_pp_search.py`."
+
+#: ../../source/hands-on/search.md:134
+msgid "そして、`calculate` メソッドでクラスタリングモジュールを呼び出し、探索対象を決定するように変更します。"
+msgstr "Then, modify the `calculate` method to call the clustering module and determine the search target."
+
+#: ../../source/hands-on/search.md:158
+msgid "以上で、`KMeansPPClustering` モジュールを用いた `KMeansPPSearch` モジュールの実装が完了しました。"
+msgstr "This completes the implementation of the `KMeansPPSearch` module using the `KMeansPPClustering` module."
+
+#: ../../source/hands-on/search.md:178
+msgid "モジュールの改善"
+msgstr "Module Improvement"
+
+#: ../../source/hands-on/search.md:180
+msgid ""
+"`KMeansPPSearch` モジュールは、クラスタリングモジュールを用いて担当地域内からランダムに探索対象を選択しています。 "
+"そのため、以下のような問題があります。"
+msgstr ""
+"The `KMeansPPSearch` module randomly selects search targets within the assigned areas using the clustering module. "
+"As a result, the following issues arise:"
+
+#: ../../source/hands-on/search.md:183
+msgid "探索対象がステップごとに変わってしまう"
+msgstr "The search target changes with each step"
+
+#: ../../source/hands-on/search.md:184
+msgid "目標にたどり着く前に探索対象が変わってしまうため、なかなか目標にたどり着けない"
+msgstr "The search target changes before reaching the goal, making it difficult to reach the goal"
+
+#: ../../source/hands-on/search.md:185
+msgid "色んなところにランダムに探索対象を選択することで、効率的な探索ができない"
+msgstr "Randomly selecting search targets in various places makes efficient searching impossible"
+
+#: ../../source/hands-on/search.md:186
+msgid "すでに探索したエンティティを再度探索対象として選択してしまうため、効率的な探索ができない"
+msgstr "Selecting already searched entities as search targets again makes efficient searching impossible"
+
+#: ../../source/hands-on/search.md:187 ../../source/hands-on/search.md:329
+msgid "近くに未探索のエンティティがあるのに、遠くのエンティティを探索対象として選択してしまう"
+msgstr "Selecting distant entities as search targets even though there are unexplored entities nearby"
+
+#: ../../source/hands-on/search.md:189
+msgid "などの問題があります。"
+msgstr "These are some of the issues."
+
+#: ../../source/hands-on/search.md:191
+msgid "課題"
+msgstr "Challenges"
+
+#: ../../source/hands-on/search.md:193
+msgid "`KMeansPPSearch` モジュールを改善し、より効率的な探索を行うモジュールを実装して見てください。"
+msgstr "Improve the `KMeansPPSearch` module and implement a module that performs more efficient searches."
+
+#: ../../source/hands-on/search.md:196
+msgid "ここに上げた問題以外にも、改善すべき点が存在すると思うので、それを改善していただいても構いません。"
+msgstr "There may be other points for improvement besides the issues listed here, so feel free to address them as well."
+
+#: ../../source/hands-on/search.md:200
+msgid "プログラム例のプログラムにも一部改善点があるので、余裕があったら修正してみてください。"
+msgstr "There are also some points for improvement in the example program, so try to fix them if you have time."
+
+#: ../../source/hands-on/search.md:203
+msgid "探索対象がステップごとに変わってしまう問題"
+msgstr "Issue of the search target changing with each step"
+
+#: ../../source/hands-on/search.md:205 ../../source/hands-on/search.md:248
+#: ../../source/hands-on/search.md:331
+msgid "方針のヒント"
+msgstr "Hints for the Approach"
+
+#: ../../source/hands-on/search.md:208
+msgid "一度選択した探索対象に到達するまで、探索対象を変更しないようにする"
+msgstr "Do not change the search target until the initially selected target is reached"
+
+#: ../../source/hands-on/search.md:211 ../../source/hands-on/search.md:254
+#: ../../source/hands-on/search.md:337
+msgid "プログラム例"
+msgstr "Example Program"
+
+#: ../../source/hands-on/search.md:246
+msgid "すでに探索したエンティティを再度探索対象として選択してしまう問題"
+msgstr "Issue of selecting already searched entities as search targets again"
+
+#: ../../source/hands-on/search.md:251
+msgid "すでに探索したエンティティを何かしらの方法で記録し、再度探索対象として選択しないようにする"
+msgstr "Record already searched entities in some way to avoid selecting them as search targets again"
+
+#: ../../source/hands-on/search.md:334
+msgid "エンティティ間の距離を計算し、もっとも近いエンティティを探索対象として選択する"
+msgstr "Calculate the distance between entities and select the closest entity as the search target"
diff --git a/docs/source/locale/en/LC_MESSAGES/index.po b/docs/source/locale/en/LC_MESSAGES/index.po
new file mode 100644
index 00000000..56c8eec5
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/index.po
@@ -0,0 +1,98 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/index.rst:35
+msgid "インストール"
+msgstr "Installation"
+
+#: ../../source/index.rst:42
+msgid "クイックスタート"
+msgstr "Quick Start"
+
+#: ../../source/index.rst:48
+msgid "チュートリアル"
+msgstr "Tutorial"
+
+#: ../../source/index.rst:58
+msgid "ハンズオン"
+msgstr "Hands-On"
+
+#: ../../source/index.rst:65
+msgid "APIドキュメント"
+msgstr "API Documentation"
+
+#: ../../source/index.rst:7
+msgid "adf-core-pythonのドキュメント"
+msgstr "adf-core-python Documentation"
+
+#: ../../source/index.rst:11
+msgid "現在このパッケージは開発中です。破壊的な変更が行われる可能性があります。"
+msgstr "This package is currently under development. Breaking changes may occur."
+
+#: ../../source/index.rst:15
+msgid "パッケージとしてまだ公開していないため、pip でインストールすることはできません。"
+msgstr "Since it has not been released as a package yet, it cannot be installed via pip."
+
+#: ../../source/index.rst:19
+msgid "以下の言語のドキュメントは機械翻訳を使用しています。翻訳の正確性については保証できません。 英語"
+msgstr "The following language documents use machine translation. The accuracy of the translation cannot be guaranteed. English"
+
+#: ../../source/index.rst:19
+msgid "概要"
+msgstr "Overview"
+
+#: ../../source/index.rst:20
+msgid ""
+"adf-core-pythonは、RoboCup Rescue "
+"Simulation(RRS)におけるエージェント開発を支援するためのライブラリ及びフレームワークです。 adf-core-"
+"pythonを使用することで、エージェントの開発を効率化し、再利用性を向上させることができます。"
+msgstr ""
+"adf-core-python is a library and framework to support agent development in RoboCup Rescue "
+"Simulation (RRS). By using adf-core-python, you can streamline agent development and improve reusability."
+
+#: ../../source/index.rst:24
+msgid "特徴"
+msgstr "Features"
+
+#: ../../source/index.rst:25
+msgid "adf-core-pythonには以下のような特徴があります。"
+msgstr "adf-core-python has the following features:"
+
+#: ../../source/index.rst:27
+msgid "**モジュール単位での開発**: モジュール単位でエージェント開発を行い、モジュールの入れ替えが容易です。"
+msgstr "**Module-based development**: Develop agents on a module basis, making it easy to replace modules."
+
+#: ../../source/index.rst:28
+msgid "**モジュールの再利用**: 他のエージェントで使用されているモジュールを再利用することができます。"
+msgstr "**Module reuse**: Reuse modules used by other agents."
+
+#: ../../source/index.rst:29
+msgid "**エージェントの開発に集中**: シミュレーションサーバーとの通信やログ出力などの共通処理をライブラリが提供します。"
+msgstr "**Focus on agent development**: The library provides common processing such as communication with the simulation server and log output."
+
+#: ../../source/index.rst:32
+msgid "はじめに"
+msgstr "Getting Started"
+
+#: ../../source/index.rst:33
+msgid "adf-core-pythonを始めるには、インストールに従い、このドキュメントに記載されているチュートリアルやハンズオンを参照してください。"
+msgstr "To get started with adf-core-python, follow the installation and refer to the tutorials and hands-on in this document."
diff --git a/docs/source/locale/en/LC_MESSAGES/install.po b/docs/source/locale/en/LC_MESSAGES/install.po
new file mode 100644
index 00000000..9e2e4c3b
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/install.po
@@ -0,0 +1,387 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/install/environment/environment.md:1
+msgid "環境構築"
+msgstr "Environment Setup"
+
+#: ../../source/install/environment/environment.md:3
+msgid ""
+"adf-core-pythonをインストールするには以下の必要条件が必要です。 "
+"既にお使いのPCにインストールされている場合は再度インストールする必要はありません。"
+msgstr ""
+"To install adf-core-python, the following prerequisites are required. "
+"If they are already installed on your PC, you do not need to reinstall them."
+
+#: ../../source/install/environment/environment.md:6
+msgid "必要条件"
+msgstr "Prerequisites"
+
+#: ../../source/install/environment/environment.md:8
+msgid "Git"
+msgstr "Git"
+
+#: ../../source/install/environment/environment.md:9
+#: ../../source/install/install/install.md:9
+msgid "Python 3.12 以上"
+msgstr "Python 3.12 or higher"
+
+#: ../../source/install/environment/environment.md:10
+msgid "OpenJDK 17"
+msgstr "OpenJDK 17"
+
+#: ../../source/install/environment/environment.md:12
+msgid "各OSでのインストール方法は以下のページをそれぞれ参照してください"
+msgstr "Refer to the following pages for installation methods for each OS"
+
+#: ../../source/install/environment/environment.md:14
+msgid "[Windowsでの必要条件のインストール方法](./windows/install.md)"
+msgstr "[How to install prerequisites on Windows](./windows/install.md)"
+
+#: ../../source/install/environment/environment.md:16
+msgid "[MacOSでの必要条件のインストール方法](./mac/install.md)"
+msgstr "[How to install prerequisites on MacOS](./mac/install.md)"
+
+#: ../../source/install/environment/environment.md:18
+msgid "[Linuxでの必要条件のインストール方法](./linux/install.md)"
+msgstr "[How to install prerequisites on Linux](./linux/install.md)"
+
+#: ../../source/install/environment/environment.md:20
+msgid "シミュレーションサーバーのインストール"
+msgstr "Installing the Simulation Server"
+
+#: ../../source/install/environment/environment.md:22
+msgid "次にRoboCup Rescue Simulationのシミュレーションサーバーをインストールします。"
+msgstr "Next, install the RoboCup Rescue Simulation server."
+
+#: ../../source/install/environment/environment.md:25
+msgid "WORKING_DIR は任意のディレクトリを作成、指定してください。"
+msgstr "Create and specify any directory as WORKING_DIR."
+
+#: ../../source/install/environment/environment.md:36
+msgid "ビルドした際に以下のようなメッセージが表示されたら成功です。"
+msgstr "If the following message is displayed when you build, it is successful."
+
+#: ../../source/install/environment/environment.md:42
+msgid "シミュレーションサーバーの動作確認"
+msgstr "Simulation Server Operation Check"
+
+#: ../../source/install/environment/environment.md:49
+msgid ""
+msgstr ""
+
+#: ../../source/install/environment/environment.md:49
+msgid "シミュレーションサーバーの起動"
+msgstr "Launching the Simulation Server"
+
+#: ../../source/install/environment/environment.md:51
+msgid ""
+"上記のように何個かのウィンドウが表示されたら成功です。 コマンドラインで `Ctrl + C` (MacOSの場合は `Command + C`"
+" ) を押すとシミュレーションサーバーが終了します。"
+msgstr ""
+"If several windows are displayed as shown above, it is successful. Press `Ctrl + C` (or `Command + C` on MacOS) in the command line to stop the simulation server."
+
+#: ../../source/install/environment/environment.md:55
+msgid "シミュレーションサーバーを停止させたあとは、プロセスが残ってしまう場合があるので`./kill.sh` を実行してください。"
+msgstr "After stopping the simulation server, run `./kill.sh` as there may be remaining processes."
+
+#: ../../source/install/environment/linux/install.md:1
+msgid "Linuxでの環境構築"
+msgstr "Environment Setup on Linux"
+
+#: ../../source/install/environment/linux/install.md:3
+#: ../../source/install/environment/windows/install.md:3
+msgid "1. Gitのインストール"
+msgstr "1. Installing Git"
+
+#: ../../source/install/environment/linux/install.md:5
+#: ../../source/install/environment/mac/install.md:3
+#: ../../source/install/environment/mac/install.md:20
+msgid "Terminalを起動し、以下のコマンドを実行します。"
+msgstr "Open the terminal and run the following command."
+
+#: ../../source/install/environment/linux/install.md:10
+msgid "もし、`command not found`などのエラーが出た場合、OS標準のパッケージマネージャーを使用してインストールします。"
+msgstr "If you get an error like `command not found`, use the OS's standard package manager to install."
+
+#: ../../source/install/environment/linux/install.md:11
+#: ../../source/install/environment/linux/install.md:85
+#: ../../source/install/environment/linux/install.md:122
+msgid "DebianベースのOSの場合(Ubuntuなど)"
+msgstr "For Debian-based OS (e.g., Ubuntu)"
+
+#: ../../source/install/environment/linux/install.md:17
+#: ../../source/install/environment/linux/install.md:91
+#: ../../source/install/environment/linux/install.md:128
+msgid "Red HatベースのOSの場合(Fedoraなど)"
+msgstr "For Red Hat-based OS (e.g., Fedora)"
+
+#: ../../source/install/environment/linux/install.md:26
+#: ../../source/install/environment/linux/install.md:109
+#: ../../source/install/environment/linux/install.md:137
+#: ../../source/install/environment/mac/install.md:28
+#: ../../source/install/environment/mac/install.md:43
+#: ../../source/install/environment/mac/install.md:58
+msgid "以下のコマンドを入力し、バージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)"
+msgstr "Enter the following command, and if the version is displayed, it is successful. (If not displayed, restart the terminal.)"
+
+#: ../../source/install/environment/linux/install.md:31
+#: ../../source/install/environment/windows/install.md:14
+msgid "2. Pythonのインストール"
+msgstr "2. Installing Python"
+
+#: ../../source/install/environment/linux/install.md:33
+#: ../../source/install/environment/mac/install.md:35
+msgid "Terminalを起動し、以下のコマンドを実行します。また、バージョンが3.12以上になっていることを確認します。"
+msgstr "Open the terminal and run the following command. Also, make sure the version is 3.12 or higher."
+
+#: ../../source/install/environment/linux/install.md:38
+msgid ""
+"もし、`command not "
+"found`などのエラーが出た場合やバージョンが低い場合、Pythonのバージョン管理ツールであるpyenvを使用してインストールします"
+msgstr ""
+"If you get an error like `command not found` or the version is low, use the Python version management tool pyenv to install."
+
+#: ../../source/install/environment/linux/install.md:41
+msgid "インストール方法の内容が最新ではない場合があるため、[https://github.com/pyenv/pyenv](https://github.com/pyenv/pyenv)を参照してください。"
+msgstr "The installation method may not be up to date, so please refer to [https://github.com/pyenv/pyenv](https://github.com/pyenv/pyenv)."
+
+#: ../../source/install/environment/linux/install.md:44
+msgid "以下のコマンドを実行します。"
+msgstr "Run the following command."
+
+#: ../../source/install/environment/linux/install.md:49
+msgid "次に以下のコマンドを実行して、使用しているShellを確認します。"
+msgstr "Next, run the following command to check the shell you are using."
+
+#: ../../source/install/environment/linux/install.md:54
+msgid "表示されたShellに従ってコマンドを実行してください。"
+msgstr "Follow the commands according to the displayed shell."
+
+#: ../../source/install/environment/linux/install.md:56
+msgid "`bash`が表示された方は以下のコマンドを実行してください"
+msgstr "If `bash` is displayed, run the following command."
+
+#: ../../source/install/environment/linux/install.md:70
+msgid "`zsh`が表示された方は以下のコマンドを実行してください"
+msgstr "If `zsh` is displayed, run the following command."
+
+#: ../../source/install/environment/linux/install.md:77
+msgid "`fish`が表示された方は以下のコマンドを実行してください"
+msgstr "If `fish` is displayed, run the following command."
+
+#: ../../source/install/environment/linux/install.md:84
+msgid "必要パッケージのインストール"
+msgstr "Installing necessary packages"
+
+#: ../../source/install/environment/linux/install.md:100
+msgid "python3.12のインストール"
+msgstr "Installing python3.12"
+
+#: ../../source/install/environment/linux/install.md:114
+#: ../../source/install/environment/mac/install.md:48
+#: ../../source/install/environment/windows/install.md:24
+msgid "3. OpenJDKのインストール"
+msgstr "3. Installing OpenJDK"
+
+#: ../../source/install/environment/linux/install.md:116
+#: ../../source/install/environment/mac/install.md:50
+msgid "Terminalを起動し、以下のコマンドを実行します。また、バージョンが17になっていることを確認します。"
+msgstr "Open the terminal and run the following command. Also, make sure the version is 17."
+
+#: ../../source/install/environment/linux/install.md:121
+msgid ""
+"もし、`command not "
+"found`などのエラーが出た場合やバージョンが異なる場合、OS標準のパッケージマネージャーを使用してインストールします"
+msgstr ""
+"If you get an error like `command not found` or the version is different, use the OS's standard package manager to install."
+
+#: ../../source/install/environment/mac/install.md:1
+msgid "Macでの環境構築"
+msgstr "Environment Setup on Mac"
+
+#: ../../source/install/environment/mac/install.md:2
+msgid "1. Homebrewのインストール"
+msgstr "1. Installing Homebrew"
+
+#: ../../source/install/environment/mac/install.md:8
+#: ../../source/install/environment/mac/install.md:24
+msgid "もし、`command not found`などのエラーが出た場合、以下のコマンドを実行します。"
+msgstr "If you get an error like `command not found`, run the following command."
+
+#: ../../source/install/environment/mac/install.md:13
+msgid "もう一度、以下のコマンドを実行してバージョンが表示されたら成功です。(表示されない方はTerminalを再起動してください)"
+msgstr "Run the following command again, and if the version is displayed, it is successful. (If not displayed, restart the terminal.)"
+
+#: ../../source/install/environment/mac/install.md:18
+msgid "2. Gitのインストール"
+msgstr "2. Installing Git"
+
+#: ../../source/install/environment/mac/install.md:33
+msgid "3. Pythonのインストール"
+msgstr "3. Installing Python"
+
+#: ../../source/install/environment/mac/install.md:39
+msgid "もし、`command not found`などのエラーが出た場合やバージョンが低い場合、以下のコマンドを実行します。"
+msgstr "If you get an error like `command not found` or the version is low, run the following command."
+
+#: ../../source/install/environment/mac/install.md:54
+msgid "もし、`command not found`などのエラーが出た場合やバージョンが異なる場合、以下のコマンドを実行します。"
+msgstr "If you get an error like `command not found` or the version is different, run the following command."
+
+#: ../../source/install/environment/windows/install.md:1
+msgid "Windowsでの環境構築"
+msgstr "Environment Setup on Windows"
+
+#: ../../source/install/environment/windows/install.md:5
+msgid "[Git for Windows](https://gitforwindows.org/)の公式サイトにアクセスします。"
+msgstr "Access the [Git for Windows](https://gitforwindows.org/) official site."
+
+#: ../../source/install/environment/windows/install.md:6
+msgid "トップページの\"Download\"をクリックします"
+msgstr "Click \"Download\" on the top page."
+
+#: ../../source/install/environment/windows/install.md:7
+#: ../../source/install/environment/windows/install.md:18
+msgid "ダウンロードが完了した後、インストーラーを実行します。"
+msgstr "After the download is complete, run the installer."
+
+#: ../../source/install/environment/windows/install.md:8
+msgid "全て\"Next\"をクリックします。"
+msgstr "Click \"Next\" for all steps."
+
+#: ../../source/install/environment/windows/install.md:9
+#: ../../source/install/environment/windows/install.md:20
+msgid "インストールが完了するまで待ちます。"
+msgstr "Wait for the installation to complete."
+
+#: ../../source/install/environment/windows/install.md:10
+msgid "インストールが完了したら\"Finish\"をクリックします。"
+msgstr "Click \"Finish\" when the installation is complete."
+
+#: ../../source/install/environment/windows/install.md:11
+msgid "検索バーに\"Git Bash\"と入力し、Git Bashを実行します。"
+msgstr "Enter \"Git Bash\" in the search bar and run Git Bash."
+
+#: ../../source/install/environment/windows/install.md:12
+msgid "画面が表示されていたらインストール成功です。"
+msgstr "If the screen is displayed, the installation is successful."
+
+#: ../../source/install/environment/windows/install.md:16
+msgid "[Python](https://www.python.org/)の公式サイトにアクセスします。"
+msgstr "Access the [Python](https://www.python.org/) official site."
+
+#: ../../source/install/environment/windows/install.md:17
+msgid "トップページの\"Download Python ~\"をクリックします"
+msgstr "Click \"Download Python ~\" on the top page."
+
+#: ../../source/install/environment/windows/install.md:19
+msgid "\"Add python.exe to PATH\"にチェックが入っていることを確認した後、\"Install Now\"をクリックします。"
+msgstr "Make sure \"Add python.exe to PATH\" is checked, then click \"Install Now\"."
+
+#: ../../source/install/environment/windows/install.md:21
+msgid "インストールが完了したら\"Close\"をクリックします。"
+msgstr "Click \"Close\" when the installation is complete."
+
+#: ../../source/install/environment/windows/install.md:22
+msgid ""
+"Git Bashを開き、`python --version`と入力し、`Python "
+"[バージョン]`が表示されたら成功です。(もし表示されない場合はGit Bashを開き直してください)"
+msgstr ""
+"Open Git Bash, enter `python --version`, and if `Python [version]` is displayed, it is successful. (If not displayed, reopen Git Bash.)"
+
+#: ../../source/install/environment/windows/install.md:26
+msgid "[OpenJDK](https://jdk.java.net/archive/)のダウンロードページにアクセスします。"
+msgstr "Access the [OpenJDK](https://jdk.java.net/archive/) download page."
+
+#: ../../source/install/environment/windows/install.md:27
+msgid "17.0.2のWindowsの横にある\"zip\"をクリックします。"
+msgstr "Click \"zip\" next to Windows for version 17.0.2."
+
+#: ../../source/install/environment/windows/install.md:28
+msgid "ダウンロードしたzipを展開(解凍)します。"
+msgstr "Extract the downloaded zip file."
+
+#: ../../source/install/environment/windows/install.md:29
+msgid "展開(解凍)すると\"jdk-17.0.2\"のようなフォルダができるのを確認します。"
+msgstr "Confirm that a folder like \"jdk-17.0.2\" is created after extraction."
+
+#: ../../source/install/environment/windows/install.md:30
+msgid "このフォルダ\"jdk-17.0.2\"を`C:¥`の直下に移動させます。"
+msgstr "Move this folder \"jdk-17.0.2\" to the root of `C:¥`."
+
+#: ../../source/install/environment/windows/install.md:31
+msgid "Windowsでコマンドプロンプトを管理者として実行します。"
+msgstr "Run the command prompt as an administrator on Windows."
+
+#: ../../source/install/environment/windows/install.md:32
+msgid "開いたら以下のコマンドを実行します。"
+msgstr "Once opened, run the following command."
+
+#: ../../source/install/environment/windows/install.md:36
+msgid "次に以下のコマンドを実行します。"
+msgstr "Next, run the following command."
+
+#: ../../source/install/environment/windows/install.md:40
+msgid "Git Bashを開き、`java -version`と入力します。 以下のような文字が表示されたらインストール成功です。"
+msgstr "Open Git Bash and enter `java -version`. If the following text is displayed, the installation is successful."
+
+#: ../../source/install/install/install.md:1
+msgid "インストール"
+msgstr "Installation"
+
+#: ../../source/install/install/install.md:3
+msgid "このセクションでは、パッケージのインストール方法について説明します。"
+msgstr "This section explains how to install the package."
+
+#: ../../source/install/install/install.md:5
+msgid "前提条件"
+msgstr "Prerequisites"
+
+#: ../../source/install/install/install.md:7
+msgid "インストールする前に、以下の前提条件を確認してください:"
+msgstr "Before installing, please check the following prerequisites:"
+
+#: ../../source/install/install/install.md:10
+msgid "pip"
+msgstr "pip"
+
+#: ../../source/install/install/install.md:12
+msgid "パッケージのインストール"
+msgstr "Installing the package"
+
+#: ../../source/install/install/install.md:14
+msgid "パッケージをインストールするには、次のコマンドを実行します:"
+msgstr "To install the package, run the following command:"
+
+#: ../../source/install/install/install.md:20
+msgid "インストールの確認"
+msgstr "Verifying the installation"
+
+#: ../../source/install/install/install.md:22
+msgid "インストールを確認するには、次のコマンドを実行します:"
+msgstr "To verify the installation, run the following command:"
+
+#: ../../source/install/install/install.md:28
+msgid "パッケージが正しくインストールされている場合、パッケージのバージョン番号などが表示されます。"
+msgstr "If the package is installed correctly, the package version number, etc., will be displayed."
+
diff --git a/docs/source/locale/en/LC_MESSAGES/modules.po b/docs/source/locale/en/LC_MESSAGES/modules.po
new file mode 100644
index 00000000..49c7a03a
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/modules.po
@@ -0,0 +1,26 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/modules.rst:2
+msgid "adf_core_python"
+msgstr "adf_core_python"
+
diff --git a/docs/source/locale/en/LC_MESSAGES/quickstart.po b/docs/source/locale/en/LC_MESSAGES/quickstart.po
new file mode 100644
index 00000000..af56f571
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/quickstart.po
@@ -0,0 +1,77 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/quickstart/quickstart.md:1
+msgid "クイックスタート"
+msgstr "Quick Start"
+
+#: ../../source/quickstart/quickstart.md:3
+msgid "前提条件"
+msgstr "Prerequisites"
+
+#: ../../source/quickstart/quickstart.md:5
+msgid "インストールする前に、以下の前提条件を確認してください:"
+msgstr "Before installing, please check the following prerequisites:"
+
+#: ../../source/quickstart/quickstart.md:7
+msgid "Python 3.12 以上"
+msgstr "Python 3.12 or higher"
+
+#: ../../source/quickstart/quickstart.md:8
+msgid "pip"
+msgstr "pip"
+
+#: ../../source/quickstart/quickstart.md:10
+msgid "パッケージのインストール"
+msgstr "Package Installation"
+
+#: ../../source/quickstart/quickstart.md:12
+msgid "パッケージをインストールするには、次のコマンドを実行します:"
+msgstr "To install the package, run the following command:"
+
+#: ../../source/quickstart/quickstart.md:18
+msgid "新規エージェントの作成"
+msgstr "Creating a New Agent"
+
+#: ../../source/quickstart/quickstart.md:20
+msgid "新規エージェントを作成するには、次のコマンドを実行します:"
+msgstr "To create a new agent, run the following command:"
+
+#: ../../source/quickstart/quickstart.md:26
+msgid "実行すると、下記のような対話形式のプロンプトが表示されます:"
+msgstr "When executed, an interactive prompt like the one below will be displayed:"
+
+#: ../../source/quickstart/quickstart.md:33
+msgid "入力後、下記のようなエージェントのテンプレートがカレントディレクトリに作成されます。"
+msgstr "After input, an agent template like the one below will be created in the current directory."
+
+#: ../../source/quickstart/quickstart.md:55
+msgid "エージェントを実行する"
+msgstr "Running the Agent"
+
+#: ../../source/quickstart/quickstart.md:57
+msgid "エージェントを実行するには、シミュレーションサーバーを起動し、次のコマンドを実行します:"
+msgstr "To run the agent, start the simulation server and run the following command:"
+
+#: ../../source/quickstart/quickstart.md:63
+msgid "エージェントの実行が開始され、シミュレーションサーバーとの通信が開始されます。"
+msgstr "The agent execution will start, and communication with the simulation server will begin."
diff --git a/docs/source/locale/en/LC_MESSAGES/tutorial.po b/docs/source/locale/en/LC_MESSAGES/tutorial.po
new file mode 100644
index 00000000..8aa509ea
--- /dev/null
+++ b/docs/source/locale/en/LC_MESSAGES/tutorial.po
@@ -0,0 +1,626 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2024, Haruki Uehara, Yuki Shimada
+# This file is distributed under the same license as the adf-core-python
+# package.
+# FIRST AUTHOR , 2024.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: adf-core-python \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-19 13:59+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language: en\n"
+"Language-Team: en \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.16.0\n"
+
+#: ../../source/tutorial/agent/agent.md:1
+msgid "エージェントの作成"
+msgstr "Creating an Agent"
+
+#: ../../source/tutorial/agent/agent.md:3
+msgid "このセクションでは、`adf-core-python` ライブラリの使用方法の概要を提供します。"
+msgstr "This section provides an overview of how to use the `adf-core-python` library."
+
+#: ../../source/tutorial/agent/agent.md:5
+msgid "新規エージェントの作成"
+msgstr "Creating a New Agent"
+
+#: ../../source/tutorial/agent/agent.md:7
+msgid "新規エージェントを作成するには、次のコマンドを実行します:"
+msgstr "To create a new agent, run the following command:"
+
+#: ../../source/tutorial/agent/agent.md:13
+msgid "実行すると、下記のような対話形式のプロンプトが表示されます:"
+msgstr "When executed, an interactive prompt like the one below will be displayed:"
+
+#: ../../source/tutorial/agent/agent.md:21
+msgid ""
+"エージェントチーム名は、エージェントのディレクトリ名として使用されます。 以後、エージェントチーム名を `` "
+"として参照します。"
+msgstr ""
+"The agent team name will be used as the directory name for the agent. Hereafter, the agent team name will be referred to as ``."
+
+#: ../../source/tutorial/agent/agent.md:25
+msgid "入力後、下記のようなエージェントのテンプレートがカレントディレクトリに作成されます。"
+msgstr "After entering, an agent template like the one below will be created in the current directory."
+
+#: ../../source/tutorial/agent/agent.md:47
+msgid "シミュレーションを実行する"
+msgstr "Running the Simulation"
+
+#: ../../source/tutorial/agent/agent.md:49
+#: ../../source/tutorial/agent/agent_control.md:110
+#: ../../source/tutorial/agent/agent_control.md:330
+msgid "ターミナルを2つ起動します。"
+msgstr "Open two terminals."
+
+#: ../../source/tutorial/agent/agent.md:51
+#: ../../source/tutorial/agent/agent_control.md:112
+#: ../../source/tutorial/agent/agent_control.md:332
+msgid "片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:"
+msgstr "Open one terminal and start the simulation server with the following command:"
+
+#: ../../source/tutorial/agent/agent.md:59
+#: ../../source/tutorial/agent/agent_control.md:120
+#: ../../source/tutorial/agent/agent_control.md:340
+msgid "その後、別のターミナルを開き、エージェントを起動します:"
+msgstr "Then, open another terminal and start the agent:"
+
+#: ../../source/tutorial/agent/agent.md:67
+msgid ""
+"エージェントが正常に起動すると、シミュレーションサーバーに接続され、エージェントがシミュレーションに参加し、エージェントが動き出します。 "
+"途中で止めたい場合は、それぞれのコマンドラインで `Ctrl + C` (MacOSの場合は `Command + C` ) を押してください。"
+msgstr ""
+"When the agent starts successfully, it will connect to the simulation server, participate in the simulation, and start moving. "
+"If you want to stop it midway, press `Ctrl + C` (or `Command + C` on MacOS) in each command line."
+
+#: ../../source/tutorial/agent/agent.md:71
+msgid "シミュレーションサーバーを停止させたあとは、プロセスが残ってしまう場合があるので`./kill.sh` を実行してください。"
+msgstr "After stopping the simulation server, run `./kill.sh` as there may be remaining processes."
+
+#: ../../source/tutorial/agent/agent_control.md:1
+msgid "エージェントの制御"
+msgstr "Agent Control"
+
+#: ../../source/tutorial/agent/agent_control.md:3
+msgid "このセクションでは、エージェントの制御用のプログラムを作成する方法について説明します。"
+msgstr "This section explains how to create a program to control agents."
+
+#: ../../source/tutorial/agent/agent_control.md:5
+msgid "エージェントの制御について"
+msgstr "About Agent Control"
+
+#: ../../source/tutorial/agent/agent_control.md:7
+msgid "RRSの災害救助エージェントは3種類あり、種類毎にそれぞれ異なるプログラムを書く必要があります。しかし、初めから全てのプログラムを書くことは困難です。ここではまず初めに、消防隊エージェントを操作するプログラムの一部を書いてみましょう。"
+msgstr "There are three types of disaster rescue agents in RRS, and each type requires a different program. However, it is difficult to write all the programs from the beginning. Here, let's first write part of the program to control the fire brigade agent."
+
+#: ../../source/tutorial/agent/agent_control.md:10
+msgid ""
+"エージェントを操作するプログラムは、エージェントの種類毎に同一です。 プログラムは各エージェントに配られ、そのエージェントのみの操作を担います。 "
+"消防隊エージェントを操作するプログラムを書けば、それがすべての消防隊エージェント上でそれぞれ動作します。"
+msgstr ""
+"The program that controls the agents is the same for each type of agent. The program is distributed to each agent and is responsible for controlling only that agent. "
+"If you write a program to control the fire brigade agent, it will run on all fire brigade agents."
+
+#: ../../source/tutorial/agent/agent_control.md:13
+msgid ""
+msgstr ""
+
+#: ../../source/tutorial/agent/agent_control.md:13
+msgid "消防隊エージェント"
+msgstr "Fire Brigade Agent"
+
+#: ../../source/tutorial/agent/agent_control.md:15
+msgid "エージェントの動作フロー"
+msgstr "Agent Operation Flow"
+
+#: ../../source/tutorial/agent/agent_control.md:17
+msgid "エージェントの動作を決めているのはTacticsというプログラムです。"
+msgstr "The program that determines the agent's actions is called Tactics."
+
+#: ../../source/tutorial/agent/agent_control.md:19
+msgid ""
+"消防隊の思考ルーチンは下の図の通りにおおよそおこなわれます。 消防隊の動作としては、まず救助対象の市民を捜索し(`Human "
+"Detector`)、見つかった市民を救助します(`Action Rescue`)。 "
+"救助対象の市民が見つからない場合は、探索場所を変更して市民を捜索するため、次の捜索場所を決定して(`Search`)移動します(`Action "
+"Ext move`)。 "
+"なお、エージェントは1ステップ内で、移動と救助活動を同時におこなうことが出来ません。つまり、ステップごとに更新される自身の周辺情報を確認して、動作の対象と動作内容を決定していくということになります。"
+" これらそれぞれの機能が、モジュールと呼ばれるプログラムとして分割して表現されています。"
+msgstr ""
+"The fire brigade's thought routine is roughly as shown in the diagram below. The fire brigade's actions are to first search for the target citizen (`Human Detector`) and rescue the found citizen (`Action Rescue`). "
+"If no target citizen is found, the search location is changed to search for citizens, the next search location is determined (`Search`), and the agent moves (`Action Ext move`). "
+"Note that the agent cannot perform both movement and rescue activities within one step. In other words, the agent checks the updated surrounding information at each step and determines the target and action content. "
+"Each of these functions is expressed as a program called a module."
+
+#: ../../source/tutorial/agent/agent_control.md:21
+msgid "今回はこの中で、救助(掘り起こし)対象を決定する `Human Detector` モジュールを開発します。"
+msgstr "This time, we will develop the `Human Detector` module that determines the rescue (digging) target."
+
+#: ../../source/tutorial/agent/agent_control.md:23
+msgid ""
+msgstr ""
+
+#: ../../source/tutorial/agent/agent_control.md:23
+msgid "消防隊エージェントの動作フロー"
+msgstr "Fire Brigade Agent Operation Flow"
+
+#: ../../source/tutorial/agent/agent_control.md:25
+msgid "`Human Detector` モジュールの実装の準備"
+msgstr "Preparing to Implement the `Human Detector` Module"
+
+#: ../../source/tutorial/agent/agent_control.md:27
+msgid "まず、`Human Detector` モジュールを記述するためのファイルを作成します。"
+msgstr "First, create a file to describe the `Human Detector` module."
+
+#: ../../source/tutorial/agent/agent_control.md:34
+msgid ""
+"次に、`Human Detector` モジュールの雛形の実装を行います。 "
+"以下のコードを`fire_brigade_human_detector.py` に記述してください。"
+msgstr ""
+"Next, implement the template for the `Human Detector` module. "
+"Please write the following code in `fire_brigade_human_detector.py`."
+
+#: ../../source/tutorial/agent/agent_control.md:92
+msgid "モジュールの登録"
+msgstr "Registering the Module"
+
+#: ../../source/tutorial/agent/agent_control.md:94
+msgid "次に、作成したモジュールを登録します。"
+msgstr "Next, register the created module."
+
+#: ../../source/tutorial/agent/agent_control.md:96
+msgid "`WORKING_DIR//config/module.yaml` ファイルを開き、以下の部分を"
+msgstr "Open the `WORKING_DIR//config/module.yaml` file and"
+
+#: ../../source/tutorial/agent/agent_control.md:103
+msgid "以下のように変更してください。"
+msgstr "change the following part as shown below."
+
+#: ../../source/tutorial/agent/agent_control.md:128
+msgid "標準出力に `Calculate FireBrigadeHumanDetector` と表示されれば成功です。"
+msgstr "If `Calculate FireBrigadeHumanDetector` is displayed in the standard output, it is successful."
+
+#: ../../source/tutorial/agent/agent_control.md:130
+msgid "`Human Detector` モジュールの設計"
+msgstr "Designing the `Human Detector` Module"
+
+#: ../../source/tutorial/agent/agent_control.md:132
+msgid "救助対象選択プログラムの中身を書き、消防隊エージェントが救助活動をおこなえるように修正します。"
+msgstr "Write the content of the rescue target selection program and modify it so that the fire brigade agent can perform rescue activities."
+
+#: ../../source/tutorial/agent/agent_control.md:134
+msgid ""
+"消防隊エージェントの救助対象を最も簡単に選択する方法は、埋没している市民の中で最も自身に近い市民を選択する方法です。 "
+"今回は、この方法を採用した消防隊エージェントの行動対象決定モジュールを書いてみましょう。"
+msgstr ""
+"The simplest way for a fire brigade agent to select a rescue target is to choose the closest buried citizen. "
+"This time, let's write a module to determine the action target of the fire brigade agent using this method."
+
+#: ../../source/tutorial/agent/agent_control.md:136
+msgid "埋没している市民の中で最も自身に近い市民を救助対象として選択する方法は、フローチャートで表すと下図のようになります。"
+msgstr ""
+"The method of selecting the closest buried citizen as the rescue target is shown in the flowchart below."
+
+#: ../../source/tutorial/agent/agent_control.md:138
+msgid ""
+msgstr ""
+
+#: ../../source/tutorial/agent/agent_control.md:138
+msgid "救助対象選択フローチャート"
+msgstr "Rescue Target Selection Flowchart"
+
+#: ../../source/tutorial/agent/agent_control.md:140
+msgid ""
+"このフローチャート中の各処理を、次小節で紹介する各クラス・メソッド等で置き換えたものを、`fire_brigade_human_detector.py`"
+" に記述していくことで、救助対象選択プログラムを完成させます。"
+msgstr ""
+"By replacing each process in this flowchart with the classes and methods introduced in the next subsection, and writing them in `fire_brigade_human_detector.py`, you will complete the rescue target selection program."
+
+#: ../../source/tutorial/agent/agent_control.md:142
+msgid "`Human Detector` モジュールの実装で使用するクラス・メソッド"
+msgstr "Classes and Methods Used in the Implementation of the `Human Detector` Module"
+
+#: ../../source/tutorial/agent/agent_control.md:144
+msgid "Entity"
+msgstr "Entity"
+
+#: ../../source/tutorial/agent/agent_control.md:146
+msgid "`Entity` クラスは、エンティティの基底クラスです。 このクラスは、エンティティの基本情報を保持します。"
+msgstr ""
+"The `Entity` class is the base class for entities. This class holds the basic information of an entity."
+
+#: ../../source/tutorial/agent/agent_control.md:148
+msgid ""
+"RRS上のエンティティは下図のように `Entity` を継承したクラスで表現されています。 "
+"赤枠で囲まれたクラスは、クラスの意味がそのままRRSの直接的な構成要素を表しています。"
+msgstr ""
+"Entities in RRS are represented by classes that inherit from `Entity` as shown in the diagram below. "
+"The classes enclosed in red boxes directly represent the components of RRS."
+
+#: ../../source/tutorial/agent/agent_control.md:150
+msgid "例: Road クラスのインスタンスの中には、 Hydrant クラスを継承してない通常の道路を表すものも存在しています。"
+msgstr ""
+"For example, among the instances of the Road class, there are those that represent ordinary roads that do not inherit from the Hydrant class."
+
+#: ../../source/tutorial/agent/agent_control.md:152
+msgid ""
+msgstr ""
+
+#: ../../source/tutorial/agent/agent_control.md:152
+msgid "エンティティの継承関係"
+msgstr "Entity Inheritance Relationship"
+
+#: ../../source/tutorial/agent/agent_control.md:154
+msgid "EntityID"
+msgstr "EntityID"
+
+#: ../../source/tutorial/agent/agent_control.md:156
+msgid ""
+"`EntityID` クラスは、全てのエージェント/オブジェクトを一意に識別するためのID(識別子)を表すクラスです。 "
+"RRSではエージェントとオブジェクトをまとめて、エンティティと呼んでいます。"
+msgstr ""
+"The `EntityID` class represents an ID (identifier) that uniquely identifies all agents/objects. "
+"In RRS, agents and objects are collectively referred to as entities."
+
+#: ../../source/tutorial/agent/agent_control.md:158
+msgid "Civilian"
+msgstr "Civilian"
+
+#: ../../source/tutorial/agent/agent_control.md:160
+msgid "`Civilian` クラスは、市民を表すクラスです。このクラスからは、エージェントの位置や負傷の進行状況を取得することができます。"
+msgstr ""
+"The `Civilian` class represents a citizen. From this class, you can obtain the position of the agent and the progress of injuries."
+
+#: ../../source/tutorial/agent/agent_control.md:162
+msgid "`entity` が市民であるかどうかを判定する"
+msgstr "Determine if `entity` is a civilian"
+
+#: ../../source/tutorial/agent/agent_control.md:168
+msgid "エンティティIDを取得する"
+msgstr "Get the Entity ID"
+
+#: ../../source/tutorial/agent/agent_control.md:174
+msgid "市民が生きているかどうかを判定する"
+msgstr "Determine if the civilian is alive"
+
+#: ../../source/tutorial/agent/agent_control.md:182
+msgid "市民が埋まっているかどうかを判定する"
+msgstr "Determine if the civilian is buried"
+
+#: ../../source/tutorial/agent/agent_control.md:190
+msgid "WorldInfo"
+msgstr "WorldInfo"
+
+#: ../../source/tutorial/agent/agent_control.md:192
+msgid ""
+"`WorldInfo` クラスは、エージェントが把握している情報とそれに関する操作をおこなうメソッドをもったクラスです。 "
+"エージェントはこのクラスのインスタンスを通して、他のエージェントやオブジェクトの状態を確認します。"
+msgstr ""
+"The `WorldInfo` class is a class that has methods for the information that the agent knows and the operations related to it. "
+"Through an instance of this class, the agent checks the status of other agents and objects."
+
+#: ../../source/tutorial/agent/agent_control.md:194
+msgid "モジュール内では、`WorldInfo` クラスのインスタンスを `self._world_info` として保持しています。"
+msgstr ""
+"In the module, an instance of the `WorldInfo` class is held as `self._world_info`."
+
+#: ../../source/tutorial/agent/agent_control.md:196
+msgid "エンティティIDからエンティティを取得する"
+msgstr "Get the entity from the Entity ID"
+
+#: ../../source/tutorial/agent/agent_control.md:202
+msgid "指定したクラスのエンティティを全て取得する"
+msgstr "Get all entities of the specified class"
+
+#: ../../source/tutorial/agent/agent_control.md:208
+msgid "エージェントの位置から指定したエンティティまでの距離を取得する"
+msgstr "Get the distance from the agent's position to the specified entity"
+
+#: ../../source/tutorial/agent/agent_control.md:214
+#: ../../source/tutorial/agent/agent_control.md:228
+msgid "[詳細はこちら](../../adf_core_python.core.agent.info.rst)"
+msgstr "[Details here](../../adf_core_python.core.agent.info.rst)"
+
+#: ../../source/tutorial/agent/agent_control.md:216
+msgid "AgentInfo"
+msgstr "AgentInfo"
+
+#: ../../source/tutorial/agent/agent_control.md:218
+msgid ""
+"`AgentInfo` クラスは、エージェント自身の情報とそれに関する操作をおこなうメソッドをもったクラスです。 "
+"エージェントはこのクラスのインスタンスを通して、エージェント自身の状態を取得します。"
+msgstr ""
+"The `AgentInfo` class is a class that has methods for the agent's own information and operations related to it. "
+"Through an instance of this class, the agent obtains its own status."
+
+#: ../../source/tutorial/agent/agent_control.md:220
+msgid "モジュール内では、`AgentInfo` クラスのインスタンスを `self._agent_info` として保持しています。"
+msgstr ""
+"In the module, an instance of the `AgentInfo` class is held as `self._agent_info`."
+
+#: ../../source/tutorial/agent/agent_control.md:222
+msgid "自分自身のエンティティIDを取得する"
+msgstr "Get your own entity ID"
+
+#: ../../source/tutorial/agent/agent_control.md:230
+msgid "`Human Detector` モジュールの実装"
+msgstr "Implementation of the `Human Detector` Module"
+
+#: ../../source/tutorial/agent/agent_control.md:232
+msgid ""
+"`Human Detector` モジュールの実装を行います。 以下のコードを`fire_brigade_human_detector.py` "
+"に記述してください。"
+msgstr ""
+"Implement the `Human Detector` module. Please write the following code in `fire_brigade_human_detector.py`."
+
+#: ../../source/tutorial/agent/agent_control.md:348
+msgid "埋没している市民を消防隊エージェントが救出できるようになっていれば成功です。"
+msgstr ""
+"It is successful if the fire brigade agent can rescue the buried citizens."
+
+#: ../../source/tutorial/config/config.md:1
+msgid "コンフィグについて"
+msgstr "About Config"
+
+#: ../../source/tutorial/config/config.md:3
+msgid "コンフィグについての説明"
+msgstr "Explanation about Config"
+
+#: ../../source/tutorial/config/config.md:14
+msgid "`config` ディレクトリには、エージェントの設定ファイルが格納されています。"
+msgstr ""
+"The `config` directory contains the agent's configuration files."
+
+#: ../../source/tutorial/config/config.md:16
+msgid "launcher.yaml"
+msgstr "launcher.yaml"
+
+#: ../../source/tutorial/config/config.md:18
+msgid ""
+"`launcher.yaml` は、エージェントの起動時に読み込まれる設定ファイルです。 "
+"シミュレーションサーバーの指定や読み込むモジュールが記述されたファイルの指定などが記述されています。"
+msgstr ""
+"`launcher.yaml` is a configuration file that is read when the agent starts. "
+"It specifies the simulation server and the files of the modules to be loaded."
+
+#: ../../source/tutorial/config/config.md:21
+msgid "module.yaml"
+msgstr "module.yaml"
+
+#: ../../source/tutorial/config/config.md:23
+msgid ""
+"`module.yaml` は、エージェントが読み込むモジュールの設定ファイルです。 読み込むモジュールのパスなどが記述されています。 "
+"パスを指定する際は、プロジェクトの`main.py`からの相対パスで指定してください。"
+msgstr ""
+"`module.yaml` is a configuration file for the modules that the agent loads. It specifies the paths of the modules to be loaded. "
+"When specifying the path, use the relative path from the project's `main.py`."
+
+#: ../../source/tutorial/config/config.md:27
+msgid "例"
+msgstr "Example"
+
+#: ../../source/tutorial/config/config.md:36
+msgid "development.json"
+msgstr "development.json"
+
+#: ../../source/tutorial/config/config.md:38
+msgid ""
+"`development.json` は、開発時に使用する設定ファイルです。 エージェントの開発時に外部から値を取得する際に使用します。 "
+"そのため、競技時には使用することができません。"
+msgstr ""
+"`development.json` is a configuration file used during development. It is used to obtain values from external sources during agent development. "
+"Therefore, it cannot be used during competitions."
+
+#: ../../source/tutorial/environment/environment.md:1
+msgid "環境構築"
+msgstr "Environment Setup"
+
+#: ../../source/tutorial/environment/environment.md:2
+msgid "今回はチュートリアル用のシナリオを使用してチュートリアルを行います。"
+msgstr ""
+"This time, we will use a tutorial scenario for the tutorial."
+
+#: ../../source/tutorial/environment/environment.md:4
+msgid "チュートリアルで使用するマップのダウンロード"
+msgstr "Download the map used in the tutorial"
+
+#: ../../source/tutorial/environment/environment.md:6
+msgid ""
+"{download}`マップのダウンロード <./../../download/tutorial_map.zip>` "
+"をクリックしてダウンロードしてください。"
+msgstr ""
+"Click {download}`Download the map <./../../download/tutorial_map.zip>` to download."
+
+#: ../../source/tutorial/environment/environment.md:9
+msgid "ダウンロードしたファイルを解凍し、中のファイルを `rcrs-server/maps/` の中に移動させてください。"
+msgstr ""
+"Unzip the downloaded file and move the files inside to `rcrs-server/maps/`."
+
+#: ../../source/tutorial/environment/environment.md:11
+msgid "シミュレーションサーバーの動作確認"
+msgstr "Check the operation of the simulation server"
+
+#: ../../source/tutorial/environment/environment.md:18
+msgid ""
+"何個かのウィンドウが表示されたら成功です。 コマンドラインで `Ctrl + C` (MacOSの場合は `Command + C` ) "
+"を押すとシミュレーションサーバーが終了します。"
+msgstr ""
+"If several windows are displayed, it is successful. Press `Ctrl + C` (or `Command + C` on MacOS) in the command line to stop the simulation server."
+
+#: ../../source/tutorial/module/module.md:1
+msgid "モジュールについて"
+msgstr "About Modules"
+
+#: ../../source/tutorial/module/module.md:3
+msgid "モジュールの指定方法"
+msgstr "How to specify modules"
+
+#: ../../source/tutorial/module/module.md:5
+msgid "モジュールを指定するには、module.yamlにモジュールの名前とパスを記述します。"
+msgstr ""
+"To specify a module, write the module name and path in module.yaml."
+
+#: ../../source/tutorial/module/module.md:7
+msgid "例えば、以下のように記述します:"
+msgstr "For example, write as follows:"
+
+#: ../../source/tutorial/module/module.md:15
+msgid ""
+"この場合、`SampleSearch` というモジュールで使用される、`PathPlanning` と `Clustering` "
+"というモジュールを指定しています。"
+msgstr ""
+"In this case, the modules `PathPlanning` and `Clustering` used in the `SampleSearch` module are specified."
+
+#: ../../source/tutorial/module/module.md:17
+msgid "モジュールの読み込み方法"
+msgstr "How to load modules"
+
+#: ../../source/tutorial/module/module.md:19
+msgid "モジュール内で、他のモジュールを読み込む場合は、次のように記述します:"
+msgstr ""
+"To load other modules within a module, write as follows:"
+
+#: ../../source/tutorial/module/module.md:68
+msgid "モジュールの種類について"
+msgstr "About the types of modules"
+
+#: ../../source/tutorial/module/module.md:70
+msgid "adf-core-pythonでは、以下のモジュールが提供されています。"
+msgstr ""
+"The following modules are provided in adf-core-python."
+
+#: ../../source/tutorial/module/module.md
+msgid "クラス"
+msgstr "Class"
+
+#: ../../source/tutorial/module/module.md
+msgid "役割"
+msgstr "Role"
+
+#: ../../source/tutorial/module/module.md
+msgid "TacticsFireBrigade"
+msgstr "TacticsFireBrigade"
+
+#: ../../source/tutorial/module/module.md
+msgid "消防隊用のモジュール呼び出し (競技では変更不可)"
+msgstr ""
+"Module call for fire brigade (cannot be changed in competition)"
+
+#: ../../source/tutorial/module/module.md
+msgid "TacticsPoliceForce"
+msgstr "TacticsPoliceForce"
+
+#: ../../source/tutorial/module/module.md
+msgid "土木隊用のモジュール呼び出し (競技では変更不可)"
+msgstr ""
+"Module call for police force (cannot be changed in competition)"
+
+#: ../../source/tutorial/module/module.md
+msgid "TacticsAmbulanceTeam"
+msgstr "TacticsAmbulanceTeam"
+
+#: ../../source/tutorial/module/module.md
+msgid "救急隊用のモジュール呼び出し (競技では変更不可)"
+msgstr ""
+"Module call for ambulance team (cannot be changed in competition)"
+
+#: ../../source/tutorial/module/module.md
+msgid "BuildingDetector"
+msgstr "BuildingDetector"
+
+#: ../../source/tutorial/module/module.md
+msgid "消防隊の活動対象の選択"
+msgstr ""
+"Selection of activity target for fire brigade"
+
+#: ../../source/tutorial/module/module.md
+msgid "RoadDetector"
+msgstr "RoadDetector"
+
+#: ../../source/tutorial/module/module.md
+msgid "土木隊の活動対象の選択"
+msgstr ""
+"Selection of activity target for police force"
+
+#: ../../source/tutorial/module/module.md
+msgid "HumanDetector"
+msgstr "HumanDetector"
+
+#: ../../source/tutorial/module/module.md
+msgid "救急隊の活動対象の選択"
+msgstr ""
+"Selection of activity target for ambulance team"
+
+#: ../../source/tutorial/module/module.md
+msgid "Search"
+msgstr "Search"
+
+#: ../../source/tutorial/module/module.md
+msgid "情報探索に向けた活動対象の選択"
+msgstr ""
+"Selection of activity target for information search"
+
+#: ../../source/tutorial/module/module.md
+msgid "PathPlanning"
+msgstr "PathPlanning"
+
+#: ../../source/tutorial/module/module.md
+msgid "経路探索"
+msgstr "Path Planning"
+
+#: ../../source/tutorial/module/module.md
+msgid "DynamicClustering"
+msgstr "DynamicClustering"
+
+#: ../../source/tutorial/module/module.md
+msgid "シミュレーションの進行によってクラスタが変化するクラスタリング"
+msgstr ""
+"Clustering that changes as the simulation progresses"
+
+#: ../../source/tutorial/module/module.md
+msgid "StaticClustering"
+msgstr "StaticClustering"
+
+#: ../../source/tutorial/module/module.md
+msgid "シミュレーション開始時にクラスタが定まるクラスタリング"
+msgstr ""
+"Clustering that is determined at the start of the simulation"
+
+#: ../../source/tutorial/module/module.md
+msgid "ExtAction"
+msgstr "ExtAction"
+
+#: ../../source/tutorial/module/module.md
+msgid "活動対象決定後のエージェントの動作決定"
+msgstr ""
+"Determination of agent actions after selecting the activity target"
+
+#: ../../source/tutorial/module/module.md
+msgid "MessageCoordinator"
+msgstr "MessageCoordinator"
+
+#: ../../source/tutorial/module/module.md
+msgid "通信でメッセージ(情報)を送信する経路である、チャンネルへのメッセージの分配"
+msgstr ""
+"Distribution of messages to channels, which are the routes for sending messages (information) via communication"
+
+#: ../../source/tutorial/module/module.md
+msgid "ChannelSubscriber"
+msgstr "ChannelSubscriber"
+
+#: ../../source/tutorial/module/module.md
+msgid "通信によってメッセージを受け取るチャンネルの選択"
+msgstr ""
+"Selection of channels to receive messages via communication"
+
+#: ../../source/tutorial/module/module.md:88
+msgid "自分で上記の役割以外のモジュールを作成する際は、`AbstractModule` を継承してください。"
+msgstr ""
+"When creating a module with a role other than the above, inherit `AbstractModule`."
diff --git a/docs/source/modules.rst b/docs/source/modules.rst
new file mode 100644
index 00000000..d0160b5d
--- /dev/null
+++ b/docs/source/modules.rst
@@ -0,0 +1,7 @@
+adf_core_python
+===============
+
+.. toctree::
+ :maxdepth: 4
+
+ adf_core_python
diff --git a/docs/source/quickstart/quickstart.md b/docs/source/quickstart/quickstart.md
new file mode 100644
index 00000000..664dcd43
--- /dev/null
+++ b/docs/source/quickstart/quickstart.md
@@ -0,0 +1,63 @@
+# クイックスタート
+
+## 前提条件
+
+インストールする前に、以下の前提条件を確認してください:
+
+- Python 3.12 以上
+- pip
+
+## パッケージのインストール
+
+パッケージをインストールするには、次のコマンドを実行します:
+
+```bash
+pip install git+https://github.com/adf-python/adf-core-python.git
+```
+
+## 新規エージェントの作成
+
+新規エージェントを作成するには、次のコマンドを実行します:
+
+```bash
+adf-core-python
+```
+
+実行すると、下記のような対話形式のプロンプトが表示されます:
+
+```bash
+Your agent team name: my-agent
+Creating a new agent team with name: my-agent
+```
+
+入力後、下記のようなエージェントのテンプレートがカレントディレクトリに作成されます。
+
+```bash
+.
+└── my-agent
+ ├── config
+ │ ├── development.json
+ │ ├── launcher.yaml
+ │ └── module.yaml
+ ├── main.py
+ └── src
+ └── my-agent
+ ├── __init__.py
+ └── module
+ ├── __init__.py
+ └── complex
+ ├── __init__.py
+ ├── sample_human_detector.py
+ ├── sample_road_detector.py
+ └── sample_search.py
+```
+
+## エージェントを実行する
+
+エージェントを実行するには、シミュレーションサーバーを起動し、次のコマンドを実行します:
+
+```bash
+python main.py
+```
+
+エージェントの実行が開始され、シミュレーションサーバーとの通信が開始されます。
diff --git a/docs/source/tutorial/agent/agent.md b/docs/source/tutorial/agent/agent.md
new file mode 100644
index 00000000..45bab95e
--- /dev/null
+++ b/docs/source/tutorial/agent/agent.md
@@ -0,0 +1,72 @@
+# エージェントの作成
+
+このセクションでは、`adf-core-python` ライブラリの使用方法の概要を提供します。
+
+## 新規エージェントの作成
+
+新規エージェントを作成するには、次のコマンドを実行します:
+
+```bash
+adf-core-python
+```
+
+実行すると、下記のような対話形式のプロンプトが表示されます:
+
+```bash
+Your agent team name: my-agent
+Creating a new agent team with name: my-agent
+```
+
+```{note}
+エージェントチーム名は、エージェントのディレクトリ名として使用されます。
+以後、エージェントチーム名を `` として参照します。
+```
+
+入力後、下記のようなエージェントのテンプレートがカレントディレクトリに作成されます。
+
+```bash
+.
+└── my-agent
+ ├── config
+ │ ├── development.json
+ │ ├── launcher.yaml
+ │ └── module.yaml
+ ├── main.py
+ └── src
+ └── my-agent
+ ├── __init__.py
+ └── module
+ ├── __init__.py
+ └── complex
+ ├── __init__.py
+ ├── sample_human_detector.py
+ ├── sample_road_detector.py
+ └── sample_search.py
+```
+
+## シミュレーションを実行する
+
+ターミナルを2つ起動します。
+
+片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:
+
+```bash
+# Terminal A
+cd WORKING_DIR/rcrs-server/scripts
+./start-comprun.sh -m ../maps/tutorial_fire_brigade_only/map -c ../maps/tutorial_fire_brigade_only/config
+```
+
+その後、別のターミナルを開き、エージェントを起動します:
+
+```bash
+# Terminal B
+cd WORKING_DIR/
+python main.py
+```
+
+エージェントが正常に起動すると、シミュレーションサーバーに接続され、エージェントがシミュレーションに参加し、エージェントが動き出します。
+途中で止めたい場合は、それぞれのコマンドラインで `Ctrl + C` (MacOSの場合は `Command + C` ) を押してください。
+
+```{warning}
+シミュレーションサーバーを停止させたあとは、プロセスが残ってしまう場合があるので`./kill.sh` を実行してください。
+```
diff --git a/docs/source/tutorial/agent/agent_control.md b/docs/source/tutorial/agent/agent_control.md
new file mode 100644
index 00000000..089fcdce
--- /dev/null
+++ b/docs/source/tutorial/agent/agent_control.md
@@ -0,0 +1,348 @@
+# エージェントの制御
+
+このセクションでは、エージェントの制御用のプログラムを作成する方法について説明します。
+
+## エージェントの制御について
+
+RRSの災害救助エージェントは3種類あり、種類毎にそれぞれ異なるプログラムを書く必要があります。しかし、初めから全てのプログラムを書くことは困難です。ここではまず初めに、消防隊エージェントを操作するプログラムの一部を書いてみましょう。
+
+```{note}
+エージェントを操作するプログラムは、エージェントの種類毎に同一です。 プログラムは各エージェントに配られ、そのエージェントのみの操作を担います。 消防隊エージェントを操作するプログラムを書けば、それがすべての消防隊エージェント上でそれぞれ動作します。
+```
+
+
+
+## エージェントの動作フロー
+
+エージェントの動作を決めているのはTacticsというプログラムです。
+
+消防隊の思考ルーチンは下の図の通りにおおよそおこなわれます。 消防隊の動作としては、まず救助対象の市民を捜索し(`Human Detector`)、見つかった市民を救助します(`Action Rescue`)。 救助対象の市民が見つからない場合は、探索場所を変更して市民を捜索するため、次の捜索場所を決定して(`Search`)移動します(`Action Ext move`)。 なお、エージェントは1ステップ内で、移動と救助活動を同時におこなうことが出来ません。つまり、ステップごとに更新される自身の周辺情報を確認して、動作の対象と動作内容を決定していくということになります。 これらそれぞれの機能が、モジュールと呼ばれるプログラムとして分割して表現されています。
+
+今回はこの中で、救助(掘り起こし)対象を決定する `Human Detector` モジュールを開発します。
+
+
+
+## `Human Detector` モジュールの実装の準備
+
+まず、`Human Detector` モジュールを記述するためのファイルを作成します。
+
+```bash
+cd WORKING_DIR/
+touch src//module/complex/fire_brigade_human_detector.py
+```
+
+次に、`Human Detector` モジュールの雛形の実装を行います。 以下のコードを`fire_brigade_human_detector.py` に記述してください。
+
+```python
+from typing import Optional
+
+from rcrs_core.worldmodel.entityID import EntityID
+
+from adf_core_python.core.agent.develop.develop_data import DevelopData
+from adf_core_python.core.agent.info.agent_info import AgentInfo
+from adf_core_python.core.agent.info.scenario_info import ScenarioInfo
+from adf_core_python.core.agent.info.world_info import WorldInfo
+from adf_core_python.core.agent.module.module_manager import ModuleManager
+from adf_core_python.core.component.module.complex.human_detector import HumanDetector
+from adf_core_python.core.logger.logger import get_agent_logger
+
+
+class FireBrigadeHumanDetector(HumanDetector):
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+ # 計算結果を格納する変数
+ self._result: Optional[EntityID] = None
+ # ロガーの取得
+ self._logger = get_agent_logger(
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
+ self._agent_info,
+ )
+
+ def calculate(self) -> HumanDetector:
+ """
+ 行動対象を決定する
+
+ Returns
+ -------
+ HumanDetector: 自身のインスタンス
+ """
+ self._logger.info("Calculate FireBrigadeHumanDetector")
+ return self
+
+ def get_target_entity_id(self) -> Optional[EntityID]:
+ """
+ 行動対象のEntityIDを取得する
+
+ Returns
+ -------
+ Optional[EntityID]: 行動対象のEntityID
+ """
+ return self._result
+```
+
+## モジュールの登録
+
+次に、作成したモジュールを登録します。
+
+`WORKING_DIR//config/module.yaml` ファイルを開き、以下の部分を
+
+```yaml
+DefaultTacticsFireBrigade:
+ HumanDetector: src..module.complex.sample_human_detector.SampleHumanDetector
+```
+
+以下のように変更してください。
+
+```yaml
+DefaultTacticsFireBrigade:
+ HumanDetector: src..module.complex.fire_brigade_human_detector.FireBrigadeHumanDetector
+```
+
+ターミナルを2つ起動します。
+
+片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:
+
+```bash
+# Terminal A
+cd WORKING_DIR/rcrs-server/scripts
+./start-comprun.sh -m ../maps/tutorial_fire_brigade_only/map -c ../maps/tutorial_fire_brigade_only/config
+```
+
+その後、別のターミナルを開き、エージェントを起動します:
+
+```bash
+# Terminal B
+cd WORKING_DIR/
+python main.py
+```
+
+標準出力に `Calculate FireBrigadeHumanDetector` と表示されれば成功です。
+
+## `Human Detector` モジュールの設計
+
+救助対象選択プログラムの中身を書き、消防隊エージェントが救助活動をおこなえるように修正します。
+
+消防隊エージェントの救助対象を最も簡単に選択する方法は、埋没している市民の中で最も自身に近い市民を選択する方法です。 今回は、この方法を採用した消防隊エージェントの行動対象決定モジュールを書いてみましょう。
+
+埋没している市民の中で最も自身に近い市民を救助対象として選択する方法は、フローチャートで表すと下図のようになります。
+
+
+
+このフローチャート中の各処理を、次小節で紹介する各クラス・メソッド等で置き換えたものを、`fire_brigade_human_detector.py` に記述していくことで、救助対象選択プログラムを完成させます。
+
+## `Human Detector` モジュールの実装で使用するクラス・メソッド
+
+### Entity
+
+`Entity` クラスは、エンティティの基底クラスです。 このクラスは、エンティティの基本情報を保持します。
+
+RRS上のエンティティは下図のように `Entity` を継承したクラスで表現されています。 赤枠で囲まれたクラスは、クラスの意味がそのままRRSの直接的な構成要素を表しています。
+
+例: Road クラスのインスタンスの中には、 Hydrant クラスを継承してない通常の道路を表すものも存在しています。
+
+
+
+### EntityID
+
+`EntityID` クラスは、全てのエージェント/オブジェクトを一意に識別するためのID(識別子)を表すクラスです。 RRSではエージェントとオブジェクトをまとめて、エンティティと呼んでいます。
+
+### Civilian
+
+`Civilian` クラスは、市民を表すクラスです。このクラスからは、エージェントの位置や負傷の進行状況を取得することができます。
+
+- `entity` が市民であるかどうかを判定する
+
+```python
+is_civilian: bool = isinstance(entity, Civilian)
+```
+
+- エンティティIDを取得する
+
+```python
+entity_id: EntityID = entity.get_id()
+```
+
+- 市民が生きているかどうかを判定する
+
+```python
+hp: Optional[int] = entity.get_hp()
+if hp is None or hp <= 0:
+ return False
+```
+
+- 市民が埋まっているかどうかを判定する
+
+```python
+buriedness: Optional[int] = entity.get_buriedness()
+if buriedness is None or buriedness <= 0:
+ return False
+```
+
+### WorldInfo
+
+`WorldInfo` クラスは、エージェントが把握している情報とそれに関する操作をおこなうメソッドをもったクラスです。 エージェントはこのクラスのインスタンスを通して、他のエージェントやオブジェクトの状態を確認します。
+
+モジュール内では、`WorldInfo` クラスのインスタンスを `self._world_info` として保持しています。
+
+- エンティティIDからエンティティを取得する
+
+```python
+entity: Entity = self._world_info.get_entity(entity_id)
+```
+
+- 指定したクラスのエンティティを全て取得する
+
+```python
+entities: list[Entity] = self._world_info.get_entities_by_type([Building, Road])
+```
+
+- エージェントの位置から指定したエンティティまでの距離を取得する
+
+```python
+distance: float = self._world_info.get_distance(me, civilian.get_id())
+```
+
+[詳細はこちら](../../adf_core_python.core.agent.info.rst)
+
+### AgentInfo
+
+`AgentInfo` クラスは、エージェント自身の情報とそれに関する操作をおこなうメソッドをもったクラスです。 エージェントはこのクラスのインスタンスを通して、エージェント自身の状態を取得します。
+
+モジュール内では、`AgentInfo` クラスのインスタンスを `self._agent_info` として保持しています。
+
+- 自分自身のエンティティIDを取得する
+
+```python
+my_entity_id: EntityID = self._agent_info.get_entity_id()
+```
+
+[詳細はこちら](../../adf_core_python.core.agent.info.rst)
+
+## `Human Detector` モジュールの実装
+
+`Human Detector` モジュールの実装を行います。
+以下のコードを`fire_brigade_human_detector.py` に記述してください。
+
+```python
+from typing import Optional
+
+from adf_core_python.core.agent.develop.develop_data import DevelopData
+from adf_core_python.core.agent.info.agent_info import AgentInfo
+from adf_core_python.core.agent.info.scenario_info import ScenarioInfo
+from adf_core_python.core.agent.info.world_info import WorldInfo
+from adf_core_python.core.agent.module.module_manager import ModuleManager
+from adf_core_python.core.component.module.complex.human_detector import HumanDetector
+from adf_core_python.core.logger.logger import get_agent_logger
+from rcrs_core.entities.civilian import Civilian
+from rcrs_core.entities.entity import Entity
+from rcrs_core.worldmodel.entityID import EntityID
+
+
+class FireBrigadeHumanDetector(HumanDetector):
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+ # 計算結果を格納する変数
+ self._result: Optional[EntityID] = None
+ # ロガーの取得
+ self._logger = get_agent_logger(
+ f"{self.__class__.__module__}.{self.__class__.__qualname__}",
+ self._agent_info,
+ )
+
+ def calculate(self) -> HumanDetector:
+ """
+ 行動対象を決定する
+
+ Returns
+ -------
+ HumanDetector: 自身のインスタンス
+ """
+ # 自分自身のEntityIDを取得
+ me: EntityID = self._agent_info.get_entity_id()
+ # すべてのCivilianを取得
+ civilians: list[Entity] = self._world_info.get_entities_of_types(
+ [
+ Civilian,
+ ]
+ )
+
+ # 最も近いCivilianを探す
+ nearest_civilian: Optional[EntityID] = None
+ nearest_distance: Optional[float] = None
+ for civilian in civilians:
+ # civilianがCivilianクラスのインスタンスでない場合はスキップ
+ if not isinstance(civilian, Civilian):
+ continue
+
+ # civilianのHPが0以下の場合はすでに死んでしまっているのでスキップ
+ if civilian.get_hp() <= 0:
+ continue
+
+ # civilianの埋没度が0以下の場合は掘り起こす必要がないのでスキップ
+ if civilian.get_buriedness() <= 0:
+ continue
+
+ # 自分自身との距離を計算
+ distance: float = self._world_info.get_distance(me, civilian.get_id())
+
+ # 最も近いCivilianを更新
+ if nearest_distance is None or distance < nearest_distance:
+ nearest_civilian = civilian.get_id()
+ nearest_distance = distance
+
+ # 計算結果を格納
+ self._result = nearest_civilian
+
+ # ロガーに出力
+ self._logger.info(f"Target: {self._result}")
+
+ return self
+
+ def get_target_entity_id(self) -> Optional[EntityID]:
+ """
+ 行動対象のEntityIDを取得する
+
+ Returns
+ -------
+ Optional[EntityID]: 行動対象のEntityID
+ """
+ return self._result
+```
+
+ターミナルを2つ起動します。
+
+片方のターミナルを開き、シミュレーションサーバーを以下のコマンドで起動します:
+
+```bash
+# Terminal A
+cd WORKING_DIR/rcrs-server/scripts
+./start-comprun.sh -m ../maps/tutorial_fire_brigade_only/map -c ../maps/tutorial_fire_brigade_only/config
+```
+
+その後、別のターミナルを開き、エージェントを起動します:
+
+```bash
+# Terminal B
+cd WORKING_DIR/
+python main.py
+```
+
+埋没している市民を消防隊エージェントが救出できるようになっていれば成功です。
diff --git a/docs/source/tutorial/config/config.md b/docs/source/tutorial/config/config.md
new file mode 100644
index 00000000..ed552191
--- /dev/null
+++ b/docs/source/tutorial/config/config.md
@@ -0,0 +1,40 @@
+# コンフィグについて
+
+## コンフィグについての説明
+
+```bash
+.
+└──
+ └── config
+ ├── development.json
+ ├── launcher.yaml
+ └── module.yaml
+```
+
+`config` ディレクトリには、エージェントの設定ファイルが格納されています。
+
+### launcher.yaml
+
+`launcher.yaml` は、エージェントの起動時に読み込まれる設定ファイルです。
+シミュレーションサーバーの指定や読み込むモジュールが記述されたファイルの指定などが記述されています。
+
+### module.yaml
+
+`module.yaml` は、エージェントが読み込むモジュールの設定ファイルです。
+読み込むモジュールのパスなどが記述されています。
+パスを指定する際は、プロジェクトの`main.py`からの相対パスで指定してください。
+
+```{admonition} 例
+:class: note
+
+```yaml
+DefaultSearch:
+ PathPlanning: src..module.complex.sample_search.SampleSearch
+ Clustering: src..module.complex.sample_search.SampleClustering
+```
+
+### development.json
+
+`development.json` は、開発時に使用する設定ファイルです。
+エージェントの開発時に外部から値を取得する際に使用します。
+そのため、競技時には使用することができません。
diff --git a/docs/source/tutorial/environment/environment.md b/docs/source/tutorial/environment/environment.md
new file mode 100644
index 00000000..bacef41f
--- /dev/null
+++ b/docs/source/tutorial/environment/environment.md
@@ -0,0 +1,19 @@
+# 環境構築
+今回はチュートリアル用のシナリオを使用してチュートリアルを行います。
+
+## チュートリアルで使用するマップのダウンロード
+
+{download}`マップのダウンロード <./../../download/tutorial_map.zip>`
+をクリックしてダウンロードしてください。
+
+ダウンロードしたファイルを解凍し、中のファイルを `rcrs-server/maps/` の中に移動させてください。
+
+## シミュレーションサーバーの動作確認
+
+```bash
+cd WORKING_DIR/rcrs-server/scripts
+./start-comprun.sh -m ../maps/tutorial_fire_brigade_only/map -c ../maps/tutorial_fire_brigade_only/config
+```
+
+何個かのウィンドウが表示されたら成功です。
+コマンドラインで `Ctrl + C` (MacOSの場合は `Command + C` ) を押すとシミュレーションサーバーが終了します。
diff --git a/docs/source/tutorial/module/module.md b/docs/source/tutorial/module/module.md
new file mode 100644
index 00000000..43f90f24
--- /dev/null
+++ b/docs/source/tutorial/module/module.md
@@ -0,0 +1,88 @@
+# モジュールについて
+
+## モジュールの指定方法
+
+モジュールを指定するには、module.yamlにモジュールの名前とパスを記述します。
+
+例えば、以下のように記述します:
+
+```yaml
+SampleSearch:
+ PathPlanning: src..module.complex.sample_search.SampleSearch
+ Clustering: src..module.complex.sample_search.SampleClustering
+```
+
+この場合、`SampleSearch` というモジュールで使用される、`PathPlanning` と `Clustering` というモジュールを指定しています。
+
+## モジュールの読み込み方法
+
+モジュール内で、他のモジュールを読み込む場合は、次のように記述します:
+
+```python
+from adf_core_python.core.agent.module.module_manager import ModuleManager
+
+class SampleSearch(Search):
+ def __init__(
+ self,
+ agent_info: AgentInfo,
+ world_info: WorldInfo,
+ scenario_info: ScenarioInfo,
+ module_manager: ModuleManager,
+ develop_data: DevelopData,
+ ) -> None:
+ super().__init__(
+ agent_info, world_info, scenario_info, module_manager, develop_data
+ )
+
+ # クラスタリングモジュールの取得
+ self._clustering: Clustering = cast(
+ # モジュールの型を指定
+ Clustering,
+ # モジュールの取得
+ module_manager.get_module(
+ # モジュールの名前
+ "DefaultSearch.Clustering",
+ # 上記のモジュールの名前が指定されていない場合のデフォルトのモジュールのパス
+ "adf_core_python.implement.module.algorithm.k_means_clustering.KMeansClustering",
+ ),
+ )
+
+ # パスプランニングモジュールの取得
+ self._path_planning: PathPlanning = cast(
+ # モジュールの型を指定
+ PathPlanning,
+ # モジュールの取得
+ module_manager.get_module(
+ # モジュールの名前
+ "DefaultSearch.PathPlanning",
+ # 上記のモジュールの名前が指定されていない場合のデフォルトのモジュールのパス
+ "adf_core_python.implement.module.algorithm.a_star_path_planning.AStarPathPlanning",
+ ),
+ )
+
+ # モジュールの登録(これをしないと、モジュール内のシミュレーション環境の情報が更新されません)
+ self.register_sub_module(self._clustering)
+ self.register_sub_module(self._path_planning)
+```
+
+## モジュールの種類について
+
+adf-core-pythonでは、以下のモジュールが提供されています。
+
+| クラス | 役割 |
+| -------------------- | -------------------------------------------------------------------------- |
+| TacticsFireBrigade | 消防隊用のモジュール呼び出し (競技では変更不可) |
+| TacticsPoliceForce | 土木隊用のモジュール呼び出し (競技では変更不可) |
+| TacticsAmbulanceTeam | 救急隊用のモジュール呼び出し (競技では変更不可) |
+| BuildingDetector | 消防隊の活動対象の選択 |
+| RoadDetector | 土木隊の活動対象の選択 |
+| HumanDetector | 救急隊の活動対象の選択 |
+| Search | 情報探索に向けた活動対象の選択 |
+| PathPlanning | 経路探索 |
+| DynamicClustering | シミュレーションの進行によってクラスタが変化するクラスタリング |
+| StaticClustering | シミュレーション開始時にクラスタが定まるクラスタリング |
+| ExtAction | 活動対象決定後のエージェントの動作決定 |
+| MessageCoordinator | 通信でメッセージ(情報)を送信する経路である、チャンネルへのメッセージの分配 |
+| ChannelSubscriber | 通信によってメッセージを受け取るチャンネルの選択 |
+
+自分で上記の役割以外のモジュールを作成する際は、`AbstractModule` を継承してください。
diff --git a/docs/versions.yaml b/docs/versions.yaml
new file mode 100644
index 00000000..f255c463
--- /dev/null
+++ b/docs/versions.yaml
@@ -0,0 +1,10 @@
+"1.0":
+ tag: "1.0"
+ languages:
+ - "en"
+ - "ja"
+"2.0":
+ tag: "2.0"
+ languages:
+ - "en"
+ - "ja"
diff --git a/java/.gitattributes b/java/.gitattributes
new file mode 100644
index 00000000..f91f6460
--- /dev/null
+++ b/java/.gitattributes
@@ -0,0 +1,12 @@
+#
+# https://help.github.com/articles/dealing-with-line-endings/
+#
+# Linux start script should use lf
+/gradlew text eol=lf
+
+# These are Windows script files and should use crlf
+*.bat text eol=crlf
+
+# Binary files should be left untouched
+*.jar binary
+
diff --git a/java/.gitignore b/java/.gitignore
new file mode 100644
index 00000000..4158e079
--- /dev/null
+++ b/java/.gitignore
@@ -0,0 +1,7 @@
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
+
+!lib
\ No newline at end of file
diff --git a/java/gradle/libs.versions.toml b/java/gradle/libs.versions.toml
new file mode 100644
index 00000000..81f63520
--- /dev/null
+++ b/java/gradle/libs.versions.toml
@@ -0,0 +1,12 @@
+# This file was generated by the Gradle 'init' task.
+# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
+
+[versions]
+commons-math3 = "3.6.1"
+guava = "33.2.1-jre"
+junit-jupiter = "5.10.3"
+
+[libraries]
+commons-math3 = { module = "org.apache.commons:commons-math3", version.ref = "commons-math3" }
+guava = { module = "com.google.guava:guava", version.ref = "guava" }
+junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
diff --git a/java/gradle/wrapper/gradle-wrapper.jar b/java/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..a4b76b95
Binary files /dev/null and b/java/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/java/gradle/wrapper/gradle-wrapper.properties b/java/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..df97d72b
--- /dev/null
+++ b/java/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/java/gradlew b/java/gradlew
new file mode 100755
index 00000000..f5feea6d
--- /dev/null
+++ b/java/gradlew
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/java/gradlew.bat b/java/gradlew.bat
new file mode 100644
index 00000000..9d21a218
--- /dev/null
+++ b/java/gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/java/lib/build.gradle b/java/lib/build.gradle
new file mode 100644
index 00000000..61869cf9
--- /dev/null
+++ b/java/lib/build.gradle
@@ -0,0 +1,80 @@
+plugins {
+ id('java-library')
+ id('com.google.protobuf') version "0.9.4"
+ id('maven-publish')
+}
+
+repositories {
+ mavenCentral()
+
+ maven {
+ url = 'https://sourceforge.net/projects/jsi/files/m2_repo'
+ }
+ maven {
+ url = 'https://repo.enonic.com/public/'
+ }
+ maven {
+ url 'https://jitpack.io'
+ }
+}
+
+dependencies {
+ implementation 'com.github.roborescue:rcrs-server:master-SNAPSHOT'
+ implementation 'com.github.roborescue:adf-core-java:master-SNAPSHOT'
+
+ // PrecomputeData
+ implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.0'
+ implementation 'com.fasterxml.jackson.core:jackson-core:2.13.0'
+ implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.1'
+ implementation 'org.msgpack:jackson-dataformat-msgpack:0.9.0'
+ implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.1'
+
+ // Protobuf
+ implementation 'com.google.protobuf:protobuf-java:3.19.1'
+
+ // Annotation
+ implementation 'jakarta.annotation:jakarta.annotation-api:3.0.0'
+
+ // Logger
+ implementation 'org.apache.logging.log4j:log4j-core:2.24.2'
+ implementation 'org.apache.logging.log4j:log4j-api:2.24.2'
+
+ //Algorithm
+ implementation 'com.google.common:google-collect:0.5'
+
+ testImplementation libs.junit.jupiter
+ testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+}
+
+java {
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(17)
+ }
+}
+
+tasks.named('test') {
+ useJUnitPlatform()
+}
+
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ groupId = 'com.github.adf-python'
+ artifactId = 'adf-core-python'
+ version = 'master-SNAPSHOT'
+
+ from components.java
+ }
+ }
+
+ repositories {
+ maven {
+ name = "GitHubPackages"
+ url = "https://maven.pkg.github.com/adf-python/adf-core-python"
+ credentials {
+ username = System.getenv("GITHUB_ACTOR")
+ password = System.getenv("GITHUB_TOKEN")
+ }
+ }
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/Main.java b/java/lib/src/main/java/adf_core_python/Main.java
new file mode 100644
index 00000000..a85ba196
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/Main.java
@@ -0,0 +1,10 @@
+package adf_core_python;
+
+import adf_core_python.core.gateway.Gateway;
+
+public class Main {
+ public static void main(String[] args) {
+ Gateway gateway = new Gateway(27941);
+ gateway.start();
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/Agent.java b/java/lib/src/main/java/adf_core_python/core/agent/Agent.java
new file mode 100644
index 00000000..5524e7d7
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/Agent.java
@@ -0,0 +1,173 @@
+package adf_core_python.core.agent;
+
+import adf.core.agent.communication.standard.bundle.StandardMessageBundle;
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf.core.launcher.ConsoleOutput;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.communication.standard.StandardCommunicationModule;
+import adf_core_python.core.agent.config.ModuleConfig;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.agent.module.ModuleManager;
+import adf_core_python.core.agent.precompute.PrecomputeData;
+import adf_core_python.core.component.communication.CommunicationModule;
+import adf_core_python.core.component.module.AbstractModule;
+import adf_core_python.core.gateway.Coordinator;
+import adf_core_python.core.gateway.mapper.AbstractMapper;
+import adf_core_python.core.gateway.mapper.MapperDict;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import rescuecore2.config.Config;
+import rescuecore2.messages.Command;
+import rescuecore2.messages.Message;
+import rescuecore2.standard.entities.StandardEntityURN;
+import rescuecore2.standard.entities.StandardWorldModel;
+import rescuecore2.worldmodel.ChangeSet;
+import rescuecore2.worldmodel.Entity;
+import rescuecore2.worldmodel.EntityID;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Objects;
+
+public class Agent {
+ public final AgentInfo agentInfo;
+ public final WorldInfo worldInfo;
+ public final ScenarioInfo scenarioInfo;
+ private final ModuleManager moduleManager;
+ private final DevelopData developData;
+ private final PrecomputeData precomputeData;
+ private final MessageManager messageManager;
+ private final HashMap modules = new HashMap<>();
+ private final MapperDict mapperDict;
+ private final Logger logger;
+ private final Coordinator coordinator;
+ private CommunicationModule communicationModule;
+ private int ignoreTime;
+
+ public Agent(EntityID entityID, Collection entities, ScenarioInfo scenarioInfo, DevelopData developData, ModuleConfig moduleConfig, Coordinator coordinator) {
+ StandardWorldModel worldModel = new StandardWorldModel();
+ worldModel.addEntities(entities);
+ worldModel.index();
+
+ this.ignoreTime = scenarioInfo.getRawConfig()
+ .getIntValue(kernel.KernelConstants.IGNORE_AGENT_COMMANDS_KEY);
+
+ this.agentInfo = new AgentInfo(entityID, worldModel);
+ this.worldInfo = new WorldInfo(worldModel);
+ this.scenarioInfo = scenarioInfo;
+ this.developData = developData;
+ this.moduleManager = new ModuleManager(this.agentInfo, this.worldInfo, this.scenarioInfo, moduleConfig, this.developData);
+ this.coordinator = coordinator;
+
+ String dataStorageName = "";
+ StandardEntityURN agentURN = Objects.requireNonNull(this.worldInfo.getEntity(this.agentInfo.getID())).getStandardURN();
+ if (agentURN == StandardEntityURN.AMBULANCE_TEAM || agentURN == StandardEntityURN.AMBULANCE_CENTRE) {
+ dataStorageName = "ambulance.bin";
+ }
+ if (agentURN == StandardEntityURN.FIRE_BRIGADE || agentURN == StandardEntityURN.FIRE_STATION) {
+ dataStorageName = "fire.bin";
+ }
+ if (agentURN == StandardEntityURN.POLICE_FORCE || agentURN == StandardEntityURN.POLICE_OFFICE) {
+ dataStorageName = "police.bin";
+ }
+
+ this.precomputeData = new PrecomputeData(dataStorageName);
+ this.messageManager = new MessageManager();
+
+ this.mapperDict = new MapperDict();
+
+ logger = LogManager.getLogger(this.getClass());
+ logger.debug("New Agent Created (EntityID: {}, All Entities: {})", this.agentInfo.getID(), this.worldInfo.getAllEntities());
+ }
+
+ public Class> registerModule(@Nonnull String moduleID, @Nonnull String moduleName, @Nullable String defaultClassName) {
+ AbstractModule abstractModule = moduleManager.getModule(moduleName, defaultClassName);
+ if (abstractModule == null) return null;
+ Class> clazz = abstractModule.getClass();
+ while (clazz.getSuperclass() != null) {
+ if (mapperDict.getMapper(clazz) != null) {
+ Class extends AbstractMapper> mapperClass = mapperDict.getMapper(clazz);
+ try {
+ Constructor extends AbstractMapper> constructor = mapperClass.getConstructor(clazz, precomputeData.getClass(), messageManager.getClass());
+ AbstractMapper mapperInstance = constructor.newInstance(abstractModule, precomputeData, messageManager);
+ modules.put(moduleID, mapperInstance);
+ logger.debug("Registered Human Detector (ModuleID: {}, Instance: {})", moduleID, modules.get(moduleID));
+ return mapperInstance.getTargetClass();
+ } catch (InstantiationException | IllegalAccessException | NoSuchMethodException |
+ InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ clazz = clazz.getSuperclass();
+ }
+ return null;
+ }
+
+ public void update(int time, ChangeSet changed, Collection heard) {
+ worldInfo.setTime(time);
+ worldInfo.merge(changed);
+ agentInfo.recordThinkStartTime();
+ agentInfo.setTime(time);
+
+ if (time == 1) {
+ if (this.communicationModule != null) {
+ ConsoleOutput.out(ConsoleOutput.State.ERROR,
+ "[ERROR ] Loader is not found.");
+ ConsoleOutput.out(ConsoleOutput.State.NOTICE,
+ "CommunicationModule is modified - " + this);
+ } else {
+ this.communicationModule = new StandardCommunicationModule();
+ }
+
+ this.messageManager.registerMessageBundle(new StandardMessageBundle());
+ }
+
+ // agents can subscribe after ignore time
+ if (time >= ignoreTime) {
+ this.messageManager.subscribe(this.agentInfo, this.worldInfo,
+ this.scenarioInfo);
+
+ if (!this.messageManager.getIsSubscribed()) {
+ int[] channelsToSubscribe = this.messageManager.getChannels();
+ if (channelsToSubscribe != null) {
+ this.messageManager.setIsSubscribed(true);
+ }
+ }
+ }
+
+ agentInfo.setHeard(heard);
+ agentInfo.setChanged(changed);
+ worldInfo.setChanged(changed);
+
+ this.messageManager.refresh();
+ this.communicationModule.receive(this, this.messageManager);
+
+ this.messageManager.coordinateMessages(this.agentInfo, this.worldInfo,
+ this.scenarioInfo);
+ this.communicationModule.send(this, this.messageManager);
+
+ logger.debug("Agent Update (Time: {}, Changed: {}, Heard: {})", agentInfo.getTime(), agentInfo.getChanged(), agentInfo.getHeard());
+ }
+
+ public Config execModuleMethod(String moduleID, String methodName, Config arguments) {
+ logger.debug("Executing Method (MethodName: {}, Arguments: {}", methodName, arguments);
+ Config result = modules.get(moduleID).execMethod(methodName, arguments);
+ logger.debug("Executed Method Result (MethodName: {}, Result: {}", methodName, result);
+ return result;
+ }
+
+ public EntityID getID() {
+ return this.agentInfo.getID();
+ }
+
+ public void send(Message[] messages) {
+ Arrays.stream(messages).forEach(coordinator::sendMessage);
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/communication/MessageManager.java b/java/lib/src/main/java/adf_core_python/core/agent/communication/MessageManager.java
new file mode 100644
index 00000000..e82e0a5e
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/communication/MessageManager.java
@@ -0,0 +1,240 @@
+package adf_core_python.core.agent.communication;
+
+import adf.core.agent.communication.standard.bundle.StandardMessageBundle;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf.core.component.communication.CommunicationMessage;
+import adf.core.component.communication.MessageBundle;
+import adf.core.launcher.ConsoleOutput;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.component.communication.ChannelSubscriber;
+import adf_core_python.core.component.communication.MessageCoordinator;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+
+import java.util.*;
+
+public class MessageManager {
+
+ private final HashMap> messageClassMap;
+ private final HashMap,
+ Integer> messageClassIDMap;
+ private final ArrayList sendMessageList;
+ private final List receivedMessageList;
+ private final Set checkDuplicationCache;
+ private int standardMessageClassCount;
+ private int customMessageClassCount;
+ private List> channelSendMessageList;
+ private int heardAgentHelpCount;
+ private MessageCoordinator messageCoordinator;
+ private ChannelSubscriber channelSubscriber;
+ private int[] subscribedChannels;
+ private boolean isSubscribed;
+
+ public MessageManager() {
+ this.standardMessageClassCount = 1; // 00001
+ this.customMessageClassCount = 16; // 10000
+ this.messageClassMap = new HashMap<>(32);
+ this.messageClassIDMap = new HashMap<>(32);
+ this.sendMessageList = new ArrayList<>();
+ this.channelSendMessageList = new ArrayList<>();
+ this.checkDuplicationCache = new HashSet<>();
+ this.receivedMessageList = new ArrayList<>();
+ this.heardAgentHelpCount = 0;
+
+ this.messageCoordinator = null;
+
+ channelSubscriber = null;
+ subscribedChannels = new int[1];
+ // by default subscribe to channel 1
+ subscribedChannels[0] = 1;
+ isSubscribed = false;
+ }
+
+
+ public void subscribeToChannels(int[] channels) {
+ subscribedChannels = channels;
+ isSubscribed = false;
+ }
+
+
+ public int[] getChannels() {
+ return subscribedChannels;
+ }
+
+
+ public boolean getIsSubscribed() {
+ return isSubscribed;
+ }
+
+
+ public void setIsSubscribed(boolean subscribed) {
+ isSubscribed = subscribed;
+ }
+
+
+ public void setMessageCoordinator(MessageCoordinator mc) {
+ this.messageCoordinator = mc;
+ }
+
+
+ public void setChannelSubscriber(ChannelSubscriber cs) {
+ channelSubscriber = cs;
+ }
+
+
+ public void subscribe(AgentInfo agentInfo, WorldInfo worldInfo,
+ ScenarioInfo scenarioInfo) {
+ if (channelSubscriber != null) {
+ channelSubscriber.subscribe(agentInfo, worldInfo, scenarioInfo, this);
+ }
+ }
+
+
+ public boolean registerMessageClass(int index,
+ @Nonnull Class extends CommunicationMessage> messageClass) {
+ if (index > 31) {
+ throw new IllegalArgumentException("index maximum is 31");
+ }
+
+ if (messageClassMap.containsKey(index)) {
+ ConsoleOutput.out(ConsoleOutput.State.WARN,
+ "index(" + index + ") is already registered/" + messageClass.getName()
+ + " is ignored");
+ return false;
+ }
+
+ messageClassMap.put(index, messageClass);
+ messageClassIDMap.put(messageClass, index);
+
+ return true;
+ }
+
+
+ public void registerMessageBundle(@Nonnull MessageBundle messageBundle) {
+ if (messageBundle == null) {
+ return;
+ }
+
+ for (Class extends CommunicationMessage> messageClass : messageBundle
+ .getMessageClassList()) {
+ this.registerMessageClass(
+ (messageBundle.getClass().equals(StandardMessageBundle.class)
+ ? standardMessageClassCount++
+ : customMessageClassCount++),
+ messageClass);
+ }
+ }
+
+
+ @Nullable
+ public Class extends CommunicationMessage> getMessageClass(int index) {
+ if (!messageClassMap.containsKey(index)) {
+ return null;
+ }
+
+ return messageClassMap.get(index);
+ }
+
+
+ public int getMessageClassIndex(@Nonnull CommunicationMessage message) {
+ if (!messageClassMap.containsValue(message.getClass())) {
+ throw new IllegalArgumentException(
+ message.getClass().getName() + " is not registered with the manager");
+ }
+
+ return messageClassIDMap.get(message.getClass());
+ }
+
+
+ public void addMessage(@Nonnull CommunicationMessage message) {
+ this.addMessage(message, true);
+ }
+
+
+ public void addMessage(@Nonnull CommunicationMessage message,
+ boolean checkDuplication) {
+ if (message == null) {
+ return;
+ }
+
+ String checkKey = message.getCheckKey();
+ if (checkDuplication && !this.checkDuplicationCache.contains(checkKey)) {
+ this.sendMessageList.add(message);
+ this.checkDuplicationCache.add(checkKey);
+ } else {
+ this.sendMessageList.add(message);
+ this.checkDuplicationCache.add(checkKey);
+ }
+ }
+
+
+ @Nonnull
+ public List> getSendMessageList() {
+ return this.channelSendMessageList;
+ }
+
+
+ public void addReceivedMessage(@Nonnull CommunicationMessage message) {
+ receivedMessageList.add(message);
+ }
+
+
+ @Nonnull
+ public List getReceivedMessageList() {
+ return this.receivedMessageList;
+ }
+
+
+ @SafeVarargs
+ @Nonnull
+ public final List getReceivedMessageList(
+ Class extends CommunicationMessage>... messageClasses) {
+ List resultList = new ArrayList<>();
+ for (CommunicationMessage message : this.receivedMessageList) {
+ for (Class<
+ ? extends CommunicationMessage> messageClass : messageClasses) {
+ if (messageClass.isAssignableFrom(message.getClass())) {
+ resultList.add(message);
+ }
+ }
+ }
+ return resultList;
+ }
+
+
+ public void coordinateMessages(AgentInfo agentInfo, WorldInfo worldInfo,
+ ScenarioInfo scenarioInfo) {
+ // create a list of messages for every channel including the voice comm
+ // channel
+ this.channelSendMessageList = new ArrayList>(
+ scenarioInfo.getCommsChannelsCount());
+ for (int i = 0; i < scenarioInfo.getCommsChannelsCount(); i++) {
+ this.channelSendMessageList.add(new ArrayList());
+ }
+
+ if (messageCoordinator != null) {
+ messageCoordinator.coordinate(agentInfo, worldInfo, scenarioInfo, this,
+ this.sendMessageList, this.channelSendMessageList);
+ }
+ }
+
+
+ public void addHeardAgentHelpCount() {
+ this.heardAgentHelpCount++;
+ }
+
+
+ public int getHeardAgentHelpCount() {
+ return this.heardAgentHelpCount;
+ }
+
+
+ public void refresh() {
+ this.sendMessageList.clear();
+ this.checkDuplicationCache.clear();
+ this.receivedMessageList.clear();
+ this.heardAgentHelpCount = 0;
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/communication/standard/StandardCommunicationModule.java b/java/lib/src/main/java/adf_core_python/core/agent/communication/standard/StandardCommunicationModule.java
new file mode 100644
index 00000000..90bf17db
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/communication/standard/StandardCommunicationModule.java
@@ -0,0 +1,175 @@
+package adf_core_python.core.agent.communication.standard;
+
+import adf.core.agent.communication.standard.bundle.StandardMessage;
+import adf.core.component.communication.CommunicationMessage;
+import adf.core.component.communication.util.BitOutputStream;
+import adf.core.component.communication.util.BitStreamReader;
+import adf.core.launcher.ConsoleOutput;
+import adf_core_python.core.agent.Agent;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.component.communication.CommunicationModule;
+import jakarta.annotation.Nonnull;
+import rescuecore2.messages.Command;
+import rescuecore2.messages.Message;
+import rescuecore2.standard.messages.AKSpeak;
+import rescuecore2.worldmodel.EntityID;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+public class StandardCommunicationModule extends CommunicationModule {
+
+ final Class>[] standardMessageArgTypes = {boolean.class, int.class,
+ int.class, BitStreamReader.class};
+ final private int ESCAPE_CHAR = 0x41;
+ final private int SIZE_ID = 5;
+ final private int SIZE_TTL = 3;
+
+ @Override
+ public void receive(@Nonnull Agent agent,
+ @Nonnull MessageManager messageManager) {
+ Collection heardList = agent.agentInfo.getHeard();
+
+ for (Command heard : heardList) {
+ if (heard instanceof AKSpeak) {
+ EntityID senderID = heard.getAgentID();
+
+ if (agent.getID().equals(senderID)) {
+ continue;
+ }
+
+ AKSpeak received = (AKSpeak) heard;
+ byte[] receivedData = received.getContent();
+ boolean isRadio = (received.getChannel() != 0);
+
+ if (receivedData.length <= 0) {
+ continue;
+ }
+
+ if (isRadio) {
+ addReceivedMessage(messageManager, Boolean.TRUE, senderID,
+ receivedData);
+ } else {
+ String voiceString = new String(receivedData);
+ if ("Help".equalsIgnoreCase(voiceString)
+ || "Ouch".equalsIgnoreCase(voiceString)) {
+ messageManager.addHeardAgentHelpCount();
+ continue;
+ }
+
+ BitOutputStream messageTemp = new BitOutputStream();
+ for (int i = 0; i < receivedData.length; i++) {
+ if (receivedData[i] == ESCAPE_CHAR) {
+ if ((i + 1) >= receivedData.length) {
+ addReceivedMessage(messageManager, Boolean.FALSE, senderID,
+ messageTemp.toByteArray());
+ break;
+ } else if (receivedData[i + 1] != ESCAPE_CHAR) {
+ addReceivedMessage(messageManager, Boolean.FALSE, senderID,
+ messageTemp.toByteArray());
+ messageTemp.reset();
+ continue;
+ }
+
+ i += 1;
+ }
+ messageTemp.write(receivedData[i]);
+ }
+ }
+ }
+ }
+ }
+
+ private void addReceivedMessage(@Nonnull MessageManager messageManager,
+ boolean isRadio, @Nonnull EntityID senderID, byte[] data) {
+ BitStreamReader bitStreamReader = new BitStreamReader(data);
+ int messageClassIndex = bitStreamReader.getBits(SIZE_ID);
+ if (messageClassIndex <= 0) {
+ ConsoleOutput.out(ConsoleOutput.State.WARN,
+ "ignore Message Class Index (0)");
+ return;
+ }
+
+ int messageTTL = (isRadio ? -1 : bitStreamReader.getBits(SIZE_TTL));
+
+ Object[] args = {Boolean.valueOf(isRadio),
+ Integer.valueOf(senderID.getValue()), Integer.valueOf(messageTTL),
+ bitStreamReader};
+ try {
+ messageManager
+ .addReceivedMessage(messageManager.getMessageClass(messageClassIndex)
+ .getConstructor(standardMessageArgTypes).newInstance(args));
+ } catch (NoSuchMethodException | IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (ReflectiveOperationException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ @Override
+ public void send(@Nonnull Agent agent,
+ @Nonnull MessageManager messageManager) {
+ final int voiceLimitBytes = agent.scenarioInfo.getVoiceMessagesSize();
+ int voiceMessageLeft = voiceLimitBytes;
+ ByteArrayOutputStream voiceMessageStream = new ByteArrayOutputStream();
+
+ Message[] messages = new Message[1];
+
+ List> sendMessageList = messageManager
+ .getSendMessageList();
+ for (int channel = 0; channel < sendMessageList.size(); channel++) {
+ for (CommunicationMessage message : sendMessageList.get(channel)) {
+ int messageClassIndex = messageManager.getMessageClassIndex(message);
+
+ BitOutputStream bitOutputStream = new BitOutputStream();
+ bitOutputStream.writeBits(messageClassIndex, SIZE_ID);
+
+ if (channel == 0) {
+ bitOutputStream.writeBits(((StandardMessage) message).getTTL(),
+ SIZE_TTL);
+ }
+
+ bitOutputStream.writeBits(message.toBitOutputStream());
+
+ if (channel > 0) {
+ messages[0] = new AKSpeak(agent.getID(), agent.agentInfo.getTime(),
+ channel, bitOutputStream.toByteArray());
+ agent.send(messages);
+ } else {
+ // voice channel
+ int messageSize = (int) Math
+ .ceil(((double) bitOutputStream.size()) / 8.0);
+ if (messageSize <= voiceMessageLeft) {
+ byte[] messageData = bitOutputStream.toByteArray();
+ ByteArrayOutputStream escapedMessage = new ByteArrayOutputStream();
+ for (int i = 0; i < messageSize; i++) {
+ if (messageData[i] == ESCAPE_CHAR) {
+ escapedMessage.write(ESCAPE_CHAR);
+ }
+ escapedMessage.write(messageData[i]);
+ }
+ escapedMessage.toByteArray();
+ escapedMessage.write(ESCAPE_CHAR);
+ if (escapedMessage.size() <= voiceMessageLeft) {
+ voiceMessageLeft -= escapedMessage.size();
+ try {
+ voiceMessageStream.write(escapedMessage.toByteArray());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (voiceMessageStream.size() > 0) {
+ messages[0] = new AKSpeak(agent.getID(), agent.agentInfo.getTime(), 0,
+ voiceMessageStream.toByteArray());
+ agent.send(messages);
+ }
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/config/ModuleConfig.java b/java/lib/src/main/java/adf_core_python/core/agent/config/ModuleConfig.java
new file mode 100644
index 00000000..7a6f4dec
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/config/ModuleConfig.java
@@ -0,0 +1,39 @@
+package adf_core_python.core.agent.config;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class ModuleConfig {
+ private static final String DEFAULT_CONFIG_FILE_NAME = "../config/module.yaml";
+ private final JsonNode rootNode;
+
+ public ModuleConfig() {
+ this(DEFAULT_CONFIG_FILE_NAME);
+ }
+
+ public ModuleConfig(String configFileName) {
+ try {
+ String yamlString = Files.readString(Paths.get(configFileName));
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ rootNode = mapper.readTree(yamlString);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String getValue(String moduleName) {
+ String[] keys = moduleName.split("\\.");
+ JsonNode moduleNode = rootNode;
+ for (String key : keys) {
+ if (moduleNode.has(key)) {
+ moduleNode = moduleNode.get(key);
+ }
+ }
+ return moduleNode.asText();
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/info/AgentInfo.java b/java/lib/src/main/java/adf_core_python/core/agent/info/AgentInfo.java
new file mode 100644
index 00000000..0a2e4f42
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/info/AgentInfo.java
@@ -0,0 +1,119 @@
+package adf_core_python.core.agent.info;
+
+import adf.core.agent.action.Action;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import rescuecore2.messages.Command;
+import rescuecore2.standard.entities.*;
+import rescuecore2.worldmodel.ChangeSet;
+import rescuecore2.worldmodel.EntityID;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AgentInfo {
+ private final EntityID entityID;
+ private final StandardWorldModel worldModel;
+ private int time;
+ private ChangeSet changed;
+ private Collection heard;
+ private long thinkStartTime;
+
+ private Map actionHistory;
+
+ public AgentInfo(@Nonnull EntityID entityID, @Nonnull StandardWorldModel worldModel) {
+ this.entityID = entityID;
+ this.worldModel = worldModel;
+ this.time = 0;
+ this.actionHistory = new HashMap<>();
+ recordThinkStartTime();
+ }
+
+ public int getTime() {
+ return this.time;
+ }
+
+ public void setTime(int time) {
+ this.time = time;
+ }
+
+ @Nullable
+ public Collection getHeard() {
+ return this.heard;
+ }
+
+ public void setHeard(Collection heard) {
+ this.heard = heard;
+ }
+
+ @Nonnull
+ public EntityID getID() {
+ return this.entityID;
+ }
+
+ public StandardEntity me() {
+ return this.worldModel.getEntity(this.getID());
+ }
+
+ public double getX() {
+ return this.worldModel.getEntity(this.entityID).getLocation(this.worldModel).first();
+ }
+
+ public double getY() {
+ return this.worldModel.getEntity(this.entityID).getLocation(this.worldModel).second();
+ }
+
+ public EntityID getPosition() {
+ StandardEntity entity = this.worldModel.getEntity(this.getID());
+ return entity instanceof Human ? ((Human) entity).getPosition() : entity.getID();
+ }
+
+ @Nonnull
+ public Area getPositionArea() {
+ return (Area) this.worldModel.getEntity(this.getPosition());
+ }
+
+ @Nullable
+ public ChangeSet getChanged() {
+ return this.changed;
+ }
+
+ public void setChanged(ChangeSet changed) {
+ this.changed = changed;
+ }
+
+ @Nullable
+ public Human someoneOnBoard() {
+
+ for (StandardEntity next : this.worldModel
+ .getEntitiesOfType(StandardEntityURN.CIVILIAN)) {
+ Human human = (Human) next;
+ if (human.getPosition().equals(this.entityID)) {
+ return human;
+ }
+ }
+
+ return null;
+ }
+
+ @Nullable
+ public Action getExecutedAction(int time) {
+ if (time > 0)
+ return this.actionHistory.get(time);
+ return this.actionHistory.get(this.getTime() + time);
+ }
+
+
+ public void setExecutedAction(int time, @Nullable Action action) {
+ this.actionHistory.put(time > 0 ? time : this.getTime() + time, action);
+ }
+
+ public void recordThinkStartTime() {
+ this.thinkStartTime = System.currentTimeMillis();
+ }
+
+ public long getThinkTimeMillis() {
+ return (System.currentTimeMillis() - this.thinkStartTime);
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/module/ModuleManager.java b/java/lib/src/main/java/adf_core_python/core/agent/module/ModuleManager.java
new file mode 100644
index 00000000..68c72549
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/module/ModuleManager.java
@@ -0,0 +1,428 @@
+package adf_core_python.core.agent.module;
+
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf.core.component.centralized.CommandExecutor;
+import adf.core.component.centralized.CommandPicker;
+import adf.core.component.communication.ChannelSubscriber;
+import adf.core.component.communication.CommunicationMessage;
+import adf.core.component.communication.MessageCoordinator;
+import adf_core_python.core.agent.config.ModuleConfig;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.component.extaction.ExtAction;
+import adf_core_python.core.component.module.AbstractModule;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import rescuecore2.config.NoSuchConfigOptionException;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ModuleManager {
+ private final Logger logger;
+ private Map moduleMap;
+ private Map actionMap;
+ private Map> executorMap;
+ private Map pickerMap;
+ private Map channelSubscriberMap;
+ private Map messageCoordinatorMap;
+ private AgentInfo agentInfo;
+ private WorldInfo worldInfo;
+ private ScenarioInfo scenarioInfo;
+ private ModuleConfig moduleConfig;
+ private DevelopData developData;
+
+ public ModuleManager(@Nonnull AgentInfo agentInfo, @Nonnull WorldInfo worldInfo, @Nonnull ScenarioInfo scenarioInfo, @Nonnull ModuleConfig moduleConfig, @Nonnull DevelopData developData) {
+ this.agentInfo = agentInfo;
+ this.worldInfo = worldInfo;
+ this.scenarioInfo = scenarioInfo;
+ this.moduleConfig = moduleConfig;
+ this.developData = developData;
+ this.moduleMap = new HashMap<>();
+ this.actionMap = new HashMap<>();
+ this.executorMap = new HashMap<>();
+ this.pickerMap = new HashMap<>();
+ this.channelSubscriberMap = new HashMap<>(1);
+ this.messageCoordinatorMap = new HashMap<>(1);
+
+ logger = LogManager.getLogger(this.getClass());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Nullable
+ public final T
+ getModule(@Nonnull String moduleName, @Nullable String defaultClassName) {
+ String className = moduleName;
+ try {
+ className = this.moduleConfig.getValue(moduleName);
+ } catch (NoSuchConfigOptionException ignored) {
+ }
+
+ try {
+ Class> moduleClass;
+ try {
+ moduleClass = Class.forName(className);
+ logger.info(moduleClass.getName());
+ } catch (ClassNotFoundException | NullPointerException e) {
+ logger.warn("Module " + moduleName + " not found. Using default class " + defaultClassName);
+ className = defaultClassName;
+ moduleClass = Class.forName(className);
+ }
+
+ AbstractModule instance = this.moduleMap.get(className);
+ if (instance != null) {
+ return (T) instance;
+ }
+
+ if (AbstractModule.class.isAssignableFrom(moduleClass)) {
+ instance = this.getModule((Class) moduleClass);
+ this.moduleMap.put(className, instance);
+ return (T) instance;
+ }
+
+ } catch (ClassNotFoundException | NullPointerException e) {
+ return null;
+ }
+
+ throw new IllegalArgumentException(
+ "Module is not found : " + className);
+ }
+
+
+ @Nonnull
+ public final T
+ getModule(@Nonnull String moduleName) {
+ return this.getModule(moduleName, "");
+ }
+
+
+ @Nonnull
+ private AbstractModule getModule(@Nonnull Class moduleClass) {
+ try {
+ Constructor constructor = moduleClass.getConstructor(
+ AgentInfo.class, WorldInfo.class, ScenarioInfo.class,
+ ModuleManager.class, DevelopData.class);
+ AbstractModule instance = constructor.newInstance(this.agentInfo,
+ this.worldInfo, this.scenarioInfo, this, this.developData);
+ this.moduleMap.put(moduleClass.getCanonicalName(), instance);
+ return instance;
+ } catch (NoSuchMethodException | InstantiationException
+ | IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Nonnull
+ public final ExtAction getExtAction(String actionName,
+ String defaultClassName) {
+ String className = actionName;
+ try {
+ className = this.moduleConfig.getValue(actionName);
+ } catch (NoSuchConfigOptionException ignored) {
+ }
+
+ try {
+ Class> actionClass;
+ try {
+ actionClass = Class.forName(className);
+ } catch (ClassNotFoundException | NullPointerException e) {
+ className = defaultClassName;
+ actionClass = Class.forName(className);
+ }
+
+ ExtAction instance = this.actionMap.get(className);
+ if (instance != null) {
+ return instance;
+ }
+
+ if (ExtAction.class.isAssignableFrom(actionClass)) {
+ instance = this.getExtAction((Class) actionClass);
+ this.actionMap.put(className, instance);
+ return instance;
+ }
+ } catch (ClassNotFoundException | NullPointerException e) {
+ throw new RuntimeException(e);
+ }
+ throw new IllegalArgumentException(
+ "ExtAction name is not found : " + className);
+ }
+
+
+ @Nonnull
+ public final ExtAction getExtAction(String actionName) {
+ return getExtAction(actionName, "");
+ }
+
+
+ @Nonnull
+ private ExtAction getExtAction(Class actionClass) {
+ try {
+ Constructor constructor = actionClass.getConstructor(
+ AgentInfo.class, WorldInfo.class, ScenarioInfo.class,
+ ModuleManager.class, DevelopData.class);
+ ExtAction instance = constructor.newInstance(this.agentInfo,
+ this.worldInfo, this.scenarioInfo, this, this.developData);
+ this.actionMap.put(actionClass.getCanonicalName(), instance);
+ return instance;
+ } catch (NoSuchMethodException | InstantiationException
+ | IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Nonnull
+ public final > E
+ getCommandExecutor(String executorName, String defaultClassName) {
+ String className = executorName;
+ try {
+ className = this.moduleConfig.getValue(executorName);
+ } catch (NoSuchConfigOptionException ignored) {
+ }
+
+ try {
+ Class> actionClass;
+ try {
+ actionClass = Class.forName(className);
+ } catch (ClassNotFoundException | NullPointerException e) {
+ className = defaultClassName;
+ actionClass = Class.forName(className);
+ }
+
+ CommandExecutor<
+ CommunicationMessage> instance = this.executorMap.get(className);
+ if (instance != null) {
+ return (E) instance;
+ }
+
+ if (CommandExecutor.class.isAssignableFrom(actionClass)) {
+ instance = this.getCommandExecutor(
+ (Class>) actionClass);
+ this.executorMap.put(className, instance);
+ return (E) instance;
+ }
+ } catch (ClassNotFoundException | NullPointerException e) {
+ throw new RuntimeException(e);
+ }
+
+ throw new IllegalArgumentException(
+ "CommandExecutor name is not found : " + className);
+ }
+
+
+ @Nonnull
+ public final > E
+ getCommandExecutor(String executorName) {
+ return getCommandExecutor(executorName, "");
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Nonnull
+ private > E
+ getCommandExecutor(Class actionClass) {
+ try {
+ Constructor constructor = actionClass.getConstructor(AgentInfo.class,
+ WorldInfo.class, ScenarioInfo.class, ModuleManager.class,
+ DevelopData.class);
+ E instance = constructor.newInstance(this.agentInfo, this.worldInfo,
+ this.scenarioInfo, this, this.developData);
+ this.executorMap.put(actionClass.getCanonicalName(),
+ (CommandExecutor) instance);
+ return instance;
+ } catch (NoSuchMethodException | InstantiationException
+ | IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Nonnull
+ public final CommandPicker getCommandPicker(String pickerName,
+ String defaultClassName) {
+ String className = pickerName;
+ try {
+ className = this.moduleConfig.getValue(pickerName);
+ } catch (NoSuchConfigOptionException ignored) {
+ }
+
+ try {
+ Class> actionClass;
+ try {
+ actionClass = Class.forName(className);
+ } catch (ClassNotFoundException | NullPointerException e) {
+ className = defaultClassName;
+ actionClass = Class.forName(className);
+ }
+
+ CommandPicker instance = this.pickerMap.get(className);
+ if (instance != null) {
+ return instance;
+ }
+
+ if (CommandPicker.class.isAssignableFrom(actionClass)) {
+ instance = this.getCommandPicker((Class) actionClass);
+ this.pickerMap.put(className, instance);
+ return instance;
+ }
+ } catch (ClassNotFoundException | NullPointerException e) {
+ throw new RuntimeException(e);
+ }
+
+ throw new IllegalArgumentException(
+ "CommandExecutor name is not found : " + className);
+ }
+
+
+ @Nonnull
+ public final CommandPicker getCommandPicker(String pickerName) {
+ return getCommandPicker(pickerName, "");
+ }
+
+
+ @Nonnull
+ private CommandPicker getCommandPicker(Class actionClass) {
+ try {
+ Constructor constructor = actionClass.getConstructor(
+ AgentInfo.class, WorldInfo.class, ScenarioInfo.class,
+ ModuleManager.class, DevelopData.class);
+ CommandPicker instance = constructor.newInstance(this.agentInfo,
+ this.worldInfo, this.scenarioInfo, this, this.developData);
+ this.pickerMap.put(actionClass.getCanonicalName(), instance);
+ return instance;
+ } catch (NoSuchMethodException | InstantiationException
+ | IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @SuppressWarnings("unchecked")
+ public final ChannelSubscriber getChannelSubscriber(String subscriberName,
+ String defaultClassName) {
+ String className = subscriberName;
+ try {
+ className = this.moduleConfig.getValue(subscriberName);
+ } catch (NoSuchConfigOptionException ignored) {
+ }
+
+ try {
+ Class> actionClass;
+ try {
+ actionClass = Class.forName(className);
+ } catch (ClassNotFoundException | NullPointerException e) {
+ className = defaultClassName;
+ actionClass = Class.forName(className);
+ }
+
+ ChannelSubscriber instance = this.channelSubscriberMap.get(className);
+ if (instance != null) {
+ return instance;
+ }
+
+ if (ChannelSubscriber.class.isAssignableFrom(actionClass)) {
+ instance = this
+ .getChannelSubscriber((Class) actionClass);
+ this.channelSubscriberMap.put(className, instance);
+ return instance;
+ }
+ } catch (ClassNotFoundException | NullPointerException e) {
+ throw new RuntimeException(e);
+ }
+
+ throw new IllegalArgumentException(
+ "channelSubscriber name is not found : " + className);
+ }
+
+
+ public final ChannelSubscriber getChannelSubscriber(String subscriberName) {
+ return getChannelSubscriber(subscriberName, "");
+ }
+
+
+ public final ChannelSubscriber
+ getChannelSubscriber(Class subsClass) {
+ try {
+ Constructor constructor = subsClass.getConstructor();
+ ChannelSubscriber instance = constructor.newInstance();
+ this.channelSubscriberMap.put(subsClass.getCanonicalName(), instance);
+ return instance;
+ } catch (NoSuchMethodException | InstantiationException
+ | IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @SuppressWarnings("unchecked")
+ public final MessageCoordinator getMessageCoordinator(String coordinatorName,
+ String defaultClassName) {
+ String className = coordinatorName;
+ try {
+ className = this.moduleConfig.getValue(coordinatorName);
+ } catch (NoSuchConfigOptionException ignored) {
+ }
+
+ try {
+ Class> actionClass;
+ try {
+ actionClass = Class.forName(className);
+ } catch (ClassNotFoundException | NullPointerException e) {
+ className = defaultClassName;
+ actionClass = Class.forName(className);
+ }
+
+ MessageCoordinator instance = this.messageCoordinatorMap.get(className);
+ if (instance != null) {
+ return instance;
+ }
+
+ if (MessageCoordinator.class.isAssignableFrom(actionClass)) {
+ instance = this
+ .getMessageCoordinator((Class) actionClass);
+ this.messageCoordinatorMap.put(className, instance);
+ return instance;
+ }
+ } catch (ClassNotFoundException | NullPointerException e) {
+ throw new RuntimeException(e);
+ }
+
+ throw new IllegalArgumentException(
+ "channelSubscriber name is not found : " + className);
+ }
+
+
+ public final MessageCoordinator
+ getMessageCoordinator(String coordinatorName) {
+ return getMessageCoordinator(coordinatorName, "");
+ }
+
+
+ public final MessageCoordinator
+ getMessageCoordinator(Class subsClass) {
+ try {
+ Constructor constructor = subsClass.getConstructor();
+ MessageCoordinator instance = constructor.newInstance();
+ this.messageCoordinatorMap.put(subsClass.getCanonicalName(), instance);
+ return instance;
+ } catch (NoSuchMethodException | InstantiationException
+ | IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @Nonnull
+ public ModuleConfig getModuleConfig() {
+ return this.moduleConfig;
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/precompute/PreData.java b/java/lib/src/main/java/adf_core_python/core/agent/precompute/PreData.java
new file mode 100644
index 00000000..aea850f2
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/precompute/PreData.java
@@ -0,0 +1,56 @@
+package adf_core_python.core.agent.precompute;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public final class PreData {
+
+ public Map intValues;
+ public Map doubleValues;
+ public Map stringValues;
+ public Map idValues;
+ public Map boolValues;
+
+ public Map> intLists;
+ public Map> doubleLists;
+ public Map> stringLists;
+ public Map> idLists;
+ public Map> boolLists;
+
+ public boolean isReady;
+ public String readyID;
+
+ public PreData() {
+ this.intValues = new HashMap<>();
+ this.doubleValues = new HashMap<>();
+ this.stringValues = new HashMap<>();
+ this.idValues = new HashMap<>();
+ this.boolValues = new HashMap<>();
+ this.intLists = new HashMap<>();
+ this.doubleLists = new HashMap<>();
+ this.stringLists = new HashMap<>();
+ this.idLists = new HashMap<>();
+ this.boolLists = new HashMap<>();
+ this.isReady = false;
+ this.readyID = "";
+ }
+
+
+ public PreData copy() {
+ PreData preData = new PreData();
+ preData.intValues = new HashMap<>(this.intValues);
+ preData.doubleValues = new HashMap<>(this.doubleValues);
+ preData.stringValues = new HashMap<>(this.stringValues);
+ preData.idValues = new HashMap<>(this.idValues);
+ preData.boolValues = new HashMap<>(this.boolValues);
+ preData.intLists = new HashMap<>(this.intLists);
+ preData.doubleLists = new HashMap<>(this.doubleLists);
+ preData.stringLists = new HashMap<>(this.stringLists);
+ preData.idLists = new HashMap<>(this.idLists);
+ preData.boolLists = new HashMap<>(this.boolLists);
+ preData.isReady = this.isReady;
+ preData.readyID = this.readyID;
+ return preData;
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/agent/precompute/PrecomputeData.java b/java/lib/src/main/java/adf_core_python/core/agent/precompute/PrecomputeData.java
new file mode 100644
index 00000000..583d4013
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/agent/precompute/PrecomputeData.java
@@ -0,0 +1,400 @@
+package adf_core_python.core.agent.precompute;
+
+import adf.core.agent.info.WorldInfo;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.msgpack.jackson.dataformat.MessagePackFactory;
+import rescuecore2.worldmodel.EntityID;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public final class PrecomputeData {
+
+ public static final String DEFAULT_FILE_NAME = "data.bin";
+ public static final File PRECOMP_DATA_DIR = new File("precomp_data");
+
+ private final String fileName;
+
+ private PreData data;
+
+ public PrecomputeData() {
+ this(DEFAULT_FILE_NAME);
+ }
+
+
+ public PrecomputeData(String name) {
+ this.fileName = name;
+ this.init();
+ }
+
+
+ private PrecomputeData(String name, PreData precomputeDatas) {
+ this.fileName = name;
+ this.data = precomputeDatas;
+ }
+
+
+ public static void removeData(String name) {
+ if (!PRECOMP_DATA_DIR.exists()) {
+ return;
+ }
+
+ File file = new File(PRECOMP_DATA_DIR, name);
+ if (!file.exists()) {
+ return;
+ }
+
+ file.delete();
+ }
+
+
+ public static void removeData() {
+ removeData(DEFAULT_FILE_NAME);
+ }
+
+
+ public PrecomputeData copy() {
+ return new PrecomputeData(this.fileName, this.data.copy());
+ }
+
+
+ private void init() {
+ this.data = this.read(this.fileName);
+ if (this.data == null) {
+ this.data = new PreData();
+ }
+ }
+
+
+ private PreData read(String name) {
+ try {
+ if (!PRECOMP_DATA_DIR.exists()) {
+ if (!PRECOMP_DATA_DIR.mkdir()) {
+ return null;
+ }
+ }
+
+ File readFile = new File(PRECOMP_DATA_DIR, name);
+ if (!readFile.exists()) {
+ return null;
+ }
+
+ FileInputStream fis = new FileInputStream(readFile);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ byte[] binary = new byte[1024];
+ while (true) {
+ int len = bis.read(binary);
+ if (len < 0) {
+ break;
+ }
+ bout.write(binary, 0, len);
+ }
+
+ binary = bout.toByteArray();
+ ObjectMapper om = new ObjectMapper(new MessagePackFactory());
+ PreData ds = om.readValue(binary, PreData.class);
+ bis.close();
+ fis.close();
+ return ds;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+
+ public boolean write() {
+ try {
+ if (!PRECOMP_DATA_DIR.exists()) {
+ if (!PRECOMP_DATA_DIR.mkdir()) {
+ return false;
+ }
+ }
+ ObjectMapper om = new ObjectMapper(new MessagePackFactory());
+ byte[] binary = om.writeValueAsBytes(this.data);
+ FileOutputStream fos = new FileOutputStream(
+ new File(PRECOMP_DATA_DIR, this.fileName));
+ fos.write(binary);
+ fos.close();
+ return true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ ;
+ return false;
+ }
+ }
+
+
+ public Integer setInteger(String name, int value) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.intValues.put(callClassName + ":" + name, value);
+ }
+
+
+ public Double setDouble(String name, double value) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.doubleValues.put(callClassName + ":" + name, value);
+ }
+
+
+ public Boolean setBoolean(String name, boolean value) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.boolValues.put(callClassName + ":" + name, value);
+ }
+
+
+ public String setString(String name, String value) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.stringValues.put(callClassName + ":" + name, value);
+ }
+
+
+ public EntityID setEntityID(String name, EntityID value) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ Integer id = this.data.idValues.put(callClassName + ":" + name,
+ value.getValue());
+ return id == null ? null : new EntityID(id);
+ }
+
+
+ public List setIntegerList(String name, List list) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.intLists.put(callClassName + ":" + name, list);
+ }
+
+
+ public List setDoubleList(String name, List list) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.doubleLists.put(callClassName + ":" + name, list);
+ }
+
+
+ public List setStringList(String name, List list) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.stringLists.put(callClassName + ":" + name, list);
+ }
+
+
+ public List setEntityIDList(String name, List list) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ List cvtList = new ArrayList<>();
+ for (EntityID id : list) {
+ cvtList.add(id.getValue());
+ }
+
+ cvtList = this.data.idLists.put(callClassName + ":" + name, cvtList);
+ return cvtList == null ? null
+ : cvtList.stream().map(EntityID::new).collect(Collectors.toList());
+ }
+
+
+ public List setBooleanList(String name, List list) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.boolLists.put(callClassName + ":" + name, list);
+ }
+
+
+ public boolean setReady(boolean isReady, WorldInfo worldInfo) {
+ this.data.isReady = isReady;
+ this.data.readyID = makeReadyID(worldInfo);
+ return (this.data.isReady
+ && this.data.readyID.equals(this.makeReadyID(worldInfo)));
+ }
+
+
+ public Integer getInteger(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.intValues.get(callClassName + ":" + name);
+ }
+
+
+ public Double getDouble(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.doubleValues.get(callClassName + ":" + name);
+ }
+
+
+ public Boolean getBoolean(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.boolValues.get(callClassName + ":" + name);
+ }
+
+
+ public String getString(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.stringValues.get(callClassName + ":" + name);
+ }
+
+
+ public EntityID getEntityID(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ Integer id = this.data.idValues.get(callClassName + ":" + name);
+ return id == null ? null : new EntityID(id);
+ }
+
+
+ public List getIntegerList(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.intLists.get(callClassName + ":" + name);
+ }
+
+
+ public List getDoubleList(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.doubleLists.get(callClassName + ":" + name);
+ }
+
+
+ public List getStringList(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.stringLists.get(callClassName + ":" + name);
+ }
+
+
+ public List getEntityIDList(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ List cvtList = this.data.idLists.get(callClassName + ":" + name);
+ return cvtList == null ? null
+ : cvtList.stream().map(EntityID::new).collect(Collectors.toList());
+ }
+
+
+ public List getBooleanList(String name) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread()
+ .getStackTrace();
+ if (stackTraceElements.length == 0) {
+ return null;
+ }
+
+ String callClassName = stackTraceElements[2].getClassName();
+ return this.data.boolLists.get(callClassName + ":" + name);
+ }
+
+
+ public boolean isReady(WorldInfo worldInfo) {
+ return (this.data.isReady
+ && this.data.readyID.equals(this.makeReadyID(worldInfo)));
+ }
+
+
+ private String makeReadyID(WorldInfo worldInfo) {
+ return "" + worldInfo.getBounds().getX() + worldInfo.getBounds().getY()
+ + worldInfo.getAllEntities().size();
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/communication/ChannelSubscriber.java b/java/lib/src/main/java/adf_core_python/core/component/communication/ChannelSubscriber.java
new file mode 100644
index 00000000..5a017b45
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/communication/ChannelSubscriber.java
@@ -0,0 +1,19 @@
+package adf_core_python.core.component.communication;
+
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.info.AgentInfo;
+
+public class ChannelSubscriber {
+
+ public void subscribe(AgentInfo agentInfo, WorldInfo worldInfo,
+ ScenarioInfo scenarioInfo, MessageManager messageManager) {
+ // default channel subscriber subscribes to only channel 1
+ if (agentInfo.getTime() == 1) {
+ int[] channels = new int[1];
+ channels[0] = 1;
+ messageManager.subscribeToChannels(channels);
+ }
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/communication/CommunicationModule.java b/java/lib/src/main/java/adf_core_python/core/component/communication/CommunicationModule.java
new file mode 100644
index 00000000..b5135a1d
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/communication/CommunicationModule.java
@@ -0,0 +1,11 @@
+package adf_core_python.core.component.communication;
+
+import adf_core_python.core.agent.Agent;
+import adf_core_python.core.agent.communication.MessageManager;
+
+abstract public class CommunicationModule {
+
+ abstract public void receive(Agent agent, MessageManager messageManager);
+
+ abstract public void send(Agent agent, MessageManager messageManager);
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/communication/MessageCoordinator.java b/java/lib/src/main/java/adf_core_python/core/component/communication/MessageCoordinator.java
new file mode 100644
index 00000000..4ebaa2a7
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/communication/MessageCoordinator.java
@@ -0,0 +1,18 @@
+package adf_core_python.core.component.communication;
+
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf.core.component.communication.CommunicationMessage;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.info.AgentInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+abstract public class MessageCoordinator {
+
+ abstract public void coordinate(AgentInfo agentInfo, WorldInfo worldInfo,
+ ScenarioInfo scenarioInfo, MessageManager messageManager,
+ ArrayList sendMessageList,
+ List> channelSendMessageList);
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/extaction/ExtAction.java b/java/lib/src/main/java/adf_core_python/core/component/extaction/ExtAction.java
new file mode 100644
index 00000000..f7ba6888
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/extaction/ExtAction.java
@@ -0,0 +1,137 @@
+package adf_core_python.core.component.extaction;
+
+import adf.core.agent.action.Action;
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.agent.module.ModuleManager;
+import adf_core_python.core.agent.precompute.PrecomputeData;
+import rescuecore2.worldmodel.EntityID;
+
+abstract public class ExtAction {
+
+ protected ScenarioInfo scenarioInfo;
+ protected AgentInfo agentInfo;
+ protected WorldInfo worldInfo;
+ protected ModuleManager moduleManager;
+ protected DevelopData developData;
+ protected Action result;
+ private int countPrecompute;
+ private int countResume;
+ private int countPreparate;
+ private int countUpdateInfo;
+ private int countUpdateInfoCurrentTime;
+
+ public ExtAction(AgentInfo ai, WorldInfo wi, ScenarioInfo si, ModuleManager moduleManager, DevelopData developData) {
+ this.worldInfo = wi;
+ this.agentInfo = ai;
+ this.scenarioInfo = si;
+ this.moduleManager = moduleManager;
+ this.developData = developData;
+ this.result = null;
+ this.countPrecompute = 0;
+ this.countResume = 0;
+ this.countPreparate = 0;
+ this.countUpdateInfo = 0;
+ this.countUpdateInfoCurrentTime = 0;
+ }
+
+
+ public abstract ExtAction setTarget(EntityID targets);
+
+
+ /**
+ * @param targets target
+ * @return ExtAction
+ * @deprecated {@link #setTarget(EntityID)}
+ */
+ @Deprecated
+ public ExtAction setTarget(EntityID... targets) {
+ if (targets != null && targets.length > 0) {
+ return this.setTarget(targets[0]);
+ }
+ return this;
+ }
+
+
+ public abstract ExtAction calc();
+
+
+ public Action getAction() {
+ return result;
+ }
+
+
+ public ExtAction precompute(PrecomputeData precomputeData) {
+ this.countPrecompute++;
+ return this;
+ }
+
+
+ public ExtAction resume(PrecomputeData precomputeData) {
+ this.countResume++;
+ return this;
+ }
+
+
+ public ExtAction preparate() {
+ this.countPreparate++;
+ return this;
+ }
+
+
+ public ExtAction updateInfo(MessageManager messageManager) {
+ if (this.countUpdateInfoCurrentTime != this.agentInfo.getTime()) {
+ this.countUpdateInfo = 0;
+ this.countUpdateInfoCurrentTime = this.agentInfo.getTime();
+ }
+ this.countUpdateInfo++;
+ return this;
+ }
+
+
+ public int getCountPrecompute() {
+ return this.countPrecompute;
+ }
+
+
+ public int getCountResume() {
+ return this.countResume;
+ }
+
+
+ public int getCountPreparate() {
+ return this.countPreparate;
+ }
+
+
+ public int getCountUpdateInfo() {
+ if (this.countUpdateInfoCurrentTime != this.agentInfo.getTime()) {
+ this.countUpdateInfo = 0;
+ this.countUpdateInfoCurrentTime = this.agentInfo.getTime();
+ }
+ return this.countUpdateInfo;
+ }
+
+
+ public void resetCountPrecompute() {
+ this.countPrecompute = 0;
+ }
+
+
+ public void resetCountResume() {
+ this.countResume = 0;
+ }
+
+
+ public void resetCountPreparate() {
+ this.countPreparate = 0;
+ }
+
+
+ public void resetCountUpdateInfo() {
+ this.countUpdateInfo = 0;
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/module/AbstractModule.java b/java/lib/src/main/java/adf_core_python/core/component/module/AbstractModule.java
new file mode 100644
index 00000000..e6e6f655
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/module/AbstractModule.java
@@ -0,0 +1,138 @@
+package adf_core_python.core.component.module;
+
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.agent.module.ModuleManager;
+import adf_core_python.core.agent.precompute.PrecomputeData;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class AbstractModule {
+
+ private final List subModules = new ArrayList<>();
+ protected AgentInfo agentInfo;
+ protected WorldInfo worldInfo;
+ protected ScenarioInfo scenarioInfo;
+ protected ModuleManager moduleManager;
+ protected DevelopData developData;
+
+ private int countPrecompute;
+ private int countResume;
+ private int countPreparate;
+ private int countUpdateInfo;
+ private int countUpdateInfoCurrentTime;
+
+ public AbstractModule(AgentInfo agentInfo, WorldInfo worldInfo, ScenarioInfo scenarioInfo, ModuleManager moduleManager, DevelopData developData) {
+ this.agentInfo = agentInfo;
+ this.worldInfo = worldInfo;
+ this.scenarioInfo = scenarioInfo;
+ this.moduleManager = moduleManager;
+ this.developData = developData;
+ this.countPrecompute = 0;
+ this.countResume = 0;
+ this.countPreparate = 0;
+ this.countUpdateInfo = 0;
+ this.countUpdateInfoCurrentTime = 0;
+ }
+
+
+ protected void registerModule(AbstractModule module) {
+ subModules.add(module);
+ }
+
+
+ protected boolean unregisterModule(AbstractModule module) {
+ return subModules.remove(module);
+ }
+
+
+ public AbstractModule precompute(PrecomputeData precomputeData) {
+ this.countPrecompute++;
+ for (AbstractModule abstractModule : subModules) {
+ abstractModule.precompute(precomputeData);
+ }
+ return this;
+ }
+
+
+ public AbstractModule resume(PrecomputeData precomputeData) {
+ this.countResume++;
+ for (AbstractModule abstractModule : subModules) {
+ abstractModule.resume(precomputeData);
+ }
+ return this;
+ }
+
+
+ public AbstractModule preparate() {
+ this.countPreparate++;
+ for (AbstractModule abstractModule : subModules) {
+ abstractModule.preparate();
+ }
+ return this;
+ }
+
+
+ public AbstractModule updateInfo(MessageManager messageManager) {
+ if (this.countUpdateInfoCurrentTime != this.agentInfo.getTime()) {
+ this.countUpdateInfo = 0;
+ this.countUpdateInfoCurrentTime = this.agentInfo.getTime();
+ }
+ for (AbstractModule abstractModule : subModules) {
+ abstractModule.updateInfo(messageManager);
+ }
+ this.countUpdateInfo++;
+ return this;
+ }
+
+
+ public abstract AbstractModule calc();
+
+
+ public int getCountPrecompute() {
+ return this.countPrecompute;
+ }
+
+
+ public int getCountResume() {
+ return this.countResume;
+ }
+
+
+ public int getCountPreparate() {
+ return this.countPreparate;
+ }
+
+
+ public int getCountUpdateInfo() {
+ if (this.countUpdateInfoCurrentTime != this.agentInfo.getTime()) {
+ this.countUpdateInfo = 0;
+ this.countUpdateInfoCurrentTime = this.agentInfo.getTime();
+ }
+ return this.countUpdateInfo;
+ }
+
+
+ public void resetCountPrecompute() {
+ this.countPrecompute = 0;
+ }
+
+
+ public void resetCountResume() {
+ this.countResume = 0;
+ }
+
+
+ public void resetCountPreparate() {
+ this.countPreparate = 0;
+ }
+
+
+ public void resetCountUpdateInfo() {
+ this.countUpdateInfo = 0;
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/Clustering.java b/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/Clustering.java
new file mode 100644
index 00000000..1c84cdb4
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/Clustering.java
@@ -0,0 +1,86 @@
+package adf_core_python.core.component.module.algorithm;
+
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.agent.module.ModuleManager;
+import adf_core_python.core.agent.precompute.PrecomputeData;
+import adf_core_python.core.component.module.AbstractModule;
+import rescuecore2.standard.entities.StandardEntity;
+import rescuecore2.worldmodel.EntityID;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public abstract class Clustering extends AbstractModule {
+
+ public Clustering(AgentInfo ai, WorldInfo wi, ScenarioInfo si, ModuleManager moduleManager, DevelopData developData) {
+ super(ai, wi, si, moduleManager, developData);
+ }
+
+
+ public abstract int getClusterNumber();
+
+ public abstract int getClusterIndex(StandardEntity entity);
+
+ public abstract int getClusterIndex(EntityID id);
+
+ public abstract Collection getClusterEntities(int index);
+
+ public abstract Collection getClusterEntityIDs(int index);
+
+
+ public List> getAllClusterEntities() {
+ int number = this.getClusterNumber();
+ List> result = new ArrayList<>(number);
+ for (int i = 0; i < number; i++) {
+ result.add(i, this.getClusterEntities(i));
+ }
+ return result;
+ }
+
+
+ public List> getAllClusterEntityIDs() {
+ int number = this.getClusterNumber();
+ List> result = new ArrayList<>(number);
+ for (int i = 0; i < number; i++) {
+ result.add(i, this.getClusterEntityIDs(i));
+ }
+ return result;
+ }
+
+
+ @Override
+ public Clustering precompute(PrecomputeData precomputeData) {
+ super.precompute(precomputeData);
+ return this;
+ }
+
+
+ @Override
+ public Clustering resume(PrecomputeData precomputeData) {
+ super.resume(precomputeData);
+ return this;
+ }
+
+
+ @Override
+ public Clustering preparate() {
+ super.preparate();
+ return this;
+ }
+
+
+ @Override
+ public Clustering updateInfo(MessageManager messageManager) {
+ super.updateInfo(messageManager);
+ return this;
+ }
+
+
+ @Override
+ public abstract Clustering calc();
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/DynamicClustering.java b/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/DynamicClustering.java
new file mode 100644
index 00000000..16d302ac
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/DynamicClustering.java
@@ -0,0 +1,14 @@
+package adf_core_python.core.component.module.algorithm;
+
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.agent.module.ModuleManager;
+
+public abstract class DynamicClustering extends Clustering {
+
+ public DynamicClustering(AgentInfo ai, WorldInfo wi, ScenarioInfo si, ModuleManager moduleManager, DevelopData developData) {
+ super(ai, wi, si, moduleManager, developData);
+ }
+}
diff --git a/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/PathPlanning.java b/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/PathPlanning.java
new file mode 100644
index 00000000..7a40f63c
--- /dev/null
+++ b/java/lib/src/main/java/adf_core_python/core/component/module/algorithm/PathPlanning.java
@@ -0,0 +1,101 @@
+package adf_core_python.core.component.module.algorithm;
+
+import adf.core.agent.develop.DevelopData;
+import adf.core.agent.info.ScenarioInfo;
+import adf.core.agent.info.WorldInfo;
+import adf_core_python.core.agent.communication.MessageManager;
+import adf_core_python.core.agent.info.AgentInfo;
+import adf_core_python.core.agent.module.ModuleManager;
+import adf_core_python.core.agent.precompute.PrecomputeData;
+import adf_core_python.core.component.module.AbstractModule;
+import rescuecore2.misc.Pair;
+import rescuecore2.worldmodel.EntityID;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+public abstract class PathPlanning extends AbstractModule {
+
+ public PathPlanning(AgentInfo ai, WorldInfo wi, ScenarioInfo si, ModuleManager moduleManager, DevelopData developData) {
+ super(ai, wi, si, moduleManager, developData);
+ }
+
+
+ public abstract List getResult();
+
+ public abstract PathPlanning setFrom(EntityID id);
+
+ public abstract PathPlanning setDestination(Collection targets);
+
+
+ public PathPlanning setDestination(EntityID... targets) {
+ return this.setDestination(Arrays.asList(targets));
+ }
+
+
+ @Override
+ public PathPlanning precompute(PrecomputeData precomputeData) {
+ super.precompute(precomputeData);
+ return this;
+ }
+
+
+ @Override
+ public PathPlanning resume(PrecomputeData precomputeData) {
+ super.resume(precomputeData);
+ return this;
+ }
+
+
+ @Override
+ public PathPlanning preparate() {
+ super.preparate();
+ return this;
+ }
+
+
+ @Override
+ public PathPlanning updateInfo(MessageManager messageManager) {
+ super.updateInfo(messageManager);
+ return this;
+ }
+
+
+ @Override
+ public abstract PathPlanning calc();
+
+
+ public double getDistance() {
+ double sum = 0.0;
+ List