+
+
An extensive Reinforcement Learning (RL) for Combinatorial Optimization (CO) benchmark. Our goal is to provide a unified framework for RL-based CO algorithms, and to facilitate reproducible research in this field, decoupling the science from the engineering.
@@ -27,7 +42,9 @@ RL4CO is built upon:
- [PyTorch Lightning](https://github.com/Lightning-AI/lightning): a lightweight PyTorch wrapper for high-performance AI research
- [Hydra](https://github.com/facebookresearch/hydra): a framework for elegantly configuring complex applications
-![RL4CO-Overview](https://github.com/ai4co/rl4co/assets/48984123/0e409784-05a9-4799-b7aa-6c0f76ecf27f)
+
+
+
We offer flexible and efficient implementations of the following policies:
- **Constructive**: learn to construct a solution from scratch
@@ -35,12 +52,16 @@ We offer flexible and efficient implementations of the following policies:
- _NonAutoregressive (NAR)_: learn to predict a heuristic, such as a heatmap, to then construct a solution
- **Improvement**: learn to improve an pre-existing solution
-![RL4CO-Policy-Overview](https://github.com/ai4co/rl4co/assets/48984123/9e1f32f9-9884-49b9-b6cd-364861cc8fe7)
+
+
+
We provide several utilities and modularization. For example, we modularize reusable components such as _environment embeddings_ that can easily be swapped to [solve new problems](https://github.com/ai4co/rl4co/blob/main/examples/3-creating-new-env-model.ipynb).
-![RL4CO-Env-Embeddings](https://github.com/ai4co/rl4co/assets/48984123/c47a9301-4c9f-43fd-b21f-761abeae9717)
+
+
+
## Getting started
@@ -178,13 +199,11 @@ We are also on [Slack](https://join.slack.com/t/rl4co/shared_invite/zt-1ytz2c1v4
If you find RL4CO valuable for your research or applied projects:
```bibtex
-@misc{berto2024rl4co,
+@article{berto2024rl4co,
title={{RL4CO: an Extensive Reinforcement Learning for Combinatorial Optimization Benchmark}},
- author={Federico Berto and Chuanbo Hua and Junyoung Park and Laurin Luttmann and Yining Ma and Fanchen Bu and Jiarui Wang and Haoran Ye and Minsu Kim and Sanghyeok Choi and Zepeda Gast and Andre Hottung and Jianan Zhou and Jieyi Bi and Yu Hu and Fei Liu and Hyeonah Kim and Jiwoo Son and Haeyeon Kim and Davide Angioni and Wouter Kool and Zhiguang Cao and Jie Zhang and Kijung Shin and Cathy Wu and Sungsoo Ahn and Guojie Song and Changhyun Kwon and Lin Xie and Jinkyoo Park},
+ author={Federico Berto and Chuanbo Hua and Junyoung Park and Laurin Luttmann and Yining Ma and Fanchen Bu and Jiarui Wang and Haoran Ye and Minsu Kim and Sanghyeok Choi and Nayeli Gast Zepeda and Andr\'e Hottung and Jianan Zhou and Jieyi Bi and Yu Hu and Fei Liu and Hyeonah Kim and Jiwoo Son and Haeyeon Kim and Davide Angioni and Wouter Kool and Zhiguang Cao and Jie Zhang and Kijung Shin and Cathy Wu and Sungsoo Ahn and Guojie Song and Changhyun Kwon and Lin Xie and Jinkyoo Park},
year={2024},
- eprint={2306.17100},
- archivePrefix={arXiv},
- primaryClass={cs.LG},
+ journal={arXiv preprint arXiv:2306.17100},
note={\url{https://github.com/ai4co/rl4co}}
}
```
@@ -202,6 +221,4 @@ We invite you to join our AI4CO community, an open research group in Artificial
-
-
-
+
\ No newline at end of file
diff --git a/configs/experiment/routing/mdpomo.yaml b/configs/experiment/routing/mdpomo.yaml
new file mode 100644
index 00000000..2de2a532
--- /dev/null
+++ b/configs/experiment/routing/mdpomo.yaml
@@ -0,0 +1,41 @@
+# @package _global_
+
+defaults:
+ - override /model: pomo.yaml
+ - override /env: cvrp.yaml
+ - override /callbacks: default.yaml
+ - override /trainer: default.yaml
+ - override /logger: wandb.yaml
+
+env:
+ generator_params:
+ num_loc: 50
+ loc_distribution: "mix_distribution"
+
+
+logger:
+ wandb:
+ project: "rl4co"
+ tags: ["mdpomo", "${env.name}"]
+ group: "${env.name}${env.generator_params.num_loc}"
+ name: "mdpomo-${env.name}${env.generator_params.num_loc}"
+
+
+model:
+ batch_size: 512
+ train_data_size: 10_000
+ val_data_size: 10_000
+ test_data_size: 10_000
+ optimizer_kwargs:
+ lr: 1e-4
+ weight_decay: 1e-6
+ lr_scheduler:
+ "MultiStepLR"
+ lr_scheduler_kwargs:
+ milestones: [9001]
+ gamma: 0.1
+
+trainer:
+ max_epochs: 10000
+
+seed: 1234
diff --git a/configs/experiment/routing/polynet.yaml b/configs/experiment/routing/polynet.yaml
new file mode 100644
index 00000000..709a18cf
--- /dev/null
+++ b/configs/experiment/routing/polynet.yaml
@@ -0,0 +1,44 @@
+# @package _global_
+
+defaults:
+ - override /model: polynet.yaml
+ - override /env: tsp.yaml
+ - override /callbacks: default.yaml
+ - override /trainer: default.yaml
+ - override /logger: wandb.yaml
+
+env:
+ generator_params:
+ num_loc: 50
+ check_solution: False # optimization
+
+logger:
+ wandb:
+ project: "rl4co"
+ tags: ["polynet", "${env.name}"]
+ group: "${env.name}${env.generator_params.num_loc}"
+ name: "polynet-${env.name}${env.generator_params.num_loc}-${model.k}"
+
+model:
+ k: 100
+ val_num_solutions: ${model.k}
+ batch_size: 512
+ val_batch_size: 1024
+ test_batch_size: 1024
+ train_data_size: 1_280_000
+ val_data_size: 10_000
+ test_data_size: 10_000
+ optimizer_kwargs:
+ lr: 1e-4
+ weight_decay: 1e-6
+ lr_scheduler:
+ "MultiStepLR"
+ lr_scheduler_kwargs:
+ milestones: [80, 95]
+ gamma: 0.1
+
+trainer:
+ max_epochs: 100
+
+seed: 1234
+
diff --git a/configs/experiment/scheduling/am-pomo.yaml b/configs/experiment/scheduling/am-pomo.yaml
index a3d2cde7..eb49e2da 100644
--- a/configs/experiment/scheduling/am-pomo.yaml
+++ b/configs/experiment/scheduling/am-pomo.yaml
@@ -14,6 +14,7 @@ model:
_target_: rl4co.models.L2DAttnPolicy
env_name: ${env.name}
scaling_factor: ${scaling_factor}
+ normalization: "batch"
batch_size: 64
num_starts: 10
num_augment: 0
diff --git a/configs/experiment/scheduling/am-ppo.yaml b/configs/experiment/scheduling/am-ppo.yaml
index c5d38eb1..f9e5d354 100644
--- a/configs/experiment/scheduling/am-ppo.yaml
+++ b/configs/experiment/scheduling/am-ppo.yaml
@@ -43,14 +43,8 @@ model:
batch_size: 128
val_batch_size: 512
test_batch_size: 64
- # Song et al use 1000 iterations over batches of 20 = 20_000
- # We train 10 epochs on a set of 2000 instance = 20_000
train_data_size: 2000
mini_batch_size: 512
- reward_scale: scale
- optimizer_kwargs:
- lr: 1e-4
env:
- stepwise_reward: True
- _torchrl_mode: True
\ No newline at end of file
+ stepwise_reward: True
\ No newline at end of file
diff --git a/configs/experiment/scheduling/base.yaml b/configs/experiment/scheduling/base.yaml
index e84f95fd..c15a6c45 100644
--- a/configs/experiment/scheduling/base.yaml
+++ b/configs/experiment/scheduling/base.yaml
@@ -22,17 +22,19 @@ trainer:
seed: 12345678
-scaling_factor: 20
+scaling_factor: ${env.generator_params.max_processing_time}
model:
_target_: ???
batch_size: ???
train_data_size: 2_000
val_data_size: 1_000
- test_data_size: 1_000
+ test_data_size: 100
optimizer_kwargs:
- lr: 1e-4
+ lr: 2e-4
weight_decay: 1e-6
lr_scheduler: "ExponentialLR"
lr_scheduler_kwargs:
gamma: 0.95
+ reward_scale: scale
+ max_grad_norm: 1
diff --git a/configs/experiment/scheduling/ffsp-matnet.yaml b/configs/experiment/scheduling/ffsp-matnet.yaml
new file mode 100644
index 00000000..7a1f4148
--- /dev/null
+++ b/configs/experiment/scheduling/ffsp-matnet.yaml
@@ -0,0 +1,46 @@
+# @package _global_
+
+defaults:
+ - override /model: matnet.yaml
+ - override /callbacks: default.yaml
+ - override /trainer: default.yaml
+ - override /logger: wandb.yaml
+ - override /env: ffsp.yaml
+
+logger:
+ wandb:
+ project: "rl4co"
+ log_model: "all"
+ group: "${env.name}-${env.generator_params.num_job}-${env.generator_params.num_machine}"
+ tags: ["matnet", "${env.name}"]
+ name: "matnet-${env.name}-${env.generator_params.num_job}j-${env.generator_params.num_machine}m"
+
+env:
+ generator_params:
+ num_stage: 3
+ num_machine: 4
+ num_job: 20
+ flatten_stages: False
+
+trainer:
+ max_epochs: 50
+ # NOTE for some reason l2d is extremely sensitive to precision
+ # ONLY USE 32-true for l2d!
+ precision: 32-true
+ gradient_clip_val: 10 # orig paper does not use grad clipping
+
+seed: 12345678
+
+model:
+ batch_size: 50
+ train_data_size: 10_000
+ val_data_size: 1_000
+ test_data_size: 1_000
+ optimizer_kwargs:
+ lr: 1e-4
+ weight_decay: 1e-6
+ lr_scheduler:
+ "MultiStepLR"
+ lr_scheduler_kwargs:
+ milestones: [35, 45]
+ gamma: 0.1
diff --git a/configs/experiment/scheduling/gnn-ppo.yaml b/configs/experiment/scheduling/gnn-ppo.yaml
index d9c04856..d2139eea 100644
--- a/configs/experiment/scheduling/gnn-ppo.yaml
+++ b/configs/experiment/scheduling/gnn-ppo.yaml
@@ -12,24 +12,22 @@ logger:
model:
_target_: rl4co.models.L2DPPOModel
policy_kwargs:
- embed_dim: 128
+ embed_dim: 256
num_encoder_layers: 3
scaling_factor: ${scaling_factor}
- max_grad_norm: 1
- ppo_epochs: 3
+ ppo_epochs: 2
het_emb: False
+ normalization: instance
+ test_decode_type: greedy
batch_size: 128
val_batch_size: 512
test_batch_size: 64
mini_batch_size: 512
- reward_scale: scale
- optimizer_kwargs:
- lr: 1e-4
+
trainer:
max_epochs: 10
env:
- stepwise_reward: True
- _torchrl_mode: True
\ No newline at end of file
+ stepwise_reward: True
\ No newline at end of file
diff --git a/configs/experiment/scheduling/hgnn-pomo.yaml b/configs/experiment/scheduling/hgnn-pomo.yaml
index eb688c03..a964143f 100644
--- a/configs/experiment/scheduling/hgnn-pomo.yaml
+++ b/configs/experiment/scheduling/hgnn-pomo.yaml
@@ -18,6 +18,7 @@ model:
stepwise_encoding: False
scaling_factor: ${scaling_factor}
het_emb: True
+ normalization: instance
num_starts: 10
batch_size: 64
num_augment: 0
diff --git a/configs/experiment/scheduling/hgnn-ppo.yaml b/configs/experiment/scheduling/hgnn-ppo.yaml
index 8e3a62d8..7d46f7d7 100644
--- a/configs/experiment/scheduling/hgnn-ppo.yaml
+++ b/configs/experiment/scheduling/hgnn-ppo.yaml
@@ -12,24 +12,16 @@ logger:
model:
_target_: rl4co.models.L2DPPOModel
policy_kwargs:
- embed_dim: 128
+ embed_dim: 256
num_encoder_layers: 3
scaling_factor: ${scaling_factor}
- max_grad_norm: 1
- ppo_epochs: 3
+ ppo_epochs: 2
het_emb: True
+ normalization: instance
batch_size: 128
val_batch_size: 512
test_batch_size: 64
mini_batch_size: 512
- reward_scale: scale
- optimizer_kwargs:
- lr: 1e-4
-
-trainer:
- max_epochs: 10
-
env:
- stepwise_reward: True
- _torchrl_mode: True
\ No newline at end of file
+ stepwise_reward: True
\ No newline at end of file
diff --git a/configs/experiment/scheduling/matnet-ppo.yaml b/configs/experiment/scheduling/matnet-ppo.yaml
index f0e30e3b..c88d2c64 100644
--- a/configs/experiment/scheduling/matnet-ppo.yaml
+++ b/configs/experiment/scheduling/matnet-ppo.yaml
@@ -36,13 +36,7 @@ model:
batch_size: 128
val_batch_size: 512
test_batch_size: 64
- # Song et al use 1000 iterations over batches of 20 = 20_000
- # We train 10 epochs on a set of 2000 instance = 20_000
mini_batch_size: 512
- reward_scale: scale
- optimizer_kwargs:
- lr: 1e-4
env:
- stepwise_reward: True
- _torchrl_mode: True
\ No newline at end of file
+ stepwise_reward: True
\ No newline at end of file
diff --git a/configs/model/polynet.yaml b/configs/model/polynet.yaml
new file mode 100644
index 00000000..4070d120
--- /dev/null
+++ b/configs/model/polynet.yaml
@@ -0,0 +1,11 @@
+_target_: rl4co.models.PolyNet
+
+# During val/test only we apply dihedral transformations
+num_augment: 8
+
+metrics:
+ train: ["loss", "reward"]
+ val: ["reward", "max_reward", "max_aug_reward"]
+ test: ${model.metrics.val}
+ log_on_step: True
+
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d4bb2cbb..00000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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 = .
-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
index b89e38ec..169ab0e3 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,114 +1,26 @@
-# π RL4CO Docs
+# RL4CO Documentation
-We are using [Sphinx](https://www.sphinx-doc.org/en/master/) with [Napoleon extension](https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html) to build the documentation.
-Moreover, we set [Google style](https://google.github.io/styleguide/pyguide.html) to follow with type convention.
+We use [MkDocs](https://www.mkdocs.org/) to generate the documentation with the [MkDocs Material theme](https://squidfunk.github.io/mkdocs-material/).
-- [Napoleon formatting with Google style](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html)
-- [ReStructured Text (reST)](https://docs.pylonsproject.org/projects/docs-style-guide/)
-- [Paragraph-level markup](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#paragraphs)
+## Development
-See following short example of a sample function taking one position string and optional
+From the root directory:
-```python
-from typing import Optional
+1. Install RL4CO locally
-
-def my_func(param_a: int, param_b: Optional[float] = None) -> str:
- """Sample function.
-
- Args:
- param_a: first parameter
- param_b: second parameter
-
- Return:
- sum of both numbers
-
- Example::
-
- >>> my_func(1, 2)
- 3
-
- Note:
- If you want to add something.
- """
- p = param_b if param_b else 0
- return str(param_a + p)
+```bash
+pip install -e ".[dev,graph,routing,docs]"
```
-## ποΈ File structures
-
-```
-.
-βββ _build/ - output website, only for local building
-βββ _content/ - content for docs pages in Markdown format
-βββ _theme/
-β βββ rl4co/ - website theme files
-βββ conf.py - main config file for building
-βββ index.md - content for index page
-βββ make.bat - building script for Windows
-βββ Makefile - building script for Unix
-βββ README.md
-βββ requirements.txt - requirement python packages for Read the Docs building
-```
-
-## βοΈ Build docs locally
-
-**Step 1**. Install requirement packages (from root folder): `pip install -r docs/requirement.txt`;
-
-**Step 2**. Run the building script:
+note that `docs` is the extra requirement for the documentation.
-- **Windows**: run `make.bat`;
-- **Linux/macOS**: run `make html`;
-The generated docs will be under the `_build` folder. You can open `docs/build/html/index.html` in your browser to check the docs.
+2. To build the documentation, run:
-We need to have LaTeX installed for rendering math equations. You can for example install TeXLive with the necessary extras by doing one of the following:
-
-- **Windows/macOS**: check the [Tex Live install guide](https://www.tug.org/texlive/windows.html) for Windows/macOS;
-- **Ubuntu (Linux)**: run `sudo apt-get update && sudo apt-get install -y texlive-latex-extra dvipng texlive-pictures`;
-- Use the [RTD docker image](https://hub.docker.com/r/readthedocs/build);
-
-## βοΈ Build in Read the Docs
-
-In the root of this repository, there is `.readthedocs.yaml` which will be loaded by the Read the Docs to build the docs. Please refer to the [configuration file v2 guide from Read the Docs](https://docs.readthedocs.io/en/stable/config-file/v2.html) for details information of variables.
-
-## π‘ Notes for contents
-
-Markdown and RST support
-RST is originally supported by the Sphinx. With the extension `myst_parser` it can support Markdown contents. Follow [this guide](https://www.sphinx-doc.org/en/master/usage/markdown.html) to learn more.
-
-In the meantime, we can still use RST within Markdown files by
-````
-```{eval-rst}
-RST CONTENTS
-```
-````
-
-
-Jupyter notebook support
-With the extension `nbsphinx`, Sphinx can support Jupyter notebook. Follow [this guide](https://docs.readthedocs.io/en/stable/guides/jupyter.html) to learn more.
-
-Indexing a Jupyter notebook is the same with a Markdown file in RST:
-```
-.. toctree::
- :maxdepth: 2
- :caption: Getting started:
-
- _content/start/installation
- _content/start/quickstart_notebook
-```
-
-
-API docs auto generator
-With Sphinx's `automodule` we can easily get the API docs:
-```
-.. automodule:: rl4co.data.generate_data
- :members:
- :undoc-members:
+```bash
+mkdocs serve
```
-When deploy in Read the Docs, make sure putting the package to `requirement.txt` mentioned before.
-
-## π References
+### Hooks
-We base the above guide on the official [PyTorch Lightning Docs](https://github.com/Lightning-AI/lightning/tree/master/docs).
\ No newline at end of file
+We are using the [hooks.py](hooks.py) for additional modifications. MkDocs for instance cannot detect files that are not in the same directory as an `__init__.py` (as described [here](https://stackoverflow.com/questions/75232397/mkdocs-unable-to-find-modules)) so we are automatically creating and deleting such files with our script
diff --git a/docs/_content/api/algos/a2c.md b/docs/_content/api/algos/a2c.md
deleted file mode 100644
index 731f48bc..00000000
--- a/docs/_content/api/algos/a2c.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# A2C
-
-## A2C (Advantage Actor Critic)
-
-```{eval-rst}
-.. automodule:: rl4co.models.rl.a2c.a2c
- :members:
- :undoc-members:
-```
diff --git a/docs/_content/api/algos/base.md b/docs/_content/api/algos/base.md
deleted file mode 100644
index 243c9dab..00000000
--- a/docs/_content/api/algos/base.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Base Classes
-
-## RL4COLitModule
-
-```{eval-rst}
-.. automodule:: rl4co.models.rl.common.base
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/algos/ppo.md b/docs/_content/api/algos/ppo.md
deleted file mode 100644
index d99fd1d3..00000000
--- a/docs/_content/api/algos/ppo.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# PPO
-
-
-## PPO (Proximal Policy Optimization)
-
-
-```{eval-rst}
-.. automodule:: rl4co.models.rl.ppo.ppo
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/algos/reinforce.md b/docs/_content/api/algos/reinforce.md
deleted file mode 100644
index ea8070b1..00000000
--- a/docs/_content/api/algos/reinforce.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Reinforce
-
-## REINFORCE
-
-```{eval-rst}
-.. automodule:: rl4co.models.rl.reinforce.reinforce
- :members:
- :undoc-members:
-```
-
-## Baselines
-
-```{eval-rst}
-.. automodule:: rl4co.models.rl.reinforce.baselines
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/data.md b/docs/_content/api/data.md
deleted file mode 100644
index 87690422..00000000
--- a/docs/_content/api/data.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Data
-
-## Datasets
-
-```{eval-rst}
-.. automodule:: rl4co.data.dataset
- :members:
- :undoc-members:
-```
-
-## Data Generation
-
-```{eval-rst}
-.. automodule:: rl4co.data.generate_data
- :members:
- :undoc-members:
-```
-
-## Transforms
-
-```{eval-rst}
-.. automodule:: rl4co.data.transforms
- :members:
- :undoc-members:
-```
-
-## Utils
-
-```{eval-rst}
-.. automodule:: rl4co.data.utils
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/decoding.md b/docs/_content/api/decoding.md
deleted file mode 100644
index 1ba9470b..00000000
--- a/docs/_content/api/decoding.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Decoding Strategies
-
-```{eval-rst}
-.. automodule:: rl4co.utils.decoding
- :members:
- :undoc-members:
-```
diff --git a/docs/_content/api/envs/eda.md b/docs/_content/api/envs/eda.md
deleted file mode 100644
index d89568b1..00000000
--- a/docs/_content/api/envs/eda.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# EDA Problems
-Environment for Electronic Design Automation (EDA) problems
-
-## Decap Placement Problem (DPP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.eda.dpp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.eda.dpp.generator
- :members:
- :undoc-members:
-```
-
-## Multi-port Decap Placement Problem (mDPP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.eda.mdpp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.eda.mdpp.generator
- :members:
- :undoc-members:
-```
diff --git a/docs/_content/api/envs/routing.md b/docs/_content/api/envs/routing.md
deleted file mode 100644
index 2ee370cb..00000000
--- a/docs/_content/api/envs/routing.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# Routing Problems
-
-See also the [Multi-Task VRP](#Multi-Task-Vehicle-Routing-Problem-(MTVRP)) at the bottom of this page, that includes 16 variants!
-
-
-
-## Asymmetric Traveling Salesman Problem (ATSP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.atsp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.atsp.generator
- :members:
- :undoc-members:
-```
-
-## Capacitated Vehicle Routing Problem (CVRP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.cvrp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.cvrp.generator
- :members:
- :undoc-members:
-```
-
-## Multiple Traveling Salesman Problem (mTSP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.mtsp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.mtsp.generator
- :members:
- :undoc-members:
-```
-
-
-## Orienteering Problem (OP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.op.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.op.generator
- :members:
- :undoc-members:
-```
-
-## Pickup and Delivery Problem (PDP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.pdp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.pdp.generator
- :members:
- :undoc-members:
-```
-
-## Prize Collecting Traveling Salesman Problem (PCTSP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.pctsp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.pctsp.generator
- :members:
- :undoc-members:
-```
-
-## Split Delivery Vehicle Routing Problem (SDVRP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.sdvrp.env
- :members:
- :undoc-members:
-```
-```
-
-## Stochastic Prize Collecting Traveling Salesman Problem (SPCTSP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.spctsp.env
- :members:
- :undoc-members:
-```
-```
-
-## Traveling Salesman Problem (TSP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.tsp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.tsp.generator
- :members:
- :undoc-members:
-```
-
----
-
-
-## Multi-Task Vehicle Routing Problem (MTVRP)
-
-
-
-```{eval-rst}
-.. automodule:: rl4co.envs.routing.mtvrp.env
- :members:
- :undoc-members:
-
-.. automodule:: rl4co.envs.routing.mtvrp.generator
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/envs/scheduling.md b/docs/_content/api/envs/scheduling.md
deleted file mode 100644
index 46edb20d..00000000
--- a/docs/_content/api/envs/scheduling.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Scheduling Problems
-
-## Flexible Flow Shop Problem (FFSP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.scheduling.ffsp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.scheduling.ffsp.generator
- :members:
- :undoc-members:
-```
-
-## Single Machine Total Weighted Tardiness Problem (SMTWTP)
-
-```{eval-rst}
-.. automodule:: rl4co.envs.scheduling.smtwtp.env
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.envs.scheduling.smtwtp.generator
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/models/common/__init__.md b/docs/_content/api/models/common/__init__.md
deleted file mode 100644
index bba01830..00000000
--- a/docs/_content/api/models/common/__init__.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# NCO Methods Overview
-
-
-We categorize NCO approaches (which are in fact not necessarily trained with RL!) into the following: 1) constructive, 2) improvement, 3) transductive.
-
-
-
-```{eval-rst}
-.. tip::
- Note that in RL4CO we distinguish the RL algorithms and the actors via the following naming:
-
- * **Model:** Refers to the reinforcement learning algorithm encapsulated within a `LightningModule`. This module is responsible for training the policy.
- * **Policy:** Implemented as a `nn.Module`, this neural network (often referred to as the *actor*) takes an instance and outputs a sequence of actions, :math:`\pi = \pi_0, \pi_1, \dots, \pi_N`, which constitutes the solution.
-
- Here, :math:`\pi_i` represents the action taken at step :math:`i`, forming a sequence that leads to the optimal or near-optimal solution for the given instance.
-```
-
-
-The following table contains the categorization that we follow in RL4CO:
-
-
-```{eval-rst}
-.. list-table:: Overview of RL Models and Policies
- :widths: 5 5 5 5 25
- :header-rows: 1
- :stub-columns: 1
-
- * - Category
- - Model or Policy?
- - Input
- - Output
- - Description
- * - `Constructive `_
- - Policy
- - Instance
- - Solution
- - Policies trained to generate solutions from scratch. Can be categorized into AutoRegressive (AR) and Non-Autoregressive (NAR).
- * - `Improvement `_
- - Policy
- - Instance, Current Solution
- - Improved Solution
- - Policies trained to improve existing solutions iteratively, akin to local search algorithms. They focus on refining *existing* solutions rather than generating them from scratch.
- * - `Transductive `_
- - Model
- - Instance, (Policy)
- - Solution, (Updated Policy)
- - Updates policy parameters during online testing to improve solutions of a specific instance.
-```
-
-
-
-
-
-
diff --git a/docs/_content/api/models/common/constructive.md b/docs/_content/api/models/common/constructive.md
deleted file mode 100644
index 4b3d0e82..00000000
--- a/docs/_content/api/models/common/constructive.md
+++ /dev/null
@@ -1,71 +0,0 @@
-## Constructive Policies
-
-Constructive NCO policies pre-train a policy to amortize the inference. "Constructive" means that a solution is created from scratch by the model. We can also categorize constructive NCO in two sub-categories depending on the role of encoder and decoder:
-
-#### Autoregressive (AR)
-Autoregressive approaches **use a learned decoder** that outputs log probabilities for the current solution. These approaches generate a solution step by step, similar to e.g. LLMs. They have an encoder-decoder structure. Some models may not have an encoder at all and just re-encode at each step.
-
-#### NonAutoregressive (NAR)
-The difference between AR and NAR approaches is that NAR **only an encoder is learnable** (they just encode in one shot) and generate for example a heatmap, which can then be decoded simply by using it as a probability distribution or by using some search method on top.
-
-Here is a general structure of a general constructive policy with an encoder-decoder structure:
-
-
-
-
-where _embeddings_ transfer information from feature space to embedding space.
-
----
-
-
-
-### Constructive Policy Base Classes
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.base
- :members:
- :undoc-members:
-```
-
-
-
-### Autoregressive Policies Base Classes
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.autoregressive.encoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.autoregressive.decoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.autoregressive.policy
- :members:
- :undoc-members:
-```
-
-### Nonautoregressive Policies Base Classes
-
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.nonautoregressive.encoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.nonautoregressive.decoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.constructive.nonautoregressive.policy
- :members:
- :undoc-members:
-```
diff --git a/docs/_content/api/models/common/improvement.md b/docs/_content/api/models/common/improvement.md
deleted file mode 100644
index 80543b2a..00000000
--- a/docs/_content/api/models/common/improvement.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Improvement Policies
-
-These methods differ w.r.t. constructive NCO since they can obtain better solutions similarly to how local search algorithms work - they can improve the solutions over time. This is different from decoding strategies or similar in constructive methods since these policies are trained for performing improvement operations.
diff --git a/docs/_content/api/models/common/transductive.md b/docs/_content/api/models/common/transductive.md
deleted file mode 100644
index 6c14c036..00000000
--- a/docs/_content/api/models/common/transductive.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Transductive Models
-
-
-Transductive models are learning algorithms that optimize on a specific instance. They improve solutions by updating policy parameters $\theta$_, which means that we are running optimization (backprop) **at test time**. Transductive learning can be performed with different policies: for example EAS updates (a part of) AR policies parameters to obtain better solutions, but I guess there are ways (or papers out there I don't know of) that optimize at test time.
-
-
-```{eval-rst}
-.. tip::
- You may refer to the definition of `inductive vs transductive RL `_. In inductive RL, we train to generalize to new instances. In transductive RL we train (or finetune) to solve only specific ones.
-```
-
-
-## Base Transductive Model
-
-```{eval-rst}
-.. automodule:: rl4co.models.common.transductive.base
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/models/nn.md b/docs/_content/api/models/nn.md
deleted file mode 100644
index ba5fa86b..00000000
--- a/docs/_content/api/models/nn.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Neural Network Modules
-
-## Critic Network
-
-```{eval-rst}
-.. automodule:: rl4co.models.rl.common.critic
- :members:
- :undoc-members:
-```
-
-## Graph Neural Networks
-
-### Graph Attention Encoder
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.graph.attnnet
- :members:
- :undoc-members:
-```
-
-### Graph Convolutional Encoder
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.graph.gcn
- :members:
- :undoc-members:
-```
-
-### Message Passing Encoder
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.graph.mpnn
- :members:
- :undoc-members:
-```
-
-## rl4co.models.nn.attention
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.attention
- :members:
- :undoc-members:
-```
-
-
-## rl4co.models.nn.mlp
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.mlp
- :members:
- :undoc-members:
-```
-
-## rl4co.models.nn.ops
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.ops
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/models/zoo/__init__.md b/docs/_content/api/models/zoo/__init__.md
deleted file mode 100644
index dee807f8..00000000
--- a/docs/_content/api/models/zoo/__init__.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Model Zoo
-
-Models from the literature and contributions are contained in the Model Zoo.
\ No newline at end of file
diff --git a/docs/_content/api/models/zoo/constructive.md b/docs/_content/api/models/zoo/constructive.md
deleted file mode 100644
index 4a1b1993..00000000
--- a/docs/_content/api/models/zoo/constructive.md
+++ /dev/null
@@ -1,215 +0,0 @@
-# Constructive Methods
-
-These can be classified into Auto-Regressive (AR) and Non-Auto-Regressive (NAR) policies. These constructive methods also include ad-hoc RL algorithms for constructive policies.
-
-# AutoRegressive
-
-## Attention Model (AM)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.am.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.am.policy
- :members:
- :undoc-members:
-```
-
-## Attention Model - PPO (AM-PPO)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.amppo.model
- :members:
- :undoc-members:
-```
-
-
-
-## Heterogeneous Attention Model (HAM)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ham.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ham.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ham.encoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ham.attention
- :members:
- :undoc-members:
-```
-
-
-## Matrix Encoding Network (MatNet)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.matnet.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.matnet.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.matnet.encoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.matnet.decoder
- :members:
- :undoc-members:
-```
-
-
-## Multi-Decoder Attention Model (MDAM)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.mdam.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.mdam.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.mdam.encoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.mdam.decoder
- :members:
- :undoc-members:
-```
-
-## POMO
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.pomo.model
- :members:
- :undoc-members:
-```
-
-## Pointer Network (PtrNet)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ptrnet.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ptrnet.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ptrnet.encoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ptrnet.decoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.ptrnet.critic
- :members:
- :undoc-members:
-```
-
-## SymNCO
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.symnco.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.symnco.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.symnco.losses
- :members:
- :undoc-members:
-```
-
----
-
-# NonAutoregressive
-
-
-## DeepACO
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.deepaco.antsystem
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.deepaco.model
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.deepaco.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.deepaco.decoder
- :members:
- :undoc-members:
-```
-
-
-## NAR-GNN
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.nargnn.policy
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.nargnn.encoder
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/models/zoo/improvement.md b/docs/_content/api/models/zoo/improvement.md
deleted file mode 100644
index eda6ca2c..00000000
--- a/docs/_content/api/models/zoo/improvement.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Improvement Methods
-
-These methods are trained to improve existing solutions iteratively, akin to local search algorithms. They focus on refining existing solutions rather than generating them from scratch.
-
-_coming soon!_
\ No newline at end of file
diff --git a/docs/_content/api/models/zoo/transductive.md b/docs/_content/api/models/zoo/transductive.md
deleted file mode 100644
index b4e0bbbb..00000000
--- a/docs/_content/api/models/zoo/transductive.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Transductive Methods
-
-These methods update policy parameters during online testing to improve the solutions of a specific instance.
-
-## Active Search (AS)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.active_search.search
- :members:
- :undoc-members:
-```
-
-## Efficent Active Search (EAS)
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.eas.search
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.eas.decoder
- :members:
- :undoc-members:
-```
-
-```{eval-rst}
-.. automodule:: rl4co.models.zoo.eas.nn
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/api/tasks.md b/docs/_content/api/tasks.md
deleted file mode 100644
index 53bb82a0..00000000
--- a/docs/_content/api/tasks.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Tasks: Train and Evaluate
-
-## Train
-
-```{eval-rst}
-.. automodule:: rl4co.tasks.train
- :members:
- :undoc-members:
-```
-
-## Evaluate
-
-```{eval-rst}
-.. automodule:: rl4co.tasks.eval
- :members:
- :undoc-members:
-```
\ No newline at end of file
diff --git a/docs/_content/general/faq.md b/docs/_content/general/faq.md
deleted file mode 100644
index e16ceaca..00000000
--- a/docs/_content/general/faq.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# FAQ
-
-You can submit your questions via GitHub Issues. If asked more than a few times, a question will have its answer added here. If you are looking for collaborations, we would be happy to hear from you on [Slack](https://join.slack.com/t/rl4co/shared_invite/zt-1ytz2c1v4-0IkQ8NQH4TRXIX8PrRmDhQ) π
-
diff --git a/docs/_theme/rl4co/__init__.py b/docs/_theme/rl4co/__init__.py
deleted file mode 100644
index 31492d0e..00000000
--- a/docs/_theme/rl4co/__init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""Pytorch Lightning Sphinx theme.
-
-From https://github.com/shiftlab/lightning_sphinx_theme.
-"""
-from os import path
-
-__version__ = "0.0.31"
-__version_full__ = __version__
-
-
-def get_html_theme_path():
- """Return list of HTML theme paths."""
- cur_dir = path.abspath(path.dirname(path.dirname(__file__)))
- return cur_dir
-
-
-# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
-def setup(app):
- app.add_html_theme("ncobench_theme", path.abspath(path.dirname(__file__)))
diff --git a/docs/_theme/rl4co/breadcrumbs.html b/docs/_theme/rl4co/breadcrumbs.html
deleted file mode 100644
index e60a62e1..00000000
--- a/docs/_theme/rl4co/breadcrumbs.html
+++ /dev/null
@@ -1,90 +0,0 @@
-{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
-
-{% if page_source_suffix %}
-{% set suffix = page_source_suffix %}
-{% else %}
-{% set suffix = source_suffix %}
-{% endif %}
-
-{% if meta is defined and meta is not none %}
-{% set check_meta = True %}
-{% else %}
-{% set check_meta = False %}
-{% endif %}
-
-{% if check_meta and 'github_url' in meta %}
-{% set display_github = True %}
-{% endif %}
-
-{% if check_meta and 'bitbucket_url' in meta %}
-{% set display_bitbucket = True %}
-{% endif %}
-
-{% if check_meta and 'gitlab_url' in meta %}
-{% set display_gitlab = True %}
-{% endif %}
-
-
Don't worry, RL4CO doesn't use your cookie. But maybe ReadTheDoc will have some cookie policy, you could refer it here.
-
-
-
diff --git a/docs/_theme/rl4co/extensions/lightning.py b/docs/_theme/rl4co/extensions/lightning.py
deleted file mode 100644
index 8cba7fda..00000000
--- a/docs/_theme/rl4co/extensions/lightning.py
+++ /dev/null
@@ -1,179 +0,0 @@
-# Copyright The PyTorch Lightning team.
-#
-# 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
-#
-# http://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.
-from docutils import nodes
-from docutils.statemachine import StringList
-from pt_lightning_sphinx_theme.extensions.pytorch_tutorials import (
- CustomCalloutItemDirective,
- CustomCardItemDirective,
- DisplayItemDirective,
- LikeButtonWithTitle,
- ReactGreeter,
- SlackButton,
- TwoColumns,
- cardnode,
-)
-from sphinx.util.docutils import SphinxDirective
-
-
-class tutoriallistnode(nodes.General, nodes.Element):
- """A placeholder node that we can use during the first parse to later
- replace with the card list."""
-
- pass
-
-
-def visit_cardnode(self, node):
- """Hook to make ``cardnode`` behave the same as a ``paragraph`` node (e.g.
- insert ``
`` tags)."""
- self.visit_paragraph(node)
-
-
-def depart_cardnode(self, node):
- """Hook to make ``cardnode`` behave the same as a ``paragraph`` node (e.g.
- insert ``
`` tags)."""
- self.depart_paragraph(node)
-
-
-def purge_cards(app, env, docname):
- """Hook to purge the cards from the env for the given docname.
-
- This will be called for each changed doc when rebuilding, so will
- reset the card from that doc.
- """
- if not hasattr(env, "all_cardnodes"):
- return
-
- env.all_cardnodes = [node for node in env.all_cardnodes if node["docname"] != docname]
-
-
-def merge_cards(app, env, docnames, other):
- """Hook to merge cards from multiple environments (e.g. when multi-
- threading)."""
- if not hasattr(env, "all_cardnodes"):
- env.all_cardnodes = []
- if hasattr(other, "all_cardnodes"):
- env.all_cardnodes.extend(other.all_cardnodes)
-
-
-TUTORIAL_LIST_START = """
-.. raw:: html
-
-
-
-
-
-
-
-
-
-
-
-
-.. Tutorial cards below this line
-
-"""
-
-TUTORIAL_LIST_END = """
-
-.. End of tutorial card section
-
-.. raw:: html
-
-
-
-
-
-
-
-
-
-
-"""
-
-
-class TutorialListDirective(SphinxDirective):
- """Our custom directive which inserts the header and footer markup for the
- tutorial block with a placeholder node (``tutoriallistnode``) which can be
- modified inplace later with the list of cards."""
-
- def run(self):
- start_list = StringList(TUTORIAL_LIST_START.split("\n"))
- start_node = nodes.paragraph()
- self.state.nested_parse(start_list, self.content_offset, start_node)
-
- end_list = StringList(TUTORIAL_LIST_END.split("\n"))
- end_node = nodes.paragraph()
- self.state.nested_parse(end_list, self.content_offset, end_node)
-
- return start_node.children + [tutoriallistnode("")] + end_node.children
-
-
-def process_card_nodes(app, doctree, fromdocname):
- """This hook does two things.
-
- 1. Find any ``cardnode`` nodes in the document and remove them (we don't want them to render on the page).
- 2. Find any ``tutoriallistnode`` nodes in the document and inplace edit them to have the list of ``cardnode`` nodes
- from the environment.
- """
- for card in doctree.traverse(cardnode):
- card.parent.remove(card)
-
- for node in doctree.traverse(tutoriallistnode):
- content = []
-
- for card in app.builder.env.all_cardnodes:
- content.append(card["node"])
-
- node.replace_self(content)
-
-
-def setup(app):
- """Set-up the extension.
-
- Add out custom nodes and directives, then attach our hooks to the
- required events.
- """
- app.add_node(tutoriallistnode)
- app.add_node(
- cardnode,
- html=(visit_cardnode, depart_cardnode),
- latex=(visit_cardnode, depart_cardnode),
- text=(visit_cardnode, depart_cardnode),
- )
-
- app.add_directive("customcarditem", CustomCardItemDirective)
- app.add_directive("displayitem", DisplayItemDirective)
- app.add_directive("join_slack", SlackButton)
- app.add_directive("like_button_with_title", LikeButtonWithTitle)
- app.add_directive("react_greeter", ReactGreeter)
- app.add_directive("twocolumns", TwoColumns)
- app.add_directive("customcalloutitem", CustomCalloutItemDirective)
- app.add_directive("tutoriallist", TutorialListDirective)
-
- app.connect("env-purge-doc", purge_cards)
- app.connect("env-merge-info", merge_cards)
- app.connect("doctree-resolved", process_card_nodes)
-
- return {
- "parallel_read_safe": True,
- "parallel_write_safe": True,
- }
diff --git a/docs/_theme/rl4co/extensions/pytorch_tutorials.py b/docs/_theme/rl4co/extensions/pytorch_tutorials.py
deleted file mode 100644
index 12b0e73d..00000000
--- a/docs/_theme/rl4co/extensions/pytorch_tutorials.py
+++ /dev/null
@@ -1,523 +0,0 @@
-"""Adapted from PyTorch Tutorials: https://github.com/pytorch/tutorials.
-
-BSD 3-Clause License
-
-Copyright (c) 2017, Pytorch contributors
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""
-
-from docutils import nodes
-from docutils.parsers.rst import Directive, directives
-from docutils.statemachine import StringList
-from pt_lightning_sphinx_theme.extensions.react import get_react_component_rst
-from sphinx.util.docutils import SphinxDirective
-
-try:
- FileNotFoundError
-except NameError:
- FileNotFoundError = IOError
-
-
-class cardnode(nodes.General, nodes.TextElement):
- pass
-
-
-class CustomCardItemDirective(SphinxDirective):
- option_spec = {
- "header": directives.unchanged,
- "image": directives.unchanged,
- "card_description": directives.unchanged,
- "tags": directives.unchanged,
- "beta": directives.flag,
- }
-
- def run(self):
- try:
- if "header" in self.options:
- header = self.options["header"]
- else:
- raise ValueError("header not doc found")
-
- if "image" in self.options:
- image = ""
- else:
- image = ""
-
- # TODO: This probably only works when the tutorial list directive is in index.html
- link = self.env.docname + ".html"
-
- if "card_description" in self.options:
- card_description = self.options["card_description"]
- else:
- card_description = ""
-
- if "tags" in self.options:
- tags = self.options["tags"]
- else:
- tags = ""
-
- if "beta" in self.options:
- beta = "Beta"
- else:
- beta = ""
-
- except FileNotFoundError as e:
- print(e)
- return []
- except ValueError as e:
- print(e)
- raise
- return []
-
- card_rst = CARD_TEMPLATE.format(
- header=header,
- image=image,
- link=link,
- card_description=card_description,
- tags=tags,
- beta=beta,
- )
- card_list = StringList(card_rst.split("\n"))
- node = cardnode()
- self.state.nested_parse(card_list, self.content_offset, node)
-
- if not hasattr(self.env, "all_cardnodes"):
- self.env.all_cardnodes = []
- self.env.all_cardnodes.append({"docname": self.env.docname, "node": node})
- return [node]
-
-
-CARD_TEMPLATE = """
-.. raw:: html
-
-
-
- {% trans %}Free document hosting provided by Read the Docs.{% endtrans %}
-
-
-
-{% endif %}
diff --git a/docs/assets/figs/embeddings.png b/docs/assets/figs/embeddings.png
new file mode 100644
index 00000000..bbfc3325
Binary files /dev/null and b/docs/assets/figs/embeddings.png differ
diff --git a/docs/assets/figs/framework.png b/docs/assets/figs/framework.png
new file mode 100644
index 00000000..b4750966
Binary files /dev/null and b/docs/assets/figs/framework.png differ
diff --git a/docs/assets/figs/policies.png b/docs/assets/figs/policies.png
new file mode 100644
index 00000000..862f9eb9
Binary files /dev/null and b/docs/assets/figs/policies.png differ
diff --git a/docs/assets/figs/rl4co-logo.svg b/docs/assets/figs/rl4co-logo.svg
new file mode 100644
index 00000000..041aa2e1
--- /dev/null
+++ b/docs/assets/figs/rl4co-logo.svg
@@ -0,0 +1,38 @@
+
+
+
diff --git a/docs/assets/rl4co_animated_full_tricks.svg b/docs/assets/rl4co_animated_full_tricks.svg
new file mode 100644
index 00000000..2e1ac249
--- /dev/null
+++ b/docs/assets/rl4co_animated_full_tricks.svg
@@ -0,0 +1,77 @@
+
+
+
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index fca346f6..00000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# 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
-
-# -- Project information -----------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
-import rl4co
-
-project = "rl4co"
-copyright = "RL4CO Contributors"
-author = "Federico Berto, Chuanbo Hua, Junyoung Park, Minsu Kim, Hyeonah Kim, Jiwoo Son, Haeyeon Kim, Joungho Kim, Jinkyoo Park"
-
-
-release = rl4co.__version__
-
-# -- General configuration ---------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
-
-
-# Most taken from: https://github.com/Lightning-AI/lightning/blob/master/docs/source-pytorch/conf.py
-extensions = [
- "sphinx.ext.autodoc",
- "sphinx.ext.doctest",
- "sphinx.ext.intersphinx",
- "sphinx_toolbox.collapse",
- "sphinx.ext.todo",
- "sphinx.ext.coverage",
- "sphinx.ext.viewcode",
- "sphinx.ext.autosummary",
- "sphinx.ext.napoleon",
- "sphinx.ext.autosectionlabel",
- "sphinxcontrib.video",
- "sphinxcontrib.katex",
- "myst_parser",
- "nbsphinx",
- "sphinx_autodoc_typehints",
- "sphinx_copybutton",
- "sphinx_paramlinks",
- "sphinx_togglebutton",
- "sphinxcontrib.collections",
-]
-
-
-# Include the folder from the main repo containing the notebooks
-collections = {
- "my_files": {
- "driver": "copy_folder",
- "source": "../examples/",
- "target": "",
- "ignore": ["*.ckpt"],
- }
-}
-
-templates_path = ["_templates"]
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
-
-# -- Options for HTML output -------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
-
-# SECTION: original theme set
-# html_theme = 'alabaster'
-# html_static_path = ['_static']
-
-# SECTION: set sphinx_rtd_theme
-# html_theme = "sphinx_rtd_theme"
-# html_static_path = ['_static']
-# html_theme_options = {
-# 'navigation_depth': 4,
-# }
-
-# SECTION: set rl4co theme
-html_theme = "rl4co"
-html_theme_path = ["_theme"]
-
-# SECTION: set different parser for rst and md
-source_suffix = {
- ".rst": "restructuredtext",
- ".md": "markdown",
-}
-
-# intersphinx_mapping = {
-# "python": ("https://docs.python.org/3", None),
-# "torch": ("https://pytorch.org/docs/stable/", None),
-# "torchmetrics": ("https://torchmetrics.readthedocs.io/en/stable/", None),
-# "tensordict": ("https://pytorch-labs.github.io/tensordict/", None),
-# "torchrl": ("https://pytorch.org/rl/", None),
-# "torchaudio": ("https://pytorch.org/audio/stable/", None),
-# "torchtext": ("https://pytorch.org/text/stable/", None),
-# "torchvision": ("https://pytorch.org/vision/stable/", None),
-# "numpy": ("https://numpy.org/doc/stable/", None),
-# }
-
-
-autosummary_generate = True
-
-autodoc_member_order = "groupwise"
-
-autoclass_content = "both"
-
-autodoc_default_options = {
- "members": True,
- "methods": True,
- "special-members": "__call__",
- "exclude-members": "_abc_impl",
- "show-inheritance": True,
-}
-
-# Sphinx will add βpermalinksβ for each heading and description environment as paragraph signs that
-# become visible when the mouse hovers over them.
-# This value determines the text for the permalink; it defaults to "ΒΆ". Set it to None or the empty
-# string to disable permalinks.
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_add_permalinks
-html_permalinks = True
-html_permalinks_icon = "ΒΆ"
-
-# True to prefix each section label with the name of the document it is in, followed by a colon.
-# For example, index:Introduction for a section called Introduction that appears in document index.rst.
-# Useful for avoiding ambiguity when the same section heading appears in different documents.
-# http://www.sphinx-doc.org/en/master/usage/extensions/autosectionlabel.html
-autosectionlabel_prefix_document = True
diff --git a/docs/content/api/data.md b/docs/content/api/data.md
new file mode 100644
index 00000000..b316c783
--- /dev/null
+++ b/docs/content/api/data.md
@@ -0,0 +1,23 @@
+## Datasets
+
+:::data.dataset
+ options:
+ show_root_heading: false
+
+## Data Generation
+
+:::data.generate_data
+ options:
+ show_root_heading: false
+
+## Transforms
+
+:::data.transforms
+ options:
+ show_root_heading: false
+
+## Utils
+
+:::data.utils
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/content/api/decoding.md b/docs/content/api/decoding.md
new file mode 100644
index 00000000..0a0b5ec0
--- /dev/null
+++ b/docs/content/api/decoding.md
@@ -0,0 +1,5 @@
+# Decoding Strategies
+
+:::utils.decoding
+ options:
+ show_root_heading: false
diff --git a/docs/_content/api/envs/base.md b/docs/content/api/envs/base.md
similarity index 50%
rename from docs/_content/api/envs/base.md
rename to docs/content/api/envs/base.md
index 30e1a190..fe914cb6 100644
--- a/docs/_content/api/envs/base.md
+++ b/docs/content/api/envs/base.md
@@ -1,21 +1,15 @@
# Base Environment
-## `RL4COEnvBase`
-
This is the base wrapper around TorchRL's `EnvBase`, with additional functionality.
-```{eval-rst}
-.. automodule:: rl4co.envs.common.base
- :members:
- :undoc-members:
-```
+::: envs.common.base.RL4COEnvBase
+::: envs.common.base.ImprovementEnvBase
+
## Utilities
These contain utilities such as the base `Generator` class and `get_sampler`.
-```{eval-rst}
-.. automodule:: rl4co.envs.common.utils
- :members:
- :undoc-members:
-```
\ No newline at end of file
+:::envs.common.utils.Generator
+:::envs.common.utils.get_sampler
+:::envs.common.utils.batch_to_scalar
\ No newline at end of file
diff --git a/docs/content/api/envs/eda.md b/docs/content/api/envs/eda.md
new file mode 100644
index 00000000..c070e0f4
--- /dev/null
+++ b/docs/content/api/envs/eda.md
@@ -0,0 +1,14 @@
+# EDA Problems
+Environment for Electronic Design Automation (EDA) problems
+
+## Decap Placement Problem (DPP)
+
+:::envs.eda.dpp.env.DPPEnv
+
+:::envs.eda.dpp.generator.DPPGenerator
+
+## Multi-port Decap Placement Problem (mDPP)
+
+:::envs.eda.mdpp.env.MDPPEnv
+
+:::envs.eda.mdpp.generator.MDPPGenerator
diff --git a/docs/content/api/envs/routing.md b/docs/content/api/envs/routing.md
new file mode 100644
index 00000000..7c5be49f
--- /dev/null
+++ b/docs/content/api/envs/routing.md
@@ -0,0 +1,61 @@
+# Routing Problems
+
+See also the [Multi-Task VRP](#Multi-Task-Vehicle-Routing-Problem-(MTVRP)) at the bottom of this page, that includes 16 variants!
+
+## Asymmetric Traveling Salesman Problem (ATSP)
+
+:::envs.routing.atsp.env.ATSPEnv
+
+:::envs.routing.atsp.generator.ATSPGenerator
+
+## Capacitated Vehicle Routing Problem (CVRP)
+
+:::envs.routing.cvrp.env.CVRPEnv
+
+:::envs.routing.cvrp.generator.CVRPGenerator
+
+## Multiple Traveling Salesman Problem (mTSP)
+
+:::envs.routing.mtsp.env.MTSPEnv
+
+:::envs.routing.mtsp.generator.MTSPGenerator
+
+
+## Orienteering Problem (OP)
+
+:::envs.routing.op.env.OPEnv
+
+:::envs.routing.op.generator.OPGenerator
+
+## Pickup and Delivery Problem (PDP)
+
+:::envs.routing.pdp.env.PDPEnv
+
+:::envs.routing.pdp.generator.PDPGenerator
+
+## Prize Collecting Traveling Salesman Problem (PCTSP)
+
+:::envs.routing.pctsp.env.PCTSPEnv
+
+:::envs.routing.pctsp.generator.PCTSPGenerator
+
+## Split Delivery Vehicle Routing Problem (SDVRP)
+
+:::envs.routing.sdvrp.env.SDVRPEnv
+
+## Stochastic Prize Collecting Traveling Salesman Problem (SPCTSP)
+
+:::envs.routing.spctsp.env.SPCTSPEnv
+
+## Traveling Salesman Problem (TSP)
+
+:::envs.routing.tsp.env.TSPEnv
+
+:::envs.routing.tsp.generator.TSPGenerator
+
+## Multi-Task Vehicle Routing Problem (MTVRP)
+
+
+:::envs.routing.mtvrp.env.MTVRPEnv
+
+:::envs.routing.mtvrp.generator.MTVRPGenerator
\ No newline at end of file
diff --git a/docs/content/api/envs/scheduling.md b/docs/content/api/envs/scheduling.md
new file mode 100644
index 00000000..62b172b6
--- /dev/null
+++ b/docs/content/api/envs/scheduling.md
@@ -0,0 +1,13 @@
+# Scheduling Problems
+
+## Flexible Flow Shop Problem (FFSP)
+
+:::envs.scheduling.ffsp.env.FFSPEnv
+
+:::envs.scheduling.ffsp.generator.FFSPGenerator
+
+## Single Machine Total Weighted Tardiness Problem (SMTWTP)
+
+:::envs.scheduling.smtwtp.env.SMTWTPEnv
+
+:::envs.scheduling.smtwtp.generator.SMTWTPGenerator
\ No newline at end of file
diff --git a/docs/content/api/networks/base_policies.md b/docs/content/api/networks/base_policies.md
new file mode 100644
index 00000000..0d895afb
--- /dev/null
+++ b/docs/content/api/networks/base_policies.md
@@ -0,0 +1,42 @@
+
+# Constructive Policies Base Classes
+
+:::models.common.constructive.base
+ options:
+ show_root_heading: false
+
+## Autoregressive Policies
+
+:::models.common.constructive.autoregressive.encoder
+ options:
+ show_root_heading: false
+
+:::models.common.constructive.autoregressive.decoder
+ options:
+ show_root_heading: false
+
+:::models.common.constructive.autoregressive.policy
+ options:
+ show_root_heading: false
+
+## Nonautoregressive Policies
+
+:::models.common.constructive.nonautoregressive.encoder
+ options:
+ show_root_heading: false
+
+:::models.common.constructive.nonautoregressive.decoder
+ options:
+ show_root_heading: false
+
+:::models.common.constructive.nonautoregressive.policy
+ options:
+ show_root_heading: false
+
+
+# Improvement Policies (Base Classes)
+
+
+:::models.common.improvement.base
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/_content/api/models/env_embeddings.md b/docs/content/api/networks/env_embeddings.md
similarity index 79%
rename from docs/_content/api/models/env_embeddings.md
rename to docs/content/api/networks/env_embeddings.md
index 9d70ae6b..5056cb3b 100644
--- a/docs/_content/api/models/env_embeddings.md
+++ b/docs/content/api/networks/env_embeddings.md
@@ -9,39 +9,26 @@ In autoregressive policies, environment embeddings transfer data from feature sp
-
-
## Context Embeddings
The context embedding is used to modify the query embedding of the problem node of the current partial solution. Usually consists of a projection of gathered node embeddings and features to the embedding space.
-
-```{eval-rst}
-.. automodule:: rl4co.models.nn.env_embeddings.context
- :members:
- :undoc-members:
-```
-
----
+:::models.nn.env_embeddings.context
+ options:
+ show_root_heading: false
## Dynamic Embeddings
The dynamic embedding is used to modify query, key and value vectors of the attention mechanism based on the current state of the environment (which is changing during the rollout). Generally consists of a linear layer that projects the node features to the embedding space.
-```{eval-rst}
-.. automodule:: rl4co.models.nn.env_embeddings.dynamic
- :members:
- :undoc-members:
-```
-
----
+:::models.nn.env_embeddings.dynamic
+ options:
+ show_root_heading: false
## Init Embeddings
The init embedding is used to initialize the general embedding of the problem nodes without any solution information. Generally consists of a linear layer that projects the node features to the embedding space.
-```{eval-rst}
-.. automodule:: rl4co.models.nn.env_embeddings.init
- :members:
- :undoc-members:
-```
\ No newline at end of file
+:::models.nn.env_embeddings.init
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/content/api/networks/improvement_policies.md b/docs/content/api/networks/improvement_policies.md
new file mode 100644
index 00000000..a4fdc075
--- /dev/null
+++ b/docs/content/api/networks/improvement_policies.md
@@ -0,0 +1,7 @@
+## Improvement Policies (Base Classes)
+
+
+
+:::models.common.improvement.base
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/content/api/networks/nn.md b/docs/content/api/networks/nn.md
new file mode 100644
index 00000000..66cc5637
--- /dev/null
+++ b/docs/content/api/networks/nn.md
@@ -0,0 +1,29 @@
+# Neural Network Modules
+
+## Critic Network
+
+:::models.rl.common.critic.CriticNetwork
+
+## Graph Neural Networks
+
+:::models.nn.graph.attnnet.MultiHeadAttentionLayer
+:::models.nn.graph.attnnet.GraphAttentionNetwork
+
+:::models.nn.graph.gcn.GCNEncoder
+
+:::models.nn.graph.mpnn.MessagePassingEncoder
+
+## Attention Mechanisms
+
+:::models.nn.attention
+ options:
+ show_root_heading: false
+
+## Multi-Layer Perceptron
+
+:::models.nn.mlp.MLP
+
+## Operations
+
+:::models.nn.ops.PositionalEncoding
+:::models.nn.ops.RandomEncoding
\ No newline at end of file
diff --git a/docs/content/api/rl/a2c.md b/docs/content/api/rl/a2c.md
new file mode 100644
index 00000000..77abe89f
--- /dev/null
+++ b/docs/content/api/rl/a2c.md
@@ -0,0 +1 @@
+:::models.rl.a2c.a2c.A2C
diff --git a/docs/content/api/rl/base.md b/docs/content/api/rl/base.md
new file mode 100644
index 00000000..58ebf0aa
--- /dev/null
+++ b/docs/content/api/rl/base.md
@@ -0,0 +1,19 @@
+# RL4COLitModule
+
+The `RL4COLitModule` is a wrapper around PyTorch Lightning's `LightningModule` that provides additional functionality for RL algorithms. It is the parent class for all RL algorithms in the library.
+
+::: models.rl.common.base.RL4COLitModule
+
+
+## Transductive Learning
+
+Transductive models are learning algorithms that optimize on a specific instance. They improve solutions by updating policy parameters $\theta$, which means that we are running optimization (backprop) **at test time**. Transductive learning can be performed with different policies: for example EAS updates (a part of) AR policies parameters to obtain better solutions, but I guess there are ways (or papers out there I don't know of) that optimize at test time.
+
+
+!!! tip
+ You may refer to the definition of [inductive vs transductive RL](https://en.wikipedia.org/wiki/Transduction_(machine_learning)) . In inductive RL, we train to generalize to new instances. In transductive RL we train (or finetune) to solve only specific ones.
+
+
+:::models.common.transductive.base
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/content/api/rl/ppo.md b/docs/content/api/rl/ppo.md
new file mode 100644
index 00000000..04c9a4bc
--- /dev/null
+++ b/docs/content/api/rl/ppo.md
@@ -0,0 +1 @@
+:::models.rl.ppo.ppo.PPO
\ No newline at end of file
diff --git a/docs/content/api/rl/reinforce.md b/docs/content/api/rl/reinforce.md
new file mode 100644
index 00000000..60e25ae7
--- /dev/null
+++ b/docs/content/api/rl/reinforce.md
@@ -0,0 +1,10 @@
+:::models.rl.reinforce.reinforce.REINFORCE
+:::models.rl.reinforce.baselines.REINFORCEBaseline
+:::models.rl.reinforce.baselines.NoBaseline
+:::models.rl.reinforce.baselines.SharedBaseline
+:::models.rl.reinforce.baselines.ExponentialBaseline
+:::models.rl.reinforce.baselines.MeanBaseline
+:::models.rl.reinforce.baselines.WarmupBaseline
+:::models.rl.reinforce.baselines.CriticBaseline
+:::models.rl.reinforce.baselines.RolloutBaseline
+:::models.rl.reinforce.baselines.get_reinforce_baseline
diff --git a/docs/content/api/tasks.md b/docs/content/api/tasks.md
new file mode 100644
index 00000000..37e0ac7e
--- /dev/null
+++ b/docs/content/api/tasks.md
@@ -0,0 +1,9 @@
+## Train
+:::tasks.train
+ options:
+ show_root_heading: false
+
+## Evaluate
+:::tasks.eval
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/_theme/rl4co/extensions/__init__.py b/docs/content/api/train_and_eval.md
similarity index 100%
rename from docs/_theme/rl4co/extensions/__init__.py
rename to docs/content/api/train_and_eval.md
diff --git a/docs/content/api/zoo/constructive_ar.md b/docs/content/api/zoo/constructive_ar.md
new file mode 100644
index 00000000..5391eeb1
--- /dev/null
+++ b/docs/content/api/zoo/constructive_ar.md
@@ -0,0 +1,113 @@
+# Constructive Autoregressive Methods
+
+## Attention Model (AM)
+
+:::models.zoo.am.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.am.policy
+ options:
+ show_root_heading: false
+
+## Attention Model - PPO (AM-PPO)
+
+:::models.zoo.amppo.model
+ options:
+ show_root_heading: false
+
+## Heterogeneous Attention Model (HAM)
+
+:::models.zoo.ham.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.ham.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.ham.encoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.ham.attention
+ options:
+ show_root_heading: false
+
+## Matrix Encoding Network (MatNet)
+
+:::models.zoo.matnet.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.matnet.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.matnet.encoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.matnet.decoder
+ options:
+ show_root_heading: false
+
+## Multi-Decoder Attention Model (MDAM)
+
+:::models.zoo.mdam.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.mdam.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.mdam.encoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.mdam.decoder
+ options:
+ show_root_heading: false
+
+## POMO
+
+:::models.zoo.pomo.model
+ options:
+ show_root_heading: false
+
+## Pointer Network (PtrNet)
+
+:::models.zoo.ptrnet.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.ptrnet.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.ptrnet.encoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.ptrnet.decoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.ptrnet.critic
+ options:
+ show_root_heading: false
+
+## SymNCO
+
+:::models.zoo.symnco.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.symnco.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.symnco.losses
+ options:
+ show_root_heading: false
diff --git a/docs/content/api/zoo/constructive_nar.md b/docs/content/api/zoo/constructive_nar.md
new file mode 100644
index 00000000..3e1860ec
--- /dev/null
+++ b/docs/content/api/zoo/constructive_nar.md
@@ -0,0 +1,27 @@
+
+# Constructive NonAutoregressive
+
+## DeepACO
+
+:::models.zoo.deepaco.antsystem
+ options:
+ show_root_heading: false
+
+:::models.zoo.deepaco.model
+ options:
+ show_root_heading: false
+
+:::models.zoo.deepaco.policy
+ options:
+ show_root_heading: false
+
+
+## NAR-GNN
+
+:::models.zoo.nargnn.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.nargnn.encoder
+ options:
+ show_root_heading: false
diff --git a/docs/content/api/zoo/improvement.md b/docs/content/api/zoo/improvement.md
new file mode 100644
index 00000000..8ca68c75
--- /dev/null
+++ b/docs/content/api/zoo/improvement.md
@@ -0,0 +1,55 @@
+# Improvement Methods
+
+These methods are trained to improve existing solutions iteratively, akin to local search algorithms. They focus on refining existing solutions rather than generating them from scratch.
+
+### DACT
+
+:::models.zoo.dact.encoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.dact.decoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.dact.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.dact.model
+ options:
+ show_root_heading: false
+
+
+### N2S
+
+:::models.zoo.n2s.encoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.n2s.decoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.n2s.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.n2s.model
+ options:
+ show_root_heading: false
+
+
+### NeuOpt
+
+:::models.zoo.neuopt.decoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.neuopt.policy
+ options:
+ show_root_heading: false
+
+:::models.zoo.neuopt.model
+ options:
+ show_root_heading: false
\ No newline at end of file
diff --git a/docs/content/api/zoo/transductive.md b/docs/content/api/zoo/transductive.md
new file mode 100644
index 00000000..1b7281ad
--- /dev/null
+++ b/docs/content/api/zoo/transductive.md
@@ -0,0 +1,23 @@
+## Transductive Methods
+
+These methods update policy parameters during online testing to improve the solutions of a specific instance.
+
+### Active Search (AS)
+
+:::models.zoo.active_search.search
+ options:
+ show_root_heading: false
+
+### Efficent Active Search (EAS)
+
+:::models.zoo.eas.search
+ options:
+ show_root_heading: false
+
+:::models.zoo.eas.decoder
+ options:
+ show_root_heading: false
+
+:::models.zoo.eas.nn
+ options:
+ show_root_heading: false
diff --git a/docs/content/environments/eda.md b/docs/content/environments/eda.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/content/environments/routing.md b/docs/content/environments/routing.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/content/environments/scheduling.md b/docs/content/environments/scheduling.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/content/general/ai4co.md b/docs/content/general/ai4co.md
new file mode 100644
index 00000000..66db67a3
--- /dev/null
+++ b/docs/content/general/ai4co.md
@@ -0,0 +1,14 @@
+# AI4CO Community
+
+We invite you to join our AI4CO community, an open and inclusive research group in Artificial Intelligence (AI) for Combinatorial Optimization (CO)!
+
+
+## Links
+- [GitHub](https://github.com/ai4co)
+- [Slack](https://bit.ly/ai4co-slack)
+- [Website](https://ai4co.org) (coming soon!)
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/_content/general/contribute.md b/docs/content/general/contribute.md
similarity index 100%
rename from docs/_content/general/contribute.md
rename to docs/content/general/contribute.md
diff --git a/docs/content/general/faq.md b/docs/content/general/faq.md
new file mode 100644
index 00000000..c84cb0f6
--- /dev/null
+++ b/docs/content/general/faq.md
@@ -0,0 +1,11 @@
+# FAQ
+
+
+
+You can submit your questions via [GitHub Issues](https://github.com/ai4co/rl4co/discussions) or [Discussions](https://github.com/ai4co/rl4co/discussions). You may search for your question in the existing issues or discussions before submitting a new one.
+
+
+If ask more than a few times, we will add it here!
+
+
+
diff --git a/docs/content/intro/environments.md b/docs/content/intro/environments.md
new file mode 100644
index 00000000..4de3c555
--- /dev/null
+++ b/docs/content/intro/environments.md
@@ -0,0 +1,28 @@
+## Definition
+
+Given a CO problem instance $\mathbf{x}$, we formulate the solution-generating procedure as a Markov Decision Process (MDP) characterized by a tuple $(\mathcal{S}, \mathcal{A}, \mathcal{T}, \mathcal{R}, \gamma)$ as follows:
+
+- **State** $\mathcal{S}$ is the space of states that represent the given problem $\mathbf{x}$ and the current partial solution being updated in the MDP.
+- **Action** $\mathcal{A}$ is the action space, which includes all feasible actions $a_t$ that can be taken at each step $t$.
+- **State Transition** $\mathcal{T}$ is the deterministic state transition function $s_{t+1} = \mathcal{T}(s_t, a_t)$ that updates a state $s_t$ to the next state $s_{t+1}$.
+- **Reward** $\mathcal{R}$ is the reward function $\mathcal{R}(s_t, a_t)$ representing the immediate reward received after taking action $a_t$ in state $s_t$.
+- **Discount Factor** $\gamma \in [0, 1]$ determines the importance of future rewards.
+
+Since the state transition is deterministic, we represent the solution for a problem $\mathbf{x}$ as a sequence of $T$ actions $\mathbf{a} = (a_1, \ldots, a_T)$. Then the total return $\sum_{t=1}^T \mathcal{R}(s_t, a_t)$ translates to the negative cost function of the CO problem.
+
+## Implementation
+
+Environments in our library fully specify the CO problems and their logic. They are based on the `RL4COEnvBase` class that extends from the [`EnvBase`](https://pytorch.org/rl/stable/reference/generated/torchrl.envs.EnvBase.html#torchrl.envs.EnvBase) in TorchRL.
+
+Key features:
+- A modular `generator` can be provided to the environment.
+- The generator provides CO instances to the environment, and different generators can be used to generate different data distributions.
+- Static instance data and dynamic variables, such as the current state $s_t$, current solution $\mathbf{a}^k$ for improvement environments, policy actions $a_t$, rewards, and additional information are passed in a *stateless* fashion in a [`TensorDict`](https://pytorch.org/tensordict/stable/reference/generated/tensordict.TensorDict.html?highlight=tensordict#tensordict.TensorDict), that we call `td`, through the environment `reset` and `step` functions.
+
+Our environment API contains several functions:
+- `render`
+- `check_solution_validity`
+- `select_start_nodes` (i.e., for POMO-based optimization)
+- Optional API such as `local_search` for solution improvement
+
+It's worth noting that our library enhances the efficiency of environments when compared to vanilla TorchRL, by overriding and optimizing some methods in TorchRL [`EnvBase`](https://pytorch.org/rl/stable/reference/generated/torchrl.envs.EnvBase.html#torchrl.envs.EnvBase). For instance, our new `step` method brings a decrease of up to 50% in latency and halves the memory impact by avoiding saving duplicate components in the stateless [`TensorDict`](https://pytorch.org/tensordict/stable/reference/generated/tensordict.TensorDict.html?highlight=tensordict#tensordict.TensorDict).
\ No newline at end of file
diff --git a/docs/content/intro/intro.md b/docs/content/intro/intro.md
new file mode 100644
index 00000000..ea9f6dd2
--- /dev/null
+++ b/docs/content/intro/intro.md
@@ -0,0 +1,34 @@
+# Introduction
+
+RL4CO is an extensive Reinforcement Learning (RL) for Combinatorial Optimization (CO) benchmark. Our goal is to provide a unified framework for RL-based CO algorithms, and to facilitate reproducible research in this field, decoupling the science from the engineering.
+
+
+
+
+## Motivation
+
+### Why NCO?
+Neural Combinatorial Optimization (NCO) is a subfield of AI that aims to solve combinatorial optimization problems using neural networks. NCO has been successfully applied to a wide range of problems, such as the routing problems in logistics, the scheduling problems in manufacturing, and electronic design automation. The key idea behind NCO is to learn a policy that maps the input data to the optimal solution, without the need for hand-crafted heuristics or domain-specific knowledge.
+
+
+### Why RL?
+Reinforcement Learning (RL) is a machine learning paradigm that enables agents to learn how to make decisions by interacting with an environment. RL has been successfully applied to a wide range of problems, such as playing games, controlling robots, and optimizing complex systems. The key idea behind RL is to learn a policy that maps the state of the environment to the optimal action, by maximizing a reward signal. Importantly, optimal solutions are not required for training, as RL agents learn from the feedback they receive from the environment.
+
+
+
+## Contents
+
+We explore in other pages the following components:
+
+- [Environments](environments.md): Markov Decision Process (MDP) for CO problems and base classes for environments. These are based on [TorchRL](https://pytorch.org/rl/stable/index.html).
+
+- [Policies](policies.md): the neural networks that are used to solve CO problems and their base classes. These are based on [PyTorch](https://pytorch.org/).
+
+- [RL Algorithms](rl.md): (broadly: "models"), which are the processes used to train the policies and their base classes. These are based on [PyTorch Lightning](https://lightning.ai/docs/pytorch/stable/).
+
+
+
+
+
+
+
diff --git a/docs/content/intro/policies.md b/docs/content/intro/policies.md
new file mode 100644
index 00000000..9b5ea4ec
--- /dev/null
+++ b/docs/content/intro/policies.md
@@ -0,0 +1,53 @@
+# Policies
+
+The policies can be categorized into constructive policies, which generate a solution from scratch, and improvement policies, which refine an existing solution.
+
+## Constructive policies
+
+A policy $\pi$ is used to construct a solution from scratch for a given problem instance $\mathbf{x}$. It can be further categorized into autoregressive (AR) and non-autoregressive (NAR) policies.
+
+
+### Autoregressive (AR) policies
+An AR policy is composed of an encoder $f$ that maps the instance $\mathbf{x}$ into an embedding space $\mathbf{h}=f(\mathbf{x})$ and by a decoder $g$ that iteratively determines a sequence of actions $\mathbf{a}$ as follows:
+
+$$
+a_t \sim g(a_t | a_{t-1}, ... ,a_0, s_t, \mathbf{h}), \quad
+\pi(\mathbf{a}|\mathbf{x}) \triangleq \prod_{t=1}^{T-1} g(a_{t} | a_{t-1}, \ldots ,a_0, s_t, \mathbf{h}).
+$$
+
+### Non-autoregressive (NAR) policies
+A NAR policy encodes a problem $\mathbf{x}$ into a heuristic $\mathcal{H} = f(\mathbf{x}) \in \mathbb{R}^{N}_{+}$, where $N$ is the number of possible assignments across all decision variables. Each number in $\mathcal{H}$ represents a (unnormalized) probability of a particular assignment. To obtain a solution $\mathbf{a}$ from $\mathcal{H}$, one can sample a sequence of assignments from $\mathcal{H}$ while dynamically masking infeasible assignments to meet problem-specific constraints. It can also guide a search process, e.g., Ant Colony Optimization, or be incorporated into hybrid frameworks. Here, the heuristic helps identify promising transitions and improve the efficiency of finding an optimal or near-optimal solution.
+
+
+
+
+
+
+
+## Improvement policies
+
+A policy can be used for improving an initial solution $\mathbf{a}^{0}=(a_{0}^{0},\ldots, a_{T-1}^{0})$ into another one potentially with higher quality, which can be formulated as follows:
+
+$$
+\mathbf{a}^k \sim g(\mathbf{a}^{0}, \mathbf{h}), \quad\pi(\mathbf{a}^K|\mathbf{a}^0,\mathbf{x}) \triangleq \prod_{k=1}^{K-1} g(\mathbf{a}^k | \mathbf{a}^{k-1}, ... ,\mathbf{a}^0, \mathbf{h}),
+$$
+
+where $\mathbf{a}^{k}$ is the $k$-th updated solution and $K$ is the budget for number of improvements. This process allows continuous refinement for a long time to enhance the solution quality.
+
+
+
+
+## Implementation
+
+Policies in our library are subclasses of PyTorch's [`nn.Module`](https://pytorch.org/docs/stable/generated/torch.nn.Module.html) and contain the encoding-decoding logic and neural network parameters $\theta$. Different policies in the RL4CO "zoo" can inherit from metaclasses like `ConstructivePolicy` or `ImprovementPolicy`. We modularize components to process raw features into the embedding space via a parametrized function $\phi_\omega$, called *feature embeddings*.
+
+1. *Node Embeddings $\phi_n$*: transform $m_n$ node features of instances $\mathbf{x}$ from the feature space to the embedding space $h$, i.e., $[B, N, m_n] \rightarrow [B, N, h]$.
+2. *Edge Embeddings $\phi_e$*: transform $m_e$ edge features of instances $\mathbf{x}$ from the feature space to the embedding space $h$, i.e., $[B, E, m_e] \rightarrow [B, E, h]$, where $E$ is the number of edges.
+3. *Context Embeddings $\phi_c$*: capture contextual information by transforming $m_c$ context features from the current decoding step $s_t$ from the feature space to the embedding space $h$, i.e., $[B, m_c] \rightarrow [B, h]$, for nodes or edges.
+
+
+
+
+
+
+ Embeddings can be automatically selected by our library at runtime by simply passing the `env_name` to the policy. Additionally, we allow for granular control of any higher-level policy component independently, such as encoders and decoders.
\ No newline at end of file
diff --git a/docs/content/intro/rl.md b/docs/content/intro/rl.md
new file mode 100644
index 00000000..1e4510cf
--- /dev/null
+++ b/docs/content/intro/rl.md
@@ -0,0 +1,43 @@
+# RL Algorithms
+
+
+## Definitions
+
+The RL objective is to learn a policy $\pi$ that maximizes the expected cumulative reward (or equivalently minimizes the cost) over the distribution of problem instances:
+
+$$
+\theta^{*} = \underset{\theta}{\text{argmax}} \, \mathbb{E}_{\mathbf{x} \sim P(\mathbf{x})} \left[ \mathbb{E}_{\pi(\mathbf{a}|\mathbf{x})} \left[ \sum_{t=0}^{T-1} \gamma^t \mathcal{R}(s_t, a_t) \right] \right],
+$$
+
+where $\theta$ is the set of parameters of $\pi$ and $P(\mathbf{x})$ is the distribution of problem instances.
+
+This equation can be solved using algorithms such as variations of REINFORCE, Advantage Actor-Critic (A2C) methods, or Proximal Policy Optimization (PPO).
+
+These algorithms are employed to train the policy network $\pi$, by transforming the maximization problem into a minimization problem involving a loss function, which is then optimized using gradient descent algorithms. For instance, the REINFORCE loss function gradient is given by:
+
+$$
+\nabla_{\theta} \mathcal{L}_a(\theta|\mathbf{x}) = \mathbb{E}_{\pi(\mathbf{a}|\mathbf{x})} \left[(R(\mathbf{a}, \mathbf{x}) - b(\mathbf{x})) \nabla_{\theta}\log \pi(\mathbf{a}|\mathbf{x})\right],
+$$
+
+where $b(\cdot)$ is a baseline function used to stabilize training and reduce gradient variance.
+
+We also distinguish between two types of RL (pre)training:
+
+1. *Inductive RL*: The focus is on learning patterns from the training dataset to generalize to new instances, thus amortizing the inference procedure.
+2. *Transductive RL* (or test-time optimization): Optimizes parameters during testing on target instances.
+
+Typically, a policy $\pi$ is trained using inductive RL, followed by transductive RL for test-time optimization.
+
+### Implementation
+
+RL algorithms in our library define the process that takes the `Environment` with its problem instances and the `Policy` to optimize its parameters $\theta$. The parent class of algorithms is the `RL4COLitModule`, inheriting from PyTorch Lightning's [`pl.LightningModule`](https://lightning.ai/docs/pytorch/stable/common/lightning_module.html). This allows for granular support of various methods including the `[train, val, test]_step`, automatic logging with several logging services such as Wandb via `log_metrics`, automatic optimizer configuration via `configure_optimizers` and several useful callbacks for RL methods such as `on_train_epoch_end`.
+
+RL algorithms are additionally attached to an `RL4COTrainer`, a wrapper we made with additional optimizations around `pl.Trainer`. This module seamlessly supports features of modern training pipelines, including:
+
+- Logging
+- Checkpoint management
+- Mixed-precision training
+- Various hardware acceleration supports (e.g., CPU, GPU, TPU, and Apple Silicon)
+- Multi-device hardware accelerator in distributed settings
+
+For instance, using mixed-precision training significantly decreases training time without sacrificing much convergence and enables us to leverage recent routines, e.g., FlashAttention.
\ No newline at end of file
diff --git a/docs/_content/start/hydra.md b/docs/content/start/hydra.md
similarity index 90%
rename from docs/_content/start/hydra.md
rename to docs/content/start/hydra.md
index 9126fae2..c34d570c 100644
--- a/docs/_content/start/hydra.md
+++ b/docs/content/start/hydra.md
@@ -9,8 +9,8 @@ Train model with default configuration (AM on TSP environment):
python run.py
```
-> [!TIP]
-> You may check out [this notebook](examples/advanced/1-hydra-config.ipynb) to get started with Hydra!
+!!! tip
+ You may check out [this notebook](examples/advanced/1-hydra-config.ipynb) to get started with Hydra!
### Change experiment
diff --git a/docs/_content/start/installation.md b/docs/content/start/installation.md
similarity index 100%
rename from docs/_content/start/installation.md
rename to docs/content/start/installation.md
diff --git a/docs/hooks.py b/docs/hooks.py
new file mode 100644
index 00000000..24d6640b
--- /dev/null
+++ b/docs/hooks.py
@@ -0,0 +1,52 @@
+import logging
+import os
+import shutil
+from textwrap import dedent
+
+log = logging.getLogger("mkdocs")
+
+# Global variable to store the paths of created __init__.py files
+created_files = []
+
+
+def on_startup(*args, **kwargs):
+ log.info("Creating missing __init__.py files in rl4co package")
+ for subdir, dirs, files in os.walk("rl4co"):
+ if "__init__.py" not in files:
+ init_file_path = os.path.join(subdir, "__init__.py")
+ with open(init_file_path, "w"):
+ pass # empty file
+ created_files.append(init_file_path)
+ log.info(f"{len(created_files)} __init__.py files created")
+
+ # huge trick: we save a backup of README.md and append CSS content to hide some elements
+ log.info("Saving backup of README.md and appending CSS content")
+ shutil.copyfile("README.md", "README_backup.md")
+ # warning: don't touch any of the following. you have been warned :)
+ def append_tricks_to_readme(file_path):
+ # read the tricks from docs/overrides/fancylogo.txt
+ # and put them at the beginning of the file
+ with open("docs/overrides/fancylogo.txt", 'r') as fancylogo:
+ tricks = fancylogo.read()
+ if not os.path.exists(file_path):
+ print(f"Error: The file {file_path} does not exist.")
+ return
+ with open(file_path, 'r') as original:
+ data = original.read()
+ # remove first 33 lines. yeah, it's a hack to remove unneded stuff lol
+ data = '\n'.join(data.split('\n')[33:])
+ with open(file_path, 'w') as modified:
+ modified.write(tricks + data)
+ print(f"CSS content has been appended to {file_path}")
+
+ append_tricks_to_readme("README.md")
+
+
+def on_shutdown(*args, **kwargs):
+ log.info(f"Removing {len(created_files)} created __init__.py files")
+ for file_path in created_files:
+ if os.path.exists(file_path):
+ os.remove(file_path)
+
+ log.info("Replace README.md with README_backup.md")
+ shutil.move("README_backup.md", "README.md")
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index 87aae5fd..00000000
--- a/docs/index.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# RL4CO
-
-
-
-
-
-
-
-
-
-An extensive Reinforcement Learning (RL) for Combinatorial Optimization (CO) benchmark. Our goal is to provide a unified framework for RL-based CO algorithms, and to facilitate reproducible research in this field, decoupling the science from the engineering.
-
-
-
-
- [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
-
-[![License: MIT](https://img.shields.io/badge/License-MIT-red.svg)](https://opensource.org/licenses/MIT) [![PyPI](https://img.shields.io/pypi/v/rl4co?logo=pypi)](https://pypi.org/project/rl4co)
-[![Test](https://github.com/ai4co/rl4co/actions/workflows/tests.yml/badge.svg)](https://github.com/ai4co/rl4co/actions/workflows/tests.yml)
-
-
-
-
-
-
-RL4CO is built upon:
-- [TorchRL](https://github.com/pytorch/rl): official PyTorch framework for RL algorithms and vectorized environments on GPUs
-- [TensorDict](https://github.com/pytorch-labs/tensordict): a library to easily handle heterogeneous data such as states, actions and rewards
-- [PyTorch Lightning](https://github.com/Lightning-AI/lightning): a lightweight PyTorch wrapper for high-performance AI research
-- [Hydra](https://github.com/facebookresearch/hydra): a framework for elegantly configuring complex applications
-
-
-
-
-```{eval-rst}
-.. toctree::
- :maxdepth: 3
- :caption: Getting started
-
- _content/start/installation
- _collections/1-quickstart
- _content/start/hydra
- _content/api/models/common/__init__
-
-
-.. toctree::
- :maxdepth: 3
- :caption: Tutorials
-
- _collections/2-full-training
- _collections/3-creating-new-env-model
- _collections/modeling/1-decoding-strategies
- _collections/modeling/2-transductive-methods
- _collections/modeling/3-change-encoder
- _collections/advanced/1-hydra-config
-
-.. toctree::
- :maxdepth: 3
- :caption: RL Algorithms
-
- _content/api/algos/base
- _content/api/algos/reinforce
- _content/api/algos/a2c
- _content/api/algos/ppo
-
-
-.. toctree::
- :maxdepth: 3
- :caption: Environments
-
- _content/api/envs/base
- _content/api/envs/eda
- _content/api/envs/routing
- _content/api/envs/scheduling
-
-.. toctree::
- :maxdepth: 3
- :caption: Networks
-
- _content/api/models/nn
- _content/api/models/env_embeddings
-
-.. toctree::
- :maxdepth: 3
- :caption: Base NCO Methods
-
- _content/api/models/common/constructive
- _content/api/models/common/improvement
- _content/api/models/common/transductive
-
-
-.. toctree::
- :maxdepth: 3
- :caption: Model Zoo
-
- _content/api/models/common/zoo/__init__
- _content/api/models/common/zoo/constructive
- _content/api/models/common/zoo/improvement
- _content/api/models/common/zoo/transductive
-
-.. toctree::
- :maxdepth: 3
- :caption: Additional API
-
- _content/api/tasks
- _content/api/decoding
- _content/api/data
-
-.. toctree::
- :maxdepth: 3
- :caption: Other
-
- _content/general/contribute
- _content/general/faq
-```
-
-
-## Contributors
-
-
-
\ No newline at end of file
diff --git a/docs/js/autolink.js b/docs/js/autolink.js
new file mode 100644
index 00000000..30a295a5
--- /dev/null
+++ b/docs/js/autolink.js
@@ -0,0 +1,34 @@
+const convertLinks = ( input ) => {
+
+ let text = input;
+ const linksFound = text.match( /(?:www|https?)[^\s]+/g );
+ const aLink = [];
+
+ if ( linksFound != null ) {
+
+ for ( let i=0; i' )
+ }
+ else if ( linkText.match( /vimeo/ ) ) {
+ let vimeoID = replace.split( '/' ).slice(-1)[0];
+ aLink.push( '' )
+ }
+ else {
+ aLink.push( '' + linkText + '' );
+ }
+ text = text.split( linksFound[i] ).map(item => { return aLink[i].includes('iframe') ? item.trim() : item } ).join( aLink[i] );
+ }
+ return text;
+
+ }
+ else {
+ return input;
+ }
+ }
\ No newline at end of file
diff --git a/docs/js/katex.js b/docs/js/katex.js
new file mode 100644
index 00000000..841e35ad
--- /dev/null
+++ b/docs/js/katex.js
@@ -0,0 +1,10 @@
+document$.subscribe(({ body }) => {
+ renderMathInElement(body, {
+ delimiters: [
+ { left: "$$", right: "$$", display: true },
+ { left: "$", right: "$", display: false },
+ { left: "\\(", right: "\\)", display: false },
+ { left: "\\[", right: "\\]", display: true }
+ ],
+ })
+})
\ No newline at end of file
diff --git a/docs/js/tsparticles.js b/docs/js/tsparticles.js
new file mode 100644
index 00000000..bf96e09b
--- /dev/null
+++ b/docs/js/tsparticles.js
@@ -0,0 +1,2 @@
+/*! For license information please see tsparticles.bundle.min.js.LICENSE.txt */
+!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var s in i)("object"==typeof exports?exports:t)[s]=i[s]}}(this,(()=>(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{AnimatableColor:()=>Se,AnimationOptions:()=>Me,AnimationValueWithRandom:()=>Ee,Background:()=>le,BackgroundMask:()=>de,BackgroundMaskCover:()=>he,Circle:()=>yi,ClickEvent:()=>pe,Collisions:()=>Fe,CollisionsAbsorb:()=>De,CollisionsOverlap:()=>Te,ColorAnimation:()=>Pe,DivEvent:()=>fe,Events:()=>ge,ExternalInteractorBase:()=>Si,FullScreen:()=>ue,HoverEvent:()=>ye,HslAnimation:()=>Oe,HslColorManager:()=>Pi,Interactivity:()=>we,ManualParticle:()=>xe,Modes:()=>be,Move:()=>Xe,MoveAngle:()=>qe,MoveAttract:()=>He,MoveCenter:()=>Ve,MoveGravity:()=>Ue,MovePath:()=>We,MoveTrail:()=>je,Opacity:()=>Ze,OpacityAnimation:()=>Ye,Options:()=>li,OptionsColor:()=>ce,OutModes:()=>Ge,Parallax:()=>ve,ParticlesBounce:()=>Ae,ParticlesBounceFactor:()=>Le,ParticlesDensity:()=>Qe,ParticlesInteractorBase:()=>Di,ParticlesNumber:()=>Ke,ParticlesNumberLimit:()=>Je,ParticlesOptions:()=>ai,Point:()=>pi,Range:()=>fi,RangedAnimationOptions:()=>Ce,RangedAnimationValueWithRandom:()=>Ie,Rectangle:()=>vi,ResizeEvent:()=>me,Responsive:()=>_e,RgbColorManager:()=>Oi,Shadow:()=>ti,Shape:()=>ei,Size:()=>si,SizeAnimation:()=>ii,Spin:()=>Ne,Stroke:()=>oi,Theme:()=>ze,ThemeDefault:()=>ke,ValueWithRandom:()=>Re,Vector:()=>y,Vector3d:()=>v,ZIndex:()=>ni,addColorManager:()=>Pt,addEasing:()=>b,alterHsl:()=>se,areBoundsInside:()=>et,arrayRandomIndex:()=>J,calcExactPositionOrRandomFromSize:()=>B,calcExactPositionOrRandomFromSizeRanged:()=>q,calcPositionFromSize:()=>L,calcPositionOrRandomFromSize:()=>A,calcPositionOrRandomFromSizeRanged:()=>F,calculateBounds:()=>it,circleBounce:()=>lt,circleBounceDataFromParticle:()=>ct,clamp:()=>k,clear:()=>Zt,collisionVelocity:()=>I,colorMix:()=>Vt,colorToHsl:()=>Tt,colorToRgb:()=>Dt,deepExtend:()=>st,divMode:()=>rt,divModeExecute:()=>nt,drawEffect:()=>Jt,drawLine:()=>Nt,drawParticle:()=>Qt,drawParticlePlugin:()=>ie,drawPlugin:()=>ee,drawShape:()=>Kt,drawShapeAfterDraw:()=>te,errorPrefix:()=>f,executeOnSingleOrMultiple:()=>dt,findItemFromSingleOrMultiple:()=>pt,generatedAttribute:()=>i,getDistance:()=>T,getDistances:()=>D,getEasing:()=>w,getHslAnimationFromHsl:()=>jt,getHslFromAnimation:()=>$t,getLinkColor:()=>Ut,getLinkRandomColor:()=>Wt,getLogger:()=>W,getParticleBaseVelocity:()=>E,getParticleDirectionAngle:()=>R,getPosition:()=>yt,getRandom:()=>_,getRandomRgbColor:()=>Bt,getRangeMax:()=>O,getRangeMin:()=>P,getRangeValue:()=>C,getSize:()=>mt,getStyleFromHsl:()=>Ht,getStyleFromRgb:()=>qt,hasMatchMedia:()=>G,hslToRgb:()=>At,hslaToRgba:()=>Ft,initParticleNumericAnimationValue:()=>ft,isArray:()=>kt,isBoolean:()=>gt,isDivModeEnabled:()=>ot,isFunction:()=>xt,isInArray:()=>Z,isNumber:()=>wt,isObject:()=>_t,isPointInside:()=>tt,isSsr:()=>j,isString:()=>bt,itemFromArray:()=>K,itemFromSingleOrMultiple:()=>ut,loadFont:()=>Q,loadFull:()=>gn,loadOptions:()=>ri,loadParticlesOptions:()=>ci,loadSlim:()=>an,mix:()=>z,mouseDownEvent:()=>s,mouseLeaveEvent:()=>n,mouseMoveEvent:()=>r,mouseOutEvent:()=>a,mouseUpEvent:()=>o,paintBase:()=>Xt,paintImage:()=>Yt,parseAlpha:()=>H,randomInRange:()=>M,rangeColorToHsl:()=>Rt,rangeColorToRgb:()=>St,rectBounce:()=>ht,resizeEvent:()=>u,rgbToHsl:()=>Et,safeIntersectionObserver:()=>X,safeMatchMedia:()=>N,safeMutationObserver:()=>Y,setLogger:()=>U,setRandom:()=>x,setRangeValue:()=>S,singleDivModeExecute:()=>at,stringToAlpha:()=>It,stringToRgb:()=>Lt,touchCancelEvent:()=>d,touchEndEvent:()=>l,touchMoveEvent:()=>h,touchStartEvent:()=>c,tsParticles:()=>Ti,visibilityChangeEvent:()=>p});const i="generated",s="pointerdown",o="pointerup",n="pointerleave",a="pointerout",r="pointermove",c="touchstart",l="touchend",h="touchmove",d="touchcancel",u="resize",p="visibilitychange",f="tsParticles - Error";class v{constructor(t,e,i){if(this._updateFromAngle=(t,e)=>{this.x=Math.cos(t)*e,this.y=Math.sin(t)*e},!wt(t)&&t){this.x=t.x,this.y=t.y;const e=t;this.z=e.z?e.z:0}else{if(void 0===t||void 0===e)throw new Error(`${f} Vector3d not initialized correctly`);this.x=t,this.y=e,this.z=i??0}}static get origin(){return v.create(0,0,0)}get angle(){return Math.atan2(this.y,this.x)}set angle(t){this._updateFromAngle(t,this.length)}get length(){return Math.sqrt(this.getLengthSq())}set length(t){this._updateFromAngle(this.angle,t)}static clone(t){return v.create(t.x,t.y,t.z)}static create(t,e,i){return new v(t,e,i)}add(t){return v.create(this.x+t.x,this.y+t.y,this.z+t.z)}addTo(t){this.x+=t.x,this.y+=t.y,this.z+=t.z}copy(){return v.clone(this)}distanceTo(t){return this.sub(t).length}distanceToSq(t){return this.sub(t).getLengthSq()}div(t){return v.create(this.x/t,this.y/t,this.z/t)}divTo(t){this.x/=t,this.y/=t,this.z/=t}getLengthSq(){return this.x**2+this.y**2}mult(t){return v.create(this.x*t,this.y*t,this.z*t)}multTo(t){this.x*=t,this.y*=t,this.z*=t}normalize(){const t=this.length;0!=t&&this.multTo(1/t)}rotate(t){return v.create(this.x*Math.cos(t)-this.y*Math.sin(t),this.x*Math.sin(t)+this.y*Math.cos(t),0)}setTo(t){this.x=t.x,this.y=t.y;const e=t;this.z=e.z?e.z:0}sub(t){return v.create(this.x-t.x,this.y-t.y,this.z-t.z)}subFrom(t){this.x-=t.x,this.y-=t.y,this.z-=t.z}}class y extends v{constructor(t,e){super(t,e,0)}static get origin(){return y.create(0,0)}static clone(t){return y.create(t.x,t.y)}static create(t,e){return new y(t,e)}}let m=Math.random;const g=new Map;function b(t,e){g.get(t)||g.set(t,e)}function w(t){return g.get(t)||(t=>t)}function x(t=Math.random){m=t}function _(){return k(m(),0,1-1e-16)}function k(t,e,i){return Math.min(Math.max(t,e),i)}function z(t,e,i,s){return Math.floor((t*i+e*s)/(i+s))}function M(t){const e=O(t);let i=P(t);return e===i&&(i=0),_()*(e-i)+i}function C(t){return wt(t)?t:M(t)}function P(t){return wt(t)?t:t.min}function O(t){return wt(t)?t:t.max}function S(t,e){if(t===e||void 0===e&&wt(t))return t;const i=P(t),s=O(t);return void 0!==e?{min:Math.min(i,e),max:Math.max(s,e)}:S(i,s)}function D(t,e){const i=t.x-e.x,s=t.y-e.y;return{dx:i,dy:s,distance:Math.sqrt(i**2+s**2)}}function T(t,e){return D(t,e).distance}function R(t,e,i){if(wt(t))return t*Math.PI/180;switch(t){case"top":return.5*-Math.PI;case"top-right":return.25*-Math.PI;case"right":return 0;case"bottom-right":return.25*Math.PI;case"bottom":return.5*Math.PI;case"bottom-left":return.75*Math.PI;case"left":return Math.PI;case"top-left":return.75*-Math.PI;case"inside":return Math.atan2(i.y-e.y,i.x-e.x);case"outside":return Math.atan2(e.y-i.y,e.x-i.x);default:return _()*Math.PI*2}}function E(t){const e=y.origin;return e.length=1,e.angle=t,e}function I(t,e,i,s){return y.create(t.x*(i-s)/(i+s)+2*e.x*s/(i+s),t.y)}function L(t){return t.position&&void 0!==t.position.x&&void 0!==t.position.y?{x:t.position.x*t.size.width/100,y:t.position.y*t.size.height/100}:void 0}function A(t){return{x:(t.position?.x??100*_())*t.size.width/100,y:(t.position?.y??100*_())*t.size.height/100}}function F(t){const e={x:void 0!==t.position?.x?C(t.position.x):void 0,y:void 0!==t.position?.y?C(t.position.y):void 0};return A({size:t.size,position:e})}function B(t){return{x:t.position?.x??_()*t.size.width,y:t.position?.y??_()*t.size.height}}function q(t){const e={x:void 0!==t.position?.x?C(t.position.x):void 0,y:void 0!==t.position?.y?C(t.position.y):void 0};return B({size:t.size,position:e})}function H(t){return t?t.endsWith("%")?parseFloat(t)/100:parseFloat(t):1}const V={debug:console.debug,error:console.error,info:console.info,log:console.log,verbose:console.log,warning:console.warn};function U(t){V.debug=t.debug||V.debug,V.error=t.error||V.error,V.info=t.info||V.info,V.log=t.log||V.log,V.verbose=t.verbose||V.verbose,V.warning=t.warning||V.warning}function W(){return V}function $(t){const e={bounced:!1},{pSide:i,pOtherSide:s,rectSide:o,rectOtherSide:n,velocity:a,factor:r}=t;return s.minn.max||s.maxn.max||(i.max>=o.min&&i.max<=.5*(o.max+o.min)&&a>0||i.min<=o.max&&i.min>.5*(o.max+o.min)&&a<0)&&(e.velocity=a*-r,e.bounced=!0),e}function j(){return"undefined"==typeof window||!window||void 0===window.document||!window.document}function G(){return!j()&&"undefined"!=typeof matchMedia}function N(t){if(G())return matchMedia(t)}function X(t){if(!j()&&"undefined"!=typeof IntersectionObserver)return new IntersectionObserver(t)}function Y(t){if(!j()&&"undefined"!=typeof MutationObserver)return new MutationObserver(t)}function Z(t,e){return t===e||kt(e)&&e.indexOf(t)>-1}async function Q(t,e){try{await document.fonts.load(`${e??"400"} 36px '${t??"Verdana"}'`)}catch{}}function J(t){return Math.floor(_()*t.length)}function K(t,e,i=!0){return t[void 0!==e&&i?e%t.length:J(t)]}function tt(t,e,i,s,o){return et(it(t,s??0),e,i,o)}function et(t,e,i,s){let o=!0;return s&&"bottom"!==s||(o=t.topi.x),!o||s&&"right"!==s||(o=t.lefti.y),o}function it(t,e){return{bottom:t.y+e,left:t.x-e,right:t.x+e,top:t.y-e}}function st(t,...e){for(const i of e){if(null==i)continue;if(!_t(i)){t=i;continue}const e=Array.isArray(i);!e||!_t(t)&&t&&Array.isArray(t)?e||!_t(t)&&t&&!Array.isArray(t)||(t={}):t=[];for(const e in i){if("__proto__"===e)continue;const s=i[e],o=t;o[e]=_t(s)&&Array.isArray(s)?s.map((t=>st(o[e],t))):st(o[e],s)}}return t}function ot(t,e){return!!pt(e,(e=>e.enable&&Z(t,e.mode)))}function nt(t,e,i){dt(e,(e=>{const s=e.mode;e.enable&&Z(t,s)&&at(e,i)}))}function at(t,e){dt(t.selectors,(i=>{e(i,t)}))}function rt(t,e){if(e&&t)return pt(t,(t=>function(t,e){const i=dt(e,(e=>t.matches(e)));return kt(i)?i.some((t=>t)):i}(e,t.selectors)))}function ct(t){return{position:t.getPosition(),radius:t.getRadius(),mass:t.getMass(),velocity:t.velocity,factor:y.create(C(t.options.bounce.horizontal.value),C(t.options.bounce.vertical.value))}}function lt(t,e){const{x:i,y:s}=t.velocity.sub(e.velocity),[o,n]=[t.position,e.position],{dx:a,dy:r}=D(n,o);if(i*a+s*r<0)return;const c=-Math.atan2(r,a),l=t.mass,h=e.mass,d=t.velocity.rotate(c),u=e.velocity.rotate(c),p=I(d,u,l,h),f=I(u,d,l,h),v=p.rotate(-c),y=f.rotate(-c);t.velocity.x=v.x*t.factor.x,t.velocity.y=v.y*t.factor.y,e.velocity.x=y.x*e.factor.x,e.velocity.y=y.y*e.factor.y}function ht(t,e){const i=it(t.getPosition(),t.getRadius()),s=t.options.bounce,o=$({pSide:{min:i.left,max:i.right},pOtherSide:{min:i.top,max:i.bottom},rectSide:{min:e.left,max:e.right},rectOtherSide:{min:e.top,max:e.bottom},velocity:t.velocity.x,factor:C(s.horizontal.value)});o.bounced&&(void 0!==o.velocity&&(t.velocity.x=o.velocity),void 0!==o.position&&(t.position.x=o.position));const n=$({pSide:{min:i.top,max:i.bottom},pOtherSide:{min:i.left,max:i.right},rectSide:{min:e.top,max:e.bottom},rectOtherSide:{min:e.left,max:e.right},velocity:t.velocity.y,factor:C(s.vertical.value)});n.bounced&&(void 0!==n.velocity&&(t.velocity.y=n.velocity),void 0!==n.position&&(t.position.y=n.position))}function dt(t,e){return kt(t)?t.map(((t,i)=>e(t,i))):e(t,0)}function ut(t,e,i){return kt(t)?K(t,e,i):t}function pt(t,e){return kt(t)?t.find(((t,i)=>e(t,i))):e(t,0)?t:void 0}function ft(t,e){const i=t.value,s=t.animation,o={delayTime:1e3*C(s.delay),enable:s.enable,value:C(t.value)*e,max:O(i)*e,min:P(i)*e,loops:0,maxLoops:C(s.count),time:0};if(s.enable){switch(o.decay=1-C(s.decay),s.mode){case"increase":o.status="increasing";break;case"decrease":o.status="decreasing";break;case"random":o.status=_()>=.5?"increasing":"decreasing"}const t="auto"===s.mode;switch(s.startValue){case"min":o.value=o.min,t&&(o.status="increasing");break;case"max":o.value=o.max,t&&(o.status="decreasing");break;default:o.value=M(o),t&&(o.status=_()>=.5?"increasing":"decreasing")}}return o.initialValue=o.value,o}function vt(t,e){if(!("percent"===t.mode)){const{mode:e,...i}=t;return i}return"x"in t?{x:t.x/100*e.width,y:t.y/100*e.height}:{width:t.width/100*e.width,height:t.height/100*e.height}}function yt(t,e){return vt(t,e)}function mt(t,e){return vt(t,e)}function gt(t){return"boolean"==typeof t}function bt(t){return"string"==typeof t}function wt(t){return"number"==typeof t}function xt(t){return"function"==typeof t}function _t(t){return"object"==typeof t&&null!==t}function kt(t){return Array.isArray(t)}const zt="random",Mt="mid",Ct=new Map;function Pt(t){Ct.set(t.key,t)}function Ot(t){for(const[,e]of Ct)if(t.startsWith(e.stringPrefix))return e.parseString(t);const e=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i,((t,e,i,s,o)=>e+e+i+i+s+s+(void 0!==o?o+o:""))),i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(e);return i?{a:void 0!==i[4]?parseInt(i[4],16)/255:1,b:parseInt(i[3],16),g:parseInt(i[2],16),r:parseInt(i[1],16)}:void 0}function St(t,e,i=!0){if(!t)return;const s=bt(t)?{value:t}:t;if(bt(s.value))return Dt(s.value,e,i);if(kt(s.value))return St({value:K(s.value,e,i)});for(const[,t]of Ct){const e=t.handleRangeColor(s);if(e)return e}}function Dt(t,e,i=!0){if(!t)return;const s=bt(t)?{value:t}:t;if(bt(s.value))return s.value===zt?Bt():Lt(s.value);if(kt(s.value))return Dt({value:K(s.value,e,i)});for(const[,t]of Ct){const e=t.handleColor(s);if(e)return e}}function Tt(t,e,i=!0){const s=Dt(t,e,i);return s?Et(s):void 0}function Rt(t,e,i=!0){const s=St(t,e,i);return s?Et(s):void 0}function Et(t){const e=t.r/255,i=t.g/255,s=t.b/255,o=Math.max(e,i,s),n=Math.min(e,i,s),a={h:0,l:.5*(o+n),s:0};return o!==n&&(a.s=a.l<.5?(o-n)/(o+n):(o-n)/(2-o-n),a.h=e===o?(i-s)/(o-n):a.h=i===o?2+(s-e)/(o-n):4+(e-i)/(o-n)),a.l*=100,a.s*=100,a.h*=60,a.h<0&&(a.h+=360),a.h>=360&&(a.h-=360),a}function It(t){return Ot(t)?.a}function Lt(t){return Ot(t)}function At(t){const e=(t.h%360+360)%360,i=Math.max(0,Math.min(100,t.s)),s=e/360,o=i/100,n=Math.max(0,Math.min(100,t.l))/100;if(0===i){const t=Math.round(255*n);return{r:t,g:t,b:t}}const a=(t,e,i)=>(i<0&&(i+=1),i>1&&(i-=1),6*i<1?t+6*(e-t)*i:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t),r=n<.5?n*(1+o):n+o-n*o,c=2*n-r,l=Math.min(255,255*a(c,r,s+1/3)),h=Math.min(255,255*a(c,r,s)),d=Math.min(255,255*a(c,r,s-1/3));return{r:Math.round(l),g:Math.round(h),b:Math.round(d)}}function Ft(t){const e=At(t);return{a:t.a,b:e.b,g:e.g,r:e.r}}function Bt(t){const e=t??0;return{b:Math.floor(M(S(e,256))),g:Math.floor(M(S(e,256))),r:Math.floor(M(S(e,256)))}}function qt(t,e){return`rgba(${t.r}, ${t.g}, ${t.b}, ${e??1})`}function Ht(t,e){return`hsla(${t.h}, ${t.s}%, ${t.l}%, ${e??1})`}function Vt(t,e,i,s){let o=t,n=e;return void 0===o.r&&(o=At(t)),void 0===n.r&&(n=At(e)),{b:z(o.b,n.b,i,s),g:z(o.g,n.g,i,s),r:z(o.r,n.r,i,s)}}function Ut(t,e,i){if(i===zt)return Bt();if(i!==Mt)return i;{const i=t.getFillColor()??t.getStrokeColor(),s=e?.getFillColor()??e?.getStrokeColor();if(i&&s&&e)return Vt(i,s,t.getRadius(),e.getRadius());{const t=i??s;if(t)return At(t)}}}function Wt(t,e,i){const s=bt(t)?t:t.value;return s===zt?i?St({value:s}):e?zt:Mt:s===Mt?Mt:St({value:s})}function $t(t){return void 0!==t?{h:t.h.value,s:t.s.value,l:t.l.value}:void 0}function jt(t,e,i){const s={h:{enable:!1,value:t.h},s:{enable:!1,value:t.s},l:{enable:!1,value:t.l}};return e&&(Gt(s.h,e.h,i),Gt(s.s,e.s,i),Gt(s.l,e.l,i)),s}function Gt(t,e,i){t.enable=e.enable,t.enable?(t.velocity=C(e.speed)/100*i,t.decay=1-C(e.decay),t.status="increasing",t.loops=0,t.maxLoops=C(e.count),t.time=0,t.delayTime=1e3*C(e.delay),e.sync||(t.velocity*=_(),t.value*=_()),t.initialValue=t.value):t.velocity=0}function Nt(t,e,i){t.beginPath(),t.moveTo(e.x,e.y),t.lineTo(i.x,i.y),t.closePath()}function Xt(t,e,i){t.fillStyle=i??"rgba(0,0,0,0)",t.fillRect(0,0,e.width,e.height)}function Yt(t,e,i,s){i&&(t.globalAlpha=s,t.drawImage(i,0,0,e.width,e.height),t.globalAlpha=1)}function Zt(t,e){t.clearRect(0,0,e.width,e.height)}function Qt(t){const{container:e,context:i,particle:s,delta:o,colorStyles:n,backgroundMask:a,composite:r,radius:c,opacity:l,shadow:h,transform:d}=t,u=s.getPosition(),p=s.rotation+(s.pathRotation?s.velocity.angle:0),f=Math.sin(p),v=Math.cos(p),y={a:v*(d.a??1),b:f*(d.b??1),c:-f*(d.c??1),d:v*(d.d??1)};i.setTransform(y.a,y.b,y.c,y.d,u.x,u.y),a&&(i.globalCompositeOperation=r);const m=s.shadowColor;h.enable&&m&&(i.shadowBlur=h.blur,i.shadowColor=qt(m),i.shadowOffsetX=h.offset.x,i.shadowOffsetY=h.offset.y),n.fill&&(i.fillStyle=n.fill);const g=s.strokeWidth??0;i.lineWidth=g,n.stroke&&(i.strokeStyle=n.stroke);const b={container:e,context:i,particle:s,radius:c,opacity:l,delta:o,transformData:y};i.beginPath(),Kt(b),s.shapeClose&&i.closePath(),g>0&&i.stroke(),s.shapeFill&&i.fill(),te(b),Jt(b),i.globalCompositeOperation="source-over",i.setTransform(1,0,0,1,0,0)}function Jt(t){const{container:e,context:i,particle:s,radius:o,opacity:n,delta:a,transformData:r}=t;if(!s.effect)return;const c=e.effectDrawers.get(s.effect);c&&c.draw({context:i,particle:s,radius:o,opacity:n,delta:a,pixelRatio:e.retina.pixelRatio,transformData:{...r}})}function Kt(t){const{container:e,context:i,particle:s,radius:o,opacity:n,delta:a,transformData:r}=t;if(!s.shape)return;const c=e.shapeDrawers.get(s.shape);c&&c.draw({context:i,particle:s,radius:o,opacity:n,delta:a,pixelRatio:e.retina.pixelRatio,transformData:{...r}})}function te(t){const{container:e,context:i,particle:s,radius:o,opacity:n,delta:a,transformData:r}=t;if(!s.shape)return;const c=e.shapeDrawers.get(s.shape);c&&c.afterDraw&&c.afterDraw({context:i,particle:s,radius:o,opacity:n,delta:a,pixelRatio:e.retina.pixelRatio,transformData:{...r}})}function ee(t,e,i){e.draw&&e.draw(t,i)}function ie(t,e,i,s){e.drawParticle&&e.drawParticle(t,i,s)}function se(t,e,i){return{h:t.h,s:t.s,l:t.l+("darken"===e?-1:1)*i}}function oe(t,e,i){const s=e[i];void 0!==s&&(t[i]=(t[i]??1)*s)}class ne{constructor(t){this.container=t,this._applyPostDrawUpdaters=t=>{for(const e of this._postDrawUpdaters)e.afterDraw&&e.afterDraw(t)},this._applyPreDrawUpdaters=(t,e,i,s,o,n)=>{for(const a of this._preDrawUpdaters){if(a.getColorStyles){const{fill:n,stroke:r}=a.getColorStyles(e,t,i,s);n&&(o.fill=n),r&&(o.stroke=r)}if(a.getTransformValues){const t=a.getTransformValues(e);for(const e in t)oe(n,t,e)}a.beforeDraw&&a.beforeDraw(e)}},this._applyResizePlugins=()=>{for(const t of this._resizePlugins)t.resize&&t.resize()},this._getPluginParticleColors=t=>{let e,i;for(const s of this._colorPlugins)if(!e&&s.particleFillColor&&(e=Rt(s.particleFillColor(t))),!i&&s.particleStrokeColor&&(i=Rt(s.particleStrokeColor(t))),e&&i)break;return[e,i]},this._initCover=()=>{const t=this.container.actualOptions.backgroundMask.cover,e=St(t.color);if(e){const i={...e,a:t.opacity};this._coverColorStyle=qt(i,i.a)}},this._initStyle=()=>{const t=this.element,e=this.container.actualOptions;if(t){this._fullScreen?(this._originalStyle=st({},t.style),this._setFullScreenStyle()):this._resetOriginalStyle();for(const i in e.style){if(!i||!e.style)continue;const s=e.style[i];s&&t.style.setProperty(i,s,"important")}}},this._initTrail=async()=>{const t=this.container.actualOptions,e=t.particles.move.trail,i=e.fill;if(e.enable)if(i.color){const e=St(i.color);if(!e)return;const s=t.particles.move.trail;this._trailFill={color:{...e},opacity:1/s.length}}else await new Promise(((t,s)=>{if(!i.image)return;const o=document.createElement("img");o.addEventListener("load",(()=>{this._trailFill={image:o,opacity:1/e.length},t()})),o.addEventListener("error",(t=>{s(t.error)})),o.src=i.image}))},this._paintBase=t=>{this.draw((e=>Xt(e,this.size,t)))},this._paintImage=(t,e)=>{this.draw((i=>Yt(i,this.size,t,e)))},this._repairStyle=()=>{const t=this.element;t&&(this._safeMutationObserver((t=>t.disconnect())),this._initStyle(),this.initBackground(),this._safeMutationObserver((e=>e.observe(t,{attributes:!0}))))},this._resetOriginalStyle=()=>{const t=this.element,e=this._originalStyle;if(!t||!e)return;const i=t.style;i.position=e.position,i.zIndex=e.zIndex,i.top=e.top,i.left=e.left,i.width=e.width,i.height=e.height},this._safeMutationObserver=t=>{this._mutationObserver&&t(this._mutationObserver)},this._setFullScreenStyle=()=>{const t=this.element;if(!t)return;const e="important",i=t.style;i.setProperty("position","fixed",e),i.setProperty("z-index",this.container.actualOptions.fullScreen.zIndex.toString(10),e),i.setProperty("top","0",e),i.setProperty("left","0",e),i.setProperty("width","100%",e),i.setProperty("height","100%",e)},this.size={height:0,width:0},this._context=null,this._generated=!1,this._preDrawUpdaters=[],this._postDrawUpdaters=[],this._resizePlugins=[],this._colorPlugins=[]}get _fullScreen(){return this.container.actualOptions.fullScreen.enable}clear(){const t=this.container.actualOptions,e=t.particles.move.trail,i=this._trailFill;t.backgroundMask.enable?this.paint():e.enable&&e.length>0&&i?i.color?this._paintBase(qt(i.color,i.opacity)):i.image&&this._paintImage(i.image,i.opacity):t.clear&&this.draw((t=>{Zt(t,this.size)}))}destroy(){if(this.stop(),this._generated){const t=this.element;t&&t.remove()}else this._resetOriginalStyle();this._preDrawUpdaters=[],this._postDrawUpdaters=[],this._resizePlugins=[],this._colorPlugins=[]}draw(t){const e=this._context;if(e)return t(e)}drawParticle(t,e){if(t.spawning||t.destroyed)return;const i=t.getRadius();if(i<=0)return;const s=t.getFillColor(),o=t.getStrokeColor()??s;let[n,a]=this._getPluginParticleColors(t);n||(n=s),a||(a=o),(n||a)&&this.draw((s=>{const o=this.container,r=o.actualOptions,c=t.options.zIndex,l=(1-t.zIndexFactor)**c.opacityRate,h=t.bubble.opacity??t.opacity?.value??1,d=h*l,u=(t.strokeOpacity??h)*l,p={},f={fill:n?Ht(n,d):void 0};f.stroke=a?Ht(a,u):f.fill,this._applyPreDrawUpdaters(s,t,i,d,f,p),Qt({container:o,context:s,particle:t,delta:e,colorStyles:f,backgroundMask:r.backgroundMask.enable,composite:r.backgroundMask.composite,radius:i*(1-t.zIndexFactor)**c.sizeRate,opacity:d,shadow:t.options.shadow,transform:p}),this._applyPostDrawUpdaters(t)}))}drawParticlePlugin(t,e,i){this.draw((s=>ie(s,t,e,i)))}drawPlugin(t,e){this.draw((i=>ee(i,t,e)))}async init(){this._safeMutationObserver((t=>t.disconnect())),this._mutationObserver=Y((t=>{for(const e of t)"attributes"===e.type&&"style"===e.attributeName&&this._repairStyle()})),this.resize(),this._initStyle(),this._initCover();try{await this._initTrail()}catch(t){W().error(t)}this.initBackground(),this._safeMutationObserver((t=>{this.element&&t.observe(this.element,{attributes:!0})})),this.initUpdaters(),this.initPlugins(),this.paint()}initBackground(){const t=this.container.actualOptions.background,e=this.element;if(!e)return;const i=e.style;if(i){if(t.color){const e=St(t.color);i.backgroundColor=e?qt(e,t.opacity):""}else i.backgroundColor="";i.backgroundImage=t.image||"",i.backgroundPosition=t.position||"",i.backgroundRepeat=t.repeat||"",i.backgroundSize=t.size||""}}initPlugins(){this._resizePlugins=[];for(const[,t]of this.container.plugins)t.resize&&this._resizePlugins.push(t),(t.particleFillColor||t.particleStrokeColor)&&this._colorPlugins.push(t)}initUpdaters(){this._preDrawUpdaters=[],this._postDrawUpdaters=[];for(const t of this.container.particles.updaters)t.afterDraw&&this._postDrawUpdaters.push(t),(t.getColorStyles||t.getTransformValues||t.beforeDraw)&&this._preDrawUpdaters.push(t)}loadCanvas(t){this._generated&&this.element&&this.element.remove(),this._generated=t.dataset&&i in t.dataset?"true"===t.dataset[i]:this._generated,this.element=t,this.element.ariaHidden="true",this._originalStyle=st({},this.element.style),this.size.height=t.offsetHeight,this.size.width=t.offsetWidth,this._context=this.element.getContext("2d"),this._safeMutationObserver((t=>{this.element&&t.observe(this.element,{attributes:!0})})),this.container.retina.init(),this.initBackground()}paint(){const t=this.container.actualOptions;this.draw((e=>{t.backgroundMask.enable&&t.backgroundMask.cover?(Zt(e,this.size),this._paintBase(this._coverColorStyle)):this._paintBase()}))}resize(){if(!this.element)return!1;const t=this.container,e=t.retina.pixelRatio,i=t.canvas.size,s=this.element.offsetWidth*e,o=this.element.offsetHeight*e;if(o===i.height&&s===i.width&&o===this.element.height&&s===this.element.width)return!1;const n={...i};return this.element.width=i.width=this.element.offsetWidth*e,this.element.height=i.height=this.element.offsetHeight*e,this.container.started&&t.particles.setResizeFactor({width:i.width/n.width,height:i.height/n.height}),!0}stop(){this._safeMutationObserver((t=>t.disconnect())),this._mutationObserver=void 0,this.draw((t=>Zt(t,this.size)))}async windowResize(){if(!this.element||!this.resize())return;const t=this.container,e=t.updateActualOptions();t.particles.setDensity(),this._applyResizePlugins(),e&&await t.refresh()}}function ae(t,e,i,s,o){if(s){let s={passive:!0};gt(o)?s.capture=o:void 0!==o&&(s=o),t.addEventListener(e,i,s)}else{const s=o;t.removeEventListener(e,i,s)}}class re{constructor(t){this.container=t,this._doMouseTouchClick=t=>{const e=this.container,i=e.actualOptions;if(this._canPush){const t=e.interactivity.mouse,s=t.position;if(!s)return;t.clickPosition={...s},t.clickTime=(new Date).getTime();dt(i.interactivity.events.onClick.mode,(t=>this.container.handleClickMode(t)))}"touchend"===t.type&&setTimeout((()=>this._mouseTouchFinish()),500)},this._handleThemeChange=t=>{const e=t,i=this.container,s=i.options,o=s.defaultThemes,n=e.matches?o.dark:o.light,a=s.themes.find((t=>t.name===n));a&&a.default.auto&&i.loadTheme(n)},this._handleVisibilityChange=()=>{const t=this.container,e=t.actualOptions;this._mouseTouchFinish(),e.pauseOnBlur&&(document&&document.hidden?(t.pageHidden=!0,t.pause()):(t.pageHidden=!1,t.getAnimationStatus()?t.play(!0):t.draw(!0)))},this._handleWindowResize=async()=>{this._resizeTimeout&&(clearTimeout(this._resizeTimeout),delete this._resizeTimeout),this._resizeTimeout=setTimeout((async()=>{const t=this.container.canvas;t&&await t.windowResize()}),1e3*this.container.actualOptions.interactivity.events.resize.delay)},this._manageInteractivityListeners=(t,e)=>{const i=this._handlers,n=this.container,a=n.actualOptions,u=n.interactivity.element;if(!u)return;const p=u,f=n.canvas.element;f&&(f.style.pointerEvents=p===f?"initial":"none"),(a.interactivity.events.onHover.enable||a.interactivity.events.onClick.enable)&&(ae(u,r,i.mouseMove,e),ae(u,c,i.touchStart,e),ae(u,h,i.touchMove,e),a.interactivity.events.onClick.enable?(ae(u,l,i.touchEndClick,e),ae(u,o,i.mouseUp,e),ae(u,s,i.mouseDown,e)):ae(u,l,i.touchEnd,e),ae(u,t,i.mouseLeave,e),ae(u,d,i.touchCancel,e))},this._manageListeners=t=>{const e=this._handlers,i=this.container,s=i.actualOptions.interactivity.detectsOn,o=i.canvas.element;let r=n;"window"===s?(i.interactivity.element=window,r=a):i.interactivity.element="parent"===s&&o?o.parentElement??o.parentNode:o,this._manageMediaMatch(t),this._manageResize(t),this._manageInteractivityListeners(r,t),document&&ae(document,p,e.visibilityChange,t,!1)},this._manageMediaMatch=t=>{const e=this._handlers,i=N("(prefers-color-scheme: dark)");i&&(void 0===i.addEventListener?void 0!==i.addListener&&(t?i.addListener(e.oldThemeChange):i.removeListener(e.oldThemeChange)):ae(i,"change",e.themeChange,t))},this._manageResize=t=>{const e=this._handlers,i=this.container;if(!i.actualOptions.interactivity.events.resize)return;if("undefined"==typeof ResizeObserver)return void ae(window,u,e.resize,t);const s=i.canvas.element;this._resizeObserver&&!t?(s&&this._resizeObserver.unobserve(s),this._resizeObserver.disconnect(),delete this._resizeObserver):!this._resizeObserver&&t&&s&&(this._resizeObserver=new ResizeObserver((async t=>{t.find((t=>t.target===s))&&await this._handleWindowResize()})),this._resizeObserver.observe(s))},this._mouseDown=()=>{const{interactivity:t}=this.container;if(!t)return;const{mouse:e}=t;e.clicking=!0,e.downPosition=e.position},this._mouseTouchClick=t=>{const e=this.container,i=e.actualOptions,{mouse:s}=e.interactivity;s.inside=!0;let o=!1;const n=s.position;if(n&&i.interactivity.events.onClick.enable){for(const[,t]of e.plugins)if(t.clickPositionValid&&(o=t.clickPositionValid(n),o))break;o||this._doMouseTouchClick(t),s.clicking=!1}},this._mouseTouchFinish=()=>{const t=this.container.interactivity;if(!t)return;const e=t.mouse;delete e.position,delete e.clickPosition,delete e.downPosition,t.status=n,e.inside=!1,e.clicking=!1},this._mouseTouchMove=t=>{const e=this.container,i=e.actualOptions,s=e.interactivity,o=e.canvas.element;if(!s||!s.element)return;let n;if(s.mouse.inside=!0,t.type.startsWith("pointer")){this._canPush=!0;const e=t;if(s.element===window){if(o){const t=o.getBoundingClientRect();n={x:e.clientX-t.left,y:e.clientY-t.top}}}else if("parent"===i.interactivity.detectsOn){const t=e.target,i=e.currentTarget;if(t&&i&&o){const s=t.getBoundingClientRect(),a=i.getBoundingClientRect(),r=o.getBoundingClientRect();n={x:e.offsetX+2*s.left-(a.left+r.left),y:e.offsetY+2*s.top-(a.top+r.top)}}else n={x:e.offsetX??e.clientX,y:e.offsetY??e.clientY}}else e.target===o&&(n={x:e.offsetX??e.clientX,y:e.offsetY??e.clientY})}else if(this._canPush="touchmove"!==t.type,o){const e=t,i=e.touches[e.touches.length-1],s=o.getBoundingClientRect();n={x:i.clientX-(s.left??0),y:i.clientY-(s.top??0)}}const a=e.retina.pixelRatio;n&&(n.x*=a,n.y*=a),s.mouse.position=n,s.status=r},this._touchEnd=t=>{const e=t,i=Array.from(e.changedTouches);for(const t of i)this._touches.delete(t.identifier);this._mouseTouchFinish()},this._touchEndClick=t=>{const e=t,i=Array.from(e.changedTouches);for(const t of i)this._touches.delete(t.identifier);this._mouseTouchClick(t)},this._touchStart=t=>{const e=t,i=Array.from(e.changedTouches);for(const t of i)this._touches.set(t.identifier,performance.now());this._mouseTouchMove(t)},this._canPush=!0,this._touches=new Map,this._handlers={mouseDown:()=>this._mouseDown(),mouseLeave:()=>this._mouseTouchFinish(),mouseMove:t=>this._mouseTouchMove(t),mouseUp:t=>this._mouseTouchClick(t),touchStart:t=>this._touchStart(t),touchMove:t=>this._mouseTouchMove(t),touchEnd:t=>this._touchEnd(t),touchCancel:t=>this._touchEnd(t),touchEndClick:t=>this._touchEndClick(t),visibilityChange:()=>this._handleVisibilityChange(),themeChange:t=>this._handleThemeChange(t),oldThemeChange:t=>this._handleThemeChange(t),resize:()=>{this._handleWindowResize()}}}addListeners(){this._manageListeners(!0)}removeListeners(){this._manageListeners(!1)}}class ce{constructor(){this.value=""}static create(t,e){const i=new ce;return i.load(t),void 0!==e&&(bt(e)||kt(e)?i.load({value:e}):i.load(e)),i}load(t){void 0!==t?.value&&(this.value=t.value)}}class le{constructor(){this.color=new ce,this.color.value="",this.image="",this.position="",this.repeat="",this.size="",this.opacity=1}load(t){t&&(void 0!==t.color&&(this.color=ce.create(this.color,t.color)),void 0!==t.image&&(this.image=t.image),void 0!==t.position&&(this.position=t.position),void 0!==t.repeat&&(this.repeat=t.repeat),void 0!==t.size&&(this.size=t.size),void 0!==t.opacity&&(this.opacity=t.opacity))}}class he{constructor(){this.color=new ce,this.color.value="#fff",this.opacity=1}load(t){t&&(void 0!==t.color&&(this.color=ce.create(this.color,t.color)),void 0!==t.opacity&&(this.opacity=t.opacity))}}class de{constructor(){this.composite="destination-out",this.cover=new he,this.enable=!1}load(t){if(t){if(void 0!==t.composite&&(this.composite=t.composite),void 0!==t.cover){const e=t.cover,i=bt(t.cover)?{color:t.cover}:t.cover;this.cover.load(void 0!==e.color?e:{color:i})}void 0!==t.enable&&(this.enable=t.enable)}}}class ue{constructor(){this.enable=!0,this.zIndex=0}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.zIndex&&(this.zIndex=t.zIndex))}}class pe{constructor(){this.enable=!1,this.mode=[]}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.mode&&(this.mode=t.mode))}}class fe{constructor(){this.selectors=[],this.enable=!1,this.mode=[],this.type="circle"}load(t){t&&(void 0!==t.selectors&&(this.selectors=t.selectors),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.mode&&(this.mode=t.mode),void 0!==t.type&&(this.type=t.type))}}class ve{constructor(){this.enable=!1,this.force=2,this.smooth=10}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.force&&(this.force=t.force),void 0!==t.smooth&&(this.smooth=t.smooth))}}class ye{constructor(){this.enable=!1,this.mode=[],this.parallax=new ve}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.mode&&(this.mode=t.mode),this.parallax.load(t.parallax))}}class me{constructor(){this.delay=.5,this.enable=!0}load(t){void 0!==t&&(void 0!==t.delay&&(this.delay=t.delay),void 0!==t.enable&&(this.enable=t.enable))}}class ge{constructor(){this.onClick=new pe,this.onDiv=new fe,this.onHover=new ye,this.resize=new me}load(t){if(!t)return;this.onClick.load(t.onClick);const e=t.onDiv;void 0!==e&&(this.onDiv=dt(e,(t=>{const e=new fe;return e.load(t),e}))),this.onHover.load(t.onHover),this.resize.load(t.resize)}}class be{constructor(t,e){this._engine=t,this._container=e}load(t){if(!t)return;if(!this._container)return;const e=this._engine.interactors.get(this._container);if(e)for(const i of e)i.loadModeOptions&&i.loadModeOptions(this,t)}}class we{constructor(t,e){this.detectsOn="window",this.events=new ge,this.modes=new be(t,e)}load(t){if(!t)return;const e=t.detectsOn;void 0!==e&&(this.detectsOn=e),this.events.load(t.events),this.modes.load(t.modes)}}class xe{load(t){t&&(t.position&&(this.position={x:t.position.x??50,y:t.position.y??50,mode:t.position.mode??"percent"}),t.options&&(this.options=st({},t.options)))}}class _e{constructor(){this.maxWidth=1/0,this.options={},this.mode="canvas"}load(t){t&&(void 0!==t.maxWidth&&(this.maxWidth=t.maxWidth),void 0!==t.mode&&("screen"===t.mode?this.mode="screen":this.mode="canvas"),void 0!==t.options&&(this.options=st({},t.options)))}}class ke{constructor(){this.auto=!1,this.mode="any",this.value=!1}load(t){t&&(void 0!==t.auto&&(this.auto=t.auto),void 0!==t.mode&&(this.mode=t.mode),void 0!==t.value&&(this.value=t.value))}}class ze{constructor(){this.name="",this.default=new ke}load(t){t&&(void 0!==t.name&&(this.name=t.name),this.default.load(t.default),void 0!==t.options&&(this.options=st({},t.options)))}}class Me{constructor(){this.count=0,this.enable=!1,this.speed=1,this.decay=0,this.delay=0,this.sync=!1}load(t){t&&(void 0!==t.count&&(this.count=S(t.count)),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.speed&&(this.speed=S(t.speed)),void 0!==t.decay&&(this.decay=S(t.decay)),void 0!==t.delay&&(this.delay=S(t.delay)),void 0!==t.sync&&(this.sync=t.sync))}}class Ce extends Me{constructor(){super(),this.mode="auto",this.startValue="random"}load(t){super.load(t),t&&(void 0!==t.mode&&(this.mode=t.mode),void 0!==t.startValue&&(this.startValue=t.startValue))}}class Pe extends Me{constructor(){super(),this.offset=0,this.sync=!0}load(t){super.load(t),t&&void 0!==t.offset&&(this.offset=S(t.offset))}}class Oe{constructor(){this.h=new Pe,this.s=new Pe,this.l=new Pe}load(t){t&&(this.h.load(t.h),this.s.load(t.s),this.l.load(t.l))}}class Se extends ce{constructor(){super(),this.animation=new Oe}static create(t,e){const i=new Se;return i.load(t),void 0!==e&&(bt(e)||kt(e)?i.load({value:e}):i.load(e)),i}load(t){if(super.load(t),!t)return;const e=t.animation;void 0!==e&&(void 0!==e.enable?this.animation.h.load(e):this.animation.load(t.animation))}}class De{constructor(){this.speed=2}load(t){t&&void 0!==t.speed&&(this.speed=t.speed)}}class Te{constructor(){this.enable=!0,this.retries=0}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.retries&&(this.retries=t.retries))}}class Re{constructor(){this.value=0}load(t){t&&void 0!==t.value&&(this.value=S(t.value))}}class Ee extends Re{constructor(){super(),this.animation=new Me}load(t){if(super.load(t),!t)return;const e=t.animation;void 0!==e&&this.animation.load(e)}}class Ie extends Ee{constructor(){super(),this.animation=new Ce}load(t){super.load(t)}}class Le extends Re{constructor(){super(),this.value=1}}class Ae{constructor(){this.horizontal=new Le,this.vertical=new Le}load(t){t&&(this.horizontal.load(t.horizontal),this.vertical.load(t.vertical))}}class Fe{constructor(){this.absorb=new De,this.bounce=new Ae,this.enable=!1,this.maxSpeed=50,this.mode="bounce",this.overlap=new Te}load(t){t&&(this.absorb.load(t.absorb),this.bounce.load(t.bounce),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.maxSpeed&&(this.maxSpeed=S(t.maxSpeed)),void 0!==t.mode&&(this.mode=t.mode),this.overlap.load(t.overlap))}}class Be{constructor(){this.close=!0,this.fill=!0,this.options={},this.type=[]}load(t){if(!t)return;const e=t.options;if(void 0!==e)for(const t in e){const i=e[t];i&&(this.options[t]=st(this.options[t]??{},i))}void 0!==t.close&&(this.close=t.close),void 0!==t.fill&&(this.fill=t.fill),void 0!==t.type&&(this.type=t.type)}}class qe{constructor(){this.offset=0,this.value=90}load(t){t&&(void 0!==t.offset&&(this.offset=S(t.offset)),void 0!==t.value&&(this.value=S(t.value)))}}class He{constructor(){this.distance=200,this.enable=!1,this.rotate={x:3e3,y:3e3}}load(t){if(t&&(void 0!==t.distance&&(this.distance=S(t.distance)),void 0!==t.enable&&(this.enable=t.enable),t.rotate)){const e=t.rotate.x;void 0!==e&&(this.rotate.x=e);const i=t.rotate.y;void 0!==i&&(this.rotate.y=i)}}}class Ve{constructor(){this.x=50,this.y=50,this.mode="percent",this.radius=0}load(t){t&&(void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.mode&&(this.mode=t.mode),void 0!==t.radius&&(this.radius=t.radius))}}class Ue{constructor(){this.acceleration=9.81,this.enable=!1,this.inverse=!1,this.maxSpeed=50}load(t){t&&(void 0!==t.acceleration&&(this.acceleration=S(t.acceleration)),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.inverse&&(this.inverse=t.inverse),void 0!==t.maxSpeed&&(this.maxSpeed=S(t.maxSpeed)))}}class We{constructor(){this.clamp=!0,this.delay=new Re,this.enable=!1,this.options={}}load(t){t&&(void 0!==t.clamp&&(this.clamp=t.clamp),this.delay.load(t.delay),void 0!==t.enable&&(this.enable=t.enable),this.generator=t.generator,t.options&&(this.options=st(this.options,t.options)))}}class $e{load(t){t&&(void 0!==t.color&&(this.color=ce.create(this.color,t.color)),void 0!==t.image&&(this.image=t.image))}}class je{constructor(){this.enable=!1,this.length=10,this.fill=new $e}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.fill&&this.fill.load(t.fill),void 0!==t.length&&(this.length=t.length))}}class Ge{constructor(){this.default="out"}load(t){t&&(void 0!==t.default&&(this.default=t.default),this.bottom=t.bottom??t.default,this.left=t.left??t.default,this.right=t.right??t.default,this.top=t.top??t.default)}}class Ne{constructor(){this.acceleration=0,this.enable=!1}load(t){t&&(void 0!==t.acceleration&&(this.acceleration=S(t.acceleration)),void 0!==t.enable&&(this.enable=t.enable),t.position&&(this.position=st({},t.position)))}}class Xe{constructor(){this.angle=new qe,this.attract=new He,this.center=new Ve,this.decay=0,this.distance={},this.direction="none",this.drift=0,this.enable=!1,this.gravity=new Ue,this.path=new We,this.outModes=new Ge,this.random=!1,this.size=!1,this.speed=2,this.spin=new Ne,this.straight=!1,this.trail=new je,this.vibrate=!1,this.warp=!1}load(t){if(!t)return;this.angle.load(wt(t.angle)?{value:t.angle}:t.angle),this.attract.load(t.attract),this.center.load(t.center),void 0!==t.decay&&(this.decay=S(t.decay)),void 0!==t.direction&&(this.direction=t.direction),void 0!==t.distance&&(this.distance=wt(t.distance)?{horizontal:t.distance,vertical:t.distance}:{...t.distance}),void 0!==t.drift&&(this.drift=S(t.drift)),void 0!==t.enable&&(this.enable=t.enable),this.gravity.load(t.gravity);const e=t.outModes;void 0!==e&&(_t(e)?this.outModes.load(e):this.outModes.load({default:e})),this.path.load(t.path),void 0!==t.random&&(this.random=t.random),void 0!==t.size&&(this.size=t.size),void 0!==t.speed&&(this.speed=S(t.speed)),this.spin.load(t.spin),void 0!==t.straight&&(this.straight=t.straight),this.trail.load(t.trail),void 0!==t.vibrate&&(this.vibrate=t.vibrate),void 0!==t.warp&&(this.warp=t.warp)}}class Ye extends Ce{constructor(){super(),this.destroy="none",this.speed=2}load(t){super.load(t),t&&void 0!==t.destroy&&(this.destroy=t.destroy)}}class Ze extends Ie{constructor(){super(),this.animation=new Ye,this.value=1}load(t){if(!t)return;super.load(t);const e=t.animation;void 0!==e&&this.animation.load(e)}}class Qe{constructor(){this.enable=!1,this.width=1920,this.height=1080}load(t){if(!t)return;void 0!==t.enable&&(this.enable=t.enable);const e=t.width;void 0!==e&&(this.width=e);const i=t.height;void 0!==i&&(this.height=i)}}class Je{constructor(){this.mode="delete",this.value=0}load(t){t&&(void 0!==t.mode&&(this.mode=t.mode),void 0!==t.value&&(this.value=t.value))}}class Ke{constructor(){this.density=new Qe,this.limit=new Je,this.value=0}load(t){t&&(this.density.load(t.density),this.limit.load(t.limit),void 0!==t.value&&(this.value=t.value))}}class ti{constructor(){this.blur=0,this.color=new ce,this.enable=!1,this.offset={x:0,y:0},this.color.value="#000"}load(t){t&&(void 0!==t.blur&&(this.blur=t.blur),this.color=ce.create(this.color,t.color),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.offset&&(void 0!==t.offset.x&&(this.offset.x=t.offset.x),void 0!==t.offset.y&&(this.offset.y=t.offset.y)))}}class ei{constructor(){this.close=!0,this.fill=!0,this.options={},this.type="circle"}load(t){if(!t)return;const e=t.options;if(void 0!==e)for(const t in e){const i=e[t];i&&(this.options[t]=st(this.options[t]??{},i))}void 0!==t.close&&(this.close=t.close),void 0!==t.fill&&(this.fill=t.fill),void 0!==t.type&&(this.type=t.type)}}class ii extends Ce{constructor(){super(),this.destroy="none",this.speed=5}load(t){super.load(t),t&&void 0!==t.destroy&&(this.destroy=t.destroy)}}class si extends Ie{constructor(){super(),this.animation=new ii,this.value=3}load(t){if(super.load(t),!t)return;const e=t.animation;void 0!==e&&this.animation.load(e)}}class oi{constructor(){this.width=0}load(t){t&&(void 0!==t.color&&(this.color=Se.create(this.color,t.color)),void 0!==t.width&&(this.width=S(t.width)),void 0!==t.opacity&&(this.opacity=S(t.opacity)))}}class ni extends Re{constructor(){super(),this.opacityRate=1,this.sizeRate=1,this.velocityRate=1}load(t){super.load(t),t&&(void 0!==t.opacityRate&&(this.opacityRate=t.opacityRate),void 0!==t.sizeRate&&(this.sizeRate=t.sizeRate),void 0!==t.velocityRate&&(this.velocityRate=t.velocityRate))}}class ai{constructor(t,e){this._engine=t,this._container=e,this.bounce=new Ae,this.collisions=new Fe,this.color=new Se,this.color.value="#fff",this.effect=new Be,this.groups={},this.move=new Xe,this.number=new Ke,this.opacity=new Ze,this.reduceDuplicates=!1,this.shadow=new ti,this.shape=new ei,this.size=new si,this.stroke=new oi,this.zIndex=new ni}load(t){if(!t)return;if(void 0!==t.groups)for(const e of Object.keys(t.groups)){if(!Object.hasOwn(t.groups,e))continue;const i=t.groups[e];void 0!==i&&(this.groups[e]=st(this.groups[e]??{},i))}void 0!==t.reduceDuplicates&&(this.reduceDuplicates=t.reduceDuplicates),this.bounce.load(t.bounce),this.color.load(Se.create(this.color,t.color)),this.effect.load(t.effect),this.move.load(t.move),this.number.load(t.number),this.opacity.load(t.opacity),this.shape.load(t.shape),this.size.load(t.size),this.shadow.load(t.shadow),this.zIndex.load(t.zIndex),this.collisions.load(t.collisions),void 0!==t.interactivity&&(this.interactivity=st({},t.interactivity));const e=t.stroke;if(e&&(this.stroke=dt(e,(t=>{const e=new oi;return e.load(t),e}))),this._container){const e=this._engine.updaters.get(this._container);if(e)for(const i of e)i.loadOptions&&i.loadOptions(this,t);const i=this._engine.interactors.get(this._container);if(i)for(const e of i)e.loadParticlesOptions&&e.loadParticlesOptions(this,t)}}}function ri(t,...e){for(const i of e)t.load(i)}function ci(t,e,...i){const s=new ai(t,e);return ri(s,...i),s}class li{constructor(t,e){this._findDefaultTheme=t=>this.themes.find((e=>e.default.value&&e.default.mode===t))??this.themes.find((t=>t.default.value&&"any"===t.default.mode)),this._importPreset=t=>{this.load(this._engine.getPreset(t))},this._engine=t,this._container=e,this.autoPlay=!0,this.background=new le,this.backgroundMask=new de,this.clear=!0,this.defaultThemes={},this.delay=0,this.fullScreen=new ue,this.detectRetina=!0,this.duration=0,this.fpsLimit=120,this.interactivity=new we(t,e),this.manualParticles=[],this.particles=ci(this._engine,this._container),this.pauseOnBlur=!0,this.pauseOnOutsideViewport=!0,this.responsive=[],this.smooth=!1,this.style={},this.themes=[],this.zLayers=100}load(t){if(!t)return;void 0!==t.preset&&dt(t.preset,(t=>this._importPreset(t))),void 0!==t.autoPlay&&(this.autoPlay=t.autoPlay),void 0!==t.clear&&(this.clear=t.clear),void 0!==t.name&&(this.name=t.name),void 0!==t.delay&&(this.delay=S(t.delay));const e=t.detectRetina;void 0!==e&&(this.detectRetina=e),void 0!==t.duration&&(this.duration=S(t.duration));const i=t.fpsLimit;void 0!==i&&(this.fpsLimit=i),void 0!==t.pauseOnBlur&&(this.pauseOnBlur=t.pauseOnBlur),void 0!==t.pauseOnOutsideViewport&&(this.pauseOnOutsideViewport=t.pauseOnOutsideViewport),void 0!==t.zLayers&&(this.zLayers=t.zLayers),this.background.load(t.background);const s=t.fullScreen;gt(s)?this.fullScreen.enable=s:this.fullScreen.load(s),this.backgroundMask.load(t.backgroundMask),this.interactivity.load(t.interactivity),t.manualParticles&&(this.manualParticles=t.manualParticles.map((t=>{const e=new xe;return e.load(t),e}))),this.particles.load(t.particles),this.style=st(this.style,t.style),this._engine.loadOptions(this,t),void 0!==t.smooth&&(this.smooth=t.smooth);const o=this._engine.interactors.get(this._container);if(o)for(const e of o)e.loadOptions&&e.loadOptions(this,t);if(void 0!==t.responsive)for(const e of t.responsive){const t=new _e;t.load(e),this.responsive.push(t)}if(this.responsive.sort(((t,e)=>t.maxWidth-e.maxWidth)),void 0!==t.themes)for(const e of t.themes){const t=this.themes.find((t=>t.name===e.name));if(t)t.load(e);else{const t=new ze;t.load(e),this.themes.push(t)}}this.defaultThemes.dark=this._findDefaultTheme("dark")?.name,this.defaultThemes.light=this._findDefaultTheme("light")?.name}setResponsive(t,e,i){this.load(i);const s=this.responsive.find((i=>"screen"===i.mode&&screen?i.maxWidth>screen.availWidth:i.maxWidth*e>t));return this.load(s?.options),s?.maxWidth}setTheme(t){if(t){const e=this.themes.find((e=>e.name===t));e&&this.load(e.options)}else{const t=N("(prefers-color-scheme: dark)"),e=t&&t.matches,i=this._findDefaultTheme(e?"dark":"light");i&&this.load(i.options)}}}class hi{constructor(t,e){this.container=e,this._engine=t,this._interactors=t.getInteractors(this.container,!0),this._externalInteractors=[],this._particleInteractors=[]}async externalInteract(t){for(const e of this._externalInteractors)e.isEnabled()&&await e.interact(t)}handleClickMode(t){for(const e of this._externalInteractors)e.handleClickMode&&e.handleClickMode(t)}init(){this._externalInteractors=[],this._particleInteractors=[];for(const t of this._interactors){switch(t.type){case"external":this._externalInteractors.push(t);break;case"particles":this._particleInteractors.push(t)}t.init()}}async particlesInteract(t,e){for(const i of this._externalInteractors)i.clear(t,e);for(const i of this._particleInteractors)i.isEnabled(t)&&await i.interact(t,e)}async reset(t){for(const e of this._externalInteractors)e.isEnabled()&&e.reset(t);for(const e of this._particleInteractors)e.isEnabled(t)&&e.reset(t)}}function di(t){if(!Z(t.outMode,t.checkModes))return;const e=2*t.radius;t.coord>t.maxCoord-e?t.setCb(-t.radius):t.coord{for(const[,s]of t.plugins){const t=void 0!==s.particlePosition?s.particlePosition(e,this):void 0;if(t)return v.create(t.x,t.y,i)}const o=B({size:t.canvas.size,position:e}),n=v.create(o.x,o.y,i),a=this.getRadius(),r=this.options.move.outModes,c=e=>{di({outMode:e,checkModes:["bounce","bounce-horizontal"],coord:n.x,maxCoord:t.canvas.size.width,setCb:t=>n.x+=t,radius:a})},l=e=>{di({outMode:e,checkModes:["bounce","bounce-vertical"],coord:n.y,maxCoord:t.canvas.size.height,setCb:t=>n.y+=t,radius:a})};return c(r.left??r.default),c(r.right??r.default),l(r.top??r.default),l(r.bottom??r.default),this._checkOverlap(n,s)?this._calcPosition(t,void 0,i,s+1):n},this._calculateVelocity=()=>{const t=E(this.direction).copy(),e=this.options.move;if("inside"===e.direction||"outside"===e.direction)return t;const i=Math.PI/180*C(e.angle.value),s=Math.PI/180*C(e.angle.offset),o={left:s-.5*i,right:s+.5*i};return e.straight||(t.angle+=M(S(o.left,o.right))),e.random&&"number"==typeof e.speed&&(t.length*=_()),t},this._checkOverlap=(t,e=0)=>{const i=this.options.collisions,s=this.getRadius();if(!i.enable)return!1;const o=i.overlap;if(o.enable)return!1;const n=o.retries;if(n>=0&&e>n)throw new Error(`${f} particle is overlapping and can't be placed`);return!!this.container.particles.find((e=>T(t,e.position){if(!t||!this.roll||!this.backColor&&!this.roll.alter)return t;const e=this.roll.horizontal&&this.roll.vertical?2:1,i=this.roll.horizontal?.5*Math.PI:0;return Math.floor(((this.roll.angle??0)+i)/(Math.PI/e))%2?this.backColor?this.backColor:this.roll.alter?se(t,this.roll.alter.type,this.roll.alter.value):t:t},this._initPosition=t=>{const e=this.container,i=C(this.options.zIndex.value);this.position=this._calcPosition(e,t,k(i,0,e.zLayers)),this.initialPosition=this.position.copy();const s=e.canvas.size;switch(this.moveCenter={...yt(this.options.move.center,s),radius:this.options.move.center.radius??0,mode:this.options.move.center.mode??"percent"},this.direction=R(this.options.move.direction,this.position,this.moveCenter),this.options.move.direction){case"inside":this.outType="inside";break;case"outside":this.outType="outside"}this.offset=y.origin},this._engine=t,this.init(e,s,o,n)}destroy(t){if(this.unbreakable||this.destroyed)return;this.destroyed=!0,this.bubble.inRange=!1,this.slow.inRange=!1;const e=this.container,i=this.pathGenerator,s=e.shapeDrawers.get(this.shape);s&&s.particleDestroy&&s.particleDestroy(this);for(const[,i]of e.plugins)i.particleDestroyed&&i.particleDestroyed(this,t);for(const i of e.particles.updaters)i.particleDestroyed&&i.particleDestroyed(this,t);i&&i.reset(this),this._engine.dispatchEvent("particleDestroyed",{container:this.container,data:{particle:this}})}draw(t){const e=this.container,i=e.canvas;for(const[,s]of e.plugins)i.drawParticlePlugin(s,this,t);i.drawParticle(this,t)}getFillColor(){return this._getRollColor(this.bubble.color??$t(this.color))}getMass(){return this.getRadius()**2*Math.PI*.5}getPosition(){return{x:this.position.x+this.offset.x,y:this.position.y+this.offset.y,z:this.position.z}}getRadius(){return this.bubble.radius??this.size.value}getStrokeColor(){return this._getRollColor(this.bubble.color??$t(this.strokeColor))}init(t,e,i,s){const o=this.container,n=this._engine;this.id=t,this.group=s,this.effectClose=!0,this.effectFill=!0,this.shapeClose=!0,this.shapeFill=!0,this.pathRotation=!1,this.lastPathTime=0,this.destroyed=!1,this.unbreakable=!1,this.rotation=0,this.misplaced=!1,this.retina={maxDistance:{}},this.outType="normal",this.ignoresResizeRatio=!0;const a=o.retina.pixelRatio,r=o.actualOptions,c=ci(this._engine,o,r.particles),l=c.effect.type,h=c.shape.type,{reduceDuplicates:d}=c;this.effect=ut(l,this.id,d),this.shape=ut(h,this.id,d);const u=c.effect,p=c.shape;if(i){if(i.effect&&i.effect.type){const t=ut(i.effect.type,this.id,d);t&&(this.effect=t,u.load(i.effect))}if(i.shape&&i.shape.type){const t=ut(i.shape.type,this.id,d);t&&(this.shape=t,p.load(i.shape))}}this.effectData=function(t,e,i,s){const o=e.options[t];if(o)return st({close:e.close,fill:e.fill},ut(o,i,s))}(this.effect,u,this.id,d),this.shapeData=function(t,e,i,s){const o=e.options[t];if(o)return st({close:e.close,fill:e.fill},ut(o,i,s))}(this.shape,p,this.id,d),c.load(i);const f=this.effectData;f&&c.load(f.particles);const v=this.shapeData;v&&c.load(v.particles);const y=new we(n,o);y.load(o.actualOptions.interactivity),y.load(c.interactivity),this.interactivity=y,this.effectFill=f?.fill??c.effect.fill,this.effectClose=f?.close??c.effect.close,this.shapeFill=v?.fill??c.shape.fill,this.shapeClose=v?.close??c.shape.close,this.options=c;const m=this.options.move.path;this.pathDelay=1e3*C(m.delay.value),m.generator&&(this.pathGenerator=this._engine.getPathGenerator(m.generator),this.pathGenerator&&o.addPath(m.generator,this.pathGenerator)&&this.pathGenerator.init(o)),o.retina.initParticle(this),this.size=ft(this.options.size,a),this.bubble={inRange:!1},this.slow={inRange:!1,factor:1},this._initPosition(e),this.initialVelocity=this._calculateVelocity(),this.velocity=this.initialVelocity.copy(),this.moveDecay=1-C(this.options.move.decay);const g=o.particles;g.setLastZIndex(this.position.z),this.zIndexFactor=this.position.z/o.zLayers,this.sides=24;let b=o.effectDrawers.get(this.effect);b||(b=this._engine.getEffectDrawer(this.effect),b&&o.effectDrawers.set(this.effect,b)),b&&b.loadEffect&&b.loadEffect(this);let w=o.shapeDrawers.get(this.shape);w||(w=this._engine.getShapeDrawer(this.shape),w&&o.shapeDrawers.set(this.shape,w)),w&&w.loadShape&&w.loadShape(this);const x=w?.getSidesCount;x&&(this.sides=x(this)),this.spawning=!1,this.shadowColor=St(this.options.shadow.color);for(const t of g.updaters)t.init(this);for(const t of g.movers)t.init&&t.init(this);b&&b.particleInit&&b.particleInit(o,this),w&&w.particleInit&&w.particleInit(o,this);for(const[,t]of o.plugins)t.particleCreated&&t.particleCreated(this)}isInsideCanvas(){const t=this.getRadius(),e=this.container.canvas.size,i=this.position;return i.x>=-t&&i.y>=-t&&i.y<=e.height+t&&i.x<=e.width+t}isVisible(){return!this.destroyed&&!this.spawning&&this.isInsideCanvas()}reset(){for(const t of this.container.particles.updaters)t.reset&&t.reset(this)}}class pi{constructor(t,e){this.position=t,this.particle=e}}class fi{constructor(t,e){this.position={x:t,y:e}}}class vi extends fi{constructor(t,e,i,s){super(t,e),this.size={height:s,width:i}}contains(t){const e=this.size.width,i=this.size.height,s=this.position;return t.x>=s.x&&t.x<=s.x+e&&t.y>=s.y&&t.y<=s.y+i}intersects(t){t instanceof yi&&t.intersects(this);const e=this.size.width,i=this.size.height,s=this.position,o=t.position,n=t instanceof vi?t.size:{width:0,height:0},a=n.width,r=n.height;return o.xs.x&&o.ys.y}}class yi extends fi{constructor(t,e,i){super(t,e),this.radius=i}contains(t){return T(t,this.position)<=this.radius}intersects(t){const e=this.position,i=t.position,s=Math.abs(i.x-e.x),o=Math.abs(i.y-e.y),n=this.radius;if(t instanceof yi){return n+t.radius>Math.sqrt(s**2+o**2)}if(t instanceof vi){const{width:e,height:i}=t.size;return Math.pow(s-e,2)+Math.pow(o-i,2)<=n**2||s<=n+e&&o<=n+i||s<=e||o<=i}return!1}}class mi{constructor(t,e){this.rectangle=t,this.capacity=e,this._subdivide=()=>{const{x:t,y:e}=this.rectangle.position,{width:i,height:s}=this.rectangle.size,{capacity:o}=this;for(let n=0;n<4;n++)this._subs.push(new mi(new vi(t+.5*i*(n%2),e+.5*s*(Math.round(.5*n)-n%2),.5*i,.5*s),o));this._divided=!0},this._points=[],this._divided=!1,this._subs=[]}insert(t){return!!this.rectangle.contains(t.position)&&(this._points.lengthe.insert(t)))))}query(t,e,i){const s=i||[];if(!t.intersects(this.rectangle))return[];for(const i of this._points)!t.contains(i.position)&&T(t.position,i.position)>i.particle.getRadius()&&(!e||e(i.particle))||s.push(i.particle);if(this._divided)for(const i of this._subs)i.query(t,e,s);return s}queryCircle(t,e,i){return this.query(new yi(t.x,t.y,e),i)}queryRectangle(t,e,i){return this.query(new vi(t.x,t.y,e.width,e.height),i)}}const gi=t=>{const{height:e,width:i}=t;return new vi(-.25*i,-.25*e,1.5*i,1.5*e)};class bi{constructor(t,e){this._addToPool=(...t)=>{for(const e of t)this._pool.push(e)},this._applyDensity=(t,e,i)=>{const s=t.number;if(!t.number.density?.enable)return void(void 0===i?this._limit=s.limit.value:s.limit&&this._groupLimits.set(i,s.limit.value));const o=this._initDensityFactor(s.density),n=s.value,a=s.limit.value>0?s.limit.value:n,r=Math.min(n,a)*o+e,c=Math.min(this.count,this.filter((t=>t.group===i)).length);void 0===i?this._limit=s.limit.value*o:this._groupLimits.set(i,s.limit.value*o),cr&&this.removeQuantity(c-r,i)},this._initDensityFactor=t=>{const e=this._container;if(!e.canvas.element||!t.enable)return 1;const i=e.canvas.element,s=e.retina.pixelRatio;return i.width*i.height/(t.height*t.width*s**2)},this._pushParticle=(t,e,i,s)=>{try{let o=this._pool.pop();o?o.init(this._nextId,t,e,i):o=new ui(this._engine,this._nextId,this._container,t,e,i);let n=!0;if(s&&(n=s(o)),!n)return;return this._array.push(o),this._zArray.push(o),this._nextId++,this._engine.dispatchEvent("particleAdded",{container:this._container,data:{particle:o}}),o}catch(t){return void W().warning(`${f} adding particle: ${t}`)}},this._removeParticle=(t,e,i)=>{const s=this._array[t];if(!s||s.group!==e)return!1;const o=this._zArray.indexOf(s);return this._array.splice(t,1),this._zArray.splice(o,1),s.destroy(i),this._engine.dispatchEvent("particleRemoved",{container:this._container,data:{particle:s}}),this._addToPool(s),!0},this._engine=t,this._container=e,this._nextId=0,this._array=[],this._zArray=[],this._pool=[],this._limit=0,this._groupLimits=new Map,this._needsSort=!1,this._lastZIndex=0,this._interactionManager=new hi(t,e);const i=e.canvas.size;this.quadTree=new mi(gi(i),4),this.movers=this._engine.getMovers(e,!0),this.updaters=this._engine.getUpdaters(e,!0)}get count(){return this._array.length}addManualParticles(){const t=this._container,e=t.actualOptions;for(const i of e.manualParticles)this.addParticle(i.position?yt(i.position,t.canvas.size):void 0,i.options)}addParticle(t,e,i,s){const o=this._container.actualOptions.particles.number.limit,n=void 0===i?this._limit:this._groupLimits.get(i)??this._limit,a=this.count;if(n>0)if("delete"===o.mode){const t=a+1-n;t>0&&this.removeQuantity(t)}else if("wait"===o.mode&&a>=n)return;return this._pushParticle(t,e,i,s)}clear(){this._array=[],this._zArray=[]}destroy(){this._array=[],this._zArray=[],this.movers=[],this.updaters=[]}async draw(t){const e=this._container,i=e.canvas;i.clear(),await this.update(t);for(const[,s]of e.plugins)i.drawPlugin(s,t);for(const e of this._zArray)e.draw(t)}filter(t){return this._array.filter(t)}find(t){return this._array.find(t)}get(t){return this._array[t]}handleClickMode(t){this._interactionManager.handleClickMode(t)}init(){const t=this._container,e=t.actualOptions;this._lastZIndex=0,this._needsSort=!1;let i=!1;this.updaters=this._engine.getUpdaters(t,!0),this._interactionManager.init();for(const[,e]of t.plugins)if(void 0!==e.particlesInitialization&&(i=e.particlesInitialization()),i)break;this._interactionManager.init();for(const[,e]of t.pathGenerators)e.init(t);if(this.addManualParticles(),!i){const t=e.particles,i=t.groups;for(const e in i){const s=i[e];for(let i=this.count,o=0;othis.count)return;let o=0;for(let n=t;o!i.has(t);this._array=this.filter(t),this._zArray=this._zArray.filter(t);for(const t of i)this._engine.dispatchEvent("particleRemoved",{container:this._container,data:{particle:t}});this._addToPool(...i)}await this._interactionManager.externalInteract(t);for(const e of this._array){for(const i of this.updaters)i.update(e,t);e.destroyed||e.spawning||await this._interactionManager.particlesInteract(e,t)}if(delete this._resizeFactor,this._needsSort){const t=this._zArray;t.sort(((t,e)=>e.position.z-t.position.z||t.id-e.id)),this._lastZIndex=t[t.length-1].position.z,this._needsSort=!1}}}class wi{constructor(t){this.container=t,this.pixelRatio=1,this.reduceFactor=1}init(){const t=this.container,e=t.actualOptions;this.pixelRatio=!e.detectRetina||j()?1:window.devicePixelRatio,this.reduceFactor=1;const i=this.pixelRatio,s=t.canvas;if(s.element){const t=s.element;s.size.width=t.offsetWidth*i,s.size.height=t.offsetHeight*i}const o=e.particles,n=o.move;this.maxSpeed=C(n.gravity.maxSpeed)*i,this.sizeAnimationSpeed=C(o.size.animation.speed)*i}initParticle(t){const e=t.options,i=this.pixelRatio,s=e.move,o=s.distance,n=t.retina;n.moveDrift=C(s.drift)*i,n.moveSpeed=C(s.speed)*i,n.sizeAnimationSpeed=C(e.size.animation.speed)*i;const a=n.maxDistance;a.horizontal=void 0!==o.horizontal?o.horizontal*i:void 0,a.vertical=void 0!==o.vertical?o.vertical*i:void 0,n.maxSpeed=C(s.gravity.maxSpeed)*i}}function xi(t){return t&&!t.destroyed}function _i(t,e,...i){const s=new li(t,e);return ri(s,...i),s}class ki{constructor(t,e,i){this._intersectionManager=t=>{if(xi(this)&&this.actualOptions.pauseOnOutsideViewport)for(const e of t)e.target===this.interactivity.element&&(e.isIntersecting?this.play:this.pause)()},this._nextFrame=async t=>{try{if(!this._smooth&&void 0!==this._lastFrameTime&&t1e3)return void this.draw(!1);if(await this.particles.draw(e),!this.alive())return void this.destroy();this.getAnimationStatus()&&this.draw(!1)}catch(t){W().error(`${f} in animation loop`,t)}},this._engine=t,this.id=Symbol(e),this.fpsLimit=120,this._smooth=!1,this._delay=0,this._duration=0,this._lifeTime=0,this._firstStart=!0,this.started=!1,this.destroyed=!1,this._paused=!0,this._lastFrameTime=0,this.zLayers=100,this.pageHidden=!1,this._sourceOptions=i,this._initialSourceOptions=i,this.retina=new wi(this),this.canvas=new ne(this),this.particles=new bi(this._engine,this),this.pathGenerators=new Map,this.interactivity={mouse:{clicking:!1,inside:!1}},this.plugins=new Map,this.effectDrawers=new Map,this.shapeDrawers=new Map,this._options=_i(this._engine,this),this.actualOptions=_i(this._engine,this),this._eventListeners=new re(this),this._intersectionObserver=X((t=>this._intersectionManager(t))),this._engine.dispatchEvent("containerBuilt",{container:this})}get options(){return this._options}get sourceOptions(){return this._sourceOptions}addClickHandler(t){if(!xi(this))return;const e=this.interactivity.element;if(!e)return;const i=(e,i,s)=>{if(!xi(this))return;const o=this.retina.pixelRatio,n={x:i.x*o,y:i.y*o},a=this.particles.quadTree.queryCircle(n,s*o);t(e,a)};let s=!1,o=!1;e.addEventListener("click",(t=>{if(!xi(this))return;const e=t,s={x:e.offsetX||e.clientX,y:e.offsetY||e.clientY};i(t,s,1)})),e.addEventListener("touchstart",(()=>{xi(this)&&(s=!0,o=!1)})),e.addEventListener("touchmove",(()=>{xi(this)&&(o=!0)})),e.addEventListener("touchend",(t=>{if(xi(this)){if(s&&!o){const e=t;let s=e.touches[e.touches.length-1];if(!s&&(s=e.changedTouches[e.changedTouches.length-1],!s))return;const o=this.canvas.element,n=o?o.getBoundingClientRect():void 0,a={x:s.clientX-(n?n.left:0),y:s.clientY-(n?n.top:0)};i(t,a,Math.max(s.radiusX,s.radiusY))}s=!1,o=!1}})),e.addEventListener("touchcancel",(()=>{xi(this)&&(s=!1,o=!1)}))}addLifeTime(t){this._lifeTime+=t}addPath(t,e,i=!1){return!(!xi(this)||!i&&this.pathGenerators.has(t))&&(this.pathGenerators.set(t,e),!0)}alive(){return!this._duration||this._lifeTime<=this._duration}destroy(){if(!xi(this))return;this.stop(),this.particles.destroy(),this.canvas.destroy();for(const[,t]of this.effectDrawers)t.destroy&&t.destroy(this);for(const[,t]of this.shapeDrawers)t.destroy&&t.destroy(this);for(const t of this.effectDrawers.keys())this.effectDrawers.delete(t);for(const t of this.shapeDrawers.keys())this.shapeDrawers.delete(t);this._engine.clearPlugins(this),this.destroyed=!0;const t=this._engine.dom(),e=t.findIndex((t=>t===this));e>=0&&t.splice(e,1),this._engine.dispatchEvent("containerDestroyed",{container:this})}draw(t){if(!xi(this))return;let e=t;this._drawAnimationFrame=requestAnimationFrame((async t=>{e&&(this._lastFrameTime=void 0,e=!1),await this._nextFrame(t)}))}async export(t,e={}){for(const[,i]of this.plugins){if(!i.export)continue;const s=await i.export(t,e);if(s.supported)return s.blob}W().error(`${f} - Export plugin with type ${t} not found`)}getAnimationStatus(){return!this._paused&&!this.pageHidden&&xi(this)}handleClickMode(t){if(xi(this)){this.particles.handleClickMode(t);for(const[,e]of this.plugins)e.handleClickMode&&e.handleClickMode(t)}}async init(){if(!xi(this))return;const t=this._engine.getSupportedEffects();for(const e of t){const t=this._engine.getEffectDrawer(e);t&&this.effectDrawers.set(e,t)}const e=this._engine.getSupportedShapes();for(const t of e){const e=this._engine.getShapeDrawer(t);e&&this.shapeDrawers.set(t,e)}this._options=_i(this._engine,this,this._initialSourceOptions,this.sourceOptions),this.actualOptions=_i(this._engine,this,this._options);const i=this._engine.getAvailablePlugins(this);for(const[t,e]of i)this.plugins.set(t,e);this.retina.init(),await this.canvas.init(),this.updateActualOptions(),this.canvas.initBackground(),this.canvas.resize(),this.zLayers=this.actualOptions.zLayers,this._duration=1e3*C(this.actualOptions.duration),this._delay=1e3*C(this.actualOptions.delay),this._lifeTime=0,this.fpsLimit=this.actualOptions.fpsLimit>0?this.actualOptions.fpsLimit:120,this._smooth=this.actualOptions.smooth;for(const[,t]of this.effectDrawers)t.init&&await t.init(this);for(const[,t]of this.shapeDrawers)t.init&&await t.init(this);for(const[,t]of this.plugins)t.init&&await t.init();this._engine.dispatchEvent("containerInit",{container:this}),this.particles.init(),this.particles.setDensity();for(const[,t]of this.plugins)t.particlesSetup&&t.particlesSetup();this._engine.dispatchEvent("particlesSetup",{container:this})}async loadTheme(t){xi(this)&&(this._currentTheme=t,await this.refresh())}pause(){if(xi(this)&&(void 0!==this._drawAnimationFrame&&(cancelAnimationFrame(this._drawAnimationFrame),delete this._drawAnimationFrame),!this._paused)){for(const[,t]of this.plugins)t.pause&&t.pause();this.pageHidden||(this._paused=!0),this._engine.dispatchEvent("containerPaused",{container:this})}}play(t){if(!xi(this))return;const e=this._paused||t;if(!this._firstStart||this.actualOptions.autoPlay){if(this._paused&&(this._paused=!1),e)for(const[,t]of this.plugins)t.play&&t.play();this._engine.dispatchEvent("containerPlay",{container:this}),this.draw(e||!1)}else this._firstStart=!1}async refresh(){if(xi(this))return this.stop(),this.start()}async reset(){if(xi(this))return this._initialSourceOptions=void 0,this._options=_i(this._engine,this),this.actualOptions=_i(this._engine,this,this._options),this.refresh()}async start(){xi(this)&&!this.started&&(await this.init(),this.started=!0,await new Promise((t=>{this._delayTimeout=setTimeout((async()=>{this._eventListeners.addListeners(),this.interactivity.element instanceof HTMLElement&&this._intersectionObserver&&this._intersectionObserver.observe(this.interactivity.element);for(const[,t]of this.plugins)t.start&&await t.start();this._engine.dispatchEvent("containerStarted",{container:this}),this.play(),t()}),this._delay)})))}stop(){if(xi(this)&&this.started){this._delayTimeout&&(clearTimeout(this._delayTimeout),delete this._delayTimeout),this._firstStart=!0,this.started=!1,this._eventListeners.removeListeners(),this.pause(),this.particles.clear(),this.canvas.stop(),this.interactivity.element instanceof HTMLElement&&this._intersectionObserver&&this._intersectionObserver.unobserve(this.interactivity.element);for(const[,t]of this.plugins)t.stop&&t.stop();for(const t of this.plugins.keys())this.plugins.delete(t);this._sourceOptions=this._options,this._engine.dispatchEvent("containerStopped",{container:this})}}updateActualOptions(){this.actualOptions.responsive=[];const t=this.actualOptions.setResponsive(this.canvas.size.width,this.retina.pixelRatio,this._options);return this.actualOptions.setTheme(this._currentTheme),this._responsiveMaxWidth!==t&&(this._responsiveMaxWidth=t,!0)}}class zi{constructor(){this._listeners=new Map}addEventListener(t,e){this.removeEventListener(t,e);let i=this._listeners.get(t);i||(i=[],this._listeners.set(t,i)),i.push(e)}dispatchEvent(t,e){const i=this._listeners.get(t);i&&i.forEach((t=>t(e)))}hasEventListener(t){return!!this._listeners.get(t)}removeAllEventListeners(t){t?this._listeners.delete(t):this._listeners=new Map}removeEventListener(t,e){const i=this._listeners.get(t);if(!i)return;const s=i.length,o=i.indexOf(e);o<0||(1===s?this._listeners.delete(t):i.splice(o,1))}}function Mi(t,e,i,s=!1){let o=e.get(t);return o&&!s||(o=[...i.values()].map((e=>e(t))),e.set(t,o)),o}class Ci{constructor(){this._configs=new Map,this._domArray=[],this._eventDispatcher=new zi,this._initialized=!1,this.plugins=[],this._initializers={interactors:new Map,movers:new Map,updaters:new Map},this.interactors=new Map,this.movers=new Map,this.updaters=new Map,this.presets=new Map,this.effectDrawers=new Map,this.shapeDrawers=new Map,this.pathGenerators=new Map}get configs(){const t={};for(const[e,i]of this._configs)t[e]=i;return t}get version(){return"3.0.2"}addConfig(t){const e=t.name??"default";this._configs.set(e,t),this._eventDispatcher.dispatchEvent("configAdded",{data:{name:e,config:t}})}async addEffect(t,e,i=!0){dt(t,(t=>{!this.getEffectDrawer(t)&&this.effectDrawers.set(t,e)})),await this.refresh(i)}addEventListener(t,e){this._eventDispatcher.addEventListener(t,e)}async addInteractor(t,e,i=!0){this._initializers.interactors.set(t,e),await this.refresh(i)}async addMover(t,e,i=!0){this._initializers.movers.set(t,e),await this.refresh(i)}async addParticleUpdater(t,e,i=!0){this._initializers.updaters.set(t,e),await this.refresh(i)}async addPathGenerator(t,e,i=!0){!this.getPathGenerator(t)&&this.pathGenerators.set(t,e),await this.refresh(i)}async addPlugin(t,e=!0){!this.getPlugin(t.id)&&this.plugins.push(t),await this.refresh(e)}async addPreset(t,e,i=!1,s=!0){(i||!this.getPreset(t))&&this.presets.set(t,e),await this.refresh(s)}async addShape(t,e,i=!0){dt(t,(t=>{!this.getShapeDrawer(t)&&this.shapeDrawers.set(t,e)})),await this.refresh(i)}clearPlugins(t){this.updaters.delete(t),this.movers.delete(t),this.interactors.delete(t)}dispatchEvent(t,e){this._eventDispatcher.dispatchEvent(t,e)}dom(){return this._domArray}domItem(t){const e=this.dom(),i=e[t];if(i&&!i.destroyed)return i;e.splice(t,1)}getAvailablePlugins(t){const e=new Map;for(const i of this.plugins)i.needsPlugin(t.actualOptions)&&e.set(i.id,i.getPlugin(t));return e}getEffectDrawer(t){return this.effectDrawers.get(t)}getInteractors(t,e=!1){return Mi(t,this.interactors,this._initializers.interactors,e)}getMovers(t,e=!1){return Mi(t,this.movers,this._initializers.movers,e)}getPathGenerator(t){return this.pathGenerators.get(t)}getPlugin(t){return this.plugins.find((e=>e.id===t))}getPreset(t){return this.presets.get(t)}getShapeDrawer(t){return this.shapeDrawers.get(t)}getSupportedEffects(){return this.effectDrawers.keys()}getSupportedShapes(){return this.shapeDrawers.keys()}getUpdaters(t,e=!1){return Mi(t,this.updaters,this._initializers.updaters,e)}init(){this._initialized||(this._initialized=!0)}async load(t){const e=t.id??`tsparticles${Math.floor(1e4*_())}`,{index:s,url:o}=t,n=o?await async function(t){const e=ut(t.url,t.index);if(!e)return t.fallback;const i=await fetch(e);return i.ok?i.json():(W().error(`${f} ${i.status} while retrieving config file`),t.fallback)}({fallback:t.options,url:o,index:s}):t.options;let a=t.element??document.getElementById(e);a||(a=document.createElement("div"),a.id=e,document.body.append(a));const r=ut(n,s),c=this.dom(),l=c.findIndex((t=>t.id.description===e));if(l>=0){const t=this.domItem(l);t&&!t.destroyed&&(t.destroy(),c.splice(l,1))}let h;if("canvas"===a.tagName.toLowerCase())h=a,h.dataset[i]="false";else{const t=a.getElementsByTagName("canvas");t.length?(h=t[0],h.dataset[i]="false"):(h=document.createElement("canvas"),h.dataset[i]="true",a.appendChild(h))}h.style.width||(h.style.width="100%"),h.style.height||(h.style.height="100%");const d=new ki(this,e,r);return l>=0?c.splice(l,0,d):c.push(d),d.canvas.loadCanvas(h),await d.start(),d}loadOptions(t,e){for(const i of this.plugins)i.loadOptions(t,e)}loadParticlesOptions(t,e,...i){const s=this.updaters.get(t);if(s)for(const t of s)t.loadOptions&&t.loadOptions(e,...i)}async refresh(t=!0){t&&this.dom().forEach((t=>t.refresh()))}removeEventListener(t,e){this._eventDispatcher.removeEventListener(t,e)}setOnClickHandler(t){const e=this.dom();if(!e.length)throw new Error(`${f} can only set click handlers after calling tsParticles.load()`);for(const i of e)i.addClickHandler(t)}}class Pi{constructor(){this.key="hsl",this.stringPrefix="hsl"}handleColor(t){const e=t.value.hsl??t.value;if(void 0!==e.h&&void 0!==e.s&&void 0!==e.l)return At(e)}handleRangeColor(t){const e=t.value.hsl??t.value;if(void 0!==e.h&&void 0!==e.l)return At({h:C(e.h),l:C(e.l),s:C(e.s)})}parseString(t){if(!t.startsWith("hsl"))return;const e=/hsla?\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.%]+)\s*)?\)/i.exec(t);return e?Ft({a:e.length>4?H(e[5]):1,h:parseInt(e[1],10),l:parseInt(e[3],10),s:parseInt(e[2],10)}):void 0}}class Oi{constructor(){this.key="rgb",this.stringPrefix="rgb"}handleColor(t){const e=t.value.rgb??t.value;if(void 0!==e.r)return e}handleRangeColor(t){const e=t.value.rgb??t.value;if(void 0!==e.r)return{r:C(e.r),g:C(e.g),b:C(e.b)}}parseString(t){if(!t.startsWith(this.stringPrefix))return;const e=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.%]+)\s*)?\)/i.exec(t);return e?{a:e.length>4?H(e[5]):1,b:parseInt(e[3],10),g:parseInt(e[2],10),r:parseInt(e[1],10)}:void 0}}class Si{constructor(t){this.container=t,this.type="external"}}class Di{constructor(t){this.container=t,this.type="particles"}}const Ti=function(){const t=new Oi,e=new Pi;Pt(t),Pt(e);const i=new Ci;return i.init(),i}();j()||(window.tsParticles=Ti);class Ri{constructor(){this.radius=0,this.mass=0}load(t){t&&(void 0!==t.mass&&(this.mass=t.mass),void 0!==t.radius&&(this.radius=t.radius))}}class Ei extends Re{constructor(){super(),this.density=5,this.value=50,this.limit=new Ri}load(t){t&&(super.load(t),void 0!==t.density&&(this.density=t.density),wt(t.limit)?this.limit.radius=t.limit:this.limit.load(t.limit))}}class Ii{constructor(){this.color=new ce,this.color.value="#000000",this.draggable=!1,this.opacity=1,this.destroy=!0,this.orbits=!1,this.size=new Ei}load(t){void 0!==t&&(void 0!==t.color&&(this.color=ce.create(this.color,t.color)),void 0!==t.draggable&&(this.draggable=t.draggable),this.name=t.name,void 0!==t.opacity&&(this.opacity=t.opacity),void 0!==t.position&&(this.position={},void 0!==t.position.x&&(this.position.x=S(t.position.x)),void 0!==t.position.y&&(this.position.y=S(t.position.y))),void 0!==t.size&&this.size.load(t.size),void 0!==t.destroy&&(this.destroy=t.destroy),void 0!==t.orbits&&(this.orbits=t.orbits))}}class Li{constructor(t,e,i,s){this.absorbers=t,this.container=e,this._calcPosition=()=>{const t=F({size:this.container.canvas.size,position:this.options.position});return y.create(t.x,t.y)},this._updateParticlePosition=(t,e)=>{if(t.destroyed)return;const i=this.container,s=i.canvas.size;if(t.needsNewPosition){const e=A({size:s});t.position.setTo(e),t.velocity.setTo(t.initialVelocity),t.absorberOrbit=void 0,t.needsNewPosition=!1}if(this.options.orbits){if(void 0===t.absorberOrbit&&(t.absorberOrbit=y.create(0,0),t.absorberOrbit.length=T(t.getPosition(),this.position),t.absorberOrbit.angle=_()*Math.PI*2),t.absorberOrbit.length<=this.size&&!this.options.destroy){const e=Math.min(s.width,s.height);t.absorberOrbit.length=e*(.2*_()-.1+1)}void 0===t.absorberOrbitDirection&&(t.absorberOrbitDirection=t.velocity.x>=0?"clockwise":"counter-clockwise");const o=t.absorberOrbit.length,n=t.absorberOrbit.angle,a=t.absorberOrbitDirection;t.velocity.setTo(y.origin);const r={x:"clockwise"===a?Math.cos:Math.sin,y:"clockwise"===a?Math.sin:Math.cos};t.position.x=this.position.x+o*r.x(n),t.position.y=this.position.y+o*r.y(n),t.absorberOrbit.length-=e.length,t.absorberOrbit.angle+=(t.retina.moveSpeed??0)*i.retina.pixelRatio/100*i.retina.reduceFactor}else{const i=y.origin;i.length=e.length,i.angle=e.angle,t.velocity.addTo(i)}},this.initialPosition=s?y.create(s.x,s.y):void 0,i instanceof Ii?this.options=i:(this.options=new Ii,this.options.load(i)),this.dragging=!1,this.name=this.options.name,this.opacity=this.options.opacity,this.size=C(this.options.size.value)*e.retina.pixelRatio,this.mass=this.size*this.options.size.density*e.retina.reduceFactor;const o=this.options.size.limit;this.limit={radius:o.radius*e.retina.pixelRatio*e.retina.reduceFactor,mass:o.mass},this.color=St(this.options.color)??{b:0,g:0,r:0},this.position=this.initialPosition?.copy()??this._calcPosition()}attract(t){const e=this.container,i=this.options;if(i.draggable){const t=e.interactivity.mouse;if(t.clicking&&t.downPosition){T(this.position,t.downPosition)<=this.size&&(this.dragging=!0)}else this.dragging=!1;this.dragging&&t.position&&(this.position.x=t.position.x,this.position.y=t.position.y)}const s=t.getPosition(),{dx:o,dy:n,distance:a}=D(this.position,s),r=y.create(o,n);if(r.length=this.mass/Math.pow(a,2)*e.retina.reduceFactor,at.getRadius()&&avoid 0===t||wt(t)?this.array[t||0]:this.array.find((e=>e.name===t)),t.addAbsorber=(t,e)=>this.addAbsorber(t,e)}addAbsorber(t,e){const i=new Li(this,this.container,t,e);return this.array.push(i),i}draw(t){for(const e of this.array)e.draw(t)}handleClickMode(t){const e=this.absorbers,i=this.interactivityAbsorbers;if("absorber"===t){const t=ut(i)??ut(e),s=this.container.interactivity.mouse.clickPosition;this.addAbsorber(t,s)}}async init(){this.absorbers=this.container.actualOptions.absorbers,this.interactivityAbsorbers=this.container.actualOptions.interactivity.modes.absorbers,dt(this.absorbers,(t=>{this.addAbsorber(t)}))}particleUpdate(t){for(const e of this.array)if(e.attract(t),t.destroyed)break}removeAbsorber(t){const e=this.array.indexOf(t);e>=0&&this.array.splice(e,1)}resize(){for(const t of this.array)t.resize()}stop(){this.array=[]}}class Fi{constructor(){this.id="absorbers"}getPlugin(t){return new Ai(t)}loadOptions(t,e){(this.needsPlugin(t)||this.needsPlugin(e))&&(e?.absorbers&&(t.absorbers=dt(e.absorbers,(t=>{const e=new Ii;return e.load(t),e}))),t.interactivity.modes.absorbers=dt(e?.interactivity?.modes?.absorbers,(t=>{const e=new Ii;return e.load(t),e})))}needsPlugin(t){if(!t)return!1;const e=t.absorbers;return kt(e)?!!e.length:!!e||!(!t.interactivity?.events?.onClick?.mode||!Z("absorber",t.interactivity.events.onClick.mode))}}class Bi{load(t){t&&(void 0!==t.bottom&&(this.bottom=S(t.bottom)),void 0!==t.left&&(this.left=S(t.left)),void 0!==t.right&&(this.right=S(t.right)),void 0!==t.top&&(this.top=S(t.top)))}}class qi extends Re{constructor(){super(),this.value=3}}class Hi extends Re{constructor(){super(),this.value={min:4,max:9}}}class Vi{constructor(){this.count=1,this.factor=new qi,this.rate=new Hi,this.sizeOffset=!0}load(t){t&&(void 0!==t.color&&(this.color=ce.create(this.color,t.color)),void 0!==t.count&&(this.count=t.count),this.factor.load(t.factor),this.rate.load(t.rate),this.particles=dt(t.particles,(t=>st({},t))),void 0!==t.sizeOffset&&(this.sizeOffset=t.sizeOffset),t.colorOffset&&(this.colorOffset=this.colorOffset??{},void 0!==t.colorOffset.h&&(this.colorOffset.h=t.colorOffset.h),void 0!==t.colorOffset.s&&(this.colorOffset.s=t.colorOffset.s),void 0!==t.colorOffset.l&&(this.colorOffset.l=t.colorOffset.l)))}}class Ui{constructor(){this.bounds=new Bi,this.mode="none",this.split=new Vi}load(t){t&&(t.mode&&(this.mode=t.mode),t.bounds&&this.bounds.load(t.bounds),this.split.load(t.split))}}function Wi(t,e,i,s){const o=i.options.destroy;if(!o)return;const n=o.split,a=ci(t,e,i.options),r=C(n.factor.value),c=i.getFillColor();n.color?a.color.load(n.color):n.colorOffset&&c?a.color.load({value:{hsl:{h:c.h+C(n.colorOffset.h??0),s:c.s+C(n.colorOffset.s??0),l:c.l+C(n.colorOffset.l??0)}}}):a.color.load({value:{hsl:i.getFillColor()}}),a.move.load({center:{x:i.position.x,y:i.position.y,mode:"precise"}}),wt(a.size.value)?a.size.value/=r:(a.size.value.min/=r,a.size.value.max/=r),a.load(s);const l=n.sizeOffset?S(-i.size.value,i.size.value):0,h={x:i.position.x+M(l),y:i.position.y+M(l)};return e.particles.addParticle(h,a,i.group,(t=>!(t.size.value<.5)&&(t.velocity.length=M(S(i.velocity.length,t.velocity.length)),t.splitCount=(i.splitCount??0)+1,t.unbreakable=!0,setTimeout((()=>{t.unbreakable=!1}),500),!0)))}class $i{constructor(t,e){this.engine=t,this.container=e}init(t){const e=this.container,i=t.options.destroy;if(!i)return;t.splitCount=0;const s=i.bounds;t.destroyBounds||(t.destroyBounds={});const{bottom:o,left:n,right:a,top:r}=s,{destroyBounds:c}=t,l=e.canvas.size;o&&(c.bottom=C(o)*l.height/100),n&&(c.left=C(n)*l.width/100),a&&(c.right=C(a)*l.width/100),r&&(c.top=C(r)*l.height/100)}isEnabled(t){return!t.destroyed}loadOptions(t,...e){t.destroy||(t.destroy=new Ui);for(const i of e)t.destroy.load(i?.destroy)}particleDestroyed(t,e){if(e)return;const i=t.options.destroy;i&&"split"===i.mode&&function(t,e,i){const s=i.options.destroy;if(!s)return;const o=s.split;if(o.count>=0&&(void 0===i.splitCount||i.splitCount++>o.count))return;const n=C(o.rate.value),a=ut(o.particles);for(let s=0;s=i.bottom||void 0!==i.left&&e.x<=i.left||void 0!==i.right&&e.x>=i.right||void 0!==i.top&&e.y<=i.top)&&t.destroy()}}class ji{constructor(){this.wait=!1}load(t){t&&(void 0!==t.count&&(this.count=t.count),void 0!==t.delay&&(this.delay=S(t.delay)),void 0!==t.duration&&(this.duration=S(t.duration)),void 0!==t.wait&&(this.wait=t.wait))}}class Gi{constructor(){this.quantity=1,this.delay=.1}load(t){void 0!==t&&(void 0!==t.quantity&&(this.quantity=S(t.quantity)),void 0!==t.delay&&(this.delay=S(t.delay)))}}class Ni{constructor(){this.color=!1,this.opacity=!1}load(t){t&&(void 0!==t.color&&(this.color=t.color),void 0!==t.opacity&&(this.opacity=t.opacity))}}class Xi{constructor(){this.options={},this.replace=new Ni,this.type="square"}load(t){t&&(void 0!==t.options&&(this.options=st({},t.options??{})),this.replace.load(t.replace),void 0!==t.type&&(this.type=t.type))}}class Yi{constructor(){this.mode="percent",this.height=0,this.width=0}load(t){void 0!==t&&(void 0!==t.mode&&(this.mode=t.mode),void 0!==t.height&&(this.height=t.height),void 0!==t.width&&(this.width=t.width))}}class Zi{constructor(){this.autoPlay=!0,this.fill=!0,this.life=new ji,this.rate=new Gi,this.shape=new Xi,this.startCount=0}load(t){t&&(void 0!==t.autoPlay&&(this.autoPlay=t.autoPlay),void 0!==t.size&&(this.size||(this.size=new Yi),this.size.load(t.size)),void 0!==t.direction&&(this.direction=t.direction),this.domId=t.domId,void 0!==t.fill&&(this.fill=t.fill),this.life.load(t.life),this.name=t.name,this.particles=dt(t.particles,(t=>st({},t))),this.rate.load(t.rate),this.shape.load(t.shape),void 0!==t.position&&(this.position={},void 0!==t.position.x&&(this.position.x=S(t.position.x)),void 0!==t.position.y&&(this.position.y=S(t.position.y))),void 0!==t.spawnColor&&(void 0===this.spawnColor&&(this.spawnColor=new Se),this.spawnColor.load(t.spawnColor)),void 0!==t.startCount&&(this.startCount=t.startCount))}}function Qi(t,e){t.color?t.color.value=e:t.color={value:e}}class Ji{constructor(t,e,i,s,o){this.emitters=e,this.container=i,this._destroy=()=>{this._mutationObserver?.disconnect(),this._mutationObserver=void 0,this._resizeObserver?.disconnect(),this._resizeObserver=void 0,this.emitters.removeEmitter(this),this._engine.dispatchEvent("emitterDestroyed",{container:this.container,data:{emitter:this}})},this._prepareToDie=()=>{if(this._paused)return;const t=void 0!==this.options.life?.duration?C(this.options.life.duration):void 0;this.container.retina.reduceFactor&&(this._lifeCount>0||this._immortal)&&void 0!==t&&t>0&&(this._duration=1e3*t)},this._setColorAnimation=(t,e,i)=>{const s=this.container;if(!t.enable)return e;const o=M(t.offset),n=1e3*C(this.options.rate.delay)/s.retina.reduceFactor;return(e+C(t.speed??0)*s.fpsLimit/n+3.6*o)%i},this._engine=t,this._currentDuration=0,this._currentEmitDelay=0,this._currentSpawnDelay=0,this._initialPosition=o,s instanceof Zi?this.options=s:(this.options=new Zi,this.options.load(s)),this._spawnDelay=1e3*C(this.options.life.delay??0)/this.container.retina.reduceFactor,this.position=this._initialPosition??this._calcPosition(),this.name=this.options.name,this.fill=this.options.fill,this._firstSpawn=!this.options.life.wait,this._startParticlesAdded=!1;let n=st({},this.options.particles);if(n??={},n.move??={},n.move.direction??=this.options.direction,this.options.spawnColor&&(this.spawnColor=Rt(this.options.spawnColor)),this._paused=!this.options.autoPlay,this._particlesOptions=n,this._size=this._calcSize(),this.size=mt(this._size,this.container.canvas.size),this._lifeCount=this.options.life.count??-1,this._immortal=this._lifeCount<=0,this.options.domId){const t=document.getElementById(this.options.domId);t&&(this._mutationObserver=new MutationObserver((()=>{this.resize()})),this._resizeObserver=new ResizeObserver((()=>{this.resize()})),this._mutationObserver.observe(t,{attributes:!0,attributeFilter:["style","width","height"]}),this._resizeObserver.observe(t))}const a=this.options.shape,r=this._engine.emitterShapeManager?.getShapeGenerator(a.type);r&&(this._shape=r.generate(this.position,this.size,this.fill,a.options)),this._engine.dispatchEvent("emitterCreated",{container:i,data:{emitter:this}}),this.play()}externalPause(){this._paused=!0,this.pause()}externalPlay(){this._paused=!1,this.play()}async init(){await(this._shape?.init())}pause(){this._paused||delete this._emitDelay}play(){if(!this._paused&&this.container.retina.reduceFactor&&(this._lifeCount>0||this._immortal||!this.options.life.count)&&(this._firstSpawn||this._currentSpawnDelay>=(this._spawnDelay??0))){if(void 0===this._emitDelay){const t=C(this.options.rate.delay);this._emitDelay=1e3*t/this.container.retina.reduceFactor}(this._lifeCount>0||this._immortal)&&this._prepareToDie()}}resize(){const t=this._initialPosition;this.position=t&&tt(t,this.container.canvas.size,y.origin)?t:this._calcPosition(),this._size=this._calcSize(),this.size=mt(this._size,this.container.canvas.size),this._shape?.resize(this.position,this.size)}async update(t){this._paused||(this._firstSpawn&&(this._firstSpawn=!1,this._currentSpawnDelay=this._spawnDelay??0,this._currentEmitDelay=this._emitDelay??0),this._startParticlesAdded||(this._startParticlesAdded=!0,await this._emitParticles(this.options.startCount)),void 0!==this._duration&&(this._currentDuration+=t.value,this._currentDuration>=this._duration&&(this.pause(),void 0!==this._spawnDelay&&delete this._spawnDelay,this._immortal||this._lifeCount--,this._lifeCount>0||this._immortal?(this.position=this._calcPosition(),this._shape?.resize(this.position,this.size),this._spawnDelay=1e3*C(this.options.life.delay??0)/this.container.retina.reduceFactor):this._destroy(),this._currentDuration-=this._duration,delete this._duration)),void 0!==this._spawnDelay&&(this._currentSpawnDelay+=t.value,this._currentSpawnDelay>=this._spawnDelay&&(this._engine.dispatchEvent("emitterPlay",{container:this.container}),this.play(),this._currentSpawnDelay-=this._currentSpawnDelay,delete this._spawnDelay)),void 0!==this._emitDelay&&(this._currentEmitDelay+=t.value,this._currentEmitDelay>=this._emitDelay&&(this._emit(),this._currentEmitDelay-=this._emitDelay)))}_calcPosition(){if(this.options.domId){const t=this.container,e=document.getElementById(this.options.domId);if(e){const i=e.getBoundingClientRect();return{x:(i.x+i.width/2)*t.retina.pixelRatio,y:(i.y+i.height/2)*t.retina.pixelRatio}}}return F({size:this.container.canvas.size,position:this.options.position})}_calcSize(){const t=this.container;if(this.options.domId){const e=document.getElementById(this.options.domId);if(e){const i=e.getBoundingClientRect();return{width:i.width*t.retina.pixelRatio,height:i.height*t.retina.pixelRatio,mode:"precise"}}}return this.options.size??(()=>{const t=new Yi;return t.load({height:0,mode:"percent",width:0}),t})()}async _emit(){if(this._paused)return;const t=C(this.options.rate.quantity);await this._emitParticles(t)}async _emitParticles(t){const e=ut(this._particlesOptions);for(let i=0;ivoid 0===t||wt(t)?this.array[t||0]:this.array.find((e=>e.name===t)),e.addEmitter=async(t,e)=>this.addEmitter(t,e),e.removeEmitter=t=>{const i=e.getEmitter(t);i&&this.removeEmitter(i)},e.playEmitter=t=>{const i=e.getEmitter(t);i&&i.externalPlay()},e.pauseEmitter=t=>{const i=e.getEmitter(t);i&&i.externalPause()}}async addEmitter(t,e){const i=new Zi;i.load(t);const s=new Ji(this._engine,this,this.container,i,e);return await s.init(),this.array.push(s),s}handleClickMode(t){const e=this.emitters,i=this.interactivityEmitters;if("emitter"!==t)return;let s;if(i&&kt(i.value))if(i.value.length>0&&i.random.enable){s=[];const t=[];for(let e=0;e{this.addEmitter(t,n)}))}async init(){if(this.emitters=this.container.actualOptions.emitters,this.interactivityEmitters=this.container.actualOptions.interactivity.modes.emitters,this.emitters)if(kt(this.emitters))for(const t of this.emitters)await this.addEmitter(t);else await this.addEmitter(this.emitters)}pause(){for(const t of this.array)t.pause()}play(){for(const t of this.array)t.play()}removeEmitter(t){const e=this.array.indexOf(t);e>=0&&this.array.splice(e,1)}resize(){for(const t of this.array)t.resize()}stop(){this.array=[]}async update(t){for(const e of this.array)await e.update(t)}}const ts=new Map;class es{constructor(t){this._engine=t}addShapeGenerator(t,e){this.getShapeGenerator(t)||ts.set(t,e)}getShapeGenerator(t){return ts.get(t)}getSupportedShapeGenerators(){return ts.keys()}}class is{constructor(t,e,i,s){this.position=t,this.size=e,this.fill=i,this.options=s}resize(t,e){this.position=t,this.size=e}}class ss{constructor(t){this._engine=t,this.id="emitters"}getPlugin(t){return new Ki(this._engine,t)}loadOptions(t,e){if(!this.needsPlugin(t)&&!this.needsPlugin(e))return;e?.emitters&&(t.emitters=dt(e.emitters,(t=>{const e=new Zi;return e.load(t),e})));const i=e?.interactivity?.modes?.emitters;if(i)if(kt(i))t.interactivity.modes.emitters={random:{count:1,enable:!0},value:i.map((t=>{const e=new Zi;return e.load(t),e}))};else{const e=i;if(void 0!==e.value)if(kt(e.value))t.interactivity.modes.emitters={random:{count:e.random.count??1,enable:e.random.enable??!1},value:e.value.map((t=>{const e=new Zi;return e.load(t),e}))};else{const i=new Zi;i.load(e.value),t.interactivity.modes.emitters={random:{count:e.random.count??1,enable:e.random.enable??!1},value:i}}else{(t.interactivity.modes.emitters={random:{count:1,enable:!1},value:new Zi}).value.load(i)}}}needsPlugin(t){if(!t)return!1;const e=t.emitters;return kt(e)&&!!e.length||void 0!==e||!!t.interactivity?.events?.onClick?.mode&&Z("emitter",t.interactivity.events.onClick.mode)}}class os extends is{constructor(t,e,i,s){super(t,e,i,s)}async init(){}async randomPosition(){const t=this.size,e=this.fill,i=this.position,[s,o]=[t.width/2,t.height/2],n=((t,e)=>{const i=_()/4,s=Math.atan(e/t*Math.tan(2*Math.PI*i)),o=_();return o<.25?s:o<.5?Math.PI-s:o<.75?Math.PI+s:-s})(s,o),a=(h=n,(c=s)*(l=o)/Math.sqrt((l*Math.cos(h))**2+(c*Math.sin(h))**2)),r=e?a*Math.sqrt(_()):a;var c,l,h;return{position:{x:i.x+r*Math.cos(n),y:i.y+r*Math.sin(n)}}}}class ns{generate(t,e,i,s){return new os(t,e,i,s)}}function as(t,e){return t+e*(_()-.5)}class rs extends is{constructor(t,e,i,s){super(t,e,i,s)}async init(){}async randomPosition(){const t=this.fill,e=this.position,i=this.size;if(t)return{position:{x:as(e.x,i.width),y:as(e.y,i.height)}};{const t=i.width/2,s=i.height/2,o=Math.floor(4*_()),n=2*(_()-.5);switch(o){case 0:return{position:{x:e.x+n*t,y:e.y-s}};case 1:return{position:{x:e.x-t,y:e.y+n*s}};case 2:return{position:{x:e.x+n*t,y:e.y+s}};default:return{position:{x:e.x+t,y:e.y+n*s}}}}}}class cs{generate(t,e,i,s){return new rs(t,e,i,s)}}class ls{constructor(){this.delay=1,this.pauseOnStop=!1,this.quantity=1}load(t){t&&(void 0!==t.delay&&(this.delay=t.delay),void 0!==t.quantity&&(this.quantity=t.quantity),void 0!==t.particles&&(this.particles=st({},t.particles)),void 0!==t.pauseOnStop&&(this.pauseOnStop=t.pauseOnStop))}}const hs="trail";class ds extends Si{constructor(t){super(t),this._delay=0}clear(){}init(){}async interact(t){const e=this.container,{interactivity:i}=e;if(!e.retina.reduceFactor)return;const s=e.actualOptions.interactivity.modes.trail;if(!s)return;const o=1e3*s.delay/this.container.retina.reduceFactor;if(this._delay=.5?"darken":"enlighten";t.roll.alter={type:i,value:C("darken"===i?e.darken.value:e.enlighten.value)}}else e.darken.enable?t.roll.alter={type:"darken",value:C(e.darken.value)}:e.enlighten.enable&&(t.roll.alter={type:"enlighten",value:C(e.enlighten.value)});else t.roll={enable:!1,horizontal:!1,vertical:!1,angle:0,speed:0}}(t)}isEnabled(t){const e=t.options.roll;return!t.destroyed&&!t.spawning&&!!e?.enable}loadOptions(t,...e){t.roll||(t.roll=new ps);for(const i of e)t.roll.load(i?.roll)}update(t,e){this.isEnabled(t)&&function(t,e){const i=t.options.roll,s=t.roll;if(!s||!i?.enable)return;const o=s.speed*e.factor,n=2*Math.PI;s.angle+=o,s.angle>n&&(s.angle-=n)}(t,e)}}function vs(t,e,i,s,o,n){!function(t,e){const i=t.options,s=i.move.path;if(!s.enable)return;if(t.lastPathTime<=t.pathDelay)return void(t.lastPathTime+=e.value);const o=t.pathGenerator?.generate(t,e);o&&t.velocity.addTo(o);s.clamp&&(t.velocity.x=k(t.velocity.x,-1,1),t.velocity.y=k(t.velocity.y,-1,1));t.lastPathTime-=t.pathDelay}(t,n);const a=t.gravity,r=a?.enable&&a.inverse?-1:1;o&&i&&(t.velocity.x+=o*n.factor/(60*i)),a?.enable&&i&&(t.velocity.y+=r*(a.acceleration*n.factor)/(60*i));const c=t.moveDecay;t.velocity.multTo(c);const l=t.velocity.mult(i);a?.enable&&s>0&&(!a.inverse&&l.y>=0&&l.y>=s||a.inverse&&l.y<=0&&l.y<=-s)&&(l.y=r*s,i&&(t.velocity.y=l.y/i));const h=t.options.zIndex,d=(1-t.zIndexFactor)**h.velocityRate;l.multTo(d);const{position:u}=t;u.addTo(l),e.vibrate&&(u.x+=Math.sin(u.x*Math.cos(u.y)),u.y+=Math.cos(u.y*Math.sin(u.x)))}class ys{constructor(){this._initSpin=t=>{const e=t.container,i=t.options.move.spin;if(!i.enable)return;const s=i.position??{x:50,y:50},o={x:.01*s.x*e.canvas.size.width,y:.01*s.y*e.canvas.size.height},n=T(t.getPosition(),o),a=C(i.acceleration);t.retina.spinAcceleration=a*e.retina.pixelRatio,t.spin={center:o,direction:t.velocity.x>=0?"clockwise":"counter-clockwise",angle:t.velocity.angle,radius:n,acceleration:t.retina.spinAcceleration}}}init(t){const e=t.options.move.gravity;t.gravity={enable:e.enable,acceleration:C(e.acceleration),inverse:e.inverse},this._initSpin(t)}isEnabled(t){return!t.destroyed&&t.options.move.enable}move(t,e){const i=t.options,s=i.move;if(!s.enable)return;const o=t.container,n=o.retina.pixelRatio,a=function(t){return t.slow.inRange?t.slow.factor:1}(t),r=(t.retina.moveSpeed??=C(s.speed)*n)*o.retina.reduceFactor,c=t.retina.moveDrift??=C(t.options.move.drift)*n,l=O(i.size.value)*n,h=r*(s.size?t.getRadius()/l:1)*a*(e.factor||1)/2,d=t.retina.maxSpeed??o.retina.maxSpeed;s.spin.enable?function(t,e){const i=t.container;if(!t.spin)return;const s={x:"clockwise"===t.spin.direction?Math.cos:Math.sin,y:"clockwise"===t.spin.direction?Math.sin:Math.cos};t.position.x=t.spin.center.x+t.spin.radius*s.x(t.spin.angle),t.position.y=t.spin.center.y+t.spin.radius*s.y(t.spin.angle),t.spin.radius+=t.spin.acceleration;const o=Math.max(i.canvas.size.width,i.canvas.size.height),n=.5*o;t.spin.radius>n?(t.spin.radius=n,t.spin.acceleration*=-1):t.spin.radius<0&&(t.spin.radius=0,t.spin.acceleration*=-1),t.spin.angle+=.01*e*(1-t.spin.radius/o)}(t,h):vs(t,s,h,d,c,e),function(t){const e=t.initialPosition,{dx:i,dy:s}=D(e,t.position),o=Math.abs(i),n=Math.abs(s),{maxDistance:a}=t.retina,r=a.horizontal,c=a.vertical;if(r||c)if((r&&o>=r||c&&n>=c)&&!t.misplaced)t.misplaced=!!r&&o>r||!!c&&n>c,r&&(t.velocity.x=.5*t.velocity.y-t.velocity.x),c&&(t.velocity.y=.5*t.velocity.x-t.velocity.y);else if((!r||oe.x&&s.x>0)&&(s.x*=-_()),c&&(i.ye.y&&s.y>0)&&(s.y*=-_())}}(t)}}class ms{draw(t){const{context:e,particle:i,radius:s}=t;i.circleRange||(i.circleRange={min:0,max:2*Math.PI});const o=i.circleRange;e.arc(0,0,s,o.min,o.max,!1)}getSidesCount(){return 12}particleInit(t,e){const i=e.shapeData,s=i?.angle??{max:360,min:0};e.circleRange=_t(s)?{min:s.min*Math.PI/180,max:s.max*Math.PI/180}:{min:0,max:s*Math.PI/180}}}function gs(t,e,i,s,o){if(!e||!i.enable||(e.maxLoops??0)>0&&(e.loops??0)>(e.maxLoops??0))return;if(e.time||(e.time=0),(e.delayTime??0)>0&&e.time<(e.delayTime??0)&&(e.time+=t.value),(e.delayTime??0)>0&&e.time<(e.delayTime??0))return;const n=M(i.offset),a=(e.velocity??0)*t.factor+3.6*n,r=e.decay??1;o&&"increasing"!==e.status?(e.value-=a,e.value<0&&(e.loops||(e.loops=0),e.loops++,e.status="increasing",e.value+=e.value)):(e.value+=a,e.value>s&&(e.loops||(e.loops=0),e.loops++,o&&(e.status="decreasing",e.value-=e.value%s))),e.velocity&&1!==r&&(e.velocity*=r),e.value>s&&(e.value%=s)}class bs{constructor(t){this.container=t}init(t){const e=Rt(t.options.color,t.id,t.options.reduceDuplicates);e&&(t.color=jt(e,t.options.color.animation,this.container.retina.reduceFactor))}isEnabled(t){const{h:e,s:i,l:s}=t.options.color.animation,{color:o}=t;return!t.destroyed&&!t.spawning&&(void 0!==o?.h.value&&e.enable||void 0!==o?.s.value&&i.enable||void 0!==o?.l.value&&s.enable)}update(t,e){!function(t,e){const{h:i,s,l:o}=t.options.color.animation,{color:n}=t;if(!n)return;const{h:a,s:r,l:c}=n;a&&gs(e,a,i,360,!1),r&&gs(e,r,s,100,!0),c&&gs(e,c,o,100,!0)}(t,e)}}class ws{constructor(t){this.container=t}init(t){const e=t.options.opacity;t.opacity=ft(e,1);const i=e.animation;i.enable&&(t.opacity.velocity=C(i.speed)/100*this.container.retina.reduceFactor,i.sync||(t.opacity.velocity*=_()))}isEnabled(t){return!t.destroyed&&!t.spawning&&!!t.opacity&&t.opacity.enable&&((t.opacity.maxLoops??0)<=0||(t.opacity.maxLoops??0)>0&&(t.opacity.loops??0)<(t.opacity.maxLoops??0))}reset(t){t.opacity&&(t.opacity.time=0,t.opacity.loops=0)}update(t,e){this.isEnabled(t)&&function(t,e){const i=t.opacity;if(t.destroyed||!i?.enable||(i.maxLoops??0)>0&&(i.loops??0)>(i.maxLoops??0))return;const s=i.min,o=i.max,n=i.decay??1;if(i.time||(i.time=0),(i.delayTime??0)>0&&i.time<(i.delayTime??0)&&(i.time+=e.value),!((i.delayTime??0)>0&&i.time<(i.delayTime??0))){switch(i.status){case"increasing":i.value>=o?(i.status="decreasing",i.loops||(i.loops=0),i.loops++):i.value+=(i.velocity??0)*e.factor;break;case"decreasing":i.value<=s?(i.status="increasing",i.loops||(i.loops=0),i.loops++):i.value-=(i.velocity??0)*e.factor}i.velocity&&1!==i.decay&&(i.velocity*=n),function(t,e,i,s){switch(t.options.opacity.animation.destroy){case"max":e>=s&&t.destroy();break;case"min":e<=i&&t.destroy()}}(t,i.value,s,o),t.destroyed||(i.value=k(i.value,s,o))}}(t,e)}}class xs{constructor(t){this.container=t,this.modes=["bounce","bounce-vertical","bounce-horizontal","bounceVertical","bounceHorizontal","split"]}update(t,e,i,s){if(!this.modes.includes(s))return;const o=this.container;let n=!1;for(const[,s]of o.plugins)if(void 0!==s.particleBounce&&(n=s.particleBounce(t,i,e)),n)break;if(n)return;const a=t.getPosition(),r=t.offset,c=t.getRadius(),l=it(a,c),h=o.canvas.size;!function(t){if("bounce"!==t.outMode&&"bounce-horizontal"!==t.outMode&&"bounceHorizontal"!==t.outMode&&"split"!==t.outMode||"left"!==t.direction&&"right"!==t.direction)return;t.bounds.right<0&&"left"===t.direction?t.particle.position.x=t.size+t.offset.x:t.bounds.left>t.canvasSize.width&&"right"===t.direction&&(t.particle.position.x=t.canvasSize.width-t.size-t.offset.x);const e=t.particle.velocity.x;let i=!1;if("right"===t.direction&&t.bounds.right>=t.canvasSize.width&&e>0||"left"===t.direction&&t.bounds.left<=0&&e<0){const e=C(t.particle.options.bounce.horizontal.value);t.particle.velocity.x*=-e,i=!0}if(!i)return;const s=t.offset.x+t.size;t.bounds.right>=t.canvasSize.width&&"right"===t.direction?t.particle.position.x=t.canvasSize.width-s:t.bounds.left<=0&&"left"===t.direction&&(t.particle.position.x=s),"split"===t.outMode&&t.particle.destroy()}({particle:t,outMode:s,direction:e,bounds:l,canvasSize:h,offset:r,size:c}),function(t){if("bounce"!==t.outMode&&"bounce-vertical"!==t.outMode&&"bounceVertical"!==t.outMode&&"split"!==t.outMode||"bottom"!==t.direction&&"top"!==t.direction)return;t.bounds.bottom<0&&"top"===t.direction?t.particle.position.y=t.size+t.offset.y:t.bounds.top>t.canvasSize.height&&"bottom"===t.direction&&(t.particle.position.y=t.canvasSize.height-t.size-t.offset.y);const e=t.particle.velocity.y;let i=!1;if("bottom"===t.direction&&t.bounds.bottom>=t.canvasSize.height&&e>0||"top"===t.direction&&t.bounds.top<=0&&e<0){const e=C(t.particle.options.bounce.vertical.value);t.particle.velocity.y*=-e,i=!0}if(!i)return;const s=t.offset.y+t.size;t.bounds.bottom>=t.canvasSize.height&&"bottom"===t.direction?t.particle.position.y=t.canvasSize.height-s:t.bounds.top<=0&&"top"===t.direction&&(t.particle.position.y=s),"split"===t.outMode&&t.particle.destroy()}({particle:t,outMode:s,direction:e,bounds:l,canvasSize:h,offset:r,size:c})}}class _s{constructor(t){this.container=t,this.modes=["destroy"]}update(t,e,i,s){if(!this.modes.includes(s))return;const o=this.container;switch(t.outType){case"normal":case"outside":if(tt(t.position,o.canvas.size,y.origin,t.getRadius(),e))return;break;case"inside":{const{dx:e,dy:i}=D(t.position,t.moveCenter),{x:s,y:o}=t.velocity;if(s<0&&e>t.moveCenter.radius||o<0&&i>t.moveCenter.radius||s>=0&&e<-t.moveCenter.radius||o>=0&&i<-t.moveCenter.radius)return;break}}o.particles.remove(t,void 0,!0)}}class ks{constructor(t){this.container=t,this.modes=["none"]}update(t,e,i,s){if(!this.modes.includes(s))return;if(t.options.move.distance.horizontal&&("left"===e||"right"===e)||t.options.move.distance.vertical&&("top"===e||"bottom"===e))return;const o=t.options.move.gravity,n=this.container,a=n.canvas.size,r=t.getRadius();if(o.enable){const i=t.position;(!o.inverse&&i.y>a.height+r&&"bottom"===e||o.inverse&&i.y<-r&&"top"===e)&&n.particles.remove(t)}else{if(t.velocity.y>0&&t.position.y<=a.height+r||t.velocity.y<0&&t.position.y>=-r||t.velocity.x>0&&t.position.x<=a.width+r||t.velocity.x<0&&t.position.x>=-r)return;tt(t.position,n.canvas.size,y.origin,r,e)||n.particles.remove(t)}}}class zs{constructor(t){this.container=t,this.modes=["out"]}update(t,e,i,s){if(!this.modes.includes(s))return;const o=this.container;switch(t.outType){case"inside":{const{x:e,y:i}=t.velocity,s=y.origin;s.length=t.moveCenter.radius,s.angle=t.velocity.angle+Math.PI,s.addTo(y.create(t.moveCenter));const{dx:n,dy:a}=D(t.position,s);if(e<=0&&n>=0||i<=0&&a>=0||e>=0&&n<=0||i>=0&&a<=0)return;t.position.x=Math.floor(M({min:0,max:o.canvas.size.width})),t.position.y=Math.floor(M({min:0,max:o.canvas.size.height}));const{dx:r,dy:c}=D(t.position,t.moveCenter);t.direction=Math.atan2(-c,-r),t.velocity.angle=t.direction;break}default:if(tt(t.position,o.canvas.size,y.origin,t.getRadius(),e))return;switch(t.outType){case"outside":{t.position.x=Math.floor(M({min:-t.moveCenter.radius,max:t.moveCenter.radius}))+t.moveCenter.x,t.position.y=Math.floor(M({min:-t.moveCenter.radius,max:t.moveCenter.radius}))+t.moveCenter.y;const{dx:e,dy:i}=D(t.position,t.moveCenter);t.moveCenter.radius&&(t.direction=Math.atan2(i,e),t.velocity.angle=t.direction);break}case"normal":{const i=t.options.move.warp,s=o.canvas.size,n={bottom:s.height+t.getRadius()+t.offset.y,left:-t.getRadius()-t.offset.x,right:s.width+t.getRadius()+t.offset.x,top:-t.getRadius()-t.offset.y},a=t.getRadius(),r=it(t.position,a);"right"===e&&r.left>s.width+t.offset.x?(t.position.x=n.left,t.initialPosition.x=t.position.x,i||(t.position.y=_()*s.height,t.initialPosition.y=t.position.y)):"left"===e&&r.right<-t.offset.x&&(t.position.x=n.right,t.initialPosition.x=t.position.x,i||(t.position.y=_()*s.height,t.initialPosition.y=t.position.y)),"bottom"===e&&r.top>s.height+t.offset.y?(i||(t.position.x=_()*s.width,t.initialPosition.x=t.position.x),t.position.y=n.top,t.initialPosition.y=t.position.y):"top"===e&&r.bottom<-t.offset.y&&(i||(t.position.x=_()*s.width,t.initialPosition.x=t.position.x),t.position.y=n.bottom,t.initialPosition.y=t.position.y);break}}}}}class Ms{constructor(t){this.container=t,this._updateOutMode=(t,e,i,s)=>{for(const o of this.updaters)o.update(t,s,e,i)},this.updaters=[new xs(t),new _s(t),new zs(t),new ks(t)]}init(){}isEnabled(t){return!t.destroyed&&!t.spawning}update(t,e){const i=t.options.move.outModes;this._updateOutMode(t,e,i.bottom??i.default,"bottom"),this._updateOutMode(t,e,i.left??i.default,"left"),this._updateOutMode(t,e,i.right??i.default,"right"),this._updateOutMode(t,e,i.top??i.default,"top")}}class Cs{init(t){const e=t.container,i=t.options.size.animation;i.enable&&(t.size.velocity=(t.retina.sizeAnimationSpeed??e.retina.sizeAnimationSpeed)/100*e.retina.reduceFactor,i.sync||(t.size.velocity*=_()))}isEnabled(t){return!t.destroyed&&!t.spawning&&t.size.enable&&((t.size.maxLoops??0)<=0||(t.size.maxLoops??0)>0&&(t.size.loops??0)<(t.size.maxLoops??0))}reset(t){t.size.loops=0}update(t,e){this.isEnabled(t)&&function(t,e){const i=t.size;if(t.destroyed||!i||!i.enable||(i.maxLoops??0)>0&&(i.loops??0)>(i.maxLoops??0))return;const s=(i.velocity??0)*e.factor,o=i.min,n=i.max,a=i.decay??1;if(i.time||(i.time=0),(i.delayTime??0)>0&&i.time<(i.delayTime??0)&&(i.time+=e.value),!((i.delayTime??0)>0&&i.time<(i.delayTime??0))){switch(i.status){case"increasing":i.value>=n?(i.status="decreasing",i.loops||(i.loops=0),i.loops++):i.value+=s;break;case"decreasing":i.value<=o?(i.status="increasing",i.loops||(i.loops=0),i.loops++):i.value-=s}i.velocity&&1!==a&&(i.velocity*=a),function(t,e,i,s){switch(t.options.size.animation.destroy){case"max":e>=s&&t.destroy();break;case"min":e<=i&&t.destroy()}}(t,i.value,o,n),t.destroyed||(i.value=k(i.value,o,n))}}(t,e)}}async function Ps(t,e=!0){await async function(t,e=!0){await t.addMover("base",(()=>new ys),e)}(t,!1),await async function(t,e=!0){await t.addShape("circle",new ms,e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("color",(t=>new bs(t)),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("opacity",(t=>new ws(t)),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("outModes",(t=>new Ms(t)),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("size",(()=>new Cs),e)}(t,!1),await t.refresh(e)}const Os=["emoji"],Ss='"Twemoji Mozilla", Apple Color Emoji, "Segoe UI Emoji", "Noto Color Emoji", "EmojiOne Color"';class Ds{constructor(){this._emojiShapeDict=new Map}destroy(){for(const[,t]of this._emojiShapeDict)t instanceof ImageBitmap&&t?.close()}draw(t){const{context:e,particle:i,radius:s,opacity:o}=t,n=i.emojiData;n&&(e.globalAlpha=o,e.drawImage(n,-s,-s,2*s,2*s),e.globalAlpha=1)}async init(t){const e=t.actualOptions;if(Os.find((t=>Z(t,e.particles.shape.type)))){const t=[Q(Ss)],i=Os.map((t=>e.particles.shape.options[t])).find((t=>!!t));i&&dt(i,(e=>{e.font&&t.push(Q(e.font))})),await Promise.all(t)}}particleDestroy(t){delete t.emojiData}particleInit(t,e){if(!e.emojiData){const t=e.shapeData;if(!t?.value)return;const i=ut(t.value,e.randomIndexData),s=t.font??Ss;if(!i)return;const o=`${i}_${s}`,n=this._emojiShapeDict.get(o);if(n)return void(e.emojiData=n);const a=2*O(e.size.value);let r;if("undefined"!=typeof OffscreenCanvas){const t=new OffscreenCanvas(a,a),o=t.getContext("2d");if(!o)return;o.font=`400 ${2*O(e.size.value)}px ${s}`,o.textBaseline="middle",o.textAlign="center",o.fillText(i,O(e.size.value),O(e.size.value)),r=t.transferToImageBitmap()}else{const t=document.createElement("canvas");t.width=a,t.height=a;const o=t.getContext("2d");if(!o)return;o.font=`400 ${2*O(e.size.value)}px ${s}`,o.textBaseline="middle",o.textAlign="center",o.fillText(i,O(e.size.value),O(e.size.value)),r=t}this._emojiShapeDict.set(o,r),e.emojiData=r}}}class Ts{constructor(){this.distance=200,this.duration=.4,this.easing="ease-out-quad",this.factor=1,this.maxSpeed=50,this.speed=1}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),void 0!==t.duration&&(this.duration=t.duration),void 0!==t.easing&&(this.easing=t.easing),void 0!==t.factor&&(this.factor=t.factor),void 0!==t.maxSpeed&&(this.maxSpeed=t.maxSpeed),void 0!==t.speed&&(this.speed=t.speed))}}const Rs="attract";class Es extends Si{constructor(t,e){super(e),this._clickAttract=()=>{const t=this.container;t.attract||(t.attract={particles:[]});const{attract:e}=t;if(e.finish||(e.count||(e.count=0),e.count++,e.count===t.particles.count&&(e.finish=!0)),e.clicking){const e=t.interactivity.mouse.clickPosition,i=t.retina.attractModeDistance;if(!i||i<0||!e)return;this._processAttract(e,i,new yi(e.x,e.y,i))}else!1===e.clicking&&(e.particles=[])},this._hoverAttract=()=>{const t=this.container,e=t.interactivity.mouse.position,i=t.retina.attractModeDistance;!i||i<0||!e||this._processAttract(e,i,new yi(e.x,e.y,i))},this._processAttract=(t,e,i)=>{const s=this.container,o=s.actualOptions.interactivity.modes.attract;if(!o)return;const n=s.particles.quadTree.query(i,(t=>this.isEnabled(t)));for(const i of n){const{dx:s,dy:n,distance:a}=D(i.position,t),r=o.speed*o.factor,c=k(w(o.easing)(1-a/e)*r,0,o.maxSpeed),l=y.create(0===a?r:s/a*c,0===a?r:n/a*c);i.position.subFrom(l)}},this._engine=t,e.attract||(e.attract={particles:[]}),this.handleClickMode=t=>{const i=this.container.actualOptions.interactivity.modes.attract;if(i&&t===Rs){e.attract||(e.attract={particles:[]}),e.attract.clicking=!0,e.attract.count=0;for(const t of e.attract.particles)this.isEnabled(t)&&t.velocity.setTo(t.initialVelocity);e.attract.particles=[],e.attract.finish=!1,setTimeout((()=>{e.destroyed||(e.attract||(e.attract={particles:[]}),e.attract.clicking=!1)}),1e3*i.duration)}}}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.attract;e&&(t.retina.attractModeDistance=e.distance*t.retina.pixelRatio)}async interact(){const t=this.container,e=t.actualOptions,i=t.interactivity.status===r,s=e.interactivity.events,o=s.onHover.enable,n=s.onHover.mode,a=s.onClick.enable,c=s.onClick.mode;i&&o&&Z(Rs,n)?this._hoverAttract():a&&Z(Rs,c)&&this._clickAttract()}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events;if(!(s.position&&o.onHover.enable||s.clickPosition&&o.onClick.enable))return!1;const n=o.onHover.mode,a=o.onClick.mode;return Z(Rs,n)||Z(Rs,a)}loadModeOptions(t,...e){t.attract||(t.attract=new Ts);for(const i of e)t.attract.load(i?.attract)}reset(){}}class Is{constructor(){this.distance=200}load(t){t&&void 0!==t.distance&&(this.distance=t.distance)}}const Ls="bounce";class As extends Si{constructor(t){super(t),this._processBounce=(t,e,i)=>{const s=this.container.particles.quadTree.query(i,(t=>this.isEnabled(t)));for(const o of s)i instanceof yi?lt(ct(o),{position:t,radius:e,mass:e**2*Math.PI/2,velocity:y.origin,factor:y.origin}):i instanceof vi&&ht(o,it(t,e))},this._processMouseBounce=()=>{const t=this.container,e=10*t.retina.pixelRatio,i=t.interactivity.mouse.position,s=t.retina.bounceModeDistance;!s||s<0||!i||this._processBounce(i,s,new yi(i.x,i.y,s+e))},this._singleSelectorBounce=(t,e)=>{const i=this.container,s=document.querySelectorAll(t);s.length&&s.forEach((t=>{const s=t,o=i.retina.pixelRatio,n={x:(s.offsetLeft+s.offsetWidth/2)*o,y:(s.offsetTop+s.offsetHeight/2)*o},a=s.offsetWidth/2*o,r=10*o,c="circle"===e.type?new yi(n.x,n.y,a+r):new vi(s.offsetLeft*o-r,s.offsetTop*o-r,s.offsetWidth*o+2*r,s.offsetHeight*o+2*r);this._processBounce(n,a,c)}))}}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.bounce;e&&(t.retina.bounceModeDistance=e.distance*t.retina.pixelRatio)}async interact(){const t=this.container,e=t.actualOptions.interactivity.events,i=t.interactivity.status===r,s=e.onHover.enable,o=e.onHover.mode,n=e.onDiv;i&&s&&Z(Ls,o)?this._processMouseBounce():nt(Ls,n,((t,e)=>this._singleSelectorBounce(t,e)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events,n=o.onDiv;return s.position&&o.onHover.enable&&Z(Ls,o.onHover.mode)||ot(Ls,n)}loadModeOptions(t,...e){t.bounce||(t.bounce=new Is);for(const i of e)t.bounce.load(i?.bounce)}reset(){}}class Fs{constructor(){this.distance=200,this.duration=.4,this.mix=!1}load(t){if(t){if(void 0!==t.distance&&(this.distance=t.distance),void 0!==t.duration&&(this.duration=t.duration),void 0!==t.mix&&(this.mix=t.mix),void 0!==t.opacity&&(this.opacity=t.opacity),void 0!==t.color){const e=kt(this.color)?void 0:this.color;this.color=dt(t.color,(t=>ce.create(e,t)))}void 0!==t.size&&(this.size=t.size)}}}class Bs extends Fs{constructor(){super(),this.selectors=[]}load(t){super.load(t),t&&void 0!==t.selectors&&(this.selectors=t.selectors)}}class qs extends Fs{load(t){super.load(t),t&&(this.divs=dt(t.divs,(t=>{const e=new Bs;return e.load(t),e})))}}function Hs(t,e,i,s){if(e>=i){return k(t+(e-i)*s,t,e)}if(e{const t=this.container,e=t.actualOptions,i=t.interactivity.mouse.clickPosition,s=e.interactivity.modes.bubble;if(!s||!i)return;t.bubble||(t.bubble={});const o=t.retina.bubbleModeDistance;if(!o||o<0)return;const n=t.particles.quadTree.queryCircle(i,o,(t=>this.isEnabled(t))),{bubble:a}=t;for(const e of n){if(!a.clicking)continue;e.bubble.inRange=!a.durationEnd;const n=T(e.getPosition(),i),r=((new Date).getTime()-(t.interactivity.mouse.clickTime||0))/1e3;r>s.duration&&(a.durationEnd=!0),r>2*s.duration&&(a.clicking=!1,a.durationEnd=!1);const c={bubbleObj:{optValue:t.retina.bubbleModeSize,value:e.bubble.radius},particlesObj:{optValue:O(e.options.size.value)*t.retina.pixelRatio,value:e.size.value},type:"size"};this._process(e,n,r,c);const l={bubbleObj:{optValue:s.opacity,value:e.bubble.opacity},particlesObj:{optValue:O(e.options.opacity.value),value:e.opacity?.value??1},type:"opacity"};this._process(e,n,r,l),!a.durationEnd&&n<=o?this._hoverBubbleColor(e,n):delete e.bubble.color}},this._hoverBubble=()=>{const t=this.container,e=t.interactivity.mouse.position,i=t.retina.bubbleModeDistance;if(!i||i<0||void 0===e)return;const s=t.particles.quadTree.queryCircle(e,i,(t=>this.isEnabled(t)));for(const o of s){o.bubble.inRange=!0;const s=T(o.getPosition(),e),a=1-s/i;s<=i?a>=0&&t.interactivity.status===r&&(this._hoverBubbleSize(o,a),this._hoverBubbleOpacity(o,a),this._hoverBubbleColor(o,a)):this.reset(o),t.interactivity.status===n&&this.reset(o)}},this._hoverBubbleColor=(t,e,i)=>{const s=this.container.actualOptions,o=i??s.interactivity.modes.bubble;if(o){if(!t.bubble.finalColor){const e=o.color;if(!e)return;const i=ut(e);t.bubble.finalColor=Rt(i)}if(t.bubble.finalColor)if(o.mix){t.bubble.color=void 0;const i=t.getFillColor();t.bubble.color=i?Et(Vt(i,t.bubble.finalColor,1-e,e)):t.bubble.finalColor}else t.bubble.color=t.bubble.finalColor}},this._hoverBubbleOpacity=(t,e,i)=>{const s=this.container.actualOptions,o=i?.opacity??s.interactivity.modes.bubble?.opacity;if(!o)return;const n=t.options.opacity.value,a=Hs(t.opacity?.value??1,o,O(n),e);void 0!==a&&(t.bubble.opacity=a)},this._hoverBubbleSize=(t,e,i)=>{const s=this.container,o=i?.size?i.size*s.retina.pixelRatio:s.retina.bubbleModeSize;if(void 0===o)return;const n=O(t.options.size.value)*s.retina.pixelRatio,a=Hs(t.size.value,o,n,e);void 0!==a&&(t.bubble.radius=a)},this._process=(t,e,i,s)=>{const o=this.container,n=s.bubbleObj.optValue,a=o.actualOptions.interactivity.modes.bubble;if(!a||void 0===n)return;const r=a.duration,c=o.retina.bubbleModeDistance,l=s.particlesObj.optValue,h=s.bubbleObj.value,d=s.particlesObj.value||0,u=s.type;if(c&&!(c<0)&&n!==l)if(o.bubble||(o.bubble={}),o.bubble.durationEnd)h&&("size"===u&&delete t.bubble.radius,"opacity"===u&&delete t.bubble.opacity);else if(e<=c){if((h??d)!==n){const e=d-i*(d-n)/r;"size"===u&&(t.bubble.radius=e),"opacity"===u&&(t.bubble.opacity=e)}}else"size"===u&&delete t.bubble.radius,"opacity"===u&&delete t.bubble.opacity},this._singleSelectorHover=(t,e,i)=>{const s=this.container,o=document.querySelectorAll(e),n=s.actualOptions.interactivity.modes.bubble;n&&o.length&&o.forEach((e=>{const o=e,a=s.retina.pixelRatio,r={x:(o.offsetLeft+o.offsetWidth/2)*a,y:(o.offsetTop+o.offsetHeight/2)*a},c=o.offsetWidth/2*a,l="circle"===i.type?new yi(r.x,r.y,c):new vi(o.offsetLeft*a,o.offsetTop*a,o.offsetWidth*a,o.offsetHeight*a),h=s.particles.quadTree.query(l,(t=>this.isEnabled(t)));for(const e of h){if(!l.contains(e.getPosition()))continue;e.bubble.inRange=!0;const i=rt(n.divs,o);e.bubble.div&&e.bubble.div===o||(this.clear(e,t,!0),e.bubble.div=o),this._hoverBubbleSize(e,1,i),this._hoverBubbleOpacity(e,1,i),this._hoverBubbleColor(e,1,i)}}))},t.bubble||(t.bubble={}),this.handleClickMode=e=>{e===Vs&&(t.bubble||(t.bubble={}),t.bubble.clicking=!0)}}clear(t,e,i){t.bubble.inRange&&!i||(delete t.bubble.div,delete t.bubble.opacity,delete t.bubble.radius,delete t.bubble.color)}init(){const t=this.container,e=t.actualOptions.interactivity.modes.bubble;e&&(t.retina.bubbleModeDistance=e.distance*t.retina.pixelRatio,void 0!==e.size&&(t.retina.bubbleModeSize=e.size*t.retina.pixelRatio))}async interact(t){const e=this.container.actualOptions.interactivity.events,i=e.onHover,s=e.onClick,o=i.enable,n=i.mode,a=s.enable,r=s.mode,c=e.onDiv;o&&Z(Vs,n)?this._hoverBubble():a&&Z(Vs,r)?this._clickBubble():nt(Vs,c,((e,i)=>this._singleSelectorHover(t,e,i)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events,{onClick:n,onDiv:a,onHover:r}=o,c=ot(Vs,a);return!!(c||r.enable&&s.position||n.enable&&s.clickPosition)&&(Z(Vs,r.mode)||Z(Vs,n.mode)||c)}loadModeOptions(t,...e){t.bubble||(t.bubble=new qs);for(const i of e)t.bubble.load(i?.bubble)}reset(t){t.bubble.inRange=!1}}class Ws{constructor(){this.opacity=.5}load(t){t&&void 0!==t.opacity&&(this.opacity=t.opacity)}}class $s{constructor(){this.distance=80,this.links=new Ws,this.radius=60}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),this.links.load(t.links),void 0!==t.radius&&(this.radius=t.radius))}}function js(t,e,i,s){const o=t.actualOptions.interactivity.modes.connect;if(o)return function(t,e,i,s){const o=Math.floor(i.getRadius()/e.getRadius()),n=e.getFillColor(),a=i.getFillColor();if(!n||!a)return;const r=e.getPosition(),c=i.getPosition(),l=Vt(n,a,e.getRadius(),i.getRadius()),h=t.createLinearGradient(r.x,r.y,c.x,c.y);return h.addColorStop(0,Ht(n,s)),h.addColorStop(o>1?1:o,qt(l,s)),h.addColorStop(1,Ht(a,s)),h}(e,i,s,o.links.opacity)}function Gs(t,e,i){t.canvas.draw((s=>{const o=js(t,s,e,i);if(!o)return;const n=e.getPosition(),a=i.getPosition();!function(t,e,i,s,o){Nt(t,s,o),t.lineWidth=e,t.strokeStyle=i,t.stroke()}(s,e.retina.linksWidth??0,o,n,a)}))}class Ns extends Si{constructor(t){super(t)}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.connect;e&&(t.retina.connectModeDistance=e.distance*t.retina.pixelRatio,t.retina.connectModeRadius=e.radius*t.retina.pixelRatio)}async interact(){const t=this.container;if(t.actualOptions.interactivity.events.onHover.enable&&"pointermove"===t.interactivity.status){const e=t.interactivity.mouse.position;if(!t.retina.connectModeDistance||t.retina.connectModeDistance<0||!t.retina.connectModeRadius||t.retina.connectModeRadius<0||!e)return;const i=Math.abs(t.retina.connectModeRadius),s=t.particles.quadTree.queryCircle(e,i,(t=>this.isEnabled(t)));let o=0;for(const e of s){const i=e.getPosition();for(const n of s.slice(o+1)){const s=n.getPosition(),o=Math.abs(t.retina.connectModeDistance),a=Math.abs(i.x-s.x),r=Math.abs(i.y-s.y);a{const n=e.getPosition();!function(t,e,i,s,o,n){Nt(t,i,s),t.strokeStyle=qt(o,n),t.lineWidth=e,t.stroke()}(t,e.retina.linksWidth??0,n,o,i,s)}))}class Qs extends Si{constructor(t){super(t)}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.grab;e&&(t.retina.grabModeDistance=e.distance*t.retina.pixelRatio)}async interact(){const t=this.container,e=t.actualOptions.interactivity;if(!e.modes.grab||!e.events.onHover.enable||t.interactivity.status!==r)return;const i=t.interactivity.mouse.position;if(!i)return;const s=t.retina.grabModeDistance;if(!s||s<0)return;const o=t.particles.quadTree.queryCircle(i,s,(t=>this.isEnabled(t)));for(const n of o){const o=T(n.getPosition(),i);if(o>s)continue;const a=e.modes.grab.links,r=a.opacity,c=r-o*r/s;if(c<=0)continue;const l=a.color??n.options.links?.color;if(!t.particles.grabLineColor&&l){const i=e.modes.grab.links;t.particles.grabLineColor=Wt(l,i.blink,i.consent)}const h=Ut(n,void 0,t.particles.grabLineColor);h&&Zs(t,n,h,c,i)}}isEnabled(t){const e=this.container,i=e.interactivity.mouse,s=(t?.interactivity??e.actualOptions.interactivity).events;return s.onHover.enable&&!!i.position&&Z("grab",s.onHover.mode)}loadModeOptions(t,...e){t.grab||(t.grab=new Ys);for(const i of e)t.grab.load(i?.grab)}reset(){}}class Js extends Si{constructor(t){super(t),this.handleClickMode=t=>{if("pause"!==t)return;const e=this.container;e.getAnimationStatus()?e.pause():e.play()}}clear(){}init(){}async interact(){}isEnabled(){return!0}reset(){}}class Ks{constructor(){this.default=!0,this.groups=[],this.quantity=4}load(t){if(!t)return;void 0!==t.default&&(this.default=t.default),void 0!==t.groups&&(this.groups=t.groups.map((t=>t))),this.groups.length||(this.default=!0);const e=t.quantity;void 0!==e&&(this.quantity=S(e))}}class to extends Si{constructor(t){super(t),this.handleClickMode=t=>{if("push"!==t)return;const e=this.container,i=e.actualOptions.interactivity.modes.push;if(!i)return;const s=C(i.quantity);if(s<=0)return;const o=K([void 0,...i.groups]),n=void 0!==o?e.actualOptions.particles.groups[o]:void 0;e.particles.push(s,e.interactivity.mouse,n,o)}}clear(){}init(){}async interact(){}isEnabled(){return!0}loadModeOptions(t,...e){t.push||(t.push=new Ks);for(const i of e)t.push.load(i?.push)}reset(){}}class eo{constructor(){this.quantity=2}load(t){if(!t)return;const e=t.quantity;void 0!==e&&(this.quantity=S(e))}}class io extends Si{constructor(t){super(t),this.handleClickMode=t=>{const e=this.container,i=e.actualOptions;if(!i.interactivity.modes.remove||"remove"!==t)return;const s=C(i.interactivity.modes.remove.quantity);e.particles.removeQuantity(s)}}clear(){}init(){}async interact(){}isEnabled(){return!0}loadModeOptions(t,...e){t.remove||(t.remove=new eo);for(const i of e)t.remove.load(i?.remove)}reset(){}}class so{constructor(){this.distance=200,this.duration=.4,this.factor=100,this.speed=1,this.maxSpeed=50,this.easing="ease-out-quad"}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),void 0!==t.duration&&(this.duration=t.duration),void 0!==t.easing&&(this.easing=t.easing),void 0!==t.factor&&(this.factor=t.factor),void 0!==t.speed&&(this.speed=t.speed),void 0!==t.maxSpeed&&(this.maxSpeed=t.maxSpeed))}}class oo extends so{constructor(){super(),this.selectors=[]}load(t){super.load(t),t&&void 0!==t.selectors&&(this.selectors=t.selectors)}}class no extends so{load(t){super.load(t),t&&(this.divs=dt(t.divs,(t=>{const e=new oo;return e.load(t),e})))}}const ao="repulse";class ro extends Si{constructor(t,e){super(e),this._clickRepulse=()=>{const t=this.container,e=t.actualOptions.interactivity.modes.repulse;if(!e)return;const i=t.repulse||{particles:[]};if(i.finish||(i.count||(i.count=0),i.count++,i.count===t.particles.count&&(i.finish=!0)),i.clicking){const s=t.retina.repulseModeDistance;if(!s||s<0)return;const o=Math.pow(s/6,3),n=t.interactivity.mouse.clickPosition;if(void 0===n)return;const a=new yi(n.x,n.y,o),r=t.particles.quadTree.query(a,(t=>this.isEnabled(t)));for(const t of r){const{dx:s,dy:a,distance:r}=D(n,t.position),c=r**2,l=-o*e.speed/c;if(c<=o){i.particles.push(t);const e=y.create(s,a);e.length=l,t.velocity.setTo(e)}}}else if(!1===i.clicking){for(const t of i.particles)t.velocity.setTo(t.initialVelocity);i.particles=[]}},this._hoverRepulse=()=>{const t=this.container,e=t.interactivity.mouse.position,i=t.retina.repulseModeDistance;!i||i<0||!e||this._processRepulse(e,i,new yi(e.x,e.y,i))},this._processRepulse=(t,e,i,s)=>{const o=this.container,n=o.particles.quadTree.query(i,(t=>this.isEnabled(t))),a=o.actualOptions.interactivity.modes.repulse;if(!a)return;const{easing:r,speed:c,factor:l,maxSpeed:h}=a,d=w(r),u=(s?.speed??c)*l;for(const i of n){const{dx:s,dy:o,distance:n}=D(i.position,t),a=k(d(1-n/e)*u,0,h),r=y.create(0===n?u:s/n*a,0===n?u:o/n*a);i.position.addTo(r)}},this._singleSelectorRepulse=(t,e)=>{const i=this.container,s=i.actualOptions.interactivity.modes.repulse;if(!s)return;const o=document.querySelectorAll(t);o.length&&o.forEach((t=>{const o=t,n=i.retina.pixelRatio,a={x:(o.offsetLeft+o.offsetWidth/2)*n,y:(o.offsetTop+o.offsetHeight/2)*n},r=o.offsetWidth/2*n,c="circle"===e.type?new yi(a.x,a.y,r):new vi(o.offsetLeft*n,o.offsetTop*n,o.offsetWidth*n,o.offsetHeight*n),l=rt(s.divs,o);this._processRepulse(a,r,c,l)}))},this._engine=t,e.repulse||(e.repulse={particles:[]}),this.handleClickMode=t=>{const i=this.container.actualOptions.interactivity.modes.repulse;if(!i||t!==ao)return;e.repulse||(e.repulse={particles:[]});const s=e.repulse;s.clicking=!0,s.count=0;for(const t of e.repulse.particles)this.isEnabled(t)&&t.velocity.setTo(t.initialVelocity);s.particles=[],s.finish=!1,setTimeout((()=>{e.destroyed||(s.clicking=!1)}),1e3*i.duration)}}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.repulse;e&&(t.retina.repulseModeDistance=e.distance*t.retina.pixelRatio)}async interact(){const t=this.container,e=t.actualOptions,i=t.interactivity.status===r,s=e.interactivity.events,o=s.onHover,n=o.enable,a=o.mode,c=s.onClick,l=c.enable,h=c.mode,d=s.onDiv;i&&n&&Z(ao,a)?this._hoverRepulse():l&&Z(ao,h)?this._clickRepulse():nt(ao,d,((t,e)=>this._singleSelectorRepulse(t,e)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events,n=o.onDiv,a=o.onHover,r=o.onClick,c=ot(ao,n);if(!(c||a.enable&&s.position||r.enable&&s.clickPosition))return!1;const l=a.mode,h=r.mode;return Z(ao,l)||Z(ao,h)||c}loadModeOptions(t,...e){t.repulse||(t.repulse=new no);for(const i of e)t.repulse.load(i?.repulse)}reset(){}}class co{constructor(){this.factor=3,this.radius=200}load(t){t&&(void 0!==t.factor&&(this.factor=t.factor),void 0!==t.radius&&(this.radius=t.radius))}}class lo extends Si{constructor(t){super(t)}clear(t,e,i){t.slow.inRange&&!i||(t.slow.factor=1)}init(){const t=this.container,e=t.actualOptions.interactivity.modes.slow;e&&(t.retina.slowModeRadius=e.radius*t.retina.pixelRatio)}async interact(){}isEnabled(t){const e=this.container,i=e.interactivity.mouse,s=(t?.interactivity??e.actualOptions.interactivity).events;return s.onHover.enable&&!!i.position&&Z("slow",s.onHover.mode)}loadModeOptions(t,...e){t.slow||(t.slow=new co);for(const i of e)t.slow.load(i?.slow)}reset(t){t.slow.inRange=!1;const e=this.container,i=e.actualOptions,s=e.interactivity.mouse.position,o=e.retina.slowModeRadius,n=i.interactivity.modes.slow;if(!n||!o||o<0||!s)return;const a=T(s,t.getPosition()),r=a/o,c=n.factor,{slow:l}=t;a>o||(l.inRange=!0,l.factor=r/c)}}const ho=[0,4,2,1],uo=[8,8,4,2];class po{constructor(t){this.pos=0,this.data=new Uint8ClampedArray(t)}getString(t){const e=this.data.slice(this.pos,this.pos+t);return this.pos+=e.length,e.reduce(((t,e)=>t+String.fromCharCode(e)),"")}nextByte(){return this.data[this.pos++]}nextTwoBytes(){return this.pos+=2,this.data[this.pos-2]+(this.data[this.pos-1]<<8)}readSubBlocks(){let t="",e=0;do{e=this.data[this.pos++];for(let i=e;--i>=0;t+=String.fromCharCode(this.data[this.pos++]));}while(0!==e);return t}readSubBlocksBin(){let t=0,e=0;for(let i=0;0!==(t=this.data[this.pos+i]);i+=t+1)e+=t;const i=new Uint8Array(e);for(let e=0;0!==(t=this.data[this.pos++]);)for(let s=t;--s>=0;i[e++]=this.data[this.pos++]);return i}skipSubBlocks(){for(;0!==this.data[this.pos];this.pos+=this.data[this.pos]+1);this.pos++}}function fo(t,e){const i=[];for(let s=0;s>>3;const h=1<<1+(7&r);c&&(a.localColorTable=fo(t,h));const d=t=>{const{r:s,g:n,b:r}=(c?a.localColorTable:e.globalColorTable)[t];return{r:s,g:n,b:r,a:t===o(null)?i?~~((s+n+r)/3):0:255}},u=(()=>{try{return new ImageData(a.width,a.height,{colorSpace:"srgb"})}catch(t){if(t instanceof DOMException&&"IndexSizeError"===t.name)return null;throw t}})();if(null==u)throw new EvalError("GIF frame size is to large");const p=t.nextByte(),f=t.readSubBlocksBin(),v=1<
\ No newline at end of file
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
new file mode 100644
index 00000000..9114c614
--- /dev/null
+++ b/docs/overrides/main.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+
+{% block content %}
+{% if page.nb_url %}
+
+ {% include ".icons/material/download.svg" %}
+
+
+{% endif %}
+
+{{ super() }}
+{% endblock content %}
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100644
index 627184b2..00000000
--- a/docs/requirements.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# Install with local version. Need to run from root of repo
-.[graph]
-
-sphinx >6.0, <7.0
-myst-parser ==2.0.0
-nbsphinx >=0.8.5, <=0.8.9
-pandoc >=1.0, <=2.3
-docutils >=0.16, <0.20
-sphinxcontrib-fulltoc >=1.0, <=1.2.0
-sphinxcontrib-mockautodoc
-sphinx-autobuild
-sphinx-autodoc-typehints >=1.16
-sphinx-paramlinks >=0.5.1, <=0.5.4
-sphinx-togglebutton >=0.2, <=0.3.2
-sphinx-copybutton >=0.3, <=0.5.2
-sphinx-multiproject
-sphinx-toolbox ==3.4.0
-sphinx-rtd-dark-mode
-sphinxcontrib-video ==0.2.0
-jinja2 >=3.0.0,<3.2.0
-sphinxcontrib.katex==0.8.6
-sphinx-collections==0.0.1
\ No newline at end of file
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
new file mode 100644
index 00000000..377d9c59
--- /dev/null
+++ b/docs/stylesheets/extra.css
@@ -0,0 +1,32 @@
+/* Custom colors */
+:root {
+ --md-primary-fg-color: #B92B0F;
+ --md-primary-fg-color--light: #F05F42;
+ --md-primary-fg-color--dark: #B92B0F;
+
+ --md-accent-fg-color: #B92B0F;
+ --md-accent-fg-color--transparent: #B92B0F;
+ --md-accent-bg-color: #ffffff;
+ --md-accent-bg-color--light: #B92B0F;
+ }
+
+[data-md-color-scheme="aiforco"] {
+ --md-primary-fg-color: #B92B0F;
+ --md-primary-fg-color--light: #F05F42;
+ --md-primary-fg-color--dark: #B92B0F;
+}
+
+/* [data-md-color-accent=indigo] {
+ --md-accent-fg-color: #B92B0F;
+} */
+
+/* Ensure code blocks wrap text */
+.codehilite pre {
+ white-space: pre-wrap; /* Allow text to wrap within the pre element */
+ word-break: break-word; /* Break the word at the edge of the container if necessary */
+}
+
+/* Improve overall readability of code by adding some padding */
+.codehilite {
+ padding: 8px; /* Adjust padding to fit your design */
+}
diff --git a/docs/stylesheets/mkdocstrings.css b/docs/stylesheets/mkdocstrings.css
new file mode 100644
index 00000000..abea38a6
--- /dev/null
+++ b/docs/stylesheets/mkdocstrings.css
@@ -0,0 +1,54 @@
+/* Indentation. */
+div.doc-contents:not(.first) {
+ padding-left: 15px;
+ border-left: .05rem solid var(--md-typeset-table-color);
+}
+
+
+/* Fancier color for operators such as * and |. */
+.doc-signature .o {
+ color: var(--md-code-hl-special-color);
+}
+
+/* Fancier color for constants such as None, True, and False. */
+.doc-signature .kc {
+ color: var(--md-code-hl-constant-color);
+}
+
+/* Fancier color for built-in types (only useful when cross-references are used). */
+.doc-signature .n > a[href^="https://docs.python.org/"][href*="/functions.html#"],
+.doc-signature .n > a[href^="https://docs.python.org/"][href*="/stdtypes.html#"] {
+ color: var(--md-code-hl-constant-color);
+}
+
+
+/* Nice names only in TOC */
+.doc-symbol-toc.doc-symbol-method::after {
+ content: "m";
+}
+
+.doc-symbol-toc.doc-symbol-function::after {
+ content: "f";
+}
+
+.doc-symbol-toc.doc-symbol-class::after {
+ content: "C";
+}
+
+.doc-symbol-toc.doc-symbol-module::after {
+ content: "M";
+}
+
+.doc-symbol-toc.doc-symbol-attribute::after {
+ content: "A";
+}
+
+.doc-symbol-toc.doc-symbol-parameter::after {
+ content: "P";
+}
+
+/* Line under link as solid */
+.doc-signature .autorefs {
+ color: inherit;
+ border-bottom: 1px solid currentcolor;
+}
\ No newline at end of file
diff --git a/examples/2d-meta_train.py b/examples/2d-meta_train.py
new file mode 100644
index 00000000..1f3fb8d4
--- /dev/null
+++ b/examples/2d-meta_train.py
@@ -0,0 +1,80 @@
+from lightning.pytorch.callbacks import ModelCheckpoint, RichModelSummary
+from lightning.pytorch.loggers import WandbLogger
+
+from rl4co.envs import CVRPEnv
+from rl4co.models.zoo.am import AttentionModelPolicy
+from rl4co.models.zoo.pomo import POMO
+from rl4co.utils.trainer import RL4COTrainer
+from rl4co.utils.meta_trainer import ReptileCallback
+
+def main():
+ # Set device
+ device_id = 0
+
+ # RL4CO env based on TorchRL
+ env = CVRPEnv(generator_params={'num_loc': 50})
+
+ # Policy: neural network, in this case with encoder-decoder architecture
+ # Note that this is adapted the same as POMO did in the original paper
+ policy = AttentionModelPolicy(env_name=env.name,
+ embed_dim=128,
+ num_encoder_layers=6,
+ num_heads=8,
+ normalization="instance",
+ use_graph_context=False
+ )
+
+ # RL Model (POMO)
+ model = POMO(env,
+ policy,
+ batch_size=64, # meta_batch_size
+ train_data_size=64 * 50, # equals to (meta_batch_size) * (gradient decent steps in the inner-loop optimization of meta-learning method)
+ val_data_size=0,
+ optimizer_kwargs={"lr": 1e-4, "weight_decay": 1e-6},
+ )
+
+ # Example callbacks
+ checkpoint_callback = ModelCheckpoint(
+ dirpath="meta_pomo/checkpoints", # save to checkpoints/
+ filename="epoch_{epoch:03d}", # save as epoch_XXX.ckpt
+ save_top_k=1, # save only the best model
+ save_last=True, # save the last model
+ monitor="val/reward", # monitor validation reward
+ mode="max", # maximize validation reward
+ )
+ rich_model_summary = RichModelSummary(max_depth=3) # model summary callback
+
+ # Meta callbacks
+ meta_callback = ReptileCallback(
+ num_tasks = 1, # the number of tasks in a mini-batch, i.e. `B` in the original paper
+ alpha = 0.9, # initial weight of the task model for the outer-loop optimization of reptile
+ alpha_decay = 1, # weight decay of the task model for the outer-loop optimization of reptile. No decay performs better.
+ min_size = 20, # minimum of sampled size in meta tasks (only supported in cross-size generalization)
+ max_size= 150, # maximum of sampled size in meta tasks (only supported in cross-size generalization)
+ data_type="size_distribution", # choose from ["size", "distribution", "size_distribution"]
+ sch_bar=0.9, # for the task scheduler of size setting, where lr_decay_epoch = sch_bar * epochs, i.e. after this epoch, learning rate will decay with a weight 0.1
+ print_log=True # whether to print the sampled tasks in each meta iteration
+ )
+ callbacks = [meta_callback, checkpoint_callback, rich_model_summary]
+
+ # Logger
+ logger = WandbLogger(project="rl4co", name=f"{env.name}_pomo_reptile")
+ # logger = None # uncomment this line if you don't want logging
+
+ # Adjust your trainer to the number of epochs you want to run
+ trainer = RL4COTrainer(
+ max_epochs=15000, # (the number of meta_model updates) * (the number of tasks in a mini-batch)
+ callbacks=callbacks,
+ accelerator="gpu",
+ devices=[device_id],
+ logger=logger,
+ limit_train_batches=50 # gradient decent steps in the inner-loop optimization of meta-learning method
+ )
+
+ # Fit
+ trainer.fit(model)
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/examples/other/2-scheduling.ipynb b/examples/other/2-scheduling.ipynb
index 4c4c029e..2fc6856b 100644
--- a/examples/other/2-scheduling.ipynb
+++ b/examples/other/2-scheduling.ipynb
@@ -13,15 +13,27 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 1,
"metadata": {},
"outputs": [
{
- "name": "stdout",
+ "name": "stderr",
"output_type": "stream",
"text": [
- "The autoreload extension is already loaded. To reload it, use:\n",
- " %reload_ext autoreload\n"
+ "/home/laurin.luttmann/miniconda3/envs/cuda1203/lib/python3.10/site-packages/lightning_utilities/core/imports.py:14: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html\n",
+ " import pkg_resources\n",
+ "/home/laurin.luttmann/miniconda3/envs/cuda1203/lib/python3.10/site-packages/lightning/fabric/__init__.py:41: Deprecated call to `pkg_resources.declare_namespace('lightning.fabric')`.\n",
+ "Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n",
+ "/home/laurin.luttmann/miniconda3/envs/cuda1203/lib/python3.10/site-packages/pkg_resources/__init__.py:2317: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('lightning')`.\n",
+ "Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n",
+ " declare_namespace(parent)\n",
+ "/home/laurin.luttmann/miniconda3/envs/cuda1203/lib/python3.10/site-packages/lightning/pytorch/__init__.py:37: Deprecated call to `pkg_resources.declare_namespace('lightning.pytorch')`.\n",
+ "Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n",
+ "/home/laurin.luttmann/miniconda3/envs/cuda1203/lib/python3.10/site-packages/pkg_resources/__init__.py:2317: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('lightning')`.\n",
+ "Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n",
+ " declare_namespace(parent)\n",
+ "/home/laurin.luttmann/miniconda3/envs/cuda1203/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
+ " from .autonotebook import tqdm as notebook_tqdm\n"
]
}
],
@@ -59,7 +71,7 @@
" \"min_processing_time\": 1, # the minimum time required for a machine to process an operation\n",
" \"max_processing_time\": 20, # the maximum time required for a machine to process an operation\n",
" \"min_eligible_ma_per_op\": 1, # the minimum number of machines capable to process an operation\n",
- " \"max_eligible_ma_per_op\": 3, # the maximum number of machines capable to process an operation\n",
+ " \"max_eligible_ma_per_op\": 2, # the maximum number of machines capable to process an operation\n",
"}"
]
},
@@ -91,11 +103,15 @@
{
"cell_type": "code",
"execution_count": 5,
- "metadata": {},
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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",
"text/plain": [
"