[
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n/scripts/long_term_forecast/Traffic_script/PatchTST1.sh\n/backups/\n/result.xlsx\n/~$result.xlsx\n/Time-Series-Library.zip\n/temp.sh\n\n.idea\n/tv_result.xlsx\n/test.py\n/m4_results/\n/test_results/\n/PatchTST_results.xlsx\n/seq_len_long_term_forecast/\n/progress.xlsx\n/scripts/short_term_forecast/PatchTST_M4.sh\n/run_tv.py\n\n/scripts/long_term_forecast/ETT_tv_script/\n/dataset/\n/data/\ndata_factory_all.py\ndata_loader_all.py\n/scripts/short_term_forecast/tv_script/\n/exp/exp_short_term_forecasting_tv.py\n/exp/exp_long_term_forecasting_tv.py\n/timesnetv2.xlsx\n/scripts/anomaly_detection/tmp/\n/scripts/imputation/tmp/\n/utils/self_tools.py\n/scripts/exp_scripts/\n\ncheckpoints/\nresults/\nresult_long_term_forecast.txt\nresult_anomaly_detection.txt\nscripts/augmentation/\nrun_anylearn.py\nenvironment.txt"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Instructions for Contributing to TSlib\n\nSincerely thanks to all the researchers who want to use or contribute to TSlib.\n\nSince our team may not have enough time to fix all the bugs and catch up with the latest model, your contribution is essential to this project.\n\n### (1) Fix Bug\n\nYou can directly propose a pull request and add detailed descriptions to the comment, such as [this pull request](https://github.com/thuml/Time-Series-Library/pull/498).\n\n### (2) Add a new time series model\n\nThanks to creative researchers, extensive great TS models are presented, which advance this community significantly. If you want to add your model to TSlib, here are some instructions:\n\n- Propose an issue to describe your model and give a link to your paper and official code. We will discuss whether your model is suitable for this library, such as [this issue](https://github.com/thuml/Time-Series-Library/issues/346).\n- Propose a pull request in a similar style as TSlib, which means adding an additional file to ./models and providing corresponding scripts for reproduction, such as [this pull request](https://github.com/thuml/Time-Series-Library/pull/446).\n\nNote: Given that there are a lot of TS models that have been proposed, we may not have enough time to judge which model can be a remarkable supplement to the current library. Thus, we decide ONLY to add the officially published paper to our library. Peer review can be a reliable criterion.\n\nThanks again for your valuable contributions.\n"
  },
  {
    "path": "Dockerfile",
    "content": "# syntax=docker/dockerfile:1.4\n\nFROM pytorch/pytorch:2.5.1-cuda12.1-cudnn9-devel AS tslib\n\nWORKDIR /workspace\n\nARG http_proxy\nARG https_proxy\n\nENV http_proxy=${http_proxy}\nENV https_proxy=${https_proxy}\nENV PYTHONPATH=/workspace/Time-Series-Library:$PYTHONPATH\n\nCOPY requirements.txt .\nRUN --mount=type=cache,target=/root/.cache/pip \\\n    pip install -r requirements.txt\n\n# mamba-ssm (cxx11abiFALSE) （Time-Series-Library/models/Mamba.py）\nRUN --mount=type=cache,target=/root/.cache/pip \\\n    pip install https://github.com/state-spaces/mamba/releases/download/v2.2.6.post3/mamba_ssm-2.2.6.post3+cu12torch2.5cxx11abiFALSE-cp311-cp311-linux_x86_64.whl\n\n# uni2ts (--no-deps)（Time-Series-Library/models/Moirai.py）\nRUN --mount=type=cache,target=/root/.cache/pip \\\n    pip install uni2ts --no-deps\n\nCOPY . .\n\nCMD [\"bash\"]"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 THUML @ Tsinghua University\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Time Series Library (TSLib)\nTSLib is an open-source library for deep learning researchers, especially for deep time series analysis.\n\n> **中文文档**：[README_zh.md](./README_zh.md)\n\nWe provide a neat code base to evaluate advanced deep time series models or develop your model, which covers five mainstream tasks: **long- and short-term forecasting, imputation, anomaly detection, and classification.**\n\n:triangular_flag_on_post:**News** (2025.12) Many thanks to the great work from [ailuntz](https://github.com/thuml/Time-Series-Library/pull/805), which provides an updated requirements and docker deployment, as well as a well-organized document. This is quite meaningful to this project and beginners.\n\n:triangular_flag_on_post:**News** (2025.11) Considering the rapid development of Large Time Series Models (LTSMs), we have newly added a [[zero-shot forecasting]](https://github.com/thuml/Time-Series-Library/blob/main/exp/exp_zero_shot_forecasting.py) feature in TSLib. You can try [this script](https://github.com/thuml/Time-Series-Library/blob/main/scripts/long_term_forecast/ETT_script/LTSM.sh) to evaluate LTSMs.\n\n:triangular_flag_on_post:**News** (2025.10) Given the recent confusion among researchers regarding minor improvements on standard benchmarks, we propose the [[Accuracy Law]](https://arxiv.org/abs/2510.02729) to characterize the objectives of deep time series forecasting tasks, which can be used to identify saturated datasets.\n\n:triangular_flag_on_post:**News** (2024.10) We have included [[TimeXer]](https://arxiv.org/abs/2402.19072), which defined a practical forecasting paradigm: Forecasting with Exogenous Variables. Considering both practicability and computation efficiency, we believe the new forecasting paradigm defined in TimeXer can be the \"right\" task for future research.\n\n:triangular_flag_on_post:**News** (2024.10) Our lab has open-sourced [[OpenLTM]](https://github.com/thuml/OpenLTM), which provides a distinct pretrain-finetuning paradigm compared to TSLib. If you are interested in Large Time Series Models, you may find this repository helpful.\n\n:triangular_flag_on_post:**News** (2024.07) We wrote a comprehensive survey of [[Deep Time Series Models]](https://arxiv.org/abs/2407.13278) with a rigorous benchmark based on TSLib. In this paper, we summarized the design principles of current time series models supported by insightful experiments, hoping to be helpful to future research.\n\n:triangular_flag_on_post:**News** (2024.04) Many thanks for the great work from [frecklebars](https://github.com/thuml/Time-Series-Library/pull/378). The famous sequential model [Mamba](https://arxiv.org/abs/2312.00752) has been included in our library. See [this file](https://github.com/thuml/Time-Series-Library/blob/main/models/Mamba.py), where you need to install `mamba_ssm` with pip at first.\n\n:triangular_flag_on_post:**News** (2024.03) Given the inconsistent look-back length of various papers, we split the long-term forecasting in the leaderboard into two categories: Look-Back-96 and Look-Back-Searching. We recommend researchers read [TimeMixer](https://openreview.net/pdf?id=7oLshfEIC2), which includes both look-back length settings in experiments for scientific rigor.\n\n:triangular_flag_on_post:**News** (2023.10) We add an implementation to [iTransformer](https://arxiv.org/abs/2310.06625), which is the state-of-the-art model for long-term forecasting. The official code and complete scripts of iTransformer can be found [here](https://github.com/thuml/iTransformer).\n\n:triangular_flag_on_post:**News** (2023.09) We added a detailed [tutorial](https://github.com/thuml/Time-Series-Library/blob/main/tutorial/TimesNet_tutorial.ipynb) for [TimesNet](https://openreview.net/pdf?id=ju_Uqw384Oq) and this library, which is quite friendly to beginners of deep time series analysis.\n\n:triangular_flag_on_post:**News** (2023.02) We release the TSlib as a comprehensive benchmark and code base for time series models, which is extended from our previous GitHub repository [Autoformer](https://github.com/thuml/Autoformer).\n\n## Leaderboard for Time Series Analysis\n\nTill March 2024, the top three models for five different tasks are:\n\n| Model<br>Ranking | Long-term<br>Forecasting<br>Look-Back-96              | Long-term<br/>Forecasting<br/>Look-Back-Searching     | Short-term<br>Forecasting                                    | Imputation                                                   | Classification                                               | Anomaly<br>Detection                               |\n| ---------------- | ----------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -------------------------------------------------- |\n| 🥇 1st            | [TimeXer](https://arxiv.org/abs/2402.19072)      | [TimeMixer](https://openreview.net/pdf?id=7oLshfEIC2) | [TimesNet](https://arxiv.org/abs/2210.02186)                 | [TimesNet](https://arxiv.org/abs/2210.02186)                 | [TimesNet](https://arxiv.org/abs/2210.02186)                 | [TimesNet](https://arxiv.org/abs/2210.02186)       |\n| 🥈 2nd            | [iTransformer](https://arxiv.org/abs/2310.06625) | [PatchTST](https://github.com/yuqinie98/PatchTST)     | [Non-stationary<br/>Transformer](https://github.com/thuml/Nonstationary_Transformers) | [Non-stationary<br/>Transformer](https://github.com/thuml/Nonstationary_Transformers) | [Non-stationary<br/>Transformer](https://github.com/thuml/Nonstationary_Transformers) | [FEDformer](https://github.com/MAZiqing/FEDformer) |\n| 🥉 3rd            | [TimeMixer](https://openreview.net/pdf?id=7oLshfEIC2)          | [DLinear](https://arxiv.org/pdf/2205.13504.pdf)       | [FEDformer](https://github.com/MAZiqing/FEDformer)           | [Autoformer](https://github.com/thuml/Autoformer)            | [Informer](https://github.com/zhouhaoyi/Informer2020)        | [Autoformer](https://github.com/thuml/Autoformer)  |\n\n\n**Note: We will keep updating this leaderboard.** If you have proposed advanced and awesome models, you can send us your paper/code link or raise a pull request. We will add them to this repo and update the leaderboard as soon as possible.\n\n**Compared models of this leaderboard.** ☑ means that their codes have already been included in this repo.\n  - [x] **TimeXer** - TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables [[NeurIPS 2024]](https://arxiv.org/abs/2402.19072) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeXer.py)\n  - [x] **TimeMixer** - TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting [[ICLR 2024]](https://openreview.net/pdf?id=7oLshfEIC2) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeMixer.py).\n  - [x] **TSMixer** - TSMixer: An All-MLP Architecture for Time Series Forecasting [[arXiv 2023]](https://arxiv.org/pdf/2303.06053.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TSMixer.py)\n  - [x] **iTransformer** - iTransformer: Inverted Transformers Are Effective for Time Series Forecasting [[ICLR 2024]](https://arxiv.org/abs/2310.06625) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/iTransformer.py).\n  - [x] **PatchTST** - A Time Series is Worth 64 Words: Long-term Forecasting with Transformers [[ICLR 2023]](https://openreview.net/pdf?id=Jbdc0vTOcol) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/PatchTST.py).\n  - [x] **TimesNet** - TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis [[ICLR 2023]](https://openreview.net/pdf?id=ju_Uqw384Oq) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimesNet.py).\n  - [x] **DLinear** - Are Transformers Effective for Time Series Forecasting? [[AAAI 2023]](https://arxiv.org/pdf/2205.13504.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/DLinear.py).\n  - [x] **LightTS** - Less Is More: Fast Multivariate Time Series Forecasting with Light Sampling-oriented MLP Structures [[arXiv 2022]](https://arxiv.org/abs/2207.01186) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/LightTS.py).\n  - [x] **ETSformer** - ETSformer: Exponential Smoothing Transformers for Time-series Forecasting [[arXiv 2022]](https://arxiv.org/abs/2202.01381) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/ETSformer.py).\n  - [x] **Non-stationary Transformer** - Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting [[NeurIPS 2022]](https://openreview.net/pdf?id=ucNDIDRNjjv) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Nonstationary_Transformer.py).\n  - [x] **FEDformer** - FEDformer: Frequency Enhanced Decomposed Transformer for Long-term Series Forecasting [[ICML 2022]](https://proceedings.mlr.press/v162/zhou22g.html) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/FEDformer.py).\n  - [x] **Pyraformer** - Pyraformer: Low-complexity Pyramidal Attention for Long-range Time Series Modeling and Forecasting [[ICLR 2022]](https://openreview.net/pdf?id=0EXmFzUn5I) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Pyraformer.py).\n  - [x] **Autoformer** - Autoformer: Decomposition Transformers with Auto-Correlation for Long-Term Series Forecasting [[NeurIPS 2021]](https://openreview.net/pdf?id=I55UqU-M11y) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Autoformer.py).\n  - [x] **Informer** - Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting [[AAAI 2021]](https://ojs.aaai.org/index.php/AAAI/article/view/17325/17132) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Informer.py).\n  - [x] **Reformer** - Reformer: The Efficient Transformer [[ICLR 2020]](https://openreview.net/forum?id=rkgNKkHtvB) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Reformer.py).\n  - [x] **Transformer** - Attention is All You Need [[NeurIPS 2017]](https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Transformer.py).\n\nSee our latest paper [[TimesNet]](https://arxiv.org/abs/2210.02186) for the comprehensive benchmark. We will release a real-time updated online version soon.\n\n**Newly added baselines.** We will add them to the leaderboard after a comprehensive evaluation.\n  - [x] **MambaSL** - MambaSL: Exploring Single-Layer Mamba for Time Series Classification [[ICLR 2026]](https://openreview.net/forum?id=YDl4vqQqGP) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/MambaSingleLayer.py)\n  - [x] **TimeFilter** - TimeFilter: Patch-Specific Spatial-Temporal Graph Filtration for Time Series Forecasting [[ICML 2025]](https://arxiv.org/abs/2501.13041) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeFilter.py)\n  - [x] **KAN-AD** - KAN-AD: Time Series Anomaly Detection with Kolmogorov-Arnold Networks [[ICML 2025]](https://arxiv.org/abs/2411.00278) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/KANAD.py)\n  - [x] **MultiPatchFormer** - A multiscale model for multivariate time series forecasting [[Scientific Reports 2025]](https://www.nature.com/articles/s41598-024-82417-4) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/MultiPatchFormer.py)\n  - [x] **WPMixer** - WPMixer: Efficient Multi-Resolution Mixing for Long-Term Time Series Forecasting [[AAAI 2025]](https://arxiv.org/abs/2412.17176) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/WPMixer.py)\n  - [x] **MSGNet** - MSGNet: Learning Multi-Scale Inter-Series Correlations for Multivariate Time Series Forecasting [[AAAI 2024]](https://dl.acm.org/doi/10.1609/aaai.v38i10.28991) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/MSGNet.py)\n  - [x] **PAttn** - Are Language Models Actually Useful for Time Series Forecasting? [[NeurIPS 2024]](https://arxiv.org/pdf/2406.16964) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/PAttn.py)\n  - [x] **Mamba** - Mamba: Linear-Time Sequence Modeling with Selective State Spaces [[arXiv 2023]](https://arxiv.org/abs/2312.00752) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Mamba.py)\n  - [x] **SegRNN** - SegRNN: Segment Recurrent Neural Network for Long-Term Time Series Forecasting [[arXiv 2023]](https://arxiv.org/abs/2308.11200.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/SegRNN.py).\n  - [x] **Koopa** - Koopa: Learning Non-stationary Time Series Dynamics with Koopman Predictors [[NeurIPS 2023]](https://arxiv.org/pdf/2305.18803.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Koopa.py).\n  - [x] **FreTS** - Frequency-domain MLPs are More Effective Learners in Time Series Forecasting [[NeurIPS 2023]](https://arxiv.org/pdf/2311.06184.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/FreTS.py).\n  - [x] **MICN** - MICN: Multi-scale Local and Global Context Modeling for Long-term Series Forecasting [[ICLR 2023]](https://openreview.net/pdf?id=zt53IDUR1U)[[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/MICN.py).\n  - [x] **Crossformer** - Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series Forecasting [[ICLR 2023]](https://openreview.net/pdf?id=vSVLM2j9eie)[[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Crossformer.py).\n  - [x] **TiDE** - Long-term Forecasting with TiDE: Time-series Dense Encoder [[arXiv 2023]](https://arxiv.org/pdf/2304.08424.pdf) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TiDE.py).\n  - [x] **SCINet** - SCINet: Time Series Modeling and Forecasting with Sample Convolution and Interaction [[NeurIPS 2022]](https://openreview.net/pdf?id=AyajSjTAzmg)[[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/SCINet.py).\n  - [x] **FiLM** - FiLM: Frequency improved Legendre Memory Model for Long-term Time Series Forecasting [[NeurIPS 2022]](https://openreview.net/forum?id=zTQdHSQUQWc)[[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/FiLM.py).\n  - [x] **TFT** - Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting [[arXiv 2019]](https://arxiv.org/abs/1912.09363)[[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TemporalFusionTransformer.py).\n\n**Newly added Large Time Series Models.** This library also supports the zero-shot evaluation of the following LTSMs.\n\n- [x] **Chronos2** - Chronos-2: From Univariate to Universal Forecasting [[arXiv 2025]](https://arxiv.org/abs/2510.15821) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Chronos2.py)\n- [x] **TiRex** - TiRex: Zero-Shot Forecasting Across Long and Short Horizons with Enhanced In-Context Learning [[NeurIPS 2025]](https://arxiv.org/pdf/2505.23719) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TiRex.py)\n- [x] **Sundial** - Sundial: A Family of Highly Capable Time Series Foundation Models [[ICML 2025]](https://arxiv.org/pdf/2502.00816) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Sundial.py)\n- [x] **Time-MoE** - Time-MoE: Billion-Scale Time Series Foundation Models with Mixture of Experts [[ICLR 2025]](https://arxiv.org/pdf/2409.16040) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeMoE.py)\n- [x] **Toto** - Toto: Time Series Optimized Transformer for Observability [arXiv 2024](https://arxiv.org/pdf/2407.07874)\n- [x] **Chronos** - Chronos: Learning the Language of Time Series [[TMLR 2024]](https://arxiv.org/pdf/2403.07815) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/Chronos.py)\n- [x] **Moirai** - Unified Training of Universal Time Series Forecasting Transformers [[ICML 2024]](https://arxiv.org/pdf/2402.02592)\n- [x] **TimesFM** - A decoder-only foundation model for time-series forecasting [[ICML 2024]](https://arxiv.org/abs/2310.10688) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimesFM.py)\n\n\n \n## Getting Started\n\n### Prepare Data\nYou can obtain the well-preprocessed datasets from [[Google Drive]](https://drive.google.com/drive/folders/13Cg1KYOlzM5C7K8gK8NfC-F3EYxkM3D2?usp=sharing), [[Baidu Drive]](https://pan.baidu.com/s/1r3KhGd0Q9PJIUZdfEYoymg?pwd=i9iy) or [[Hugging Face]](https://huggingface.co/datasets/thuml/Time-Series-Library). Then place the downloaded data in the folder `./dataset`.\n\n### Installation\n1. Clone this repository.\n   ```bash\n   git clone https://github.com/thuml/Time-Series-Library.git\n   cd Time-Series-Library\n   ```\n\n2. Create a new Conda environment.\n   ```bash\n   conda create -n tslib python=3.11\n   conda activate tslib\n   ```\n\n3. Install Core Dependencies\n   > ⚠️ **CUDA Compatibility Notice**\n   > The torch prebuilt package is **CUDA-version specific**. (See https://pytorch.org/get-started/previous-versions/)\n   > Please make sure to install the package that matches your local CUDA version (e.g., `cu118` or `cu121`).\n   > Recommended: torch==2.5.1\n\n   ```bash\n   pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cu121\n\n   pip install -r requirements.txt\n   ```\n\n4. Install Dependencies for Mamba Model (Required for Time-Series-Library/models/Mamba.py)\n   > ⚠️ **Linux only**\n   > ⚠️ **CUDA Compatibility Notice**\n   > The prebuilt Mamba wheel is **CUDA-version specific**.\n   > Please make sure to install the wheel that matches your local CUDA version\n   > (e.g., `cu11` or `cu12`). Installing a mismatched version may result in\n   > runtime errors or import failures.\n\n   Example for **CUDA 12**:\n\n   ```bash\n   pip install https://github.com/state-spaces/mamba/releases/download/v2.2.6.post3/mamba_ssm-2.2.6.post3+cu12torch2.5cxx11abiFALSE-cp311-cp311-linux_x86_64.whl\n   ```\n\n5. Install Dependencies for Moirai Model (Required for Time-Series-Library/models/Moirai.py)\n   ```bash\n   pip install uni2ts --no-deps\n   ```\n\n### Docker Deployment\n```bash\n# Build and start the Docker container in detached mode\ndocker compose -f 'Time-Series-Library/docker-compose.yml' up -d --build\n\n# Download / place the dataset into a newly created folder ./dataset at the repository root\nmkdir -p dataset  # create the dataset directory\n\n# Copy the local dataset into the container at /workspace/dataset\ndocker cp ./dataset tslib:/workspace/dataset\n\n# Enter the running container to continue training / evaluation\ndocker exec -it tslib bash\n\n# Switch to the workspace directory inside the container\ncd /workspace\n\n# Run zero-shot forecasting with the pre-trained Moirai model\npython -u run.py \\\n  --task_name zero_shot_forecast \\   # task type: zero-shot forecasting\n  --is_training 0 \\                  # 0 = inference only (no training)\n  --root_path ./dataset/ETT-small/ \\ # root directory of the dataset\n  --data_path ETTh1.csv \\            # dataset file name\n  --model_id ETTh1_512_96 \\          # experiment/model identifier\n  --model Moirai \\                   # model name (TimesFM / Moirai)\n  --data ETTh1 \\                     # dataset name\n  --features M \\                     # multivariate forecasting\n  --seq_len 512 \\                    # input sequence length\n  --pred_len 96 \\                    # prediction horizon\n  --enc_in 7 \\                       # number of input variables\n  --des 'Exp' \\                      # experiment description\n  --itr 1                             # number of runs\n```\n\n\n### Quick Test\n\nQuick test for all 5 tasks (1 epoch each):\n\n```bash\n# Run quick tests for all 5 tasks\nexport CUDA_VISIBLE_DEVICES=0\n\n# 1. Long-term forecasting\npython -u run.py --task_name long_term_forecast --is_training 1 --root_path ./dataset/ETT-small/ --data_path ETTh1.csv --model_id test_long --model DLinear --data ETTh1 --features M --seq_len 96 --pred_len 96 --enc_in 7 --dec_in 7 --c_out 7 --train_epochs 1 --num_workers 2\n\n# 2. Short-term forecasting (using ETT dataset with shorter prediction length)\npython -u run.py --task_name long_term_forecast --is_training 1 --root_path ./dataset/ETT-small/ --data_path ETTh1.csv --model_id test_short --model TimesNet --data ETTh1 --features M --seq_len 24 --label_len 12 --pred_len 24 --e_layers 2 --d_layers 1 --d_model 16 --d_ff 32 --enc_in 7 --dec_in 7 --c_out 7 --top_k 5 --train_epochs 1 --num_workers 2\n\n# 3. Imputation\npython -u run.py --task_name imputation --is_training 1 --root_path ./dataset/ETT-small/ --data_path ETTh1.csv --model_id test_imp --model TimesNet --data ETTh1 --features M --seq_len 96 --e_layers 2 --d_layers 1 --d_model 16 --d_ff 32 --enc_in 7 --dec_in 7 --c_out 7 --top_k 3 --train_epochs 1 --num_workers 2 --label_len 0 --pred_len 0 --mask_rate 0.125 --learning_rate 0.001\n\n# 4. Anomaly detection\npython -u run.py --task_name anomaly_detection --is_training 1 --root_path ./dataset/PSM --model_id test_ad --model TimesNet --data PSM --features M --seq_len 100 --pred_len 0 --d_model 64 --d_ff 64 --e_layers 2 --enc_in 25 --c_out 25 --anomaly_ratio 1.0 --top_k 3 --train_epochs 1 --batch_size 128 --num_workers 2\n\n# 5. Classification\npython -u run.py --task_name classification --is_training 1 --root_path ./dataset/Heartbeat/ --model_id Heartbeat --model TimesNet --data UEA --e_layers 2 --d_layers 1 --factor 3 --d_model 64 --d_ff 128 --top_k 3 --train_epochs 1 --batch_size 16 --learning_rate 0.001 --num_workers 0\n```\n\n\n### Train and Evaluate\n\nWe provide the experiment scripts for all benchmarks under the folder `./scripts/`. You can reproduce the experiment results as the following examples:\n\n> ⚠️ Some scripts have `CUDA_VISIBLE_DEVICES` set by default. Please modify or remove this setting according to your actual GPU configuration, otherwise it may prevent GPU usage.\n\n```bash\n# long-term forecast\nbash ./scripts/long_term_forecast/ETT_script/TimesNet_ETTh1.sh\n# short-term forecast\nbash ./scripts/short_term_forecast/TimesNet_M4.sh\n# imputation\nbash ./scripts/imputation/ETT_script/TimesNet_ETTh1.sh\n# anomaly detection\nbash ./scripts/anomaly_detection/PSM/TimesNet.sh\n# classification\nbash ./scripts/classification/TimesNet.sh\n```\n\n### Develop Your Own Model\n- Add the model file to the folder `./models`. You can follow the `./models/Transformer.py`.\n- Create the corresponding scripts under the folder `./scripts`.\n\n### Note: \n\n(1) About classification: Since we include all five tasks in a unified code base, the accuracy of each subtask may fluctuate but the average performance can be reproduced (even a bit better). We have provided the reproduced checkpoints [here](https://github.com/thuml/Time-Series-Library/issues/494).\n\n(2) About anomaly detection: Some discussion about the adjustment strategy in anomaly detection can be found [here](https://github.com/thuml/Anomaly-Transformer/issues/14). The key point is that the adjustment strategy corresponds to an event-level metric.\n\n### Inspect the project structure:\n\n```\nTime-Series-Library/\n├── README.md                     # Official README with tasks, leaderboard, usage\n├── requirements.txt              # pip dependency list for quick environment setup\n├── LICENSE / CONTRIBUTING.md     # Upstream license and contribution guide\n├── run.py                        # Unified entry that parses args and dispatches tasks\n├── exp/                          # Task pipelines wrapping train/val/test\n│   ├── exp_basic.py              # Experiment base class, registers models, builds flows\n│   ├── exp_long_term_forecasting.py    # Long-term forecasting logic\n│   ├── exp_short_term_forecasting.py   # Short-term forecasting logic\n│   ├── exp_imputation.py               # Missing-value imputation\n│   ├── exp_anomaly_detection.py        # Anomaly detection\n│   ├── exp_classification.py           # Classification\n│   └── exp_zero_shot_forecasting.py    # LTSM zero-shot evaluation\n├── data_provider/                # Dataset loaders and splits\n│   ├── data_factory.py           # Chooses the proper DataLoader per task\n│   ├── data_loader.py            # Generic TS reader with sliding-window logic\n│   ├── uea.py / m4.py            # Parsers for UEA, M4 and other formats\n│   └── __init__.py               # Exposes factory interfaces upward\n├── models/                       # All model implementations\n│   ├── TimesNet.py, TimeMixer.py # Main forecasting models\n│   ├── Chronos2.py, TiRex.py     # LTSM zero-shot models\n│   └── __init__.py               # Enables name-based instantiation inside exp\n├── layers/                       # Reusable attention / conv / embedding blocks\n│   ├── Transformer_EncDec.py     # Transformer stacks\n│   ├── AutoCorrelation.py        # Auto-correlation operator\n│   ├── MultiWaveletCorrelation.py# Frequency-domain unit\n│   └── Embed.py etc.             # Shared primitives\n├── utils/                        # Utility toolbox\n│   ├── metrics.py                # MSE / MAE / DTW and other metrics\n│   ├── tools.py                  # General helpers such as EarlyStopping\n│   ├── augmentation.py           # Augmentations for classification / detection\n│   ├── print_args.py             # Unified argument printer\n│   └── masking.py / losses.py    # Task-specific helpers\n├── scripts/                      # Bash recipes for reproducible experiments\n│   ├── long_term_forecast/       # Long-term forecasting per dataset/model\n│   ├── short_term_forecast/      # M4 and other short-term scripts\n│   ├── imputation/               # Imputation scripts\n│   ├── anomaly_detection/        # SMD / SMAP / SWAT detection scripts\n│   ├── classification/           # UEA classification scripts\n│   └── exogenous_forecast/       # TimeXer exogenous forecasting flow\n├── tutorial/                     # TimesNet tutorial notebook and figures\n└── pic/                          # README figures (dataset overview, etc.)\n```\n\n### Understand the project architecture:\n\n- **E2E flow**: configure experiments via `scripts/*.sh` → run `python run.py ...` → `run.py` parses arguments and selects the proper `Exp_*` via `task_name` → the experiment builds datasets through `data_provider`, instantiates networks from `models`, and drives train/val/test with utilities in `utils` → metrics and checkpoints are written to `./checkpoints`.\n- **Experiment layer (`exp/`)**: `Exp_Basic` registers models and devices; subclasses implement `_get_data`, `train`, and `test` to encapsulate task-specific differences so the same model can be reused.\n- **Model & layer layer (`models/` + `layers/`)**: model files define architectures, while reusable attention/conv/frequency components live in `layers/` to minimize duplication.\n- **Data layer (`data_provider/`)**: `data_factory` returns the correct `Dataset/DataLoader`; `data_loader` handles windowing, masking, and sampling, with arguments controlling window length, missing ratio, anomaly ratio, etc.\n- **Script layer (`scripts/`)**: bash scripts capture paper configurations (dataset, window, model, GPU) for reproducibility and serve as templates for custom runs.\n- **Utility layer (`utils/`)**: `metrics` centralizes evaluation, `tools` bundles essentials like `EarlyStopping` and `adjust_learning_rate`, while `augmentation`/`masking` cover task-specific preprocessing.\n- **Learning path**: recommended reading order is `scripts -> run.py -> exp/exp_basic.py -> corresponding Exp subclass -> data_provider -> models`, using `tutorial/TimesNet_tutorial.ipynb` as a guided walkthrough before diving deeper.\n\n## Citation\n\nIf you find this repo useful, please cite our paper.\n\n```\n@inproceedings{wu2023timesnet,\n  title={TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis},\n  author={Haixu Wu and Tengge Hu and Yong Liu and Hang Zhou and Jianmin Wang and Mingsheng Long},\n  booktitle={International Conference on Learning Representations},\n  year={2023},\n}\n\n@article{wang2024tssurvey,\n  title={Deep Time Series Models: A Comprehensive Survey and Benchmark},\n  author={Yuxuan Wang and Haixu Wu and Jiaxiang Dong and Yong Liu and Mingsheng Long and Jianmin Wang},\n  booktitle={arXiv preprint arXiv:2407.13278},\n  year={2024},\n}\n```\n\n## Contact\nIf you have any questions or suggestions, feel free to contact our maintenance team:\n\nCurrent:\n- Haixu Wu (Ph.D., wuhaixu98@gmail.com)\n- Yuxuan Wang (Ph.D. student, wangyuxu22@mails.tsinghua.edu.cn)\n- Yong Liu (Ph.D. student, liuyong21@mails.tsinghua.edu.cn)\n- Ailuntz (Student from Open-source Community, ailuntz@icloud.com)\n\nPrevious:\n- Huikun Weng (Undergraduate, wenghk22@mails.tsinghua.edu.cn)\n- Tengge Hu (Master student, htg21@mails.tsinghua.edu.cn)\n- Haoran Zhang (Master student, z-hr20@mails.tsinghua.edu.cn)\n- Jiawei Guo (Undergraduate, guo-jw21@mails.tsinghua.edu.cn)\n\nOr describe it in Issues.\n\n## Acknowledgement\n\nThis library is constructed based on the following repos:\n\n- Forecasting: https://github.com/thuml/Autoformer.\n\n- Anomaly Detection: https://github.com/thuml/Anomaly-Transformer.\n\n- Classification: https://github.com/thuml/Flowformer.\n\nAll the experiment datasets are public, and we obtain them from the following links:\n\n- Long-term Forecasting and Imputation: https://github.com/thuml/Autoformer.\n\n- Short-term Forecasting: https://github.com/ServiceNow/N-BEATS.\n\n- Anomaly Detection: https://github.com/thuml/Anomaly-Transformer.\n\n- Classification: https://www.timeseriesclassification.com/.\n\n## All Thanks To Our Contributors\n\n<a href=\"https://github.com/thuml/Time-Series-Library/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=thuml/Time-Series-Library\" />\n</a>\n"
  },
  {
    "path": "README_zh.md",
    "content": "# 时间序列库（TSLib）\nTSLib 是一个面向深度学习研究者的开源库，特别适用于深度时间序列分析。\n\n> **English README**：[README.md](./README.md)\n\n我们提供了一个整洁的代码库，用于评测先进的深度时间序列模型或开发自定义模型，覆盖 **长短期预测、插补、异常检测和分类** 等五大主流任务。\n\n:triangular_flag_on_post:**最新动态**（2025.12）非常感谢 [ailuntz](https://github.com/thuml/Time-Series-Library/pull/805) 的杰出贡献，提供了更新的依赖要求和 Docker 部署，以及完善的文档。这对本项目和初学者都很有意义。\n\n:triangular_flag_on_post:**最新动态**（2025.11）鉴于大型时间序列模型（LTSM）的快速发展，我们在 TSLib 中新增了[[零样本预测]](https://github.com/thuml/Time-Series-Library/blob/main/exp/exp_zero_shot_forecasting.py)功能，可参考 [此脚本](https://github.com/thuml/Time-Series-Library/blob/main/scripts/long_term_forecast/ETT_script/LTSM.sh) 评测 LTSM。\n\n:triangular_flag_on_post:**最新动态**（2025.10）针对近期研究者在标准基准上追求微小提升而产生的困惑，我们提出了[[精度定律]](https://arxiv.org/abs/2510.02729)，以刻画深度时间序列预测任务的目标，并可据此识别已饱和的数据集。\n\n:triangular_flag_on_post:**最新动态**（2024.10）我们已纳入 [[TimeXer]](https://arxiv.org/abs/2402.19072)，其定义了一个实用的预测范式：带外生变量的预测。考虑到实用性与计算效率，我们认为 TimeXer 所定义的新范式将成为未来研究的“正确”任务。\n\n:triangular_flag_on_post:**最新动态**（2024.10）实验室已开源 [[OpenLTM]](https://github.com/thuml/OpenLTM)，提供了有别于 TSLib 的预训练 - 微调范式。如果您对大型时间序列模型感兴趣，该仓库值得参考。\n\n:triangular_flag_on_post:**最新动态**（2024.07）我们撰写了关于[[深度时间序列模型]](https://arxiv.org/abs/2407.13278)的综述，并基于 TSLib 构建了严谨的基准。论文总结了当前时间序列模型的设计原则，并通过深入实验验证，期望对未来研究有所帮助。\n\n:triangular_flag_on_post:**最新动态**（2024.04）感谢 [frecklebars](https://github.com/thuml/Time-Series-Library/pull/378) 的贡献，著名的序列模型 [Mamba](https://arxiv.org/abs/2312.00752) 已加入本库。参见[该文件](https://github.com/thuml/Time-Series-Library/blob/main/models/Mamba.py)，需要先用 pip 安装 `mamba_ssm`。\n\n:triangular_flag_on_post:**最新动态**（2024.03）鉴于各论文使用的回溯窗口长度不一致，我们将排行榜中的长期预测拆分为 Look-Back-96 与 Look-Back-Searching 两类。建议阅读 [TimeMixer](https://openreview.net/pdf?id=7oLshfEIC2)，其实验同时包含两种窗口设置，更具科学性。\n\n:triangular_flag_on_post:**最新动态**（2023.10）我们添加了 [iTransformer](https://arxiv.org/abs/2310.06625) 的实现，这是长期预测领域的最新 SOTA。官方代码与完整脚本参见 [此处](https://github.com/thuml/iTransformer)。\n\n:triangular_flag_on_post:**最新动态**（2023.09）我们为 [TimesNet](https://openreview.net/pdf?id=ju_Uqw384Oq) 及本库添加了详细[教程](https://github.com/thuml/Time-Series-Library/blob/main/tutorial/TimesNet_tutorial.ipynb)，对时间序列初学者十分友好。\n\n:triangular_flag_on_post:**最新动态**（2023.02）我们发布了 TSlib，作为一个面向时间序列模型的综合基准与代码库，扩展自此前的 [Autoformer](https://github.com/thuml/Autoformer) 仓库。\n\n## 时间序列分析排行榜\n\n截至 2024 年 3 月，各任务排行榜前三名如下：\n\n| 模型<br>排名 | 长期预测<br>Look-Back-96 | 长期预测<br/>Look-Back-Searching | 短期预测 | 插补 | 分类 | 异常检测 |\n| ------------ | ------------------------ | -------------------------------- | -------- | ---- | ---- | -------- |\n| 🥇 第一名 | [TimeXer](https://arxiv.org/abs/2402.19072) | [TimeMixer](https://openreview.net/pdf?id=7oLshfEIC2) | [TimesNet](https://arxiv.org/abs/2210.02186) | [TimesNet](https://arxiv.org/abs/2210.02186) | [TimesNet](https://arxiv.org/abs/2210.02186) | [TimesNet](https://arxiv.org/abs/2210.02186) |\n| 🥈 第二名 | [iTransformer](https://arxiv.org/abs/2310.06625) | [PatchTST](https://github.com/yuqinie98/PatchTST) | [Non-stationary<br/>Transformer](https://github.com/thuml/Nonstationary_Transformers) | [Non-stationary<br/>Transformer](https://github.com/thuml/Nonstationary_Transformers) | [Non-stationary<br/>Transformer](https://github.com/thuml/Nonstationary_Transformers) | [FEDformer](https://github.com/MAZiqing/FEDformer) |\n| 🥉 第三名 | [TimeMixer](https://openreview.net/pdf?id=7oLshfEIC2) | [DLinear](https://arxiv.org/pdf/2205.13504.pdf) | [FEDformer](https://github.com/MAZiqing/FEDformer) | [Autoformer](https://github.com/thuml/Autoformer) | [Informer](https://github.com/zhouhaoyi/Informer2020) | [Autoformer](https://github.com/thuml/Autoformer) |\n\n**说明：排行榜会持续更新。** 如果您提出了先进的模型，可通过发送论文或代码链接、或提交 PR 与我们联系，我们会尽快将其加入仓库并更新排行榜。\n\n**排行榜中的对比模型**（☑ 表示代码已收录）。\n  - [x] **TimeXer** - TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables [[NeurIPS 2024]](https://arxiv.org/abs/2402.19072) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeXer.py)\n  - [x] **TimeMixer** - TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting [[ICLR 2024]](https://openreview.net/pdf?id=7oLshfEIC2) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeMixer.py)\n  - [x] **TSMixer** - TSMixer: An All-MLP Architecture for Time Series Forecasting [[arXiv 2023]](https://arxiv.org/pdf/2303.06053.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TSMixer.py)\n  - [x] **iTransformer** - iTransformer: Inverted Transformers Are Effective for Time Series Forecasting [[ICLR 2024]](https://arxiv.org/abs/2310.06625) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/iTransformer.py)\n  - [x] **PatchTST** - A Time Series is Worth 64 Words: Long-term Forecasting with Transformers [[ICLR 2023]](https://openreview.net/pdf?id=Jbdc0vTOcol) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/PatchTST.py)\n  - [x] **TimesNet** - TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis [[ICLR 2023]](https://openreview.net/pdf?id=ju_Uqw384Oq) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimesNet.py)\n  - [x] **DLinear** - Are Transformers Effective for Time Series Forecasting? [[AAAI 2023]](https://arxiv.org/pdf/2205.13504.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/DLinear.py)\n  - [x] **LightTS** - Less Is More: Fast Multivariate Time Series Forecasting with Light Sampling-oriented MLP Structures [[arXiv 2022]](https://arxiv.org/abs/2207.01186) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/LightTS.py)\n  - [x] **ETSformer** - ETSformer: Exponential Smoothing Transformers for Time-series Forecasting [[arXiv 2022]](https://arxiv.org/abs/2202.01381) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/ETSformer.py)\n  - [x] **Non-stationary Transformer** - Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting [[NeurIPS 2022]](https://openreview.net/pdf?id=ucNDIDRNjjv) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Nonstationary_Transformer.py)\n  - [x] **FEDformer** - FEDformer: Frequency Enhanced Decomposed Transformer for Long-term Series Forecasting [[ICML 2022]](https://proceedings.mlr.press/v162/zhou22g.html) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/FEDformer.py)\n  - [x] **Pyraformer** - Pyraformer: Low-complexity Pyramidal Attention for Long-range Time Series Modeling and Forecasting [[ICLR 2022]](https://openreview.net/pdf?id=0EXmFzUn5I) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Pyraformer.py)\n  - [x] **Autoformer** - Autoformer: Decomposition Transformers with Auto-Correlation for Long-Term Series Forecasting [[NeurIPS 2021]](https://openreview.net/pdf?id=I55UqU-M11y) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Autoformer.py)\n  - [x] **Informer** - Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting [[AAAI 2021]](https://ojs.aaai.org/index.php/AAAI/article/view/17325/17132) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Informer.py)\n  - [x] **Reformer** - Reformer: The Efficient Transformer [[ICLR 2020]](https://openreview.net/forum?id=rkgNKkHtvB) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Reformer.py)\n  - [x] **Transformer** - Attention is All You Need [[NeurIPS 2017]](https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Transformer.py)\n\n更多详情可参考我们关于 [[TimesNet]](https://arxiv.org/abs/2210.02186) 的最新论文，实时在线版本即将发布。\n\n**新增基线模型**（综合评测后将加入排行榜）。\n  - [x] **MambaSL** - MambaSL: Exploring Single-Layer Mamba for Time Series Classification [[ICLR 2026]](https://openreview.net/forum?id=YDl4vqQqGP) [[Code]](https://github.com/thuml/Time-Series-Library/blob/main/models/MambaSingleLayer.py)\n  - [x] **TimeFilter** - TimeFilter: Patch-Specific Spatial-Temporal Graph Filtration for Time Series Forecasting [[ICML 2025]](https://arxiv.org/abs/2501.13041) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeFilter.py)\n  - [x] **KAN-AD** - KAN-AD: Time Series Anomaly Detection with Kolmogorov-Arnold Networks [[ICML 2025]](https://arxiv.org/abs/2411.00278) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/KANAD.py)\n  - [x] **MultiPatchFormer** - A multiscale model for multivariate time series forecasting [[Scientific Reports 2025]](https://www.nature.com/articles/s41598-024-82417-4) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/MultiPatchFormer.py)\n  - [x] **WPMixer** - WPMixer: Efficient Multi-Resolution Mixing for Long-Term Time Series Forecasting [[AAAI 2025]](https://arxiv.org/abs/2412.17176) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/WPMixer.py)\n  - [x] **MSGNet** - MSGNet: Learning Multi-Scale Inter-Series Correlations for Multivariate Time Series Forecasting [[AAAI 2024]](https://dl.acm.org/doi/10.1609/aaai.v38i10.28991) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/MSGNet.py)\n  - [x] **PAttn** - Are Language Models Actually Useful for Time Series Forecasting? [[NeurIPS 2024]](https://arxiv.org/pdf/2406.16964) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/PAttn.py)\n  - [x] **Mamba** - Mamba: Linear-Time Sequence Modeling with Selective State Spaces [[arXiv 2023]](https://arxiv.org/abs/2312.00752) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Mamba.py)\n  - [x] **SegRNN** - SegRNN: Segment Recurrent Neural Network for Long-Term Time Series Forecasting [[arXiv 2023]](https://arxiv.org/abs/2308.11200.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/SegRNN.py)\n  - [x] **Koopa** - Koopa: Learning Non-stationary Time Series Dynamics with Koopman Predictors [[NeurIPS 2023]](https://arxiv.org/pdf/2305.18803.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Koopa.py)\n  - [x] **FreTS** - Frequency-domain MLPs are More Effective Learners in Time Series Forecasting [[NeurIPS 2023]](https://arxiv.org/pdf/2311.06184.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/FreTS.py)\n  - [x] **MICN** - MICN: Multi-scale Local and Global Context Modeling for Long-term Series Forecasting [[ICLR 2023]](https://openreview.net/pdf?id=zt53IDUR1U) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/MICN.py)\n  - [x] **Crossformer** - Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series Forecasting [[ICLR 2023]](https://openreview.net/pdf?id=vSVLM2j9eie) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Crossformer.py)\n  - [x] **TiDE** - Long-term Forecasting with TiDE: Time-series Dense Encoder [[arXiv 2023]](https://arxiv.org/pdf/2304.08424.pdf) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TiDE.py)\n  - [x] **SCINet** - SCINet: Time Series Modeling and Forecasting with Sample Convolution and Interaction [[NeurIPS 2022]](https://openreview.net/pdf?id=AyajSjTAzmg) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/SCINet.py)\n  - [x] **FiLM** - FiLM: Frequency improved Legendre Memory Model for Long-term Time Series Forecasting [[NeurIPS 2022]](https://openreview.net/forum?id=zTQdHSQUQWc) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/FiLM.py)\n  - [x] **TFT** - Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting [[arXiv 2019]](https://arxiv.org/abs/1912.09363) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TemporalFusionTransformer.py)\n\n**新增大型时间序列模型**。本库同样支持以下 LTSM 的零样本评测：\n\n- [x] **Chronos2** - Chronos-2: From Univariate to Universal Forecasting [[arXiv 2025]](https://arxiv.org/abs/2510.15821) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Chronos2.py)\n- [x] **TiRex** - TiRex: Zero-Shot Forecasting Across Long and Short Horizons with Enhanced In-Context Learning [[NeurIPS 2025]](https://arxiv.org/pdf/2505.23719) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TiRex.py)\n- [x] **Sundial** - Sundial: A Family of Highly Capable Time Series Foundation Models [[ICML 2025]](https://arxiv.org/pdf/2502.00816) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Sundial.py)\n- [x] **Time-MoE** - Time-MoE: Billion-Scale Time Series Foundation Models with Mixture of Experts [[ICLR 2025]](https://arxiv.org/pdf/2409.16040) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimeMoE.py)\n- [x] **Toto** - Toto: Time Series Optimized Transformer for Observability [[arXiv 2024]](https://arxiv.org/pdf/2407.07874)\n- [x] **Chronos** - Chronos: Learning the Language of Time Series [[TMLR 2024]](https://arxiv.org/pdf/2403.07815) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/Chronos.py)\n- [x] **Moirai** - Unified Training of Universal Time Series Forecasting Transformers [[ICML 2024]](https://arxiv.org/pdf/2402.02592)\n- [x] **TimesFM** - TimesFM: A decoder-only foundation model for time-series forecasting [[ICML 2024]](https://arxiv.org/abs/2310.10688) [[代码]](https://github.com/thuml/Time-Series-Library/blob/main/models/TimesFM.py)\n\n## 快速开始\n\n### 准备数据\n可从 [[Google Drive]](https://drive.google.com/drive/folders/13Cg1KYOlzM5C7K8gK8NfC-F3EYxkM3D2?usp=sharing)、[[Baidu Drive]](https://pan.baidu.com/s/1r3KhGd0Q9PJIUZdfEYoymg?pwd=i9iy) 或 [[Hugging Face]](https://huggingface.co/datasets/thuml/Time-Series-Library) 下载预处理数据，并置于 `./dataset` 目录。\n\n### 安装\n1. 克隆本仓库\n   ```bash\n   git clone https://github.com/thuml/Time-Series-Library.git\n   cd Time-Series-Library\n   ```\n\n2. 创建新的 Conda 环境\n   ```bash\n   conda create -n tslib python=3.11\n   conda activate tslib\n   ```\n\n3. 安装核心依赖\n   > ⚠️ **CUDA 兼容性提示**\n   > torch 预编译包与 **CUDA 版本强相关**。（查看 https://pytorch.org/get-started/previous-versions/ ）\n   > 请确保torch安装与本地 CUDA 版本匹配的包（如 `cu118` 或 `cu121`）。\n   > 推荐torch==2.5.1\n\n   ```bash\n   pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cu121\n   \n   pip install -r requirements.txt\n   ```\n\n4. 安装 Mamba 模型依赖（models/Mamba.py 需要）\n   > ⚠️ **只有linux版本**\n   > ⚠️ **CUDA 兼容性提示**\n   > Mamba 预编译包与 **CUDA 版本强相关**。\n   > 请确保安装与本地 CUDA 版本匹配的包（如 `cu11` 或 `cu12`）。\n   > 版本不匹配可能导致运行时错误或导入失败。\n\n   **CUDA 12** 示例：\n\n   ```bash\n   pip install https://github.com/state-spaces/mamba/releases/download/v2.2.6.post3/mamba_ssm-2.2.6.post3+cu12torch2.5cxx11abiFALSE-cp311-cp311-linux_x86_64.whl\n   ```\n\n5. 安装 Moirai 模型依赖（models/Moirai.py 需要）\n   ```bash\n   pip install uni2ts --no-deps\n   ```\n\n### Docker 部署\n\n```bash\n# 构建并以后台模式启动容器\ndocker compose -f 'Time-Series-Library/docker-compose.yml' up -d --build\n\n# 在仓库根目录创建 ./dataset 并下载/放置数据集\nmkdir -p dataset\n\n# 将本地数据集复制到容器内 /workspace/dataset\ndocker cp ./dataset tslib:/workspace/dataset\n\n# 进入运行中的容器\ndocker exec -it tslib bash\n\n# 切换到容器内的工作目录\ncd /workspace\n\n# 使用预训练 Moirai 模型进行零样本预测\npython -u run.py \\\n  --task_name zero_shot_forecast \\   # 任务类型：零样本预测\n  --is_training 0 \\                  # 0 = 仅推理\n  --root_path ./dataset/ETT-small/ \\ # 数据集根路径\n  --data_path ETTh1.csv \\            # 数据文件名\n  --model_id ETTh1_512_96 \\          # 实验/模型标识\n  --model Moirai \\                   # 模型名称（TimesFM / Moirai）\n  --data ETTh1 \\                     # 数据集名称\n  --features M \\                     # 多变量预测\n  --seq_len 512 \\                    # 输入序列长度\n  --pred_len 96 \\                    # 预测步长\n  --enc_in 7 \\                       # 输入变量数\n  --des 'Exp' \\                      # 实验描述\n  --itr 1                             # 运行次数\n```\n\n### 快速测试\n\n5个任务快速测试（每个任务1个epoch）：\n\n```bash\n# 执行所有5个任务的快速测试\nexport CUDA_VISIBLE_DEVICES=0\n\n# 1. 长期预测\npython -u run.py --task_name long_term_forecast --is_training 1 --root_path ./dataset/ETT-small/ --data_path ETTh1.csv --model_id test_long --model DLinear --data ETTh1 --features M --seq_len 96 --pred_len 96 --enc_in 7 --dec_in 7 --c_out 7 --train_epochs 1 --num_workers 2\n\n# 2. 短期预测（使用ETT数据集，较短预测长度）\npython -u run.py --task_name long_term_forecast --is_training 1 --root_path ./dataset/ETT-small/ --data_path ETTh1.csv --model_id test_short --model TimesNet --data ETTh1 --features M --seq_len 24 --label_len 12 --pred_len 24 --e_layers 2 --d_layers 1 --d_model 16 --d_ff 32 --enc_in 7 --dec_in 7 --c_out 7 --top_k 5 --train_epochs 1 --num_workers 2\n\n# 3. 插补\npython -u run.py --task_name imputation --is_training 1 --root_path ./dataset/ETT-small/ --data_path ETTh1.csv --model_id test_imp --model TimesNet --data ETTh1 --features M --seq_len 96 --e_layers 2 --d_layers 1 --d_model 16 --d_ff 32 --enc_in 7 --dec_in 7 --c_out 7 --top_k 3 --train_epochs 1 --num_workers 2 --label_len 0 --pred_len 0 --mask_rate 0.125 --learning_rate 0.001\n\n# 4. 异常检测\npython -u run.py --task_name anomaly_detection --is_training 1 --root_path ./dataset/PSM --model_id test_ad --model TimesNet --data PSM --features M --seq_len 100 --pred_len 0 --d_model 64 --d_ff 64 --e_layers 2 --enc_in 25 --c_out 25 --anomaly_ratio 1.0 --top_k 3 --train_epochs 1 --batch_size 128 --num_workers 2\n\n# 5. 分类\npython -u run.py --task_name classification --is_training 1 --root_path ./dataset/Heartbeat/ --model_id Heartbeat --model TimesNet --data UEA --e_layers 2 --d_layers 1 --factor 3 --d_model 64 --d_ff 128 --top_k 3 --train_epochs 1 --batch_size 16 --learning_rate 0.001 --num_workers 0\n```\n\n### 训练与评测\n\n`./scripts/` 目录下提供了全部基准的实验脚本，可参考下列示例复现实验：\n\n> ⚠️ 部分脚本中默认设置了 `CUDA_VISIBLE_DEVICES`，请根据实际 GPU 配置修改或删除该设置，否则可能导致无法使用 GPU。\n\n```bash\n# 长期预测\nbash ./scripts/long_term_forecast/ETT_script/TimesNet_ETTh1.sh\n# 短期预测\nbash ./scripts/short_term_forecast/TimesNet_M4.sh\n# 插补\nbash ./scripts/imputation/ETT_script/TimesNet_ETTh1.sh\n# 异常检测\nbash ./scripts/anomaly_detection/PSM/TimesNet.sh\n# 分类\nbash ./scripts/classification/TimesNet.sh\n```\n\n\n### 开发自定义模型\n- 将模型文件放入 `./models`，可参考 `./models/Transformer.py`。\n- 在 `./scripts` 下创建对应的运行脚本。\n\n### 注意事项：\n\n(1) 关于分类：由于我们在统一代码库中涵盖五大任务，各子任务的精度可能略有波动，但平均性能可复现（甚至略高）。复现用 checkpoint 可在 [此处](https://github.com/thuml/Time-Series-Library/issues/494) 下载。\n\n(2) 关于异常检测：有关异常检测调整策略的讨论见[这里](https://github.com/thuml/Anomaly-Transformer/issues/14)，核心是该调整策略对应事件级指标。\n\n### 查看项目文件结构：\n\n```\nTime-Series-Library/\n├── README.md                     # 官方README，包含任务、榜单、使用方法\n├── requirements.txt              # pip依赖列表，直接pip install复现环境\n├── LICENSE / CONTRIBUTING.md     # 原项目许可与贡献指南\n├── run.py                        # 单入口脚本，解析参数并调度各任务\n├── exp/                          # 各任务实验管线，封装训练/验证/测试\n│   ├── exp_basic.py              # 实验基类，注册所有模型，统一构建流程\n│   ├── exp_long_term_forecasting.py    # 长期预测实验逻辑\n│   ├── exp_short_term_forecasting.py   # 短期预测实验逻辑\n│   ├── exp_imputation.py               # 缺失值填充实验\n│   ├── exp_anomaly_detection.py        # 异常检测实验\n│   ├── exp_classification.py           # 分类实验\n│   └── exp_zero_shot_forecasting.py    # LTSM零样本预测评估\n├── data_provider/                # 数据入口，负责数据集载入与切分\n│   ├── data_factory.py           # 根据任务选择对应DataLoader\n│   ├── data_loader.py            # 通用时序数据读取与滑窗逻辑\n│   ├── uea.py / m4.py            # UEA、M4等特定数据格式处理\n│   └── __init__.py               # 暴露上层可用的数据工厂接口\n├── models/                       # 所有模型实现，文件名即模型名\n│   ├── TimesNet.py、TimeMixer.py 等 # 主流预测模型\n│   ├── Chronos2.py、TiRex.py     # LTSM零样本模型\n│   └── __init__.py               # 统一导出供实验模块按名称实例化\n├── layers/                       # 复用层/块，如注意力、卷积、嵌入\n│   ├── Transformer_EncDec.py     # Transformer编解码堆栈\n│   ├── AutoCorrelation.py        # 自相关算子\n│   ├── MultiWaveletCorrelation.py# 频域单元\n│   └── Embed.py 等               # 各模型共享基元\n├── utils/                        # 工具集合\n│   ├── metrics.py                # MSE/MAE/DTW等评估指标\n│   ├── tools.py                  # 训练通用工具，比如EarlyStopping\n│   ├── augmentation.py           # 分类/检测任务增强策略\n│   ├── print_args.py             # 统一打印参数\n│   └── masking.py / losses.py    # 任务相关辅助函数\n├── scripts/                      # 复现实验的bash脚本\n│   ├── long_term_forecast/       # 按数据集/模型划分的长期预测脚本\n│   ├── short_term_forecast/      # M4等短期预测脚本\n│   ├── imputation/               # 多数据集缺失填充脚本\n│   ├── anomaly_detection/        # SMD/SMAP/SWAT等检测脚本\n│   ├── classification/           # UEA分类脚本\n│   └── exogenous_forecast/       # TimeXer外生变量预测流程\n├── tutorial/                     # 官方TimesNet教学notebook与插图\n└── pic/                          # README插图（数据集分布等）\n```\n\n### 理解项目架构：\n\n- **整体流程**：通过 `scripts/*.sh` 设定实验参数 → 调用 `python run.py ...` → `run.py` 解析参数并根据 `task_name` 选择对应 `Exp_*` 类 → `Exp_*` 内部利用 `data_provider` 构造数据加载器、`models` 实例化网络、`utils` 中的工具完成训练/验证/测试 → 结果与模型参数写入 `./checkpoints`。\n- **实验层（exp/）**：`Exp_Basic` 负责注册模型与设备，子类实现 `_get_data/train/test`，将不同任务的差异隔离，方便模型在多任务间复用。\n- **模型与层（models/ + layers/）**：模型文件集中定义各网络结构，公用的注意力、卷积、频域块等沉淀在 `layers/`，减少重复实现。\n- **数据层（data_provider/）**：`data_factory` 按任务返回 Dataset/DataLoader，`data_loader` 封装序列裁剪、滑动窗口、掩码策略，不同任务通过参数控制窗口长度、缺失率、异常比例。\n- **脚本层（scripts/）**：提供与论文一致的复现实验脚本，涵盖各种数据集/模型/GPU 配置，便于批量跑榜，也可作为自定义实验的起点。\n- **辅助层（utils/）**：`metrics` 统一评估指标，`tools` 中的 `EarlyStopping`、`adjust_learning_rate` 等负责训练调度；`augmentation`/`masking` 等用于任务特定的数据增强或预处理。\n- **学习建议**：阅读顺序推荐 `scripts -> run.py -> exp/exp_basic.py -> 对应 Exp 子类 -> data_provider -> models`，并结合 `tutorial/TimesNet_tutorial.ipynb` 快速熟悉整体调用链，再按需深入模型或层级实现。\n\n## 引用\n\n如果本仓库对您有帮助，请引用以下论文：\n\n```\n@inproceedings{wu2023timesnet,\n  title={TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis},\n  author={Haixu Wu and Tengge Hu and Yong Liu and Hang Zhou and Jianmin Wang and Mingsheng Long},\n  booktitle={International Conference on Learning Representations},\n  year={2023},\n}\n\n@article{wang2024tssurvey,\n  title={Deep Time Series Models: A Comprehensive Survey and Benchmark},\n  author={Yuxuan Wang and Haixu Wu and Jiaxiang Dong and Yong Liu and Mingsheng Long and Jianmin Wang},\n  booktitle={arXiv preprint arXiv:2407.13278},\n  year={2024},\n}\n```\n\n## 联系方式\n如有问题或建议，欢迎联系维护团队：\n\n现任：\n- Haixu Wu（博士，wuhaixu98@gmail.com）\n- Yuxuan Wang（博士生，wangyuxu22@mails.tsinghua.edu.cn）\n- Yong Liu（博士生，liuyong21@mails.tsinghua.edu.cn）\n- Ailuntz（开源社区学生，ailuntz@icloud.com）\n\n往届：\n- Huikun Weng（本科生，wenghk22@mails.tsinghua.edu.cn）\n- Tengge Hu（硕士，htg21@mails.tsinghua.edu.cn）\n- Haoran Zhang（硕士，z-hr20@mails.tsinghua.edu.cn）\n- Jiawei Guo（本科生，guo-jw21@mails.tsinghua.edu.cn）\n\n也欢迎在 Issues 中反馈。\n\n## 致谢\n\n本库参考了以下仓库：\n\n- 预测：https://github.com/thuml/Autoformer\n- 异常检测：https://github.com/thuml/Anomaly-Transformer\n- 分类：https://github.com/thuml/Flowformer\n\n实验所用数据集均为公开数据，来源如下：\n\n- 长期预测与插补：https://github.com/thuml/Autoformer\n- 短期预测：https://github.com/ServiceNow/N-BEATS\n- 异常检测：https://github.com/thuml/Anomaly-Transformer\n- 分类：https://www.timeseriesclassification.com/\n\n## 感谢所有贡献者\n\n<a href=\"https://github.com/thuml/Time-Series-Library/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=thuml/Time-Series-Library\" />\n</a>\n"
  },
  {
    "path": "data_provider/__init__.py",
    "content": "\n"
  },
  {
    "path": "data_provider/data_factory.py",
    "content": "from data_provider.data_loader import Dataset_ETT_hour, Dataset_ETT_minute, Dataset_Custom, Dataset_M4, PSMSegLoader, \\\n    MSLSegLoader, SMAPSegLoader, SMDSegLoader, SWATSegLoader, UEAloader\nfrom data_provider.uea import collate_fn\nfrom torch.utils.data import DataLoader\n\ndata_dict = {\n    'ETTh1': Dataset_ETT_hour,\n    'ETTh2': Dataset_ETT_hour,\n    'ETTm1': Dataset_ETT_minute,\n    'ETTm2': Dataset_ETT_minute,\n    'custom': Dataset_Custom,\n    'm4': Dataset_M4,\n    'PSM': PSMSegLoader,\n    'MSL': MSLSegLoader,\n    'SMAP': SMAPSegLoader,\n    'SMD': SMDSegLoader,\n    'SWAT': SWATSegLoader,\n    'UEA': UEAloader\n}\n\n\ndef data_provider(args, flag):\n    Data = data_dict[args.data]\n    timeenc = 0 if args.embed != 'timeF' else 1\n\n    shuffle_flag = False if (flag == 'test' or flag == 'TEST') else True\n    drop_last = False\n    batch_size = args.batch_size\n    freq = args.freq\n\n    if args.task_name == 'anomaly_detection':\n        drop_last = False\n        data_set = Data(\n            args = args,\n            root_path=args.root_path,\n            win_size=args.seq_len,\n            flag=flag,\n        )\n        print(flag, len(data_set))\n        data_loader = DataLoader(\n            data_set,\n            batch_size=batch_size,\n            shuffle=shuffle_flag,\n            num_workers=args.num_workers,\n            drop_last=drop_last)\n        return data_set, data_loader\n    elif args.task_name == 'classification':\n        drop_last = False\n        data_set = Data(\n            args = args,\n            root_path=args.root_path,\n            flag=flag,\n        )\n\n        data_loader = DataLoader(\n            data_set,\n            batch_size=batch_size,\n            shuffle=shuffle_flag,\n            num_workers=args.num_workers,\n            drop_last=drop_last,\n            collate_fn=lambda x: collate_fn(x, max_len=args.seq_len)\n        )\n        return data_set, data_loader\n    else:\n        if args.data == 'm4':\n            drop_last = False\n        data_set = Data(\n            args = args,\n            root_path=args.root_path,\n            data_path=args.data_path,\n            flag=flag,\n            size=[args.seq_len, args.label_len, args.pred_len],\n            features=args.features,\n            target=args.target,\n            timeenc=timeenc,\n            freq=freq,\n            seasonal_patterns=args.seasonal_patterns\n        )\n        print(flag, len(data_set))\n        data_loader = DataLoader(\n            data_set,\n            batch_size=batch_size,\n            shuffle=shuffle_flag,\n            num_workers=args.num_workers,\n            drop_last=drop_last)\n        return data_set, data_loader\n"
  },
  {
    "path": "data_provider/data_loader.py",
    "content": "import os\nimport numpy as np\nimport pandas as pd\nimport glob\nimport re\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom sklearn.preprocessing import StandardScaler\nfrom utils.timefeatures import time_features\nfrom data_provider.m4 import M4Dataset, M4Meta\nfrom data_provider.uea import subsample, interpolate_missing, Normalizer\nfrom sktime.datasets import load_from_tsfile_to_dataframe\nimport warnings\nfrom utils.augmentation import run_augmentation_single\nfrom datasets import load_dataset\nfrom huggingface_hub import hf_hub_download\nwarnings.filterwarnings('ignore')\n\nHUGGINGFACE_REPO = \"thuml/Time-Series-Library\"\n\nclass Dataset_ETT_hour(Dataset):\n    def __init__(self, args, root_path, flag='train', size=None,\n                 features='S', data_path='ETTh1.csv',\n                 target='OT', scale=True, timeenc=0, freq='h', seasonal_patterns=None):\n        # size [seq_len, label_len, pred_len]\n        self.args = args\n        # info\n        if size == None:\n            self.seq_len = 24 * 4 * 4\n            self.label_len = 24 * 4\n            self.pred_len = 24 * 4\n        else:\n            self.seq_len = size[0]\n            self.label_len = size[1]\n            self.pred_len = size[2]\n        # init\n        assert flag in ['train', 'test', 'val']\n        type_map = {'train': 0, 'val': 1, 'test': 2}\n        self.set_type = type_map[flag]\n\n        self.features = features\n        self.target = target\n        self.scale = scale\n        self.timeenc = timeenc\n        self.freq = freq\n\n        self.root_path = root_path\n        self.data_path = data_path\n        self.__read_data__()\n\n    def __read_data__(self):\n        self.scaler = StandardScaler()\n\n        local_fp = os.path.join(self.root_path, self.data_path)\n        cfg_name = os.path.splitext(os.path.basename(self.data_path))[0]\n\n        if os.path.exists(local_fp):\n            df_raw = pd.read_csv(local_fp)\n        else:\n            ds = load_dataset(HUGGINGFACE_REPO, name=cfg_name)\n            df_raw = ds[\"train\"].to_pandas()\n            \n        border1s = [0, 12 * 30 * 24 - self.seq_len, 12 * 30 * 24 + 4 * 30 * 24 - self.seq_len]\n        border2s = [12 * 30 * 24, 12 * 30 * 24 + 4 * 30 * 24, 12 * 30 * 24 + 8 * 30 * 24]\n        border1 = border1s[self.set_type]\n        border2 = border2s[self.set_type]\n\n        if self.features == 'M' or self.features == 'MS':\n            cols_data = df_raw.columns[1:]\n            df_data = df_raw[cols_data]\n        elif self.features == 'S':\n            df_data = df_raw[[self.target]]\n\n        if self.scale:\n            train_data = df_data[border1s[0]:border2s[0]]\n            self.scaler.fit(train_data.values)\n            data = self.scaler.transform(df_data.values)\n        else:\n            data = df_data.values\n\n        df_stamp = df_raw[['date']][border1:border2]\n        df_stamp['date'] = pd.to_datetime(df_stamp.date)\n        if self.timeenc == 0:\n            df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1)\n            df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1)\n            df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1)\n            df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1)\n            data_stamp = df_stamp.drop(['date'], 1).values\n        elif self.timeenc == 1:\n            data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq)\n            data_stamp = data_stamp.transpose(1, 0) \n\n        self.data_x = data[border1:border2]\n        self.data_y = data[border1:border2]\n\n        if self.set_type == 0 and self.args.augmentation_ratio > 0:\n            self.data_x, self.data_y, augmentation_tags = run_augmentation_single(self.data_x, self.data_y, self.args)\n\n        self.data_stamp = data_stamp\n\n    def __getitem__(self, index):\n        s_begin = index\n        s_end = s_begin + self.seq_len\n        r_begin = s_end - self.label_len\n        r_end = r_begin + self.label_len + self.pred_len\n\n        seq_x = self.data_x[s_begin:s_end]\n        seq_y = self.data_y[r_begin:r_end]\n        seq_x_mark = self.data_stamp[s_begin:s_end]\n        seq_y_mark = self.data_stamp[r_begin:r_end]\n\n        return seq_x, seq_y, seq_x_mark, seq_y_mark\n\n    def __len__(self):\n        return len(self.data_x) - self.seq_len - self.pred_len + 1\n\n    def inverse_transform(self, data):\n        return self.scaler.inverse_transform(data)\n\n\nclass Dataset_ETT_minute(Dataset):\n    def __init__(self, args, root_path, flag='train', size=None,\n                 features='S', data_path='ETTm1.csv',\n                 target='OT', scale=True, timeenc=0, freq='t', seasonal_patterns=None):\n        # size [seq_len, label_len, pred_len]\n        self.args = args\n        # info\n        if size == None:\n            self.seq_len = 24 * 4 * 4\n            self.label_len = 24 * 4\n            self.pred_len = 24 * 4\n        else:\n            self.seq_len = size[0]\n            self.label_len = size[1]\n            self.pred_len = size[2]\n        # init\n        assert flag in ['train', 'test', 'val']\n        type_map = {'train': 0, 'val': 1, 'test': 2}\n        self.set_type = type_map[flag]\n\n        self.features = features\n        self.target = target\n        self.scale = scale\n        self.timeenc = timeenc\n        self.freq = freq\n\n        self.root_path = root_path\n        self.data_path = data_path\n        self.__read_data__()\n\n    def __read_data__(self):\n        self.scaler = StandardScaler()\n        \n        local_fp = os.path.join(self.root_path, self.data_path)\n        cfg_name = os.path.splitext(os.path.basename(self.data_path))[0]\n\n        if os.path.exists(local_fp):\n            df_raw = pd.read_csv(local_fp)\n        else:\n            ds = load_dataset(HUGGINGFACE_REPO, name=cfg_name)\n            df_raw = ds[\"train\"].to_pandas()\n\n        border1s = [0, 12 * 30 * 24 * 4 - self.seq_len, 12 * 30 * 24 * 4 + 4 * 30 * 24 * 4 - self.seq_len]\n        border2s = [12 * 30 * 24 * 4, 12 * 30 * 24 * 4 + 4 * 30 * 24 * 4, 12 * 30 * 24 * 4 + 8 * 30 * 24 * 4]\n        border1 = border1s[self.set_type]\n        border2 = border2s[self.set_type]\n\n        if self.features == 'M' or self.features == 'MS':\n            cols_data = df_raw.columns[1:]\n            df_data = df_raw[cols_data]\n        elif self.features == 'S':\n            df_data = df_raw[[self.target]]\n\n        if self.scale:\n            train_data = df_data[border1s[0]:border2s[0]]\n            self.scaler.fit(train_data.values)\n            data = self.scaler.transform(df_data.values)\n        else:\n            data = df_data.values\n\n        df_stamp = df_raw[['date']][border1:border2]\n        df_stamp['date'] = pd.to_datetime(df_stamp.date)\n        if self.timeenc == 0:\n            df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1)\n            df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1)\n            df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1)\n            df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1)\n            df_stamp['minute'] = df_stamp.date.apply(lambda row: row.minute, 1)\n            df_stamp['minute'] = df_stamp.minute.map(lambda x: x // 15)\n            data_stamp = df_stamp.drop(['date'], 1).values\n        elif self.timeenc == 1:\n            data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq)\n            data_stamp = data_stamp.transpose(1, 0)\n\n        self.data_x = data[border1:border2]\n        self.data_y = data[border1:border2]\n\n        if self.set_type == 0 and self.args.augmentation_ratio > 0:\n            self.data_x, self.data_y, augmentation_tags = run_augmentation_single(self.data_x, self.data_y, self.args)\n\n        self.data_stamp = data_stamp\n\n    def __getitem__(self, index):\n        s_begin = index\n        s_end = s_begin + self.seq_len\n        r_begin = s_end - self.label_len\n        r_end = r_begin + self.label_len + self.pred_len\n\n        seq_x = self.data_x[s_begin:s_end]\n        seq_y = self.data_y[r_begin:r_end]\n        seq_x_mark = self.data_stamp[s_begin:s_end]\n        seq_y_mark = self.data_stamp[r_begin:r_end]\n\n        return seq_x, seq_y, seq_x_mark, seq_y_mark\n\n    def __len__(self):\n        return len(self.data_x) - self.seq_len - self.pred_len + 1\n\n    def inverse_transform(self, data):\n        return self.scaler.inverse_transform(data)\n\n\nclass Dataset_Custom(Dataset):\n    def __init__(self, args, root_path, flag='train', size=None,\n                 features='S', data_path='ETTh1.csv',\n                 target='OT', scale=True, timeenc=0, freq='h', seasonal_patterns=None):\n        # size [seq_len, label_len, pred_len]\n        self.args = args\n        # info\n        if size == None:\n            self.seq_len = 24 * 4 * 4\n            self.label_len = 24 * 4\n            self.pred_len = 24 * 4\n        else:\n            self.seq_len = size[0]\n            self.label_len = size[1]\n            self.pred_len = size[2]\n        # init\n        assert flag in ['train', 'test', 'val']\n        type_map = {'train': 0, 'val': 1, 'test': 2}\n        self.set_type = type_map[flag]\n\n        self.features = features\n        self.target = target\n        self.scale = scale\n        self.timeenc = timeenc\n        self.freq = freq\n\n        self.root_path = root_path\n        self.data_path = data_path\n        self.__read_data__()\n\n    def __read_data__(self):\n        self.scaler = StandardScaler()\n        local_fp = os.path.join(self.root_path, self.data_path)\n        cfg_name = os.path.splitext(os.path.basename(self.data_path))[0]\n\n        if os.path.exists(local_fp):\n            df_raw = pd.read_csv(local_fp)\n        else:\n            ds = load_dataset(HUGGINGFACE_REPO, name=cfg_name)\n            split_name = \"train\" if \"train\" in ds else list(ds.keys())[0]\n            df_raw = ds[split_name].to_pandas()\n\n        '''\n        df_raw.columns: ['date', ...(other features), target feature]\n        '''\n        cols = list(df_raw.columns)\n        cols.remove(self.target)\n        cols.remove('date')\n        df_raw = df_raw[['date'] + cols + [self.target]]\n        num_train = int(len(df_raw) * 0.7)\n        num_test = int(len(df_raw) * 0.2)\n        num_vali = len(df_raw) - num_train - num_test\n        border1s = [0, num_train - self.seq_len, len(df_raw) - num_test - self.seq_len]\n        border2s = [num_train, num_train + num_vali, len(df_raw)]\n        border1 = border1s[self.set_type]\n        border2 = border2s[self.set_type]\n\n        if self.features == 'M' or self.features == 'MS':\n            cols_data = df_raw.columns[1:]\n            df_data = df_raw[cols_data]\n        elif self.features == 'S':\n            df_data = df_raw[[self.target]]\n\n        if self.scale:\n            train_data = df_data[border1s[0]:border2s[0]]\n            self.scaler.fit(train_data.values)\n            data = self.scaler.transform(df_data.values)\n        else:\n            data = df_data.values\n\n        df_stamp = df_raw[['date']][border1:border2]\n        df_stamp['date'] = pd.to_datetime(df_stamp.date)\n        if self.timeenc == 0:\n            df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1)\n            df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1)\n            df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1)\n            df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1)\n            data_stamp = df_stamp.drop(['date'], 1).values\n        elif self.timeenc == 1:\n            data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq)\n            data_stamp = data_stamp.transpose(1, 0)\n\n        self.data_x = data[border1:border2]\n        self.data_y = data[border1:border2]\n\n        if self.set_type == 0 and self.args.augmentation_ratio > 0:\n            self.data_x, self.data_y, augmentation_tags = run_augmentation_single(self.data_x, self.data_y, self.args)\n\n        self.data_stamp = data_stamp\n\n    def __getitem__(self, index):\n        s_begin = index\n        s_end = s_begin + self.seq_len\n        r_begin = s_end - self.label_len\n        r_end = r_begin + self.label_len + self.pred_len\n\n        seq_x = self.data_x[s_begin:s_end]\n        seq_y = self.data_y[r_begin:r_end]\n        seq_x_mark = self.data_stamp[s_begin:s_end]\n        seq_y_mark = self.data_stamp[r_begin:r_end]\n\n        return seq_x, seq_y, seq_x_mark, seq_y_mark\n\n    def __len__(self):\n        return len(self.data_x) - self.seq_len - self.pred_len + 1\n\n    def inverse_transform(self, data):\n        return self.scaler.inverse_transform(data)\n\n\nclass Dataset_M4(Dataset):\n    def __init__(self, args, root_path, flag='pred', size=None,\n                 features='S', data_path='ETTh1.csv',\n                 target='OT', scale=False, inverse=False, timeenc=0, freq='15min',\n                 seasonal_patterns='Yearly'):\n        # size [seq_len, label_len, pred_len]\n        # init\n        self.features = features\n        self.target = target\n        self.scale = scale\n        self.inverse = inverse\n        self.timeenc = timeenc\n        self.root_path = root_path\n\n        self.seq_len = size[0]\n        self.label_len = size[1]\n        self.pred_len = size[2]\n\n        self.seasonal_patterns = seasonal_patterns\n        self.history_size = M4Meta.history_size[seasonal_patterns]\n        self.window_sampling_limit = int(self.history_size * self.pred_len)\n        self.flag = flag\n\n        self.__read_data__()\n\n    def __read_data__(self):\n        # M4Dataset.initialize()\n        if self.flag == 'train':\n            dataset = M4Dataset.load(training=True, dataset_file=self.root_path)\n        else:\n            dataset = M4Dataset.load(training=False, dataset_file=self.root_path)\n        training_values = np.array(\n            [v[~np.isnan(v)] for v in\n             dataset.values[dataset.groups == self.seasonal_patterns]])  # split different frequencies\n        self.ids = np.array([i for i in dataset.ids[dataset.groups == self.seasonal_patterns]])\n        self.timeseries = [ts for ts in training_values]\n\n    def __getitem__(self, index):\n        insample = np.zeros((self.seq_len, 1))\n        insample_mask = np.zeros((self.seq_len, 1))\n        outsample = np.zeros((self.pred_len + self.label_len, 1))\n        outsample_mask = np.zeros((self.pred_len + self.label_len, 1))  # m4 dataset\n\n        sampled_timeseries = self.timeseries[index]\n        cut_point = np.random.randint(low=max(1, len(sampled_timeseries) - self.window_sampling_limit),\n                                      high=len(sampled_timeseries),\n                                      size=1)[0]\n\n        insample_window = sampled_timeseries[max(0, cut_point - self.seq_len):cut_point]\n        insample[-len(insample_window):, 0] = insample_window\n        insample_mask[-len(insample_window):, 0] = 1.0\n        outsample_window = sampled_timeseries[\n                           max(0, cut_point - self.label_len):min(len(sampled_timeseries), cut_point + self.pred_len)]\n        outsample[:len(outsample_window), 0] = outsample_window\n        outsample_mask[:len(outsample_window), 0] = 1.0\n        return insample, outsample, insample_mask, outsample_mask\n\n    def __len__(self):\n        return len(self.timeseries)\n\n    def inverse_transform(self, data):\n        return self.scaler.inverse_transform(data)\n\n    def last_insample_window(self):\n        \"\"\"\n        The last window of insample size of all timeseries.\n        This function does not support batching and does not reshuffle timeseries.\n\n        :return: Last insample window of all timeseries. Shape \"timeseries, insample size\"\n        \"\"\"\n        insample = np.zeros((len(self.timeseries), self.seq_len))\n        insample_mask = np.zeros((len(self.timeseries), self.seq_len))\n        for i, ts in enumerate(self.timeseries):\n            ts_last_window = ts[-self.seq_len:]\n            insample[i, -len(ts):] = ts_last_window\n            insample_mask[i, -len(ts):] = 1.0\n        return insample, insample_mask\n\n\nclass PSMSegLoader(Dataset):\n    def __init__(self, args, root_path, win_size, step=1, flag=\"train\"):\n        self.flag = flag\n        self.step = step\n        self.win_size = win_size\n        self.scaler = StandardScaler()\n        train_path = os.path.join(root_path, \"train.csv\")\n        test_path = os.path.join(root_path, \"test.csv\")\n        label_path = os.path.join(root_path, \"test_label.csv\")\n\n        if all(os.path.exists(p) for p in [train_path, test_path, label_path]):\n            train_df      = pd.read_csv(train_path)\n            test_df       = pd.read_csv(test_path)\n            test_label_df = pd.read_csv(label_path)\n        else:\n            ds_data  = load_dataset(HUGGINGFACE_REPO, name=\"PSM-data\")\n            ds_label = load_dataset(HUGGINGFACE_REPO, name=\"PSM-label\")\n            train_df      = ds_data[\"train\"].to_pandas()\n            test_df       = ds_data[\"test\"].to_pandas()\n            test_label_df = ds_label[next(iter(ds_label))].to_pandas()\n\n        data = train_df.values[:, 1:]\n        data = np.nan_to_num(data)\n        self.scaler.fit(data)\n        data = self.scaler.transform(data)\n        \n        test_data = test_df.values[:, 1:]\n        test_data = np.nan_to_num(test_data)\n        self.test = self.scaler.transform(test_data)\n        \n        self.train = data\n        data_len = len(self.train)\n        self.val = self.train[(int)(data_len * 0.8):]\n        self.test_labels = test_label_df.values[:, 1:]\n        print(\"test:\", self.test.shape)\n        print(\"train:\", self.train.shape)\n\n    def __len__(self):\n        if self.flag == \"train\":\n            return (self.train.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'val'):\n            return (self.val.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'test'):\n            return (self.test.shape[0] - self.win_size) // self.step + 1\n        else:\n            return (self.test.shape[0] - self.win_size) // self.win_size + 1\n\n    def __getitem__(self, index):\n        index = index * self.step\n        if self.flag == \"train\":\n            return np.float32(self.train[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'val'):\n            return np.float32(self.val[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'test'):\n            return np.float32(self.test[index:index + self.win_size]), np.float32(\n                self.test_labels[index:index + self.win_size])\n        else:\n            return np.float32(self.test[\n                              index // self.step * self.win_size:index // self.step * self.win_size + self.win_size]), np.float32(\n                self.test_labels[index // self.step * self.win_size:index // self.step * self.win_size + self.win_size])\n\n\nclass MSLSegLoader(Dataset):\n    def __init__(self, args, root_path, win_size, step=1, flag=\"train\"):\n        self.flag = flag\n        self.step = step\n        self.win_size = win_size\n        self.scaler = StandardScaler()\n        \n        train_path = os.path.join(root_path, \"MSL_train.npy\")\n        test_path  = os.path.join(root_path, \"MSL_test.npy\")\n        label_path = os.path.join(root_path, \"MSL_test_label.npy\")\n\n        if all(os.path.exists(p) for p in [train_path, test_path, label_path]):\n            train_data = np.load(train_path)\n            test_data  = np.load(test_path)\n            test_label = np.load(label_path)\n        else:\n            train_path = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"MSL/MSL_train.npy\",repo_type=\"dataset\")\n            test_path  = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"MSL/MSL_test.npy\",repo_type=\"dataset\")\n            label_path = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"MSL/MSL_test_label.npy\",repo_type=\"dataset\")\n\n            train_data  = np.load(train_path)\n            test_data   = np.load(test_path)\n            test_label  = np.load(label_path)\n\n        self.scaler.fit(train_data)\n        train_data = self.scaler.transform(train_data)\n        test_data  = self.scaler.transform(test_data)\n\n        self.train = train_data\n        self.test  = test_data\n        self.test_labels = test_label\n\n        data_len = len(self.train)\n        self.val = self.train[int(data_len * 0.8):]\n\n        print(\"test:\", self.test.shape)\n        print(\"train:\", self.train.shape)\n\n    def __len__(self):\n        if self.flag == \"train\":\n            return (self.train.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'val'):\n            return (self.val.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'test'):\n            return (self.test.shape[0] - self.win_size) // self.step + 1\n        else:\n            return (self.test.shape[0] - self.win_size) // self.win_size + 1\n\n    def __getitem__(self, index):\n        index = index * self.step\n        if self.flag == \"train\":\n            return np.float32(self.train[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'val'):\n            return np.float32(self.val[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'test'):\n            return np.float32(self.test[index:index + self.win_size]), np.float32(\n                self.test_labels[index:index + self.win_size])\n        else:\n            return np.float32(self.test[\n                              index // self.step * self.win_size:index // self.step * self.win_size + self.win_size]), np.float32(\n                self.test_labels[index // self.step * self.win_size:index // self.step * self.win_size + self.win_size])\n\n\nclass SMAPSegLoader(Dataset):\n    def __init__(self, args, root_path, win_size, step=1, flag=\"train\"):\n        self.flag = flag\n        self.step = step\n        self.win_size = win_size\n        self.scaler = StandardScaler()\n        \n        train_path = os.path.join(root_path, \"SMAP_train.npy\")\n        test_path  = os.path.join(root_path, \"SMAP_test.npy\")\n        label_path = os.path.join(root_path, \"SMAP_test_label.npy\")\n\n        if all(os.path.exists(p) for p in [train_path, test_path, label_path]):\n            train_data = np.load(train_path)\n            test_data  = np.load(test_path)\n            test_label = np.load(label_path)\n        else:\n            train_path = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"SMAP/SMAP_train.npy\",repo_type=\"dataset\")\n            test_path  = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"SMAP/SMAP_test.npy\",repo_type=\"dataset\")\n            label_path = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"SMAP/SMAP_test_label.npy\",repo_type=\"dataset\")\n\n            train_data  = np.load(train_path)\n            test_data   = np.load(test_path)\n            test_label = np.load(label_path)\n\n        # 标准化\n        self.scaler.fit(train_data)\n        train_data = self.scaler.transform(train_data)\n        test_data  = self.scaler.transform(test_data)\n\n        self.train = train_data\n        self.test  = test_data\n        self.test_labels = test_label\n\n        data_len = len(self.train)\n        self.val = self.train[int(data_len * 0.8):]\n\n        print(\"test:\", self.test.shape)\n        print(\"train:\", self.train.shape)\n\n    def __len__(self):\n\n        if self.flag == \"train\":\n            return (self.train.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'val'):\n            return (self.val.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'test'):\n            return (self.test.shape[0] - self.win_size) // self.step + 1\n        else:\n            return (self.test.shape[0] - self.win_size) // self.win_size + 1\n\n    def __getitem__(self, index):\n        index = index * self.step\n        if self.flag == \"train\":\n            return np.float32(self.train[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'val'):\n            return np.float32(self.val[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'test'):\n            return np.float32(self.test[index:index + self.win_size]), np.float32(\n                self.test_labels[index:index + self.win_size])\n        else:\n            return np.float32(self.test[\n                              index // self.step * self.win_size:index // self.step * self.win_size + self.win_size]), np.float32(\n                self.test_labels[index // self.step * self.win_size:index // self.step * self.win_size + self.win_size])\n\n\nclass SMDSegLoader(Dataset):\n    def __init__(self, args, root_path, win_size, step=100, flag=\"train\"):\n        self.flag = flag\n        self.step = step\n        self.win_size = win_size\n        self.scaler = StandardScaler()\n        \n        train_path = os.path.join(root_path, \"SMD_train.npy\")\n        test_path  = os.path.join(root_path, \"SMD_test.npy\")\n        label_path = os.path.join(root_path, \"SMD_test_label.npy\")\n\n        if all(os.path.exists(p) for p in [train_path, test_path, label_path]):\n            train_data = np.load(train_path)\n            test_data  = np.load(test_path)\n            test_label = np.load(label_path)\n        else:\n            train_path = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"SMD/SMD_train.npy\",repo_type=\"dataset\")\n            test_path  = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"SMD/SMD_test.npy\",repo_type=\"dataset\")\n            label_path = hf_hub_download(repo_id=HUGGINGFACE_REPO, filename=\"SMD/SMD_test_label.npy\",repo_type=\"dataset\")\n\n            train_data  = np.load(train_path)\n            test_data   = np.load(test_path)\n            test_label = np.load(label_path)\n            \n        self.scaler.fit(train_data)\n        train_data = self.scaler.transform(train_data)\n        test_data = self.scaler.transform(test_data)\n        self.train = train_data\n        self.test = test_data\n        data_len = len(self.train)\n        self.val = self.train[(int)(data_len * 0.8):]\n        self.test_labels = test_label\n        print(\"test:\", self.test.shape)\n        print(\"train:\", self.train.shape)\n\n    def __len__(self):\n        if self.flag == \"train\":\n            return (self.train.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'val'):\n            return (self.val.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'test'):\n            return (self.test.shape[0] - self.win_size) // self.step + 1\n        else:\n            return (self.test.shape[0] - self.win_size) // self.win_size + 1\n\n    def __getitem__(self, index):\n        index = index * self.step\n        if self.flag == \"train\":\n            return np.float32(self.train[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'val'):\n            return np.float32(self.val[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'test'):\n            return np.float32(self.test[index:index + self.win_size]), np.float32(\n                self.test_labels[index:index + self.win_size])\n        else:\n            return np.float32(self.test[\n                              index // self.step * self.win_size:index // self.step * self.win_size + self.win_size]), np.float32(\n                self.test_labels[index // self.step * self.win_size:index // self.step * self.win_size + self.win_size])\n\n\nclass SWATSegLoader(Dataset):\n    def __init__(self, args, root_path, win_size, step=1, flag=\"train\"):\n        self.flag = flag\n        self.step = step\n        self.win_size = win_size\n        self.scaler = StandardScaler()\n\n        train2_path = os.path.join(root_path, \"swat_train2.csv\")\n        test_path   = os.path.join(root_path, \"swat2.csv\")\n        if all(os.path.exists(p) for p in [train2_path, test_path]):\n            train_data = pd.read_csv(train2_path)\n            test_data   = pd.read_csv(test_path)\n        else:\n            ds = load_dataset(HUGGINGFACE_REPO, name=\"SWaT\")\n            train_data = ds[\"train\"].to_pandas()\n            test_data  = ds[\"test\"].to_pandas()\n        labels = test_data.values[:, -1:]\n        train_data = train_data.values[:, :-1]\n        test_data = test_data.values[:, :-1]\n\n        self.scaler.fit(train_data)\n        train_data = self.scaler.transform(train_data)\n        test_data = self.scaler.transform(test_data)\n        self.train = train_data\n        self.test = test_data\n        data_len = len(self.train)\n        self.val = self.train[(int)(data_len * 0.8):]\n        self.test_labels = labels\n        print(\"test:\", self.test.shape)\n        print(\"train:\", self.train.shape)\n\n    def __len__(self):\n        \"\"\"\n        Number of images in the object dataset.\n        \"\"\"\n        if self.flag == \"train\":\n            return (self.train.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'val'):\n            return (self.val.shape[0] - self.win_size) // self.step + 1\n        elif (self.flag == 'test'):\n            return (self.test.shape[0] - self.win_size) // self.step + 1\n        else:\n            return (self.test.shape[0] - self.win_size) // self.win_size + 1\n\n    def __getitem__(self, index):\n        index = index * self.step\n        if self.flag == \"train\":\n            return np.float32(self.train[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'val'):\n            return np.float32(self.val[index:index + self.win_size]), np.float32(self.test_labels[0:self.win_size])\n        elif (self.flag == 'test'):\n            return np.float32(self.test[index:index + self.win_size]), np.float32(\n                self.test_labels[index:index + self.win_size])\n        else:\n            return np.float32(self.test[\n                              index // self.step * self.win_size:index // self.step * self.win_size + self.win_size]), np.float32(\n                self.test_labels[index // self.step * self.win_size:index // self.step * self.win_size + self.win_size])\n\n\nclass UEAloader(Dataset):\n    \"\"\"\n    Dataset class for datasets included in:\n        Time Series Classification Archive (www.timeseriesclassification.com)\n    Argument:\n        limit_size: float in (0, 1) for debug\n    Attributes:\n        all_df: (num_samples * seq_len, num_columns) dataframe indexed by integer indices, with multiple rows corresponding to the same index (sample).\n            Each row is a time step; Each column contains either metadata (e.g. timestamp) or a feature.\n        feature_df: (num_samples * seq_len, feat_dim) dataframe; contains the subset of columns of `all_df` which correspond to selected features\n        feature_names: names of columns contained in `feature_df` (same as feature_df.columns)\n        all_IDs: (num_samples,) series of IDs contained in `all_df`/`feature_df` (same as all_df.index.unique() )\n        labels_df: (num_samples, num_labels) pd.DataFrame of label(s) for each sample\n        max_seq_len: maximum sequence (time series) length. If None, script argument `max_seq_len` will be used.\n            (Moreover, script argument overrides this attribute)\n    \"\"\"\n\n    def __init__(self, args, root_path, file_list=None, limit_size=None, flag=None):\n        self.args = args\n        self.root_path = root_path\n        self.flag = flag\n        self.all_df, self.labels_df = self.load_all(root_path, file_list=file_list, flag=flag)\n        self.all_IDs = self.all_df.index.unique()  # all sample IDs (integer indices 0 ... num_samples-1)\n\n        if limit_size is not None:\n            if limit_size > 1:\n                limit_size = int(limit_size)\n            else:  # interpret as proportion if in (0, 1]\n                limit_size = int(limit_size * len(self.all_IDs))\n            self.all_IDs = self.all_IDs[:limit_size]\n            self.all_df = self.all_df.loc[self.all_IDs]\n\n        # use all features\n        self.feature_names = self.all_df.columns\n        self.feature_df = self.all_df\n\n        # pre_process\n        normalizer = Normalizer()\n        self.feature_df = normalizer.normalize(self.feature_df)\n        print(len(self.all_IDs))\n\n    def _resolve_ts_path(self, root_path, dataset_name, flag):\n        split = \"TRAIN\" if \"train\" in str(flag).lower() else \"TEST\"\n        fname = f\"{dataset_name}_{split}.ts\"\n        local = os.path.join(root_path, fname)\n        if os.path.exists(local):\n            return local\n        return hf_hub_download(HUGGINGFACE_REPO, filename=f\"{dataset_name}/{fname}\", repo_type=\"dataset\")\n\n    def load_all(self, root_path, file_list=None, flag=None):\n        \"\"\"\n        Loads datasets from ts files contained in `root_path` into a dataframe, optionally choosing from `pattern`\n        Args:\n            root_path: directory containing all individual .ts files\n            file_list: optionally, provide a list of file paths within `root_path` to consider.\n                Otherwise, entire `root_path` contents will be used.\n        Returns:\n            all_df: a single (possibly concatenated) dataframe with all data corresponding to specified files\n            labels_df: dataframe containing label(s) for each sample\n        \"\"\"\n        # Select paths for training and evaluation\n        dataset_name = self.args.model_id\n        ts_path = self._resolve_ts_path(root_path, dataset_name, flag or \"train\")\n\n        all_df, labels_df = self.load_single(ts_path)\n        return all_df, labels_df\n\n    def load_single(self, filepath):\n        df, labels = load_from_tsfile_to_dataframe(filepath, return_separate_X_and_y=True,\n                                                             replace_missing_vals_with='NaN')\n        labels = pd.Series(labels, dtype=\"category\")\n        self.class_names = labels.cat.categories\n        labels_df = pd.DataFrame(labels.cat.codes,\n                                 dtype=np.int8)  # int8-32 gives an error when using nn.CrossEntropyLoss\n\n        lengths = df.applymap(\n            lambda x: len(x)).values  # (num_samples, num_dimensions) array containing the length of each series\n\n        horiz_diffs = np.abs(lengths - np.expand_dims(lengths[:, 0], -1))\n\n        if np.sum(horiz_diffs) > 0:  # if any row (sample) has varying length across dimensions\n            df = df.applymap(subsample)\n\n        lengths = df.applymap(lambda x: len(x)).values\n        vert_diffs = np.abs(lengths - np.expand_dims(lengths[0, :], 0))\n        if np.sum(vert_diffs) > 0:  # if any column (dimension) has varying length across samples\n            self.max_seq_len = int(np.max(lengths[:, 0]))\n        else:\n            self.max_seq_len = lengths[0, 0]\n\n        # First create a (seq_len, feat_dim) dataframe for each sample, indexed by a single integer (\"ID\" of the sample)\n        # Then concatenate into a (num_samples * seq_len, feat_dim) dataframe, with multiple rows corresponding to the\n        # sample index (i.e. the same scheme as all datasets in this project)\n\n        df = pd.concat((pd.DataFrame({col: df.loc[row, col] for col in df.columns}).reset_index(drop=True).set_index(\n            pd.Series(lengths[row, 0] * [row])) for row in range(df.shape[0])), axis=0)\n\n        # Replace NaN values\n        grp = df.groupby(by=df.index)\n        df = grp.transform(interpolate_missing)\n\n        return df, labels_df\n\n    def instance_norm(self, case):\n        if self.root_path.count('EthanolConcentration') > 0:  # special process for numerical stability\n            mean = case.mean(0, keepdim=True)\n            case = case - mean\n            stdev = torch.sqrt(torch.var(case, dim=1, keepdim=True, unbiased=False) + 1e-5)\n            case /= stdev\n            return case\n        else:\n            return case\n\n    def __getitem__(self, ind):\n        batch_x = self.feature_df.loc[self.all_IDs[ind]].values\n        labels = self.labels_df.loc[self.all_IDs[ind]].values\n        if self.flag == \"TRAIN\" and self.args.augmentation_ratio > 0:\n            num_samples = len(self.all_IDs)\n            num_columns = self.feature_df.shape[1]\n            seq_len = int(self.feature_df.shape[0] / num_samples)\n            batch_x = batch_x.reshape((1, seq_len, num_columns))\n            batch_x, labels, augmentation_tags = run_augmentation_single(batch_x, labels, self.args)\n\n            batch_x = batch_x.reshape((1 * seq_len, num_columns))\n\n        return self.instance_norm(torch.from_numpy(batch_x)), \\\n               torch.from_numpy(labels)\n\n    def __len__(self):\n        return len(self.all_IDs)\n"
  },
  {
    "path": "data_provider/m4.py",
    "content": "# This source code is provided for the purposes of scientific reproducibility\n# under the following limited license from Element AI Inc. The code is an\n# implementation of the N-BEATS model (Oreshkin et al., N-BEATS: Neural basis\n# expansion analysis for interpretable time series forecasting,\n# https://arxiv.org/abs/1905.10437). The copyright to the source code is\n# licensed under the Creative Commons - Attribution-NonCommercial 4.0\n# International license (CC BY-NC 4.0):\n# https://creativecommons.org/licenses/by-nc/4.0/.  Any commercial use (whether\n# for the benefit of third parties or internally in production) requires an\n# explicit license. The subject-matter of the N-BEATS model and associated\n# materials are the property of Element AI Inc. and may be subject to patent\n# protection. No license to patents is granted hereunder (whether express or\n# implied). Copyright © 2020 Element AI Inc. All rights reserved.\n\n\"\"\"\nM4 Dataset\n\"\"\"\nimport logging\nimport os\nfrom collections import OrderedDict\nfrom dataclasses import dataclass\nfrom glob import glob\n\nimport numpy as np\nimport pandas as pd\nimport patoolib\nfrom tqdm import tqdm\nimport logging\nimport os\nimport pathlib\nimport sys\nfrom urllib import request\nfrom huggingface_hub import hf_hub_download\n\nHUGGINGFACE_REPO = \"thuml/Time-Series-Library\"\n\ndef _ensure_m4_triplet(root_dir=\"./dataset/m4\", repo_id=HUGGINGFACE_REPO):\n    root_dir = os.path.abspath(root_dir)\n    os.makedirs(root_dir, exist_ok=True)\n    files = {\n        \"M4-info.csv\":  \"m4/M4-info.csv\",\n        \"training.npz\": \"m4/training.npz\",\n        \"test.npz\":     \"m4/test.npz\",\n    }\n    for name, remote in files.items():\n        dst = os.path.join(root_dir, name)\n        if not os.path.exists(dst):\n            path = hf_hub_download(\n                repo_id=repo_id,\n                filename=remote,\n                repo_type=\"dataset\",\n                local_dir=\"./dataset\",\n                local_dir_use_symlinks=False\n            )\n\n\ndef url_file_name(url: str) -> str:\n    \"\"\"\n    Extract file name from url.\n\n    :param url: URL to extract file name from.\n    :return: File name.\n    \"\"\"\n    return url.split('/')[-1] if len(url) > 0 else ''\n\n\ndef download(url: str, file_path: str) -> None:\n    \"\"\"\n    Download a file to the given path.\n\n    :param url: URL to download\n    :param file_path: Where to download the content.\n    \"\"\"\n\n    def progress(count, block_size, total_size):\n        progress_pct = float(count * block_size) / float(total_size) * 100.0\n        sys.stdout.write('\\rDownloading {} to {} {:.1f}%'.format(url, file_path, progress_pct))\n        sys.stdout.flush()\n\n    if not os.path.isfile(file_path):\n        opener = request.build_opener()\n        opener.addheaders = [('User-agent', 'Mozilla/5.0')]\n        request.install_opener(opener)\n        pathlib.Path(os.path.dirname(file_path)).mkdir(parents=True, exist_ok=True)\n        f, _ = request.urlretrieve(url, file_path, progress)\n        sys.stdout.write('\\n')\n        sys.stdout.flush()\n        file_info = os.stat(f)\n        logging.info(f'Successfully downloaded {os.path.basename(file_path)} {file_info.st_size} bytes.')\n    else:\n        file_info = os.stat(file_path)\n        logging.info(f'File already exists: {file_path} {file_info.st_size} bytes.')\n\n\n@dataclass()\nclass M4Dataset:\n    ids: np.ndarray\n    groups: np.ndarray\n    frequencies: np.ndarray\n    horizons: np.ndarray\n    values: np.ndarray\n\n    @staticmethod\n    def load(training: bool = True, dataset_file: str = '../dataset/m4') -> 'M4Dataset':\n        \"\"\"\n        Load cached dataset.\n\n        :param training: Load training part if training is True, test part otherwise.\n        \"\"\"\n        _ensure_m4_triplet(dataset_file, repo_id=HUGGINGFACE_REPO)\n        info_file = os.path.join(dataset_file, 'M4-info.csv')\n        train_cache_file = os.path.join(dataset_file, 'training.npz')\n        test_cache_file = os.path.join(dataset_file, 'test.npz')\n        m4_info = pd.read_csv(info_file)\n        return M4Dataset(ids=m4_info.M4id.values,\n                         groups=m4_info.SP.values,\n                         frequencies=m4_info.Frequency.values,\n                         horizons=m4_info.Horizon.values,\n                         values=np.load(\n                             train_cache_file if training else test_cache_file,\n                             allow_pickle=True))\n\n\n@dataclass()\nclass M4Meta:\n    seasonal_patterns = ['Yearly', 'Quarterly', 'Monthly', 'Weekly', 'Daily', 'Hourly']\n    horizons = [6, 8, 18, 13, 14, 48]\n    frequencies = [1, 4, 12, 1, 1, 24]\n    horizons_map = {\n        'Yearly': 6,\n        'Quarterly': 8,\n        'Monthly': 18,\n        'Weekly': 13,\n        'Daily': 14,\n        'Hourly': 48\n    }  # different predict length\n    frequency_map = {\n        'Yearly': 1,\n        'Quarterly': 4,\n        'Monthly': 12,\n        'Weekly': 1,\n        'Daily': 1,\n        'Hourly': 24\n    }\n    history_size = {\n        'Yearly': 1.5,\n        'Quarterly': 1.5,\n        'Monthly': 1.5,\n        'Weekly': 10,\n        'Daily': 10,\n        'Hourly': 10\n    }  # from interpretable.gin\n\n\ndef load_m4_info() -> pd.DataFrame:\n    \"\"\"\n    Load M4Info file.\n\n    :return: Pandas DataFrame of M4Info.\n    \"\"\"\n    # return pd.read_csv(INFO_FILE_PATH)\n"
  },
  {
    "path": "data_provider/uea.py",
    "content": "import os\nimport numpy as np\nimport pandas as pd\nimport torch\n\n\ndef collate_fn(data, max_len=None):\n    \"\"\"Build mini-batch tensors from a list of (X, mask) tuples. Mask input. Create\n    Args:\n        data: len(batch_size) list of tuples (X, y).\n            - X: torch tensor of shape (seq_length, feat_dim); variable seq_length.\n            - y: torch tensor of shape (num_labels,) : class indices or numerical targets\n                (for classification or regression, respectively). num_labels > 1 for multi-task models\n        max_len: global fixed sequence length. Used for architectures requiring fixed length input,\n            where the batch length cannot vary dynamically. Longer sequences are clipped, shorter are padded with 0s\n    Returns:\n        X: (batch_size, padded_length, feat_dim) torch tensor of masked features (input)\n        targets: (batch_size, padded_length, feat_dim) torch tensor of unmasked features (output)\n        target_masks: (batch_size, padded_length, feat_dim) boolean torch tensor\n            0 indicates masked values to be predicted, 1 indicates unaffected/\"active\" feature values\n        padding_masks: (batch_size, padded_length) boolean tensor, 1 means keep vector at this position, 0 means padding\n    \"\"\"\n\n    batch_size = len(data)\n    features, labels = zip(*data)\n\n    # Stack and pad features and masks (convert 2D to 3D tensors, i.e. add batch dimension)\n    lengths = [X.shape[0] for X in features]  # original sequence length for each time series\n    if max_len is None:\n        max_len = max(lengths)\n\n    X = torch.zeros(batch_size, max_len, features[0].shape[-1])  # (batch_size, padded_length, feat_dim)\n    for i in range(batch_size):\n        end = min(lengths[i], max_len)\n        X[i, :end, :] = features[i][:end, :]\n\n    targets = torch.stack(labels, dim=0)  # (batch_size, num_labels)\n\n    padding_masks = padding_mask(torch.tensor(lengths, dtype=torch.int16),\n                                 max_len=max_len)  # (batch_size, padded_length) boolean tensor, \"1\" means keep\n\n    return X, targets, padding_masks\n\n\ndef padding_mask(lengths, max_len=None):\n    \"\"\"\n    Used to mask padded positions: creates a (batch_size, max_len) boolean mask from a tensor of sequence lengths,\n    where 1 means keep element at this position (time step)\n    \"\"\"\n    batch_size = lengths.numel()\n    max_len = max_len or lengths.max_val()  # trick works because of overloading of 'or' operator for non-boolean types\n    return (torch.arange(0, max_len, device=lengths.device)\n            .type_as(lengths)\n            .repeat(batch_size, 1)\n            .lt(lengths.unsqueeze(1)))\n\n\nclass Normalizer(object):\n    \"\"\"\n    Normalizes dataframe across ALL contained rows (time steps). Different from per-sample normalization.\n    \"\"\"\n\n    def __init__(self, norm_type='standardization', mean=None, std=None, min_val=None, max_val=None):\n        \"\"\"\n        Args:\n            norm_type: choose from:\n                \"standardization\", \"minmax\": normalizes dataframe across ALL contained rows (time steps)\n                \"per_sample_std\", \"per_sample_minmax\": normalizes each sample separately (i.e. across only its own rows)\n            mean, std, min_val, max_val: optional (num_feat,) Series of pre-computed values\n        \"\"\"\n\n        self.norm_type = norm_type\n        self.mean = mean\n        self.std = std\n        self.min_val = min_val\n        self.max_val = max_val\n\n    def normalize(self, df):\n        \"\"\"\n        Args:\n            df: input dataframe\n        Returns:\n            df: normalized dataframe\n        \"\"\"\n        if self.norm_type == \"standardization\":\n            if self.mean is None:\n                self.mean = df.mean()\n                self.std = df.std()\n            return (df - self.mean) / (self.std + np.finfo(float).eps)\n\n        elif self.norm_type == \"minmax\":\n            if self.max_val is None:\n                self.max_val = df.max()\n                self.min_val = df.min()\n            return (df - self.min_val) / (self.max_val - self.min_val + np.finfo(float).eps)\n\n        elif self.norm_type == \"per_sample_std\":\n            grouped = df.groupby(by=df.index)\n            return (df - grouped.transform('mean')) / grouped.transform('std')\n\n        elif self.norm_type == \"per_sample_minmax\":\n            grouped = df.groupby(by=df.index)\n            min_vals = grouped.transform('min')\n            return (df - min_vals) / (grouped.transform('max') - min_vals + np.finfo(float).eps)\n\n        else:\n            raise (NameError(f'Normalize method \"{self.norm_type}\" not implemented'))\n\n\ndef interpolate_missing(y):\n    \"\"\"\n    Replaces NaN values in pd.Series `y` using linear interpolation\n    \"\"\"\n    if y.isna().any():\n        y = y.interpolate(method='linear', limit_direction='both')\n    return y\n\n\ndef subsample(y, limit=256, factor=2):\n    \"\"\"\n    If a given Series is longer than `limit`, returns subsampled sequence by the specified integer factor\n    \"\"\"\n    if len(y) > limit:\n        return y[::factor].reset_index(drop=True)\n    return y\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "services:\n  dev_tslib:\n    image: tslib\n    build:\n      context: .\n      target: tslib\n      # args:\n      #   http_proxy: \"http://192.168.8.135:7897\" #optional, Modify it to your agent address\n      #   https_proxy: \"http://192.168.8.135:7897\" #optional, Modify it to your agent address\n    container_name: tslib\n    shm_size: 8gb\n    tty: true\n    restart: always\n    environment:\n      - NVIDIA_VISIBLE_DEVICES=all\n      - NVIDIA_DRIVER_CAPABILITIES=compute,utility\n      # - http_proxy=http://192.168.8.135:7897 #optional, Modify it to your agent address\n      # - https_proxy=http://192.168.8.135:7897 #optional, Modify it to your agent address\n    # ports:\n    #   - \"8888:8888\"\n    #   - \"6006:6006\"\n    volumes:\n      - workspace_data:/workspace\n    working_dir: /workspace\nvolumes:\n  workspace_data:"
  },
  {
    "path": "exp/__init__.py",
    "content": ""
  },
  {
    "path": "exp/exp_anomaly_detection.py",
    "content": "from data_provider.data_factory import data_provider\nfrom exp.exp_basic import Exp_Basic\nfrom utils.tools import EarlyStopping, adjust_learning_rate, adjustment\nfrom sklearn.metrics import precision_recall_fscore_support\nfrom sklearn.metrics import accuracy_score\nimport torch.multiprocessing\n\ntorch.multiprocessing.set_sharing_strategy('file_system')\nimport torch\nimport torch.nn as nn\nfrom torch import optim\nimport os\nimport time\nimport warnings\nimport numpy as np\n\nwarnings.filterwarnings('ignore')\n\n\nclass Exp_Anomaly_Detection(Exp_Basic):\n    def __init__(self, args):\n        super(Exp_Anomaly_Detection, self).__init__(args)\n\n    def _build_model(self):\n        model = self.model_dict[self.args.model](self.args).float()\n\n        if self.args.use_multi_gpu and self.args.use_gpu:\n            model = nn.DataParallel(model, device_ids=self.args.device_ids)\n        return model\n\n    def _get_data(self, flag):\n        data_set, data_loader = data_provider(self.args, flag)\n        return data_set, data_loader\n\n    def _select_optimizer(self):\n        model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\n        return model_optim\n\n    def _select_criterion(self):\n        criterion = nn.MSELoss()\n        return criterion\n\n    def vali(self, vali_data, vali_loader, criterion):\n        total_loss = []\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, _) in enumerate(vali_loader):\n                batch_x = batch_x.float().to(self.device)\n\n                outputs = self.model(batch_x, None, None, None)\n\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, :, f_dim:]\n                pred = outputs.detach()\n                true = batch_x.detach()\n\n                loss = criterion(pred, true)\n                total_loss.append(loss.item())\n        total_loss = np.average(total_loss)\n        self.model.train()\n        return total_loss\n\n    def train(self, setting):\n        train_data, train_loader = self._get_data(flag='train')\n        vali_data, vali_loader = self._get_data(flag='val')\n        test_data, test_loader = self._get_data(flag='test')\n\n        path = os.path.join(self.args.checkpoints, setting)\n        if not os.path.exists(path):\n            os.makedirs(path)\n\n        time_now = time.time()\n\n        train_steps = len(train_loader)\n        early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)\n\n        model_optim = self._select_optimizer()\n        criterion = self._select_criterion()\n\n        for epoch in range(self.args.train_epochs):\n            iter_count = 0\n            train_loss = []\n\n            self.model.train()\n            epoch_time = time.time()\n            for i, (batch_x, batch_y) in enumerate(train_loader):\n                iter_count += 1\n                model_optim.zero_grad()\n\n                batch_x = batch_x.float().to(self.device)\n\n                outputs = self.model(batch_x, None, None, None)\n\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, :, f_dim:]\n                loss = criterion(outputs, batch_x)\n                train_loss.append(loss.item())\n\n                if (i + 1) % 100 == 0:\n                    print(\"\\titers: {0}, epoch: {1} | loss: {2:.7f}\".format(i + 1, epoch + 1, loss.item()))\n                    speed = (time.time() - time_now) / iter_count\n                    left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)\n                    print('\\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time))\n                    iter_count = 0\n                    time_now = time.time()\n\n                loss.backward()\n                model_optim.step()\n\n            print(\"Epoch: {} cost time: {}\".format(epoch + 1, time.time() - epoch_time))\n            train_loss = np.average(train_loss)\n            vali_loss = self.vali(vali_data, vali_loader, criterion)\n            test_loss = self.vali(test_data, test_loader, criterion)\n\n            print(\"Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}\".format(\n                epoch + 1, train_steps, train_loss, vali_loss, test_loss))\n            early_stopping(vali_loss, self.model, path)\n            if early_stopping.early_stop:\n                print(\"Early stopping\")\n                break\n            adjust_learning_rate(model_optim, epoch + 1, self.args)\n\n        best_model_path = path + '/' + 'checkpoint.pth'\n        self.model.load_state_dict(torch.load(best_model_path))\n\n        return self.model\n\n    def test(self, setting, test=0):\n        test_data, test_loader = self._get_data(flag='test')\n        train_data, train_loader = self._get_data(flag='train')\n        if test:\n            print('loading model')\n            self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth')))\n\n        attens_energy = []\n        folder_path = './test_results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        self.model.eval()\n        self.anomaly_criterion = nn.MSELoss(reduce=False)\n\n        # (1) stastic on the train set\n        with torch.no_grad():\n            for i, (batch_x, batch_y) in enumerate(train_loader):\n                batch_x = batch_x.float().to(self.device)\n                # reconstruction\n                outputs = self.model(batch_x, None, None, None)\n                # criterion\n                score = torch.mean(self.anomaly_criterion(batch_x, outputs), dim=-1)\n                score = score.detach().cpu().numpy()\n                attens_energy.append(score)\n\n        attens_energy = np.concatenate(attens_energy, axis=0).reshape(-1)\n        train_energy = np.array(attens_energy)\n\n        # (2) find the threshold\n        attens_energy = []\n        test_labels = []\n        for i, (batch_x, batch_y) in enumerate(test_loader):\n            batch_x = batch_x.float().to(self.device)\n            # reconstruction\n            outputs = self.model(batch_x, None, None, None)\n            # criterion\n            score = torch.mean(self.anomaly_criterion(batch_x, outputs), dim=-1)\n            score = score.detach().cpu().numpy()\n            attens_energy.append(score)\n            test_labels.append(batch_y)\n\n        attens_energy = np.concatenate(attens_energy, axis=0).reshape(-1)\n        test_energy = np.array(attens_energy)\n        combined_energy = np.concatenate([train_energy, test_energy], axis=0)\n        threshold = np.percentile(combined_energy, 100 - self.args.anomaly_ratio)\n        print(\"Threshold :\", threshold)\n\n        # (3) evaluation on the test set\n        pred = (test_energy > threshold).astype(int)\n        test_labels = np.concatenate(test_labels, axis=0).reshape(-1)\n        test_labels = np.array(test_labels)\n        gt = test_labels.astype(int)\n\n        print(\"pred:   \", pred.shape)\n        print(\"gt:     \", gt.shape)\n\n        # (4) detection adjustment\n        gt, pred = adjustment(gt, pred)\n\n        pred = np.array(pred)\n        gt = np.array(gt)\n        print(\"pred: \", pred.shape)\n        print(\"gt:   \", gt.shape)\n\n        accuracy = accuracy_score(gt, pred)\n        precision, recall, f_score, support = precision_recall_fscore_support(gt, pred, average='binary')\n        print(\"Accuracy : {:0.4f}, Precision : {:0.4f}, Recall : {:0.4f}, F-score : {:0.4f} \".format(\n            accuracy, precision,\n            recall, f_score))\n\n        f = open(\"result_anomaly_detection.txt\", 'a')\n        f.write(setting + \"  \\n\")\n        f.write(\"Accuracy : {:0.4f}, Precision : {:0.4f}, Recall : {:0.4f}, F-score : {:0.4f} \".format(\n            accuracy, precision,\n            recall, f_score))\n        f.write('\\n')\n        f.write('\\n')\n        f.close()\n        return\n"
  },
  {
    "path": "exp/exp_basic.py",
    "content": "import os\nimport torch\nimport importlib\nimport pkgutil  \n\n# Just put your model files under models/ folder\n# e.g., models/Transformer.py, models/LSTM.py, etc.\n# All models will be automatically detected and can be used by specifying their names.\n\nclass Exp_Basic(object):\n    def __init__(self, args):\n        self.args = args\n        \n        # -------------------------------------------------------\n        #  Automatically generate model map\n        # -------------------------------------------------------\n        model_map = self._scan_models_directory()\n\n        # Use smart dictionary\n        self.model_dict = LazyModelDict(model_map)\n\n        self.device = self._acquire_device()\n        self.model = self._build_model().to(self.device)\n\n    def _scan_models_directory(self):\n        \"\"\"\n        Automatically scan all .py files in the models folder\n        \"\"\"\n        model_map = {}\n        models_dir = 'models'\n\n        # Iterate through all files in 'models' directory\n        if os.path.exists(models_dir):\n            for filename in os.listdir(models_dir):\n                # Ignore __init__.py and non-.py files\n                if filename.endswith('.py') and filename != '__init__.py':\n                    # Remove .py extension to get module name\n                    module_name = filename[:-3]\n                    \n                    # Build full import path\n                    full_path = f\"{models_dir}.{module_name}\"\n                    \n                    # loading dict: {'Transformer': 'models.Transformer'}\n                    model_map[module_name] = full_path\n        \n        return model_map\n\n    def _build_model(self):\n        raise NotImplementedError\n        return None\n\n    def _acquire_device(self):\n        if self.args.use_gpu and self.args.gpu_type == 'cuda':\n            os.environ[\"CUDA_VISIBLE_DEVICES\"] = str(\n                self.args.gpu) if not self.args.use_multi_gpu else self.args.devices\n            device = torch.device('cuda:{}'.format(self.args.gpu))\n            print('Use GPU: cuda:{}'.format(self.args.gpu))\n        elif self.args.use_gpu and self.args.gpu_type == 'mps':\n            device = torch.device('mps')\n            print('Use GPU: mps')\n        else:\n            device = torch.device('cpu')\n            print('Use CPU')\n        return device\n\n    def _get_data(self):\n        pass\n\n    def vali(self):\n        pass\n\n    def train(self):\n        pass\n\n    def test(self):\n        pass\n\n\nclass LazyModelDict(dict):\n    \"\"\"\n    Smart Lazy-Loading Dictionary\n    \"\"\"\n    def __init__(self, model_map):\n        self.model_map = model_map\n        super().__init__()\n\n    def __getitem__(self, key):\n        if key in self:\n            return super().__getitem__(key)\n        \n        if key not in self.model_map:\n            raise NotImplementedError(f\"Model [{key}] not found in 'models' directory.\")\n            \n        module_path = self.model_map[key]\n        try:\n            print(f\"🚀 Lazy Loading: {key} ...\") \n            module = importlib.import_module(module_path)\n        except ImportError as e:\n            print(f\"❌ Error: Failed to import model [{key}]. Dependencies missing?\")\n            raise e\n\n        # Try to find the model class\n        if hasattr(module, 'Model'):\n            model_class = module.Model\n        elif hasattr(module, key):\n            model_class = getattr(module, key)\n        else:\n            raise AttributeError(f\"Module {module_path} has no class 'Model' or '{key}'\")\n\n        self[key] = model_class\n        return model_class\n\n"
  },
  {
    "path": "exp/exp_classification.py",
    "content": "from data_provider.data_factory import data_provider\nfrom exp.exp_basic import Exp_Basic\nfrom utils.tools import EarlyStopping, adjust_learning_rate, cal_accuracy\nimport torch\nimport torch.nn as nn\nfrom torch import optim\nimport os\nimport time\nimport warnings\nimport numpy as np\nimport pdb\n\nwarnings.filterwarnings('ignore')\n\n\nclass Exp_Classification(Exp_Basic):\n    def __init__(self, args):\n        super(Exp_Classification, self).__init__(args)\n\n    def _build_model(self):\n        # model input depends on data\n        train_data, train_loader = self._get_data(flag='TRAIN')\n        test_data, test_loader = self._get_data(flag='TEST')\n        self.args.seq_len = max(train_data.max_seq_len, test_data.max_seq_len)\n        self.args.pred_len = 0\n        self.args.enc_in = train_data.feature_df.shape[1]\n        self.args.num_class = len(train_data.class_names)\n        # model init\n        model = self.model_dict[self.args.model](self.args).float()\n        if self.args.use_multi_gpu and self.args.use_gpu:\n            model = nn.DataParallel(model, device_ids=self.args.device_ids)\n        return model\n\n    def _get_data(self, flag):\n        data_set, data_loader = data_provider(self.args, flag)\n        return data_set, data_loader\n\n    def _select_optimizer(self):\n        # model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\n        model_optim = optim.RAdam(self.model.parameters(), lr=self.args.learning_rate)\n        return model_optim\n\n    def _select_criterion(self):\n        criterion = nn.CrossEntropyLoss()\n        return criterion\n\n    def vali(self, vali_data, vali_loader, criterion):\n        total_loss = []\n        preds = []\n        trues = []\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, label, padding_mask) in enumerate(vali_loader):\n                batch_x = batch_x.float().to(self.device)\n                padding_mask = padding_mask.float().to(self.device)\n                label = label.to(self.device)\n\n                outputs = self.model(batch_x, padding_mask, None, None)\n\n                pred = outputs.detach()\n                loss = criterion(pred, label.long().squeeze())\n                total_loss.append(loss.item())\n\n                preds.append(outputs.detach())\n                trues.append(label)\n\n        total_loss = np.average(total_loss)\n\n        preds = torch.cat(preds, 0)\n        trues = torch.cat(trues, 0)\n        probs = torch.nn.functional.softmax(preds)  # (total_samples, num_classes) est. prob. for each class and sample\n        predictions = torch.argmax(probs, dim=1).cpu().numpy()  # (total_samples,) int class index for each sample\n        trues = trues.flatten().cpu().numpy()\n        accuracy = cal_accuracy(predictions, trues)\n\n        self.model.train()\n        return total_loss, accuracy\n\n    def train(self, setting):\n        train_data, train_loader = self._get_data(flag='TRAIN')\n        vali_data, vali_loader = self._get_data(flag='TEST')\n        test_data, test_loader = self._get_data(flag='TEST')\n\n        path = os.path.join(self.args.checkpoints, setting)\n        if not os.path.exists(path):\n            os.makedirs(path)\n\n        time_now = time.time()\n\n        train_steps = len(train_loader)\n        early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)\n\n        model_optim = self._select_optimizer()\n        criterion = self._select_criterion()\n\n        for epoch in range(self.args.train_epochs):\n            iter_count = 0\n            train_loss = []\n\n            self.model.train()\n            epoch_time = time.time()\n\n            for i, (batch_x, label, padding_mask) in enumerate(train_loader):\n                iter_count += 1\n                model_optim.zero_grad()\n\n                batch_x = batch_x.float().to(self.device)\n                padding_mask = padding_mask.float().to(self.device)\n                label = label.to(self.device)\n\n                outputs = self.model(batch_x, padding_mask, None, None)\n                loss = criterion(outputs, label.long().squeeze(-1))\n                train_loss.append(loss.item())\n\n                if (i + 1) % 100 == 0:\n                    print(\"\\titers: {0}, epoch: {1} | loss: {2:.7f}\".format(i + 1, epoch + 1, loss.item()))\n                    speed = (time.time() - time_now) / iter_count\n                    left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)\n                    print('\\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time))\n                    iter_count = 0\n                    time_now = time.time()\n\n                loss.backward()\n                nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=4.0)\n                model_optim.step()\n\n            print(\"Epoch: {} cost time: {}\".format(epoch + 1, time.time() - epoch_time))\n            train_loss = np.average(train_loss)\n            vali_loss, val_accuracy = self.vali(vali_data, vali_loader, criterion)\n            test_loss, test_accuracy = self.vali(test_data, test_loader, criterion)\n\n            print(\n                \"Epoch: {0}, Steps: {1} | Train Loss: {2:.3f} Vali Loss: {3:.3f} Vali Acc: {4:.3f} Test Loss: {5:.3f} Test Acc: {6:.3f}\"\n                .format(epoch + 1, train_steps, train_loss, vali_loss, val_accuracy, test_loss, test_accuracy))\n            early_stopping(-val_accuracy, self.model, path)\n            if early_stopping.early_stop:\n                print(\"Early stopping\")\n                break\n\n        best_model_path = path + '/' + 'checkpoint.pth'\n        self.model.load_state_dict(torch.load(best_model_path))\n\n        return self.model\n\n    def test(self, setting, test=0):\n        test_data, test_loader = self._get_data(flag='TEST')\n        if test:\n            print('loading model')\n            self.model.load_state_dict(torch.load(os.path.join(self.args.checkpoints, setting, 'checkpoint.pth')))\n\n        preds = []\n        trues = []\n        folder_path = './test_results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, label, padding_mask) in enumerate(test_loader):\n                batch_x = batch_x.float().to(self.device)\n                padding_mask = padding_mask.float().to(self.device)\n                label = label.to(self.device)\n\n                outputs = self.model(batch_x, padding_mask, None, None)\n\n                preds.append(outputs.detach())\n                trues.append(label)\n\n        preds = torch.cat(preds, 0)\n        trues = torch.cat(trues, 0)\n        print('test shape:', preds.shape, trues.shape)\n\n        probs = torch.nn.functional.softmax(preds)  # (total_samples, num_classes) est. prob. for each class and sample\n        predictions = torch.argmax(probs, dim=1).cpu().numpy()  # (total_samples,) int class index for each sample\n        trues = trues.flatten().cpu().numpy()\n        accuracy = cal_accuracy(predictions, trues)\n\n        # result save\n        folder_path = './results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        print('accuracy:{}'.format(accuracy))\n        file_name='result_classification.txt'\n        f = open(os.path.join(folder_path,file_name), 'a')\n        f.write(setting + \"  \\n\")\n        f.write('accuracy:{}'.format(accuracy))\n        f.write('\\n')\n        f.write('\\n')\n        f.close()\n        return\n"
  },
  {
    "path": "exp/exp_imputation.py",
    "content": "from data_provider.data_factory import data_provider\nfrom exp.exp_basic import Exp_Basic\nfrom utils.tools import EarlyStopping, adjust_learning_rate, visual\nfrom utils.metrics import metric\nimport torch\nimport torch.nn as nn\nfrom torch import optim\nimport os\nimport time\nimport warnings\nimport numpy as np\n\nwarnings.filterwarnings('ignore')\n\n\nclass Exp_Imputation(Exp_Basic):\n    def __init__(self, args):\n        super(Exp_Imputation, self).__init__(args)\n\n    def _build_model(self):\n        model = self.model_dict[self.args.model](self.args).float()\n\n        if self.args.use_multi_gpu and self.args.use_gpu:\n            model = nn.DataParallel(model, device_ids=self.args.device_ids)\n        return model\n\n    def _get_data(self, flag):\n        data_set, data_loader = data_provider(self.args, flag)\n        return data_set, data_loader\n\n    def _select_optimizer(self):\n        model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\n        return model_optim\n\n    def _select_criterion(self):\n        criterion = nn.MSELoss()\n        return criterion\n\n    def vali(self, vali_data, vali_loader, criterion):\n        total_loss = []\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(vali_loader):\n                batch_x = batch_x.float().to(self.device)\n                batch_x_mark = batch_x_mark.float().to(self.device)\n\n                # random mask\n                B, T, N = batch_x.shape\n                \"\"\"\n                B = batch size\n                T = seq len\n                N = number of features\n                \"\"\"\n                mask = torch.rand((B, T, N)).to(self.device)\n                mask[mask <= self.args.mask_rate] = 0  # masked\n                mask[mask > self.args.mask_rate] = 1  # remained\n                inp = batch_x.masked_fill(mask == 0, 0)\n\n                outputs = self.model(inp, batch_x_mark, None, None, mask)\n\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, :, f_dim:]\n\n                # add support for MS\n                batch_x = batch_x[:, :, f_dim:]\n                mask = mask[:, :, f_dim:]\n\n                pred = outputs.detach()\n                true = batch_x.detach()\n                mask = mask.detach()\n\n                loss = criterion(pred[mask == 0], true[mask == 0])\n                total_loss.append(loss.item())\n        total_loss = np.average(total_loss)\n        self.model.train()\n        return total_loss\n\n    def train(self, setting):\n        train_data, train_loader = self._get_data(flag='train')\n        vali_data, vali_loader = self._get_data(flag='val')\n        test_data, test_loader = self._get_data(flag='test')\n\n        path = os.path.join(self.args.checkpoints, setting)\n        if not os.path.exists(path):\n            os.makedirs(path)\n\n        time_now = time.time()\n\n        train_steps = len(train_loader)\n        early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)\n\n        model_optim = self._select_optimizer()\n        criterion = self._select_criterion()\n\n        for epoch in range(self.args.train_epochs):\n            iter_count = 0\n            train_loss = []\n\n            self.model.train()\n            epoch_time = time.time()\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader):\n                iter_count += 1\n                model_optim.zero_grad()\n\n                batch_x = batch_x.float().to(self.device)\n                batch_x_mark = batch_x_mark.float().to(self.device)\n\n                # random mask\n                B, T, N = batch_x.shape\n                mask = torch.rand((B, T, N)).to(self.device)\n                mask[mask <= self.args.mask_rate] = 0  # masked\n                mask[mask > self.args.mask_rate] = 1  # remained\n                inp = batch_x.masked_fill(mask == 0, 0)\n\n                outputs = self.model(inp, batch_x_mark, None, None, mask)\n\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, :, f_dim:]\n\n                # add support for MS\n                batch_x = batch_x[:, :, f_dim:]\n                mask = mask[:, :, f_dim:]\n\n                loss = criterion(outputs[mask == 0], batch_x[mask == 0])\n                train_loss.append(loss.item())\n\n                if (i + 1) % 100 == 0:\n                    print(\"\\titers: {0}, epoch: {1} | loss: {2:.7f}\".format(i + 1, epoch + 1, loss.item()))\n                    speed = (time.time() - time_now) / iter_count\n                    left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)\n                    print('\\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time))\n                    iter_count = 0\n                    time_now = time.time()\n\n                loss.backward()\n                model_optim.step()\n\n            print(\"Epoch: {} cost time: {}\".format(epoch + 1, time.time() - epoch_time))\n            train_loss = np.average(train_loss)\n            vali_loss = self.vali(vali_data, vali_loader, criterion)\n            test_loss = self.vali(test_data, test_loader, criterion)\n\n            print(\"Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}\".format(\n                epoch + 1, train_steps, train_loss, vali_loss, test_loss))\n            early_stopping(vali_loss, self.model, path)\n            if early_stopping.early_stop:\n                print(\"Early stopping\")\n                break\n            adjust_learning_rate(model_optim, epoch + 1, self.args)\n\n        best_model_path = path + '/' + 'checkpoint.pth'\n        self.model.load_state_dict(torch.load(best_model_path))\n\n        return self.model\n\n    def test(self, setting, test=0):\n        test_data, test_loader = self._get_data(flag='test')\n        if test:\n            print('loading model')\n            self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth')))\n\n        preds = []\n        trues = []\n        masks = []\n        folder_path = './test_results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader):\n                batch_x = batch_x.float().to(self.device)\n                batch_x_mark = batch_x_mark.float().to(self.device)\n\n                # random mask\n                B, T, N = batch_x.shape\n                mask = torch.rand((B, T, N)).to(self.device)\n                mask[mask <= self.args.mask_rate] = 0  # masked\n                mask[mask > self.args.mask_rate] = 1  # remained\n                inp = batch_x.masked_fill(mask == 0, 0)\n\n                # imputation\n                outputs = self.model(inp, batch_x_mark, None, None, mask)\n\n                # eval\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, :, f_dim:]\n\n                # add support for MS \n                batch_x = batch_x[:, :, f_dim:]\n                mask = mask[:, :, f_dim:]\n\n                outputs = outputs.detach().cpu().numpy()\n                pred = outputs\n                true = batch_x.detach().cpu().numpy()\n                preds.append(pred)\n                trues.append(true)\n                masks.append(mask.detach().cpu())\n\n                if i % 20 == 0:\n                    filled = true[0, :, -1].copy()\n                    filled = filled * mask[0, :, -1].detach().cpu().numpy() + \\\n                             pred[0, :, -1] * (1 - mask[0, :, -1].detach().cpu().numpy())\n                    visual(true[0, :, -1], filled, os.path.join(folder_path, str(i) + '.pdf'))\n\n        preds = np.concatenate(preds, 0)\n        trues = np.concatenate(trues, 0)\n        masks = np.concatenate(masks, 0)\n        print('test shape:', preds.shape, trues.shape)\n\n        # result save\n        folder_path = './results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        mae, mse, rmse, mape, mspe = metric(preds[masks == 0], trues[masks == 0])\n        print('mse:{}, mae:{}'.format(mse, mae))\n        f = open(\"result_imputation.txt\", 'a')\n        f.write(setting + \"  \\n\")\n        f.write('mse:{}, mae:{}'.format(mse, mae))\n        f.write('\\n')\n        f.write('\\n')\n        f.close()\n\n        np.save(folder_path + 'metrics.npy', np.array([mae, mse, rmse, mape, mspe]))\n        np.save(folder_path + 'pred.npy', preds)\n        np.save(folder_path + 'true.npy', trues)\n        return\n"
  },
  {
    "path": "exp/exp_long_term_forecasting.py",
    "content": "from data_provider.data_factory import data_provider\nfrom exp.exp_basic import Exp_Basic\nfrom utils.tools import EarlyStopping, adjust_learning_rate, visual\nfrom utils.metrics import metric\nimport torch\nimport torch.nn as nn\nfrom torch import optim\nimport os\nimport time\nimport warnings\nimport numpy as np\nfrom utils.dtw_metric import dtw, accelerated_dtw\nfrom utils.augmentation import run_augmentation, run_augmentation_single\n\nwarnings.filterwarnings('ignore')\n\n\nclass Exp_Long_Term_Forecast(Exp_Basic):\n    def __init__(self, args):\n        super(Exp_Long_Term_Forecast, self).__init__(args)\n\n    def _build_model(self):\n        model = self.model_dict[self.args.model](self.args).float()\n\n        if self.args.use_multi_gpu and self.args.use_gpu:\n            model = nn.DataParallel(model, device_ids=self.args.device_ids)\n        return model\n\n    def _get_data(self, flag):\n        data_set, data_loader = data_provider(self.args, flag)\n        return data_set, data_loader\n\n    def _select_optimizer(self):\n        model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\n        return model_optim\n\n    def _select_criterion(self):\n        criterion = nn.MSELoss()\n        return criterion\n \n\n    def vali(self, vali_data, vali_loader, criterion):\n        total_loss = []\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(vali_loader):\n                batch_x = batch_x.float().to(self.device)\n                batch_y = batch_y.float()\n\n                batch_x_mark = batch_x_mark.float().to(self.device)\n                batch_y_mark = batch_y_mark.float().to(self.device)\n\n                # decoder input\n                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\n                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\n                # encoder - decoder\n                if self.args.use_amp:\n                    with torch.cuda.amp.autocast():\n                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n                else:\n                    outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, -self.args.pred_len:, f_dim:]\n                batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\n\n                pred = outputs.detach()\n                true = batch_y.detach()\n\n                loss = criterion(pred, true)\n\n                total_loss.append(loss.item())\n        total_loss = np.average(total_loss)\n        self.model.train()\n        return total_loss\n\n    def train(self, setting):\n        train_data, train_loader = self._get_data(flag='train')\n        vali_data, vali_loader = self._get_data(flag='val')\n        test_data, test_loader = self._get_data(flag='test')\n\n        path = os.path.join(self.args.checkpoints, setting)\n        if not os.path.exists(path):\n            os.makedirs(path)\n\n        time_now = time.time()\n\n        train_steps = len(train_loader)\n        early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)\n\n        model_optim = self._select_optimizer()\n        criterion = self._select_criterion()\n\n        if self.args.use_amp:\n            scaler = torch.cuda.amp.GradScaler()\n\n        for epoch in range(self.args.train_epochs):\n            iter_count = 0\n            train_loss = []\n\n            self.model.train()\n            epoch_time = time.time()\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader):\n                iter_count += 1\n                model_optim.zero_grad()\n                batch_x = batch_x.float().to(self.device)\n                batch_y = batch_y.float().to(self.device)\n                batch_x_mark = batch_x_mark.float().to(self.device)\n                batch_y_mark = batch_y_mark.float().to(self.device)\n\n                # decoder input\n                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\n                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\n\n                # encoder - decoder\n                if self.args.use_amp:\n                    with torch.cuda.amp.autocast():\n                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n\n                        f_dim = -1 if self.args.features == 'MS' else 0\n                        outputs = outputs[:, -self.args.pred_len:, f_dim:]\n                        batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\n                        loss = criterion(outputs, batch_y)\n                        train_loss.append(loss.item())\n                else:\n                    outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n\n                    f_dim = -1 if self.args.features == 'MS' else 0\n                    outputs = outputs[:, -self.args.pred_len:, f_dim:]\n                    batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\n                    loss = criterion(outputs, batch_y)\n                    train_loss.append(loss.item())\n\n                if (i + 1) % 100 == 0:\n                    print(\"\\titers: {0}, epoch: {1} | loss: {2:.7f}\".format(i + 1, epoch + 1, loss.item()))\n                    speed = (time.time() - time_now) / iter_count\n                    left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)\n                    print('\\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time))\n                    iter_count = 0\n                    time_now = time.time()\n\n                if self.args.use_amp:\n                    scaler.scale(loss).backward()\n                    scaler.step(model_optim)\n                    scaler.update()\n                else:\n                    loss.backward()\n                    model_optim.step()\n\n            print(\"Epoch: {} cost time: {}\".format(epoch + 1, time.time() - epoch_time))\n            train_loss = np.average(train_loss)\n            vali_loss = self.vali(vali_data, vali_loader, criterion)\n            test_loss = self.vali(test_data, test_loader, criterion)\n\n            print(\"Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}\".format(\n                epoch + 1, train_steps, train_loss, vali_loss, test_loss))\n            early_stopping(vali_loss, self.model, path)\n            if early_stopping.early_stop:\n                print(\"Early stopping\")\n                break\n\n            adjust_learning_rate(model_optim, epoch + 1, self.args)\n\n        best_model_path = path + '/' + 'checkpoint.pth'\n        self.model.load_state_dict(torch.load(best_model_path))\n\n        return self.model\n\n    def test(self, setting, test=0):\n        test_data, test_loader = self._get_data(flag='test')\n        if test:\n            print('loading model')\n            self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth')))\n\n        preds = []\n        trues = []\n        folder_path = './test_results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader):\n                batch_x = batch_x.float().to(self.device)\n                batch_y = batch_y.float().to(self.device)\n\n                batch_x_mark = batch_x_mark.float().to(self.device)\n                batch_y_mark = batch_y_mark.float().to(self.device)\n\n                # decoder input\n                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\n                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\n                # encoder - decoder\n                if self.args.use_amp:\n                    with torch.cuda.amp.autocast():\n                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n                else:\n                    outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, -self.args.pred_len:, :]\n                batch_y = batch_y[:, -self.args.pred_len:, :].to(self.device)\n                outputs = outputs.detach().cpu().numpy()\n                batch_y = batch_y.detach().cpu().numpy()\n                if test_data.scale and self.args.inverse:\n                    shape = batch_y.shape\n                    if outputs.shape[-1] != batch_y.shape[-1]:\n                        outputs = np.tile(outputs, [1, 1, int(batch_y.shape[-1] / outputs.shape[-1])])\n                    outputs = test_data.inverse_transform(outputs.reshape(shape[0] * shape[1], -1)).reshape(shape)\n                    batch_y = test_data.inverse_transform(batch_y.reshape(shape[0] * shape[1], -1)).reshape(shape)\n\n                outputs = outputs[:, :, f_dim:]\n                batch_y = batch_y[:, :, f_dim:]\n\n                pred = outputs\n                true = batch_y\n\n                preds.append(pred)\n                trues.append(true)\n                if i % 20 == 0:\n                    input = batch_x.detach().cpu().numpy()\n                    if test_data.scale and self.args.inverse:\n                        shape = input.shape\n                        input = test_data.inverse_transform(input.reshape(shape[0] * shape[1], -1)).reshape(shape)\n                    gt = np.concatenate((input[0, :, -1], true[0, :, -1]), axis=0)\n                    pd = np.concatenate((input[0, :, -1], pred[0, :, -1]), axis=0)\n                    visual(gt, pd, os.path.join(folder_path, str(i) + '.pdf'))\n\n        preds = np.concatenate(preds, axis=0)\n        trues = np.concatenate(trues, axis=0)\n        print('test shape:', preds.shape, trues.shape)\n        preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1])\n        trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1])\n        print('test shape:', preds.shape, trues.shape)\n\n        # result save\n        folder_path = './results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        # dtw calculation\n        if self.args.use_dtw:\n            dtw_list = []\n            manhattan_distance = lambda x, y: np.abs(x - y)\n            for i in range(preds.shape[0]):\n                x = preds[i].reshape(-1, 1)\n                y = trues[i].reshape(-1, 1)\n                if i % 100 == 0:\n                    print(\"calculating dtw iter:\", i)\n                d, _, _, _ = accelerated_dtw(x, y, dist=manhattan_distance)\n                dtw_list.append(d)\n            dtw = np.array(dtw_list).mean()\n        else:\n            dtw = 'Not calculated'\n\n        mae, mse, rmse, mape, mspe = metric(preds, trues)\n        print('mse:{}, mae:{}, dtw:{}'.format(mse, mae, dtw))\n        f = open(\"result_long_term_forecast.txt\", 'a')\n        f.write(setting + \"  \\n\")\n        f.write('mse:{}, mae:{}, dtw:{}'.format(mse, mae, dtw))\n        f.write('\\n')\n        f.write('\\n')\n        f.close()\n\n        np.save(folder_path + 'metrics.npy', np.array([mae, mse, rmse, mape, mspe]))\n        np.save(folder_path + 'pred.npy', preds)\n        np.save(folder_path + 'true.npy', trues)\n\n        return\n"
  },
  {
    "path": "exp/exp_short_term_forecasting.py",
    "content": "from data_provider.data_factory import data_provider\nfrom data_provider.m4 import M4Meta\nfrom exp.exp_basic import Exp_Basic\nfrom utils.tools import EarlyStopping, adjust_learning_rate, visual\nfrom utils.losses import mape_loss, mase_loss, smape_loss\nfrom utils.m4_summary import M4Summary\nimport torch\nimport torch.nn as nn\nfrom torch import optim\nimport os\nimport time\nimport warnings\nimport numpy as np\nimport pandas\n\nwarnings.filterwarnings('ignore')\n\n\nclass Exp_Short_Term_Forecast(Exp_Basic):\n    def __init__(self, args):\n        super(Exp_Short_Term_Forecast, self).__init__(args)\n\n    def _build_model(self):\n        if self.args.data == 'm4':\n            self.args.pred_len = M4Meta.horizons_map[self.args.seasonal_patterns]  # Up to M4 config\n            self.args.seq_len = 2 * self.args.pred_len  # input_len = 2*pred_len\n            self.args.label_len = self.args.pred_len\n            self.args.frequency_map = M4Meta.frequency_map[self.args.seasonal_patterns]\n        model = self.model_dict[self.args.model](self.args).float()\n\n        if self.args.use_multi_gpu and self.args.use_gpu:\n            model = nn.DataParallel(model, device_ids=self.args.device_ids)\n        return model\n\n    def _get_data(self, flag):\n        data_set, data_loader = data_provider(self.args, flag)\n        return data_set, data_loader\n\n    def _select_optimizer(self):\n        model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\n        return model_optim\n\n    def _select_criterion(self, loss_name='MSE'):\n        if loss_name == 'MSE':\n            return nn.MSELoss()\n        elif loss_name == 'MAPE':\n            return mape_loss()\n        elif loss_name == 'MASE':\n            return mase_loss()\n        elif loss_name == 'SMAPE':\n            return smape_loss()\n\n    def train(self, setting):\n        train_data, train_loader = self._get_data(flag='train')\n        vali_data, vali_loader = self._get_data(flag='val')\n\n        path = os.path.join(self.args.checkpoints, setting)\n        if not os.path.exists(path):\n            os.makedirs(path)\n\n        time_now = time.time()\n\n        train_steps = len(train_loader)\n        early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)\n\n        model_optim = self._select_optimizer()\n        criterion = self._select_criterion(self.args.loss)\n        mse = nn.MSELoss()\n\n        for epoch in range(self.args.train_epochs):\n            iter_count = 0\n            train_loss = []\n\n            self.model.train()\n            epoch_time = time.time()\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader):\n                iter_count += 1\n                model_optim.zero_grad()\n                batch_x = batch_x.float().to(self.device)\n\n                batch_y = batch_y.float().to(self.device)\n                batch_y_mark = batch_y_mark.float().to(self.device)\n\n                # decoder input\n                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\n                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\n\n                outputs = self.model(batch_x, None, dec_inp, None)\n\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, -self.args.pred_len:, f_dim:]\n                batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\n\n                batch_y_mark = batch_y_mark[:, -self.args.pred_len:, f_dim:].to(self.device)\n                loss_value = criterion(batch_x, self.args.frequency_map, outputs, batch_y, batch_y_mark)\n                loss_sharpness = mse((outputs[:, 1:, :] - outputs[:, :-1, :]), (batch_y[:, 1:, :] - batch_y[:, :-1, :]))\n                loss = loss_value  # + loss_sharpness * 1e-5\n                train_loss.append(loss.item())\n\n                if (i + 1) % 100 == 0:\n                    print(\"\\titers: {0}, epoch: {1} | loss: {2:.7f}\".format(i + 1, epoch + 1, loss.item()))\n                    speed = (time.time() - time_now) / iter_count\n                    left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)\n                    print('\\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time))\n                    iter_count = 0\n                    time_now = time.time()\n\n                loss.backward()\n                model_optim.step()\n\n            print(\"Epoch: {} cost time: {}\".format(epoch + 1, time.time() - epoch_time))\n            train_loss = np.average(train_loss)\n            vali_loss = self.vali(train_loader, vali_loader, criterion)\n            test_loss = vali_loss\n            print(\"Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}\".format(\n                epoch + 1, train_steps, train_loss, vali_loss, test_loss))\n            early_stopping(vali_loss, self.model, path)\n            if early_stopping.early_stop:\n                print(\"Early stopping\")\n                break\n\n            adjust_learning_rate(model_optim, epoch + 1, self.args)\n\n        best_model_path = path + '/' + 'checkpoint.pth'\n        self.model.load_state_dict(torch.load(best_model_path))\n\n        return self.model\n\n    def vali(self, train_loader, vali_loader, criterion):\n        x, _ = train_loader.dataset.last_insample_window()\n        y = vali_loader.dataset.timeseries\n        x = torch.tensor(x, dtype=torch.float32).to(self.device)\n        x = x.unsqueeze(-1)\n\n        self.model.eval()\n        with torch.no_grad():\n            # decoder input\n            B, _, C = x.shape\n            dec_inp = torch.zeros((B, self.args.pred_len, C)).float().to(self.device)\n            dec_inp = torch.cat([x[:, -self.args.label_len:, :], dec_inp], dim=1).float()\n            # encoder - decoder\n            outputs = torch.zeros((B, self.args.pred_len, C)).float()  # .to(self.device)\n            id_list = np.arange(0, B, 500)  # validation set size\n            id_list = np.append(id_list, B)\n            for i in range(len(id_list) - 1):\n                outputs[id_list[i]:id_list[i + 1], :, :] = self.model(x[id_list[i]:id_list[i + 1]], None,\n                                                                      dec_inp[id_list[i]:id_list[i + 1]],\n                                                                      None).detach().cpu()\n            f_dim = -1 if self.args.features == 'MS' else 0\n            outputs = outputs[:, -self.args.pred_len:, f_dim:]\n            pred = outputs\n            true = torch.from_numpy(np.array(y))\n            batch_y_mark = torch.ones(true.shape)\n\n            loss = criterion(x.detach().cpu()[:, :, 0], self.args.frequency_map, pred[:, :, 0], true, batch_y_mark)\n\n        self.model.train()\n        return loss\n\n    def test(self, setting, test=0):\n        _, train_loader = self._get_data(flag='train')\n        _, test_loader = self._get_data(flag='test')\n        x, _ = train_loader.dataset.last_insample_window()\n        y = test_loader.dataset.timeseries\n        x = torch.tensor(x, dtype=torch.float32).to(self.device)\n        x = x.unsqueeze(-1)\n\n        if test:\n            print('loading model')\n            self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth')))\n\n        folder_path = './test_results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        self.model.eval()\n        with torch.no_grad():\n            B, _, C = x.shape\n            dec_inp = torch.zeros((B, self.args.pred_len, C)).float().to(self.device)\n            dec_inp = torch.cat([x[:, -self.args.label_len:, :], dec_inp], dim=1).float()\n            # encoder - decoder\n            outputs = torch.zeros((B, self.args.pred_len, C)).float().to(self.device)\n            id_list = np.arange(0, B, 1)\n            id_list = np.append(id_list, B)\n            for i in range(len(id_list) - 1):\n                outputs[id_list[i]:id_list[i + 1], :, :] = self.model(x[id_list[i]:id_list[i + 1]], None,\n                                                                      dec_inp[id_list[i]:id_list[i + 1]], None)\n\n                if id_list[i] % 1000 == 0:\n                    print(id_list[i])\n\n            f_dim = -1 if self.args.features == 'MS' else 0\n            outputs = outputs[:, -self.args.pred_len:, f_dim:]\n            outputs = outputs.detach().cpu().numpy()\n\n            preds = outputs\n            trues = y\n            x = x.detach().cpu().numpy()\n\n            for i in range(0, preds.shape[0], preds.shape[0] // 10):\n                gt = np.concatenate((x[i, :, 0], trues[i]), axis=0)\n                pd = np.concatenate((x[i, :, 0], preds[i, :, 0]), axis=0)\n                visual(gt, pd, os.path.join(folder_path, str(i) + '.pdf'))\n\n        print('test shape:', preds.shape)\n\n        # result save\n        folder_path = './m4_results/' + self.args.model + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        forecasts_df = pandas.DataFrame(preds[:, :, 0], columns=[f'V{i + 1}' for i in range(self.args.pred_len)])\n        forecasts_df.index = test_loader.dataset.ids[:preds.shape[0]]\n        forecasts_df.index.name = 'id'\n        forecasts_df.set_index(forecasts_df.columns[0], inplace=True)\n        forecasts_df.to_csv(folder_path + self.args.seasonal_patterns + '_forecast.csv')\n\n        print(self.args.model)\n        file_path = './m4_results/' + self.args.model + '/'\n        if 'Weekly_forecast.csv' in os.listdir(file_path) \\\n                and 'Monthly_forecast.csv' in os.listdir(file_path) \\\n                and 'Yearly_forecast.csv' in os.listdir(file_path) \\\n                and 'Daily_forecast.csv' in os.listdir(file_path) \\\n                and 'Hourly_forecast.csv' in os.listdir(file_path) \\\n                and 'Quarterly_forecast.csv' in os.listdir(file_path):\n            m4_summary = M4Summary(file_path, self.args.root_path)\n            # m4_forecast.set_index(m4_winner_forecast.columns[0], inplace=True)\n            smape_results, owa_results, mape, mase = m4_summary.evaluate()\n            print('smape:', smape_results)\n            print('mape:', mape)\n            print('mase:', mase)\n            print('owa:', owa_results)\n        else:\n            print('After all 6 tasks are finished, you can calculate the averaged index')\n        return\n"
  },
  {
    "path": "exp/exp_zero_shot_forecasting.py",
    "content": "from data_provider.data_factory import data_provider\nfrom exp.exp_basic import Exp_Basic\nfrom utils.tools import EarlyStopping, adjust_learning_rate, visual\nfrom utils.metrics import metric\nimport torch\nimport torch.nn as nn\nfrom torch import optim\nimport os\nimport time\nimport warnings\nimport numpy as np\nfrom utils.dtw_metric import dtw, accelerated_dtw\nfrom utils.augmentation import run_augmentation, run_augmentation_single\n\nwarnings.filterwarnings('ignore')\n\n\nclass Exp_Zero_Shot_Forecast(Exp_Basic):\n    def __init__(self, args):\n        super(Exp_Zero_Shot_Forecast, self).__init__(args)\n\n    def _build_model(self):\n        model = self.model_dict[self.args.model](self.args).float()\n\n        if self.args.use_multi_gpu and self.args.use_gpu:\n            model = nn.DataParallel(model, device_ids=self.args.device_ids)\n        return model\n\n    def _get_data(self, flag):\n        data_set, data_loader = data_provider(self.args, flag)\n        return data_set, data_loader\n\n    def _select_optimizer(self):\n        model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\n        return model_optim\n\n    def _select_criterion(self):\n        criterion = nn.MSELoss()\n        return criterion\n\n    def test(self, setting, test=0):\n        test_data, test_loader = self._get_data(flag='test')\n\n        preds = []\n        trues = []\n        folder_path = './test_results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        self.model.eval()\n        with torch.no_grad():\n            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader):\n                # start_time = time.time()\n                batch_x = batch_x.float().to(self.device)\n                batch_y = batch_y.float().to(self.device)\n\n                batch_x_mark = batch_x_mark.float().to(self.device)\n                batch_y_mark = batch_y_mark.float().to(self.device)\n\n                # decoder input\n                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\n                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\n                # encoder - decoder\n                if self.args.use_amp:\n                    with torch.cuda.amp.autocast():\n                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n                else:\n                    outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n                # print(\"Test cost time: {}\".format(time.time() - start_time))\n                f_dim = -1 if self.args.features == 'MS' else 0\n                outputs = outputs[:, -self.args.pred_len:, :]\n                batch_y = batch_y[:, -self.args.pred_len:, :].to(self.device)\n                outputs = outputs.detach().cpu().numpy()\n                batch_y = batch_y.detach().cpu().numpy()\n                if test_data.scale and self.args.inverse:\n                    shape = batch_y.shape\n                    if outputs.shape[-1] != batch_y.shape[-1]:\n                        outputs = np.tile(outputs, [1, 1, int(batch_y.shape[-1] / outputs.shape[-1])])\n                    outputs = test_data.inverse_transform(outputs.reshape(shape[0] * shape[1], -1)).reshape(shape)\n                    batch_y = test_data.inverse_transform(batch_y.reshape(shape[0] * shape[1], -1)).reshape(shape)\n\n                outputs = outputs[:, :, f_dim:]\n                batch_y = batch_y[:, :, f_dim:]\n\n                pred = outputs\n                true = batch_y\n\n                preds.append(pred)\n                trues.append(true)\n                if i % 20 == 0:\n                    input = batch_x.detach().cpu().numpy()\n                    if test_data.scale and self.args.inverse:\n                        shape = input.shape\n                        input = test_data.inverse_transform(input.reshape(shape[0] * shape[1], -1)).reshape(shape)\n                    gt = np.concatenate((input[0, :, -1], true[0, :, -1]), axis=0)\n                    pd = np.concatenate((input[0, :, -1], pred[0, :, -1]), axis=0)\n                    visual(gt, pd, os.path.join(folder_path, str(i) + '.pdf'))\n\n        preds = np.concatenate(preds, axis=0)\n        trues = np.concatenate(trues, axis=0)\n        print('test shape:', preds.shape, trues.shape)\n        preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1])\n        trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1])\n        print('test shape:', preds.shape, trues.shape)\n\n        # result save\n        folder_path = './results/' + setting + '/'\n        if not os.path.exists(folder_path):\n            os.makedirs(folder_path)\n\n        # dtw calculation\n        if self.args.use_dtw:\n            dtw_list = []\n            manhattan_distance = lambda x, y: np.abs(x - y)\n            for i in range(preds.shape[0]):\n                x = preds[i].reshape(-1, 1)\n                y = trues[i].reshape(-1, 1)\n                if i % 100 == 0:\n                    print(\"calculating dtw iter:\", i)\n                d, _, _, _ = accelerated_dtw(x, y, dist=manhattan_distance)\n                dtw_list.append(d)\n            dtw = np.array(dtw_list).mean()\n        else:\n            dtw = 'Not calculated'\n\n        mae, mse, rmse, mape, mspe = metric(preds, trues)\n        print('mse:{}, mae:{}, dtw:{}'.format(mse, mae, dtw))\n        f = open(\"result_zero_shot_forecast_search.txt\", 'a')\n        f.write(setting + \"  \\n\")\n        f.write('mse:{}, mae:{}, dtw:{}'.format(mse, mae, dtw))\n        f.write('\\n')\n        f.write('\\n')\n        f.close()\n\n        np.save(folder_path + 'metrics.npy', np.array([mae, mse, rmse, mape, mspe]))\n        np.save(folder_path + 'pred.npy', preds)\n        np.save(folder_path + 'true.npy', trues)\n\n        return\n"
  },
  {
    "path": "layers/AutoCorrelation.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport math\nfrom math import sqrt\nimport os\n\n\nclass AutoCorrelation(nn.Module):\n    \"\"\"\n    AutoCorrelation Mechanism with the following two phases:\n    (1) period-based dependencies discovery\n    (2) time delay aggregation\n    This block can replace the self-attention family mechanism seamlessly.\n    \"\"\"\n\n    def __init__(self, mask_flag=True, factor=1, scale=None, attention_dropout=0.1, output_attention=False):\n        super(AutoCorrelation, self).__init__()\n        self.factor = factor\n        self.scale = scale\n        self.mask_flag = mask_flag\n        self.output_attention = output_attention\n        self.dropout = nn.Dropout(attention_dropout)\n\n    def time_delay_agg_training(self, values, corr):\n        \"\"\"\n        SpeedUp version of Autocorrelation (a batch-normalization style design)\n        This is for the training phase.\n        \"\"\"\n        head = values.shape[1]\n        channel = values.shape[2]\n        length = values.shape[3]\n        # find top k\n        top_k = int(self.factor * math.log(length))\n        mean_value = torch.mean(torch.mean(corr, dim=1), dim=1)\n        index = torch.topk(torch.mean(mean_value, dim=0), top_k, dim=-1)[1]\n        weights = torch.stack([mean_value[:, index[i]] for i in range(top_k)], dim=-1)\n        # update corr\n        tmp_corr = torch.softmax(weights, dim=-1)\n        # aggregation\n        tmp_values = values\n        delays_agg = torch.zeros_like(values).float()\n        for i in range(top_k):\n            pattern = torch.roll(tmp_values, -int(index[i]), -1)\n            delays_agg = delays_agg + pattern * \\\n                         (tmp_corr[:, i].unsqueeze(1).unsqueeze(1).unsqueeze(1).repeat(1, head, channel, length))\n        return delays_agg\n\n    def time_delay_agg_inference(self, values, corr):\n        \"\"\"\n        SpeedUp version of Autocorrelation (a batch-normalization style design)\n        This is for the inference phase.\n        \"\"\"\n        batch = values.shape[0]\n        head = values.shape[1]\n        channel = values.shape[2]\n        length = values.shape[3]\n        # index init\n        init_index = torch.arange(length).unsqueeze(0).unsqueeze(0).unsqueeze(0).repeat(batch, head, channel, 1).to(values.device)\n        # find top k\n        top_k = int(self.factor * math.log(length))\n        mean_value = torch.mean(torch.mean(corr, dim=1), dim=1)\n        weights, delay = torch.topk(mean_value, top_k, dim=-1)\n        # update corr\n        tmp_corr = torch.softmax(weights, dim=-1)\n        # aggregation\n        tmp_values = values.repeat(1, 1, 1, 2)\n        delays_agg = torch.zeros_like(values).float()\n        for i in range(top_k):\n            tmp_delay = init_index + delay[:, i].unsqueeze(1).unsqueeze(1).unsqueeze(1).repeat(1, head, channel, length)\n            pattern = torch.gather(tmp_values, dim=-1, index=tmp_delay)\n            delays_agg = delays_agg + pattern * \\\n                         (tmp_corr[:, i].unsqueeze(1).unsqueeze(1).unsqueeze(1).repeat(1, head, channel, length))\n        return delays_agg\n\n    def time_delay_agg_full(self, values, corr):\n        \"\"\"\n        Standard version of Autocorrelation\n        \"\"\"\n        batch = values.shape[0]\n        head = values.shape[1]\n        channel = values.shape[2]\n        length = values.shape[3]\n        # index init\n        init_index = torch.arange(length).unsqueeze(0).unsqueeze(0).unsqueeze(0).repeat(batch, head, channel, 1).to(values.device)\n        # find top k\n        top_k = int(self.factor * math.log(length))\n        weights, delay = torch.topk(corr, top_k, dim=-1)\n        # update corr\n        tmp_corr = torch.softmax(weights, dim=-1)\n        # aggregation\n        tmp_values = values.repeat(1, 1, 1, 2)\n        delays_agg = torch.zeros_like(values).float()\n        for i in range(top_k):\n            tmp_delay = init_index + delay[..., i].unsqueeze(-1)\n            pattern = torch.gather(tmp_values, dim=-1, index=tmp_delay)\n            delays_agg = delays_agg + pattern * (tmp_corr[..., i].unsqueeze(-1))\n        return delays_agg\n\n    def forward(self, queries, keys, values, attn_mask):\n        B, L, H, E = queries.shape\n        _, S, _, D = values.shape\n        if L > S:\n            zeros = torch.zeros_like(queries[:, :(L - S), :]).float()\n            values = torch.cat([values, zeros], dim=1)\n            keys = torch.cat([keys, zeros], dim=1)\n        else:\n            values = values[:, :L, :, :]\n            keys = keys[:, :L, :, :]\n\n        # period-based dependencies\n        q_fft = torch.fft.rfft(queries.permute(0, 2, 3, 1).contiguous(), dim=-1)\n        k_fft = torch.fft.rfft(keys.permute(0, 2, 3, 1).contiguous(), dim=-1)\n        res = q_fft * torch.conj(k_fft)\n        corr = torch.fft.irfft(res, dim=-1)\n\n        # time delay agg\n        if self.training:\n            V = self.time_delay_agg_training(values.permute(0, 2, 3, 1).contiguous(), corr).permute(0, 3, 1, 2)\n        else:\n            V = self.time_delay_agg_inference(values.permute(0, 2, 3, 1).contiguous(), corr).permute(0, 3, 1, 2)\n\n        if self.output_attention:\n            return (V.contiguous(), corr.permute(0, 3, 1, 2))\n        else:\n            return (V.contiguous(), None)\n\n\nclass AutoCorrelationLayer(nn.Module):\n    def __init__(self, correlation, d_model, n_heads, d_keys=None,\n                 d_values=None):\n        super(AutoCorrelationLayer, self).__init__()\n\n        d_keys = d_keys or (d_model // n_heads)\n        d_values = d_values or (d_model // n_heads)\n\n        self.inner_correlation = correlation\n        self.query_projection = nn.Linear(d_model, d_keys * n_heads)\n        self.key_projection = nn.Linear(d_model, d_keys * n_heads)\n        self.value_projection = nn.Linear(d_model, d_values * n_heads)\n        self.out_projection = nn.Linear(d_values * n_heads, d_model)\n        self.n_heads = n_heads\n\n    def forward(self, queries, keys, values, attn_mask):\n        B, L, _ = queries.shape\n        _, S, _ = keys.shape\n        H = self.n_heads\n\n        queries = self.query_projection(queries).view(B, L, H, -1)\n        keys = self.key_projection(keys).view(B, S, H, -1)\n        values = self.value_projection(values).view(B, S, H, -1)\n\n        out, attn = self.inner_correlation(\n            queries,\n            keys,\n            values,\n            attn_mask\n        )\n        out = out.view(B, L, -1)\n\n        return self.out_projection(out), attn\n"
  },
  {
    "path": "layers/Autoformer_EncDec.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n\nclass my_Layernorm(nn.Module):\n    \"\"\"\n    Special designed layernorm for the seasonal part\n    \"\"\"\n\n    def __init__(self, channels):\n        super(my_Layernorm, self).__init__()\n        self.layernorm = nn.LayerNorm(channels)\n\n    def forward(self, x):\n        x_hat = self.layernorm(x)\n        bias = torch.mean(x_hat, dim=1).unsqueeze(1).repeat(1, x.shape[1], 1)\n        return x_hat - bias\n\n\nclass moving_avg(nn.Module):\n    \"\"\"\n    Moving average block to highlight the trend of time series\n    \"\"\"\n\n    def __init__(self, kernel_size, stride):\n        super(moving_avg, self).__init__()\n        self.kernel_size = kernel_size\n        self.avg = nn.AvgPool1d(kernel_size=kernel_size, stride=stride, padding=0)\n\n    def forward(self, x):\n        # padding on the both ends of time series\n        front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1)\n        end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1)\n        x = torch.cat([front, x, end], dim=1)\n        x = self.avg(x.permute(0, 2, 1))\n        x = x.permute(0, 2, 1)\n        return x\n\n\nclass series_decomp(nn.Module):\n    \"\"\"\n    Series decomposition block\n    \"\"\"\n\n    def __init__(self, kernel_size):\n        super(series_decomp, self).__init__()\n        self.moving_avg = moving_avg(kernel_size, stride=1)\n\n    def forward(self, x):\n        moving_mean = self.moving_avg(x)\n        res = x - moving_mean\n        return res, moving_mean\n\n\nclass series_decomp_multi(nn.Module):\n    \"\"\"\n    Multiple Series decomposition block from FEDformer\n    \"\"\"\n\n    def __init__(self, kernel_size):\n        super(series_decomp_multi, self).__init__()\n        self.kernel_size = kernel_size\n        self.series_decomp = [series_decomp(kernel) for kernel in kernel_size]\n\n    def forward(self, x):\n        moving_mean = []\n        res = []\n        for func in self.series_decomp:\n            sea, moving_avg = func(x)\n            moving_mean.append(moving_avg)\n            res.append(sea)\n\n        sea = sum(res) / len(res)\n        moving_mean = sum(moving_mean) / len(moving_mean)\n        return sea, moving_mean\n\n\nclass EncoderLayer(nn.Module):\n    \"\"\"\n    Autoformer encoder layer with the progressive decomposition architecture\n    \"\"\"\n\n    def __init__(self, attention, d_model, d_ff=None, moving_avg=25, dropout=0.1, activation=\"relu\"):\n        super(EncoderLayer, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.attention = attention\n        self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1, bias=False)\n        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1, bias=False)\n        self.decomp1 = series_decomp(moving_avg)\n        self.decomp2 = series_decomp(moving_avg)\n        self.dropout = nn.Dropout(dropout)\n        self.activation = F.relu if activation == \"relu\" else F.gelu\n\n    def forward(self, x, attn_mask=None):\n        new_x, attn = self.attention(\n            x, x, x,\n            attn_mask=attn_mask\n        )\n        x = x + self.dropout(new_x)\n        x, _ = self.decomp1(x)\n        y = x\n        y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))\n        y = self.dropout(self.conv2(y).transpose(-1, 1))\n        res, _ = self.decomp2(x + y)\n        return res, attn\n\n\nclass Encoder(nn.Module):\n    \"\"\"\n    Autoformer encoder\n    \"\"\"\n\n    def __init__(self, attn_layers, conv_layers=None, norm_layer=None):\n        super(Encoder, self).__init__()\n        self.attn_layers = nn.ModuleList(attn_layers)\n        self.conv_layers = nn.ModuleList(conv_layers) if conv_layers is not None else None\n        self.norm = norm_layer\n\n    def forward(self, x, attn_mask=None):\n        attns = []\n        if self.conv_layers is not None:\n            for attn_layer, conv_layer in zip(self.attn_layers, self.conv_layers):\n                x, attn = attn_layer(x, attn_mask=attn_mask)\n                x = conv_layer(x)\n                attns.append(attn)\n            x, attn = self.attn_layers[-1](x)\n            attns.append(attn)\n        else:\n            for attn_layer in self.attn_layers:\n                x, attn = attn_layer(x, attn_mask=attn_mask)\n                attns.append(attn)\n\n        if self.norm is not None:\n            x = self.norm(x)\n\n        return x, attns\n\n\nclass DecoderLayer(nn.Module):\n    \"\"\"\n    Autoformer decoder layer with the progressive decomposition architecture\n    \"\"\"\n\n    def __init__(self, self_attention, cross_attention, d_model, c_out, d_ff=None,\n                 moving_avg=25, dropout=0.1, activation=\"relu\"):\n        super(DecoderLayer, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.self_attention = self_attention\n        self.cross_attention = cross_attention\n        self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1, bias=False)\n        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1, bias=False)\n        self.decomp1 = series_decomp(moving_avg)\n        self.decomp2 = series_decomp(moving_avg)\n        self.decomp3 = series_decomp(moving_avg)\n        self.dropout = nn.Dropout(dropout)\n        self.projection = nn.Conv1d(in_channels=d_model, out_channels=c_out, kernel_size=3, stride=1, padding=1,\n                                    padding_mode='circular', bias=False)\n        self.activation = F.relu if activation == \"relu\" else F.gelu\n\n    def forward(self, x, cross, x_mask=None, cross_mask=None):\n        x = x + self.dropout(self.self_attention(\n            x, x, x,\n            attn_mask=x_mask\n        )[0])\n        x, trend1 = self.decomp1(x)\n        x = x + self.dropout(self.cross_attention(\n            x, cross, cross,\n            attn_mask=cross_mask\n        )[0])\n        x, trend2 = self.decomp2(x)\n        y = x\n        y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))\n        y = self.dropout(self.conv2(y).transpose(-1, 1))\n        x, trend3 = self.decomp3(x + y)\n\n        residual_trend = trend1 + trend2 + trend3\n        residual_trend = self.projection(residual_trend.permute(0, 2, 1)).transpose(1, 2)\n        return x, residual_trend\n\n\nclass Decoder(nn.Module):\n    \"\"\"\n    Autoformer encoder\n    \"\"\"\n\n    def __init__(self, layers, norm_layer=None, projection=None):\n        super(Decoder, self).__init__()\n        self.layers = nn.ModuleList(layers)\n        self.norm = norm_layer\n        self.projection = projection\n\n    def forward(self, x, cross, x_mask=None, cross_mask=None, trend=None):\n        for layer in self.layers:\n            x, residual_trend = layer(x, cross, x_mask=x_mask, cross_mask=cross_mask)\n            trend = trend + residual_trend\n\n        if self.norm is not None:\n            x = self.norm(x)\n\n        if self.projection is not None:\n            x = self.projection(x)\n        return x, trend\n"
  },
  {
    "path": "layers/Conv_Blocks.py",
    "content": "import torch\nimport torch.nn as nn\n\n\nclass Inception_Block_V1(nn.Module):\n    def __init__(self, in_channels, out_channels, num_kernels=6, init_weight=True):\n        super(Inception_Block_V1, self).__init__()\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.num_kernels = num_kernels\n        kernels = []\n        for i in range(self.num_kernels):\n            kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=2 * i + 1, padding=i))\n        self.kernels = nn.ModuleList(kernels)\n        if init_weight:\n            self._initialize_weights()\n\n    def _initialize_weights(self):\n        for m in self.modules():\n            if isinstance(m, nn.Conv2d):\n                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')\n                if m.bias is not None:\n                    nn.init.constant_(m.bias, 0)\n\n    def forward(self, x):\n        res_list = []\n        for i in range(self.num_kernels):\n            res_list.append(self.kernels[i](x))\n        res = torch.stack(res_list, dim=-1).mean(-1)\n        return res\n\n\nclass Inception_Block_V2(nn.Module):\n    def __init__(self, in_channels, out_channels, num_kernels=6, init_weight=True):\n        super(Inception_Block_V2, self).__init__()\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.num_kernels = num_kernels\n        kernels = []\n        for i in range(self.num_kernels // 2):\n            kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=[1, 2 * i + 3], padding=[0, i + 1]))\n            kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=[2 * i + 3, 1], padding=[i + 1, 0]))\n        kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=1))\n        self.kernels = nn.ModuleList(kernels)\n        if init_weight:\n            self._initialize_weights()\n\n    def _initialize_weights(self):\n        for m in self.modules():\n            if isinstance(m, nn.Conv2d):\n                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')\n                if m.bias is not None:\n                    nn.init.constant_(m.bias, 0)\n\n    def forward(self, x):\n        res_list = []\n        for i in range(self.num_kernels // 2 * 2 + 1):\n            res_list.append(self.kernels[i](x))\n        res = torch.stack(res_list, dim=-1).mean(-1)\n        return res\n"
  },
  {
    "path": "layers/Crossformer_EncDec.py",
    "content": "import torch\nimport torch.nn as nn\nfrom einops import rearrange, repeat\nfrom layers.SelfAttention_Family import TwoStageAttentionLayer\n\n\nclass SegMerging(nn.Module):\n    def __init__(self, d_model, win_size, norm_layer=nn.LayerNorm):\n        super().__init__()\n        self.d_model = d_model\n        self.win_size = win_size\n        self.linear_trans = nn.Linear(win_size * d_model, d_model)\n        self.norm = norm_layer(win_size * d_model)\n\n    def forward(self, x):\n        batch_size, ts_d, seg_num, d_model = x.shape\n        pad_num = seg_num % self.win_size\n        if pad_num != 0:\n            pad_num = self.win_size - pad_num\n            x = torch.cat((x, x[:, :, -pad_num:, :]), dim=-2)\n\n        seg_to_merge = []\n        for i in range(self.win_size):\n            seg_to_merge.append(x[:, :, i::self.win_size, :])\n        x = torch.cat(seg_to_merge, -1)\n\n        x = self.norm(x)\n        x = self.linear_trans(x)\n\n        return x\n\n\nclass scale_block(nn.Module):\n    def __init__(self, configs, win_size, d_model, n_heads, d_ff, depth, dropout, \\\n                 seg_num=10, factor=10):\n        super(scale_block, self).__init__()\n\n        if win_size > 1:\n            self.merge_layer = SegMerging(d_model, win_size, nn.LayerNorm)\n        else:\n            self.merge_layer = None\n\n        self.encode_layers = nn.ModuleList()\n\n        for i in range(depth):\n            self.encode_layers.append(TwoStageAttentionLayer(configs, seg_num, factor, d_model, n_heads, \\\n                                                             d_ff, dropout))\n\n    def forward(self, x, attn_mask=None, tau=None, delta=None):\n        _, ts_dim, _, _ = x.shape\n\n        if self.merge_layer is not None:\n            x = self.merge_layer(x)\n\n        for layer in self.encode_layers:\n            x = layer(x)\n\n        return x, None\n\n\nclass Encoder(nn.Module):\n    def __init__(self, attn_layers):\n        super(Encoder, self).__init__()\n        self.encode_blocks = nn.ModuleList(attn_layers)\n\n    def forward(self, x):\n        encode_x = []\n        encode_x.append(x)\n\n        for block in self.encode_blocks:\n            x, attns = block(x)\n            encode_x.append(x)\n\n        return encode_x, None\n\n\nclass DecoderLayer(nn.Module):\n    def __init__(self, self_attention, cross_attention, seg_len, d_model, d_ff=None, dropout=0.1):\n        super(DecoderLayer, self).__init__()\n        self.self_attention = self_attention\n        self.cross_attention = cross_attention\n        self.norm1 = nn.LayerNorm(d_model)\n        self.norm2 = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.MLP1 = nn.Sequential(nn.Linear(d_model, d_model),\n                                  nn.GELU(),\n                                  nn.Linear(d_model, d_model))\n        self.linear_pred = nn.Linear(d_model, seg_len)\n\n    def forward(self, x, cross):\n        batch = x.shape[0]\n        x = self.self_attention(x)\n        x = rearrange(x, 'b ts_d out_seg_num d_model -> (b ts_d) out_seg_num d_model')\n\n        cross = rearrange(cross, 'b ts_d in_seg_num d_model -> (b ts_d) in_seg_num d_model')\n        tmp, attn = self.cross_attention(x, cross, cross, None, None, None,)\n        x = x + self.dropout(tmp)\n        y = x = self.norm1(x)\n        y = self.MLP1(y)\n        dec_output = self.norm2(x + y)\n\n        dec_output = rearrange(dec_output, '(b ts_d) seg_dec_num d_model -> b ts_d seg_dec_num d_model', b=batch)\n        layer_predict = self.linear_pred(dec_output)\n        layer_predict = rearrange(layer_predict, 'b out_d seg_num seg_len -> b (out_d seg_num) seg_len')\n\n        return dec_output, layer_predict\n\n\nclass Decoder(nn.Module):\n    def __init__(self, layers):\n        super(Decoder, self).__init__()\n        self.decode_layers = nn.ModuleList(layers)\n\n\n    def forward(self, x, cross):\n        final_predict = None\n        i = 0\n\n        ts_d = x.shape[1]\n        for layer in self.decode_layers:\n            cross_enc = cross[i]\n            x, layer_predict = layer(x, cross_enc)\n            if final_predict is None:\n                final_predict = layer_predict\n            else:\n                final_predict = final_predict + layer_predict\n            i += 1\n\n        final_predict = rearrange(final_predict, 'b (out_d seg_num) seg_len -> b (seg_num seg_len) out_d', out_d=ts_d)\n\n        return final_predict\n"
  },
  {
    "path": "layers/DWT_Decomposition.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Sun Jan  5\n@author: Murad\nSISLab, USF\nmmurad@usf.edu\nhttps://github.com/Secure-and-Intelligent-Systems-Lab/WPMixer\n\"\"\"\n\nimport torch\nimport torch.nn as nn\nimport pywt\nimport numpy as np\nimport torch.nn.functional as F\nfrom torch.autograd import Function\n\n\nclass Decomposition(nn.Module):\n    def __init__(self,\n                 input_length=[],\n                 pred_length=[],\n                 wavelet_name=[],\n                 level=[],\n                 batch_size=[],\n                 channel=[],\n                 d_model=[],\n                 tfactor=[],\n                 dfactor=[],\n                 device=[],\n                 no_decomposition=[],\n                 use_amp=[]):\n        super(Decomposition, self).__init__()\n        self.input_length = input_length\n        self.pred_length = pred_length\n        self.wavelet_name = wavelet_name\n        self.level = level\n        self.batch_size = batch_size\n        self.channel = channel\n        self.d_model = d_model\n        self.device = device\n        self.no_decomposition = no_decomposition\n        self.use_amp = use_amp\n        self.eps = 1e-5\n\n        self.dwt = DWT1DForward(wave=self.wavelet_name, J=self.level,\n                                use_amp=self.use_amp).cuda() if self.device.type == 'cuda' else DWT1DForward(\n            wave=self.wavelet_name, J=self.level, use_amp=self.use_amp)\n        self.idwt = DWT1DInverse(wave=self.wavelet_name,\n                                 use_amp=self.use_amp).cuda() if self.device.type == 'cuda' else DWT1DInverse(\n            wave=self.wavelet_name, use_amp=self.use_amp)\n\n        self.input_w_dim = self._dummy_forward(self.input_length) if not self.no_decomposition else [\n            self.input_length]  # length of the input seq after decompose\n        self.pred_w_dim = self._dummy_forward(self.pred_length) if not self.no_decomposition else [\n            self.pred_length]  # required length of the pred seq after decom\n\n        self.tfactor = tfactor\n        self.dfactor = dfactor\n        #################################\n        self.affine = False\n        #################################\n\n        if self.affine:\n            self._init_params()\n\n    def transform(self, x):\n        # input: x shape: batch, channel, seq\n        if not self.no_decomposition:\n            yl, yh = self._wavelet_decompose(x)\n        else:\n            yl, yh = x, []  # no decompose: returning the same value in yl\n        return yl, yh\n\n    def inv_transform(self, yl, yh):\n        if not self.no_decomposition:\n            x = self._wavelet_reverse_decompose(yl, yh)\n        else:\n            x = yl  # no decompose: returning the same value in x\n        return x\n\n    def _dummy_forward(self, input_length):\n        dummy_x = torch.ones((self.batch_size, self.channel, input_length)).to(self.device)\n        yl, yh = self.dwt(dummy_x)\n        l = []\n        l.append(yl.shape[-1])\n        for i in range(len(yh)):\n            l.append(yh[i].shape[-1])\n        return l\n\n    def _init_params(self):\n        self.affine_weight = nn.Parameter(torch.ones((self.level + 1, self.channel)))\n        self.affine_bias = nn.Parameter(torch.zeros((self.level + 1, self.channel)))\n\n    def _wavelet_decompose(self, x):\n        # input: x shape: batch, channel, seq\n        yl, yh = self.dwt(x)\n\n        if self.affine:\n            yl = yl.transpose(1, 2)  # batch, seq, channel\n            yl = yl * self.affine_weight[0]\n            yl = yl + self.affine_bias[0]\n            yl = yl.transpose(1, 2)  # batch, channel, seq\n            for i in range(self.level):\n                yh_ = yh[i].transpose(1, 2)  # batch, seq, channel\n                yh_ = yh_ * self.affine_weight[i + 1]\n                yh_ = yh_ + self.affine_bias[i + 1]\n                yh[i] = yh_.transpose(1, 2)  # batch, channel, seq\n\n        return yl, yh\n\n    def _wavelet_reverse_decompose(self, yl, yh):\n        if self.affine:\n            yl = yl.transpose(1, 2)  # batch, seq, channel\n            yl = yl - self.affine_bias[0]\n            yl = yl / (self.affine_weight[0] + self.eps)\n            yl = yl.transpose(1, 2)  # batch, channel, seq\n            for i in range(self.level):\n                yh_ = yh[i].transpose(1, 2)  # batch, seq, channel\n                yh_ = yh_ - self.affine_bias[i + 1]\n                yh_ = yh_ / (self.affine_weight[i + 1] + self.eps)\n                yh[i] = yh_.transpose(1, 2)  # batch, channel, seq\n\n        x = self.idwt((yl, yh))\n        return x  # shape: batch, channel, seq\n\n\n###############################################################################################\n\"\"\"\nFollowing codes are combined from https://github.com/fbcotter/pytorch_wavelets. \nTo use Wavelet decomposition, you do not need to modify any of the codes below this line,\nwe can just play with the class Decomposition(above)\n\"\"\"\n\n\n###############################################################################################\n\nclass DWT1DForward(nn.Module):\n    \"\"\" Performs a 1d DWT Forward decomposition of an image\n\n    Args:\n        J (int): Number of levels of decomposition\n        wave (str or pywt.Wavelet or tuple(ndarray)): Which wavelet to use.\n            Can be:\n            1) a string to pass to pywt.Wavelet constructor\n            2) a pywt.Wavelet class\n            3) a tuple of numpy arrays (h0, h1)\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. The\n            padding scheme\n        \"\"\"\n\n    def __init__(self, J=1, wave='db1', mode='zero', use_amp=False):\n        super().__init__()\n        self.use_amp = use_amp\n        if isinstance(wave, str):\n            wave = pywt.Wavelet(wave)\n        if isinstance(wave, pywt.Wavelet):\n            h0, h1 = wave.dec_lo, wave.dec_hi\n        else:\n            assert len(wave) == 2\n            h0, h1 = wave[0], wave[1]\n\n        # Prepare the filters - this makes them into column filters\n        filts = prep_filt_afb1d(h0, h1)\n        self.register_buffer('h0', filts[0])\n        self.register_buffer('h1', filts[1])\n        self.J = J\n        self.mode = mode\n\n    def forward(self, x):\n        \"\"\" Forward pass of the DWT.\n\n        Args:\n            x (tensor): Input of shape :math:`(N, C_{in}, L_{in})`\n\n        Returns:\n            (yl, yh)\n                tuple of lowpass (yl) and bandpass (yh) coefficients.\n                yh is a list of length J with the first entry\n                being the finest scale coefficients.\n        \"\"\"\n        assert x.ndim == 3, \"Can only handle 3d inputs (N, C, L)\"\n        highs = []\n        x0 = x\n        mode = mode_to_int(self.mode)\n\n        # Do a multilevel transform\n        for j in range(self.J):\n            x0, x1 = AFB1D.apply(x0, self.h0, self.h1, mode, self.use_amp)\n            highs.append(x1)\n\n        return x0, highs\n\n\nclass DWT1DInverse(nn.Module):\n    \"\"\" Performs a 1d DWT Inverse reconstruction of an image\n\n    Args:\n        wave (str or pywt.Wavelet or tuple(ndarray)): Which wavelet to use.\n            Can be:\n            1) a string to pass to pywt.Wavelet constructor\n            2) a pywt.Wavelet class\n            3) a tuple of numpy arrays (h0, h1)\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. The\n            padding scheme\n    \"\"\"\n\n    def __init__(self, wave='db1', mode='zero', use_amp=False):\n        super().__init__()\n        self.use_amp = use_amp\n        if isinstance(wave, str):\n            wave = pywt.Wavelet(wave)\n        if isinstance(wave, pywt.Wavelet):\n            g0, g1 = wave.rec_lo, wave.rec_hi\n        else:\n            assert len(wave) == 2\n            g0, g1 = wave[0], wave[1]\n\n        # Prepare the filters\n        filts = prep_filt_sfb1d(g0, g1)\n        self.register_buffer('g0', filts[0])\n        self.register_buffer('g1', filts[1])\n        self.mode = mode\n\n    def forward(self, coeffs):\n        \"\"\"\n        Args:\n            coeffs (yl, yh): tuple of lowpass and bandpass coefficients, should\n              match the format returned by DWT1DForward.\n\n        Returns:\n            Reconstructed input of shape :math:`(N, C_{in}, L_{in})`\n\n        Note:\n            Can have None for any of the highpass scales and will treat the\n            values as zeros (not in an efficient way though).\n        \"\"\"\n        x0, highs = coeffs\n        assert x0.ndim == 3, \"Can only handle 3d inputs (N, C, L)\"\n        mode = mode_to_int(self.mode)\n        # Do a multilevel inverse transform\n        for x1 in highs[::-1]:\n            if x1 is None:\n                x1 = torch.zeros_like(x0)\n\n            # 'Unpad' added signal\n            if x0.shape[-1] > x1.shape[-1]:\n                x0 = x0[..., :-1]\n            x0 = SFB1D.apply(x0, x1, self.g0, self.g1, mode, self.use_amp)\n        return x0\n\n\ndef roll(x, n, dim, make_even=False):\n    if n < 0:\n        n = x.shape[dim] + n\n\n    if make_even and x.shape[dim] % 2 == 1:\n        end = 1\n    else:\n        end = 0\n\n    if dim == 0:\n        return torch.cat((x[-n:], x[:-n + end]), dim=0)\n    elif dim == 1:\n        return torch.cat((x[:, -n:], x[:, :-n + end]), dim=1)\n    elif dim == 2 or dim == -2:\n        return torch.cat((x[:, :, -n:], x[:, :, :-n + end]), dim=2)\n    elif dim == 3 or dim == -1:\n        return torch.cat((x[:, :, :, -n:], x[:, :, :, :-n + end]), dim=3)\n\n\ndef mypad(x, pad, mode='constant', value=0):\n    \"\"\" Function to do numpy like padding on tensors. Only works for 2-D\n    padding.\n\n    Inputs:\n        x (tensor): tensor to pad\n        pad (tuple): tuple of (left, right, top, bottom) pad sizes\n        mode (str): 'symmetric', 'wrap', 'constant, 'reflect', 'replicate', or\n            'zero'. The padding technique.\n    \"\"\"\n    if mode == 'symmetric':\n        # Vertical only\n        if pad[0] == 0 and pad[1] == 0:\n            m1, m2 = pad[2], pad[3]\n            l = x.shape[-2]\n            xe = reflect(np.arange(-m1, l + m2, dtype='int32'), -0.5, l - 0.5)\n            return x[:, :, xe]\n        # horizontal only\n        elif pad[2] == 0 and pad[3] == 0:\n            m1, m2 = pad[0], pad[1]\n            l = x.shape[-1]\n            xe = reflect(np.arange(-m1, l + m2, dtype='int32'), -0.5, l - 0.5)\n            return x[:, :, :, xe]\n        # Both\n        else:\n            m1, m2 = pad[0], pad[1]\n            l1 = x.shape[-1]\n            xe_row = reflect(np.arange(-m1, l1 + m2, dtype='int32'), -0.5, l1 - 0.5)\n            m1, m2 = pad[2], pad[3]\n            l2 = x.shape[-2]\n            xe_col = reflect(np.arange(-m1, l2 + m2, dtype='int32'), -0.5, l2 - 0.5)\n            i = np.outer(xe_col, np.ones(xe_row.shape[0]))\n            j = np.outer(np.ones(xe_col.shape[0]), xe_row)\n            return x[:, :, i, j]\n    elif mode == 'periodic':\n        # Vertical only\n        if pad[0] == 0 and pad[1] == 0:\n            xe = np.arange(x.shape[-2])\n            xe = np.pad(xe, (pad[2], pad[3]), mode='wrap')\n            return x[:, :, xe]\n        # Horizontal only\n        elif pad[2] == 0 and pad[3] == 0:\n            xe = np.arange(x.shape[-1])\n            xe = np.pad(xe, (pad[0], pad[1]), mode='wrap')\n            return x[:, :, :, xe]\n        # Both\n        else:\n            xe_col = np.arange(x.shape[-2])\n            xe_col = np.pad(xe_col, (pad[2], pad[3]), mode='wrap')\n            xe_row = np.arange(x.shape[-1])\n            xe_row = np.pad(xe_row, (pad[0], pad[1]), mode='wrap')\n            i = np.outer(xe_col, np.ones(xe_row.shape[0]))\n            j = np.outer(np.ones(xe_col.shape[0]), xe_row)\n            return x[:, :, i, j]\n\n    elif mode == 'constant' or mode == 'reflect' or mode == 'replicate':\n        return F.pad(x, pad, mode, value)\n    elif mode == 'zero':\n        return F.pad(x, pad)\n    else:\n        raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n\ndef afb1d(x, h0, h1, use_amp, mode='zero', dim=-1):\n    \"\"\" 1D analysis filter bank (along one dimension only) of an image\n\n    Inputs:\n        x (tensor): 4D input with the last two dimensions the spatial input\n        h0 (tensor): 4D input for the lowpass filter. Should have shape (1, 1,\n            h, 1) or (1, 1, 1, w)\n        h1 (tensor): 4D input for the highpass filter. Should have shape (1, 1,\n            h, 1) or (1, 1, 1, w)\n        mode (str): padding method\n        dim (int) - dimension of filtering. d=2 is for a vertical filter (called\n            column filtering but filters across the rows). d=3 is for a\n            horizontal filter, (called row filtering but filters across the\n            columns).\n\n    Returns:\n        lohi: lowpass and highpass subbands concatenated along the channel\n            dimension\n    \"\"\"\n    C = x.shape[1]\n    # Convert the dim to positive\n    d = dim % 4\n    s = (2, 1) if d == 2 else (1, 2)\n    N = x.shape[d]\n    # If h0, h1 are not tensors, make them. If they are, then assume that they\n    # are in the right order\n    if not isinstance(h0, torch.Tensor):\n        h0 = torch.tensor(np.copy(np.array(h0).ravel()[::-1]),\n                          dtype=torch.float, device=x.device)\n    if not isinstance(h1, torch.Tensor):\n        h1 = torch.tensor(np.copy(np.array(h1).ravel()[::-1]),\n                          dtype=torch.float, device=x.device)\n    L = h0.numel()\n    L2 = L // 2\n    shape = [1, 1, 1, 1]\n    shape[d] = L\n    # If h aren't in the right shape, make them so\n    if h0.shape != tuple(shape):\n        h0 = h0.reshape(*shape)\n    if h1.shape != tuple(shape):\n        h1 = h1.reshape(*shape)\n    h = torch.cat([h0, h1] * C, dim=0)\n\n    if mode == 'per' or mode == 'periodization':\n        if x.shape[dim] % 2 == 1:\n            if d == 2:\n                x = torch.cat((x, x[:, :, -1:]), dim=2)\n            else:\n                x = torch.cat((x, x[:, :, :, -1:]), dim=3)\n            N += 1\n        x = roll(x, -L2, dim=d)\n        pad = (L - 1, 0) if d == 2 else (0, L - 1)\n        if use_amp:\n            with torch.cuda.amp.autocast():  # for mixed precision\n                lohi = F.conv2d(x, h, padding=pad, stride=s, groups=C)\n        else:\n            lohi = F.conv2d(x, h, padding=pad, stride=s, groups=C)\n        N2 = N // 2\n        if d == 2:\n            lohi[:, :, :L2] = lohi[:, :, :L2] + lohi[:, :, N2:N2 + L2]\n            lohi = lohi[:, :, :N2]\n        else:\n            lohi[:, :, :, :L2] = lohi[:, :, :, :L2] + lohi[:, :, :, N2:N2 + L2]\n            lohi = lohi[:, :, :, :N2]\n    else:\n        # Calculate the pad size\n        outsize = pywt.dwt_coeff_len(N, L, mode=mode)\n        p = 2 * (outsize - 1) - N + L\n        if mode == 'zero':\n            # Sadly, pytorch only allows for same padding before and after, if\n            # we need to do more padding after for odd length signals, have to\n            # prepad\n            if p % 2 == 1:\n                pad = (0, 0, 0, 1) if d == 2 else (0, 1, 0, 0)\n                x = F.pad(x, pad)\n            pad = (p // 2, 0) if d == 2 else (0, p // 2)\n            # Calculate the high and lowpass\n            if use_amp:\n                with torch.cuda.amp.autocast():\n                    lohi = F.conv2d(x, h, padding=pad, stride=s, groups=C)\n            else:\n                lohi = F.conv2d(x, h, padding=pad, stride=s, groups=C)\n        elif mode == 'symmetric' or mode == 'reflect' or mode == 'periodic':\n            pad = (0, 0, p // 2, (p + 1) // 2) if d == 2 else (p // 2, (p + 1) // 2, 0, 0)\n            x = mypad(x, pad=pad, mode=mode)\n            if use_amp:\n                with torch.cuda.amp.autocast():\n                    lohi = F.conv2d(x, h, stride=s, groups=C)\n            else:\n                lohi = F.conv2d(x, h, stride=s, groups=C)\n        else:\n            raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n    return lohi\n\n\ndef afb1d_atrous(x, h0, h1, mode='periodic', dim=-1, dilation=1):\n    \"\"\" 1D analysis filter bank (along one dimension only) of an image without\n    downsampling. Does the a trous algorithm.\n\n    Inputs:\n        x (tensor): 4D input with the last two dimensions the spatial input\n        h0 (tensor): 4D input for the lowpass filter. Should have shape (1, 1,\n            h, 1) or (1, 1, 1, w)\n        h1 (tensor): 4D input for the highpass filter. Should have shape (1, 1,\n            h, 1) or (1, 1, 1, w)\n        mode (str): padding method\n        dim (int) - dimension of filtering. d=2 is for a vertical filter (called\n            column filtering but filters across the rows). d=3 is for a\n            horizontal filter, (called row filtering but filters across the\n            columns).\n        dilation (int): dilation factor. Should be a power of 2.\n\n    Returns:\n        lohi: lowpass and highpass subbands concatenated along the channel\n            dimension\n    \"\"\"\n    C = x.shape[1]\n    # Convert the dim to positive\n    d = dim % 4\n    # If h0, h1 are not tensors, make them. If they are, then assume that they\n    # are in the right order\n    if not isinstance(h0, torch.Tensor):\n        h0 = torch.tensor(np.copy(np.array(h0).ravel()[::-1]),\n                          dtype=torch.float, device=x.device)\n    if not isinstance(h1, torch.Tensor):\n        h1 = torch.tensor(np.copy(np.array(h1).ravel()[::-1]),\n                          dtype=torch.float, device=x.device)\n    L = h0.numel()\n    shape = [1, 1, 1, 1]\n    shape[d] = L\n    # If h aren't in the right shape, make them so\n    if h0.shape != tuple(shape):\n        h0 = h0.reshape(*shape)\n    if h1.shape != tuple(shape):\n        h1 = h1.reshape(*shape)\n    h = torch.cat([h0, h1] * C, dim=0)\n\n    # Calculate the pad size\n    L2 = (L * dilation) // 2\n    pad = (0, 0, L2 - dilation, L2) if d == 2 else (L2 - dilation, L2, 0, 0)\n    x = mypad(x, pad=pad, mode=mode)\n    lohi = F.conv2d(x, h, groups=C, dilation=dilation)\n\n    return lohi\n\n\ndef sfb1d(lo, hi, g0, g1, use_amp, mode='zero', dim=-1):\n    \"\"\" 1D synthesis filter bank of an image tensor\n    \"\"\"\n    C = lo.shape[1]\n    d = dim % 4\n    # If g0, g1 are not tensors, make them. If they are, then assume that they\n    # are in the right order\n    if not isinstance(g0, torch.Tensor):\n        g0 = torch.tensor(np.copy(np.array(g0).ravel()),\n                          dtype=torch.float, device=lo.device)\n    if not isinstance(g1, torch.Tensor):\n        g1 = torch.tensor(np.copy(np.array(g1).ravel()),\n                          dtype=torch.float, device=lo.device)\n    L = g0.numel()\n    shape = [1, 1, 1, 1]\n    shape[d] = L\n    N = 2 * lo.shape[d]\n    # If g aren't in the right shape, make them so\n    if g0.shape != tuple(shape):\n        g0 = g0.reshape(*shape)\n    if g1.shape != tuple(shape):\n        g1 = g1.reshape(*shape)\n\n    s = (2, 1) if d == 2 else (1, 2)\n    g0 = torch.cat([g0] * C, dim=0)\n    g1 = torch.cat([g1] * C, dim=0)\n    if mode == 'per' or mode == 'periodization':\n        if use_amp:\n            with torch.cuda.amp.autocast():\n                y = F.conv_transpose2d(lo, g0, stride=s, groups=C) + \\\n                    F.conv_transpose2d(hi, g1, stride=s, groups=C)\n        else:\n            y = F.conv_transpose2d(lo, g0, stride=s, groups=C) + \\\n                F.conv_transpose2d(hi, g1, stride=s, groups=C)\n        if d == 2:\n            y[:, :, :L - 2] = y[:, :, :L - 2] + y[:, :, N:N + L - 2]\n            y = y[:, :, :N]\n        else:\n            y[:, :, :, :L - 2] = y[:, :, :, :L - 2] + y[:, :, :, N:N + L - 2]\n            y = y[:, :, :, :N]\n        y = roll(y, 1 - L // 2, dim=dim)\n    else:\n        if mode == 'zero' or mode == 'symmetric' or mode == 'reflect' or \\\n                mode == 'periodic':\n            pad = (L - 2, 0) if d == 2 else (0, L - 2)\n            if use_amp:\n                with torch.cuda.amp.autocast():\n                    y = F.conv_transpose2d(lo, g0, stride=s, padding=pad, groups=C) + \\\n                        F.conv_transpose2d(hi, g1, stride=s, padding=pad, groups=C)\n            else:\n                y = F.conv_transpose2d(lo, g0, stride=s, padding=pad, groups=C) + \\\n                    F.conv_transpose2d(hi, g1, stride=s, padding=pad, groups=C)\n        else:\n            raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n    return y\n\n\ndef mode_to_int(mode):\n    if mode == 'zero':\n        return 0\n    elif mode == 'symmetric':\n        return 1\n    elif mode == 'per' or mode == 'periodization':\n        return 2\n    elif mode == 'constant':\n        return 3\n    elif mode == 'reflect':\n        return 4\n    elif mode == 'replicate':\n        return 5\n    elif mode == 'periodic':\n        return 6\n    else:\n        raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n\ndef int_to_mode(mode):\n    if mode == 0:\n        return 'zero'\n    elif mode == 1:\n        return 'symmetric'\n    elif mode == 2:\n        return 'periodization'\n    elif mode == 3:\n        return 'constant'\n    elif mode == 4:\n        return 'reflect'\n    elif mode == 5:\n        return 'replicate'\n    elif mode == 6:\n        return 'periodic'\n    else:\n        raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n\nclass AFB2D(Function):\n    \"\"\" Does a single level 2d wavelet decomposition of an input. Does separate\n    row and column filtering by two calls to\n    :py:func:`pytorch_wavelets.dwt.lowlevel.afb1d`\n\n    Needs to have the tensors in the right form. Because this function defines\n    its own backward pass, saves on memory by not having to save the input\n    tensors.\n\n    Inputs:\n        x (torch.Tensor): Input to decompose\n        h0_row: row lowpass\n        h1_row: row highpass\n        h0_col: col lowpass\n        h1_col: col highpass\n        mode (int): use mode_to_int to get the int code here\n\n    We encode the mode as an integer rather than a string as gradcheck causes an\n    error when a string is provided.\n\n    Returns:\n        y: Tensor of shape (N, C*4, H, W)\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, x, h0_row, h1_row, h0_col, h1_col, mode):\n        ctx.save_for_backward(h0_row, h1_row, h0_col, h1_col)\n        ctx.shape = x.shape[-2:]\n        mode = int_to_mode(mode)\n        ctx.mode = mode\n        lohi = afb1d(x, h0_row, h1_row, mode=mode, dim=3)\n        y = afb1d(lohi, h0_col, h1_col, mode=mode, dim=2)\n        s = y.shape\n        y = y.reshape(s[0], -1, 4, s[-2], s[-1])\n        low = y[:, :, 0].contiguous()\n        highs = y[:, :, 1:].contiguous()\n        return low, highs\n\n    @staticmethod\n    def backward(ctx, low, highs):\n        dx = None\n        if ctx.needs_input_grad[0]:\n            mode = ctx.mode\n            h0_row, h1_row, h0_col, h1_col = ctx.saved_tensors\n            lh, hl, hh = torch.unbind(highs, dim=2)\n            lo = sfb1d(low, lh, h0_col, h1_col, mode=mode, dim=2)\n            hi = sfb1d(hl, hh, h0_col, h1_col, mode=mode, dim=2)\n            dx = sfb1d(lo, hi, h0_row, h1_row, mode=mode, dim=3)\n            if dx.shape[-2] > ctx.shape[-2] and dx.shape[-1] > ctx.shape[-1]:\n                dx = dx[:, :, :ctx.shape[-2], :ctx.shape[-1]]\n            elif dx.shape[-2] > ctx.shape[-2]:\n                dx = dx[:, :, :ctx.shape[-2]]\n            elif dx.shape[-1] > ctx.shape[-1]:\n                dx = dx[:, :, :, :ctx.shape[-1]]\n        return dx, None, None, None, None, None\n\n\nclass AFB1D(Function):\n    \"\"\" Does a single level 1d wavelet decomposition of an input.\n\n    Needs to have the tensors in the right form. Because this function defines\n    its own backward pass, saves on memory by not having to save the input\n    tensors.\n\n    Inputs:\n        x (torch.Tensor): Input to decompose\n        h0: lowpass\n        h1: highpass\n        mode (int): use mode_to_int to get the int code here\n\n    We encode the mode as an integer rather than a string as gradcheck causes an\n    error when a string is provided.\n\n    Returns:\n        x0: Tensor of shape (N, C, L') - lowpass\n        x1: Tensor of shape (N, C, L') - highpass\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, x, h0, h1, mode, use_amp):\n        mode = int_to_mode(mode)\n\n        # Make inputs 4d\n        x = x[:, :, None, :]\n        h0 = h0[:, :, None, :]\n        h1 = h1[:, :, None, :]\n\n        # Save for backwards\n        ctx.save_for_backward(h0, h1)\n        ctx.shape = x.shape[3]\n        ctx.mode = mode\n        ctx.use_amp = use_amp\n\n        lohi = afb1d(x, h0, h1, use_amp, mode=mode, dim=3)\n        x0 = lohi[:, ::2, 0].contiguous()\n        x1 = lohi[:, 1::2, 0].contiguous()\n        return x0, x1\n\n    @staticmethod\n    def backward(ctx, dx0, dx1):\n        dx = None\n        if ctx.needs_input_grad[0]:\n            mode = ctx.mode\n            h0, h1 = ctx.saved_tensors\n            use_amp = ctx.use_amp\n\n            # Make grads 4d\n            dx0 = dx0[:, :, None, :]\n            dx1 = dx1[:, :, None, :]\n\n            dx = sfb1d(dx0, dx1, h0, h1, use_amp, mode=mode, dim=3)[:, :, 0]\n\n            # Check for odd input\n            if dx.shape[2] > ctx.shape:\n                dx = dx[:, :, :ctx.shape]\n\n        return dx, None, None, None, None, None\n\n\ndef afb2d(x, filts, mode='zero'):\n    \"\"\" Does a single level 2d wavelet decomposition of an input. Does separate\n    row and column filtering by two calls to\n    :py:func:`pytorch_wavelets.dwt.lowlevel.afb1d`\n\n    Inputs:\n        x (torch.Tensor): Input to decompose\n        filts (list of ndarray or torch.Tensor): If a list of tensors has been\n            given, this function assumes they are in the right form (the form\n            returned by\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_afb2d`).\n            Otherwise, this function will prepare the filters to be of the right\n            form by calling\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_afb2d`.\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. Which\n            padding to use. If periodization, the output size will be half the\n            input size.  Otherwise, the output size will be slightly larger than\n            half.\n\n    Returns:\n        y: Tensor of shape (N, C*4, H, W)\n    \"\"\"\n    tensorize = [not isinstance(f, torch.Tensor) for f in filts]\n    if len(filts) == 2:\n        h0, h1 = filts\n        if True in tensorize:\n            h0_col, h1_col, h0_row, h1_row = prep_filt_afb2d(\n                h0, h1, device=x.device)\n        else:\n            h0_col = h0\n            h0_row = h0.transpose(2, 3)\n            h1_col = h1\n            h1_row = h1.transpose(2, 3)\n    elif len(filts) == 4:\n        if True in tensorize:\n            h0_col, h1_col, h0_row, h1_row = prep_filt_afb2d(\n                *filts, device=x.device)\n        else:\n            h0_col, h1_col, h0_row, h1_row = filts\n    else:\n        raise ValueError(\"Unknown form for input filts\")\n\n    lohi = afb1d(x, h0_row, h1_row, mode=mode, dim=3)\n    y = afb1d(lohi, h0_col, h1_col, mode=mode, dim=2)\n\n    return y\n\n\ndef afb2d_atrous(x, filts, mode='periodization', dilation=1):\n    \"\"\" Does a single level 2d wavelet decomposition of an input. Does separate\n    row and column filtering by two calls to\n    :py:func:`pytorch_wavelets.dwt.lowlevel.afb1d`\n\n    Inputs:\n        x (torch.Tensor): Input to decompose\n        filts (list of ndarray or torch.Tensor): If a list of tensors has been\n            given, this function assumes they are in the right form (the form\n            returned by\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_afb2d`).\n            Otherwise, this function will prepare the filters to be of the right\n            form by calling\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_afb2d`.\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. Which\n            padding to use. If periodization, the output size will be half the\n            input size.  Otherwise, the output size will be slightly larger than\n            half.\n        dilation (int): dilation factor for the filters. Should be 2**level\n\n    Returns:\n        y: Tensor of shape (N, C, 4, H, W)\n    \"\"\"\n    tensorize = [not isinstance(f, torch.Tensor) for f in filts]\n    if len(filts) == 2:\n        h0, h1 = filts\n        if True in tensorize:\n            h0_col, h1_col, h0_row, h1_row = prep_filt_afb2d(\n                h0, h1, device=x.device)\n        else:\n            h0_col = h0\n            h0_row = h0.transpose(2, 3)\n            h1_col = h1\n            h1_row = h1.transpose(2, 3)\n    elif len(filts) == 4:\n        if True in tensorize:\n            h0_col, h1_col, h0_row, h1_row = prep_filt_afb2d(\n                *filts, device=x.device)\n        else:\n            h0_col, h1_col, h0_row, h1_row = filts\n    else:\n        raise ValueError(\"Unknown form for input filts\")\n\n    lohi = afb1d_atrous(x, h0_row, h1_row, mode=mode, dim=3, dilation=dilation)\n    y = afb1d_atrous(lohi, h0_col, h1_col, mode=mode, dim=2, dilation=dilation)\n\n    return y\n\n\ndef afb2d_nonsep(x, filts, mode='zero'):\n    \"\"\" Does a 1 level 2d wavelet decomposition of an input. Doesn't do separate\n    row and column filtering.\n\n    Inputs:\n        x (torch.Tensor): Input to decompose\n        filts (list or torch.Tensor): If a list is given, should be the low and\n            highpass filter banks. If a tensor is given, it should be of the\n            form created by\n            :py:func:`pytorch_wavelets.dwt.lowlevel.prep_filt_afb2d_nonsep`\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. Which\n            padding to use. If periodization, the output size will be half the\n            input size.  Otherwise, the output size will be slightly larger than\n            half.\n\n    Returns:\n        y: Tensor of shape (N, C, 4, H, W)\n    \"\"\"\n    C = x.shape[1]\n    Ny = x.shape[2]\n    Nx = x.shape[3]\n\n    # Check the filter inputs\n    if isinstance(filts, (tuple, list)):\n        if len(filts) == 2:\n            filts = prep_filt_afb2d_nonsep(filts[0], filts[1], device=x.device)\n        else:\n            filts = prep_filt_afb2d_nonsep(\n                filts[0], filts[1], filts[2], filts[3], device=x.device)\n    f = torch.cat([filts] * C, dim=0)\n    Ly = f.shape[2]\n    Lx = f.shape[3]\n\n    if mode == 'periodization' or mode == 'per':\n        if x.shape[2] % 2 == 1:\n            x = torch.cat((x, x[:, :, -1:]), dim=2)\n            Ny += 1\n        if x.shape[3] % 2 == 1:\n            x = torch.cat((x, x[:, :, :, -1:]), dim=3)\n            Nx += 1\n        pad = (Ly - 1, Lx - 1)\n        stride = (2, 2)\n        x = roll(roll(x, -Ly // 2, dim=2), -Lx // 2, dim=3)\n        y = F.conv2d(x, f, padding=pad, stride=stride, groups=C)\n        y[:, :, :Ly // 2] += y[:, :, Ny // 2:Ny // 2 + Ly // 2]\n        y[:, :, :, :Lx // 2] += y[:, :, :, Nx // 2:Nx // 2 + Lx // 2]\n        y = y[:, :, :Ny // 2, :Nx // 2]\n    elif mode == 'zero' or mode == 'symmetric' or mode == 'reflect':\n        # Calculate the pad size\n        out1 = pywt.dwt_coeff_len(Ny, Ly, mode=mode)\n        out2 = pywt.dwt_coeff_len(Nx, Lx, mode=mode)\n        p1 = 2 * (out1 - 1) - Ny + Ly\n        p2 = 2 * (out2 - 1) - Nx + Lx\n        if mode == 'zero':\n            # Sadly, pytorch only allows for same padding before and after, if\n            # we need to do more padding after for odd length signals, have to\n            # prepad\n            if p1 % 2 == 1 and p2 % 2 == 1:\n                x = F.pad(x, (0, 1, 0, 1))\n            elif p1 % 2 == 1:\n                x = F.pad(x, (0, 0, 0, 1))\n            elif p2 % 2 == 1:\n                x = F.pad(x, (0, 1, 0, 0))\n            # Calculate the high and lowpass\n            y = F.conv2d(\n                x, f, padding=(p1 // 2, p2 // 2), stride=2, groups=C)\n        elif mode == 'symmetric' or mode == 'reflect' or mode == 'periodic':\n            pad = (p2 // 2, (p2 + 1) // 2, p1 // 2, (p1 + 1) // 2)\n            x = mypad(x, pad=pad, mode=mode)\n            y = F.conv2d(x, f, stride=2, groups=C)\n    else:\n        raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n    return y\n\n\ndef sfb2d(ll, lh, hl, hh, filts, mode='zero'):\n    \"\"\" Does a single level 2d wavelet reconstruction of wavelet coefficients.\n    Does separate row and column filtering by two calls to\n    :py:func:`pytorch_wavelets.dwt.lowlevel.sfb1d`\n\n    Inputs:\n        ll (torch.Tensor): lowpass coefficients\n        lh (torch.Tensor): horizontal coefficients\n        hl (torch.Tensor): vertical coefficients\n        hh (torch.Tensor): diagonal coefficients\n        filts (list of ndarray or torch.Tensor): If a list of tensors has been\n            given, this function assumes they are in the right form (the form\n            returned by\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_sfb2d`).\n            Otherwise, this function will prepare the filters to be of the right\n            form by calling\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_sfb2d`.\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. Which\n            padding to use. If periodization, the output size will be half the\n            input size.  Otherwise, the output size will be slightly larger than\n            half.\n    \"\"\"\n    tensorize = [not isinstance(x, torch.Tensor) for x in filts]\n    if len(filts) == 2:\n        g0, g1 = filts\n        if True in tensorize:\n            g0_col, g1_col, g0_row, g1_row = prep_filt_sfb2d(g0, g1)\n        else:\n            g0_col = g0\n            g0_row = g0.transpose(2, 3)\n            g1_col = g1\n            g1_row = g1.transpose(2, 3)\n    elif len(filts) == 4:\n        if True in tensorize:\n            g0_col, g1_col, g0_row, g1_row = prep_filt_sfb2d(*filts)\n        else:\n            g0_col, g1_col, g0_row, g1_row = filts\n    else:\n        raise ValueError(\"Unknown form for input filts\")\n\n    lo = sfb1d(ll, lh, g0_col, g1_col, mode=mode, dim=2)\n    hi = sfb1d(hl, hh, g0_col, g1_col, mode=mode, dim=2)\n    y = sfb1d(lo, hi, g0_row, g1_row, mode=mode, dim=3)\n\n    return y\n\n\nclass SFB2D(Function):\n    \"\"\" Does a single level 2d wavelet decomposition of an input. Does separate\n    row and column filtering by two calls to\n    :py:func:`pytorch_wavelets.dwt.lowlevel.afb1d`\n\n    Needs to have the tensors in the right form. Because this function defines\n    its own backward pass, saves on memory by not having to save the input\n    tensors.\n\n    Inputs:\n        x (torch.Tensor): Input to decompose\n        h0_row: row lowpass\n        h1_row: row highpass\n        h0_col: col lowpass\n        h1_col: col highpass\n        mode (int): use mode_to_int to get the int code here\n\n    We encode the mode as an integer rather than a string as gradcheck causes an\n    error when a string is provided.\n\n    Returns:\n        y: Tensor of shape (N, C*4, H, W)\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, low, highs, g0_row, g1_row, g0_col, g1_col, mode):\n        mode = int_to_mode(mode)\n        ctx.mode = mode\n        ctx.save_for_backward(g0_row, g1_row, g0_col, g1_col)\n\n        lh, hl, hh = torch.unbind(highs, dim=2)\n        lo = sfb1d(low, lh, g0_col, g1_col, mode=mode, dim=2)\n        hi = sfb1d(hl, hh, g0_col, g1_col, mode=mode, dim=2)\n        y = sfb1d(lo, hi, g0_row, g1_row, mode=mode, dim=3)\n        return y\n\n    @staticmethod\n    def backward(ctx, dy):\n        dlow, dhigh = None, None\n        if ctx.needs_input_grad[0]:\n            mode = ctx.mode\n            g0_row, g1_row, g0_col, g1_col = ctx.saved_tensors\n            dx = afb1d(dy, g0_row, g1_row, mode=mode, dim=3)\n            dx = afb1d(dx, g0_col, g1_col, mode=mode, dim=2)\n            s = dx.shape\n            dx = dx.reshape(s[0], -1, 4, s[-2], s[-1])\n            dlow = dx[:, :, 0].contiguous()\n            dhigh = dx[:, :, 1:].contiguous()\n        return dlow, dhigh, None, None, None, None, None\n\n\nclass SFB1D(Function):\n    \"\"\" Does a single level 1d wavelet decomposition of an input.\n\n    Needs to have the tensors in the right form. Because this function defines\n    its own backward pass, saves on memory by not having to save the input\n    tensors.\n\n    Inputs:\n        low (torch.Tensor): Lowpass to reconstruct of shape (N, C, L)\n        high (torch.Tensor): Highpass to reconstruct of shape (N, C, L)\n        g0: lowpass\n        g1: highpass\n        mode (int): use mode_to_int to get the int code here\n\n    We encode the mode as an integer rather than a string as gradcheck causes an\n    error when a string is provided.\n\n    Returns:\n        y: Tensor of shape (N, C*2, L')\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, low, high, g0, g1, mode, use_amp):\n        mode = int_to_mode(mode)\n        # Make into a 2d tensor with 1 row\n        low = low[:, :, None, :]\n        high = high[:, :, None, :]\n        g0 = g0[:, :, None, :]\n        g1 = g1[:, :, None, :]\n\n        ctx.mode = mode\n        ctx.save_for_backward(g0, g1)\n        ctx.use_amp = use_amp\n\n        return sfb1d(low, high, g0, g1, use_amp, mode=mode, dim=3)[:, :, 0]\n\n    @staticmethod\n    def backward(ctx, dy):\n        dlow, dhigh = None, None\n        if ctx.needs_input_grad[0]:\n            mode = ctx.mode\n            use_amp = ctx.use_amp\n            g0, g1, = ctx.saved_tensors\n            dy = dy[:, :, None, :]\n\n            dx = afb1d(dy, g0, g1, use_amp, mode=mode, dim=3)\n\n            dlow = dx[:, ::2, 0].contiguous()\n            dhigh = dx[:, 1::2, 0].contiguous()\n        return dlow, dhigh, None, None, None, None, None\n\n\ndef sfb2d_nonsep(coeffs, filts, mode='zero'):\n    \"\"\" Does a single level 2d wavelet reconstruction of wavelet coefficients.\n    Does not do separable filtering.\n\n    Inputs:\n        coeffs (torch.Tensor): tensor of coefficients of shape (N, C, 4, H, W)\n            where the third dimension indexes across the (ll, lh, hl, hh) bands.\n        filts (list of ndarray or torch.Tensor): If a list of tensors has been\n            given, this function assumes they are in the right form (the form\n            returned by\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_sfb2d_nonsep`).\n            Otherwise, this function will prepare the filters to be of the right\n            form by calling\n            :py:func:`~pytorch_wavelets.dwt.lowlevel.prep_filt_sfb2d_nonsep`.\n        mode (str): 'zero', 'symmetric', 'reflect' or 'periodization'. Which\n            padding to use. If periodization, the output size will be half the\n            input size.  Otherwise, the output size will be slightly larger than\n            half.\n    \"\"\"\n    C = coeffs.shape[1]\n    Ny = coeffs.shape[-2]\n    Nx = coeffs.shape[-1]\n\n    # Check the filter inputs - should be in the form of a torch tensor, but if\n    # not, tensorize it here.\n    if isinstance(filts, (tuple, list)):\n        if len(filts) == 2:\n            filts = prep_filt_sfb2d_nonsep(filts[0], filts[1],\n                                           device=coeffs.device)\n        elif len(filts) == 4:\n            filts = prep_filt_sfb2d_nonsep(\n                filts[0], filts[1], filts[2], filts[3], device=coeffs.device)\n        else:\n            raise ValueError(\"Unkown form for input filts\")\n    f = torch.cat([filts] * C, dim=0)\n    Ly = f.shape[2]\n    Lx = f.shape[3]\n\n    x = coeffs.reshape(coeffs.shape[0], -1, coeffs.shape[-2], coeffs.shape[-1])\n    if mode == 'periodization' or mode == 'per':\n        ll = F.conv_transpose2d(x, f, groups=C, stride=2)\n        ll[:, :, :Ly - 2] += ll[:, :, 2 * Ny:2 * Ny + Ly - 2]\n        ll[:, :, :, :Lx - 2] += ll[:, :, :, 2 * Nx:2 * Nx + Lx - 2]\n        ll = ll[:, :, :2 * Ny, :2 * Nx]\n        ll = roll(roll(ll, 1 - Ly // 2, dim=2), 1 - Lx // 2, dim=3)\n    elif mode == 'symmetric' or mode == 'zero' or mode == 'reflect' or \\\n            mode == 'periodic':\n        pad = (Ly - 2, Lx - 2)\n        ll = F.conv_transpose2d(x, f, padding=pad, groups=C, stride=2)\n    else:\n        raise ValueError(\"Unkown pad type: {}\".format(mode))\n\n    return ll.contiguous()\n\n\ndef prep_filt_afb2d_nonsep(h0_col, h1_col, h0_row=None, h1_row=None,\n                           device=None):\n    \"\"\"\n    Prepares the filters to be of the right form for the afb2d_nonsep function.\n    In particular, makes 2d point spread functions, and mirror images them in\n    preparation to do torch.conv2d.\n\n    Inputs:\n        h0_col (array-like): low pass column filter bank\n        h1_col (array-like): high pass column filter bank\n        h0_row (array-like): low pass row filter bank. If none, will assume the\n            same as column filter\n        h1_row (array-like): high pass row filter bank. If none, will assume the\n            same as column filter\n        device: which device to put the tensors on to\n\n    Returns:\n        filts: (4, 1, h, w) tensor ready to get the four subbands\n    \"\"\"\n    h0_col = np.array(h0_col).ravel()\n    h1_col = np.array(h1_col).ravel()\n    if h0_row is None:\n        h0_row = h0_col\n    if h1_row is None:\n        h1_row = h1_col\n    ll = np.outer(h0_col, h0_row)\n    lh = np.outer(h1_col, h0_row)\n    hl = np.outer(h0_col, h1_row)\n    hh = np.outer(h1_col, h1_row)\n    filts = np.stack([ll[None, ::-1, ::-1], lh[None, ::-1, ::-1],\n                      hl[None, ::-1, ::-1], hh[None, ::-1, ::-1]], axis=0)\n    filts = torch.tensor(filts, dtype=torch.get_default_dtype(), device=device)\n    return filts\n\n\ndef prep_filt_sfb2d_nonsep(g0_col, g1_col, g0_row=None, g1_row=None,\n                           device=None):\n    \"\"\"\n    Prepares the filters to be of the right form for the sfb2d_nonsep function.\n    In particular, makes 2d point spread functions. Does not mirror image them\n    as sfb2d_nonsep uses conv2d_transpose which acts like normal convolution.\n\n    Inputs:\n        g0_col (array-like): low pass column filter bank\n        g1_col (array-like): high pass column filter bank\n        g0_row (array-like): low pass row filter bank. If none, will assume the\n            same as column filter\n        g1_row (array-like): high pass row filter bank. If none, will assume the\n            same as column filter\n        device: which device to put the tensors on to\n\n    Returns:\n        filts: (4, 1, h, w) tensor ready to combine the four subbands\n    \"\"\"\n    g0_col = np.array(g0_col).ravel()\n    g1_col = np.array(g1_col).ravel()\n    if g0_row is None:\n        g0_row = g0_col\n    if g1_row is None:\n        g1_row = g1_col\n    ll = np.outer(g0_col, g0_row)\n    lh = np.outer(g1_col, g0_row)\n    hl = np.outer(g0_col, g1_row)\n    hh = np.outer(g1_col, g1_row)\n    filts = np.stack([ll[None], lh[None], hl[None], hh[None]], axis=0)\n    filts = torch.tensor(filts, dtype=torch.get_default_dtype(), device=device)\n    return filts\n\n\ndef prep_filt_sfb2d(g0_col, g1_col, g0_row=None, g1_row=None, device=None):\n    \"\"\"\n    Prepares the filters to be of the right form for the sfb2d function.  In\n    particular, makes the tensors the right shape. It does not mirror image them\n    as as sfb2d uses conv2d_transpose which acts like normal convolution.\n\n    Inputs:\n        g0_col (array-like): low pass column filter bank\n        g1_col (array-like): high pass column filter bank\n        g0_row (array-like): low pass row filter bank. If none, will assume the\n            same as column filter\n        g1_row (array-like): high pass row filter bank. If none, will assume the\n            same as column filter\n        device: which device to put the tensors on to\n\n    Returns:\n        (g0_col, g1_col, g0_row, g1_row)\n    \"\"\"\n    g0_col, g1_col = prep_filt_sfb1d(g0_col, g1_col, device)\n    if g0_row is None:\n        g0_row, g1_row = g0_col, g1_col\n    else:\n        g0_row, g1_row = prep_filt_sfb1d(g0_row, g1_row, device)\n\n    g0_col = g0_col.reshape((1, 1, -1, 1))\n    g1_col = g1_col.reshape((1, 1, -1, 1))\n    g0_row = g0_row.reshape((1, 1, 1, -1))\n    g1_row = g1_row.reshape((1, 1, 1, -1))\n\n    return g0_col, g1_col, g0_row, g1_row\n\n\ndef prep_filt_sfb1d(g0, g1, device=None):\n    \"\"\"\n    Prepares the filters to be of the right form for the sfb1d function. In\n    particular, makes the tensors the right shape. It does not mirror image them\n    as as sfb2d uses conv2d_transpose which acts like normal convolution.\n\n    Inputs:\n        g0 (array-like): low pass filter bank\n        g1 (array-like): high pass filter bank\n        device: which device to put the tensors on to\n\n    Returns:\n        (g0, g1)\n    \"\"\"\n    g0 = np.array(g0).ravel()\n    g1 = np.array(g1).ravel()\n    t = torch.get_default_dtype()\n    g0 = torch.tensor(g0, device=device, dtype=t).reshape((1, 1, -1))\n    g1 = torch.tensor(g1, device=device, dtype=t).reshape((1, 1, -1))\n\n    return g0, g1\n\n\ndef prep_filt_afb2d(h0_col, h1_col, h0_row=None, h1_row=None, device=None):\n    \"\"\"\n    Prepares the filters to be of the right form for the afb2d function.  In\n    particular, makes the tensors the right shape. It takes mirror images of\n    them as as afb2d uses conv2d which acts like normal correlation.\n\n    Inputs:\n        h0_col (array-like): low pass column filter bank\n        h1_col (array-like): high pass column filter bank\n        h0_row (array-like): low pass row filter bank. If none, will assume the\n            same as column filter\n        h1_row (array-like): high pass row filter bank. If none, will assume the\n            same as column filter\n        device: which device to put the tensors on to\n\n    Returns:\n        (h0_col, h1_col, h0_row, h1_row)\n    \"\"\"\n    h0_col, h1_col = prep_filt_afb1d(h0_col, h1_col, device)\n    if h0_row is None:\n        h0_row, h1_row = h0_col, h1_col\n    else:\n        h0_row, h1_row = prep_filt_afb1d(h0_row, h1_row, device)\n\n    h0_col = h0_col.reshape((1, 1, -1, 1))\n    h1_col = h1_col.reshape((1, 1, -1, 1))\n    h0_row = h0_row.reshape((1, 1, 1, -1))\n    h1_row = h1_row.reshape((1, 1, 1, -1))\n    return h0_col, h1_col, h0_row, h1_row\n\n\ndef prep_filt_afb1d(h0, h1, device=None):\n    \"\"\"\n    Prepares the filters to be of the right form for the afb2d function.  In\n    particular, makes the tensors the right shape. It takes mirror images of\n    them as as afb2d uses conv2d which acts like normal correlation.\n\n    Inputs:\n        h0 (array-like): low pass column filter bank\n        h1 (array-like): high pass column filter bank\n        device: which device to put the tensors on to\n\n    Returns:\n        (h0, h1)\n    \"\"\"\n    h0 = np.array(h0[::-1]).ravel()\n    h1 = np.array(h1[::-1]).ravel()\n    t = torch.get_default_dtype()\n    h0 = torch.tensor(h0, device=device, dtype=t).reshape((1, 1, -1))\n    h1 = torch.tensor(h1, device=device, dtype=t).reshape((1, 1, -1))\n    return h0, h1\n\n\ndef reflect(x, minx, maxx):\n    \"\"\"Reflect the values in matrix *x* about the scalar values *minx* and\n    *maxx*.  Hence a vector *x* containing a long linearly increasing series is\n    converted into a waveform which ramps linearly up and down between *minx*\n    and *maxx*.  If *x* contains integers and *minx* and *maxx* are (integers +\n    0.5), the ramps will have repeated max and min samples.\n\n    .. codeauthor:: Rich Wareham <rjw57@cantab.net>, Aug 2013\n    .. codeauthor:: Nick Kingsbury, Cambridge University, January 1999.\n\n    \"\"\"\n    x = np.asanyarray(x)\n    rng = maxx - minx\n    rng_by_2 = 2 * rng\n    mod = np.fmod(x - minx, rng_by_2)\n    normed_mod = np.where(mod < 0, mod + rng_by_2, mod)\n    out = np.where(normed_mod >= rng, rng_by_2 - normed_mod, normed_mod) + minx\n    return np.array(out, dtype=x.dtype)"
  },
  {
    "path": "layers/ETSformer_EncDec.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.fft as fft\nfrom einops import rearrange, reduce, repeat\nimport math, random\nfrom scipy.fftpack import next_fast_len\n\n\nclass Transform:\n    def __init__(self, sigma):\n        self.sigma = sigma\n\n    @torch.no_grad()\n    def transform(self, x):\n        return self.jitter(self.shift(self.scale(x)))\n\n    def jitter(self, x):\n        return x + (torch.randn(x.shape).to(x.device) * self.sigma)\n\n    def scale(self, x):\n        return x * (torch.randn(x.size(-1)).to(x.device) * self.sigma + 1)\n\n    def shift(self, x):\n        return x + (torch.randn(x.size(-1)).to(x.device) * self.sigma)\n\n\ndef conv1d_fft(f, g, dim=-1):\n    N = f.size(dim)\n    M = g.size(dim)\n\n    fast_len = next_fast_len(N + M - 1)\n\n    F_f = fft.rfft(f, fast_len, dim=dim)\n    F_g = fft.rfft(g, fast_len, dim=dim)\n\n    F_fg = F_f * F_g.conj()\n    out = fft.irfft(F_fg, fast_len, dim=dim)\n    out = out.roll((-1,), dims=(dim,))\n    idx = torch.as_tensor(range(fast_len - N, fast_len)).to(out.device)\n    out = out.index_select(dim, idx)\n\n    return out\n\n\nclass ExponentialSmoothing(nn.Module):\n\n    def __init__(self, dim, nhead, dropout=0.1, aux=False):\n        super().__init__()\n        self._smoothing_weight = nn.Parameter(torch.randn(nhead, 1))\n        self.v0 = nn.Parameter(torch.randn(1, 1, nhead, dim))\n        self.dropout = nn.Dropout(dropout)\n        if aux:\n            self.aux_dropout = nn.Dropout(dropout)\n\n    def forward(self, values, aux_values=None):\n        b, t, h, d = values.shape\n\n        init_weight, weight = self.get_exponential_weight(t)\n        output = conv1d_fft(self.dropout(values), weight, dim=1)\n        output = init_weight * self.v0 + output\n\n        if aux_values is not None:\n            aux_weight = weight / (1 - self.weight) * self.weight\n            aux_output = conv1d_fft(self.aux_dropout(aux_values), aux_weight)\n            output = output + aux_output\n\n        return output\n\n    def get_exponential_weight(self, T):\n        # Generate array [0, 1, ..., T-1]\n        powers = torch.arange(T, dtype=torch.float, device=self.weight.device)\n\n        # (1 - \\alpha) * \\alpha^t, for all t = T-1, T-2, ..., 0]\n        weight = (1 - self.weight) * (self.weight ** torch.flip(powers, dims=(0,)))\n\n        # \\alpha^t for all t = 1, 2, ..., T\n        init_weight = self.weight ** (powers + 1)\n\n        return rearrange(init_weight, 'h t -> 1 t h 1'), \\\n               rearrange(weight, 'h t -> 1 t h 1')\n\n    @property\n    def weight(self):\n        return torch.sigmoid(self._smoothing_weight)\n\n\nclass Feedforward(nn.Module):\n    def __init__(self, d_model, dim_feedforward, dropout=0.1, activation='sigmoid'):\n        # Implementation of Feedforward model\n        super().__init__()\n        self.linear1 = nn.Linear(d_model, dim_feedforward, bias=False)\n        self.dropout1 = nn.Dropout(dropout)\n        self.linear2 = nn.Linear(dim_feedforward, d_model, bias=False)\n        self.dropout2 = nn.Dropout(dropout)\n        self.activation = getattr(F, activation)\n\n    def forward(self, x):\n        x = self.linear2(self.dropout1(self.activation(self.linear1(x))))\n        return self.dropout2(x)\n\n\nclass GrowthLayer(nn.Module):\n\n    def __init__(self, d_model, nhead, d_head=None, dropout=0.1):\n        super().__init__()\n        self.d_head = d_head or (d_model // nhead)\n        self.d_model = d_model\n        self.nhead = nhead\n\n        self.z0 = nn.Parameter(torch.randn(self.nhead, self.d_head))\n        self.in_proj = nn.Linear(self.d_model, self.d_head * self.nhead)\n        self.es = ExponentialSmoothing(self.d_head, self.nhead, dropout=dropout)\n        self.out_proj = nn.Linear(self.d_head * self.nhead, self.d_model)\n\n        assert self.d_head * self.nhead == self.d_model, \"d_model must be divisible by nhead\"\n\n    def forward(self, inputs):\n        \"\"\"\n        :param inputs: shape: (batch, seq_len, dim)\n        :return: shape: (batch, seq_len, dim)\n        \"\"\"\n        b, t, d = inputs.shape\n        values = self.in_proj(inputs).view(b, t, self.nhead, -1)\n        values = torch.cat([repeat(self.z0, 'h d -> b 1 h d', b=b), values], dim=1)\n        values = values[:, 1:] - values[:, :-1]\n        out = self.es(values)\n        out = torch.cat([repeat(self.es.v0, '1 1 h d -> b 1 h d', b=b), out], dim=1)\n        out = rearrange(out, 'b t h d -> b t (h d)')\n        return self.out_proj(out)\n\n\nclass FourierLayer(nn.Module):\n\n    def __init__(self, d_model, pred_len, k=None, low_freq=1):\n        super().__init__()\n        self.d_model = d_model\n        self.pred_len = pred_len\n        self.k = k\n        self.low_freq = low_freq\n\n    def forward(self, x):\n        \"\"\"x: (b, t, d)\"\"\"\n        b, t, d = x.shape\n        x_freq = fft.rfft(x, dim=1)\n\n        if t % 2 == 0:\n            x_freq = x_freq[:, self.low_freq:-1]\n            f = fft.rfftfreq(t)[self.low_freq:-1]\n        else:\n            x_freq = x_freq[:, self.low_freq:]\n            f = fft.rfftfreq(t)[self.low_freq:]\n\n        x_freq, index_tuple = self.topk_freq(x_freq)\n        f = repeat(f, 'f -> b f d', b=x_freq.size(0), d=x_freq.size(2))\n        f = rearrange(f[index_tuple], 'b f d -> b f () d').to(x_freq.device)\n\n        return self.extrapolate(x_freq, f, t)\n\n    def extrapolate(self, x_freq, f, t):\n        x_freq = torch.cat([x_freq, x_freq.conj()], dim=1)\n        f = torch.cat([f, -f], dim=1)\n        t_val = rearrange(torch.arange(t + self.pred_len, dtype=torch.float),\n                          't -> () () t ()').to(x_freq.device)\n\n        amp = rearrange(x_freq.abs() / t, 'b f d -> b f () d')\n        phase = rearrange(x_freq.angle(), 'b f d -> b f () d')\n\n        x_time = amp * torch.cos(2 * math.pi * f * t_val + phase)\n\n        return reduce(x_time, 'b f t d -> b t d', 'sum')\n\n    def topk_freq(self, x_freq):\n        values, indices = torch.topk(x_freq.abs(), self.k, dim=1, largest=True, sorted=True)\n        mesh_a, mesh_b = torch.meshgrid(torch.arange(x_freq.size(0)), torch.arange(x_freq.size(2)))\n        index_tuple = (mesh_a.unsqueeze(1).to(indices.device), indices, mesh_b.unsqueeze(1).to(indices.device))\n        x_freq = x_freq[index_tuple]\n\n        return x_freq, index_tuple\n\n\nclass LevelLayer(nn.Module):\n\n    def __init__(self, d_model, c_out, dropout=0.1):\n        super().__init__()\n        self.d_model = d_model\n        self.c_out = c_out\n\n        self.es = ExponentialSmoothing(1, self.c_out, dropout=dropout, aux=True)\n        self.growth_pred = nn.Linear(self.d_model, self.c_out)\n        self.season_pred = nn.Linear(self.d_model, self.c_out)\n\n    def forward(self, level, growth, season):\n        b, t, _ = level.shape\n        growth = self.growth_pred(growth).view(b, t, self.c_out, 1)\n        season = self.season_pred(season).view(b, t, self.c_out, 1)\n        growth = growth.view(b, t, self.c_out, 1)\n        season = season.view(b, t, self.c_out, 1)\n        level = level.view(b, t, self.c_out, 1)\n        out = self.es(level - season, aux_values=growth)\n        out = rearrange(out, 'b t h d -> b t (h d)')\n        return out\n\n\nclass EncoderLayer(nn.Module):\n\n    def __init__(self, d_model, nhead, c_out, seq_len, pred_len, k, dim_feedforward=None, dropout=0.1,\n                 activation='sigmoid', layer_norm_eps=1e-5):\n        super().__init__()\n        self.d_model = d_model\n        self.nhead = nhead\n        self.c_out = c_out\n        self.seq_len = seq_len\n        self.pred_len = pred_len\n        dim_feedforward = dim_feedforward or 4 * d_model\n        self.dim_feedforward = dim_feedforward\n\n        self.growth_layer = GrowthLayer(d_model, nhead, dropout=dropout)\n        self.seasonal_layer = FourierLayer(d_model, pred_len, k=k)\n        self.level_layer = LevelLayer(d_model, c_out, dropout=dropout)\n\n        # Implementation of Feedforward model\n        self.ff = Feedforward(d_model, dim_feedforward, dropout=dropout, activation=activation)\n        self.norm1 = nn.LayerNorm(d_model, eps=layer_norm_eps)\n        self.norm2 = nn.LayerNorm(d_model, eps=layer_norm_eps)\n\n        self.dropout1 = nn.Dropout(dropout)\n        self.dropout2 = nn.Dropout(dropout)\n\n    def forward(self, res, level, attn_mask=None):\n        season = self._season_block(res)\n        res = res - season[:, :-self.pred_len]\n        growth = self._growth_block(res)\n        res = self.norm1(res - growth[:, 1:])\n        res = self.norm2(res + self.ff(res))\n\n        level = self.level_layer(level, growth[:, :-1], season[:, :-self.pred_len])\n        return res, level, growth, season\n\n    def _growth_block(self, x):\n        x = self.growth_layer(x)\n        return self.dropout1(x)\n\n    def _season_block(self, x):\n        x = self.seasonal_layer(x)\n        return self.dropout2(x)\n\n\nclass Encoder(nn.Module):\n\n    def __init__(self, layers):\n        super().__init__()\n        self.layers = nn.ModuleList(layers)\n\n    def forward(self, res, level, attn_mask=None):\n        growths = []\n        seasons = []\n        for layer in self.layers:\n            res, level, growth, season = layer(res, level, attn_mask=None)\n            growths.append(growth)\n            seasons.append(season)\n\n        return level, growths, seasons\n\n\nclass DampingLayer(nn.Module):\n\n    def __init__(self, pred_len, nhead, dropout=0.1):\n        super().__init__()\n        self.pred_len = pred_len\n        self.nhead = nhead\n        self._damping_factor = nn.Parameter(torch.randn(1, nhead))\n        self.dropout = nn.Dropout(dropout)\n\n    def forward(self, x):\n        x = repeat(x, 'b 1 d -> b t d', t=self.pred_len)\n        b, t, d = x.shape\n\n        powers = torch.arange(self.pred_len).to(self._damping_factor.device) + 1\n        powers = powers.view(self.pred_len, 1)\n        damping_factors = self.damping_factor ** powers\n        damping_factors = damping_factors.cumsum(dim=0)\n        x = x.view(b, t, self.nhead, -1)\n        x = self.dropout(x) * damping_factors.unsqueeze(-1)\n        return x.view(b, t, d)\n\n    @property\n    def damping_factor(self):\n        return torch.sigmoid(self._damping_factor)\n\n\nclass DecoderLayer(nn.Module):\n\n    def __init__(self, d_model, nhead, c_out, pred_len, dropout=0.1):\n        super().__init__()\n        self.d_model = d_model\n        self.nhead = nhead\n        self.c_out = c_out\n        self.pred_len = pred_len\n\n        self.growth_damping = DampingLayer(pred_len, nhead, dropout=dropout)\n        self.dropout1 = nn.Dropout(dropout)\n\n    def forward(self, growth, season):\n        growth_horizon = self.growth_damping(growth[:, -1:])\n        growth_horizon = self.dropout1(growth_horizon)\n\n        seasonal_horizon = season[:, -self.pred_len:]\n        return growth_horizon, seasonal_horizon\n\n\nclass Decoder(nn.Module):\n\n    def __init__(self, layers):\n        super().__init__()\n        self.d_model = layers[0].d_model\n        self.c_out = layers[0].c_out\n        self.pred_len = layers[0].pred_len\n        self.nhead = layers[0].nhead\n\n        self.layers = nn.ModuleList(layers)\n        self.pred = nn.Linear(self.d_model, self.c_out)\n\n    def forward(self, growths, seasons):\n        growth_repr = []\n        season_repr = []\n\n        for idx, layer in enumerate(self.layers):\n            growth_horizon, season_horizon = layer(growths[idx], seasons[idx])\n            growth_repr.append(growth_horizon)\n            season_repr.append(season_horizon)\n        growth_repr = sum(growth_repr)\n        season_repr = sum(season_repr)\n        return self.pred(growth_repr), self.pred(season_repr)\n"
  },
  {
    "path": "layers/Embed.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.nn.utils import weight_norm\nimport math\n\n\nclass PositionalEmbedding(nn.Module):\n    def __init__(self, d_model, max_len=5000):\n        super(PositionalEmbedding, self).__init__()\n        # Compute the positional encodings once in log space.\n        pe = torch.zeros(max_len, d_model).float()\n        pe.require_grad = False\n\n        position = torch.arange(0, max_len).float().unsqueeze(1)\n        div_term = (torch.arange(0, d_model, 2).float()\n                    * -(math.log(10000.0) / d_model)).exp()\n\n        pe[:, 0::2] = torch.sin(position * div_term)\n        pe[:, 1::2] = torch.cos(position * div_term)\n\n        pe = pe.unsqueeze(0)\n        self.register_buffer('pe', pe)\n\n    def forward(self, x):\n        return self.pe[:, :x.size(1)]\n\n\nclass TokenEmbedding(nn.Module):\n    def __init__(self, c_in, d_model):\n        super(TokenEmbedding, self).__init__()\n        padding = 1 if torch.__version__ >= '1.5.0' else 2\n        self.tokenConv = nn.Conv1d(in_channels=c_in, out_channels=d_model,\n                                   kernel_size=3, padding=padding, padding_mode='circular', bias=False)\n        for m in self.modules():\n            if isinstance(m, nn.Conv1d):\n                nn.init.kaiming_normal_(\n                    m.weight, mode='fan_in', nonlinearity='leaky_relu')\n\n    def forward(self, x):\n        x = self.tokenConv(x.permute(0, 2, 1)).transpose(1, 2)\n        return x\n\n\nclass FixedEmbedding(nn.Module):\n    def __init__(self, c_in, d_model):\n        super(FixedEmbedding, self).__init__()\n\n        w = torch.zeros(c_in, d_model).float()\n        w.require_grad = False\n\n        position = torch.arange(0, c_in).float().unsqueeze(1)\n        div_term = (torch.arange(0, d_model, 2).float()\n                    * -(math.log(10000.0) / d_model)).exp()\n\n        w[:, 0::2] = torch.sin(position * div_term)\n        w[:, 1::2] = torch.cos(position * div_term)\n\n        self.emb = nn.Embedding(c_in, d_model)\n        self.emb.weight = nn.Parameter(w, requires_grad=False)\n\n    def forward(self, x):\n        return self.emb(x).detach()\n\n\nclass TemporalEmbedding(nn.Module):\n    def __init__(self, d_model, embed_type='fixed', freq='h'):\n        super(TemporalEmbedding, self).__init__()\n\n        minute_size = 4\n        hour_size = 24\n        weekday_size = 7\n        day_size = 32\n        month_size = 13\n\n        Embed = FixedEmbedding if embed_type == 'fixed' else nn.Embedding\n        if freq == 't':\n            self.minute_embed = Embed(minute_size, d_model)\n        self.hour_embed = Embed(hour_size, d_model)\n        self.weekday_embed = Embed(weekday_size, d_model)\n        self.day_embed = Embed(day_size, d_model)\n        self.month_embed = Embed(month_size, d_model)\n\n    def forward(self, x):\n        x = x.long()\n        minute_x = self.minute_embed(x[:, :, 4]) if hasattr(\n            self, 'minute_embed') else 0.\n        hour_x = self.hour_embed(x[:, :, 3])\n        weekday_x = self.weekday_embed(x[:, :, 2])\n        day_x = self.day_embed(x[:, :, 1])\n        month_x = self.month_embed(x[:, :, 0])\n\n        return hour_x + weekday_x + day_x + month_x + minute_x\n\n\nclass TimeFeatureEmbedding(nn.Module):\n    def __init__(self, d_model, embed_type='timeF', freq='h'):\n        super(TimeFeatureEmbedding, self).__init__()\n\n        freq_map = {'h': 4, 't': 5, 's': 6,\n                    'm': 1, 'a': 1, 'w': 2, 'd': 3, 'b': 3}\n        d_inp = freq_map[freq]\n        self.embed = nn.Linear(d_inp, d_model, bias=False)\n\n    def forward(self, x):\n        return self.embed(x)\n\n\nclass DataEmbedding(nn.Module):\n    def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1):\n        super(DataEmbedding, self).__init__()\n\n        self.value_embedding = TokenEmbedding(c_in=c_in, d_model=d_model)\n        self.position_embedding = PositionalEmbedding(d_model=d_model)\n        self.temporal_embedding = TemporalEmbedding(d_model=d_model, embed_type=embed_type,\n                                                    freq=freq) if embed_type != 'timeF' else TimeFeatureEmbedding(\n            d_model=d_model, embed_type=embed_type, freq=freq)\n        self.dropout = nn.Dropout(p=dropout)\n\n    def forward(self, x, x_mark):\n        if x_mark is None:\n            x = self.value_embedding(x) + self.position_embedding(x)\n        else:\n            x = self.value_embedding(\n                x) + self.temporal_embedding(x_mark) + self.position_embedding(x)\n        return self.dropout(x)\n\n\nclass DataEmbedding_inverted(nn.Module):\n    def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1):\n        super(DataEmbedding_inverted, self).__init__()\n        self.value_embedding = nn.Linear(c_in, d_model)\n        self.dropout = nn.Dropout(p=dropout)\n\n    def forward(self, x, x_mark):\n        x = x.permute(0, 2, 1)\n        # x: [Batch Variate Time]\n        if x_mark is None:\n            x = self.value_embedding(x)\n        else:\n            x = self.value_embedding(torch.cat([x, x_mark.permute(0, 2, 1)], 1))\n        # x: [Batch Variate d_model]\n        return self.dropout(x)\n\n\nclass DataEmbedding_wo_pos(nn.Module):\n    def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1):\n        super(DataEmbedding_wo_pos, self).__init__()\n\n        self.value_embedding = TokenEmbedding(c_in=c_in, d_model=d_model)\n        self.position_embedding = PositionalEmbedding(d_model=d_model)\n        self.temporal_embedding = TemporalEmbedding(d_model=d_model, embed_type=embed_type,\n                                                    freq=freq) if embed_type != 'timeF' else TimeFeatureEmbedding(\n            d_model=d_model, embed_type=embed_type, freq=freq)\n        self.dropout = nn.Dropout(p=dropout)\n\n    def forward(self, x, x_mark):\n        if x_mark is None:\n            x = self.value_embedding(x)\n        else:\n            x = self.value_embedding(x) + self.temporal_embedding(x_mark)\n        return self.dropout(x)\n\n\nclass PatchEmbedding(nn.Module):\n    def __init__(self, d_model, patch_len, stride, padding, dropout):\n        super(PatchEmbedding, self).__init__()\n        # Patching\n        self.patch_len = patch_len\n        self.stride = stride\n        self.padding_patch_layer = nn.ReplicationPad1d((0, padding))\n\n        # Backbone, Input encoding: projection of feature vectors onto a d-dim vector space\n        self.value_embedding = nn.Linear(patch_len, d_model, bias=False)\n\n        # Positional embedding\n        self.position_embedding = PositionalEmbedding(d_model)\n\n        # Residual dropout\n        self.dropout = nn.Dropout(dropout)\n\n    def forward(self, x):\n        # do patching\n        n_vars = x.shape[1]\n        x = self.padding_patch_layer(x)\n        x = x.unfold(dimension=-1, size=self.patch_len, step=self.stride)\n        x = torch.reshape(x, (x.shape[0] * x.shape[1], x.shape[2], x.shape[3]))\n        # Input encoding\n        x = self.value_embedding(x) + self.position_embedding(x)\n        return self.dropout(x), n_vars\n"
  },
  {
    "path": "layers/FourierCorrelation.py",
    "content": "# coding=utf-8\n# author=maziqing\n# email=maziqing.mzq@alibaba-inc.com\n\nimport numpy as np\nimport torch\nimport torch.nn as nn\n\n\ndef get_frequency_modes(seq_len, modes=64, mode_select_method='random'):\n    \"\"\"\n    get modes on frequency domain:\n    'random' means sampling randomly;\n    'else' means sampling the lowest modes;\n    \"\"\"\n    modes = min(modes, seq_len // 2)\n    if mode_select_method == 'random':\n        index = list(range(0, seq_len // 2))\n        np.random.shuffle(index)\n        index = index[:modes]\n    else:\n        index = list(range(0, modes))\n    index.sort()\n    return index\n\n\n# ########## fourier layer #############\nclass FourierBlock(nn.Module):\n    def __init__(self, in_channels, out_channels, n_heads, seq_len, modes=0, mode_select_method='random'):\n        super(FourierBlock, self).__init__()\n        print('fourier enhanced block used!')\n        \"\"\"\n        1D Fourier block. It performs representation learning on frequency domain, \n        it does FFT, linear transform, and Inverse FFT.    \n        \"\"\"\n        # get modes on frequency domain\n        self.index = get_frequency_modes(seq_len, modes=modes, mode_select_method=mode_select_method)\n        print('modes={}, index={}'.format(modes, self.index))\n\n        self.n_heads = n_heads\n        self.scale = (1 / (in_channels * out_channels))\n        self.weights1 = nn.Parameter(\n            self.scale * torch.rand(self.n_heads, in_channels // self.n_heads, out_channels // self.n_heads,\n                                    len(self.index), dtype=torch.float))\n        self.weights2 = nn.Parameter(\n            self.scale * torch.rand(self.n_heads, in_channels // self.n_heads, out_channels // self.n_heads,\n                                    len(self.index), dtype=torch.float))\n\n    # Complex multiplication\n    def compl_mul1d(self, order, x, weights):\n        x_flag = True\n        w_flag = True\n        if not torch.is_complex(x):\n            x_flag = False\n            x = torch.complex(x, torch.zeros_like(x).to(x.device))\n        if not torch.is_complex(weights):\n            w_flag = False\n            weights = torch.complex(weights, torch.zeros_like(weights).to(weights.device))\n        if x_flag or w_flag:\n            return torch.complex(torch.einsum(order, x.real, weights.real) - torch.einsum(order, x.imag, weights.imag),\n                                 torch.einsum(order, x.real, weights.imag) + torch.einsum(order, x.imag, weights.real))\n        else:\n            return torch.einsum(order, x.real, weights.real)\n\n    def forward(self, q, k, v, mask):\n        # size = [B, L, H, E]\n        B, L, H, E = q.shape\n        x = q.permute(0, 2, 3, 1)\n        # Compute Fourier coefficients\n        x_ft = torch.fft.rfft(x, dim=-1)\n        # Perform Fourier neural operations\n        out_ft = torch.zeros(B, H, E, L // 2 + 1, device=x.device, dtype=torch.cfloat)\n        for wi, i in enumerate(self.index):\n            if i >= x_ft.shape[3] or wi >= out_ft.shape[3]:\n                continue\n            out_ft[:, :, :, wi] = self.compl_mul1d(\"bhi,hio->bho\", x_ft[:, :, :, i],\n                                                   torch.complex(self.weights1, self.weights2)[:, :, :, wi])\n        # Return to time domain\n        x = torch.fft.irfft(out_ft, n=x.size(-1))\n        return (x, None)\n\n# ########## Fourier Cross Former ####################\nclass FourierCrossAttention(nn.Module):\n    def __init__(self, in_channels, out_channels, seq_len_q, seq_len_kv, modes=64, mode_select_method='random',\n                 activation='tanh', policy=0, num_heads=8):\n        super(FourierCrossAttention, self).__init__()\n        print(' fourier enhanced cross attention used!')\n        \"\"\"\n        1D Fourier Cross Attention layer. It does FFT, linear transform, attention mechanism and Inverse FFT.    \n        \"\"\"\n        self.activation = activation\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        # get modes for queries and keys (& values) on frequency domain\n        self.index_q = get_frequency_modes(seq_len_q, modes=modes, mode_select_method=mode_select_method)\n        self.index_kv = get_frequency_modes(seq_len_kv, modes=modes, mode_select_method=mode_select_method)\n\n        print('modes_q={}, index_q={}'.format(len(self.index_q), self.index_q))\n        print('modes_kv={}, index_kv={}'.format(len(self.index_kv), self.index_kv))\n\n        self.scale = (1 / (in_channels * out_channels))\n        self.weights1 = nn.Parameter(\n            self.scale * torch.rand(num_heads, in_channels // num_heads, out_channels // num_heads, len(self.index_q), dtype=torch.float))\n        self.weights2 = nn.Parameter(\n            self.scale * torch.rand(num_heads, in_channels // num_heads, out_channels // num_heads, len(self.index_q), dtype=torch.float))\n\n    # Complex multiplication\n    def compl_mul1d(self, order, x, weights):\n        x_flag = True\n        w_flag = True\n        if not torch.is_complex(x):\n            x_flag = False\n            x = torch.complex(x, torch.zeros_like(x).to(x.device))\n        if not torch.is_complex(weights):\n            w_flag = False\n            weights = torch.complex(weights, torch.zeros_like(weights).to(weights.device))\n        if x_flag or w_flag:\n            return torch.complex(torch.einsum(order, x.real, weights.real) - torch.einsum(order, x.imag, weights.imag),\n                                 torch.einsum(order, x.real, weights.imag) + torch.einsum(order, x.imag, weights.real))\n        else:\n            return torch.einsum(order, x.real, weights.real)\n\n    def forward(self, q, k, v, mask):\n        # size = [B, L, H, E]\n        B, L, H, E = q.shape\n        xq = q.permute(0, 2, 3, 1)  # size = [B, H, E, L]\n        xk = k.permute(0, 2, 3, 1)\n        xv = v.permute(0, 2, 3, 1)\n\n        # Compute Fourier coefficients\n        xq_ft_ = torch.zeros(B, H, E, len(self.index_q), device=xq.device, dtype=torch.cfloat)\n        xq_ft = torch.fft.rfft(xq, dim=-1)\n        for i, j in enumerate(self.index_q):\n            if j >= xq_ft.shape[3]:\n                continue\n            xq_ft_[:, :, :, i] = xq_ft[:, :, :, j]\n        xk_ft_ = torch.zeros(B, H, E, len(self.index_kv), device=xq.device, dtype=torch.cfloat)\n        xk_ft = torch.fft.rfft(xk, dim=-1)\n        for i, j in enumerate(self.index_kv):\n            if j >= xk_ft.shape[3]:\n                continue\n            xk_ft_[:, :, :, i] = xk_ft[:, :, :, j]\n\n        # perform attention mechanism on frequency domain\n        xqk_ft = (self.compl_mul1d(\"bhex,bhey->bhxy\", xq_ft_, xk_ft_))\n        if self.activation == 'tanh':\n            xqk_ft = torch.complex(xqk_ft.real.tanh(), xqk_ft.imag.tanh())\n        elif self.activation == 'softmax':\n            xqk_ft = torch.softmax(abs(xqk_ft), dim=-1)\n            xqk_ft = torch.complex(xqk_ft, torch.zeros_like(xqk_ft))\n        else:\n            raise Exception('{} actiation function is not implemented'.format(self.activation))\n        xqkv_ft = self.compl_mul1d(\"bhxy,bhey->bhex\", xqk_ft, xk_ft_)\n        xqkvw = self.compl_mul1d(\"bhex,heox->bhox\", xqkv_ft, torch.complex(self.weights1, self.weights2))\n        out_ft = torch.zeros(B, H, E, L // 2 + 1, device=xq.device, dtype=torch.cfloat)\n        for i, j in enumerate(self.index_q):\n            if i >= xqkvw.shape[3] or j >= out_ft.shape[3]:\n                continue\n            out_ft[:, :, :, j] = xqkvw[:, :, :, i]\n        # Return to time domain\n        out = torch.fft.irfft(out_ft / self.in_channels / self.out_channels, n=xq.size(-1))\n        return (out, None)\n"
  },
  {
    "path": "layers/MSGBlock.py",
    "content": "from math import sqrt\nimport numpy as np\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch\nfrom torch import nn, Tensor\nfrom einops import rearrange\nfrom einops.layers.torch import Rearrange\nfrom utils.masking import TriangularCausalMask\n\nclass Predict(nn.Module):\n    def __init__(self,  individual, c_out, seq_len, pred_len, dropout):\n        super(Predict, self).__init__()\n        self.individual = individual\n        self.c_out = c_out\n\n        if self.individual:\n            self.seq2pred = nn.ModuleList()\n            self.dropout = nn.ModuleList()\n            for i in range(self.c_out):\n                self.seq2pred.append(nn.Linear(seq_len , pred_len))\n                self.dropout.append(nn.Dropout(dropout))\n        else:\n            self.seq2pred = nn.Linear(seq_len , pred_len)\n            self.dropout = nn.Dropout(dropout)\n\n    #(B,  c_out , seq)\n    def forward(self, x):\n        if self.individual:\n            out = []\n            for i in range(self.c_out):\n                per_out = self.seq2pred[i](x[:,i,:])\n                per_out = self.dropout[i](per_out)\n                out.append(per_out)\n            out = torch.stack(out,dim=1)\n        else:\n            out = self.seq2pred(x)\n            out = self.dropout(out)\n\n        return out\n\n\nclass Attention_Block(nn.Module):\n    def __init__(self,  d_model, d_ff=None, n_heads=8, dropout=0.1, activation=\"relu\"):\n        super(Attention_Block, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.attention = self_attention(FullAttention, d_model, n_heads=n_heads)\n        self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)\n        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)\n        self.norm1 = nn.LayerNorm(d_model)\n        self.norm2 = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.activation = F.relu if activation == \"relu\" else F.gelu\n\n    def forward(self, x, attn_mask=None):\n        new_x, attn = self.attention(\n            x, x, x,\n            attn_mask=attn_mask\n        )\n        x = x + self.dropout(new_x)\n\n        y = x = self.norm1(x)\n        y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))\n        y = self.dropout(self.conv2(y).transpose(-1, 1))\n\n        return self.norm2(x + y)\n\n\nclass self_attention(nn.Module):\n    def __init__(self, attention, d_model ,n_heads):\n        super(self_attention, self).__init__()\n        d_keys =  d_model // n_heads\n        d_values = d_model // n_heads\n\n        self.inner_attention = attention( attention_dropout = 0.1)\n        self.query_projection = nn.Linear(d_model, d_keys * n_heads)\n        self.key_projection = nn.Linear(d_model, d_keys * n_heads)\n        self.value_projection = nn.Linear(d_model, d_values * n_heads)\n        self.out_projection = nn.Linear(d_values * n_heads, d_model)\n        self.n_heads = n_heads\n\n\n    def forward(self, queries ,keys ,values, attn_mask= None):\n        B, L, _ = queries.shape\n        _, S, _ = keys.shape\n        H = self.n_heads\n        queries = self.query_projection(queries).view(B, L, H, -1)\n        keys = self.key_projection(keys).view(B, S, H, -1)\n        values = self.value_projection(values).view(B, S, H, -1)\n\n        out, attn = self.inner_attention(\n                    queries,\n                    keys,\n                    values,\n                    attn_mask\n                )\n        out = out.view(B, L, -1)\n        out = self.out_projection(out)\n        return out , attn\n\n\nclass FullAttention(nn.Module):\n    def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):\n        super(FullAttention, self).__init__()\n        self.scale = scale\n        self.mask_flag = mask_flag\n        self.output_attention = output_attention\n        self.dropout = nn.Dropout(attention_dropout)\n\n    def forward(self, queries, keys, values, attn_mask):\n        B, L, H, E = queries.shape\n        _, S, _, D = values.shape\n        scale = self.scale or 1. / sqrt(E)\n        scores = torch.einsum(\"blhe,bshe->bhls\", queries, keys)\n        if self.mask_flag:\n            if attn_mask is None:\n                attn_mask = TriangularCausalMask(B, L, device=queries.device)\n            scores.masked_fill_(attn_mask.mask, -np.inf)\n        A = self.dropout(torch.softmax(scale * scores, dim=-1))\n        V = torch.einsum(\"bhls,bshd->blhd\", A, values)\n        # return V.contiguous()\n        if self.output_attention:\n            return (V.contiguous(), A)\n        else:\n            return (V.contiguous(), None)\n\n\nclass GraphBlock(nn.Module):\n    def __init__(self, c_out , d_model , conv_channel, skip_channel,\n                        gcn_depth , dropout, propalpha ,seq_len , node_dim):\n        super(GraphBlock, self).__init__()\n\n        self.nodevec1 = nn.Parameter(torch.randn(c_out, node_dim), requires_grad=True)\n        self.nodevec2 = nn.Parameter(torch.randn(node_dim, c_out), requires_grad=True)\n        self.start_conv = nn.Conv2d(1, conv_channel, (d_model - c_out + 1, 1))\n        self.gconv1 = mixprop(conv_channel, skip_channel, gcn_depth, dropout, propalpha)\n        self.gelu = nn.GELU()\n        self.end_conv = nn.Conv2d(skip_channel, seq_len , (1, seq_len ))\n        self.linear = nn.Linear(c_out, d_model)\n        self.norm = nn.LayerNorm(d_model)\n    # x in (B, T, d_model)\n    # Here we use a mlp to fit a complex mapping f (x)\n    def forward(self, x):\n        adp = F.softmax(F.relu(torch.mm(self.nodevec1, self.nodevec2)), dim=1)\n        out = x.unsqueeze(1).transpose(2, 3)\n        out = self.start_conv(out)\n        out = self.gelu(self.gconv1(out , adp))\n        out = self.end_conv(out).squeeze(-1)\n        out = self.linear(out)\n\n        return self.norm(x + out)\n\n\nclass nconv(nn.Module):\n    def __init__(self):\n        super(nconv,self).__init__()\n\n    def forward(self,x, A):\n        x = torch.einsum('ncwl,vw->ncvl',(x,A))\n        # x = torch.einsum('ncwl,wv->nclv',(x,A)\n        return x.contiguous()\n\n\nclass linear(nn.Module):\n    def __init__(self,c_in,c_out,bias=True):\n        super(linear,self).__init__()\n        self.mlp = torch.nn.Conv2d(c_in, c_out, kernel_size=(1, 1), padding=(0,0), stride=(1,1), bias=bias)\n\n    def forward(self,x):\n        return self.mlp(x)\n\n\nclass mixprop(nn.Module):\n    def __init__(self,c_in,c_out,gdep,dropout,alpha):\n        super(mixprop, self).__init__()\n        self.nconv = nconv()\n        self.mlp = linear((gdep+1)*c_in,c_out)\n        self.gdep = gdep\n        self.dropout = dropout\n        self.alpha = alpha\n\n    def forward(self, x, adj):\n        adj = adj + torch.eye(adj.size(0)).to(x.device)\n        d = adj.sum(1)\n        h = x\n        out = [h]\n        a = adj / d.view(-1, 1)\n        for i in range(self.gdep):\n            h = self.alpha*x + (1-self.alpha)*self.nconv(h,a)\n            out.append(h)\n        ho = torch.cat(out,dim=1)\n        ho = self.mlp(ho)\n        return ho\n\n\nclass simpleVIT(nn.Module):\n    def __init__(self, in_channels, emb_size, patch_size=2, depth=1, num_heads=4, dropout=0.1,init_weight =True):\n        super(simpleVIT, self).__init__()\n        self.emb_size = emb_size\n        self.depth = depth\n        self.to_patch = nn.Sequential(\n            nn.Conv2d(in_channels, emb_size, 2 * patch_size + 1, padding= patch_size),\n            Rearrange('b e (h) (w) -> b (h w) e'),\n        )\n        self.layers = nn.ModuleList([])\n        for _ in range(self.depth):\n            self.layers.append(nn.ModuleList([\n                nn.LayerNorm(emb_size),\n                MultiHeadAttention(emb_size, num_heads, dropout),\n                FeedForward(emb_size,  emb_size)\n            ]))\n\n        if init_weight:\n            self._initialize_weights()\n\n    def _initialize_weights(self):\n        for m in self.modules():\n            if isinstance(m, nn.Conv2d):\n                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')\n                if m.bias is not None:\n                    nn.init.constant_(m.bias, 0)\n\n    def forward(self,x):\n        B , N ,_ ,P = x.shape\n        x = self.to_patch(x)\n        # x = x.permute(0, 2, 3, 1).reshape(B,-1, N)\n        for  norm ,attn, ff in self.layers:\n            x = attn(norm(x)) + x\n            x = ff(x) + x\n\n        x = x.transpose(1,2).reshape(B, self.emb_size ,-1, P)\n        return x\n\nclass MultiHeadAttention(nn.Module):\n    def __init__(self, emb_size, num_heads, dropout):\n        super().__init__()\n        self.emb_size = emb_size\n        self.num_heads = num_heads\n        self.keys = nn.Linear(emb_size, emb_size)\n        self.queries = nn.Linear(emb_size, emb_size)\n        self.values = nn.Linear(emb_size, emb_size)\n        self.att_drop = nn.Dropout(dropout)\n        self.projection = nn.Linear(emb_size, emb_size)\n\n    def forward(self, x: Tensor, mask: Tensor = None) -> Tensor:\n        queries = rearrange(self.queries(x), \"b n (h d) -> b h n d\", h=self.num_heads)\n        keys = rearrange(self.keys(x), \"b n (h d) -> b h n d\", h=self.num_heads)\n        values = rearrange(self.values(x), \"b n (h d) -> b h n d\", h=self.num_heads)\n        energy = torch.einsum('bhqd, bhkd -> bhqk', queries, keys)\n        if mask is not None:\n            fill_value = torch.finfo(torch.float32).min\n            energy.mask_fill(~mask, fill_value)\n\n        scaling = self.emb_size ** (1 / 2)\n        att = F.softmax(energy, dim=-1) / scaling\n        att = self.att_drop(att)\n        # sum up over the third axis\n        out = torch.einsum('bhal, bhlv -> bhav ', att, values)\n        out = rearrange(out, \"b h n d -> b n (h d)\")\n        out = self.projection(out)\n        return out\n\nclass FeedForward(nn.Module):\n    def __init__(self, dim, hidden_dim):\n        super().__init__()\n        self.net = nn.Sequential(\n            nn.LayerNorm(dim),\n            nn.Linear(dim, hidden_dim),\n            nn.GELU(),\n            nn.Linear(hidden_dim, dim),\n        )\n    def forward(self, x):\n        return self.net(x)"
  },
  {
    "path": "layers/MambaBlock.py",
    "content": "import math\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom einops import rearrange, repeat\n\nfrom mamba_ssm.ops.selective_scan_interface import selective_scan_fn\ntry:\n    from causal_conv1d import causal_conv1d_fn, causal_conv1d_update\nexcept ImportError:\n    causal_conv1d_fn, causal_conv1d_update = None, None\n\n### DELETED: selective_state_update is not used in this experiment since it does not support the use of timevariant dt, B, C flags.\n# from mamba_ssm.ops.selective_scan_interface import mamba_inner_fn\n# try:\n#     from mamba_ssm.ops.triton.selective_state_update import selective_state_update\n# except ImportError:\n#     selective_state_update = None\n\n\n\nclass Mamba_TimeVariant(nn.Module):\n    \"\"\"\n    Mamba Block with support for time-variant dt, B, C.\n    The time-variant parameters are controlled by `timevariant_dt`, `timevariant_B`, and `timevariant_C` flags.\n    \n    Difference from the original `modules.mamba_simple.Mamba` class:\n    - In `step()`, `x_proj` can be `None`, so dt, B, and C are split only when guarded by if `self.x_proj` is not `None`.\n    - When `tv_dt=False`, dt is constructed as a bias-based constant and expanded to shape `(B, d_inner)` via repeat to match einsum dimensions.\n    - When `d_conv=0`, step avoids accessing depthwise convolution weights and instead follows the `SiLU(x)` path.\n    - In cache creation (`allocate_inference_cache`, `_get_states_from_cache`), dtype and device are selected safely even when `conv1d` is `Identity`.\n    \"\"\"\n    def __init__(\n        self,\n        d_model,\n        d_input=None,   ### added\n        d_output=None,  ### added\n        d_state=16,\n        d_conv=4,\n        expand=2,\n        dt_rank=\"auto\",\n        dt_min=0.001,\n        dt_max=0.1,\n        dt_init=\"random\",\n        dt_scale=1.0,\n        dt_init_floor=1e-4,\n        conv_bias=True,\n        bias=False,\n        use_fast_path=False,  # Fused kernel options. ** Fixed to False for this experiment **\n        layer_idx=None,\n        device=None,\n        dtype=None,\n        timevariant_dt=True,  ### ADDED: to support timevariant dt\n        timevariant_B=True,   ### ADDED: to support timevariant B\n        timevariant_C=True,   ### ADDED: to support timevariant C\n        use_D=True,           ### ADDED: to control the usage of D parameter\n    ):\n        factory_kwargs = {\"device\": device, \"dtype\": dtype}\n        super().__init__()\n        self.d_model = d_model\n        self.d_input = d_input if d_input is not None else d_model    ### ADDED: for various input dimensions\n        self.d_output = d_output if d_output is not None else d_model ### ADDED: for various output dimensions\n        self.d_state = d_state\n        self.d_conv = d_conv\n        self.expand = expand\n        self.d_inner = int(self.expand * self.d_model)\n        self.dt_rank = math.ceil(self.d_model / 16) if dt_rank == \"auto\" else dt_rank\n        self.use_fast_path = use_fast_path\n        self.layer_idx = layer_idx\n\n        ### MODIFIED: change the in_feature dimension from d_model to d_input\n        self.in_proj = nn.Linear(self.d_input, self.d_inner * 2, bias=bias, **factory_kwargs)\n        \n        self.conv1d = nn.Conv1d(\n            in_channels=self.d_inner,\n            out_channels=self.d_inner,\n            bias=conv_bias,\n            kernel_size=d_conv,\n            groups=self.d_inner,\n            padding=d_conv - 1,\n            **factory_kwargs,\n        ) if d_conv > 0 else nn.Identity()  ### MODIFIED: Skip the convolution if d_conv is set to 0\n\n        self.activation = \"silu\"\n        self.act = nn.SiLU()\n\n        ### MODIFIED: adjust the x_proj layer to support timevariant dt, B, C. \n        ###           this is possible since selective_scan.cpp has `is_variable_B` and `is_variable_C` flags that control the usage of timevariant B and C\n        self.tv_dt, self.tv_B, self.tv_C = timevariant_dt, timevariant_B, timevariant_C\n        self.tv_proj_dim = [0, 0, 0,]\n        if timevariant_dt | timevariant_B | timevariant_C:\n            if timevariant_dt:\n                self.tv_proj_dim[0] = self.dt_rank\n            if timevariant_B:\n                self.tv_proj_dim[1] = self.d_state\n            if timevariant_C:\n                self.tv_proj_dim[2] = self.d_state\n        self.x_proj = nn.Linear(\n            self.d_inner, sum(self.tv_proj_dim), bias=False, **factory_kwargs\n        ) if sum(self.tv_proj_dim) > 0 else None\n\n        ### ADDED: if tv flags are False, we will use constants for dt, B, C\n        if not timevariant_B:\n            self.B = nn.Parameter(torch.rand(self.d_inner, self.d_state, **factory_kwargs))\n            self.B._no_weight_decay = True\n        if not timevariant_C:\n            self.C = nn.Parameter(torch.rand(self.d_inner, self.d_state, **factory_kwargs))\n            self.C._no_weight_decay = True\n\n        \n        self.dt_proj = nn.Linear(self.dt_rank, self.d_inner, bias=True, **factory_kwargs)\n\n        # Initialize special dt projection to preserve variance at initialization\n        dt_init_std = self.dt_rank**-0.5 * dt_scale\n        if dt_init == \"constant\":\n            nn.init.constant_(self.dt_proj.weight, dt_init_std)\n        elif dt_init == \"random\":\n            nn.init.uniform_(self.dt_proj.weight, -dt_init_std, dt_init_std)\n        else:\n            raise NotImplementedError\n\n        # Initialize dt bias so that F.softplus(dt_bias) is between dt_min and dt_max\n        dt = torch.exp(\n            torch.rand(self.d_inner, **factory_kwargs) * (math.log(dt_max) - math.log(dt_min))\n            + math.log(dt_min)\n        ).clamp(min=dt_init_floor)\n        # Inverse of softplus: https://github.com/pytorch/pytorch/issues/72759\n        inv_dt = dt + torch.log(-torch.expm1(-dt))\n        with torch.no_grad():\n            self.dt_proj.bias.copy_(inv_dt)\n        # Our initialization would set all Linear.bias to zero, need to mark this one as _no_reinit\n        self.dt_proj.bias._no_reinit = True\n\n        # S4D real initialization\n        # (expand * d_model, d_state)\n        # A = [[1, 2, ..., d_state], [1, 2, ..., d_state], ..., [1, 2, ..., d_state]]\n        A = repeat(\n            torch.arange(1, self.d_state + 1, dtype=torch.float32, device=device),\n            \"n -> d n\",\n            d=self.d_inner,\n        ).contiguous()\n        A_log = torch.log(A)  # Keep A_log in fp32\n        self.A_log = nn.Parameter(A_log)\n        self.A_log._no_weight_decay = True\n\n        # D \"skip\" parameter\n        ### MODIFIED: D is a learnable parameter only if use_D is True else it is not used\n        ###         this is possible since selective_scan.cpp allows D to be optional\n        if use_D:\n            self.D = nn.Parameter(torch.ones(self.d_inner, device=device)).float()\n            self.D._no_weight_decay = True\n        else:\n            self.D = None\n\n        ### MODIFIED: out_proj now has d_output instead of d_model\n        self.out_proj = nn.Linear(self.d_inner, self.d_output, bias=bias, **factory_kwargs)\n\n\n    def forward(self, hidden_states, inference_params=None):\n        \"\"\"\n        hidden_states: (B, L, D)\n        Returns: same shape as hidden_states\n        \"\"\"\n        batch, seqlen, d_input = hidden_states.shape\n\n        conv_state, ssm_state = None, None\n        if inference_params is not None:\n            conv_state, ssm_state = self._get_states_from_cache(inference_params, batch)\n            if inference_params.seqlen_offset > 0:\n                # The states are updated inplace\n                out, _, _ = self.step(hidden_states, conv_state, ssm_state)\n                return out\n\n        # We do matmul and transpose BLH -> HBL at the same time\n        xz = rearrange(\n            self.in_proj.weight @ rearrange(hidden_states, \"b l d -> d (b l)\"),\n            \"d (b l) -> b d l\",\n            l=seqlen,\n        )  # (d_inner * 2, d_input) @ (d_input, batch * seqlen) -> (d_inner * 2, batch, seqlen) -> (batch, d_inner * 2, seqlen)\n        if self.in_proj.bias is not None:\n            xz = xz + rearrange(self.in_proj.bias.to(dtype=xz.dtype), \"d -> d 1\")\n\n        A = -torch.exp(self.A_log.float())  # (d_inner, d_state). always have negative values. \n        ### DELETED: Actually not used in this experiment since we should control the usage of timevariant dt,B,C\n        # # In the backward pass we write dx and dz next to each other to avoid torch.cat\n        # if self.use_fast_path and causal_conv1d_fn is not None and inference_params is None:  # Doesn't support outputting the states\n        #     out = mamba_inner_fn(\n        #         xz,\n        #         self.conv1d.weight,\n        #         self.conv1d.bias,\n        #         self.x_proj.weight,\n        #         self.dt_proj.weight,\n        #         self.out_proj.weight,\n        #         self.out_proj.bias,\n        #         A,\n        #         None,  # input-dependent B\n        #         None,  # input-dependent C\n        #         self.D,\n        #         delta_bias=self.dt_proj.bias.float(),\n        #         delta_softplus=True,\n        #     )\n        # else:\n        x, z = xz.chunk(2, dim=1)  # (batch, d_inner, seqlen), (batch, d_inner, seqlen)\n        # Compute short convolution\n        if conv_state is not None:\n            # If we just take x[:, :, -self.d_conv :], it will error if seqlen < self.d_conv\n            # Instead F.pad will pad with zeros if seqlen < self.d_conv, and truncate otherwise.\n            if self.d_conv > 0:\n                conv_state.copy_(F.pad(x, (self.d_conv - x.shape[-1], 0)))  # Update state (B D W)\n        \n        ### MODIFIED: use causal_conv if available\n        if (causal_conv1d_fn is None) or (self.d_conv not in [2, 3, 4]):\n            x = self.act(self.conv1d(x)[..., :seqlen])\n        else:\n            assert self.activation in [\"silu\", \"swish\"]\n            x = causal_conv1d_fn(\n                x=x,\n                weight=rearrange(self.conv1d.weight, \"d 1 w -> d w\"),\n                bias=self.conv1d.bias,\n                activation=self.activation,\n            )  # (batch, d_inner, seqlen)\n\n        # We're careful here about the layout, to avoid extra transposes.\n        # We want dt to have d as the slowest moving dimension\n        # and L as the fastest moving dimension, since those are what the ssm_scan kernel expects.\n        ### MODIFIED: x_proj is now optional and only used if either timevariant dt, B, or C is True\n        if self.x_proj is not None:\n            x_dbl = self.x_proj(rearrange(x, \"b d l -> (b l) d\"))  # (batch, d_inner, seqlen) -> (batch * seqlen, d_inner) -> (batch * seqlen, ...) depending on timevariant flags\n            dt, B, C = torch.split(x_dbl, self.tv_proj_dim, dim=-1)  # (batch * seqlen, dt_rank), (batch * seqlen, d_state), (batch * seqlen, d_state) if enabled\n        \n        ### MODIFIED: dt, B, C are now set based on each timevariant flags\n        # If timevariant dt is False, we use a constant dt, which will be set in delta_bias parameter. Thus, we don't need to compute dt here.\n        if not self.tv_dt:\n            dt = torch.zeros(batch, self.d_inner, seqlen, device=self.dt_proj.bias.device, dtype=self.dt_proj.bias.dtype)  # (batch, d_inner, seqlen)\n        else:\n            dt = self.dt_proj.weight @ dt.t()  # (d_inner, d_rank) @ (d_rank, batch * seqlen) -> (d_inner, batch * seqlen)\n            dt = rearrange(dt, \"d (b l) -> b d l\", l=seqlen)  # (batch, d_inner, seqlen)\n        # if timevariant B is False, we use a constant B, which is defined in __init__.\n        if not self.tv_B:\n            B = self.B  # (d_inner, d_state)\n        else:\n            B = rearrange(B, \"(b l) dstate -> b dstate l\", l=seqlen).contiguous()  # (b, dstate, l)\n        # if timevariant C is False, we use a constant C, which is defined in __init__.\n        if not self.tv_C:\n            C = self.C  # (d_inner, d_state)\n        else:\n            C = rearrange(C, \"(b l) dstate -> b dstate l\", l=seqlen).contiguous()  # (b, dstate, l)\n\n\n        assert self.activation in [\"silu\", \"swish\"]\n        y = selective_scan_fn(\n            x,\n            dt,\n            A,\n            B,\n            C,\n            self.D,\n            z=z,\n            delta_bias=self.dt_proj.bias.float(),\n            delta_softplus=True,\n            return_last_state=ssm_state is not None,\n        )\n        if ssm_state is not None:\n            y, last_state = y\n            ssm_state.copy_(last_state)\n        y = rearrange(y, \"b d l -> b l d\")\n        out = self.out_proj(y)\n        \n        return out\n\n    def step(self, hidden_states, conv_state, ssm_state):\n        dtype = hidden_states.dtype\n        assert hidden_states.shape[1] == 1, \"Only support decoding with 1 token at a time for now\"\n        xz = self.in_proj(hidden_states.squeeze(1))  # (batch, d_inner * 2)\n        x, z = xz.chunk(2, dim=-1)  # (batch, d_inner), (batch, d_inner)\n\n        # Conv step\n        if self.d_conv == 0:\n            x = self.act(x).to(dtype=dtype)\n        elif (causal_conv1d_update is None) or (self.d_conv not in [2, 3, 4]):\n            conv_state.copy_(torch.roll(conv_state, shifts=-1, dims=-1))  # Update state (B D W)\n            conv_state[:, :, -1] = x\n            x = torch.sum(conv_state * rearrange(self.conv1d.weight, \"d 1 w -> d w\"), dim=-1)  # (B D)\n            if self.conv1d.bias is not None:\n                x = x + self.conv1d.bias\n            x = self.act(x).to(dtype=dtype)\n        else:\n            x = causal_conv1d_update(\n                x,\n                conv_state,\n                rearrange(self.conv1d.weight, \"d 1 w -> d w\"),\n                self.conv1d.bias,\n                self.activation,\n            )\n\n        if self.x_proj is not None:\n            x_db = self.x_proj(x)  # (B, d_inner) -> (B, dt_rank + d_state + d_state)\n            dt, B, C = torch.split(x_db, self.tv_proj_dim, dim=-1)  # (B, dt_rank), (B, d_state), (B, d_state)\n\n        # SSM step\n        ### DELETED: selective_state_update function does not support the use of timevariant dt, B, C.\n        # if selective_state_update is None:\n        #     dt = F.softplus(dt + self.dt_proj.bias.to(dtype=dt.dtype))\n        #     dA = torch.exp(torch.einsum(\"bd,dn->bdn\", dt, A))\n        #     dB = torch.einsum(\"bd,bn->bdn\", dt, B)\n        #     ssm_state.copy_(ssm_state * dA + rearrange(x, \"b d -> b d 1\") * dB)\n        #     y = torch.einsum(\"bdn,bn->bd\", ssm_state.to(dtype), C)\n        #     y = y + self.D.to(dtype) * x\n        #     y = y * self.act(z)  # (B D)\n        # else:\n        #     y = selective_state_update(\n        #         ssm_state, x, dt, A, B, C, self.D, z=z, dt_bias=self.dt_proj.bias, dt_softplus=True\n        #     )\n\n        ### MODIFIED: dt, B are now set based on the timevariant flags.\n        if not self.tv_dt:\n            dt = F.softplus(self.dt_proj.bias.to(dtype=x.dtype))\n            dt = repeat(dt, \"d -> b d\", b=x.shape[0])  # (B, d_inner)\n        else:\n            dt = F.linear(dt, self.dt_proj.weight)  # (B, dt_rank) @ (dt_rank, d_inner) -> (B, d_inner)\n            dt = F.softplus(dt + self.dt_proj.bias.to(dtype=dt.dtype))  # (B, d_inner)\n        \n        if not self.tv_B:\n            dB = torch.einsum(\"bd,dn->bdn\", dt, self.B)  # (B, d_inner, d_state)\n        else:\n            dB = torch.einsum(\"bd,bn->bdn\", dt, B)  # (B, d_inner, d_state)\n        \n        A = -torch.exp(self.A_log.float())  # (d_inner, d_state)\n        dA = torch.exp(torch.einsum(\"bd,dn->bdn\", dt, A))\n        ssm_state.copy_(ssm_state * dA + rearrange(x, \"b d -> b d 1\") * dB)  # (B, d_inner, d_state)\n        \n        ### MODIFIED: C is now set based on the timevariant flags.\n        if not self.tv_C:\n            y = torch.einsum(\"bdn,dn->bd\", ssm_state.to(dtype), self.C)  # (B, d_inner, d_state) @ (d_inner, d_state) -> (B, d_inner)\n        else:\n            y = torch.einsum(\"bdn,bn->bd\", ssm_state.to(dtype), C)  # (B, d_inner, d_state) @ (B, d_state) -> (B, d_inner)\n\n        ### MODIFIED: skip connection is now applied based on the use_D flag.\n        if self.D is not None:\n            y = y + self.D.to(dtype) * x  # (B, d_inner) + (d_inner) * (B, d_inner) -> (B, d_inner)\n\n        y = y * self.act(z)  # (B, d_inner)\n\n        out = self.out_proj(y)  # (B, d_inner) -> (B, d_output)\n        return out.unsqueeze(1), conv_state, ssm_state\n\n    def allocate_inference_cache(self, batch_size, max_seqlen, dtype=None, **kwargs):\n        device = self.out_proj.weight.device\n        conv_dtype = (self.conv1d.weight.dtype if hasattr(self.conv1d, \"weight\") else self.in_proj.weight.dtype) if dtype is None else dtype\n        conv_state = torch.zeros(\n            batch_size, self.d_model * self.expand, self.d_conv, device=device, dtype=conv_dtype\n        )\n        ssm_dtype = self.dt_proj.weight.dtype if dtype is None else dtype\n        # ssm_dtype = torch.float32\n        ssm_state = torch.zeros(\n            batch_size, self.d_model * self.expand, self.d_state, device=device, dtype=ssm_dtype\n        )\n        return conv_state, ssm_state\n\n    def _get_states_from_cache(self, inference_params, batch_size, initialize_states=False):\n        assert self.layer_idx is not None\n        if self.layer_idx not in inference_params.key_value_memory_dict:\n            batch_shape = (batch_size,)\n            conv_state = torch.zeros(\n                batch_size,\n                self.d_model * self.expand,\n                self.d_conv,\n                device=(self.conv1d.weight.device if hasattr(self.conv1d, \"weight\") else self.in_proj.weight.device),\n                dtype=(self.conv1d.weight.dtype if hasattr(self.conv1d, \"weight\") else self.in_proj.weight.dtype),\n            )\n            ssm_state = torch.zeros(\n                batch_size,\n                self.d_model * self.expand,\n                self.d_state,\n                device=self.dt_proj.weight.device,\n                dtype=self.dt_proj.weight.dtype,\n                # dtype=torch.float32,\n            )\n            inference_params.key_value_memory_dict[self.layer_idx] = (conv_state, ssm_state)\n        else:\n            conv_state, ssm_state = inference_params.key_value_memory_dict[self.layer_idx]\n            # TODO: What if batch size changes between generation, and we reuse the same states?\n            if initialize_states:\n                conv_state.zero_()\n                ssm_state.zero_()\n        return conv_state, ssm_state"
  },
  {
    "path": "layers/MultiWaveletCorrelation.py",
    "content": "import torch\nimport numpy as np\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch import Tensor\nfrom typing import List, Tuple\nimport math\nfrom functools import partial\nfrom torch import nn, einsum, diagonal\nfrom math import log2, ceil\nimport pdb\nfrom sympy import Poly, legendre, Symbol, chebyshevt\nfrom scipy.special import eval_legendre\n\n\ndef legendreDer(k, x):\n    def _legendre(k, x):\n        return (2 * k + 1) * eval_legendre(k, x)\n\n    out = 0\n    for i in np.arange(k - 1, -1, -2):\n        out += _legendre(i, x)\n    return out\n\n\ndef phi_(phi_c, x, lb=0, ub=1):\n    mask = np.logical_or(x < lb, x > ub) * 1.0\n    return np.polynomial.polynomial.Polynomial(phi_c)(x) * (1 - mask)\n\n\ndef get_phi_psi(k, base):\n    x = Symbol('x')\n    phi_coeff = np.zeros((k, k))\n    phi_2x_coeff = np.zeros((k, k))\n    if base == 'legendre':\n        for ki in range(k):\n            coeff_ = Poly(legendre(ki, 2 * x - 1), x).all_coeffs()\n            phi_coeff[ki, :ki + 1] = np.flip(np.sqrt(2 * ki + 1) * np.array(coeff_).astype(np.float64))\n            coeff_ = Poly(legendre(ki, 4 * x - 1), x).all_coeffs()\n            phi_2x_coeff[ki, :ki + 1] = np.flip(np.sqrt(2) * np.sqrt(2 * ki + 1) * np.array(coeff_).astype(np.float64))\n\n        psi1_coeff = np.zeros((k, k))\n        psi2_coeff = np.zeros((k, k))\n        for ki in range(k):\n            psi1_coeff[ki, :] = phi_2x_coeff[ki, :]\n            for i in range(k):\n                a = phi_2x_coeff[ki, :ki + 1]\n                b = phi_coeff[i, :i + 1]\n                prod_ = np.convolve(a, b)\n                prod_[np.abs(prod_) < 1e-8] = 0\n                proj_ = (prod_ * 1 / (np.arange(len(prod_)) + 1) * np.power(0.5, 1 + np.arange(len(prod_)))).sum()\n                psi1_coeff[ki, :] -= proj_ * phi_coeff[i, :]\n                psi2_coeff[ki, :] -= proj_ * phi_coeff[i, :]\n            for j in range(ki):\n                a = phi_2x_coeff[ki, :ki + 1]\n                b = psi1_coeff[j, :]\n                prod_ = np.convolve(a, b)\n                prod_[np.abs(prod_) < 1e-8] = 0\n                proj_ = (prod_ * 1 / (np.arange(len(prod_)) + 1) * np.power(0.5, 1 + np.arange(len(prod_)))).sum()\n                psi1_coeff[ki, :] -= proj_ * psi1_coeff[j, :]\n                psi2_coeff[ki, :] -= proj_ * psi2_coeff[j, :]\n\n            a = psi1_coeff[ki, :]\n            prod_ = np.convolve(a, a)\n            prod_[np.abs(prod_) < 1e-8] = 0\n            norm1 = (prod_ * 1 / (np.arange(len(prod_)) + 1) * np.power(0.5, 1 + np.arange(len(prod_)))).sum()\n\n            a = psi2_coeff[ki, :]\n            prod_ = np.convolve(a, a)\n            prod_[np.abs(prod_) < 1e-8] = 0\n            norm2 = (prod_ * 1 / (np.arange(len(prod_)) + 1) * (1 - np.power(0.5, 1 + np.arange(len(prod_))))).sum()\n            norm_ = np.sqrt(norm1 + norm2)\n            psi1_coeff[ki, :] /= norm_\n            psi2_coeff[ki, :] /= norm_\n            psi1_coeff[np.abs(psi1_coeff) < 1e-8] = 0\n            psi2_coeff[np.abs(psi2_coeff) < 1e-8] = 0\n\n        phi = [np.poly1d(np.flip(phi_coeff[i, :])) for i in range(k)]\n        psi1 = [np.poly1d(np.flip(psi1_coeff[i, :])) for i in range(k)]\n        psi2 = [np.poly1d(np.flip(psi2_coeff[i, :])) for i in range(k)]\n\n    elif base == 'chebyshev':\n        for ki in range(k):\n            if ki == 0:\n                phi_coeff[ki, :ki + 1] = np.sqrt(2 / np.pi)\n                phi_2x_coeff[ki, :ki + 1] = np.sqrt(2 / np.pi) * np.sqrt(2)\n            else:\n                coeff_ = Poly(chebyshevt(ki, 2 * x - 1), x).all_coeffs()\n                phi_coeff[ki, :ki + 1] = np.flip(2 / np.sqrt(np.pi) * np.array(coeff_).astype(np.float64))\n                coeff_ = Poly(chebyshevt(ki, 4 * x - 1), x).all_coeffs()\n                phi_2x_coeff[ki, :ki + 1] = np.flip(\n                    np.sqrt(2) * 2 / np.sqrt(np.pi) * np.array(coeff_).astype(np.float64))\n\n        phi = [partial(phi_, phi_coeff[i, :]) for i in range(k)]\n\n        x = Symbol('x')\n        kUse = 2 * k\n        roots = Poly(chebyshevt(kUse, 2 * x - 1)).all_roots()\n        x_m = np.array([rt.evalf(20) for rt in roots]).astype(np.float64)\n        # x_m[x_m==0.5] = 0.5 + 1e-8 # add small noise to avoid the case of 0.5 belonging to both phi(2x) and phi(2x-1)\n        # not needed for our purpose here, we use even k always to avoid\n        wm = np.pi / kUse / 2\n\n        psi1_coeff = np.zeros((k, k))\n        psi2_coeff = np.zeros((k, k))\n\n        psi1 = [[] for _ in range(k)]\n        psi2 = [[] for _ in range(k)]\n\n        for ki in range(k):\n            psi1_coeff[ki, :] = phi_2x_coeff[ki, :]\n            for i in range(k):\n                proj_ = (wm * phi[i](x_m) * np.sqrt(2) * phi[ki](2 * x_m)).sum()\n                psi1_coeff[ki, :] -= proj_ * phi_coeff[i, :]\n                psi2_coeff[ki, :] -= proj_ * phi_coeff[i, :]\n\n            for j in range(ki):\n                proj_ = (wm * psi1[j](x_m) * np.sqrt(2) * phi[ki](2 * x_m)).sum()\n                psi1_coeff[ki, :] -= proj_ * psi1_coeff[j, :]\n                psi2_coeff[ki, :] -= proj_ * psi2_coeff[j, :]\n\n            psi1[ki] = partial(phi_, psi1_coeff[ki, :], lb=0, ub=0.5)\n            psi2[ki] = partial(phi_, psi2_coeff[ki, :], lb=0.5, ub=1)\n\n            norm1 = (wm * psi1[ki](x_m) * psi1[ki](x_m)).sum()\n            norm2 = (wm * psi2[ki](x_m) * psi2[ki](x_m)).sum()\n\n            norm_ = np.sqrt(norm1 + norm2)\n            psi1_coeff[ki, :] /= norm_\n            psi2_coeff[ki, :] /= norm_\n            psi1_coeff[np.abs(psi1_coeff) < 1e-8] = 0\n            psi2_coeff[np.abs(psi2_coeff) < 1e-8] = 0\n\n            psi1[ki] = partial(phi_, psi1_coeff[ki, :], lb=0, ub=0.5 + 1e-16)\n            psi2[ki] = partial(phi_, psi2_coeff[ki, :], lb=0.5 + 1e-16, ub=1)\n\n    return phi, psi1, psi2\n\n\ndef get_filter(base, k):\n    def psi(psi1, psi2, i, inp):\n        mask = (inp <= 0.5) * 1.0\n        return psi1[i](inp) * mask + psi2[i](inp) * (1 - mask)\n\n    if base not in ['legendre', 'chebyshev']:\n        raise Exception('Base not supported')\n\n    x = Symbol('x')\n    H0 = np.zeros((k, k))\n    H1 = np.zeros((k, k))\n    G0 = np.zeros((k, k))\n    G1 = np.zeros((k, k))\n    PHI0 = np.zeros((k, k))\n    PHI1 = np.zeros((k, k))\n    phi, psi1, psi2 = get_phi_psi(k, base)\n    if base == 'legendre':\n        roots = Poly(legendre(k, 2 * x - 1)).all_roots()\n        x_m = np.array([rt.evalf(20) for rt in roots]).astype(np.float64)\n        wm = 1 / k / legendreDer(k, 2 * x_m - 1) / eval_legendre(k - 1, 2 * x_m - 1)\n\n        for ki in range(k):\n            for kpi in range(k):\n                H0[ki, kpi] = 1 / np.sqrt(2) * (wm * phi[ki](x_m / 2) * phi[kpi](x_m)).sum()\n                G0[ki, kpi] = 1 / np.sqrt(2) * (wm * psi(psi1, psi2, ki, x_m / 2) * phi[kpi](x_m)).sum()\n                H1[ki, kpi] = 1 / np.sqrt(2) * (wm * phi[ki]((x_m + 1) / 2) * phi[kpi](x_m)).sum()\n                G1[ki, kpi] = 1 / np.sqrt(2) * (wm * psi(psi1, psi2, ki, (x_m + 1) / 2) * phi[kpi](x_m)).sum()\n\n        PHI0 = np.eye(k)\n        PHI1 = np.eye(k)\n\n    elif base == 'chebyshev':\n        x = Symbol('x')\n        kUse = 2 * k\n        roots = Poly(chebyshevt(kUse, 2 * x - 1)).all_roots()\n        x_m = np.array([rt.evalf(20) for rt in roots]).astype(np.float64)\n        # x_m[x_m==0.5] = 0.5 + 1e-8 # add small noise to avoid the case of 0.5 belonging to both phi(2x) and phi(2x-1)\n        # not needed for our purpose here, we use even k always to avoid\n        wm = np.pi / kUse / 2\n\n        for ki in range(k):\n            for kpi in range(k):\n                H0[ki, kpi] = 1 / np.sqrt(2) * (wm * phi[ki](x_m / 2) * phi[kpi](x_m)).sum()\n                G0[ki, kpi] = 1 / np.sqrt(2) * (wm * psi(psi1, psi2, ki, x_m / 2) * phi[kpi](x_m)).sum()\n                H1[ki, kpi] = 1 / np.sqrt(2) * (wm * phi[ki]((x_m + 1) / 2) * phi[kpi](x_m)).sum()\n                G1[ki, kpi] = 1 / np.sqrt(2) * (wm * psi(psi1, psi2, ki, (x_m + 1) / 2) * phi[kpi](x_m)).sum()\n\n                PHI0[ki, kpi] = (wm * phi[ki](2 * x_m) * phi[kpi](2 * x_m)).sum() * 2\n                PHI1[ki, kpi] = (wm * phi[ki](2 * x_m - 1) * phi[kpi](2 * x_m - 1)).sum() * 2\n\n        PHI0[np.abs(PHI0) < 1e-8] = 0\n        PHI1[np.abs(PHI1) < 1e-8] = 0\n\n    H0[np.abs(H0) < 1e-8] = 0\n    H1[np.abs(H1) < 1e-8] = 0\n    G0[np.abs(G0) < 1e-8] = 0\n    G1[np.abs(G1) < 1e-8] = 0\n\n    return H0, H1, G0, G1, PHI0, PHI1\n\n\nclass MultiWaveletTransform(nn.Module):\n    \"\"\"\n    1D multiwavelet block.\n    \"\"\"\n\n    def __init__(self, ich=1, k=8, alpha=16, c=128,\n                 nCZ=1, L=0, base='legendre', attention_dropout=0.1):\n        super(MultiWaveletTransform, self).__init__()\n        print('base', base)\n        self.k = k\n        self.c = c\n        self.L = L\n        self.nCZ = nCZ\n        self.Lk0 = nn.Linear(ich, c * k)\n        self.Lk1 = nn.Linear(c * k, ich)\n        self.ich = ich\n        self.MWT_CZ = nn.ModuleList(MWT_CZ1d(k, alpha, L, c, base) for i in range(nCZ))\n\n    def forward(self, queries, keys, values, attn_mask):\n        B, L, H, E = queries.shape\n        _, S, _, D = values.shape\n        if L > S:\n            zeros = torch.zeros_like(queries[:, :(L - S), :]).float()\n            values = torch.cat([values, zeros], dim=1)\n            keys = torch.cat([keys, zeros], dim=1)\n        else:\n            values = values[:, :L, :, :]\n            keys = keys[:, :L, :, :]\n        values = values.view(B, L, -1)\n\n        V = self.Lk0(values).view(B, L, self.c, -1)\n        for i in range(self.nCZ):\n            V = self.MWT_CZ[i](V)\n            if i < self.nCZ - 1:\n                V = F.relu(V)\n\n        V = self.Lk1(V.view(B, L, -1))\n        V = V.view(B, L, -1, D)\n        return (V.contiguous(), None)\n\n\nclass MultiWaveletCross(nn.Module):\n    \"\"\"\n    1D Multiwavelet Cross Attention layer.\n    \"\"\"\n\n    def __init__(self, in_channels, out_channels, seq_len_q, seq_len_kv, modes, c=64,\n                 k=8, ich=512,\n                 L=0,\n                 base='legendre',\n                 mode_select_method='random',\n                 initializer=None, activation='tanh',\n                 **kwargs):\n        super(MultiWaveletCross, self).__init__()\n        print('base', base)\n\n        self.c = c\n        self.k = k\n        self.L = L\n        H0, H1, G0, G1, PHI0, PHI1 = get_filter(base, k)\n        H0r = H0 @ PHI0\n        G0r = G0 @ PHI0\n        H1r = H1 @ PHI1\n        G1r = G1 @ PHI1\n\n        H0r[np.abs(H0r) < 1e-8] = 0\n        H1r[np.abs(H1r) < 1e-8] = 0\n        G0r[np.abs(G0r) < 1e-8] = 0\n        G1r[np.abs(G1r) < 1e-8] = 0\n        self.max_item = 3\n\n        self.attn1 = FourierCrossAttentionW(in_channels=in_channels, out_channels=out_channels, seq_len_q=seq_len_q,\n                                            seq_len_kv=seq_len_kv, modes=modes, activation=activation,\n                                            mode_select_method=mode_select_method)\n        self.attn2 = FourierCrossAttentionW(in_channels=in_channels, out_channels=out_channels, seq_len_q=seq_len_q,\n                                            seq_len_kv=seq_len_kv, modes=modes, activation=activation,\n                                            mode_select_method=mode_select_method)\n        self.attn3 = FourierCrossAttentionW(in_channels=in_channels, out_channels=out_channels, seq_len_q=seq_len_q,\n                                            seq_len_kv=seq_len_kv, modes=modes, activation=activation,\n                                            mode_select_method=mode_select_method)\n        self.attn4 = FourierCrossAttentionW(in_channels=in_channels, out_channels=out_channels, seq_len_q=seq_len_q,\n                                            seq_len_kv=seq_len_kv, modes=modes, activation=activation,\n                                            mode_select_method=mode_select_method)\n        self.T0 = nn.Linear(k, k)\n        self.register_buffer('ec_s', torch.Tensor(\n            np.concatenate((H0.T, H1.T), axis=0)))\n        self.register_buffer('ec_d', torch.Tensor(\n            np.concatenate((G0.T, G1.T), axis=0)))\n\n        self.register_buffer('rc_e', torch.Tensor(\n            np.concatenate((H0r, G0r), axis=0)))\n        self.register_buffer('rc_o', torch.Tensor(\n            np.concatenate((H1r, G1r), axis=0)))\n\n        self.Lk = nn.Linear(ich, c * k)\n        self.Lq = nn.Linear(ich, c * k)\n        self.Lv = nn.Linear(ich, c * k)\n        self.out = nn.Linear(c * k, ich)\n        self.modes1 = modes\n\n    def forward(self, q, k, v, mask=None):\n        B, N, H, E = q.shape  # (B, N, H, E) torch.Size([3, 768, 8, 2])\n        _, S, _, _ = k.shape  # (B, S, H, E) torch.Size([3, 96, 8, 2])\n\n        q = q.view(q.shape[0], q.shape[1], -1)\n        k = k.view(k.shape[0], k.shape[1], -1)\n        v = v.view(v.shape[0], v.shape[1], -1)\n        q = self.Lq(q)\n        q = q.view(q.shape[0], q.shape[1], self.c, self.k)\n        k = self.Lk(k)\n        k = k.view(k.shape[0], k.shape[1], self.c, self.k)\n        v = self.Lv(v)\n        v = v.view(v.shape[0], v.shape[1], self.c, self.k)\n\n        if N > S:\n            zeros = torch.zeros_like(q[:, :(N - S), :]).float()\n            v = torch.cat([v, zeros], dim=1)\n            k = torch.cat([k, zeros], dim=1)\n        else:\n            v = v[:, :N, :, :]\n            k = k[:, :N, :, :]\n\n        ns = math.floor(np.log2(N))\n        nl = pow(2, math.ceil(np.log2(N)))\n        extra_q = q[:, 0:nl - N, :, :]\n        extra_k = k[:, 0:nl - N, :, :]\n        extra_v = v[:, 0:nl - N, :, :]\n        q = torch.cat([q, extra_q], 1)\n        k = torch.cat([k, extra_k], 1)\n        v = torch.cat([v, extra_v], 1)\n\n        Ud_q = torch.jit.annotate(List[Tuple[Tensor]], [])\n        Ud_k = torch.jit.annotate(List[Tuple[Tensor]], [])\n        Ud_v = torch.jit.annotate(List[Tuple[Tensor]], [])\n\n        Us_q = torch.jit.annotate(List[Tensor], [])\n        Us_k = torch.jit.annotate(List[Tensor], [])\n        Us_v = torch.jit.annotate(List[Tensor], [])\n\n        Ud = torch.jit.annotate(List[Tensor], [])\n        Us = torch.jit.annotate(List[Tensor], [])\n\n        # decompose\n        for i in range(ns - self.L):\n            # print('q shape',q.shape)\n            d, q = self.wavelet_transform(q)\n            Ud_q += [tuple([d, q])]\n            Us_q += [d]\n        for i in range(ns - self.L):\n            d, k = self.wavelet_transform(k)\n            Ud_k += [tuple([d, k])]\n            Us_k += [d]\n        for i in range(ns - self.L):\n            d, v = self.wavelet_transform(v)\n            Ud_v += [tuple([d, v])]\n            Us_v += [d]\n        for i in range(ns - self.L):\n            dk, sk = Ud_k[i], Us_k[i]\n            dq, sq = Ud_q[i], Us_q[i]\n            dv, sv = Ud_v[i], Us_v[i]\n            Ud += [self.attn1(dq[0], dk[0], dv[0], mask)[0] + self.attn2(dq[1], dk[1], dv[1], mask)[0]]\n            Us += [self.attn3(sq, sk, sv, mask)[0]]\n        v = self.attn4(q, k, v, mask)[0]\n\n        # reconstruct\n        for i in range(ns - 1 - self.L, -1, -1):\n            v = v + Us[i]\n            v = torch.cat((v, Ud[i]), -1)\n            v = self.evenOdd(v)\n        v = self.out(v[:, :N, :, :].contiguous().view(B, N, -1))\n        return (v.contiguous(), None)\n\n    def wavelet_transform(self, x):\n        xa = torch.cat([x[:, ::2, :, :],\n                        x[:, 1::2, :, :],\n                        ], -1)\n        d = torch.matmul(xa, self.ec_d)\n        s = torch.matmul(xa, self.ec_s)\n        return d, s\n\n    def evenOdd(self, x):\n        B, N, c, ich = x.shape  # (B, N, c, k)\n        assert ich == 2 * self.k\n        x_e = torch.matmul(x, self.rc_e)\n        x_o = torch.matmul(x, self.rc_o)\n\n        x = torch.zeros(B, N * 2, c, self.k,\n                        device=x.device)\n        x[..., ::2, :, :] = x_e\n        x[..., 1::2, :, :] = x_o\n        return x\n\n\nclass FourierCrossAttentionW(nn.Module):\n    def __init__(self, in_channels, out_channels, seq_len_q, seq_len_kv, modes=16, activation='tanh',\n                 mode_select_method='random'):\n        super(FourierCrossAttentionW, self).__init__()\n        print('corss fourier correlation used!')\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.modes1 = modes\n        self.activation = activation\n\n    def compl_mul1d(self, order, x, weights):\n        x_flag = True\n        w_flag = True\n        if not torch.is_complex(x):\n            x_flag = False\n            x = torch.complex(x, torch.zeros_like(x).to(x.device))\n        if not torch.is_complex(weights):\n            w_flag = False\n            weights = torch.complex(weights, torch.zeros_like(weights).to(weights.device))\n        if x_flag or w_flag:\n            return torch.complex(torch.einsum(order, x.real, weights.real) - torch.einsum(order, x.imag, weights.imag),\n                                 torch.einsum(order, x.real, weights.imag) + torch.einsum(order, x.imag, weights.real))\n        else:\n            return torch.einsum(order, x.real, weights.real)\n\n    def forward(self, q, k, v, mask):\n        B, L, E, H = q.shape\n\n        xq = q.permute(0, 3, 2, 1)  # size = [B, H, E, L] torch.Size([3, 8, 64, 512])\n        xk = k.permute(0, 3, 2, 1)\n        xv = v.permute(0, 3, 2, 1)\n        self.index_q = list(range(0, min(int(L // 2), self.modes1)))\n        self.index_k_v = list(range(0, min(int(xv.shape[3] // 2), self.modes1)))\n\n        # Compute Fourier coefficients\n        xq_ft_ = torch.zeros(B, H, E, len(self.index_q), device=xq.device, dtype=torch.cfloat)\n        xq_ft = torch.fft.rfft(xq, dim=-1)\n        for i, j in enumerate(self.index_q):\n            xq_ft_[:, :, :, i] = xq_ft[:, :, :, j]\n\n        xk_ft_ = torch.zeros(B, H, E, len(self.index_k_v), device=xq.device, dtype=torch.cfloat)\n        xk_ft = torch.fft.rfft(xk, dim=-1)\n        for i, j in enumerate(self.index_k_v):\n            xk_ft_[:, :, :, i] = xk_ft[:, :, :, j]\n        xqk_ft = (self.compl_mul1d(\"bhex,bhey->bhxy\", xq_ft_, xk_ft_))\n        if self.activation == 'tanh':\n            xqk_ft = torch.complex(xqk_ft.real.tanh(), xqk_ft.imag.tanh())\n        elif self.activation == 'softmax':\n            xqk_ft = torch.softmax(abs(xqk_ft), dim=-1)\n            xqk_ft = torch.complex(xqk_ft, torch.zeros_like(xqk_ft))\n        else:\n            raise Exception('{} actiation function is not implemented'.format(self.activation))\n        xqkv_ft = self.compl_mul1d(\"bhxy,bhey->bhex\", xqk_ft, xk_ft_)\n\n        xqkvw = xqkv_ft\n        out_ft = torch.zeros(B, H, E, L // 2 + 1, device=xq.device, dtype=torch.cfloat)\n        for i, j in enumerate(self.index_q):\n            out_ft[:, :, :, j] = xqkvw[:, :, :, i]\n\n        out = torch.fft.irfft(out_ft / self.in_channels / self.out_channels, n=xq.size(-1)).permute(0, 3, 2, 1)\n        # size = [B, L, H, E]\n        return (out, None)\n\n\nclass sparseKernelFT1d(nn.Module):\n    def __init__(self,\n                 k, alpha, c=1,\n                 nl=1,\n                 initializer=None,\n                 **kwargs):\n        super(sparseKernelFT1d, self).__init__()\n\n        self.modes1 = alpha\n        self.scale = (1 / (c * k * c * k))\n        self.weights1 = nn.Parameter(self.scale * torch.rand(c * k, c * k, self.modes1, dtype=torch.float))\n        self.weights2 = nn.Parameter(self.scale * torch.rand(c * k, c * k, self.modes1, dtype=torch.float))\n        self.weights1.requires_grad = True\n        self.weights2.requires_grad = True\n        self.k = k\n\n    def compl_mul1d(self, order, x, weights):\n        x_flag = True\n        w_flag = True\n        if not torch.is_complex(x):\n            x_flag = False\n            x = torch.complex(x, torch.zeros_like(x).to(x.device))\n        if not torch.is_complex(weights):\n            w_flag = False\n            weights = torch.complex(weights, torch.zeros_like(weights).to(weights.device))\n        if x_flag or w_flag:\n            return torch.complex(torch.einsum(order, x.real, weights.real) - torch.einsum(order, x.imag, weights.imag),\n                                 torch.einsum(order, x.real, weights.imag) + torch.einsum(order, x.imag, weights.real))\n        else:\n            return torch.einsum(order, x.real, weights.real)\n\n    def forward(self, x):\n        B, N, c, k = x.shape  # (B, N, c, k)\n\n        x = x.view(B, N, -1)\n        x = x.permute(0, 2, 1)\n        x_fft = torch.fft.rfft(x)\n        # Multiply relevant Fourier modes\n        l = min(self.modes1, N // 2 + 1)\n        out_ft = torch.zeros(B, c * k, N // 2 + 1, device=x.device, dtype=torch.cfloat)\n        out_ft[:, :, :l] = self.compl_mul1d(\"bix,iox->box\", x_fft[:, :, :l],\n                                            torch.complex(self.weights1, self.weights2)[:, :, :l])\n        x = torch.fft.irfft(out_ft, n=N)\n        x = x.permute(0, 2, 1).view(B, N, c, k)\n        return x\n\n\n# ##\nclass MWT_CZ1d(nn.Module):\n    def __init__(self,\n                 k=3, alpha=64,\n                 L=0, c=1,\n                 base='legendre',\n                 initializer=None,\n                 **kwargs):\n        super(MWT_CZ1d, self).__init__()\n\n        self.k = k\n        self.L = L\n        H0, H1, G0, G1, PHI0, PHI1 = get_filter(base, k)\n        H0r = H0 @ PHI0\n        G0r = G0 @ PHI0\n        H1r = H1 @ PHI1\n        G1r = G1 @ PHI1\n\n        H0r[np.abs(H0r) < 1e-8] = 0\n        H1r[np.abs(H1r) < 1e-8] = 0\n        G0r[np.abs(G0r) < 1e-8] = 0\n        G1r[np.abs(G1r) < 1e-8] = 0\n        self.max_item = 3\n\n        self.A = sparseKernelFT1d(k, alpha, c)\n        self.B = sparseKernelFT1d(k, alpha, c)\n        self.C = sparseKernelFT1d(k, alpha, c)\n\n        self.T0 = nn.Linear(k, k)\n\n        self.register_buffer('ec_s', torch.Tensor(\n            np.concatenate((H0.T, H1.T), axis=0)))\n        self.register_buffer('ec_d', torch.Tensor(\n            np.concatenate((G0.T, G1.T), axis=0)))\n\n        self.register_buffer('rc_e', torch.Tensor(\n            np.concatenate((H0r, G0r), axis=0)))\n        self.register_buffer('rc_o', torch.Tensor(\n            np.concatenate((H1r, G1r), axis=0)))\n\n    def forward(self, x):\n        B, N, c, k = x.shape  # (B, N, k)\n        ns = math.floor(np.log2(N))\n        nl = pow(2, math.ceil(np.log2(N)))\n        extra_x = x[:, 0:nl - N, :, :]\n        x = torch.cat([x, extra_x], 1)\n        Ud = torch.jit.annotate(List[Tensor], [])\n        Us = torch.jit.annotate(List[Tensor], [])\n        for i in range(ns - self.L):\n            d, x = self.wavelet_transform(x)\n            Ud += [self.A(d) + self.B(x)]\n            Us += [self.C(d)]\n        x = self.T0(x)  # coarsest scale transform\n\n        #        reconstruct\n        for i in range(ns - 1 - self.L, -1, -1):\n            x = x + Us[i]\n            x = torch.cat((x, Ud[i]), -1)\n            x = self.evenOdd(x)\n        x = x[:, :N, :, :]\n\n        return x\n\n    def wavelet_transform(self, x):\n        xa = torch.cat([x[:, ::2, :, :],\n                        x[:, 1::2, :, :],\n                        ], -1)\n        d = torch.matmul(xa, self.ec_d)\n        s = torch.matmul(xa, self.ec_s)\n        return d, s\n\n    def evenOdd(self, x):\n\n        B, N, c, ich = x.shape  # (B, N, c, k)\n        assert ich == 2 * self.k\n        x_e = torch.matmul(x, self.rc_e)\n        x_o = torch.matmul(x, self.rc_o)\n\n        x = torch.zeros(B, N * 2, c, self.k,\n                        device=x.device)\n        x[..., ::2, :, :] = x_e\n        x[..., 1::2, :, :] = x_o\n        return x\n"
  },
  {
    "path": "layers/Pyraformer_EncDec.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.nn.modules.linear import Linear\nfrom layers.SelfAttention_Family import AttentionLayer, FullAttention\nfrom layers.Embed import DataEmbedding\nimport math\n\n\ndef get_mask(input_size, window_size, inner_size):\n    \"\"\"Get the attention mask of PAM-Naive\"\"\"\n    # Get the size of all layers\n    all_size = []\n    all_size.append(input_size)\n    for i in range(len(window_size)):\n        layer_size = math.floor(all_size[i] / window_size[i])\n        all_size.append(layer_size)\n\n    seq_length = sum(all_size)\n    mask = torch.zeros(seq_length, seq_length)\n\n    # get intra-scale mask\n    inner_window = inner_size // 2\n    for layer_idx in range(len(all_size)):\n        start = sum(all_size[:layer_idx])\n        for i in range(start, start + all_size[layer_idx]):\n            left_side = max(i - inner_window, start)\n            right_side = min(i + inner_window + 1, start + all_size[layer_idx])\n            mask[i, left_side:right_side] = 1\n\n    # get inter-scale mask\n    for layer_idx in range(1, len(all_size)):\n        start = sum(all_size[:layer_idx])\n        for i in range(start, start + all_size[layer_idx]):\n            left_side = (start - all_size[layer_idx - 1]) + \\\n                (i - start) * window_size[layer_idx - 1]\n            if i == (start + all_size[layer_idx] - 1):\n                right_side = start\n            else:\n                right_side = (\n                    start - all_size[layer_idx - 1]) + (i - start + 1) * window_size[layer_idx - 1]\n            mask[i, left_side:right_side] = 1\n            mask[left_side:right_side, i] = 1\n\n    mask = (1 - mask).bool()\n\n    return mask, all_size\n\n\ndef refer_points(all_sizes, window_size):\n    \"\"\"Gather features from PAM's pyramid sequences\"\"\"\n    input_size = all_sizes[0]\n    indexes = torch.zeros(input_size, len(all_sizes))\n\n    for i in range(input_size):\n        indexes[i][0] = i\n        former_index = i\n        for j in range(1, len(all_sizes)):\n            start = sum(all_sizes[:j])\n            inner_layer_idx = former_index - (start - all_sizes[j - 1])\n            former_index = start + \\\n                min(inner_layer_idx // window_size[j - 1], all_sizes[j] - 1)\n            indexes[i][j] = former_index\n\n    indexes = indexes.unsqueeze(0).unsqueeze(3)\n\n    return indexes.long()\n\n\nclass RegularMask():\n    def __init__(self, mask):\n        self._mask = mask.unsqueeze(1)\n\n    @property\n    def mask(self):\n        return self._mask\n\n\nclass EncoderLayer(nn.Module):\n    \"\"\" Compose with two layers \"\"\"\n\n    def __init__(self, d_model, d_inner, n_head, dropout=0.1, normalize_before=True):\n        super(EncoderLayer, self).__init__()\n\n        self.slf_attn = AttentionLayer(\n            FullAttention(mask_flag=True, factor=0,\n                          attention_dropout=dropout, output_attention=False),\n            d_model, n_head)\n        self.pos_ffn = PositionwiseFeedForward(\n            d_model, d_inner, dropout=dropout, normalize_before=normalize_before)\n\n    def forward(self, enc_input, slf_attn_mask=None):\n        attn_mask = RegularMask(slf_attn_mask)\n        enc_output, _ = self.slf_attn(\n            enc_input, enc_input, enc_input, attn_mask=attn_mask)\n        enc_output = self.pos_ffn(enc_output)\n        return enc_output\n\n\nclass Encoder(nn.Module):\n    \"\"\" A encoder model with self attention mechanism. \"\"\"\n\n    def __init__(self, configs, window_size, inner_size):\n        super().__init__()\n\n        d_bottleneck = configs.d_model//4\n\n        self.mask, self.all_size = get_mask(\n            configs.seq_len, window_size, inner_size)\n        self.indexes = refer_points(self.all_size, window_size)\n        self.layers = nn.ModuleList([\n            EncoderLayer(configs.d_model, configs.d_ff, configs.n_heads, dropout=configs.dropout,\n                         normalize_before=False) for _ in range(configs.e_layers)\n        ])  # naive pyramid attention\n\n        self.enc_embedding = DataEmbedding(\n            configs.enc_in, configs.d_model, configs.dropout)\n        self.conv_layers = Bottleneck_Construct(\n            configs.d_model, window_size, d_bottleneck)\n\n    def forward(self, x_enc, x_mark_enc):\n        seq_enc = self.enc_embedding(x_enc, x_mark_enc)\n\n        mask = self.mask.repeat(len(seq_enc), 1, 1).to(x_enc.device)\n        seq_enc = self.conv_layers(seq_enc)\n\n        for i in range(len(self.layers)):\n            seq_enc = self.layers[i](seq_enc, mask)\n\n        indexes = self.indexes.repeat(seq_enc.size(\n            0), 1, 1, seq_enc.size(2)).to(seq_enc.device)\n        indexes = indexes.view(seq_enc.size(0), -1, seq_enc.size(2))\n        all_enc = torch.gather(seq_enc, 1, indexes)\n        seq_enc = all_enc.view(seq_enc.size(0), self.all_size[0], -1)\n\n        return seq_enc\n\n\nclass ConvLayer(nn.Module):\n    def __init__(self, c_in, window_size):\n        super(ConvLayer, self).__init__()\n        self.downConv = nn.Conv1d(in_channels=c_in,\n                                  out_channels=c_in,\n                                  kernel_size=window_size,\n                                  stride=window_size)\n        self.norm = nn.BatchNorm1d(c_in)\n        self.activation = nn.ELU()\n\n    def forward(self, x):\n        x = self.downConv(x)\n        x = self.norm(x)\n        x = self.activation(x)\n        return x\n\n\nclass Bottleneck_Construct(nn.Module):\n    \"\"\"Bottleneck convolution CSCM\"\"\"\n\n    def __init__(self, d_model, window_size, d_inner):\n        super(Bottleneck_Construct, self).__init__()\n        if not isinstance(window_size, list):\n            self.conv_layers = nn.ModuleList([\n                ConvLayer(d_inner, window_size),\n                ConvLayer(d_inner, window_size),\n                ConvLayer(d_inner, window_size)\n            ])\n        else:\n            self.conv_layers = []\n            for i in range(len(window_size)):\n                self.conv_layers.append(ConvLayer(d_inner, window_size[i]))\n            self.conv_layers = nn.ModuleList(self.conv_layers)\n        self.up = Linear(d_inner, d_model)\n        self.down = Linear(d_model, d_inner)\n        self.norm = nn.LayerNorm(d_model)\n\n    def forward(self, enc_input):\n        temp_input = self.down(enc_input).permute(0, 2, 1)\n        all_inputs = []\n        for i in range(len(self.conv_layers)):\n            temp_input = self.conv_layers[i](temp_input)\n            all_inputs.append(temp_input)\n\n        all_inputs = torch.cat(all_inputs, dim=2).transpose(1, 2)\n        all_inputs = self.up(all_inputs)\n        all_inputs = torch.cat([enc_input, all_inputs], dim=1)\n\n        all_inputs = self.norm(all_inputs)\n        return all_inputs\n\n\nclass PositionwiseFeedForward(nn.Module):\n    \"\"\" Two-layer position-wise feed-forward neural network. \"\"\"\n\n    def __init__(self, d_in, d_hid, dropout=0.1, normalize_before=True):\n        super().__init__()\n\n        self.normalize_before = normalize_before\n\n        self.w_1 = nn.Linear(d_in, d_hid)\n        self.w_2 = nn.Linear(d_hid, d_in)\n\n        self.layer_norm = nn.LayerNorm(d_in, eps=1e-6)\n        self.dropout = nn.Dropout(dropout)\n\n    def forward(self, x):\n        residual = x\n        if self.normalize_before:\n            x = self.layer_norm(x)\n\n        x = F.gelu(self.w_1(x))\n        x = self.dropout(x)\n        x = self.w_2(x)\n        x = self.dropout(x)\n        x = x + residual\n\n        if not self.normalize_before:\n            x = self.layer_norm(x)\n        return x\n"
  },
  {
    "path": "layers/SelfAttention_Family.py",
    "content": "import torch\nimport torch.nn as nn\nimport numpy as np\nfrom math import sqrt\nfrom utils.masking import TriangularCausalMask, ProbMask\nfrom reformer_pytorch import LSHSelfAttention\nfrom einops import rearrange, repeat\n\n\nclass DSAttention(nn.Module):\n    '''De-stationary Attention'''\n\n    def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):\n        super(DSAttention, self).__init__()\n        self.scale = scale\n        self.mask_flag = mask_flag\n        self.output_attention = output_attention\n        self.dropout = nn.Dropout(attention_dropout)\n\n    def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):\n        B, L, H, E = queries.shape\n        _, S, _, D = values.shape\n        scale = self.scale or 1. / sqrt(E)\n\n        tau = 1.0 if tau is None else tau.unsqueeze(\n            1).unsqueeze(1)  # B x 1 x 1 x 1\n        delta = 0.0 if delta is None else delta.unsqueeze(\n            1).unsqueeze(1)  # B x 1 x 1 x S\n\n        # De-stationary Attention, rescaling pre-softmax score with learned de-stationary factors\n        scores = torch.einsum(\"blhe,bshe->bhls\", queries, keys) * tau + delta\n\n        if self.mask_flag:\n            if attn_mask is None:\n                attn_mask = TriangularCausalMask(B, L, device=queries.device)\n\n            scores.masked_fill_(attn_mask.mask, -np.inf)\n\n        A = self.dropout(torch.softmax(scale * scores, dim=-1))\n        V = torch.einsum(\"bhls,bshd->blhd\", A, values)\n\n        if self.output_attention:\n            return V.contiguous(), A\n        else:\n            return V.contiguous(), None\n\n\nclass FullAttention(nn.Module):\n    def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):\n        super(FullAttention, self).__init__()\n        self.scale = scale\n        self.mask_flag = mask_flag\n        self.output_attention = output_attention\n        self.dropout = nn.Dropout(attention_dropout)\n\n    def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):\n        B, L, H, E = queries.shape\n        _, S, _, D = values.shape\n        scale = self.scale or 1. / sqrt(E)\n\n        scores = torch.einsum(\"blhe,bshe->bhls\", queries, keys)\n\n        if self.mask_flag:\n            if attn_mask is None:\n                attn_mask = TriangularCausalMask(B, L, device=queries.device)\n\n            scores.masked_fill_(attn_mask.mask, -np.inf)\n\n        A = self.dropout(torch.softmax(scale * scores, dim=-1))\n        V = torch.einsum(\"bhls,bshd->blhd\", A, values)\n\n        if self.output_attention:\n            return V.contiguous(), A\n        else:\n            return V.contiguous(), None\n\n\nclass ProbAttention(nn.Module):\n    def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):\n        super(ProbAttention, self).__init__()\n        self.factor = factor\n        self.scale = scale\n        self.mask_flag = mask_flag\n        self.output_attention = output_attention\n        self.dropout = nn.Dropout(attention_dropout)\n\n    def _prob_QK(self, Q, K, sample_k, n_top):  # n_top: c*ln(L_q)\n        # Q [B, H, L, D]\n        B, H, L_K, E = K.shape\n        _, _, L_Q, _ = Q.shape\n\n        # calculate the sampled Q_K\n        K_expand = K.unsqueeze(-3).expand(B, H, L_Q, L_K, E)\n        # real U = U_part(factor*ln(L_k))*L_q\n        index_sample = torch.randint(L_K, (L_Q, sample_k))\n        K_sample = K_expand[:, :, torch.arange(\n            L_Q).unsqueeze(1), index_sample, :]\n        Q_K_sample = torch.matmul(\n            Q.unsqueeze(-2), K_sample.transpose(-2, -1)).squeeze()\n\n        # find the Top_k query with sparisty measurement\n        M = Q_K_sample.max(-1)[0] - torch.div(Q_K_sample.sum(-1), L_K)\n        M_top = M.topk(n_top, sorted=False)[1]\n\n        # use the reduced Q to calculate Q_K\n        Q_reduce = Q[torch.arange(B)[:, None, None],\n                   torch.arange(H)[None, :, None],\n                   M_top, :]  # factor*ln(L_q)\n        Q_K = torch.matmul(Q_reduce, K.transpose(-2, -1))  # factor*ln(L_q)*L_k\n\n        return Q_K, M_top\n\n    def _get_initial_context(self, V, L_Q):\n        B, H, L_V, D = V.shape\n        if not self.mask_flag:\n            # V_sum = V.sum(dim=-2)\n            V_sum = V.mean(dim=-2)\n            contex = V_sum.unsqueeze(-2).expand(B, H,\n                                                L_Q, V_sum.shape[-1]).clone()\n        else:  # use mask\n            # requires that L_Q == L_V, i.e. for self-attention only\n            assert (L_Q == L_V)\n            contex = V.cumsum(dim=-2)\n        return contex\n\n    def _update_context(self, context_in, V, scores, index, L_Q, attn_mask):\n        B, H, L_V, D = V.shape\n\n        if self.mask_flag:\n            attn_mask = ProbMask(B, H, L_Q, index, scores, device=V.device)\n            scores.masked_fill_(attn_mask.mask, -np.inf)\n\n        attn = torch.softmax(scores, dim=-1)  # nn.Softmax(dim=-1)(scores)\n\n        context_in[torch.arange(B)[:, None, None],\n        torch.arange(H)[None, :, None],\n        index, :] = torch.matmul(attn, V).type_as(context_in)\n        if self.output_attention:\n            attns = (torch.ones([B, H, L_V, L_V]) /\n                     L_V).type_as(attn).to(attn.device)\n            attns[torch.arange(B)[:, None, None], torch.arange(H)[\n                                                  None, :, None], index, :] = attn\n            return context_in, attns\n        else:\n            return context_in, None\n\n    def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):\n        B, L_Q, H, D = queries.shape\n        _, L_K, _, _ = keys.shape\n\n        queries = queries.transpose(2, 1)\n        keys = keys.transpose(2, 1)\n        values = values.transpose(2, 1)\n\n        U_part = self.factor * \\\n                 np.ceil(np.log(L_K)).astype('int').item()  # c*ln(L_k)\n        u = self.factor * \\\n            np.ceil(np.log(L_Q)).astype('int').item()  # c*ln(L_q)\n\n        U_part = U_part if U_part < L_K else L_K\n        u = u if u < L_Q else L_Q\n\n        scores_top, index = self._prob_QK(\n            queries, keys, sample_k=U_part, n_top=u)\n\n        # add scale factor\n        scale = self.scale or 1. / sqrt(D)\n        if scale is not None:\n            scores_top = scores_top * scale\n        # get the context\n        context = self._get_initial_context(values, L_Q)\n        # update the context with selected top_k queries\n        context, attn = self._update_context(\n            context, values, scores_top, index, L_Q, attn_mask)\n\n        return context.contiguous(), attn\n\n\nclass AttentionLayer(nn.Module):\n    def __init__(self, attention, d_model, n_heads, d_keys=None,\n                 d_values=None):\n        super(AttentionLayer, self).__init__()\n\n        d_keys = d_keys or (d_model // n_heads)\n        d_values = d_values or (d_model // n_heads)\n\n        self.inner_attention = attention\n        self.query_projection = nn.Linear(d_model, d_keys * n_heads)\n        self.key_projection = nn.Linear(d_model, d_keys * n_heads)\n        self.value_projection = nn.Linear(d_model, d_values * n_heads)\n        self.out_projection = nn.Linear(d_values * n_heads, d_model)\n        self.n_heads = n_heads\n\n    def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):\n        B, L, _ = queries.shape\n        _, S, _ = keys.shape\n        H = self.n_heads\n\n        queries = self.query_projection(queries).view(B, L, H, -1)\n        keys = self.key_projection(keys).view(B, S, H, -1)\n        values = self.value_projection(values).view(B, S, H, -1)\n\n        out, attn = self.inner_attention(\n            queries,\n            keys,\n            values,\n            attn_mask,\n            tau=tau,\n            delta=delta\n        )\n        out = out.view(B, L, -1)\n\n        return self.out_projection(out), attn\n\n\nclass ReformerLayer(nn.Module):\n    def __init__(self, attention, d_model, n_heads, d_keys=None,\n                 d_values=None, causal=False, bucket_size=4, n_hashes=4):\n        super().__init__()\n        self.bucket_size = bucket_size\n        self.attn = LSHSelfAttention(\n            dim=d_model,\n            heads=n_heads,\n            bucket_size=bucket_size,\n            n_hashes=n_hashes,\n            causal=causal\n        )\n\n    def fit_length(self, queries):\n        # inside reformer: assert N % (bucket_size * 2) == 0\n        B, N, C = queries.shape\n        if N % (self.bucket_size * 2) == 0:\n            return queries\n        else:\n            # fill the time series\n            fill_len = (self.bucket_size * 2) - (N % (self.bucket_size * 2))\n            return torch.cat([queries, torch.zeros([B, fill_len, C]).to(queries.device)], dim=1)\n\n    def forward(self, queries, keys, values, attn_mask, tau, delta):\n        # in Reformer: defalut queries=keys\n        B, N, C = queries.shape\n        queries = self.attn(self.fit_length(queries))[:, :N, :]\n        return queries, None\n\n\nclass TwoStageAttentionLayer(nn.Module):\n    '''\n    The Two Stage Attention (TSA) Layer\n    input/output shape: [batch_size, Data_dim(D), Seg_num(L), d_model]\n    '''\n\n    def __init__(self, configs,\n                 seg_num, factor, d_model, n_heads, d_ff=None, dropout=0.1):\n        super(TwoStageAttentionLayer, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.time_attention = AttentionLayer(FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                                           output_attention=False), d_model, n_heads)\n        self.dim_sender = AttentionLayer(FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                                       output_attention=False), d_model, n_heads)\n        self.dim_receiver = AttentionLayer(FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                                         output_attention=False), d_model, n_heads)\n        self.router = nn.Parameter(torch.randn(seg_num, factor, d_model))\n\n        self.dropout = nn.Dropout(dropout)\n\n        self.norm1 = nn.LayerNorm(d_model)\n        self.norm2 = nn.LayerNorm(d_model)\n        self.norm3 = nn.LayerNorm(d_model)\n        self.norm4 = nn.LayerNorm(d_model)\n\n        self.MLP1 = nn.Sequential(nn.Linear(d_model, d_ff),\n                                  nn.GELU(),\n                                  nn.Linear(d_ff, d_model))\n        self.MLP2 = nn.Sequential(nn.Linear(d_model, d_ff),\n                                  nn.GELU(),\n                                  nn.Linear(d_ff, d_model))\n\n    def forward(self, x, attn_mask=None, tau=None, delta=None):\n        # Cross Time Stage: Directly apply MSA to each dimension\n        batch = x.shape[0]\n        time_in = rearrange(x, 'b ts_d seg_num d_model -> (b ts_d) seg_num d_model')\n        time_enc, attn = self.time_attention(\n            time_in, time_in, time_in, attn_mask=None, tau=None, delta=None\n        )\n        dim_in = time_in + self.dropout(time_enc)\n        dim_in = self.norm1(dim_in)\n        dim_in = dim_in + self.dropout(self.MLP1(dim_in))\n        dim_in = self.norm2(dim_in)\n\n        # Cross Dimension Stage: use a small set of learnable vectors to aggregate and distribute messages to build the D-to-D connection\n        dim_send = rearrange(dim_in, '(b ts_d) seg_num d_model -> (b seg_num) ts_d d_model', b=batch)\n        batch_router = repeat(self.router, 'seg_num factor d_model -> (repeat seg_num) factor d_model', repeat=batch)\n        dim_buffer, attn = self.dim_sender(batch_router, dim_send, dim_send, attn_mask=None, tau=None, delta=None)\n        dim_receive, attn = self.dim_receiver(dim_send, dim_buffer, dim_buffer, attn_mask=None, tau=None, delta=None)\n        dim_enc = dim_send + self.dropout(dim_receive)\n        dim_enc = self.norm3(dim_enc)\n        dim_enc = dim_enc + self.dropout(self.MLP2(dim_enc))\n        dim_enc = self.norm4(dim_enc)\n\n        final_out = rearrange(dim_enc, '(b seg_num) ts_d d_model -> b ts_d seg_num d_model', b=batch)\n\n        return final_out\n"
  },
  {
    "path": "layers/StandardNorm.py",
    "content": "import torch\nimport torch.nn as nn\n\n\nclass Normalize(nn.Module):\n    def __init__(self, num_features: int, eps=1e-5, affine=False, subtract_last=False, non_norm=False):\n        \"\"\"\n        :param num_features: the number of features or channels\n        :param eps: a value added for numerical stability\n        :param affine: if True, RevIN has learnable affine parameters\n        \"\"\"\n        super(Normalize, self).__init__()\n        self.num_features = num_features\n        self.eps = eps\n        self.affine = affine\n        self.subtract_last = subtract_last\n        self.non_norm = non_norm\n        if self.affine:\n            self._init_params()\n\n    def forward(self, x, mode: str):\n        if mode == 'norm':\n            self._get_statistics(x)\n            x = self._normalize(x)\n        elif mode == 'denorm':\n            x = self._denormalize(x)\n        else:\n            raise NotImplementedError\n        return x\n\n    def _init_params(self):\n        # initialize RevIN params: (C,)\n        self.affine_weight = nn.Parameter(torch.ones(self.num_features))\n        self.affine_bias = nn.Parameter(torch.zeros(self.num_features))\n\n    def _get_statistics(self, x):\n        dim2reduce = tuple(range(1, x.ndim - 1))\n        if self.subtract_last:\n            self.last = x[:, -1, :].unsqueeze(1)\n        else:\n            self.mean = torch.mean(x, dim=dim2reduce, keepdim=True).detach()\n        self.stdev = torch.sqrt(torch.var(x, dim=dim2reduce, keepdim=True, unbiased=False) + self.eps).detach()\n\n    def _normalize(self, x):\n        if self.non_norm:\n            return x\n        if self.subtract_last:\n            x = x - self.last\n        else:\n            x = x - self.mean\n        x = x / self.stdev\n        if self.affine:\n            x = x * self.affine_weight\n            x = x + self.affine_bias\n        return x\n\n    def _denormalize(self, x):\n        if self.non_norm:\n            return x\n        if self.affine:\n            x = x - self.affine_bias\n            x = x / (self.affine_weight + self.eps * self.eps)\n        x = x * self.stdev\n        if self.subtract_last:\n            x = x + self.last\n        else:\n            x = x + self.mean\n        return x\n"
  },
  {
    "path": "layers/TimeFilter_layers.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.distributions.normal import Normal\n\n\nclass GCN(nn.Module):\n    def __init__(self, dim, n_heads):\n        super().__init__()\n        self.proj = nn.Linear(dim, dim)\n        self.n_heads = n_heads\n\n    def forward(self, adj, x):\n        # adj [B, H, L, L]\n        B, L, D = x.shape\n        x = self.proj(x).view(B, L, self.n_heads, -1)  # [B, L, H, D_]\n        adj = F.normalize(adj, p=1, dim=-1)\n        x = torch.einsum(\"bhij,bjhd->bihd\", adj, x).contiguous()  # [B, L, H, D_]\n        x = x.view(B, L, -1)\n        return x\n\n\n###############################\n# Ablation\n###############################\ndef mask_topk_moe(adj, thre, n_vars, masks):\n    # adj: [B, H, L, L], thre: [B, H, L, 3]\n    if masks is None:\n        B, H, L, _ = adj.shape\n        N = L // n_vars\n        device = adj.device\n        dtype = torch.float32\n        print(\"Masks is None!\")\n        masks = []\n        for k in range(L):\n            S = ((torch.arange(L) % N == k % N) & (torch.arange(L) != k)).to(dtype).to(device)\n            T = ((torch.arange(L) >= k // N * N) & (torch.arange(L) < k // N * N + N)).to(dtype).to(device)\n            ST = torch.ones(L).to(dtype).to(device) - S - T\n            masks.append(torch.stack([S, T, ST], dim=0))\n        # [L, 3, L]\n        masks = torch.stack(masks, dim=0)\n\n    adj_mask0 = adj * masks[:, 0, :]\n    adj_mask1 = adj * masks[:, 1, :]\n    adj_mask2 = adj * masks[:, 2, :]\n\n    adj_mask0[adj_mask0 <= thre[:, :, :, 0].unsqueeze(-1)] = 0\n    adj_mask1[adj_mask1 <= thre[:, :, :, 1].unsqueeze(-1)] = 0\n    adj_mask2[adj_mask2 <= thre[:, :, :, 2].unsqueeze(-1)] = 0\n\n    adj = adj_mask0 + adj_mask1 + adj_mask2\n\n    return adj\n\n\ndef mask_topk_area(adj, n_vars, masks, alpha=0.5):\n    # x: [B, H, L, L]\n    B, H, L, _ = adj.shape\n    N = L // n_vars\n    if masks is None:\n        device = adj.device\n        dtype = torch.float32\n        print(\"Masks is None!\")\n        masks = []\n        for k in range(L):\n            S = ((torch.arange(L) % N == k % N) & (torch.arange(L) != k)).to(dtype).to(device)\n            T = ((torch.arange(L) >= k // N * N) & (torch.arange(L) < k // N * N + N)).to(dtype).to(device)\n            ST = torch.ones(L).to(dtype).to(device) - S - T\n            masks.append(torch.stack([S, T, ST], dim=0))\n        # [L, 3, L]\n        masks = torch.stack(masks, dim=0)\n    # masks [L, 3, L]\n    n0 = n_vars - 1\n    n1 = N - 1\n    n2 = L - n0 - n1 - 1\n\n    adj_mask0 = adj * masks[:, 0, :]\n    adj_mask1 = adj * masks[:, 1, :]\n    adj_mask2 = adj * masks[:, 2, :]\n\n    def apply_mask_to_region(adj_mask, n):\n        threshold_idx = int(n * alpha)\n        sorted_values, _ = torch.sort(adj_mask, dim=-1, descending=True)\n        threshold = sorted_values[:, :, :, threshold_idx]\n        return adj_mask * (adj_mask >= threshold.unsqueeze(-1))\n\n    adj_mask0 = apply_mask_to_region(adj_mask0, n0)\n    adj_mask1 = apply_mask_to_region(adj_mask1, n1)\n    adj_mask2 = apply_mask_to_region(adj_mask2, n2)\n\n    adj = adj_mask0 + adj_mask1 + adj_mask2\n\n    return adj\n\n\n##########################\n\nclass mask_moe(nn.Module):\n    def __init__(self, n_vars, top_p=0.5, num_experts=3, in_dim=96):\n        super().__init__()\n        self.num_experts = num_experts\n        self.n_vars = n_vars\n        self.in_dim = in_dim\n\n        self.gate = nn.Linear(self.in_dim, num_experts, bias=False)\n        self.noise = nn.Linear(self.in_dim, num_experts, bias=False)\n        self.noisy_gating = 1 #True\n        self.softplus = nn.Softplus()\n        self.softmax = nn.Softmax(2)\n        self.top_p = top_p\n\n    def cv_squared(self, x):\n        eps = 1e-10\n        if x.shape[0] == 1:\n            return torch.tensor([0], device=x.device, dtype=x.dtype)\n        return x.float().var() / (x.float().mean() ** 2 + eps)\n\n    def cross_entropy(self, x):\n        eps = 1e-10\n        if x.shape[0] == 1:\n            return torch.tensor([0], device=x.device, dtype=x.dtype)\n        return -torch.mul(x, torch.log(x + eps)).sum(dim=1).mean()\n\n    def noisy_top_k_gating(self, x, is_training, noise_epsilon=1e-2):\n        clean_logits = self.gate(x)\n        if self.noisy_gating and is_training:\n            raw_noise = self.noise(x)\n            noise_stddev = ((self.softplus(raw_noise) + noise_epsilon))\n            noisy_logits = clean_logits + torch.randn_like(clean_logits) * noise_stddev\n            logits = noisy_logits\n        else:\n            logits = clean_logits\n\n        # Convert logits to probabilities\n        logits = self.softmax(logits)\n        loss_dynamic = self.cross_entropy(logits)\n\n        sorted_probs, sorted_indices = torch.sort(logits, descending=True)\n        cumulative_probs = torch.cumsum(sorted_probs, dim=-1)\n        mask = cumulative_probs > self.top_p\n\n        threshold_indices = mask.long().argmax(dim=-1)\n        threshold_mask = torch.nn.functional.one_hot(threshold_indices, num_classes=sorted_indices.size(-1)).bool()\n        mask = mask & ~threshold_mask\n\n        top_p_mask = torch.zeros_like(mask)\n        zero_indices = (mask == 0).nonzero(as_tuple=True)\n        top_p_mask[\n            zero_indices[0], zero_indices[1], sorted_indices[zero_indices[0], zero_indices[1], zero_indices[2]]] = 1\n\n        sorted_probs = torch.where(mask, 0.0, sorted_probs)\n        loss_importance = self.cv_squared(sorted_probs.sum(0))\n        lambda_2 = 0.1\n        loss = loss_importance + lambda_2 * loss_dynamic\n\n        return top_p_mask, loss\n\n    def forward(self, x, masks=None):\n        # x [B, H, L, L]\n        B, H, L, _ = x.shape\n        device = x.device\n        dtype = torch.float32\n\n        mask_base = torch.eye(L, device=device, dtype=dtype).unsqueeze(0).unsqueeze(0)\n        if self.top_p == 0.0:\n            return mask_base, 0.0\n\n        x = x.reshape(B * H, L, L)\n        gates, loss = self.noisy_top_k_gating(x, self.training)\n        gates = gates.reshape(B, H, L, -1).float()\n        # [B, H, L, 3]\n\n        if masks is None:\n            print(\"Masks is None!\")\n            masks = []\n            N = L // self.n_vars\n            for k in range(L):\n                S = ((torch.arange(L) % N == k % N) & (torch.arange(L) != k)).to(dtype).to(device)\n                T = ((torch.arange(L) >= k // N * N) & (torch.arange(L) < k // N * N + N)).to(dtype).to(device)\n                ST = torch.ones(L).to(dtype).to(device) - S - T\n                masks.append(torch.stack([S, T, ST], dim=0))\n            # [L, 3, L]\n            masks = torch.stack(masks, dim=0)\n\n        mask = torch.einsum('bhli,lid->bhld', gates, masks) + mask_base\n\n        return mask, loss\n\n\ndef mask_topk(x, alpha=0.5, largest=False):\n    # B, L = x.shape[0], x.shape[-1]\n    # x: [B, H, L, L]\n    k = int(alpha * x.shape[-1])\n    _, topk_indices = torch.topk(x, k, dim=-1, largest=largest)\n    mask = torch.ones_like(x, dtype=torch.float32)\n    mask.scatter_(-1, topk_indices, 0)  # 1 is topk\n    return mask  # [B, H, L, L]\n\n\nclass GraphLearner(nn.Module):\n    def __init__(self, dim, n_vars, top_p=0.5, in_dim=96):\n        super().__init__()\n        self.dim = dim\n        self.proj_1 = nn.Linear(dim, dim)\n        self.proj_2 = nn.Linear(dim, dim)\n        self.n_vars = n_vars\n        self.mask_moe = mask_moe(n_vars, top_p=top_p, in_dim=in_dim)\n\n    def forward(self, x, masks=None, alpha=0.5):\n        # x: [B, H, L, D]\n        adj = F.gelu(torch.einsum('bhid,bhjd->bhij', self.proj_1(x), self.proj_2(x)))\n        adj = adj * mask_topk(adj, alpha)  # KNN\n        mask, loss = self.mask_moe(adj, masks)\n        adj = adj * mask\n\n        return adj, loss  # [B, H, L, L]\n\n\nclass GraphFilter(nn.Module):\n    def __init__(self, dim, n_vars, n_heads=4, scale=None, top_p=0.5, dropout=0., in_dim=96):\n        super().__init__()\n        self.dim = dim\n        self.n_heads = n_heads\n        self.scale = dim ** (-0.5) if scale is None else scale\n        self.dropout = nn.Dropout(dropout)\n        self.graph_learner = GraphLearner(self.dim // self.n_heads, n_vars, top_p, in_dim=in_dim)\n        self.graph_conv = GCN(self.dim, self.n_heads)\n\n    def forward(self, x, masks=None, alpha=0.5):\n        # x: [B, L, D]\n        B, L, D = x.shape\n\n        adj, loss = self.graph_learner(x.reshape(B, L, self.n_heads, -1).permute(0, 2, 1, 3), masks, alpha)  # [B, H, L, L]\n\n        adj = torch.softmax(adj, dim=-1)\n        adj = self.dropout(adj)\n        out = self.graph_conv(adj, x)\n        return out, loss  # [B, L, D]\n\n\nclass GraphBlock(nn.Module):\n    def __init__(self, dim, n_vars, d_ff=None, n_heads=4, top_p=0.5, dropout=0., in_dim=96):\n        super().__init__()\n        self.dim = dim\n        self.d_ff = dim * 4 if d_ff is None else d_ff\n        self.gnn = GraphFilter(self.dim, n_vars, n_heads, top_p=top_p, dropout=dropout, in_dim=in_dim)\n        self.norm1 = nn.LayerNorm(self.dim)\n        self.ffn = nn.Sequential(\n            nn.Linear(self.dim, self.d_ff),\n            nn.GELU(),\n            nn.Dropout(dropout),\n            nn.Linear(self.d_ff, self.dim),\n        )\n        self.norm2 = nn.LayerNorm(self.dim)\n\n    def forward(self, x, masks=None, alpha=0.5):\n        # x: [B, L, D], time_embed: [B, time_embed_dim]\n        out, loss = self.gnn(self.norm1(x), masks, alpha)\n        x = x + out\n        x = x + self.ffn(self.norm2(x))\n        return x, loss\n\n\nclass TimeFilter_Backbone(nn.Module):\n    def __init__(self, hidden_dim, n_vars, d_ff=None, n_heads=4, n_blocks=3, top_p=0.5, dropout=0., in_dim=96):\n        super().__init__()\n        self.dim = hidden_dim\n        self.d_ff = self.dim * 2 if d_ff is None else d_ff\n        # graph blocks\n        self.blocks = nn.ModuleList([\n            GraphBlock(self.dim, n_vars, self.d_ff, n_heads, top_p, dropout, in_dim)\n            for _ in range(n_blocks)\n        ])\n        self.n_blocks = n_blocks\n\n    def forward(self, x, masks=None, alpha=0.5):\n        # x: [B, N, T]\n        moe_loss = 0.0\n        for block in self.blocks:\n            x, loss = block(x, masks, alpha)\n            moe_loss += loss\n        moe_loss /= self.n_blocks\n        return x, moe_loss  # [B, N, T]"
  },
  {
    "path": "layers/Transformer_EncDec.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n\nclass ConvLayer(nn.Module):\n    def __init__(self, c_in):\n        super(ConvLayer, self).__init__()\n        self.downConv = nn.Conv1d(in_channels=c_in,\n                                  out_channels=c_in,\n                                  kernel_size=3,\n                                  padding=2,\n                                  padding_mode='circular')\n        self.norm = nn.BatchNorm1d(c_in)\n        self.activation = nn.ELU()\n        self.maxPool = nn.MaxPool1d(kernel_size=3, stride=2, padding=1)\n\n    def forward(self, x):\n        x = self.downConv(x.permute(0, 2, 1))\n        x = self.norm(x)\n        x = self.activation(x)\n        x = self.maxPool(x)\n        x = x.transpose(1, 2)\n        return x\n\n\nclass EncoderLayer(nn.Module):\n    def __init__(self, attention, d_model, d_ff=None, dropout=0.1, activation=\"relu\"):\n        super(EncoderLayer, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.attention = attention\n        self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)\n        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)\n        self.norm1 = nn.LayerNorm(d_model)\n        self.norm2 = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.activation = F.relu if activation == \"relu\" else F.gelu\n\n    def forward(self, x, attn_mask=None, tau=None, delta=None):\n        new_x, attn = self.attention(\n            x, x, x,\n            attn_mask=attn_mask,\n            tau=tau, delta=delta\n        )\n        x = x + self.dropout(new_x)\n\n        y = x = self.norm1(x)\n        y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))\n        y = self.dropout(self.conv2(y).transpose(-1, 1))\n\n        return self.norm2(x + y), attn\n\n\nclass Encoder(nn.Module):\n    def __init__(self, attn_layers, conv_layers=None, norm_layer=None):\n        super(Encoder, self).__init__()\n        self.attn_layers = nn.ModuleList(attn_layers)\n        self.conv_layers = nn.ModuleList(conv_layers) if conv_layers is not None else None\n        self.norm = norm_layer\n\n    def forward(self, x, attn_mask=None, tau=None, delta=None):\n        # x [B, L, D]\n        attns = []\n        if self.conv_layers is not None:\n            for i, (attn_layer, conv_layer) in enumerate(zip(self.attn_layers, self.conv_layers)):\n                delta = delta if i == 0 else None\n                x, attn = attn_layer(x, attn_mask=attn_mask, tau=tau, delta=delta)\n                x = conv_layer(x)\n                attns.append(attn)\n            x, attn = self.attn_layers[-1](x, tau=tau, delta=None)\n            attns.append(attn)\n        else:\n            for attn_layer in self.attn_layers:\n                x, attn = attn_layer(x, attn_mask=attn_mask, tau=tau, delta=delta)\n                attns.append(attn)\n\n        if self.norm is not None:\n            x = self.norm(x)\n\n        return x, attns\n\n\nclass DecoderLayer(nn.Module):\n    def __init__(self, self_attention, cross_attention, d_model, d_ff=None,\n                 dropout=0.1, activation=\"relu\"):\n        super(DecoderLayer, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.self_attention = self_attention\n        self.cross_attention = cross_attention\n        self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)\n        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)\n        self.norm1 = nn.LayerNorm(d_model)\n        self.norm2 = nn.LayerNorm(d_model)\n        self.norm3 = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.activation = F.relu if activation == \"relu\" else F.gelu\n\n    def forward(self, x, cross, x_mask=None, cross_mask=None, tau=None, delta=None):\n        x = x + self.dropout(self.self_attention(\n            x, x, x,\n            attn_mask=x_mask,\n            tau=tau, delta=None\n        )[0])\n        x = self.norm1(x)\n\n        x = x + self.dropout(self.cross_attention(\n            x, cross, cross,\n            attn_mask=cross_mask,\n            tau=tau, delta=delta\n        )[0])\n\n        y = x = self.norm2(x)\n        y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))\n        y = self.dropout(self.conv2(y).transpose(-1, 1))\n\n        return self.norm3(x + y)\n\n\nclass Decoder(nn.Module):\n    def __init__(self, layers, norm_layer=None, projection=None):\n        super(Decoder, self).__init__()\n        self.layers = nn.ModuleList(layers)\n        self.norm = norm_layer\n        self.projection = projection\n\n    def forward(self, x, cross, x_mask=None, cross_mask=None, tau=None, delta=None):\n        for layer in self.layers:\n            x = layer(x, cross, x_mask=x_mask, cross_mask=cross_mask, tau=tau, delta=delta)\n\n        if self.norm is not None:\n            x = self.norm(x)\n\n        if self.projection is not None:\n            x = self.projection(x)\n        return x\n"
  },
  {
    "path": "layers/__init__.py",
    "content": ""
  },
  {
    "path": "models/Autoformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Embed import DataEmbedding, DataEmbedding_wo_pos\nfrom layers.AutoCorrelation import AutoCorrelation, AutoCorrelationLayer\nfrom layers.Autoformer_EncDec import Encoder, Decoder, EncoderLayer, DecoderLayer, my_Layernorm, series_decomp\nimport math\nimport numpy as np\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Autoformer is the first method to achieve the series-wise connection,\n    with inherent O(LlogL) complexity\n    Paper link: https://openreview.net/pdf?id=I55UqU-M11y\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n\n        # Decomp\n        kernel_size = configs.moving_avg\n        self.decomp = series_decomp(kernel_size)\n\n        # Embedding\n        self.enc_embedding = DataEmbedding_wo_pos(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                                  configs.dropout)\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AutoCorrelationLayer(\n                        AutoCorrelation(False, configs.factor, attention_dropout=configs.dropout,\n                                        output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    moving_avg=configs.moving_avg,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=my_Layernorm(configs.d_model)\n        )\n        # Decoder\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.dec_embedding = DataEmbedding_wo_pos(configs.dec_in, configs.d_model, configs.embed, configs.freq,\n                                                      configs.dropout)\n            self.decoder = Decoder(\n                [\n                    DecoderLayer(\n                        AutoCorrelationLayer(\n                            AutoCorrelation(True, configs.factor, attention_dropout=configs.dropout,\n                                            output_attention=False),\n                            configs.d_model, configs.n_heads),\n                        AutoCorrelationLayer(\n                            AutoCorrelation(False, configs.factor, attention_dropout=configs.dropout,\n                                            output_attention=False),\n                            configs.d_model, configs.n_heads),\n                        configs.d_model,\n                        configs.c_out,\n                        configs.d_ff,\n                        moving_avg=configs.moving_avg,\n                        dropout=configs.dropout,\n                        activation=configs.activation,\n                    )\n                    for l in range(configs.d_layers)\n                ],\n                norm_layer=my_Layernorm(configs.d_model),\n                projection=nn.Linear(configs.d_model, configs.c_out, bias=True)\n            )\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(\n                configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(\n                configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.d_model * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # decomp init\n        mean = torch.mean(x_enc, dim=1).unsqueeze(\n            1).repeat(1, self.pred_len, 1)\n        zeros = torch.zeros([x_dec.shape[0], self.pred_len,\n                             x_dec.shape[2]], device=x_enc.device)\n        seasonal_init, trend_init = self.decomp(x_enc)\n        # decoder input\n        trend_init = torch.cat(\n            [trend_init[:, -self.label_len:, :], mean], dim=1)\n        seasonal_init = torch.cat(\n            [seasonal_init[:, -self.label_len:, :], zeros], dim=1)\n        # enc\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # dec\n        dec_out = self.dec_embedding(seasonal_init, x_mark_dec)\n        seasonal_part, trend_part = self.decoder(dec_out, enc_out, x_mask=None, cross_mask=None,\n                                                 trend=trend_init)\n        # final\n        dec_out = trend_part + seasonal_part\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # enc\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # final\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # final\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        # Output\n        # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        # zero-out padding embeddings\n        output = output * x_mark_enc.unsqueeze(-1)\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/Chronos.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nfrom chronos import BaseChronosPipeline\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.model = BaseChronosPipeline.from_pretrained(\n            \"amazon/chronos-bolt-base\",\n            device_map=\"cuda\",  # use \"cpu\" for CPU inference and \"mps\" for Apple Silicon\n            torch_dtype=torch.bfloat16,\n        )\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        outputs = []\n        for i in range(x_enc.shape[-1]):\n            output = self.model.predict(x_enc[...,i], prediction_length=self.pred_len)\n            output = output.mean(dim=1)\n            outputs.append(output)\n        dec_out = torch.stack(outputs, dim=-1)\n\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/Chronos2.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nfrom chronos import BaseChronosPipeline\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.model = BaseChronosPipeline.from_pretrained(\"amazon/chronos-2\", device_map=\"cuda\")\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc.sub(means)\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc = x_enc.div(stdev)\n\n        B, L, C = x_enc.shape\n        x_enc = x_enc.permute(0, 2, 1)\n        quantiles, dec_out = self.model.predict_quantiles(x_enc.cpu().numpy(), prediction_length=self.pred_len, quantile_levels=[0.1, 0.5, 0.9])\n        dec_out = torch.stack(dec_out, dim=0).to(x_enc.device)\n        dec_out= dec_out.permute(0, 2, 1)\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/Crossformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom einops import rearrange, repeat\nfrom layers.Crossformer_EncDec import scale_block, Encoder, Decoder, DecoderLayer\nfrom layers.Embed import PatchEmbedding\nfrom layers.SelfAttention_Family import AttentionLayer, FullAttention, TwoStageAttentionLayer\nfrom models.PatchTST import FlattenHead\n\n\nfrom math import ceil\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://openreview.net/pdf?id=vSVLM2j9eie\n    \"\"\"\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.enc_in = configs.enc_in\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.seg_len = 12\n        self.win_size = 2\n        self.task_name = configs.task_name\n\n        # The padding operation to handle invisible sgemnet length\n        self.pad_in_len = ceil(1.0 * configs.seq_len / self.seg_len) * self.seg_len\n        self.pad_out_len = ceil(1.0 * configs.pred_len / self.seg_len) * self.seg_len\n        self.in_seg_num = self.pad_in_len // self.seg_len\n        self.out_seg_num = ceil(self.in_seg_num / (self.win_size ** (configs.e_layers - 1)))\n        self.head_nf = configs.d_model * self.out_seg_num\n\n        # Embedding\n        self.enc_value_embedding = PatchEmbedding(configs.d_model, self.seg_len, self.seg_len, self.pad_in_len - configs.seq_len, 0)\n        self.enc_pos_embedding = nn.Parameter(\n            torch.randn(1, configs.enc_in, self.in_seg_num, configs.d_model))\n        self.pre_norm = nn.LayerNorm(configs.d_model)\n\n        # Encoder\n        self.encoder = Encoder(\n            [\n                scale_block(configs, 1 if l == 0 else self.win_size, configs.d_model, configs.n_heads, configs.d_ff,\n                            1, configs.dropout,\n                            self.in_seg_num if l == 0 else ceil(self.in_seg_num / self.win_size ** l), configs.factor\n                            ) for l in range(configs.e_layers)\n            ]\n        )\n        # Decoder\n        self.dec_pos_embedding = nn.Parameter(\n            torch.randn(1, configs.enc_in, (self.pad_out_len // self.seg_len), configs.d_model))\n\n        self.decoder = Decoder(\n            [\n                DecoderLayer(\n                    TwoStageAttentionLayer(configs, (self.pad_out_len // self.seg_len), configs.factor, configs.d_model, configs.n_heads,\n                                           configs.d_ff, configs.dropout),\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    self.seg_len,\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    # activation=configs.activation,\n                )\n                for l in range(configs.e_layers + 1)\n            ],\n        )\n        if self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.head = FlattenHead(configs.enc_in, self.head_nf, configs.seq_len,\n                                    head_dropout=configs.dropout)\n        elif self.task_name == 'classification':\n            self.flatten = nn.Flatten(start_dim=-2)\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                self.head_nf * configs.enc_in, configs.num_class)\n\n\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # embedding\n        x_enc, n_vars = self.enc_value_embedding(x_enc.permute(0, 2, 1))\n        x_enc = rearrange(x_enc, '(b d) seg_num d_model -> b d seg_num d_model', d = n_vars)\n        x_enc += self.enc_pos_embedding\n        x_enc = self.pre_norm(x_enc)\n        enc_out, attns = self.encoder(x_enc)\n\n        dec_in = repeat(self.dec_pos_embedding, 'b ts_d l d -> (repeat b) ts_d l d', repeat=x_enc.shape[0])\n        dec_out = self.decoder(dec_in, enc_out)\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # embedding\n        x_enc, n_vars = self.enc_value_embedding(x_enc.permute(0, 2, 1))\n        x_enc = rearrange(x_enc, '(b d) seg_num d_model -> b d seg_num d_model', d=n_vars)\n        x_enc += self.enc_pos_embedding\n        x_enc = self.pre_norm(x_enc)\n        enc_out, attns = self.encoder(x_enc)\n\n        dec_out = self.head(enc_out[-1].permute(0, 1, 3, 2)).permute(0, 2, 1)\n\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # embedding\n        x_enc, n_vars = self.enc_value_embedding(x_enc.permute(0, 2, 1))\n        x_enc = rearrange(x_enc, '(b d) seg_num d_model -> b d seg_num d_model', d=n_vars)\n        x_enc += self.enc_pos_embedding\n        x_enc = self.pre_norm(x_enc)\n        enc_out, attns = self.encoder(x_enc)\n\n        dec_out = self.head(enc_out[-1].permute(0, 1, 3, 2)).permute(0, 2, 1)\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # embedding\n        x_enc, n_vars = self.enc_value_embedding(x_enc.permute(0, 2, 1))\n\n        x_enc = rearrange(x_enc, '(b d) seg_num d_model -> b d seg_num d_model', d=n_vars)\n        x_enc += self.enc_pos_embedding\n        x_enc = self.pre_norm(x_enc)\n        enc_out, attns = self.encoder(x_enc)\n        # Output from Non-stationary Transformer\n        output = self.flatten(enc_out[-1].permute(0, 1, 3, 2))\n        output = self.dropout(output)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None"
  },
  {
    "path": "models/DLinear.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Autoformer_EncDec import series_decomp\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/pdf/2205.13504.pdf\n    \"\"\"\n\n    def __init__(self, configs, individual=False):\n        \"\"\"\n        individual: Bool, whether shared model among different variates.\n        \"\"\"\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        if self.task_name == 'classification' or self.task_name == 'anomaly_detection' or self.task_name == 'imputation':\n            self.pred_len = configs.seq_len\n        else:\n            self.pred_len = configs.pred_len\n        # Series decomposition block from Autoformer\n        self.decompsition = series_decomp(configs.moving_avg)\n        self.individual = individual\n        self.channels = configs.enc_in\n\n        if self.individual:\n            self.Linear_Seasonal = nn.ModuleList()\n            self.Linear_Trend = nn.ModuleList()\n\n            for i in range(self.channels):\n                self.Linear_Seasonal.append(\n                    nn.Linear(self.seq_len, self.pred_len))\n                self.Linear_Trend.append(\n                    nn.Linear(self.seq_len, self.pred_len))\n\n                self.Linear_Seasonal[i].weight = nn.Parameter(\n                    (1 / self.seq_len) * torch.ones([self.pred_len, self.seq_len]))\n                self.Linear_Trend[i].weight = nn.Parameter(\n                    (1 / self.seq_len) * torch.ones([self.pred_len, self.seq_len]))\n        else:\n            self.Linear_Seasonal = nn.Linear(self.seq_len, self.pred_len)\n            self.Linear_Trend = nn.Linear(self.seq_len, self.pred_len)\n\n            self.Linear_Seasonal.weight = nn.Parameter(\n                (1 / self.seq_len) * torch.ones([self.pred_len, self.seq_len]))\n            self.Linear_Trend.weight = nn.Parameter(\n                (1 / self.seq_len) * torch.ones([self.pred_len, self.seq_len]))\n\n        if self.task_name == 'classification':\n            self.projection = nn.Linear(\n                configs.enc_in * configs.seq_len, configs.num_class)\n\n    def encoder(self, x):\n        seasonal_init, trend_init = self.decompsition(x)\n        seasonal_init, trend_init = seasonal_init.permute(\n            0, 2, 1), trend_init.permute(0, 2, 1)\n        if self.individual:\n            seasonal_output = torch.zeros([seasonal_init.size(0), seasonal_init.size(1), self.pred_len],\n                                          dtype=seasonal_init.dtype).to(seasonal_init.device)\n            trend_output = torch.zeros([trend_init.size(0), trend_init.size(1), self.pred_len],\n                                       dtype=trend_init.dtype).to(trend_init.device)\n            for i in range(self.channels):\n                seasonal_output[:, i, :] = self.Linear_Seasonal[i](\n                    seasonal_init[:, i, :])\n                trend_output[:, i, :] = self.Linear_Trend[i](\n                    trend_init[:, i, :])\n        else:\n            seasonal_output = self.Linear_Seasonal(seasonal_init)\n            trend_output = self.Linear_Trend(trend_init)\n        x = seasonal_output + trend_output\n        return x.permute(0, 2, 1)\n\n    def forecast(self, x_enc):\n        # Encoder\n        return self.encoder(x_enc)\n\n    def imputation(self, x_enc):\n        # Encoder\n        return self.encoder(x_enc)\n\n    def anomaly_detection(self, x_enc):\n        # Encoder\n        return self.encoder(x_enc)\n\n    def classification(self, x_enc):\n        # Encoder\n        enc_out = self.encoder(x_enc)\n        # Output\n        # (batch_size, seq_length * d_model)\n        output = enc_out.reshape(enc_out.shape[0], -1)\n        # (batch_size, num_classes)\n        output = self.projection(output)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/ETSformer.py",
    "content": "import torch\nimport torch.nn as nn\nfrom layers.Embed import DataEmbedding\nfrom layers.ETSformer_EncDec import EncoderLayer, Encoder, DecoderLayer, Decoder, Transform\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/abs/2202.01381\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        if self.task_name == 'classification' or self.task_name == 'anomaly_detection' or self.task_name == 'imputation':\n            self.pred_len = configs.seq_len\n        else:\n            self.pred_len = configs.pred_len\n\n        assert configs.e_layers == configs.d_layers, \"Encoder and decoder layers must be equal\"\n\n        # Embedding\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    configs.d_model, configs.n_heads, configs.enc_in, configs.seq_len, self.pred_len, configs.top_k,\n                    dim_feedforward=configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation,\n                ) for _ in range(configs.e_layers)\n            ]\n        )\n        # Decoder\n        self.decoder = Decoder(\n            [\n                DecoderLayer(\n                    configs.d_model, configs.n_heads, configs.c_out, self.pred_len,\n                    dropout=configs.dropout,\n                ) for _ in range(configs.d_layers)\n            ],\n        )\n        self.transform = Transform(sigma=0.2)\n\n        if self.task_name == 'classification':\n            self.act = torch.nn.functional.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.d_model * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        with torch.no_grad():\n            if self.training:\n                x_enc = self.transform.transform(x_enc)\n        res = self.enc_embedding(x_enc, x_mark_enc)\n        level, growths, seasons = self.encoder(res, x_enc, attn_mask=None)\n\n        growth, season = self.decoder(growths, seasons)\n        preds = level[:, -1:] + growth + season\n        return preds\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        res = self.enc_embedding(x_enc, x_mark_enc)\n        level, growths, seasons = self.encoder(res, x_enc, attn_mask=None)\n        growth, season = self.decoder(growths, seasons)\n        preds = level[:, -1:] + growth + season\n        return preds\n\n    def anomaly_detection(self, x_enc):\n        res = self.enc_embedding(x_enc, None)\n        level, growths, seasons = self.encoder(res, x_enc, attn_mask=None)\n        growth, season = self.decoder(growths, seasons)\n        preds = level[:, -1:] + growth + season\n        return preds\n\n    def classification(self, x_enc, x_mark_enc):\n        res = self.enc_embedding(x_enc, None)\n        _, growths, seasons = self.encoder(res, x_enc, attn_mask=None)\n\n        growths = torch.sum(torch.stack(growths, 0), 0)[:, :self.seq_len, :]\n        seasons = torch.sum(torch.stack(seasons, 0), 0)[:, :self.seq_len, :]\n\n        enc_out = growths + seasons\n        output = self.act(enc_out)  # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.dropout(output)\n\n        # Output\n        output = output * x_mark_enc.unsqueeze(-1)  # zero-out padding embeddings\n        output = output.reshape(output.shape[0], -1)  # (batch_size, seq_length * d_model)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/FEDformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Embed import DataEmbedding\nfrom layers.AutoCorrelation import AutoCorrelationLayer\nfrom layers.FourierCorrelation import FourierBlock, FourierCrossAttention\nfrom layers.MultiWaveletCorrelation import MultiWaveletCross, MultiWaveletTransform\nfrom layers.Autoformer_EncDec import Encoder, Decoder, EncoderLayer, DecoderLayer, my_Layernorm, series_decomp\n\n\nclass Model(nn.Module):\n    \"\"\"\n    FEDformer performs the attention mechanism on frequency domain and achieved O(N) complexity\n    Paper link: https://proceedings.mlr.press/v162/zhou22g.html\n    \"\"\"\n\n    def __init__(self, configs, version='fourier', mode_select='random', modes=32):\n        \"\"\"\n        version: str, for FEDformer, there are two versions to choose, options: [Fourier, Wavelets].\n        mode_select: str, for FEDformer, there are two mode selection method, options: [random, low].\n        modes: int, modes to be selected.\n        \"\"\"\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n\n        self.version = version\n        self.mode_select = mode_select\n        self.modes = modes\n\n        # Decomp\n        self.decomp = series_decomp(configs.moving_avg)\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n        self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n\n        if self.version == 'Wavelets':\n            encoder_self_att = MultiWaveletTransform(ich=configs.d_model, L=1, base='legendre')\n            decoder_self_att = MultiWaveletTransform(ich=configs.d_model, L=1, base='legendre')\n            decoder_cross_att = MultiWaveletCross(in_channels=configs.d_model,\n                                                  out_channels=configs.d_model,\n                                                  seq_len_q=self.seq_len // 2 + self.pred_len,\n                                                  seq_len_kv=self.seq_len,\n                                                  modes=self.modes,\n                                                  ich=configs.d_model,\n                                                  base='legendre',\n                                                  activation='tanh')\n        else:\n            encoder_self_att = FourierBlock(in_channels=configs.d_model,\n                                            out_channels=configs.d_model,\n                                            n_heads=configs.n_heads,\n                                            seq_len=self.seq_len,\n                                            modes=self.modes,\n                                            mode_select_method=self.mode_select)\n            decoder_self_att = FourierBlock(in_channels=configs.d_model,\n                                            out_channels=configs.d_model,\n                                            n_heads=configs.n_heads,\n                                            seq_len=self.seq_len // 2 + self.pred_len,\n                                            modes=self.modes,\n                                            mode_select_method=self.mode_select)\n            decoder_cross_att = FourierCrossAttention(in_channels=configs.d_model,\n                                                      out_channels=configs.d_model,\n                                                      seq_len_q=self.seq_len // 2 + self.pred_len,\n                                                      seq_len_kv=self.seq_len,\n                                                      modes=self.modes,\n                                                      mode_select_method=self.mode_select,\n                                                      num_heads=configs.n_heads)\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AutoCorrelationLayer(\n                        encoder_self_att,  # instead of multi-head attention in transformer\n                        configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    moving_avg=configs.moving_avg,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=my_Layernorm(configs.d_model)\n        )\n        # Decoder\n        self.decoder = Decoder(\n            [\n                DecoderLayer(\n                    AutoCorrelationLayer(\n                        decoder_self_att,\n                        configs.d_model, configs.n_heads),\n                    AutoCorrelationLayer(\n                        decoder_cross_att,\n                        configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.c_out,\n                    configs.d_ff,\n                    moving_avg=configs.moving_avg,\n                    dropout=configs.dropout,\n                    activation=configs.activation,\n                )\n                for l in range(configs.d_layers)\n            ],\n            norm_layer=my_Layernorm(configs.d_model),\n            projection=nn.Linear(configs.d_model, configs.c_out, bias=True)\n        )\n\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.d_model * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # decomp init\n        mean = torch.mean(x_enc, dim=1).unsqueeze(1).repeat(1, self.pred_len, 1)\n        seasonal_init, trend_init = self.decomp(x_enc)  # x - moving_avg, moving_avg\n        # decoder input\n        trend_init = torch.cat([trend_init[:, -self.label_len:, :], mean], dim=1)\n        seasonal_init = F.pad(seasonal_init[:, -self.label_len:, :], (0, 0, 0, self.pred_len))\n        # enc\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        dec_out = self.dec_embedding(seasonal_init, x_mark_dec)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # dec\n        seasonal_part, trend_part = self.decoder(dec_out, enc_out, x_mask=None, cross_mask=None, trend=trend_init)\n        # final\n        dec_out = trend_part + seasonal_part\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # enc\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # final\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # final\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        # Output\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        output = output * x_mark_enc.unsqueeze(-1)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/FiLM.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport numpy as np\nfrom scipy import signal\nfrom scipy import special as ss\n\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n\n\ndef transition(N):\n    Q = np.arange(N, dtype=np.float64)\n    R = (2 * Q + 1)[:, None]  # / theta\n    j, i = np.meshgrid(Q, Q)\n    A = np.where(i < j, -1, (-1.) ** (i - j + 1)) * R\n    B = (-1.) ** Q[:, None] * R\n    return A, B\n\n\nclass HiPPO_LegT(nn.Module):\n    def __init__(self, N, dt=1.0, discretization='bilinear'):\n        \"\"\"\n        N: the order of the HiPPO projection\n        dt: discretization step size - should be roughly inverse to the length of the sequence\n        \"\"\"\n        super(HiPPO_LegT, self).__init__()\n        self.N = N\n        A, B = transition(N)\n        C = np.ones((1, N))\n        D = np.zeros((1,))\n        A, B, _, _, _ = signal.cont2discrete((A, B, C, D), dt=dt, method=discretization)\n\n        B = B.squeeze(-1)\n\n        self.register_buffer('A', torch.Tensor(A).to(device))\n        self.register_buffer('B', torch.Tensor(B).to(device))\n        vals = np.arange(0.0, 1.0, dt)\n        self.register_buffer('eval_matrix', torch.Tensor(\n            ss.eval_legendre(np.arange(N)[:, None], 1 - 2 * vals).T).to(device))\n\n    def forward(self, inputs):\n        \"\"\"\n        inputs : (length, ...)\n        output : (length, ..., N) where N is the order of the HiPPO projection\n        \"\"\"\n        c = torch.zeros(inputs.shape[:-1] + tuple([self.N])).to(device)\n        cs = []\n        for f in inputs.permute([-1, 0, 1]):\n            f = f.unsqueeze(-1)\n            new = f @ self.B.unsqueeze(0)\n            c = F.linear(c, self.A) + new\n            cs.append(c)\n        return torch.stack(cs, dim=0)\n\n    def reconstruct(self, c):\n        return (self.eval_matrix @ c.unsqueeze(-1)).squeeze(-1)\n\n\nclass SpectralConv1d(nn.Module):\n    def __init__(self, in_channels, out_channels, seq_len, ratio=0.5):\n        \"\"\"\n        1D Fourier layer. It does FFT, linear transform, and Inverse FFT.\n        \"\"\"\n        super(SpectralConv1d, self).__init__()\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.ratio = ratio\n        self.modes = min(32, seq_len // 2)\n        self.index = list(range(0, self.modes))\n\n        self.scale = (1 / (in_channels * out_channels))\n        self.weights_real = nn.Parameter(\n            self.scale * torch.rand(in_channels, out_channels, len(self.index), dtype=torch.float))\n        self.weights_imag = nn.Parameter(\n            self.scale * torch.rand(in_channels, out_channels, len(self.index), dtype=torch.float))\n\n    def compl_mul1d(self, order, x, weights_real, weights_imag):\n        return torch.complex(torch.einsum(order, x.real, weights_real) - torch.einsum(order, x.imag, weights_imag),\n                                 torch.einsum(order, x.real, weights_imag) + torch.einsum(order, x.imag, weights_real))\n\n    def forward(self, x):\n        B, H, E, N = x.shape\n        x_ft = torch.fft.rfft(x)\n        out_ft = torch.zeros(B, H, self.out_channels, x.size(-1) // 2 + 1, device=x.device, dtype=torch.cfloat)\n        a = x_ft[:, :, :, :self.modes]\n        out_ft[:, :, :, :self.modes] = self.compl_mul1d(\"bjix,iox->bjox\", a, self.weights_real, self.weights_imag)\n        x = torch.fft.irfft(out_ft, n=x.size(-1))\n        return x\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/abs/2205.08897\n    \"\"\"\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.configs = configs\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.seq_len if configs.pred_len == 0 else configs.pred_len\n\n        self.seq_len_all = self.seq_len + self.label_len\n\n        self.layers = configs.e_layers\n        self.enc_in = configs.enc_in\n        self.e_layers = configs.e_layers\n        # b, s, f means b, f\n        self.affine_weight = nn.Parameter(torch.ones(1, 1, configs.enc_in))\n        self.affine_bias = nn.Parameter(torch.zeros(1, 1, configs.enc_in))\n\n        self.multiscale = [1, 2, 4]\n        self.window_size = [256]\n        configs.ratio = 0.5\n        self.legts = nn.ModuleList(\n            [HiPPO_LegT(N=n, dt=1. / self.pred_len / i) for n in self.window_size for i in self.multiscale])\n        self.spec_conv_1 = nn.ModuleList([SpectralConv1d(in_channels=n, out_channels=n,\n                                                         seq_len=min(self.pred_len, self.seq_len),\n                                                         ratio=configs.ratio) for n in\n                                          self.window_size for _ in range(len(self.multiscale))])\n        self.mlp = nn.Linear(len(self.multiscale) * len(self.window_size), 1)\n\n        if self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(\n                configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.enc_in * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec_true, x_mark_dec):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()\n        x_enc /= stdev\n\n        x_enc = x_enc * self.affine_weight + self.affine_bias\n        x_decs = []\n        jump_dist = 0\n        for i in range(0, len(self.multiscale) * len(self.window_size)):\n            x_in_len = self.multiscale[i % len(self.multiscale)] * self.pred_len\n            x_in = x_enc[:, -x_in_len:]\n            legt = self.legts[i]\n            x_in_c = legt(x_in.transpose(1, 2)).permute([1, 2, 3, 0])[:, :, :, jump_dist:]\n            out1 = self.spec_conv_1[i](x_in_c)\n            if self.seq_len >= self.pred_len:\n                x_dec_c = out1.transpose(2, 3)[:, :, self.pred_len - 1 - jump_dist, :]\n            else:\n                x_dec_c = out1.transpose(2, 3)[:, :, -1, :]\n            x_dec = x_dec_c @ legt.eval_matrix[-self.pred_len:, :].T\n            x_decs.append(x_dec)\n        x_dec = torch.stack(x_decs, dim=-1)\n        x_dec = self.mlp(x_dec).squeeze(-1).permute(0, 2, 1)\n\n        # De-Normalization from Non-stationary Transformer\n        x_dec = x_dec - self.affine_bias\n        x_dec = x_dec / (self.affine_weight + 1e-10)\n        x_dec = x_dec * stdev\n        x_dec = x_dec + means\n        return x_dec\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()\n        x_enc /= stdev\n\n        x_enc = x_enc * self.affine_weight + self.affine_bias\n        x_decs = []\n        jump_dist = 0\n        for i in range(0, len(self.multiscale) * len(self.window_size)):\n            x_in_len = self.multiscale[i % len(self.multiscale)] * self.pred_len\n            x_in = x_enc[:, -x_in_len:]\n            legt = self.legts[i]\n            x_in_c = legt(x_in.transpose(1, 2)).permute([1, 2, 3, 0])[:, :, :, jump_dist:]\n            out1 = self.spec_conv_1[i](x_in_c)\n            if self.seq_len >= self.pred_len:\n                x_dec_c = out1.transpose(2, 3)[:, :, self.pred_len - 1 - jump_dist, :]\n            else:\n                x_dec_c = out1.transpose(2, 3)[:, :, -1, :]\n            x_dec = x_dec_c @ legt.eval_matrix[-self.pred_len:, :].T\n            x_decs.append(x_dec)\n        x_dec = torch.stack(x_decs, dim=-1)\n        x_dec = self.mlp(x_dec).squeeze(-1).permute(0, 2, 1)\n\n        # De-Normalization from Non-stationary Transformer\n        x_dec = x_dec - self.affine_bias\n        x_dec = x_dec / (self.affine_weight + 1e-10)\n        x_dec = x_dec * stdev\n        x_dec = x_dec + means\n        return x_dec\n\n    def anomaly_detection(self, x_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()\n        x_enc /= stdev\n\n        x_enc = x_enc * self.affine_weight + self.affine_bias\n        x_decs = []\n        jump_dist = 0\n        for i in range(0, len(self.multiscale) * len(self.window_size)):\n            x_in_len = self.multiscale[i % len(self.multiscale)] * self.pred_len\n            x_in = x_enc[:, -x_in_len:]\n            legt = self.legts[i]\n            x_in_c = legt(x_in.transpose(1, 2)).permute([1, 2, 3, 0])[:, :, :, jump_dist:]\n            out1 = self.spec_conv_1[i](x_in_c)\n            if self.seq_len >= self.pred_len:\n                x_dec_c = out1.transpose(2, 3)[:, :, self.pred_len - 1 - jump_dist, :]\n            else:\n                x_dec_c = out1.transpose(2, 3)[:, :, -1, :]\n            x_dec = x_dec_c @ legt.eval_matrix[-self.pred_len:, :].T\n            x_decs.append(x_dec)\n        x_dec = torch.stack(x_decs, dim=-1)\n        x_dec = self.mlp(x_dec).squeeze(-1).permute(0, 2, 1)\n\n        # De-Normalization from Non-stationary Transformer\n        x_dec = x_dec - self.affine_bias\n        x_dec = x_dec / (self.affine_weight + 1e-10)\n        x_dec = x_dec * stdev\n        x_dec = x_dec + means\n        return x_dec\n\n    def classification(self, x_enc, x_mark_enc):\n        x_enc = x_enc * self.affine_weight + self.affine_bias\n        x_decs = []\n        jump_dist = 0\n        for i in range(0, len(self.multiscale) * len(self.window_size)):\n            x_in_len = self.multiscale[i % len(self.multiscale)] * self.pred_len\n            x_in = x_enc[:, -x_in_len:]\n            legt = self.legts[i]\n            x_in_c = legt(x_in.transpose(1, 2)).permute([1, 2, 3, 0])[:, :, :, jump_dist:]\n            out1 = self.spec_conv_1[i](x_in_c)\n            if self.seq_len >= self.pred_len:\n                x_dec_c = out1.transpose(2, 3)[:, :, self.pred_len - 1 - jump_dist, :]\n            else:\n                x_dec_c = out1.transpose(2, 3)[:, :, -1, :]\n            x_dec = x_dec_c @ legt.eval_matrix[-self.pred_len:, :].T\n            x_decs.append(x_dec)\n        x_dec = torch.stack(x_decs, dim=-1)\n        x_dec = self.mlp(x_dec).squeeze(-1).permute(0, 2, 1)\n\n        # Output from Non-stationary Transformer\n        output = self.act(x_dec)\n        output = self.dropout(output)\n        output = output * x_mark_enc.unsqueeze(-1)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/FreTS.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport numpy as np\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/pdf/2311.06184.pdf\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        if self.task_name == 'classification' or self.task_name == 'anomaly_detection' or self.task_name == 'imputation':\n            self.pred_len = configs.seq_len\n        else:\n            self.pred_len = configs.pred_len\n        self.embed_size = 128  # embed_size\n        self.hidden_size = 256  # hidden_size\n        self.pred_len = configs.pred_len\n        self.feature_size = configs.enc_in  # channels\n        self.seq_len = configs.seq_len\n        self.channel_independence = configs.channel_independence\n        self.sparsity_threshold = 0.01\n        self.scale = 0.02\n        self.embeddings = nn.Parameter(torch.randn(1, self.embed_size))\n        self.r1 = nn.Parameter(self.scale * torch.randn(self.embed_size, self.embed_size))\n        self.i1 = nn.Parameter(self.scale * torch.randn(self.embed_size, self.embed_size))\n        self.rb1 = nn.Parameter(self.scale * torch.randn(self.embed_size))\n        self.ib1 = nn.Parameter(self.scale * torch.randn(self.embed_size))\n        self.r2 = nn.Parameter(self.scale * torch.randn(self.embed_size, self.embed_size))\n        self.i2 = nn.Parameter(self.scale * torch.randn(self.embed_size, self.embed_size))\n        self.rb2 = nn.Parameter(self.scale * torch.randn(self.embed_size))\n        self.ib2 = nn.Parameter(self.scale * torch.randn(self.embed_size))\n\n        self.fc = nn.Sequential(\n            nn.Linear(self.seq_len * self.embed_size, self.hidden_size),\n            nn.LeakyReLU(),\n            nn.Linear(self.hidden_size, self.pred_len)\n        )\n\n    # dimension extension\n    def tokenEmb(self, x):\n        # x: [Batch, Input length, Channel]\n        x = x.permute(0, 2, 1)\n        x = x.unsqueeze(3)\n        # N*T*1 x 1*D = N*T*D\n        y = self.embeddings\n        return x * y\n\n    # frequency temporal learner\n    def MLP_temporal(self, x, B, N, L):\n        # [B, N, T, D]\n        x = torch.fft.rfft(x, dim=2, norm='ortho')  # FFT on L dimension\n        y = self.FreMLP(B, N, L, x, self.r2, self.i2, self.rb2, self.ib2)\n        x = torch.fft.irfft(y, n=self.seq_len, dim=2, norm=\"ortho\")\n        return x\n\n    # frequency channel learner\n    def MLP_channel(self, x, B, N, L):\n        # [B, N, T, D]\n        x = x.permute(0, 2, 1, 3)\n        # [B, T, N, D]\n        x = torch.fft.rfft(x, dim=2, norm='ortho')  # FFT on N dimension\n        y = self.FreMLP(B, L, N, x, self.r1, self.i1, self.rb1, self.ib1)\n        x = torch.fft.irfft(y, n=self.feature_size, dim=2, norm=\"ortho\")\n        x = x.permute(0, 2, 1, 3)\n        # [B, N, T, D]\n        return x\n\n    # frequency-domain MLPs\n    # dimension: FFT along the dimension, r: the real part of weights, i: the imaginary part of weights\n    # rb: the real part of bias, ib: the imaginary part of bias\n    def FreMLP(self, B, nd, dimension, x, r, i, rb, ib):\n        o1_real = torch.zeros([B, nd, dimension // 2 + 1, self.embed_size],\n                              device=x.device)\n        o1_imag = torch.zeros([B, nd, dimension // 2 + 1, self.embed_size],\n                              device=x.device)\n\n        o1_real = F.relu(\n            torch.einsum('bijd,dd->bijd', x.real, r) - \\\n            torch.einsum('bijd,dd->bijd', x.imag, i) + \\\n            rb\n        )\n\n        o1_imag = F.relu(\n            torch.einsum('bijd,dd->bijd', x.imag, r) + \\\n            torch.einsum('bijd,dd->bijd', x.real, i) + \\\n            ib\n        )\n\n        y = torch.stack([o1_real, o1_imag], dim=-1)\n        y = F.softshrink(y, lambd=self.sparsity_threshold)\n        y = torch.view_as_complex(y)\n        return y\n\n    def forecast(self, x_enc):\n        # x: [Batch, Input length, Channel]\n        B, T, N = x_enc.shape\n        # embedding x: [B, N, T, D]\n        x = self.tokenEmb(x_enc)\n        bias = x\n        # [B, N, T, D]\n        if self.channel_independence == '0':\n            x = self.MLP_channel(x, B, N, T)\n        # [B, N, T, D]\n        x = self.MLP_temporal(x, B, N, T)\n        x = x + bias\n        x = self.fc(x.reshape(B, N, -1)).permute(0, 2, 1)\n        return x\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        else:\n            raise ValueError('Only forecast tasks implemented yet')\n"
  },
  {
    "path": "models/Informer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Transformer_EncDec import Decoder, DecoderLayer, Encoder, EncoderLayer, ConvLayer\nfrom layers.SelfAttention_Family import ProbAttention, AttentionLayer\nfrom layers.Embed import DataEmbedding\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Informer with Propspare attention in O(LlogL) complexity\n    Paper link: https://ojs.aaai.org/index.php/AAAI/article/view/17325/17132\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n        self.label_len = configs.label_len\n\n        # Embedding\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n        self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        ProbAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            [\n                ConvLayer(\n                    configs.d_model\n                ) for l in range(configs.e_layers - 1)\n            ] if configs.distil and ('forecast' in configs.task_name) else None,\n            norm_layer=torch.nn.LayerNorm(configs.d_model)\n        )\n        # Decoder\n        self.decoder = Decoder(\n            [\n                DecoderLayer(\n                    AttentionLayer(\n                        ProbAttention(True, configs.factor, attention_dropout=configs.dropout, output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    AttentionLayer(\n                        ProbAttention(False, configs.factor, attention_dropout=configs.dropout, output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation,\n                )\n                for l in range(configs.d_layers)\n            ],\n            norm_layer=torch.nn.LayerNorm(configs.d_model),\n            projection=nn.Linear(configs.d_model, configs.c_out, bias=True)\n        )\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.d_model * configs.seq_len, configs.num_class)\n\n    def long_forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        dec_out = self.dec_embedding(x_dec, x_mark_dec)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.decoder(dec_out, enc_out, x_mask=None, cross_mask=None)\n\n        return dec_out  # [B, L, D]\n    \n    def short_forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization\n        mean_enc = x_enc.mean(1, keepdim=True).detach()  # B x 1 x E\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()  # B x 1 x E\n        x_enc = x_enc / std_enc\n\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        dec_out = self.dec_embedding(x_dec, x_mark_dec)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.decoder(dec_out, enc_out, x_mask=None, cross_mask=None)\n\n        dec_out = dec_out * std_enc + mean_enc\n        return dec_out  # [B, L, D]\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # enc\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # final\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        # final\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        # Output\n        output = self.act(enc_out)  # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.dropout(output)\n        output = output * x_mark_enc.unsqueeze(-1)  # zero-out padding embeddings\n        output = output.reshape(output.shape[0], -1)  # (batch_size, seq_length * d_model)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast':\n            dec_out = self.long_forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'short_term_forecast':\n            dec_out = self.short_forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/KANAD.py",
    "content": "import numpy as np\nimport torch\nimport torch.nn as nn\nfrom einops import rearrange\n\n\nclass KANADModel(nn.Module):\n    def __init__(self, window: int, order: int, *args, **kwargs) -> None:\n        super().__init__()\n        self.order = order\n        self.window = window\n        self.channels = 2 * self.order + 1\n        self.register_buffer(\n            \"orders\",\n            self._create_custom_periodic_cosine(self.window, self.order).unsqueeze(\n                0\n            ),  # (1, order, window)\n        )\n        self.out_conv = nn.Conv1d(self.channels, 1, 1, bias=False)\n        self.act = nn.GELU()\n        self.bn1 = nn.BatchNorm1d(self.channels)\n        self.bn3 = nn.BatchNorm1d(1)\n        self.bn2 = nn.BatchNorm1d(self.channels)\n        self.init_conv = nn.Conv1d(self.channels, self.channels, 3, 1, 1, bias=False)\n        self.inner_conv = nn.Conv1d(self.channels, self.channels, 3, 1, 1, bias=False)\n        self.final_conv = nn.Linear(window, window)\n\n    def forward(self, x: torch.Tensor, return_last: bool = False, *args, **kwargs):\n        res = []\n        res.append(x.unsqueeze(1))\n        ff = torch.concat(\n            [self.orders.repeat(x.size(0), 1, 1)]  # type: ignore\n            + [torch.cos(order * x.unsqueeze(1)) for order in range(1, self.order + 1)]\n            + [x.unsqueeze(1)],\n            dim=1,\n        )  # batch,self.channel,window\n        res.append(ff)\n        ff = self.init_conv(ff)\n        ff = self.bn1(ff)\n        ff = self.act(ff)\n        ff = self.inner_conv(ff) + res.pop()\n        ff = self.bn2(ff)\n        ff = self.act(ff)\n        ff = self.out_conv(ff) + res.pop()\n        ff = self.bn3(ff)\n        ff = self.act(ff)\n        ff = self.final_conv(ff)\n        if return_last:\n            return ff.squeeze(1), ff\n        return ff.squeeze(1)\n\n    def _create_custom_periodic_cosine(self, window: int, period) -> torch.Tensor:\n        d = len(period) if isinstance(period, list) else period\n        pl = period if isinstance(period, list) else [i for i in range(1, period + 1)]\n        result = torch.empty(d, window, dtype=torch.float32)\n        for i, p in enumerate(pl):\n            t = torch.arange(0, 1, 1 / window, dtype=torch.float32) / p * 2 * np.pi\n            result[i, :] = torch.cos(t)\n        return result\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n        self.order = configs.d_model\n\n        # Encoder\n        self.enc = KANADModel(window=self.seq_len, order=configs.d_model)\n\n    def anomaly_detection(self, x_enc):\n        ## reshape the input [B, L, D] to [B * D, L]\n        x_input = rearrange(x_enc, \"B L D -> (B D) L\")\n        enc_out = self.enc(x_input)\n        # [B * D, L]\n        dec_out = rearrange(enc_out, \"(B D) L -> B L D\", B=x_enc.size(0))\n        # [B, L, D]\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if (\n            self.task_name == \"long_term_forecast\"\n            or self.task_name == \"short_term_forecast\"\n        ):\n            raise NotImplementedError(\n                \"Task forecasting for KANAD is temporarily not supported\"\n            )\n        if self.task_name == \"imputation\":\n            raise NotImplementedError(\n                \"Task imputation for KANAD is temporarily not supported\"\n            )\n        if self.task_name == \"anomaly_detection\":\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == \"classification\":\n            raise NotImplementedError(\n                \"Task classification for KANAD is temporarily not supported\"\n            )\n        return None\n"
  },
  {
    "path": "models/Koopa.py",
    "content": "import math\nimport torch\nimport torch.nn as nn\nfrom data_provider.data_factory import data_provider\n\n\n\nclass FourierFilter(nn.Module):\n    \"\"\"\n    Fourier Filter: to time-variant and time-invariant term\n    \"\"\"\n    def __init__(self, mask_spectrum):\n        super(FourierFilter, self).__init__()\n        self.mask_spectrum = mask_spectrum\n        \n    def forward(self, x):\n        xf = torch.fft.rfft(x, dim=1)\n        mask = torch.ones_like(xf)\n        mask[:, self.mask_spectrum, :] = 0\n        x_var = torch.fft.irfft(xf*mask, dim=1)\n        x_inv = x - x_var\n        \n        return x_var, x_inv\n    \n\nclass MLP(nn.Module):\n    '''\n    Multilayer perceptron to encode/decode high dimension representation of sequential data\n    '''\n    def __init__(self, \n                 f_in, \n                 f_out, \n                 hidden_dim=128, \n                 hidden_layers=2, \n                 dropout=0.05,\n                 activation='tanh'): \n        super(MLP, self).__init__()\n        self.f_in = f_in\n        self.f_out = f_out\n        self.hidden_dim = hidden_dim\n        self.hidden_layers = hidden_layers\n        self.dropout = dropout\n        if activation == 'relu':\n            self.activation = nn.ReLU()\n        elif activation == 'tanh':\n            self.activation = nn.Tanh()\n        else:\n            raise NotImplementedError\n        \n        layers = [nn.Linear(self.f_in, self.hidden_dim), \n                  self.activation, nn.Dropout(self.dropout)]\n        for i in range(self.hidden_layers-2):\n            layers += [nn.Linear(self.hidden_dim, self.hidden_dim),\n                       self.activation, nn.Dropout(dropout)]\n        \n        layers += [nn.Linear(hidden_dim, f_out)]\n        self.layers = nn.Sequential(*layers)\n\n    def forward(self, x):\n        # x:     B x S x f_in\n        # y:     B x S x f_out\n        y = self.layers(x)\n        return y\n    \n\nclass KPLayer(nn.Module):\n    \"\"\"\n    A demonstration of finding one step transition of linear system by DMD iteratively\n    \"\"\"\n    def __init__(self): \n        super(KPLayer, self).__init__()\n        \n        self.K = None # B E E\n\n    def one_step_forward(self, z, return_rec=False, return_K=False):\n        B, input_len, E = z.shape\n        assert input_len > 1, 'snapshots number should be larger than 1'\n        x, y = z[:, :-1], z[:, 1:]\n\n        # solve linear system\n        self.K = torch.linalg.lstsq(x, y).solution # B E E\n        if torch.isnan(self.K).any():\n            print('Encounter K with nan, replace K by identity matrix')\n            self.K = torch.eye(self.K.shape[1]).to(self.K.device).unsqueeze(0).repeat(B, 1, 1)\n\n        z_pred = torch.bmm(z[:, -1:], self.K)\n        if return_rec:\n            z_rec = torch.cat((z[:, :1], torch.bmm(x, self.K)), dim=1)\n            return z_rec, z_pred\n\n        return z_pred\n    \n    def forward(self, z, pred_len=1):\n        assert pred_len >= 1, 'prediction length should not be less than 1'\n        z_rec, z_pred= self.one_step_forward(z, return_rec=True)\n        z_preds = [z_pred]\n        for i in range(1, pred_len):\n            z_pred = torch.bmm(z_pred, self.K)\n            z_preds.append(z_pred)\n        z_preds = torch.cat(z_preds, dim=1)\n        return z_rec, z_preds\n\n\nclass KPLayerApprox(nn.Module):\n    \"\"\"\n    Find koopman transition of linear system by DMD with multistep K approximation\n    \"\"\"\n    def __init__(self): \n        super(KPLayerApprox, self).__init__()\n        \n        self.K = None # B E E\n        self.K_step = None # B E E\n\n    def forward(self, z, pred_len=1):\n        # z:       B L E, koopman invariance space representation\n        # z_rec:   B L E, reconstructed representation\n        # z_pred:  B S E, forecasting representation\n        B, input_len, E = z.shape\n        assert input_len > 1, 'snapshots number should be larger than 1'\n        x, y = z[:, :-1], z[:, 1:]\n\n        # solve linear system\n        self.K = torch.linalg.lstsq(x, y).solution # B E E\n\n        if torch.isnan(self.K).any():\n            print('Encounter K with nan, replace K by identity matrix')\n            self.K = torch.eye(self.K.shape[1]).to(self.K.device).unsqueeze(0).repeat(B, 1, 1)\n\n        z_rec = torch.cat((z[:, :1], torch.bmm(x, self.K)), dim=1) # B L E\n        \n        if pred_len <= input_len:\n            self.K_step = torch.linalg.matrix_power(self.K, pred_len)\n            if torch.isnan(self.K_step).any():\n                print('Encounter multistep K with nan, replace it by identity matrix')\n                self.K_step = torch.eye(self.K_step.shape[1]).to(self.K_step.device).unsqueeze(0).repeat(B, 1, 1)\n            z_pred = torch.bmm(z[:, -pred_len:, :], self.K_step)\n        else:\n            self.K_step = torch.linalg.matrix_power(self.K, input_len)\n            if torch.isnan(self.K_step).any():\n                print('Encounter multistep K with nan, replace it by identity matrix')\n                self.K_step = torch.eye(self.K_step.shape[1]).to(self.K_step.device).unsqueeze(0).repeat(B, 1, 1)\n            temp_z_pred, all_pred = z, []\n            for _ in range(math.ceil(pred_len / input_len)):\n                temp_z_pred = torch.bmm(temp_z_pred, self.K_step)\n                all_pred.append(temp_z_pred)\n            z_pred = torch.cat(all_pred, dim=1)[:, :pred_len, :]\n\n        return z_rec, z_pred\n    \n\nclass TimeVarKP(nn.Module):\n    \"\"\"\n    Koopman Predictor with DMD (analysitical solution of Koopman operator)\n    Utilize local variations within individual sliding window to predict the future of time-variant term\n    \"\"\"\n    def __init__(self,\n                 enc_in=8,\n                 input_len=96,\n                 pred_len=96,\n                 seg_len=24,\n                 dynamic_dim=128,\n                 encoder=None,\n                 decoder=None,\n                 multistep=False,\n                ):\n        super(TimeVarKP, self).__init__()\n        self.input_len = input_len\n        self.pred_len = pred_len\n        self.enc_in = enc_in\n        self.seg_len = seg_len\n        self.dynamic_dim = dynamic_dim\n        self.multistep = multistep\n        self.encoder, self.decoder = encoder, decoder            \n        self.freq = math.ceil(self.input_len / self.seg_len)  # segment number of input\n        self.step = math.ceil(self.pred_len / self.seg_len)   # segment number of output\n        self.padding_len = self.seg_len * self.freq - self.input_len\n        # Approximate mulitstep K by KPLayerApprox when pred_len is large\n        self.dynamics = KPLayerApprox() if self.multistep else KPLayer() \n\n    def forward(self, x):\n        # x: B L C\n        B, L, C = x.shape\n\n        res = torch.cat((x[:, L-self.padding_len:, :], x) ,dim=1)\n\n        res = res.chunk(self.freq, dim=1)     # F x B P C, P means seg_len\n        res = torch.stack(res, dim=1).reshape(B, self.freq, -1)   # B F PC\n\n        res = self.encoder(res) # B F H\n        x_rec, x_pred = self.dynamics(res, self.step) # B F H, B S H\n\n        x_rec = self.decoder(x_rec) # B F PC\n        x_rec = x_rec.reshape(B, self.freq, self.seg_len, self.enc_in)\n        x_rec = x_rec.reshape(B, -1, self.enc_in)[:, :self.input_len, :]  # B L C\n        \n        x_pred = self.decoder(x_pred)     # B S PC\n        x_pred = x_pred.reshape(B, self.step, self.seg_len, self.enc_in)\n        x_pred = x_pred.reshape(B, -1, self.enc_in)[:, :self.pred_len, :] # B S C\n\n        return x_rec, x_pred\n\n\nclass TimeInvKP(nn.Module):\n    \"\"\"\n    Koopman Predictor with learnable Koopman operator\n    Utilize lookback and forecast window snapshots to predict the future of time-invariant term\n    \"\"\"\n    def __init__(self,\n                 input_len=96,\n                 pred_len=96,\n                 dynamic_dim=128,\n                 encoder=None,\n                 decoder=None):\n        super(TimeInvKP, self).__init__()\n        self.dynamic_dim = dynamic_dim\n        self.input_len = input_len\n        self.pred_len = pred_len\n        self.encoder = encoder\n        self.decoder = decoder\n\n        K_init = torch.randn(self.dynamic_dim, self.dynamic_dim)\n        U, _, V = torch.svd(K_init) # stable initialization\n        self.K = nn.Linear(self.dynamic_dim, self.dynamic_dim, bias=False)\n        self.K.weight.data = torch.mm(U, V.t())\n    \n    def forward(self, x):\n        # x: B L C\n        res = x.transpose(1, 2) # B C L\n        res = self.encoder(res) # B C H\n        res = self.K(res) # B C H\n        res = self.decoder(res) # B C S\n        res = res.transpose(1, 2) # B S C\n\n        return res\n\n\nclass Model(nn.Module):\n    '''\n    Paper link: https://arxiv.org/pdf/2305.18803.pdf\n    '''\n    def __init__(self, configs, dynamic_dim=128, hidden_dim=64, hidden_layers=2, num_blocks=3, multistep=False):\n        \"\"\"\n        mask_spectrum: list, shared frequency spectrums\n        seg_len: int, segment length of time series\n        dynamic_dim: int, latent dimension of koopman embedding\n        hidden_dim: int, hidden dimension of en/decoder\n        hidden_layers: int, number of hidden layers of en/decoder\n        num_blocks: int, number of Koopa blocks\n        multistep: bool, whether to use approximation for multistep K\n        alpha: float, spectrum filter ratio\n        \"\"\"\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.enc_in = configs.enc_in\n        self.input_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n        self.seg_len = self.pred_len\n        self.num_blocks = num_blocks\n        self.dynamic_dim = dynamic_dim\n        self.hidden_dim = hidden_dim\n        self.hidden_layers = hidden_layers\n        self.multistep = multistep\n        self.alpha = 0.2\n        self.mask_spectrum = self._get_mask_spectrum(configs)\n\n        self.disentanglement = FourierFilter(self.mask_spectrum)\n\n        # shared encoder/decoder to make koopman embedding consistent\n        self.time_inv_encoder = MLP(f_in=self.input_len, f_out=self.dynamic_dim, activation='relu',\n                    hidden_dim=self.hidden_dim, hidden_layers=self.hidden_layers)\n        self.time_inv_decoder = MLP(f_in=self.dynamic_dim, f_out=self.pred_len, activation='relu',\n                           hidden_dim=self.hidden_dim, hidden_layers=self.hidden_layers)\n        self.time_inv_kps = self.time_var_kps = nn.ModuleList([\n                                TimeInvKP(input_len=self.input_len,\n                                    pred_len=self.pred_len, \n                                    dynamic_dim=self.dynamic_dim,\n                                    encoder=self.time_inv_encoder, \n                                    decoder=self.time_inv_decoder)\n                                for _ in range(self.num_blocks)])\n\n        # shared encoder/decoder to make koopman embedding consistent\n        self.time_var_encoder = MLP(f_in=self.seg_len*self.enc_in, f_out=self.dynamic_dim, activation='tanh',\n                           hidden_dim=self.hidden_dim, hidden_layers=self.hidden_layers)\n        self.time_var_decoder = MLP(f_in=self.dynamic_dim, f_out=self.seg_len*self.enc_in, activation='tanh',\n                           hidden_dim=self.hidden_dim, hidden_layers=self.hidden_layers)\n        self.time_var_kps = nn.ModuleList([\n                    TimeVarKP(enc_in=configs.enc_in,\n                        input_len=self.input_len,\n                        pred_len=self.pred_len,\n                        seg_len=self.seg_len,\n                        dynamic_dim=self.dynamic_dim,\n                        encoder=self.time_var_encoder,\n                        decoder=self.time_var_decoder,\n                        multistep=self.multistep)\n                    for _ in range(self.num_blocks)])\n\n    def _get_mask_spectrum(self, configs):\n        \"\"\"\n        get shared frequency spectrums\n        \"\"\"\n        train_data, train_loader = data_provider(configs, 'train')\n        amps = 0.0\n        for data in train_loader:\n            lookback_window = data[0]\n            amps += abs(torch.fft.rfft(lookback_window, dim=1)).mean(dim=0).mean(dim=1)\n        mask_spectrum = amps.topk(int(amps.shape[0]*self.alpha)).indices\n        return mask_spectrum # as the spectrums of time-invariant component\n    \n    def forecast(self, x_enc):\n        # Series Stationarization adopted from NSformer\n        mean_enc = x_enc.mean(1, keepdim=True).detach() # B x 1 x E\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()\n        x_enc = x_enc / std_enc\n\n        # Koopman Forecasting\n        residual, forecast = x_enc, None\n        for i in range(self.num_blocks):\n            time_var_input, time_inv_input = self.disentanglement(residual)\n            time_inv_output = self.time_inv_kps[i](time_inv_input)\n            time_var_backcast, time_var_output = self.time_var_kps[i](time_var_input)\n            residual = residual - time_var_backcast\n            if forecast is None:\n                forecast = (time_inv_output + time_var_output)\n            else:\n                forecast += (time_inv_output + time_var_output)\n\n        # Series Stationarization adopted from NSformer\n        res = forecast * std_enc + mean_enc\n\n        return res        \n    \n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        if self.task_name == 'long_term_forecast':\n            dec_out = self.forecast(x_enc)\n            return dec_out[:, -self.pred_len:, :] # [B, L, D]\n"
  },
  {
    "path": "models/LightTS.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n\nclass IEBlock(nn.Module):\n    def __init__(self, input_dim, hid_dim, output_dim, num_node):\n        super(IEBlock, self).__init__()\n\n        self.input_dim = input_dim\n        self.hid_dim = hid_dim\n        self.output_dim = output_dim\n        self.num_node = num_node\n\n        self._build()\n\n    def _build(self):\n        self.spatial_proj = nn.Sequential(\n            nn.Linear(self.input_dim, self.hid_dim),\n            nn.LeakyReLU(),\n            nn.Linear(self.hid_dim, self.hid_dim // 4)\n        )\n\n        self.channel_proj = nn.Linear(self.num_node, self.num_node)\n        torch.nn.init.eye_(self.channel_proj.weight)\n\n        self.output_proj = nn.Linear(self.hid_dim // 4, self.output_dim)\n\n    def forward(self, x):\n        x = self.spatial_proj(x.permute(0, 2, 1))\n        x = x.permute(0, 2, 1) + self.channel_proj(x.permute(0, 2, 1))\n        x = self.output_proj(x.permute(0, 2, 1))\n\n        x = x.permute(0, 2, 1)\n\n        return x\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/abs/2207.01186\n    \"\"\"\n\n    def __init__(self, configs, chunk_size=24):\n        \"\"\"\n        chunk_size: int, reshape T into [num_chunks, chunk_size]\n        \"\"\"\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        if self.task_name == 'classification' or self.task_name == 'anomaly_detection' or self.task_name == 'imputation':\n            self.pred_len = configs.seq_len\n        else:\n            self.pred_len = configs.pred_len\n\n        if configs.task_name == 'long_term_forecast' or configs.task_name == 'short_term_forecast':\n            self.chunk_size = min(configs.pred_len, configs.seq_len, chunk_size)\n        else:\n            self.chunk_size = min(configs.seq_len, chunk_size)\n        # assert (self.seq_len % self.chunk_size == 0)\n        if self.seq_len % self.chunk_size != 0:\n            self.seq_len += (self.chunk_size - self.seq_len % self.chunk_size)  # padding in order to ensure complete division\n        self.num_chunks = self.seq_len // self.chunk_size\n\n        self.d_model = configs.d_model\n        self.enc_in = configs.enc_in\n        self.dropout = configs.dropout\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.enc_in * configs.seq_len, configs.num_class)\n        self._build()\n\n    def _build(self):\n        self.layer_1 = IEBlock(\n            input_dim=self.chunk_size,\n            hid_dim=self.d_model // 4,\n            output_dim=self.d_model // 4,\n            num_node=self.num_chunks\n        )\n\n        self.chunk_proj_1 = nn.Linear(self.num_chunks, 1)\n\n        self.layer_2 = IEBlock(\n            input_dim=self.chunk_size,\n            hid_dim=self.d_model // 4,\n            output_dim=self.d_model // 4,\n            num_node=self.num_chunks\n        )\n\n        self.chunk_proj_2 = nn.Linear(self.num_chunks, 1)\n\n        self.layer_3 = IEBlock(\n            input_dim=self.d_model // 2,\n            hid_dim=self.d_model // 2,\n            output_dim=self.pred_len,\n            num_node=self.enc_in\n        )\n\n        self.ar = nn.Linear(self.seq_len, self.pred_len)\n\n    def encoder(self, x):\n        B, T, N = x.size()\n\n        # padding\n        x = torch.cat([x, torch.zeros((B, self.seq_len - T, N)).to(x.device)], dim=1)\n\n        highway = self.ar(x.permute(0, 2, 1))\n        highway = highway.permute(0, 2, 1)\n\n        # continuous sampling\n        x1 = x.reshape(B, self.num_chunks, self.chunk_size, N)\n        x1 = x1.permute(0, 3, 2, 1)\n        x1 = x1.reshape(-1, self.chunk_size, self.num_chunks)\n        x1 = self.layer_1(x1)\n        x1 = self.chunk_proj_1(x1).squeeze(dim=-1)\n\n        # interval sampling\n        x2 = x.reshape(B, self.chunk_size, self.num_chunks, N)\n        x2 = x2.permute(0, 3, 1, 2)\n        x2 = x2.reshape(-1, self.chunk_size, self.num_chunks)\n        x2 = self.layer_2(x2)\n        x2 = self.chunk_proj_2(x2).squeeze(dim=-1)\n\n        x3 = torch.cat([x1, x2], dim=-1)\n\n        x3 = x3.reshape(B, N, -1)\n        x3 = x3.permute(0, 2, 1)\n\n        out = self.layer_3(x3)\n\n        out = out + highway\n        return out\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        return self.encoder(x_enc)\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        return self.encoder(x_enc)\n\n    def anomaly_detection(self, x_enc):\n        return self.encoder(x_enc)\n\n    def classification(self, x_enc, x_mark_enc):\n        enc_out = self.encoder(x_enc)\n\n        # Output\n        output = enc_out.reshape(enc_out.shape[0], -1)  # (batch_size, seq_length * d_model)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/MICN.py",
    "content": "import torch\nimport torch.nn as nn\nfrom layers.Embed import DataEmbedding\nfrom layers.Autoformer_EncDec import series_decomp, series_decomp_multi\nimport torch.nn.functional as F\n\n\nclass MIC(nn.Module):\n    \"\"\"\n    MIC layer to extract local and global features\n    \"\"\"\n\n    def __init__(self, feature_size=512, n_heads=8, dropout=0.05, decomp_kernel=[32], conv_kernel=[24],\n                 isometric_kernel=[18, 6], device='cuda'):\n        super(MIC, self).__init__()\n        self.conv_kernel = conv_kernel\n        self.device = device\n\n        # isometric convolution\n        self.isometric_conv = nn.ModuleList([nn.Conv1d(in_channels=feature_size, out_channels=feature_size,\n                                                       kernel_size=i, padding=0, stride=1)\n                                             for i in isometric_kernel])\n\n        # downsampling convolution: padding=i//2, stride=i\n        self.conv = nn.ModuleList([nn.Conv1d(in_channels=feature_size, out_channels=feature_size,\n                                             kernel_size=i, padding=i // 2, stride=i)\n                                   for i in conv_kernel])\n\n        # upsampling convolution\n        self.conv_trans = nn.ModuleList([nn.ConvTranspose1d(in_channels=feature_size, out_channels=feature_size,\n                                                            kernel_size=i, padding=0, stride=i)\n                                         for i in conv_kernel])\n\n        self.decomp = nn.ModuleList([series_decomp(k) for k in decomp_kernel])\n        self.merge = torch.nn.Conv2d(in_channels=feature_size, out_channels=feature_size,\n                                     kernel_size=(len(self.conv_kernel), 1))\n\n        # feedforward network\n        self.conv1 = nn.Conv1d(in_channels=feature_size, out_channels=feature_size * 4, kernel_size=1)\n        self.conv2 = nn.Conv1d(in_channels=feature_size * 4, out_channels=feature_size, kernel_size=1)\n        self.norm1 = nn.LayerNorm(feature_size)\n        self.norm2 = nn.LayerNorm(feature_size)\n\n        self.norm = torch.nn.LayerNorm(feature_size)\n        self.act = torch.nn.Tanh()\n        self.drop = torch.nn.Dropout(0.05)\n\n    def conv_trans_conv(self, input, conv1d, conv1d_trans, isometric):\n        batch, seq_len, channel = input.shape\n        x = input.permute(0, 2, 1)\n\n        # downsampling convolution\n        x1 = self.drop(self.act(conv1d(x)))\n        x = x1\n\n        # isometric convolution\n        zeros = torch.zeros((x.shape[0], x.shape[1], x.shape[2] - 1), device=self.device)\n        x = torch.cat((zeros, x), dim=-1)\n        x = self.drop(self.act(isometric(x)))\n        x = self.norm((x + x1).permute(0, 2, 1)).permute(0, 2, 1)\n\n        # upsampling convolution\n        x = self.drop(self.act(conv1d_trans(x)))\n        x = x[:, :, :seq_len]  # truncate\n\n        x = self.norm(x.permute(0, 2, 1) + input)\n        return x\n\n    def forward(self, src):\n        self.device = src.device\n        # multi-scale\n        multi = []\n        for i in range(len(self.conv_kernel)):\n            src_out, trend1 = self.decomp[i](src)\n            src_out = self.conv_trans_conv(src_out, self.conv[i], self.conv_trans[i], self.isometric_conv[i])\n            multi.append(src_out)\n\n        # merge\n        mg = torch.tensor([], device=self.device)\n        for i in range(len(self.conv_kernel)):\n            mg = torch.cat((mg, multi[i].unsqueeze(1).to(self.device)), dim=1)\n        mg = self.merge(mg.permute(0, 3, 1, 2)).squeeze(-2).permute(0, 2, 1)\n\n        y = self.norm1(mg)\n        y = self.conv2(self.conv1(y.transpose(-1, 1))).transpose(-1, 1)\n\n        return self.norm2(mg + y)\n\n\nclass SeasonalPrediction(nn.Module):\n    def __init__(self, embedding_size=512, n_heads=8, dropout=0.05, d_layers=1, decomp_kernel=[32], c_out=1,\n                 conv_kernel=[2, 4], isometric_kernel=[18, 6], device='cuda'):\n        super(SeasonalPrediction, self).__init__()\n\n        self.mic = nn.ModuleList([MIC(feature_size=embedding_size, n_heads=n_heads,\n                                      decomp_kernel=decomp_kernel, conv_kernel=conv_kernel,\n                                      isometric_kernel=isometric_kernel, device=device)\n                                  for i in range(d_layers)])\n\n        self.projection = nn.Linear(embedding_size, c_out)\n\n    def forward(self, dec):\n        for mic_layer in self.mic:\n            dec = mic_layer(dec)\n        return self.projection(dec)\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://openreview.net/pdf?id=zt53IDUR1U\n    \"\"\"\n    def __init__(self, configs, conv_kernel=[12, 16]):\n        \"\"\"\n        conv_kernel: downsampling and upsampling convolution kernel_size\n        \"\"\"\n        super(Model, self).__init__()\n\n        decomp_kernel = []  # kernel of decomposition operation\n        isometric_kernel = []  # kernel of isometric convolution\n        for ii in conv_kernel:\n            if ii % 2 == 0:  # the kernel of decomposition operation must be odd\n                decomp_kernel.append(ii + 1)\n                isometric_kernel.append((configs.seq_len + configs.pred_len + ii) // ii)\n            else:\n                decomp_kernel.append(ii)\n                isometric_kernel.append((configs.seq_len + configs.pred_len + ii - 1) // ii)\n\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n        self.seq_len = configs.seq_len\n\n        # Multiple Series decomposition block from FEDformer\n        self.decomp_multi = series_decomp_multi(decomp_kernel)\n\n        # embedding\n        self.dec_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n\n        self.conv_trans = SeasonalPrediction(embedding_size=configs.d_model, n_heads=configs.n_heads,\n                                             dropout=configs.dropout,\n                                             d_layers=configs.d_layers, decomp_kernel=decomp_kernel,\n                                             c_out=configs.c_out, conv_kernel=conv_kernel,\n                                             isometric_kernel=isometric_kernel, device=torch.device('cuda:0'))\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            # refer to DLinear\n            self.regression = nn.Linear(configs.seq_len, configs.pred_len)\n            self.regression.weight = nn.Parameter(\n                (1 / configs.pred_len) * torch.ones([configs.pred_len, configs.seq_len]),\n                requires_grad=True)\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.c_out * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Multi-scale Hybrid Decomposition\n        seasonal_init_enc, trend = self.decomp_multi(x_enc)\n        trend = self.regression(trend.permute(0, 2, 1)).permute(0, 2, 1)\n\n        # embedding\n        zeros = torch.zeros([x_dec.shape[0], self.pred_len, x_dec.shape[2]], device=x_enc.device)\n        seasonal_init_dec = torch.cat([seasonal_init_enc[:, -self.seq_len:, :], zeros], dim=1)\n        dec_out = self.dec_embedding(seasonal_init_dec, x_mark_dec)\n        dec_out = self.conv_trans(dec_out)\n        dec_out = dec_out[:, -self.pred_len:, :] + trend[:, -self.pred_len:, :]\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # Multi-scale Hybrid Decomposition\n        seasonal_init_enc, trend = self.decomp_multi(x_enc)\n\n        # embedding\n        dec_out = self.dec_embedding(seasonal_init_enc, x_mark_dec)\n        dec_out = self.conv_trans(dec_out)\n        dec_out = dec_out + trend\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # Multi-scale Hybrid Decomposition\n        seasonal_init_enc, trend = self.decomp_multi(x_enc)\n\n        # embedding\n        dec_out = self.dec_embedding(seasonal_init_enc, None)\n        dec_out = self.conv_trans(dec_out)\n        dec_out = dec_out + trend\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # Multi-scale Hybrid Decomposition\n        seasonal_init_enc, trend = self.decomp_multi(x_enc)\n        # embedding\n        dec_out = self.dec_embedding(seasonal_init_enc, None)\n        dec_out = self.conv_trans(dec_out)\n        dec_out = dec_out + trend\n\n        # Output from Non-stationary Transformer\n        output = self.act(dec_out)  # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.dropout(output)\n        output = output * x_mark_enc.unsqueeze(-1)  # zero-out padding embeddings\n        output = output.reshape(output.shape[0], -1)  # (batch_size, seq_length * d_model)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/MSGNet.py",
    "content": "import numpy as np\n# import pywt\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.fft\nfrom layers.Embed import DataEmbedding\nfrom layers.MSGBlock import GraphBlock, simpleVIT, Attention_Block, Predict\n\n\ndef FFT_for_Period(x, k=2):\n    # [B, T, C]\n    xf = torch.fft.rfft(x, dim=1)\n    frequency_list = abs(xf).mean(0).mean(-1)\n    frequency_list[0] = 0\n    _, top_list = torch.topk(frequency_list, k)\n    top_list = top_list.detach().cpu().numpy()\n    period = x.shape[1] // top_list\n    return period, abs(xf).mean(-1)[:, top_list]\n\n\nclass ScaleGraphBlock(nn.Module):\n    def __init__(self, configs):\n        super(ScaleGraphBlock, self).__init__()\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.k = configs.top_k\n\n        self.att0 = Attention_Block(configs.d_model, configs.d_ff,\n                                   n_heads=configs.n_heads, dropout=configs.dropout, activation=\"gelu\")\n        self.norm = nn.LayerNorm(configs.d_model)\n        self.gelu = nn.GELU()\n        self.gconv = nn.ModuleList()\n        for i in range(self.k):\n            self.gconv.append(\n                GraphBlock(configs.c_out , configs.d_model , configs.conv_channel, configs.skip_channel,\n                        configs.gcn_depth , configs.dropout, configs.propalpha ,configs.seq_len,\n                           configs.node_dim))\n\n\n    def forward(self, x):\n        B, T, N = x.size()\n        scale_list, scale_weight = FFT_for_Period(x, self.k)\n        res = []\n        for i in range(self.k):\n            scale = scale_list[i]\n            #Gconv\n            x = self.gconv[i](x)\n            # paddng\n            if (self.seq_len) % scale != 0:\n                length = (((self.seq_len) // scale) + 1) * scale\n                padding = torch.zeros([x.shape[0], (length - (self.seq_len)), x.shape[2]]).to(x.device)\n                out = torch.cat([x, padding], dim=1)\n            else:\n                length = self.seq_len\n                out = x\n            out = out.reshape(B, length // scale, scale, N)\n\n        #for Mul-attetion\n            out = out.reshape(-1 , scale , N)\n            out = self.norm(self.att0(out))\n            out = self.gelu(out)\n            out = out.reshape(B, -1 , scale , N).reshape(B ,-1 ,N)\n        # #for simpleVIT\n        #     out = self.att(out.permute(0, 3, 1, 2).contiguous()) #return\n        #     out = out.permute(0, 2, 3, 1).reshape(B, -1 ,N)\n\n            out = out[:, :self.seq_len, :]\n            res.append(out)\n\n        res = torch.stack(res, dim=-1)\n        # adaptive aggregation\n        scale_weight = F.softmax(scale_weight, dim=1)\n        scale_weight = scale_weight.unsqueeze(1).unsqueeze(1).repeat(1, T, N, 1)\n        res = torch.sum(res * scale_weight, -1)\n        # residual connection\n        res = res + x\n        return res\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.configs = configs\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n        self.device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\n        # for graph\n        # self.num_nodes = configs.c_out\n        # self.subgraph_size = configs.subgraph_size\n        # self.node_dim = configs.node_dim\n        # to return adj (node , node)\n        # self.graph = constructor_graph()\n\n        self.model = nn.ModuleList([ScaleGraphBlock(configs) for _ in range(configs.e_layers)])\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model,\n                                           configs.embed, configs.freq, configs.dropout)\n        self.layer = configs.e_layers\n        self.layer_norm = nn.LayerNorm(configs.d_model)\n        self.predict_linear = nn.Linear(\n            self.seq_len, self.pred_len + self.seq_len)\n        self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        self.seq2pred = Predict(configs.individual, configs.c_out,\n                                configs.seq_len, configs.pred_len, configs.dropout)\n\n        if self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.d_model * configs.seq_len, configs.num_class)\n\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n        # adp = self.graph(torch.arange(self.num_nodes).to(self.device))\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n\n        # porject back\n        dec_out = self.projection(enc_out)\n        dec_out = self.seq2pred(dec_out.transpose(1, 2)).transpose(1, 2)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len, 1))\n\n        return dec_out[:, -self.pred_len:, :]\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        _, L, N = x_enc.shape\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n        # adp = self.graph(torch.arange(self.num_nodes).to(self.device))\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n\n        # porject back\n        dec_out = self.projection(enc_out)\n        # dec_out = self.seq2pred(dec_out.transpose(1, 2)).transpose(1, 2)\n        # print(dec_out.shape)\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, L, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, L, 1))\n\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        _, L, N = x_enc.shape\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\n        # adp = self.graph(torch.arange(self.num_nodes).to(self.device))\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n\n        # porject back\n        dec_out = self.projection(enc_out)\n        # dec_out = self.seq2pred(dec_out.transpose(1, 2)).transpose(1, 2)\n        # print(dec_out.shape)\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, L, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, L, 1))\n\n        return dec_out\n\n\n    def classification(self, x_enc, x_mark_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\n        # adp = self.graph(torch.arange(self.num_nodes).to(self.device))\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        # zero-out padding embeddings\n        output = output * x_mark_enc.unsqueeze(-1)\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n\n"
  },
  {
    "path": "models/Mamba.py",
    "content": "import math\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom mamba_ssm import Mamba\n\nfrom layers.Embed import DataEmbedding\n\nclass Model(nn.Module):\n    \n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n\n        self.d_inner = configs.d_model * configs.expand\n        self.dt_rank = math.ceil(configs.d_model / 16) # TODO implement \"auto\"\n        \n        self.embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq, configs.dropout)\n\n        self.mamba = Mamba(\n            d_model = configs.d_model,\n            d_state = configs.d_ff,\n            d_conv = configs.d_conv,\n            expand = configs.expand,\n        )\n\n        self.out_layer = nn.Linear(configs.d_model, configs.c_out, bias=False)\n\n    def forecast(self, x_enc, x_mark_enc):\n        mean_enc = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()\n        x_enc = x_enc / std_enc\n\n        x = self.embedding(x_enc, x_mark_enc)\n        x = self.mamba(x)\n        x_out = self.out_layer(x)\n\n        x_out = x_out * std_enc + mean_enc\n        return x_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name in ['short_term_forecast', 'long_term_forecast']:\n            x_out = self.forecast(x_enc, x_mark_enc)\n            return x_out[:, -self.pred_len:, :]\n\n        # other tasks not implemented"
  },
  {
    "path": "models/MambaSimple.py",
    "content": "import math\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom einops import rearrange, repeat, einsum\n\nfrom layers.Embed import DataEmbedding\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Mamba, linear-time sequence modeling with selective state spaces O(L)\n    Paper link: https://arxiv.org/abs/2312.00752\n    Implementation refernce: https://github.com/johnma2006/mamba-minimal/\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n\n        self.d_inner = configs.d_model * configs.expand\n        self.dt_rank = math.ceil(configs.d_model / 16)\n\n        self.embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq, configs.dropout)\n\n        self.layers = nn.ModuleList([ResidualBlock(configs, self.d_inner, self.dt_rank) for _ in range(configs.e_layers)])\n        self.norm = RMSNorm(configs.d_model)\n\n        self.out_layer = nn.Linear(configs.d_model, configs.c_out, bias=False)\n\n    def forecast(self, x_enc, x_mark_enc):\n        mean_enc = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()\n        x_enc = x_enc / std_enc\n\n        x = self.embedding(x_enc, x_mark_enc)\n        for layer in self.layers:\n            x = layer(x)\n\n        x = self.norm(x)\n        x_out = self.out_layer(x)\n\n        x_out = x_out * std_enc + mean_enc\n        return x_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name in ['short_term_forecast', 'long_term_forecast']:\n            x_out = self.forecast(x_enc, x_mark_enc)\n            return x_out[:, -self.pred_len:, :]\n\n\nclass ResidualBlock(nn.Module):\n    def __init__(self, configs, d_inner, dt_rank):\n        super(ResidualBlock, self).__init__()\n        \n        self.mixer = MambaBlock(configs, d_inner, dt_rank)\n        self.norm = RMSNorm(configs.d_model)\n\n    def forward(self, x):\n        output = self.mixer(self.norm(x)) + x\n        return output\n\nclass MambaBlock(nn.Module):\n    def __init__(self, configs, d_inner, dt_rank):\n        super(MambaBlock, self).__init__()\n        self.d_inner = d_inner\n        self.dt_rank = dt_rank\n\n        self.in_proj = nn.Linear(configs.d_model, self.d_inner * 2, bias=False)\n        \n        self.conv1d = nn.Conv1d(\n            in_channels = self.d_inner,\n            out_channels = self.d_inner,\n            bias = True,\n            kernel_size = configs.d_conv,\n            padding = configs.d_conv - 1,\n            groups = self.d_inner\n        )\n\n        # takes in x and outputs the input-specific delta, B, C\n        self.x_proj = nn.Linear(self.d_inner, self.dt_rank + configs.d_ff * 2, bias=False)\n\n        # projects delta\n        self.dt_proj = nn.Linear(self.dt_rank, self.d_inner, bias=True)\n\n        A = repeat(torch.arange(1, configs.d_ff + 1), \"n -> d n\", d=self.d_inner).float()\n        self.A_log = nn.Parameter(torch.log(A))\n        self.D = nn.Parameter(torch.ones(self.d_inner))\n\n        self.out_proj = nn.Linear(self.d_inner, configs.d_model, bias=False)\n\n    def forward(self, x):\n        \"\"\"\n        Figure 3 in Section 3.4 in the paper\n        \"\"\"\n        (b, l, d) = x.shape\n\n        x_and_res = self.in_proj(x) # [B, L, 2 * d_inner]\n        (x, res) = x_and_res.split(split_size=[self.d_inner, self.d_inner], dim=-1)\n\n        x = rearrange(x, \"b l d -> b d l\")\n        x = self.conv1d(x)[:, :, :l]\n        x = rearrange(x, \"b d l -> b l d\")\n\n        x = F.silu(x)\n\n        y = self.ssm(x)\n        y = y * F.silu(res)\n\n        output = self.out_proj(y)\n        return output\n\n\n    def ssm(self, x):\n        \"\"\"\n        Algorithm 2 in Section 3.2 in the paper\n        \"\"\"\n        \n        (d_in, n) = self.A_log.shape\n\n        A = -torch.exp(self.A_log.float()) # [d_in, n]\n        D = self.D.float() # [d_in]\n\n        x_dbl = self.x_proj(x) # [B, L, d_rank + 2 * d_ff]\n        (delta, B, C) = x_dbl.split(split_size=[self.dt_rank, n, n], dim=-1) # delta: [B, L, d_rank]; B, C: [B, L, n]\n        delta = F.softplus(self.dt_proj(delta)) # [B, L, d_in]\n        y = self.selective_scan(x, delta, A, B, C, D)\n\n        return y\n\n    def selective_scan(self, u, delta, A, B, C, D):\n        (b, l, d_in) = u.shape\n        n = A.shape[1]\n\n        deltaA = torch.exp(einsum(delta, A, \"b l d, d n -> b l d n\")) # A is discretized using zero-order hold (ZOH) discretization\n        deltaB_u = einsum(delta, B, u, \"b l d, b l n, b l d -> b l d n\") # B is discretized using a simplified Euler discretization instead of ZOH. From a discussion with authors: \"A is the more important term and the performance doesn't change much with the simplification on B\"\n\n        # selective scan, sequential instead of parallel\n        x = torch.zeros((b, d_in, n), device=deltaA.device)\n        ys = []\n        for i in range(l):\n            x = deltaA[:, i] * x + deltaB_u[:, i]\n            y = einsum(x, C[:, i, :], \"b d n, b n -> b d\")\n            ys.append(y)\n\n        y = torch.stack(ys, dim=1) # [B, L, d_in]\n        y = y + u * D\n\n        return y\n\nclass RMSNorm(nn.Module):\n    def __init__(self, d_model, eps=1e-5):\n        super(RMSNorm, self).__init__()\n        self.eps = eps\n        self.weight = nn.Parameter(torch.ones(d_model))\n\n    def forward(self, x):\n        output = x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) * self.weight\n        return output\n"
  },
  {
    "path": "models/MambaSingleLayer.py",
    "content": "import torch.nn as nn\n\nfrom layers.Embed import PositionalEmbedding\nfrom layers.MambaBlock import Mamba_TimeVariant\n\n\nclass TokenEmbedding_cls(nn.Module):\n    \"\"\"TokenEmbedding with configurable kernel size(`d_kernel`).\n    \"\"\"\n    def __init__(self, c_in, d_model, d_kernel=3):\n        super().__init__()\n        self.tokenConv = nn.Conv1d(in_channels=c_in, out_channels=d_model,\n                                   kernel_size=d_kernel, padding='same', padding_mode='replicate', bias=False)\n        \n        for m in self.modules():\n            if isinstance(m, nn.Conv1d):\n                nn.init.kaiming_normal_(\n                    m.weight, mode='fan_in', nonlinearity='leaky_relu')\n\n    def forward(self, x):\n        x = self.tokenConv(x.permute(0, 2, 1)).transpose(1, 2)\n        return x\n\n\nclass DataEmbedding_cls(nn.Module):\n    \"\"\"DataEmbedding with configurable kernel size(`d_kernel`) and sequence length(`seq_len`).\n\n    To solve the warning for EigenWorms dataset (seq_len=17984) while keeping consistency comparing with other models, we set max_len=max(5000, seq_len).\"\"\"\n    def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1, d_kernel=3, seq_len=5000):\n        super(DataEmbedding_cls, self).__init__()\n        self.value_embedding = TokenEmbedding_cls(c_in=c_in, d_model=d_model, d_kernel=d_kernel)\n        self.position_embedding = PositionalEmbedding(d_model=d_model, max_len=max(5000, seq_len))\n        self.dropout = nn.Dropout(p=dropout) if dropout > 0 else nn.Identity()\n\n    def forward(self, x):\n        x = self.value_embedding(x) + self.position_embedding(x)\n        return self.dropout(x)\n\n\n\nclass Model(nn.Module):\n    \"\"\"MambaSL: Exploring Single-Layer Mamba for Time Series Classification\n    \n    - Paper Link: https://openreview.net/pdf?id=YDl4vqQqGP\n    - Original Repo: https://github.com/yoom618/MambaSL. removed all extra codes for ablation study and further analysis.\n    \"\"\"\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n        self.c_out = configs.c_out\n        self.dropout = configs.dropout\n        self.num_kernels = configs.num_kernels\n        \n        self.mamba = nn.Sequential(\n            Mamba_TimeVariant(\n                d_model = configs.d_model,\n                d_state = configs.d_ff,\n                d_conv = configs.d_conv,\n                expand = configs.expand,\n                timevariant_dt = bool(configs.tv_dt),    # only available in Mamba_TimeVariant\n                timevariant_B = bool(configs.tv_B),      # only available in Mamba_TimeVariant\n                timevariant_C = bool(configs.tv_C),      # only available in Mamba_TimeVariant\n                use_D = bool(configs.use_D),             # use D(skip connection) or not\n                device = configs.device,\n            ),\n            nn.LayerNorm(configs.d_model),\n            nn.SiLU(),  # simply choose the same activation fn as Mamba Block\n        )\n        \n        if self.task_name in ['classification']:  # one class per one sequence sample\n            \n            self.embedding = DataEmbedding_cls(configs.enc_in, configs.d_model,\n                                        configs.embed, configs.freq, configs.dropout, \n                                        configs.num_kernels, configs.seq_len)\n            \n            self.out_layer = nn.Sequential(\n                nn.Dropout(configs.dropout),\n                nn.Linear(configs.d_model, configs.num_class, bias=False)\n            )\n            nn.init.xavier_uniform_(self.out_layer[1].weight)\n            \n            self.attn_weight = nn.Sequential(\n                nn.Linear(configs.d_model, configs.n_heads, bias=True),\n                nn.AdaptiveMaxPool1d(1),\n                nn.Softmax(dim=1),\n            )\n            for m in self.attn_weight.modules():\n                if isinstance(m, nn.Linear):\n                    nn.init.zeros_(m.weight)\n                    if m.bias is not None: m.bias.data.fill_(1.0)\n            \n        else:\n            raise ValueError(f\"task_name: {configs.task_name} is not valid.\")\n\n\n\n    def forward(self, x_enc, x_mark_enc, x_dec=None, x_mark_dec=None, mask=None):\n        \n        if self.task_name in ['classification']:\n\n            mamba_in = self.embedding(x_enc)  # (B, L_in, D)\n            mamba_out = self.mamba(mamba_in)  # (B, L_in, D)\n            \n            ### [proposed] use the gating value to make the final prediction\n            logit_out = self.out_layer(mamba_out)  # (B, L_in, D) -> (B, L_in, C_out)\n            logit_out *= x_mark_enc.unsqueeze(2)  # (B, L_in, C_out)  # Mask out the padded sequence for variable length data (e.g. JapaneseVowels)\n        \n            ### Compute attention weights for weighted sum of logit_out\n            w_out = self.attn_weight(mamba_out)  # (B, L_in, D) -> (B, L_in, n_head) -> (B, L_in, 1)\n\n            ### calculate the weighted average of the hidden states to make the final prediction\n            out = logit_out * w_out  # (B, L_in, C_out)\n            out = out.sum(1)  # (B, C_out)\n\n            return out\n\n        \n        else:\n            raise ValueError(f\"task_name: {self.task_name} is not valid.\")"
  },
  {
    "path": "models/Moirai.py",
    "content": "import numpy as np\nimport torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nfrom uni2ts.eval_util.plot import plot_single\nfrom uni2ts.model.moirai import MoiraiForecast, MoiraiModule\nfrom uni2ts.model.moirai_moe import MoiraiMoEForecast, MoiraiMoEModule\nfrom uni2ts.model.moirai2 import Moirai2Forecast, Moirai2Module\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.model = Moirai2Forecast(\n            module=Moirai2Module.from_pretrained(\n                f\"Salesforce/moirai-2.0-R-small\",\n            ),\n            prediction_length=configs.pred_len,\n            context_length=configs.seq_len,\n            target_dim=1,\n            feat_dynamic_real_dim=0,\n            past_feat_dynamic_real_dim=0,\n        ).to('cuda')\n\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        outputs = []\n        for i in range(x_enc.shape[-1]):\n            output = self.model.predict(x_enc[...,i].cpu().numpy())\n            output = np.mean(output, axis=1)\n            outputs.append(torch.Tensor(output).to(x_enc.device))\n        dec_out = torch.stack(outputs, dim=-1)\n\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/MultiPatchFormer.py",
    "content": "import torch\nimport torch.nn as nn\nimport math\nfrom einops import rearrange\n\nfrom layers.SelfAttention_Family import AttentionLayer, FullAttention\n\n\nclass FeedForward(nn.Module):\n    def __init__(self, d_model: int, d_hidden: int = 512):\n        super(FeedForward, self).__init__()\n\n        self.linear_1 = torch.nn.Linear(d_model, d_hidden)\n        self.linear_2 = torch.nn.Linear(d_hidden, d_model)\n        self.activation = torch.nn.GELU()\n\n    def forward(self, x):\n        x = self.linear_1(x)\n        x = self.activation(x)\n        x = self.linear_2(x)\n\n        return x\n\n\nclass Encoder(nn.Module):\n    def __init__(\n        self,\n        d_model: int,\n        mha: AttentionLayer,\n        d_hidden: int,\n        dropout: float = 0,\n        channel_wise=False,\n    ):\n        super(Encoder, self).__init__()\n\n        self.channel_wise = channel_wise\n        if self.channel_wise:\n            self.conv = torch.nn.Conv1d(\n                in_channels=d_model,\n                out_channels=d_model,\n                kernel_size=1,\n                stride=1,\n                padding=0,\n                padding_mode=\"reflect\",\n            )\n        self.MHA = mha\n        self.feedforward = FeedForward(d_model=d_model, d_hidden=d_hidden)\n        self.dropout = torch.nn.Dropout(p=dropout)\n        self.layerNormal_1 = torch.nn.LayerNorm(d_model)\n        self.layerNormal_2 = torch.nn.LayerNorm(d_model)\n\n    def forward(self, x):\n        residual = x\n        q = residual\n        if self.channel_wise:\n            x_r = self.conv(x.permute(0, 2, 1)).transpose(1, 2)\n            k = x_r\n            v = x_r\n        else:\n            k = residual\n            v = residual\n        x, score = self.MHA(q, k, v, attn_mask=None)\n        x = self.dropout(x)\n        x = self.layerNormal_1(x + residual)\n\n        residual = x\n        x = self.feedforward(residual)\n        x = self.dropout(x)\n        x = self.layerNormal_2(x + residual)\n\n        return x, score\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.d_channel = configs.enc_in\n        self.N = configs.e_layers\n        # Embedding\n        self.d_model = configs.d_model\n        self.d_hidden = configs.d_ff\n        self.n_heads = configs.n_heads\n        self.mask = True\n        self.dropout = configs.dropout\n\n        self.stride1 = 8\n        self.patch_len1 = 8\n        self.stride2 = 8\n        self.patch_len2 = 16\n        self.stride3 = 7\n        self.patch_len3 = 24\n        self.stride4 = 6\n        self.patch_len4 = 32\n        self.patch_num1 = int((self.seq_len - self.patch_len2) // self.stride2) + 2\n        self.padding_patch_layer1 = nn.ReplicationPad1d((0, self.stride1))\n        self.padding_patch_layer2 = nn.ReplicationPad1d((0, self.stride2))\n        self.padding_patch_layer3 = nn.ReplicationPad1d((0, self.stride3))\n        self.padding_patch_layer4 = nn.ReplicationPad1d((0, self.stride4))\n\n        self.shared_MHA = nn.ModuleList(\n            [\n                AttentionLayer(\n                    FullAttention(mask_flag=self.mask),\n                    d_model=self.d_model,\n                    n_heads=self.n_heads,\n                )\n                for _ in range(self.N)\n            ]\n        )\n\n        self.shared_MHA_ch = nn.ModuleList(\n            [\n                AttentionLayer(\n                    FullAttention(mask_flag=self.mask),\n                    d_model=self.d_model,\n                    n_heads=self.n_heads,\n                )\n                for _ in range(self.N)\n            ]\n        )\n\n        self.encoder_list = nn.ModuleList(\n            [\n                Encoder(\n                    d_model=self.d_model,\n                    mha=self.shared_MHA[ll],\n                    d_hidden=self.d_hidden,\n                    dropout=self.dropout,\n                    channel_wise=False,\n                )\n                for ll in range(self.N)\n            ]\n        )\n\n        self.encoder_list_ch = nn.ModuleList(\n            [\n                Encoder(\n                    d_model=self.d_model,\n                    mha=self.shared_MHA_ch[0],\n                    d_hidden=self.d_hidden,\n                    dropout=self.dropout,\n                    channel_wise=True,\n                )\n                for ll in range(self.N)\n            ]\n        )\n\n        pe = torch.zeros(self.patch_num1, self.d_model)\n        for pos in range(self.patch_num1):\n            for i in range(0, self.d_model, 2):\n                wavelength = 10000 ** ((2 * i) / self.d_model)\n                pe[pos, i] = math.sin(pos / wavelength)\n                pe[pos, i + 1] = math.cos(pos / wavelength)\n        pe = pe.unsqueeze(0)  # add a batch dimention to your pe matrix\n        self.register_buffer(\"pe\", pe)\n\n        self.embedding_channel = nn.Conv1d(\n            in_channels=self.d_model * self.patch_num1,\n            out_channels=self.d_model,\n            kernel_size=1,\n        )\n\n        self.embedding_patch_1 = torch.nn.Conv1d(\n            in_channels=1,\n            out_channels=self.d_model // 4,\n            kernel_size=self.patch_len1,\n            stride=self.stride1,\n        )\n        self.embedding_patch_2 = torch.nn.Conv1d(\n            in_channels=1,\n            out_channels=self.d_model // 4,\n            kernel_size=self.patch_len2,\n            stride=self.stride2,\n        )\n        self.embedding_patch_3 = torch.nn.Conv1d(\n            in_channels=1,\n            out_channels=self.d_model // 4,\n            kernel_size=self.patch_len3,\n            stride=self.stride3,\n        )\n        self.embedding_patch_4 = torch.nn.Conv1d(\n            in_channels=1,\n            out_channels=self.d_model // 4,\n            kernel_size=self.patch_len4,\n            stride=self.stride4,\n        )\n\n        self.out_linear_1 = torch.nn.Linear(self.d_model, self.pred_len // 8)\n        self.out_linear_2 = torch.nn.Linear(\n            self.d_model + self.pred_len // 8, self.pred_len // 8\n        )\n        self.out_linear_3 = torch.nn.Linear(\n            self.d_model + 2 * self.pred_len // 8, self.pred_len // 8\n        )\n        self.out_linear_4 = torch.nn.Linear(\n            self.d_model + 3 * self.pred_len // 8, self.pred_len // 8\n        )\n        self.out_linear_5 = torch.nn.Linear(\n            self.d_model + self.pred_len // 2, self.pred_len // 8\n        )\n        self.out_linear_6 = torch.nn.Linear(\n            self.d_model + 5 * self.pred_len // 8, self.pred_len // 8\n        )\n        self.out_linear_7 = torch.nn.Linear(\n            self.d_model + 6 * self.pred_len // 8, self.pred_len // 8\n        )\n        self.out_linear_8 = torch.nn.Linear(\n            self.d_model + 7 * self.pred_len // 8,\n            self.pred_len - 7 * (self.pred_len // 8),\n        )\n\n        self.remap = torch.nn.Linear(self.d_model, self.seq_len)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # Multi-scale embedding\n        x_i = x_enc.permute(0, 2, 1)\n\n        x_i_p1 = x_i\n        x_i_p2 = self.padding_patch_layer2(x_i)\n        x_i_p3 = self.padding_patch_layer3(x_i)\n        x_i_p4 = self.padding_patch_layer4(x_i)\n        encoding_patch1 = self.embedding_patch_1(\n            rearrange(x_i_p1, \"b c l -> (b c) l\").unsqueeze(-1).permute(0, 2, 1)\n        ).permute(0, 2, 1)\n        encoding_patch2 = self.embedding_patch_2(\n            rearrange(x_i_p2, \"b c l -> (b c) l\").unsqueeze(-1).permute(0, 2, 1)\n        ).permute(0, 2, 1)\n        encoding_patch3 = self.embedding_patch_3(\n            rearrange(x_i_p3, \"b c l -> (b c) l\").unsqueeze(-1).permute(0, 2, 1)\n        ).permute(0, 2, 1)\n        encoding_patch4 = self.embedding_patch_4(\n            rearrange(x_i_p4, \"b c l -> (b c) l\").unsqueeze(-1).permute(0, 2, 1)\n        ).permute(0, 2, 1)\n\n        encoding_patch = (\n            torch.cat(\n                (encoding_patch1, encoding_patch2, encoding_patch3, encoding_patch4),\n                dim=-1,\n            )\n            + self.pe\n        )\n        # Temporal encoding\n        for i in range(self.N):\n            encoding_patch = self.encoder_list[i](encoding_patch)[0]\n\n        # Channel-wise encoding\n        x_patch_c = rearrange(\n            encoding_patch, \"(b c) p d -> b c (p d)\", b=x_enc.shape[0], c=self.d_channel\n        )\n        x_ch = self.embedding_channel(x_patch_c.permute(0, 2, 1)).transpose(\n            1, 2\n        )  # [b c d]\n\n        encoding_1_ch = self.encoder_list_ch[0](x_ch)[0]\n\n        # Semi Auto-regressive\n        forecast_ch1 = self.out_linear_1(encoding_1_ch)\n        forecast_ch2 = self.out_linear_2(\n            torch.cat((encoding_1_ch, forecast_ch1), dim=-1)\n        )\n        forecast_ch3 = self.out_linear_3(\n            torch.cat((encoding_1_ch, forecast_ch1, forecast_ch2), dim=-1)\n        )\n        forecast_ch4 = self.out_linear_4(\n            torch.cat((encoding_1_ch, forecast_ch1, forecast_ch2, forecast_ch3), dim=-1)\n        )\n        forecast_ch5 = self.out_linear_5(\n            torch.cat(\n                (encoding_1_ch, forecast_ch1, forecast_ch2, forecast_ch3, forecast_ch4),\n                dim=-1,\n            )\n        )\n        forecast_ch6 = self.out_linear_6(\n            torch.cat(\n                (\n                    encoding_1_ch,\n                    forecast_ch1,\n                    forecast_ch2,\n                    forecast_ch3,\n                    forecast_ch4,\n                    forecast_ch5,\n                ),\n                dim=-1,\n            )\n        )\n        forecast_ch7 = self.out_linear_7(\n            torch.cat(\n                (\n                    encoding_1_ch,\n                    forecast_ch1,\n                    forecast_ch2,\n                    forecast_ch3,\n                    forecast_ch4,\n                    forecast_ch5,\n                    forecast_ch6,\n                ),\n                dim=-1,\n            )\n        )\n        forecast_ch8 = self.out_linear_8(\n            torch.cat(\n                (\n                    encoding_1_ch,\n                    forecast_ch1,\n                    forecast_ch2,\n                    forecast_ch3,\n                    forecast_ch4,\n                    forecast_ch5,\n                    forecast_ch6,\n                    forecast_ch7,\n                ),\n                dim=-1,\n            )\n        )\n\n        final_forecast = torch.cat(\n            (\n                forecast_ch1,\n                forecast_ch2,\n                forecast_ch3,\n                forecast_ch4,\n                forecast_ch5,\n                forecast_ch6,\n                forecast_ch7,\n                forecast_ch8,\n            ),\n            dim=-1,\n        ).permute(0, 2, 1)\n\n        # De-Normalization\n        dec_out = final_forecast * (\n            stdev[:, 0].unsqueeze(1).repeat(1, self.pred_len, 1)\n        )\n        dec_out = dec_out + (means[:, 0].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if (\n            self.task_name == \"long_term_forecast\"\n            or self.task_name == \"short_term_forecast\"\n        ):\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len :, :]  # [B, L, D]\n        if self.task_name == \"imputation\":\n            raise NotImplementedError(\n                \"Task imputation for WPMixer is temporarily not supported\"\n            )\n        if self.task_name == \"anomaly_detection\":\n            raise NotImplementedError(\n                \"Task anomaly_detection for WPMixer is temporarily not supported\"\n            )\n        if self.task_name == \"classification\":\n            raise NotImplementedError(\n                \"Task classification for WPMixer is temporarily not supported\"\n            )\n        return None\n"
  },
  {
    "path": "models/Nonstationary_Transformer.py",
    "content": "import torch\nimport torch.nn as nn\nfrom layers.Transformer_EncDec import Decoder, DecoderLayer, Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import DSAttention, AttentionLayer\nfrom layers.Embed import DataEmbedding\nimport torch.nn.functional as F\n\n\nclass Projector(nn.Module):\n    '''\n    MLP to learn the De-stationary factors\n    Paper link: https://openreview.net/pdf?id=ucNDIDRNjjv\n    '''\n\n    def __init__(self, enc_in, seq_len, hidden_dims, hidden_layers, output_dim, kernel_size=3):\n        super(Projector, self).__init__()\n\n        padding = 1 if torch.__version__ >= '1.5.0' else 2\n        self.series_conv = nn.Conv1d(in_channels=seq_len, out_channels=1, kernel_size=kernel_size, padding=padding,\n                                     padding_mode='circular', bias=False)\n\n        layers = [nn.Linear(2 * enc_in, hidden_dims[0]), nn.ReLU()]\n        for i in range(hidden_layers - 1):\n            layers += [nn.Linear(hidden_dims[i], hidden_dims[i + 1]), nn.ReLU()]\n\n        layers += [nn.Linear(hidden_dims[-1], output_dim, bias=False)]\n        self.backbone = nn.Sequential(*layers)\n\n    def forward(self, x, stats):\n        # x:     B x S x E\n        # stats: B x 1 x E\n        # y:     B x O\n        batch_size = x.shape[0]\n        x = self.series_conv(x)  # B x 1 x E\n        x = torch.cat([x, stats], dim=1)  # B x 2 x E\n        x = x.view(batch_size, -1)  # B x 2E\n        y = self.backbone(x)  # B x O\n\n        return y\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://openreview.net/pdf?id=ucNDIDRNjjv\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n\n        # Embedding\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        DSAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                    output_attention=False), configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=torch.nn.LayerNorm(configs.d_model)\n        )\n        # Decoder\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq,\n                                               configs.dropout)\n            self.decoder = Decoder(\n                [\n                    DecoderLayer(\n                        AttentionLayer(\n                            DSAttention(True, configs.factor, attention_dropout=configs.dropout,\n                                        output_attention=False),\n                            configs.d_model, configs.n_heads),\n                        AttentionLayer(\n                            DSAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                        output_attention=False),\n                            configs.d_model, configs.n_heads),\n                        configs.d_model,\n                        configs.d_ff,\n                        dropout=configs.dropout,\n                        activation=configs.activation,\n                    )\n                    for l in range(configs.d_layers)\n                ],\n                norm_layer=torch.nn.LayerNorm(configs.d_model),\n                projection=nn.Linear(configs.d_model, configs.c_out, bias=True)\n            )\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.d_model * configs.seq_len, configs.num_class)\n\n        self.tau_learner = Projector(enc_in=configs.enc_in, seq_len=configs.seq_len, hidden_dims=configs.p_hidden_dims,\n                                     hidden_layers=configs.p_hidden_layers, output_dim=1)\n        self.delta_learner = Projector(enc_in=configs.enc_in, seq_len=configs.seq_len,\n                                       hidden_dims=configs.p_hidden_dims, hidden_layers=configs.p_hidden_layers,\n                                       output_dim=configs.seq_len)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        x_raw = x_enc.clone().detach()\n\n        # Normalization\n        mean_enc = x_enc.mean(1, keepdim=True).detach()  # B x 1 x E\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()  # B x 1 x E\n        x_enc = x_enc / std_enc\n        # B x S x E, B x 1 x E -> B x 1, positive scalar\n        tau = self.tau_learner(x_raw, std_enc)\n        threshold = 80.0\n        tau_clamped = torch.clamp(tau, max=threshold)  # avoid numerical overflow\n        tau = tau_clamped.exp()\n        # B x S x E, B x 1 x E -> B x S\n        delta = self.delta_learner(x_raw, mean_enc)\n\n        x_dec_new = torch.cat([x_enc[:, -self.label_len:, :], torch.zeros_like(x_dec[:, -self.pred_len:, :])],\n                              dim=1).to(x_enc.device).clone()\n\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None, tau=tau, delta=delta)\n\n        dec_out = self.dec_embedding(x_dec_new, x_mark_dec)\n        dec_out = self.decoder(dec_out, enc_out, x_mask=None, cross_mask=None, tau=tau, delta=delta)\n        dec_out = dec_out * std_enc + mean_enc\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        x_raw = x_enc.clone().detach()\n\n        # Normalization\n        mean_enc = torch.sum(x_enc, dim=1) / torch.sum(mask == 1, dim=1)\n        mean_enc = mean_enc.unsqueeze(1).detach()\n        x_enc = x_enc - mean_enc\n        x_enc = x_enc.masked_fill(mask == 0, 0)\n        std_enc = torch.sqrt(torch.sum(x_enc * x_enc, dim=1) / torch.sum(mask == 1, dim=1) + 1e-5)\n        std_enc = std_enc.unsqueeze(1).detach()\n        x_enc /= std_enc\n        # B x S x E, B x 1 x E -> B x 1, positive scalar\n        tau = self.tau_learner(x_raw, std_enc)\n        threshold = 80.0\n        tau_clamped = torch.clamp(tau, max=threshold)  # avoid numerical overflow\n        tau = tau_clamped.exp()\n        # B x S x E, B x 1 x E -> B x S\n        delta = self.delta_learner(x_raw, mean_enc)\n\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None, tau=tau, delta=delta)\n\n        dec_out = self.projection(enc_out)\n        dec_out = dec_out * std_enc + mean_enc\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        x_raw = x_enc.clone().detach()\n\n        # Normalization\n        mean_enc = x_enc.mean(1, keepdim=True).detach()  # B x 1 x E\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()  # B x 1 x E\n        x_enc = x_enc / std_enc\n        # B x S x E, B x 1 x E -> B x 1, positive scalar\n        tau = self.tau_learner(x_raw, std_enc)\n        threshold = 80.0\n        tau_clamped = torch.clamp(tau, max=threshold)  # avoid numerical overflow\n        tau = tau_clamped.exp()\n        # B x S x E, B x 1 x E -> B x S\n        delta = self.delta_learner(x_raw, mean_enc)\n        # embedding\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None, tau=tau, delta=delta)\n\n        dec_out = self.projection(enc_out)\n        dec_out = dec_out * std_enc + mean_enc\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        x_raw = x_enc.clone().detach()\n\n        # Normalization\n        mean_enc = x_enc.mean(1, keepdim=True).detach()  # B x 1 x E\n        std_enc = torch.sqrt(\n            torch.var(x_enc - mean_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()  # B x 1 x E\n        # B x S x E, B x 1 x E -> B x 1, positive scalar\n        tau = self.tau_learner(x_raw, std_enc)\n        threshold = 80.0\n        tau_clamped = torch.clamp(tau, max=threshold)  # avoid numerical overflow\n        tau = tau_clamped.exp()\n        # B x S x E, B x 1 x E -> B x S\n        delta = self.delta_learner(x_raw, mean_enc)\n        # embedding\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None, tau=tau, delta=delta)\n\n        # Output\n        output = self.act(enc_out)  # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.dropout(output)\n        output = output * x_mark_enc.unsqueeze(-1)  # zero-out padding embeddings\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        # (batch_size, num_classes)\n        output = self.projection(output)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, L, D]\n        return None\n"
  },
  {
    "path": "models/PAttn.py",
    "content": "import torch\nimport torch.nn as nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom einops import rearrange\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/abs/2406.16964\n    \"\"\"\n    def __init__(self, configs, patch_len=16, stride=8):\n        super().__init__()\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.patch_size = patch_len \n        self.stride = stride\n        \n        self.d_model = configs.d_model\n       \n        self.patch_num = (configs.seq_len - self.patch_size) // self.stride + 2\n        self.padding_patch_layer = nn.ReplicationPad1d((0,  self.stride)) \n        self.in_layer = nn.Linear(self.patch_size, self.d_model)\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False), configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(1)\n            ],\n            norm_layer=nn.LayerNorm(configs.d_model)\n        )\n        self.out_layer = nn.Linear(self.d_model * self.patch_num, configs.pred_len)\n            \n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n        \n        B, _, C = x_enc.shape\n        x_enc = x_enc.permute(0, 2, 1)\n        x_enc = self.padding_patch_layer(x_enc)\n        x_enc = x_enc.unfold(dimension=-1, size=self.patch_size, step=self.stride)\n        enc_out = self.in_layer(x_enc)\n        enc_out =  rearrange(enc_out, 'b c m l -> (b c) m l')\n        dec_out, _ = self.encoder(enc_out)\n        dec_out =  rearrange(dec_out, '(b c) m l -> b c (m l)' , b=B , c=C)\n        dec_out = self.out_layer(dec_out)\n        dec_out = dec_out.permute(0, 2, 1)\n        \n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out"
  },
  {
    "path": "models/PatchTST.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\n\nclass Transpose(nn.Module):\n    def __init__(self, *dims, contiguous=False): \n        super().__init__()\n        self.dims, self.contiguous = dims, contiguous\n    def forward(self, x):\n        if self.contiguous: return x.transpose(*self.dims).contiguous()\n        else: return x.transpose(*self.dims)\n\n\nclass FlattenHead(nn.Module):\n    def __init__(self, n_vars, nf, target_window, head_dropout=0):\n        super().__init__()\n        self.n_vars = n_vars\n        self.flatten = nn.Flatten(start_dim=-2)\n        self.linear = nn.Linear(nf, target_window)\n        self.dropout = nn.Dropout(head_dropout)\n\n    def forward(self, x):  # x: [bs x nvars x d_model x patch_num]\n        x = self.flatten(x)\n        x = self.linear(x)\n        x = self.dropout(x)\n        return x\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/pdf/2211.14730.pdf\n    \"\"\"\n\n    def __init__(self, configs, patch_len=16, stride=8):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        padding = stride\n\n        # patching and embedding\n        self.patch_embedding = PatchEmbedding(\n            configs.d_model, patch_len, stride, padding, configs.dropout)\n\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False), configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=nn.Sequential(Transpose(1,2), nn.BatchNorm1d(configs.d_model), Transpose(1,2))\n        )\n\n        # Prediction Head\n        self.head_nf = configs.d_model * \\\n                       int((configs.seq_len - patch_len) / stride + 2)\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.head = FlattenHead(configs.enc_in, self.head_nf, configs.pred_len,\n                                    head_dropout=configs.dropout)\n        elif self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.head = FlattenHead(configs.enc_in, self.head_nf, configs.seq_len,\n                                    head_dropout=configs.dropout)\n        elif self.task_name == 'classification':\n            self.flatten = nn.Flatten(start_dim=-2)\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                self.head_nf * configs.enc_in, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # do patching and embedding\n        x_enc = x_enc.permute(0, 2, 1)\n        # u: [bs * nvars x patch_num x d_model]\n        enc_out, n_vars = self.patch_embedding(x_enc)\n\n        # Encoder\n        # z: [bs * nvars x patch_num x d_model]\n        enc_out, attns = self.encoder(enc_out)\n        # z: [bs x nvars x patch_num x d_model]\n        enc_out = torch.reshape(\n            enc_out, (-1, n_vars, enc_out.shape[-2], enc_out.shape[-1]))\n        # z: [bs x nvars x d_model x patch_num]\n        enc_out = enc_out.permute(0, 1, 3, 2)\n\n        # Decoder\n        dec_out = self.head(enc_out)  # z: [bs x nvars x target_window]\n        dec_out = dec_out.permute(0, 2, 1)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # Normalization from Non-stationary Transformer\n        means = torch.sum(x_enc, dim=1) / torch.sum(mask == 1, dim=1)\n        means = means.unsqueeze(1).detach()\n        x_enc = x_enc - means\n        x_enc = x_enc.masked_fill(mask == 0, 0)\n        stdev = torch.sqrt(torch.sum(x_enc * x_enc, dim=1) /\n                           torch.sum(mask == 1, dim=1) + 1e-5)\n        stdev = stdev.unsqueeze(1).detach()\n        x_enc /= stdev\n\n        # do patching and embedding\n        x_enc = x_enc.permute(0, 2, 1)\n        # u: [bs * nvars x patch_num x d_model]\n        enc_out, n_vars = self.patch_embedding(x_enc)\n\n        # Encoder\n        # z: [bs * nvars x patch_num x d_model]\n        enc_out, attns = self.encoder(enc_out)\n        # z: [bs x nvars x patch_num x d_model]\n        enc_out = torch.reshape(\n            enc_out, (-1, n_vars, enc_out.shape[-2], enc_out.shape[-1]))\n        # z: [bs x nvars x d_model x patch_num]\n        enc_out = enc_out.permute(0, 1, 3, 2)\n\n        # Decoder\n        dec_out = self.head(enc_out)  # z: [bs x nvars x target_window]\n        dec_out = dec_out.permute(0, 2, 1)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.seq_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.seq_len, 1))\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # do patching and embedding\n        x_enc = x_enc.permute(0, 2, 1)\n        # u: [bs * nvars x patch_num x d_model]\n        enc_out, n_vars = self.patch_embedding(x_enc)\n\n        # Encoder\n        # z: [bs * nvars x patch_num x d_model]\n        enc_out, attns = self.encoder(enc_out)\n        # z: [bs x nvars x patch_num x d_model]\n        enc_out = torch.reshape(\n            enc_out, (-1, n_vars, enc_out.shape[-2], enc_out.shape[-1]))\n        # z: [bs x nvars x d_model x patch_num]\n        enc_out = enc_out.permute(0, 1, 3, 2)\n\n        # Decoder\n        dec_out = self.head(enc_out)  # z: [bs x nvars x target_window]\n        dec_out = dec_out.permute(0, 2, 1)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.seq_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.seq_len, 1))\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # do patching and embedding\n        x_enc = x_enc.permute(0, 2, 1)\n        # u: [bs * nvars x patch_num x d_model]\n        enc_out, n_vars = self.patch_embedding(x_enc)\n\n        # Encoder\n        # z: [bs * nvars x patch_num x d_model]\n        enc_out, attns = self.encoder(enc_out)\n        # z: [bs x nvars x patch_num x d_model]\n        enc_out = torch.reshape(\n            enc_out, (-1, n_vars, enc_out.shape[-2], enc_out.shape[-1]))\n        # z: [bs x nvars x d_model x patch_num]\n        enc_out = enc_out.permute(0, 1, 3, 2)\n\n        # Decoder\n        output = self.flatten(enc_out)\n        output = self.dropout(output)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/Pyraformer.py",
    "content": "import torch\nimport torch.nn as nn\nfrom layers.Pyraformer_EncDec import Encoder\n\n\nclass Model(nn.Module):\n    \"\"\" \n    Pyraformer: Pyramidal attention to reduce complexity\n    Paper link: https://openreview.net/pdf?id=0EXmFzUn5I\n    \"\"\"\n\n    def __init__(self, configs, window_size=[4,4], inner_size=5):\n        \"\"\"\n        window_size: list, the downsample window size in pyramidal attention.\n        inner_size: int, the size of neighbour attention\n        \"\"\"\n        super().__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n        self.d_model = configs.d_model\n\n        if self.task_name == 'short_term_forecast':\n            window_size = [2,2]\n        self.encoder = Encoder(configs, window_size, inner_size)\n\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.projection = nn.Linear(\n                (len(window_size)+1)*self.d_model, self.pred_len * configs.enc_in)\n        elif self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(\n                (len(window_size)+1)*self.d_model, configs.enc_in, bias=True)\n        elif self.task_name == 'classification':\n            self.act = torch.nn.functional.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                (len(window_size)+1)*self.d_model * configs.seq_len, configs.num_class)\n\n    def long_forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        enc_out = self.encoder(x_enc, x_mark_enc)[:, -1, :]\n        dec_out = self.projection(enc_out).view(\n            enc_out.size(0), self.pred_len, -1)\n        return dec_out\n    \n    def short_forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        # Normalization\n        mean_enc = x_enc.mean(1, keepdim=True).detach()  # B x 1 x E\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()  # B x 1 x E\n        x_enc = x_enc / std_enc\n\n        enc_out = self.encoder(x_enc, x_mark_enc)[:, -1, :]\n        dec_out = self.projection(enc_out).view(\n            enc_out.size(0), self.pred_len, -1)\n        \n        dec_out = dec_out * std_enc + mean_enc\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        enc_out = self.encoder(x_enc, x_mark_enc)\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def anomaly_detection(self, x_enc, x_mark_enc):\n        enc_out = self.encoder(x_enc, x_mark_enc)\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # enc\n        enc_out = self.encoder(x_enc, x_mark_enc=None)\n\n        # Output\n        # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        # zero-out padding embeddings\n        output = output * x_mark_enc.unsqueeze(-1)\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast':\n            dec_out = self.long_forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'short_term_forecast':\n            dec_out = self.short_forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc, x_mark_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/Reformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import ReformerLayer\nfrom layers.Embed import DataEmbedding\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Reformer with O(LlogL) complexity\n    Paper link: https://openreview.net/forum?id=rkgNKkHtvB\n    \"\"\"\n\n    def __init__(self, configs, bucket_size=4, n_hashes=4):\n        \"\"\"\n        bucket_size: int, \n        n_hashes: int, \n        \"\"\"\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n        self.seq_len = configs.seq_len\n\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    ReformerLayer(None, configs.d_model, configs.n_heads,\n                                  bucket_size=bucket_size, n_hashes=n_hashes),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=torch.nn.LayerNorm(configs.d_model)\n        )\n\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.d_model * configs.seq_len, configs.num_class)\n        else:\n            self.projection = nn.Linear(\n                configs.d_model, configs.c_out, bias=True)\n\n    def long_forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # add placeholder\n        x_enc = torch.cat([x_enc, x_dec[:, -self.pred_len:, :]], dim=1)\n        if x_mark_enc is not None:\n            x_mark_enc = torch.cat(\n                [x_mark_enc, x_mark_dec[:, -self.pred_len:, :]], dim=1)\n\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        dec_out = self.projection(enc_out)\n\n        return dec_out  # [B, L, D]\n    \n    def short_forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization\n        mean_enc = x_enc.mean(1, keepdim=True).detach()  # B x 1 x E\n        x_enc = x_enc - mean_enc\n        std_enc = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5).detach()  # B x 1 x E\n        x_enc = x_enc / std_enc\n\n        # add placeholder\n        x_enc = torch.cat([x_enc, x_dec[:, -self.pred_len:, :]], dim=1)\n        if x_mark_enc is not None:\n            x_mark_enc = torch.cat(\n                [x_mark_enc, x_mark_dec[:, -self.pred_len:, :]], dim=1)\n\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n        dec_out = self.projection(enc_out)\n\n        dec_out = dec_out * std_enc + mean_enc\n        return dec_out  # [B, L, D]\n\n    def imputation(self, x_enc, x_mark_enc):\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n\n        enc_out, attns = self.encoder(enc_out)\n        enc_out = self.projection(enc_out)\n\n        return enc_out  # [B, L, D]\n\n    def anomaly_detection(self, x_enc):\n        enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\n\n        enc_out, attns = self.encoder(enc_out)\n        enc_out = self.projection(enc_out)\n\n        return enc_out  # [B, L, D]\n\n    def classification(self, x_enc, x_mark_enc):\n        # enc\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out)\n\n        # Output\n        # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        # zero-out padding embeddings\n        output = output * x_mark_enc.unsqueeze(-1)\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast':\n            dec_out = self.long_forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'short_term_forecast':\n            dec_out = self.short_forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/SCINet.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport math\n\nclass Splitting(nn.Module):\n    def __init__(self):\n        super(Splitting, self).__init__()\n\n    def even(self, x):\n        return x[:, ::2, :]\n\n    def odd(self, x):\n        return x[:, 1::2, :]\n\n    def forward(self, x):\n        # return the odd and even part\n        return self.even(x), self.odd(x)\n\n\nclass CausalConvBlock(nn.Module):\n    def __init__(self, d_model, kernel_size=5, dropout=0.0):\n        super(CausalConvBlock, self).__init__()\n        module_list = [\n            nn.ReplicationPad1d((kernel_size - 1, kernel_size - 1)),\n\n            nn.Conv1d(d_model, d_model,\n                      kernel_size=kernel_size),\n            nn.LeakyReLU(negative_slope=0.01, inplace=True),\n\n            nn.Dropout(dropout),\n            nn.Conv1d(d_model, d_model,\n                      kernel_size=kernel_size),\n            nn.Tanh()\n        ]\n        self.causal_conv = nn.Sequential(*module_list)\n\n    def forward(self, x):\n        return self.causal_conv(x)  # return value is the same as input dimension\n\n\nclass SCIBlock(nn.Module):\n    def __init__(self, d_model, kernel_size=5, dropout=0.0):\n        super(SCIBlock, self).__init__()\n        self.splitting = Splitting()\n        self.modules_even, self.modules_odd, self.interactor_even, self.interactor_odd = [CausalConvBlock(d_model) for _ in range(4)]\n\n    def forward(self, x):\n        x_even, x_odd = self.splitting(x)\n        x_even = x_even.permute(0, 2, 1)\n        x_odd = x_odd.permute(0, 2, 1)\n\n        x_even_temp = x_even.mul(torch.exp(self.modules_even(x_odd)))\n        x_odd_temp = x_odd.mul(torch.exp(self.modules_odd(x_even)))\n\n        x_even_update = x_even_temp + self.interactor_even(x_odd_temp)\n        x_odd_update = x_odd_temp - self.interactor_odd(x_even_temp)\n\n        return x_even_update.permute(0, 2, 1), x_odd_update.permute(0, 2, 1)\n\n\nclass SCINet(nn.Module):\n    def __init__(self, d_model, current_level=3, kernel_size=5, dropout=0.0):\n        super(SCINet, self).__init__()\n        self.current_level = current_level\n        self.working_block = SCIBlock(d_model, kernel_size, dropout)\n\n        if current_level != 0:\n            self.SCINet_Tree_odd = SCINet(d_model, current_level-1, kernel_size, dropout)\n            self.SCINet_Tree_even = SCINet(d_model, current_level-1, kernel_size, dropout)\n\n    def forward(self, x):\n        odd_flag = False\n        if x.shape[1] % 2 == 1:\n            odd_flag = True\n            x = torch.cat((x, x[:, -1:, :]), dim=1)\n        x_even_update, x_odd_update = self.working_block(x)\n        if odd_flag:\n            x_odd_update = x_odd_update[:, :-1]\n\n        if self.current_level == 0:\n            return self.zip_up_the_pants(x_even_update, x_odd_update)\n        else:\n            return self.zip_up_the_pants(self.SCINet_Tree_even(x_even_update), self.SCINet_Tree_odd(x_odd_update))\n\n    def zip_up_the_pants(self, even, odd):\n        even = even.permute(1, 0, 2)\n        odd = odd.permute(1, 0, 2)\n        even_len = even.shape[0]\n        odd_len = odd.shape[0]\n        min_len = min(even_len, odd_len)\n\n        zipped_data = []\n        for i in range(min_len):\n            zipped_data.append(even[i].unsqueeze(0))\n            zipped_data.append(odd[i].unsqueeze(0))\n        if even_len > odd_len:\n            zipped_data.append(even[-1].unsqueeze(0))\n        return torch.cat(zipped_data,0).permute(1, 0, 2)\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n\n        # You can set the number of SCINet stacks by argument \"d_layers\", but should choose 1 or 2.\n        self.num_stacks = configs.d_layers\n        if self.num_stacks == 1:\n            self.sci_net_1 = SCINet(configs.enc_in, dropout=configs.dropout)\n            self.projection_1 = nn.Conv1d(self.seq_len, self.seq_len + self.pred_len, kernel_size=1, stride=1, bias=False)\n        else:\n            self.sci_net_1, self.sci_net_2 = [SCINet(configs.enc_in, dropout=configs.dropout) for _ in range(2)]\n            self.projection_1 = nn.Conv1d(self.seq_len, self.pred_len, kernel_size=1, stride=1, bias=False)\n            self.projection_2 = nn.Conv1d(self.seq_len+self.pred_len, self.seq_len+self.pred_len,\n                                                kernel_size = 1, bias = False)\n\n        # For positional encoding\n        self.pe_hidden_size = configs.enc_in\n        if self.pe_hidden_size % 2 == 1:\n            self.pe_hidden_size += 1\n\n        num_timescales = self.pe_hidden_size // 2\n        max_timescale = 10000.0\n        min_timescale = 1.0\n\n        log_timescale_increment = (\n                math.log(float(max_timescale) / float(min_timescale)) /\n                max(num_timescales - 1, 1))\n        inv_timescales = min_timescale * torch.exp(\n            torch.arange(num_timescales, dtype=torch.float32) *\n            -log_timescale_increment)\n        self.register_buffer('inv_timescales', inv_timescales)\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)  # [B,pred_len,C]\n            dec_out = torch.cat([torch.zeros_like(x_enc), dec_out], dim=1)\n            return dec_out  # [B, T, D]\n        return None\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # position-encoding\n        pe = self.get_position_encoding(x_enc)\n        if pe.shape[2] > x_enc.shape[2]:\n            x_enc += pe[:, :, :-1]\n        else:\n            x_enc += self.get_position_encoding(x_enc)\n\n        # SCINet\n        dec_out = self.sci_net_1(x_enc)\n        dec_out += x_enc\n        dec_out = self.projection_1(dec_out)\n        if self.num_stacks != 1:\n            dec_out = torch.cat((x_enc, dec_out), dim=1)\n            temp = dec_out\n            dec_out = self.sci_net_2(dec_out)\n            dec_out += temp\n            dec_out = self.projection_2(dec_out)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1))\n        return dec_out\n\n    def get_position_encoding(self, x):\n        max_length = x.size()[1]\n        position = torch.arange(max_length, dtype=torch.float32,\n                                device=x.device)  # tensor([0., 1., 2., 3., 4.], device='cuda:0')\n        scaled_time = position.unsqueeze(1) * self.inv_timescales.unsqueeze(0)  # 5 256\n        signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], dim=1)  # [T, C]\n        signal = F.pad(signal, (0, 0, 0, self.pe_hidden_size % 2))\n        signal = signal.view(1, max_length, self.pe_hidden_size)\n\n        return signal"
  },
  {
    "path": "models/SegRNN.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Autoformer_EncDec import series_decomp\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/abs/2308.11200.pdf\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n\n        # get parameters\n        self.seq_len = configs.seq_len\n        self.enc_in = configs.enc_in\n        self.d_model = configs.d_model\n        self.dropout = configs.dropout\n\n        self.task_name = configs.task_name\n        if self.task_name == 'classification' or self.task_name == 'anomaly_detection' or self.task_name == 'imputation':\n            self.pred_len = configs.seq_len\n        else:\n            self.pred_len = configs.pred_len\n\n        self.seg_len = configs.seg_len\n        self.seg_num_x = self.seq_len // self.seg_len\n        self.seg_num_y = self.pred_len // self.seg_len\n\n        # building model\n        self.valueEmbedding = nn.Sequential(\n            nn.Linear(self.seg_len, self.d_model),\n            nn.ReLU()\n        )\n        self.rnn = nn.GRU(input_size=self.d_model, hidden_size=self.d_model, num_layers=1, bias=True,\n                              batch_first=True, bidirectional=False)\n        self.pos_emb = nn.Parameter(torch.randn(self.seg_num_y, self.d_model // 2))\n        self.channel_emb = nn.Parameter(torch.randn(self.enc_in, self.d_model // 2))\n\n        self.predict = nn.Sequential(\n            nn.Dropout(self.dropout),\n            nn.Linear(self.d_model, self.seg_len)\n        )\n\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.enc_in * configs.seq_len, configs.num_class)\n\n    def encoder(self, x):\n        # b:batch_size c:channel_size s:seq_len s:seq_len\n        # d:d_model w:seg_len n:seg_num_x m:seg_num_y\n        batch_size = x.size(0)\n\n        # normalization and permute     b,s,c -> b,c,s\n        seq_last = x[:, -1:, :].detach()\n        x = (x - seq_last).permute(0, 2, 1) # b,c,s\n\n        # segment and embedding    b,c,s -> bc,n,w -> bc,n,d\n        x = self.valueEmbedding(x.reshape(-1, self.seg_num_x, self.seg_len))\n\n        # encoding\n        _, hn = self.rnn(x) # bc,n,d  1,bc,d\n\n        # m,d//2 -> 1,m,d//2 -> c,m,d//2\n        # c,d//2 -> c,1,d//2 -> c,m,d//2\n        # c,m,d -> cm,1,d -> bcm, 1, d\n        pos_emb = torch.cat([\n            self.pos_emb.unsqueeze(0).repeat(self.enc_in, 1, 1),\n            self.channel_emb.unsqueeze(1).repeat(1, self.seg_num_y, 1)\n        ], dim=-1).view(-1, 1, self.d_model).repeat(batch_size,1,1)\n\n        _, hy = self.rnn(pos_emb, hn.repeat(1, 1, self.seg_num_y).view(1, -1, self.d_model)) # bcm,1,d  1,bcm,d\n\n        # 1,bcm,d -> 1,bcm,w -> b,c,s\n        y = self.predict(hy).view(-1, self.enc_in, self.pred_len)\n\n        # permute and denorm\n        y = y.permute(0, 2, 1) + seq_last\n        return y\n\n    def forecast(self, x_enc):\n        # Encoder\n        return self.encoder(x_enc)\n\n    def imputation(self, x_enc):\n        # Encoder\n        return self.encoder(x_enc)\n\n    def anomaly_detection(self, x_enc):\n        # Encoder\n        return self.encoder(x_enc)\n\n    def classification(self, x_enc):\n        # Encoder\n        enc_out = self.encoder(x_enc)\n        # Output\n        # (batch_size, seq_length * d_model)\n        output = enc_out.reshape(enc_out.shape[0], -1)\n        # (batch_size, num_classes)\n        output = self.projection(output)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/Sundial.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nfrom transformers import AutoModelForCausalLM\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.model = AutoModelForCausalLM.from_pretrained('thuml/sundial-base-128m', trust_remote_code=True)\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        outputs = []\n        for i in range(x_enc.shape[-1]):\n            output = self.model.generate(x_enc[...,i], max_new_tokens=self.pred_len, num_samples=20)\n            output = output.mean(dim=1)\n            outputs.append(output)\n        dec_out = torch.stack(outputs, dim=-1)\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/TSMixer.py",
    "content": "import torch.nn as nn\n\n\nclass ResBlock(nn.Module):\n    def __init__(self, configs):\n        super(ResBlock, self).__init__()\n\n        self.temporal = nn.Sequential(\n            nn.Linear(configs.seq_len, configs.d_model),\n            nn.ReLU(),\n            nn.Linear(configs.d_model, configs.seq_len),\n            nn.Dropout(configs.dropout)\n        )\n\n        self.channel = nn.Sequential(\n            nn.Linear(configs.enc_in, configs.d_model),\n            nn.ReLU(),\n            nn.Linear(configs.d_model, configs.enc_in),\n            nn.Dropout(configs.dropout)\n        )\n\n    def forward(self, x):\n        # x: [B, L, D]\n        x = x + self.temporal(x.transpose(1, 2)).transpose(1, 2)\n        x = x + self.channel(x)\n\n        return x\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.layer = configs.e_layers\n        self.model = nn.ModuleList([ResBlock(configs)\n                                    for _ in range(configs.e_layers)])\n        self.pred_len = configs.pred_len\n        self.projection = nn.Linear(configs.seq_len, configs.pred_len)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n\n        # x: [B, L, D]\n        for i in range(self.layer):\n            x_enc = self.model[i](x_enc)\n        enc_out = self.projection(x_enc.transpose(1, 2)).transpose(1, 2)\n\n        return enc_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        else:\n            raise ValueError('Only forecast tasks implemented yet')\n"
  },
  {
    "path": "models/TemporalFusionTransformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Embed import DataEmbedding, TemporalEmbedding\nfrom torch import Tensor\nfrom typing import Optional\nfrom collections import namedtuple\n\n# static: time-independent features\n# observed: time features of the past(e.g. predicted targets)\n# known: known information about the past and future(i.e. time stamp)\nTypePos = namedtuple('TypePos', ['static', 'observed'])\n\n# When you want to use new dataset, please add the index of 'static, observed' columns here.\n# 'known' columns needn't be added, because 'known' inputs are automatically judged and provided by the program.\ndatatype_dict = {'ETTh1': TypePos([], [x for x in range(7)]),\n                 'ETTm1': TypePos([], [x for x in range(7)])}\n\n\ndef get_known_len(embed_type, freq):\n    if embed_type != 'timeF':\n        if freq == 't':\n            return 5\n        else:\n            return 4\n    else:\n        freq_map = {'h': 4, 't': 5, 's': 6,\n                    'm': 1, 'a': 1, 'w': 2, 'd': 3, 'b': 3}\n        return freq_map[freq]\n\n\nclass TFTTemporalEmbedding(TemporalEmbedding):\n    def __init__(self, d_model, embed_type='fixed', freq='h'):\n        super(TFTTemporalEmbedding, self).__init__(d_model, embed_type, freq)\n\n    def forward(self, x):\n        x = x.long()\n        minute_x = self.minute_embed(x[:, :, 4]) if hasattr(\n            self, 'minute_embed') else 0.\n        hour_x = self.hour_embed(x[:, :, 3])\n        weekday_x = self.weekday_embed(x[:, :, 2])\n        day_x = self.day_embed(x[:, :, 1])\n        month_x = self.month_embed(x[:, :, 0])\n\n        embedding_x = torch.stack([month_x, day_x, weekday_x, hour_x, minute_x], dim=-2) if hasattr(\n            self, 'minute_embed') else torch.stack([month_x, day_x, weekday_x, hour_x], dim=-2)\n        return embedding_x\n\n\nclass TFTTimeFeatureEmbedding(nn.Module):\n    def __init__(self, d_model, embed_type='timeF', freq='h'):\n        super(TFTTimeFeatureEmbedding, self).__init__()\n        d_inp = get_known_len(embed_type, freq)\n        self.embed = nn.ModuleList([nn.Linear(1, d_model, bias=False) for _ in range(d_inp)])\n\n    def forward(self, x):\n        return torch.stack([embed(x[:,:,i].unsqueeze(-1)) for i, embed in enumerate(self.embed)], dim=-2)\n\n\nclass TFTEmbedding(nn.Module):\n    def __init__(self, configs):\n        super(TFTEmbedding, self).__init__()\n        self.pred_len = configs.pred_len\n        self.static_pos = datatype_dict[configs.data].static\n        self.observed_pos = datatype_dict[configs.data].observed\n        self.static_len = len(self.static_pos)\n        self.observed_len = len(self.observed_pos)\n\n        self.static_embedding = nn.ModuleList([DataEmbedding(1,configs.d_model,dropout=configs.dropout) for _ in range(self.static_len)]) \\\n            if self.static_len else None\n        self.observed_embedding = nn.ModuleList([DataEmbedding(1,configs.d_model,dropout=configs.dropout) for _ in range(self.observed_len)])\n        self.known_embedding = TFTTemporalEmbedding(configs.d_model, configs.embed, configs.freq) \\\n            if configs.embed != 'timeF' else TFTTimeFeatureEmbedding(configs.d_model, configs.embed, configs.freq)\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        if self.static_len:\n            # static_input: [B,C,d_model]\n            static_input = torch.stack([embed(x_enc[:,:1,self.static_pos[i]].unsqueeze(-1), None).squeeze(1) for i, embed in enumerate(self.static_embedding)], dim=-2)\n        else:\n            static_input = None\n\n        # observed_input: [B,T,C,d_model]\n        observed_input = torch.stack([embed(x_enc[:,:,self.observed_pos[i]].unsqueeze(-1), None) for i, embed in enumerate(self.observed_embedding)], dim=-2)\n\n        x_mark = torch.cat([x_mark_enc, x_mark_dec[:,-self.pred_len:,:]], dim=-2)\n        # known_input: [B,T,C,d_model]\n        known_input = self.known_embedding(x_mark)\n\n        return static_input, observed_input, known_input\n\n\nclass GLU(nn.Module):\n    def __init__(self, input_size, output_size):\n        super().__init__()\n        self.fc1 = nn.Linear(input_size, output_size)\n        self.fc2 = nn.Linear(input_size, output_size)\n        self.glu = nn.GLU()\n\n    def forward(self, x):\n        a = self.fc1(x)\n        b = self.fc2(x)\n        return self.glu(torch.cat([a, b], dim=-1))\n\n\nclass GateAddNorm(nn.Module):\n    def __init__(self, input_size, output_size):\n        super(GateAddNorm, self).__init__()\n        self.glu = GLU(input_size, input_size)\n        self.projection = nn.Linear(input_size, output_size) if input_size != output_size else nn.Identity()\n        self.layer_norm = nn.LayerNorm(output_size)\n\n    def forward(self, x, skip_a):\n        x = self.glu(x)\n        x = x + skip_a\n        return self.layer_norm(self.projection(x))\n\n\nclass GRN(nn.Module):\n    def __init__(self, input_size, output_size, hidden_size=None, context_size=None, dropout=0.0):\n        super(GRN, self).__init__()\n        hidden_size = input_size if hidden_size is None else hidden_size\n        self.lin_a = nn.Linear(input_size, hidden_size)\n        self.lin_c = nn.Linear(context_size, hidden_size) if context_size is not None else None\n        self.lin_i = nn.Linear(hidden_size, hidden_size)\n        self.dropout = nn.Dropout(dropout)\n        self.project_a = nn.Linear(input_size, hidden_size) if hidden_size != input_size else nn.Identity()\n        self.gate = GateAddNorm(hidden_size, output_size)\n\n    def forward(self, a: Tensor, c: Optional[Tensor] = None):\n        # a: [B,T,d], c: [B,d]\n        x = self.lin_a(a)\n        if c is not None:\n            x = x + self.lin_c(c).unsqueeze(1)\n        x = F.elu(x)\n        x = self.lin_i(x)\n        x = self.dropout(x)\n        return self.gate(x, self.project_a(a))\n\n\nclass VariableSelectionNetwork(nn.Module):\n    def __init__(self, d_model, variable_num, dropout=0.0):\n        super(VariableSelectionNetwork, self).__init__()\n        self.joint_grn = GRN(d_model * variable_num, variable_num, hidden_size=d_model, context_size=d_model, dropout=dropout)\n        self.variable_grns = nn.ModuleList([GRN(d_model, d_model, dropout=dropout) for _ in range(variable_num)])\n\n    def forward(self, x: Tensor, context: Optional[Tensor] = None):\n        # x: [B,T,C,d] or [B,C,d]\n        # selection_weights: [B,T,C] or [B,C]\n        # x_processed: [B,T,d,C] or [B,d,C]\n        # selection_result: [B,T,d] or [B,d]\n        x_flattened = torch.flatten(x, start_dim=-2)\n        selection_weights = self.joint_grn(x_flattened, context)\n        selection_weights = F.softmax(selection_weights, dim=-1)\n\n        x_processed = torch.stack([grn(x[...,i,:]) for i, grn in enumerate(self.variable_grns)], dim=-1)\n\n        selection_result = torch.matmul(x_processed, selection_weights.unsqueeze(-1)).squeeze(-1)\n        return selection_result\n\n\nclass StaticCovariateEncoder(nn.Module):\n    def __init__(self, d_model, static_len, dropout=0.0):\n        super(StaticCovariateEncoder, self).__init__()\n        self.static_vsn = VariableSelectionNetwork(d_model, static_len) if static_len else None\n        self.grns = nn.ModuleList([GRN(d_model, d_model, dropout=dropout) for _ in range(4)])\n\n    def forward(self, static_input):\n        # static_input: [B,C,d]\n        if static_input is not None:\n            static_features = self.static_vsn(static_input)\n            return [grn(static_features) for grn in self.grns]\n        else:\n            return [None] * 4\n\n\nclass InterpretableMultiHeadAttention(nn.Module):\n    def __init__(self, configs):\n        super(InterpretableMultiHeadAttention, self).__init__()\n        self.n_heads = configs.n_heads\n        assert configs.d_model % configs.n_heads == 0\n        self.d_head = configs.d_model // configs.n_heads\n        self.qkv_linears = nn.Linear(configs.d_model, (2 * self.n_heads + 1) * self.d_head, bias=False)\n        self.out_projection = nn.Linear(self.d_head, configs.d_model, bias=False)\n        self.out_dropout = nn.Dropout(configs.dropout)\n        self.scale = self.d_head ** -0.5\n        example_len = configs.seq_len + configs.pred_len\n        self.register_buffer(\"mask\", torch.triu(torch.full((example_len, example_len), float('-inf')), 1))\n\n    def forward(self, x):\n        # Q,K,V are all from x\n        B, T, d_model = x.shape\n        qkv = self.qkv_linears(x)\n        q, k, v = qkv.split((self.n_heads * self.d_head, self.n_heads * self.d_head, self.d_head), dim=-1)\n        q = q.view(B, T, self.n_heads, self.d_head)\n        k = k.view(B, T, self.n_heads, self.d_head)\n        v = v.view(B, T, self.d_head)\n\n        attention_score = torch.matmul(q.permute((0, 2, 1, 3)), k.permute((0, 2, 3, 1)))  # [B,n,T,T]\n        attention_score.mul_(self.scale)\n        attention_score = attention_score + self.mask\n        attention_prob = F.softmax(attention_score, dim=3)  # [B,n,T,T]\n\n        attention_out = torch.matmul(attention_prob, v.unsqueeze(1))  # [B,n,T,d]\n        attention_out = torch.mean(attention_out, dim=1)  # [B,T,d]\n        out = self.out_projection(attention_out)\n        out = self.out_dropout(out)  # [B,T,d]\n        return out\n\n\nclass TemporalFusionDecoder(nn.Module):\n    def __init__(self, configs):\n        super(TemporalFusionDecoder, self).__init__()\n        self.pred_len = configs.pred_len\n\n        self.history_encoder = nn.LSTM(configs.d_model, configs.d_model, batch_first=True)\n        self.future_encoder = nn.LSTM(configs.d_model, configs.d_model, batch_first=True)\n        self.gate_after_lstm = GateAddNorm(configs.d_model, configs.d_model)\n        self.enrichment_grn = GRN(configs.d_model, configs.d_model, context_size=configs.d_model, dropout=configs.dropout)\n        self.attention = InterpretableMultiHeadAttention(configs)\n        self.gate_after_attention = GateAddNorm(configs.d_model, configs.d_model)\n        self.position_wise_grn = GRN(configs.d_model, configs.d_model, dropout=configs.dropout)\n        self.gate_final = GateAddNorm(configs.d_model, configs.d_model)\n        self.out_projection = nn.Linear(configs.d_model, configs.c_out)\n\n    def forward(self, history_input, future_input, c_c, c_h, c_e):\n        # history_input, future_input: [B,T,d]\n        # c_c, c_h, c_e: [B,d]\n        # LSTM\n        c = (c_c.unsqueeze(0), c_h.unsqueeze(0)) if c_c is not None and c_h is not None else None\n        historical_features, state = self.history_encoder(history_input, c)\n        future_features, _ = self.future_encoder(future_input, state)\n\n        # Skip connection\n        temporal_input = torch.cat([history_input, future_input], dim=1)\n        temporal_features = torch.cat([historical_features, future_features], dim=1)\n        temporal_features = self.gate_after_lstm(temporal_features, temporal_input)  # [B,T,d]\n\n        # Static enrichment\n        enriched_features = self.enrichment_grn(temporal_features, c_e)  # [B,T,d]\n\n        # Temporal self-attention\n        attention_out = self.attention(enriched_features)  # [B,T,d]\n        # Don't compute historical loss\n        attention_out = self.gate_after_attention(attention_out[:,-self.pred_len:], enriched_features[:,-self.pred_len:])\n\n        # Position-wise feed-forward\n        out = self.position_wise_grn(attention_out)  # [B,T,d]\n\n        # Final skip connection\n        out = self.gate_final(out, temporal_features[:,-self.pred_len:])\n        return self.out_projection(out)\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.configs = configs\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n\n        # Number of variables\n        self.static_len = len(datatype_dict[configs.data].static)\n        self.observed_len = len(datatype_dict[configs.data].observed)\n        self.known_len = get_known_len(configs.embed, configs.freq)\n\n        self.embedding = TFTEmbedding(configs)\n        self.static_encoder = StaticCovariateEncoder(configs.d_model, self.static_len)\n        self.history_vsn = VariableSelectionNetwork(configs.d_model, self.observed_len + self.known_len)\n        self.future_vsn = VariableSelectionNetwork(configs.d_model, self.known_len)\n        self.temporal_fusion_decoder = TemporalFusionDecoder(configs)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        # Data embedding\n        # static_input: [B,C,d], observed_input:[B,T,C,d], known_input: [B,T,C,d]\n        static_input, observed_input, known_input = self.embedding(x_enc, x_mark_enc, x_dec, x_mark_dec)\n\n        # Static context\n        # c_s,...,c_e: [B,d]\n        c_s, c_c, c_h, c_e = self.static_encoder(static_input)\n\n        # Temporal input Selection\n        history_input = torch.cat([observed_input, known_input[:,:self.seq_len]], dim=-2)\n        future_input = known_input[:,self.seq_len:]\n        history_input = self.history_vsn(history_input, c_s)\n        future_input = self.future_vsn(future_input, c_s)\n\n        # TFT main procedure after variable selection\n        # history_input: [B,T,d], future_input: [B,T,d]\n        dec_out = self.temporal_fusion_decoder(history_input, future_input, c_c, c_h, c_e)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)  # [B,pred_len,C]\n            dec_out = torch.cat([torch.zeros_like(x_enc), dec_out], dim=1)\n            return dec_out  # [B, T, D]\n        return None"
  },
  {
    "path": "models/TiDE.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n\nclass LayerNorm(nn.Module):\n    \"\"\" LayerNorm but with an optional bias. PyTorch doesn't support simply bias=False \"\"\"\n\n    def __init__(self, ndim, bias):\n        super().__init__()\n        self.weight = nn.Parameter(torch.ones(ndim))\n        self.bias = nn.Parameter(torch.zeros(ndim)) if bias else None\n\n    def forward(self, input):\n        return F.layer_norm(input, self.weight.shape, self.weight, self.bias, 1e-5)\n\n\n\nclass ResBlock(nn.Module):\n    def __init__(self, input_dim, hidden_dim, output_dim, dropout=0.1, bias=True): \n        super().__init__()\n\n        self.fc1 = nn.Linear(input_dim, hidden_dim, bias=bias) \n        self.fc2 = nn.Linear(hidden_dim, output_dim, bias=bias)\n        self.fc3 = nn.Linear(input_dim, output_dim, bias=bias)\n        self.dropout = nn.Dropout(dropout)\n        self.relu = nn.ReLU()\n        self.ln = LayerNorm(output_dim, bias=bias)\n        \n    def forward(self, x):\n\n        out = self.fc1(x)\n        out = self.relu(out)\n        out = self.fc2(out)\n        out = self.dropout(out)\n        out = out + self.fc3(x)\n        out = self.ln(out)\n        return out\n\n\n#TiDE\nclass Model(nn.Module):  \n    \"\"\"\n    paper: https://arxiv.org/pdf/2304.08424.pdf \n    \"\"\"\n    def __init__(self, configs, bias=True, feature_encode_dim=2): \n        super(Model, self).__init__()\n        self.configs = configs\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len  #L \n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len  #H \n        self.hidden_dim=configs.d_model\n        self.res_hidden=configs.d_model \n        self.encoder_num=configs.e_layers\n        self.decoder_num=configs.d_layers\n        self.freq=configs.freq\n        self.feature_encode_dim=feature_encode_dim\n        self.decode_dim = configs.c_out\n        self.temporalDecoderHidden=configs.d_ff\n        dropout=configs.dropout\n\n        \n        freq_map = {'h': 4, 't': 5, 's': 6,\n                    'm': 1, 'a': 1, 'w': 2, 'd': 3, 'b': 3}\n        \n        self.feature_dim=freq_map[self.freq]\n\n\n        flatten_dim = self.seq_len + (self.seq_len + self.pred_len) * self.feature_encode_dim\n\n        self.feature_encoder = ResBlock(self.feature_dim, self.res_hidden, self.feature_encode_dim, dropout, bias)\n        self.encoders = nn.Sequential(ResBlock(flatten_dim, self.res_hidden, self.hidden_dim, dropout, bias),*([ ResBlock(self.hidden_dim, self.res_hidden, self.hidden_dim, dropout, bias)]*(self.encoder_num-1)))\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.decoders = nn.Sequential(*([ ResBlock(self.hidden_dim, self.res_hidden, self.hidden_dim, dropout, bias)]*(self.decoder_num-1)),ResBlock(self.hidden_dim, self.res_hidden, self.decode_dim * self.pred_len, dropout, bias))\n            self.temporalDecoder = ResBlock(self.decode_dim + self.feature_encode_dim, self.temporalDecoderHidden, 1, dropout, bias)\n            self.residual_proj = nn.Linear(self.seq_len, self.pred_len, bias=bias)\n        if self.task_name == 'imputation':\n            self.decoders = nn.Sequential(*([ ResBlock(self.hidden_dim, self.res_hidden, self.hidden_dim, dropout, bias)]*(self.decoder_num-1)),ResBlock(self.hidden_dim, self.res_hidden, self.decode_dim * self.seq_len, dropout, bias))\n            self.temporalDecoder = ResBlock(self.decode_dim + self.feature_encode_dim, self.temporalDecoderHidden, 1, dropout, bias)\n            self.residual_proj = nn.Linear(self.seq_len, self.seq_len, bias=bias)\n        if self.task_name == 'anomaly_detection':\n            self.decoders = nn.Sequential(*([ ResBlock(self.hidden_dim, self.res_hidden, self.hidden_dim, dropout, bias)]*(self.decoder_num-1)),ResBlock(self.hidden_dim, self.res_hidden, self.decode_dim * self.seq_len, dropout, bias))\n            self.temporalDecoder = ResBlock(self.decode_dim + self.feature_encode_dim, self.temporalDecoderHidden, 1, dropout, bias)\n            self.residual_proj = nn.Linear(self.seq_len, self.seq_len, bias=bias)\n            \n        \n    def forecast(self, x_enc, x_mark_enc, x_dec, batch_y_mark):\n        # Normalization\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n        \n        feature = self.feature_encoder(batch_y_mark)\n        hidden = self.encoders(torch.cat([x_enc, feature.reshape(feature.shape[0], -1)], dim=-1))\n        decoded = self.decoders(hidden).reshape(hidden.shape[0], self.pred_len, self.decode_dim)\n        dec_out = self.temporalDecoder(torch.cat([feature[:,self.seq_len:], decoded], dim=-1)).squeeze(-1) + self.residual_proj(x_enc)\n        \n        \n        # De-Normalization \n        dec_out = dec_out * (stdev[:, 0].unsqueeze(1).repeat(1, self.pred_len))\n        dec_out = dec_out + (means[:, 0].unsqueeze(1).repeat(1, self.pred_len))\n        return dec_out\n    \n    def imputation(self, x_enc, x_mark_enc, x_dec, batch_y_mark, mask):\n        # Normalization\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        feature = self.feature_encoder(x_mark_enc)\n        hidden = self.encoders(torch.cat([x_enc, feature.reshape(feature.shape[0], -1)], dim=-1))\n        decoded = self.decoders(hidden).reshape(hidden.shape[0], self.seq_len, self.decode_dim)\n        dec_out = self.temporalDecoder(torch.cat([feature[:,:self.seq_len], decoded], dim=-1)).squeeze(-1) + self.residual_proj(x_enc)\n    \n        # De-Normalization \n        dec_out = dec_out * (stdev[:, 0].unsqueeze(1).repeat(1, self.seq_len))\n        dec_out = dec_out + (means[:, 0].unsqueeze(1).repeat(1, self.seq_len))\n        return dec_out\n    \n    \n    def forward(self, x_enc, x_mark_enc, x_dec, batch_y_mark, mask=None):\n        '''x_mark_enc is the exogenous dynamic feature described in the original paper'''\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            if batch_y_mark is None:\n                batch_y_mark = torch.zeros((x_enc.shape[0], self.seq_len+self.pred_len, self.feature_dim)).to(x_enc.device).detach()\n            else:\n                batch_y_mark = torch.concat([x_mark_enc, batch_y_mark[:, -self.pred_len:, :]],dim=1)\n            dec_out = torch.stack([self.forecast(x_enc[:, :, feature], x_mark_enc, x_dec, batch_y_mark) for feature in range(x_enc.shape[-1])],dim=-1)\n            return dec_out # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = torch.stack([self.imputation(x_enc[:, :, feature], x_mark_enc, x_dec, batch_y_mark, mask) for feature in range(x_enc.shape[-1])],dim=-1)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            raise NotImplementedError(\"Task anomaly_detection for Tide is temporarily not supported\")\n        if self.task_name == 'classification':\n            raise NotImplementedError(\"Task classification for Tide is temporarily not supported\")\n        return None\n    \n    \n\n\n\n"
  },
  {
    "path": "models/TiRex.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nfrom tirex import load_model, ForecastModel\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.model = load_model(\"NX-AI/TiRex\")\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc.sub(means)\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc = x_enc.div(stdev)\n\n        B, L, C = x_enc.shape\n        x_enc = torch.reshape(x_enc, (B*C, L))\n        quantiles, output = self.model.forecast(x_enc, prediction_length=self.pred_len)\n        dec_out = torch.reshape(output, (B, output.shape[-1], C)).to(x_enc.device)\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/TimeFilter.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport math\n\nfrom layers.Embed import PositionalEmbedding\nfrom layers.StandardNorm import Normalize\nfrom layers.TimeFilter_layers import TimeFilter_Backbone\n\n\nclass PatchEmbed(nn.Module):\n    def __init__(self, dim, patch_len, stride=None, pos=True):\n        super().__init__()\n        self.patch_len = patch_len\n        self.stride = patch_len if stride is None else stride\n        self.patch_proj = nn.Linear(self.patch_len, dim)\n        self.pos = pos\n        if self.pos:\n            pos_emb_theta = 10000\n            self.pe = PositionalEmbedding(dim, pos_emb_theta)\n\n    def forward(self, x):\n        # x: [B, N, T]\n        x = x.unfold(dimension=-1, size=self.patch_len, step=self.stride)\n        # x: [B, N*L, P]\n        x = self.patch_proj(x)  # [B, N*L, D]\n        if self.pos:\n            x += self.pe(x)\n        return x\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        super().__init__()\n        self.args = configs\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.n_vars = configs.c_out\n        self.dim = configs.d_model\n        self.d_ff = configs.d_ff\n        self.patch_len = configs.patch_len\n        self.stride = self.patch_len\n        self.num_patches = int((self.seq_len - self.patch_len) / self.stride + 1)  # L\n\n        # Filter\n        self.alpha = 0.1 if configs.alpha is None else configs.alpha\n        self.top_p = 0.5 if configs.top_p is None else configs.top_p\n\n        # embed\n        self.patch_embed = PatchEmbed(self.dim, self.patch_len, self.stride, configs.pos)\n\n        # TimeFilter.sh Backbone\n        self.backbone = TimeFilter_Backbone(self.dim, self.n_vars, self.d_ff,\n                                            configs.n_heads, configs.e_layers, self.top_p, configs.dropout,\n                                            self.seq_len * self.n_vars // self.patch_len)\n\n        # head\n        # self.head = nn.Linear(self.dim * self.num_patches, self.pred_len)\n\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.head = nn.Linear(self.dim * self.num_patches, self.pred_len)\n        elif self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.head = nn.Linear(self.dim * self.num_patches, self.seq_len)\n        elif self.task_name == 'classification':\n            self.num_patches = int((self.seq_len * configs.enc_in - self.patch_len) / self.stride + 1)  # L\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                self.dim * self.num_patches, configs.num_class)\n\n        # Without RevIN\n        self.use_RevIN = False\n        self.norm = Normalize(configs.enc_in, affine=self.use_RevIN)\n\n    def _get_mask(self, device):\n        dtype = torch.float32\n        L = self.args.seq_len * self.args.c_out // self.args.patch_len\n        N = self.args.seq_len // self.args.patch_len\n        masks = []\n        for k in range(L):\n            S = ((torch.arange(L) % N == k % N) & (torch.arange(L) != k)).to(dtype).to(device)\n            T = ((torch.arange(L) >= k // N * N) & (torch.arange(L) < k // N * N + N) & (torch.arange(L) != k)).to(\n                dtype).to(device)\n            ST = torch.ones(L).to(dtype).to(device) - S - T\n            ST[k] = 0.0\n            masks.append(torch.stack([S, T, ST], dim=0))\n        masks = torch.stack(masks, dim=0)\n        return masks\n\n    def forecast(self, x, masks, x_dec, x_mark_dec):\n        # x: [B, T, C]\n        B, T, C = x.shape\n        # Normalization\n        x = self.norm(x, 'norm')\n        # x: [B, C, T]\n        x = x.permute(0, 2, 1).reshape(-1, C * T)  # [B, C*T]\n        x = self.patch_embed(x)  # [B, N, D]  N = [C*T / P]\n\n        x, moe_loss = self.backbone(x, self._get_mask(x.device), self.alpha)\n\n        # [B, C, T/P, D]\n        x = self.head(x.reshape(-1, self.n_vars, self.num_patches, self.dim).flatten(start_dim=-2))  # [B, C, T]\n        x = x.permute(0, 2, 1)\n        # De-Normalization\n        x = self.norm(x, 'denorm')\n\n        return x\n\n    def imputation(self, x, x_mark_enc, x_dec, x_mark_dec, mask):\n        # x: [B, T, C]\n        B, T, C = x.shape\n        # Normalization\n        x = self.norm(x, 'norm')\n        # x: [B, C, T]\n        x = x.permute(0, 2, 1).reshape(-1, C * T)  # [B, C*T]\n        x = self.patch_embed(x)  # [B, N, D]  N = [C*T / P]\n\n        x, moe_loss = self.backbone(x, self._get_mask(x.device), self.alpha)\n\n        # [B, C, T/P, D]\n        x = self.head(x.reshape(-1, self.n_vars, self.num_patches, self.dim).flatten(start_dim=-2))  # [B, C, T]\n        x = x.permute(0, 2, 1)\n        # De-Normalization\n        x = self.norm(x, 'denorm')\n\n        return x\n\n    def classification(self, x, x_mark_enc):\n        # x: [B, T, C]\n        B, T, C = x.shape\n        # Normalization\n        x = self.norm(x, 'norm')\n        # x: [B, C, T]\n        x = x.permute(0, 2, 1).reshape(-1, C * T)  # [B, C*T]\n        x = self.patch_embed(x)  # [B, N, D]  N = [C*T / P]\n        x, moe_loss = self.backbone(x, self._get_mask(x.device), self.alpha)\n\n        # [B, C, T/P, D]\n        output = self.dropout(x.flatten(start_dim=1))\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def anomaly_detection(self, x):\n        # x: [B, T, C]\n        B, T, C = x.shape\n        # Normalization\n        x = self.norm(x, 'norm')\n        # x: [B, C, T]\n        x = x.permute(0, 2, 1).reshape(-1, C * T)  # [B, C*T]\n        x = self.patch_embed(x)  # [B, N, D]  N = [C*T / P]\n\n        x, moe_loss = self.backbone(x, self._get_mask(x.device), self.alpha)\n\n        # [B, C, T/P, D]\n        x = self.head(x.reshape(-1, self.n_vars, self.num_patches, self.dim).flatten(start_dim=-2))  # [B, C, T]\n        x = x.permute(0, 2, 1)\n        # De-Normalization\n        x = self.norm(x, 'denorm')\n\n        return x\n\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/TimeMixer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Autoformer_EncDec import series_decomp\nfrom layers.Embed import DataEmbedding_wo_pos\nfrom layers.StandardNorm import Normalize\n\n\nclass DFT_series_decomp(nn.Module):\n    \"\"\"\n    Series decomposition block\n    \"\"\"\n\n    def __init__(self, top_k: int = 5):\n        super(DFT_series_decomp, self).__init__()\n        self.top_k = top_k\n\n    def forward(self, x):\n        xf = torch.fft.rfft(x, dim=1)\n        freq = abs(xf)\n        freq[0] = 0\n        top_k_freq, top_list = torch.topk(freq, k=self.top_k)\n        xf[freq <= top_k_freq.min()] = 0\n        x_season = torch.fft.irfft(xf, dim=1)\n        x_trend = x - x_season\n        return x_season, x_trend\n\n\nclass MultiScaleSeasonMixing(nn.Module):\n    \"\"\"\n    Bottom-up mixing season pattern\n    \"\"\"\n\n    def __init__(self, configs):\n        super(MultiScaleSeasonMixing, self).__init__()\n\n        self.down_sampling_layers = torch.nn.ModuleList(\n            [\n                nn.Sequential(\n                    torch.nn.Linear(\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                        configs.seq_len // (configs.down_sampling_window ** (i + 1)),\n                    ),\n                    nn.GELU(),\n                    torch.nn.Linear(\n                        configs.seq_len // (configs.down_sampling_window ** (i + 1)),\n                        configs.seq_len // (configs.down_sampling_window ** (i + 1)),\n                    ),\n\n                )\n                for i in range(configs.down_sampling_layers)\n            ]\n        )\n\n    def forward(self, season_list):\n\n        # mixing high->low\n        out_high = season_list[0]\n        out_low = season_list[1]\n        out_season_list = [out_high.permute(0, 2, 1)]\n\n        for i in range(len(season_list) - 1):\n            out_low_res = self.down_sampling_layers[i](out_high)\n            out_low = out_low + out_low_res\n            out_high = out_low\n            if i + 2 <= len(season_list) - 1:\n                out_low = season_list[i + 2]\n            out_season_list.append(out_high.permute(0, 2, 1))\n\n        return out_season_list\n\n\nclass MultiScaleTrendMixing(nn.Module):\n    \"\"\"\n    Top-down mixing trend pattern\n    \"\"\"\n\n    def __init__(self, configs):\n        super(MultiScaleTrendMixing, self).__init__()\n\n        self.up_sampling_layers = torch.nn.ModuleList(\n            [\n                nn.Sequential(\n                    torch.nn.Linear(\n                        configs.seq_len // (configs.down_sampling_window ** (i + 1)),\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                    ),\n                    nn.GELU(),\n                    torch.nn.Linear(\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                    ),\n                )\n                for i in reversed(range(configs.down_sampling_layers))\n            ])\n\n    def forward(self, trend_list):\n\n        # mixing low->high\n        trend_list_reverse = trend_list.copy()\n        trend_list_reverse.reverse()\n        out_low = trend_list_reverse[0]\n        out_high = trend_list_reverse[1]\n        out_trend_list = [out_low.permute(0, 2, 1)]\n\n        for i in range(len(trend_list_reverse) - 1):\n            out_high_res = self.up_sampling_layers[i](out_low)\n            out_high = out_high + out_high_res\n            out_low = out_high\n            if i + 2 <= len(trend_list_reverse) - 1:\n                out_high = trend_list_reverse[i + 2]\n            out_trend_list.append(out_low.permute(0, 2, 1))\n\n        out_trend_list.reverse()\n        return out_trend_list\n\n\nclass PastDecomposableMixing(nn.Module):\n    def __init__(self, configs):\n        super(PastDecomposableMixing, self).__init__()\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.down_sampling_window = configs.down_sampling_window\n\n        self.layer_norm = nn.LayerNorm(configs.d_model)\n        self.dropout = nn.Dropout(configs.dropout)\n        self.channel_independence = configs.channel_independence\n\n        if configs.decomp_method == 'moving_avg':\n            self.decompsition = series_decomp(configs.moving_avg)\n        elif configs.decomp_method == \"dft_decomp\":\n            self.decompsition = DFT_series_decomp(configs.top_k)\n        else:\n            raise ValueError('decompsition is error')\n\n        if not configs.channel_independence:\n            self.cross_layer = nn.Sequential(\n                nn.Linear(in_features=configs.d_model, out_features=configs.d_ff),\n                nn.GELU(),\n                nn.Linear(in_features=configs.d_ff, out_features=configs.d_model),\n            )\n\n        # Mixing season\n        self.mixing_multi_scale_season = MultiScaleSeasonMixing(configs)\n\n        # Mxing trend\n        self.mixing_multi_scale_trend = MultiScaleTrendMixing(configs)\n\n        self.out_cross_layer = nn.Sequential(\n            nn.Linear(in_features=configs.d_model, out_features=configs.d_ff),\n            nn.GELU(),\n            nn.Linear(in_features=configs.d_ff, out_features=configs.d_model),\n        )\n\n    def forward(self, x_list):\n        length_list = []\n        for x in x_list:\n            _, T, _ = x.size()\n            length_list.append(T)\n\n        # Decompose to obtain the season and trend\n        season_list = []\n        trend_list = []\n        for x in x_list:\n            season, trend = self.decompsition(x)\n            if not self.channel_independence:\n                season = self.cross_layer(season)\n                trend = self.cross_layer(trend)\n            season_list.append(season.permute(0, 2, 1))\n            trend_list.append(trend.permute(0, 2, 1))\n\n        # bottom-up season mixing\n        out_season_list = self.mixing_multi_scale_season(season_list)\n        # top-down trend mixing\n        out_trend_list = self.mixing_multi_scale_trend(trend_list)\n\n        out_list = []\n        for ori, out_season, out_trend, length in zip(x_list, out_season_list, out_trend_list,\n                                                      length_list):\n            out = out_season + out_trend\n            if self.channel_independence:\n                out = ori + self.out_cross_layer(out)\n            out_list.append(out[:, :length, :])\n        return out_list\n\n\nclass Model(nn.Module):\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.configs = configs\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n        self.down_sampling_window = configs.down_sampling_window\n        self.channel_independence = configs.channel_independence\n        self.pdm_blocks = nn.ModuleList([PastDecomposableMixing(configs)\n                                         for _ in range(configs.e_layers)])\n\n        self.preprocess = series_decomp(configs.moving_avg)\n        self.enc_in = configs.enc_in\n\n        if self.channel_independence:\n            self.enc_embedding = DataEmbedding_wo_pos(1, configs.d_model, configs.embed, configs.freq,\n                                                      configs.dropout)\n        else:\n            self.enc_embedding = DataEmbedding_wo_pos(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                                      configs.dropout)\n\n        self.layer = configs.e_layers\n\n        self.normalize_layers = torch.nn.ModuleList(\n            [\n                Normalize(self.configs.enc_in, affine=True, non_norm=True if configs.use_norm == 0 else False)\n                for i in range(configs.down_sampling_layers + 1)\n            ]\n        )\n\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.predict_layers = torch.nn.ModuleList(\n                [\n                    torch.nn.Linear(\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                        configs.pred_len,\n                    )\n                    for i in range(configs.down_sampling_layers + 1)\n                ]\n            )\n\n            if self.channel_independence:\n                self.projection_layer = nn.Linear(\n                    configs.d_model, 1, bias=True)\n            else:\n                self.projection_layer = nn.Linear(\n                    configs.d_model, configs.c_out, bias=True)\n\n                self.out_res_layers = torch.nn.ModuleList([\n                    torch.nn.Linear(\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                        configs.seq_len // (configs.down_sampling_window ** i),\n                    )\n                    for i in range(configs.down_sampling_layers + 1)\n                ])\n\n                self.regression_layers = torch.nn.ModuleList(\n                    [\n                        torch.nn.Linear(\n                            configs.seq_len // (configs.down_sampling_window ** i),\n                            configs.pred_len,\n                        )\n                        for i in range(configs.down_sampling_layers + 1)\n                    ]\n                )\n\n        if self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            if self.channel_independence:\n                self.projection_layer = nn.Linear(\n                    configs.d_model, 1, bias=True)\n            else:\n                self.projection_layer = nn.Linear(\n                    configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.d_model * configs.seq_len, configs.num_class)\n\n    def out_projection(self, dec_out, i, out_res):\n        dec_out = self.projection_layer(dec_out)\n        out_res = out_res.permute(0, 2, 1)\n        out_res = self.out_res_layers[i](out_res)\n        out_res = self.regression_layers[i](out_res).permute(0, 2, 1)\n        dec_out = dec_out + out_res\n        return dec_out\n\n    def pre_enc(self, x_list):\n        if self.channel_independence:\n            return (x_list, None)\n        else:\n            out1_list = []\n            out2_list = []\n            for x in x_list:\n                x_1, x_2 = self.preprocess(x)\n                out1_list.append(x_1)\n                out2_list.append(x_2)\n            return (out1_list, out2_list)\n\n    def __multi_scale_process_inputs(self, x_enc, x_mark_enc):\n        if self.configs.down_sampling_method == 'max':\n            down_pool = torch.nn.MaxPool1d(self.configs.down_sampling_window, return_indices=False)\n        elif self.configs.down_sampling_method == 'avg':\n            down_pool = torch.nn.AvgPool1d(self.configs.down_sampling_window)\n        elif self.configs.down_sampling_method == 'conv':\n            padding = 1 if torch.__version__ >= '1.5.0' else 2\n            down_pool = nn.Conv1d(in_channels=self.configs.enc_in, out_channels=self.configs.enc_in,\n                                  kernel_size=3, padding=padding,\n                                  stride=self.configs.down_sampling_window,\n                                  padding_mode='circular',\n                                  bias=False)\n        else:\n            return x_enc, x_mark_enc\n        # B,T,C -> B,C,T\n        x_enc = x_enc.permute(0, 2, 1)\n\n        x_enc_ori = x_enc\n        x_mark_enc_mark_ori = x_mark_enc\n\n        x_enc_sampling_list = []\n        x_mark_sampling_list = []\n        x_enc_sampling_list.append(x_enc.permute(0, 2, 1))\n        x_mark_sampling_list.append(x_mark_enc)\n\n        for i in range(self.configs.down_sampling_layers):\n            x_enc_sampling = down_pool(x_enc_ori)\n\n            x_enc_sampling_list.append(x_enc_sampling.permute(0, 2, 1))\n            x_enc_ori = x_enc_sampling\n\n            if x_mark_enc is not None:\n                x_mark_sampling_list.append(x_mark_enc_mark_ori[:, ::self.configs.down_sampling_window, :])\n                x_mark_enc_mark_ori = x_mark_enc_mark_ori[:, ::self.configs.down_sampling_window, :]\n\n        x_enc = x_enc_sampling_list\n        x_mark_enc = x_mark_sampling_list if x_mark_enc is not None else None\n\n        return x_enc, x_mark_enc\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n\n        x_enc, x_mark_enc = self.__multi_scale_process_inputs(x_enc, x_mark_enc)\n\n        x_list = []\n        x_mark_list = []\n        if x_mark_enc is not None:\n            for i, x, x_mark in zip(range(len(x_enc)), x_enc, x_mark_enc):\n                B, T, N = x.size()\n                x = self.normalize_layers[i](x, 'norm')\n                if self.channel_independence:\n                    x = x.permute(0, 2, 1).contiguous().reshape(B * N, T, 1)\n                    x_list.append(x)\n                    x_mark = x_mark.repeat(N, 1, 1)\n                    x_mark_list.append(x_mark)\n                else:\n                    x_list.append(x)\n                    x_mark_list.append(x_mark)\n        else:\n            for i, x in zip(range(len(x_enc)), x_enc, ):\n                B, T, N = x.size()\n                x = self.normalize_layers[i](x, 'norm')\n                if self.channel_independence:\n                    x = x.permute(0, 2, 1).contiguous().reshape(B * N, T, 1)\n                x_list.append(x)\n\n        # embedding\n        enc_out_list = []\n        x_list = self.pre_enc(x_list)\n        if x_mark_enc is not None:\n            for i, x, x_mark in zip(range(len(x_list[0])), x_list[0], x_mark_list):\n                enc_out = self.enc_embedding(x, x_mark)  # [B,T,C]\n                enc_out_list.append(enc_out)\n        else:\n            for i, x in zip(range(len(x_list[0])), x_list[0]):\n                enc_out = self.enc_embedding(x, None)  # [B,T,C]\n                enc_out_list.append(enc_out)\n\n        # Past Decomposable Mixing as encoder for past\n        for i in range(self.layer):\n            enc_out_list = self.pdm_blocks[i](enc_out_list)\n\n        # Future Multipredictor Mixing as decoder for future\n        dec_out_list = self.future_multi_mixing(B, enc_out_list, x_list)\n\n        dec_out = torch.stack(dec_out_list, dim=-1).sum(-1)\n        dec_out = self.normalize_layers[0](dec_out, 'denorm')\n        return dec_out\n\n    def future_multi_mixing(self, B, enc_out_list, x_list):\n        dec_out_list = []\n        if self.channel_independence:\n            x_list = x_list[0]\n            for i, enc_out in zip(range(len(x_list)), enc_out_list):\n                dec_out = self.predict_layers[i](enc_out.permute(0, 2, 1)).permute(\n                    0, 2, 1)  # align temporal dimension\n                dec_out = self.projection_layer(dec_out)\n                dec_out = dec_out.reshape(B, self.configs.c_out, self.pred_len).permute(0, 2, 1).contiguous()\n                dec_out_list.append(dec_out)\n\n        else:\n            for i, enc_out, out_res in zip(range(len(x_list[0])), enc_out_list, x_list[1]):\n                dec_out = self.predict_layers[i](enc_out.permute(0, 2, 1)).permute(\n                    0, 2, 1)  # align temporal dimension\n                dec_out = self.out_projection(dec_out, i, out_res)\n                dec_out_list.append(dec_out)\n\n        return dec_out_list\n\n    def classification(self, x_enc, x_mark_enc):\n        x_enc, _ = self.__multi_scale_process_inputs(x_enc, None)\n        x_list = x_enc\n\n        # embedding\n        enc_out_list = []\n        for x in x_list:\n            enc_out = self.enc_embedding(x, None)  # [B,T,C]\n            enc_out_list.append(enc_out)\n\n        # MultiScale-CrissCrossAttention  as encoder for past\n        for i in range(self.layer):\n            enc_out_list = self.pdm_blocks[i](enc_out_list)\n\n        enc_out = enc_out_list[0]\n        # Output\n        # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        # zero-out padding embeddings\n        output = output * x_mark_enc.unsqueeze(-1)\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def anomaly_detection(self, x_enc):\n        B, T, N = x_enc.size()\n        x_enc, _ = self.__multi_scale_process_inputs(x_enc, None)\n\n        x_list = []\n\n        for i, x in zip(range(len(x_enc)), x_enc, ):\n            B, T, N = x.size()\n            x = self.normalize_layers[i](x, 'norm')\n            if self.channel_independence:\n                x = x.permute(0, 2, 1).contiguous().reshape(B * N, T, 1)\n            x_list.append(x)\n\n        # embedding\n        enc_out_list = []\n        for x in x_list:\n            enc_out = self.enc_embedding(x, None)  # [B,T,C]\n            enc_out_list.append(enc_out)\n\n        # MultiScale-CrissCrossAttention  as encoder for past\n        for i in range(self.layer):\n            enc_out_list = self.pdm_blocks[i](enc_out_list)\n\n        dec_out = self.projection_layer(enc_out_list[0])\n        dec_out = dec_out.reshape(B, self.configs.c_out, -1).permute(0, 2, 1).contiguous()\n\n        dec_out = self.normalize_layers[0](dec_out, 'denorm')\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, mask):\n        means = torch.sum(x_enc, dim=1) / torch.sum(mask == 1, dim=1)\n        means = means.unsqueeze(1).detach()\n        x_enc = x_enc - means\n        x_enc = x_enc.masked_fill(mask == 0, 0)\n        stdev = torch.sqrt(torch.sum(x_enc * x_enc, dim=1) /\n                           torch.sum(mask == 1, dim=1) + 1e-5)\n        stdev = stdev.unsqueeze(1).detach()\n        x_enc /= stdev\n\n        B, T, N = x_enc.size()\n        x_enc, x_mark_enc = self.__multi_scale_process_inputs(x_enc, x_mark_enc)\n\n        x_list = []\n        x_mark_list = []\n        if x_mark_enc is not None:\n            for i, x, x_mark in zip(range(len(x_enc)), x_enc, x_mark_enc):\n                B, T, N = x.size()\n                if self.channel_independence:\n                    x = x.permute(0, 2, 1).contiguous().reshape(B * N, T, 1)\n                x_list.append(x)\n                x_mark = x_mark.repeat(N, 1, 1)\n                x_mark_list.append(x_mark)\n        else:\n            for i, x in zip(range(len(x_enc)), x_enc, ):\n                B, T, N = x.size()\n                if self.channel_independence:\n                    x = x.permute(0, 2, 1).contiguous().reshape(B * N, T, 1)\n                x_list.append(x)\n\n        # embedding\n        enc_out_list = []\n        for x in x_list:\n            enc_out = self.enc_embedding(x, None)  # [B,T,C]\n            enc_out_list.append(enc_out)\n\n        # MultiScale-CrissCrossAttention  as encoder for past\n        for i in range(self.layer):\n            enc_out_list = self.pdm_blocks[i](enc_out_list)\n\n        dec_out = self.projection_layer(enc_out_list[0])\n        dec_out = dec_out.reshape(B, self.configs.c_out, -1).permute(0, 2, 1).contiguous()\n\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.seq_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.seq_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        else:\n            raise ValueError('Other tasks implemented yet')\n"
  },
  {
    "path": "models/TimeMoE.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nfrom transformers import AutoModelForCausalLM\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n        self.model = AutoModelForCausalLM.from_pretrained('Maple728/TimeMoE-50M', trust_remote_code=True)\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc.sub(means)\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc = x_enc.div(stdev)\n\n        B, L, C = x_enc.shape\n        x_enc = torch.reshape(x_enc, (B*C, L))\n        output = self.model.generate(x_enc, max_new_tokens=self.pred_len)\n        dec_out = torch.reshape(output, (B, output.shape[-1], C))\n        dec_out = dec_out[:,-self.pred_len:, :]\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/TimeXer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import DataEmbedding_inverted, PositionalEmbedding\nimport numpy as np\n\n\nclass FlattenHead(nn.Module):\n    def __init__(self, n_vars, nf, target_window, head_dropout=0):\n        super().__init__()\n        self.n_vars = n_vars\n        self.flatten = nn.Flatten(start_dim=-2)\n        self.linear = nn.Linear(nf, target_window)\n        self.dropout = nn.Dropout(head_dropout)\n\n    def forward(self, x):  # x: [bs x nvars x d_model x patch_num]\n        x = self.flatten(x)\n        x = self.linear(x)\n        x = self.dropout(x)\n        return x\n\n\nclass EnEmbedding(nn.Module):\n    def __init__(self, n_vars, d_model, patch_len, dropout):\n        super(EnEmbedding, self).__init__()\n        # Patching\n        self.patch_len = patch_len\n\n        self.value_embedding = nn.Linear(patch_len, d_model, bias=False)\n        self.glb_token = nn.Parameter(torch.randn(1, n_vars, 1, d_model))\n        self.position_embedding = PositionalEmbedding(d_model)\n\n        self.dropout = nn.Dropout(dropout)\n\n    def forward(self, x):\n        # do patching\n        n_vars = x.shape[1]\n        glb = self.glb_token.repeat((x.shape[0], 1, 1, 1))\n\n        x = x.unfold(dimension=-1, size=self.patch_len, step=self.patch_len)\n        x = torch.reshape(x, (x.shape[0] * x.shape[1], x.shape[2], x.shape[3]))\n        # Input encoding\n        x = self.value_embedding(x) + self.position_embedding(x)\n        x = torch.reshape(x, (-1, n_vars, x.shape[-2], x.shape[-1]))\n        x = torch.cat([x, glb], dim=2)\n        x = torch.reshape(x, (x.shape[0] * x.shape[1], x.shape[2], x.shape[3]))\n        return self.dropout(x), n_vars\n\n\nclass Encoder(nn.Module):\n    def __init__(self, layers, norm_layer=None, projection=None):\n        super(Encoder, self).__init__()\n        self.layers = nn.ModuleList(layers)\n        self.norm = norm_layer\n        self.projection = projection\n\n    def forward(self, x, cross, x_mask=None, cross_mask=None, tau=None, delta=None):\n        for layer in self.layers:\n            x = layer(x, cross, x_mask=x_mask, cross_mask=cross_mask, tau=tau, delta=delta)\n\n        if self.norm is not None:\n            x = self.norm(x)\n\n        if self.projection is not None:\n            x = self.projection(x)\n        return x\n\n\nclass EncoderLayer(nn.Module):\n    def __init__(self, self_attention, cross_attention, d_model, d_ff=None,\n                 dropout=0.1, activation=\"relu\"):\n        super(EncoderLayer, self).__init__()\n        d_ff = d_ff or 4 * d_model\n        self.self_attention = self_attention\n        self.cross_attention = cross_attention\n        self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)\n        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)\n        self.norm1 = nn.LayerNorm(d_model)\n        self.norm2 = nn.LayerNorm(d_model)\n        self.norm3 = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.activation = F.relu if activation == \"relu\" else F.gelu\n\n    def forward(self, x, cross, x_mask=None, cross_mask=None, tau=None, delta=None):\n        B, L, D = cross.shape\n        x = x + self.dropout(self.self_attention(\n            x, x, x,\n            attn_mask=x_mask,\n            tau=tau, delta=None\n        )[0])\n        x = self.norm1(x)\n\n        x_glb_ori = x[:, -1, :].unsqueeze(1)\n        x_glb = torch.reshape(x_glb_ori, (B, -1, D))\n        x_glb_attn = self.dropout(self.cross_attention(\n            x_glb, cross, cross,\n            attn_mask=cross_mask,\n            tau=tau, delta=delta\n        )[0])\n        x_glb_attn = torch.reshape(x_glb_attn,\n                                   (x_glb_attn.shape[0] * x_glb_attn.shape[1], x_glb_attn.shape[2])).unsqueeze(1)\n        x_glb = x_glb_ori + x_glb_attn\n        x_glb = self.norm2(x_glb)\n\n        y = x = torch.cat([x[:, :-1, :], x_glb], dim=1)\n\n        y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1))))\n        y = self.dropout(self.conv2(y).transpose(-1, 1))\n\n        return self.norm3(x + y)\n\n\nclass Model(nn.Module):\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.features = configs.features\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.use_norm = configs.use_norm\n        self.patch_len = configs.patch_len\n        self.patch_num = int(configs.seq_len // configs.patch_len)\n        self.n_vars = 1 if configs.features == 'MS' else configs.enc_in\n        # Embedding\n        self.en_embedding = EnEmbedding(self.n_vars, configs.d_model, self.patch_len, configs.dropout)\n\n        self.ex_embedding = DataEmbedding_inverted(configs.seq_len, configs.d_model, configs.embed, configs.freq,\n                                                   configs.dropout)\n\n        # Encoder-only architecture\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False),\n                        configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation,\n                )\n                for l in range(configs.e_layers)\n            ],\n            norm_layer=torch.nn.LayerNorm(configs.d_model)\n        )\n        self.head_nf = configs.d_model * (self.patch_num + 1)\n        self.head = FlattenHead(configs.enc_in, self.head_nf, configs.pred_len,\n                                head_dropout=configs.dropout)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        if self.use_norm:\n            # Normalization from Non-stationary Transformer\n            means = x_enc.mean(1, keepdim=True).detach()\n            x_enc = x_enc - means\n            stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n            x_enc /= stdev\n\n        _, _, N = x_enc.shape\n\n        en_embed, n_vars = self.en_embedding(x_enc[:, :, -1].unsqueeze(-1).permute(0, 2, 1))\n        ex_embed = self.ex_embedding(x_enc[:, :, :-1], x_mark_enc)\n\n        enc_out = self.encoder(en_embed, ex_embed)\n        enc_out = torch.reshape(\n            enc_out, (-1, n_vars, enc_out.shape[-2], enc_out.shape[-1]))\n        # z: [bs x nvars x d_model x patch_num]\n        enc_out = enc_out.permute(0, 1, 3, 2)\n\n        dec_out = self.head(enc_out)  # z: [bs x nvars x target_window]\n        dec_out = dec_out.permute(0, 2, 1)\n\n        if self.use_norm:\n            # De-Normalization from Non-stationary Transformer\n            dec_out = dec_out * (stdev[:, 0, -1:].unsqueeze(1).repeat(1, self.pred_len, 1))\n            dec_out = dec_out + (means[:, 0, -1:].unsqueeze(1).repeat(1, self.pred_len, 1))\n\n        return dec_out\n\n\n    def forecast_multi(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        if self.use_norm:\n            # Normalization from Non-stationary Transformer\n            means = x_enc.mean(1, keepdim=True).detach()\n            x_enc = x_enc - means\n            stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n            x_enc /= stdev\n\n        _, _, N = x_enc.shape\n\n        en_embed, n_vars = self.en_embedding(x_enc.permute(0, 2, 1))\n        ex_embed = self.ex_embedding(x_enc, x_mark_enc)\n\n        enc_out = self.encoder(en_embed, ex_embed)\n        enc_out = torch.reshape(\n            enc_out, (-1, n_vars, enc_out.shape[-2], enc_out.shape[-1]))\n        # z: [bs x nvars x d_model x patch_num]\n        enc_out = enc_out.permute(0, 1, 3, 2)\n\n        dec_out = self.head(enc_out)  # z: [bs x nvars x target_window]\n        dec_out = dec_out.permute(0, 2, 1)\n\n        if self.use_norm:\n            # De-Normalization from Non-stationary Transformer\n            dec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n            dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            if self.features == 'M':\n                dec_out = self.forecast_multi(x_enc, x_mark_enc, x_dec, x_mark_dec)\n                return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n            else:\n                dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n                return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        else:\n            return None"
  },
  {
    "path": "models/TimesFM.py",
    "content": "import torch\nfrom torch import nn\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import PatchEmbedding\nimport timesfm\n\n\nclass Model(nn.Module):\n    def __init__(self, configs):\n        \"\"\"\n        patch_len: int, patch len for patch_embedding\n        stride: int, stride for patch_embedding\n        \"\"\"\n        super().__init__()\n\n        self.model = timesfm.TimesFM_2p5_200M_torch.from_pretrained(\"google/timesfm-2.5-200m-pytorch\")\n        self.model.compile(\n            timesfm.ForecastConfig(\n                max_context=configs.seq_len,\n                max_horizon=configs.pred_len,\n                normalize_inputs=True,\n                use_continuous_quantile_head=True,\n                force_flip_invariance=True,\n                infer_is_positive=True,\n                fix_quantile_crossing=True,\n            )\n        )\n\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc.sub(means)\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc = x_enc.div(stdev)\n\n        B, L, C = x_enc.shape\n        device = x_enc.device\n        x_enc = torch.reshape(x_enc, (B*C, L))\n\n        output, _ = self.model.forecast(\n            horizon=self.pred_len,\n            inputs=x_enc.cpu().numpy()\n        )\n        output = torch.Tensor(output).to(device)\n\n        dec_out = torch.reshape(output, (B, output.shape[-1], C)).to(x_enc.device)\n        dec_out = dec_out * \\\n                  (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + \\\n                  (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'zero_shot_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out\n        return None\n"
  },
  {
    "path": "models/TimesNet.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.fft\nfrom layers.Embed import DataEmbedding\nfrom layers.Conv_Blocks import Inception_Block_V1\n\n\ndef FFT_for_Period(x, k=2):\n    # [B, T, C]\n    xf = torch.fft.rfft(x, dim=1)\n    # find period by amplitudes\n    frequency_list = abs(xf).mean(0).mean(-1)\n    frequency_list[0] = 0\n    _, top_list = torch.topk(frequency_list, k)\n    top_list = top_list.detach().cpu().numpy()\n    period = x.shape[1] // top_list\n    return period, abs(xf).mean(-1)[:, top_list]\n\n\nclass TimesBlock(nn.Module):\n    def __init__(self, configs):\n        super(TimesBlock, self).__init__()\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        self.k = configs.top_k\n        # parameter-efficient design\n        self.conv = nn.Sequential(\n            Inception_Block_V1(configs.d_model, configs.d_ff,\n                               num_kernels=configs.num_kernels),\n            nn.GELU(),\n            Inception_Block_V1(configs.d_ff, configs.d_model,\n                               num_kernels=configs.num_kernels)\n        )\n\n    def forward(self, x):\n        B, T, N = x.size()\n        period_list, period_weight = FFT_for_Period(x, self.k)\n\n        res = []\n        for i in range(self.k):\n            period = period_list[i]\n            # padding\n            if (self.seq_len + self.pred_len) % period != 0:\n                length = (\n                                 ((self.seq_len + self.pred_len) // period) + 1) * period\n                padding = torch.zeros([x.shape[0], (length - (self.seq_len + self.pred_len)), x.shape[2]]).to(x.device)\n                out = torch.cat([x, padding], dim=1)\n            else:\n                length = (self.seq_len + self.pred_len)\n                out = x\n            # reshape\n            out = out.reshape(B, length // period, period,\n                              N).permute(0, 3, 1, 2).contiguous()\n            # 2D conv: from 1d Variation to 2d Variation\n            out = self.conv(out)\n            # reshape back\n            out = out.permute(0, 2, 3, 1).reshape(B, -1, N)\n            res.append(out[:, :(self.seq_len + self.pred_len), :])\n        res = torch.stack(res, dim=-1)\n        # adaptive aggregation\n        period_weight = F.softmax(period_weight, dim=1)\n        period_weight = period_weight.unsqueeze(\n            1).unsqueeze(1).repeat(1, T, N, 1)\n        res = torch.sum(res * period_weight, -1)\n        # residual connection\n        res = res + x\n        return res\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://openreview.net/pdf?id=ju_Uqw384Oq\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.configs = configs\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.label_len = configs.label_len\n        self.pred_len = configs.pred_len\n        self.model = nn.ModuleList([TimesBlock(configs)\n                                    for _ in range(configs.e_layers)])\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n        self.layer = configs.e_layers\n        self.layer_norm = nn.LayerNorm(configs.d_model)\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.predict_linear = nn.Linear(\n                self.seq_len, self.pred_len + self.seq_len)\n            self.projection = nn.Linear(\n                configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(\n                configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(\n                configs.d_model * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc.sub(means)\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc = x_enc.div(stdev)\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n        enc_out = self.predict_linear(enc_out.permute(0, 2, 1)).permute(\n            0, 2, 1)  # align temporal dimension\n        # TimesNet\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n        # project back\n        dec_out = self.projection(enc_out)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out.mul(\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1)))\n        dec_out = dec_out.add(\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1)))\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # Normalization from Non-stationary Transformer\n        means = torch.sum(x_enc, dim=1) / torch.sum(mask == 1, dim=1)\n        means = means.unsqueeze(1).detach()\n        x_enc = x_enc.sub(means)\n        x_enc = x_enc.masked_fill(mask == 0, 0)\n        stdev = torch.sqrt(torch.sum(x_enc * x_enc, dim=1) /\n                           torch.sum(mask == 1, dim=1) + 1e-5)\n        stdev = stdev.unsqueeze(1).detach()\n        x_enc = x_enc.div(stdev)\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\n        # TimesNet\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n        # project back\n        dec_out = self.projection(enc_out)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out.mul(\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1)))\n        dec_out = dec_out.add(\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1)))\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc.sub(means)\n        stdev = torch.sqrt(\n            torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc = x_enc.div(stdev)\n\n        # embedding\n        enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\n        # TimesNet\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n        # project back\n        dec_out = self.projection(enc_out)\n\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out.mul(\n                  (stdev[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1)))\n        dec_out = dec_out.add(\n                  (means[:, 0, :].unsqueeze(1).repeat(\n                      1, self.pred_len + self.seq_len, 1)))\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # embedding\n        enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\n        # TimesNet\n        for i in range(self.layer):\n            enc_out = self.layer_norm(self.model[i](enc_out))\n\n        # Output\n        # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.act(enc_out)\n        output = self.dropout(output)\n        # zero-out padding embeddings\n        output = output * x_mark_enc.unsqueeze(-1)\n        # (batch_size, seq_length * d_model)\n        output = output.reshape(output.shape[0], -1)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(\n                x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/Transformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Transformer_EncDec import Decoder, DecoderLayer, Encoder, EncoderLayer, ConvLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import DataEmbedding\nimport numpy as np\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Vanilla Transformer\n    with O(L^2) complexity\n    Paper link: https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.pred_len = configs.pred_len\n        # Embedding\n        self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\n                                           configs.dropout)\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False), configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=torch.nn.LayerNorm(configs.d_model)\n        )\n        # Decoder\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq,\n                                               configs.dropout)\n            self.decoder = Decoder(\n                [\n                    DecoderLayer(\n                        AttentionLayer(\n                            FullAttention(True, configs.factor, attention_dropout=configs.dropout,\n                                          output_attention=False),\n                            configs.d_model, configs.n_heads),\n                        AttentionLayer(\n                            FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                          output_attention=False),\n                            configs.d_model, configs.n_heads),\n                        configs.d_model,\n                        configs.d_ff,\n                        dropout=configs.dropout,\n                        activation=configs.activation,\n                    )\n                    for l in range(configs.d_layers)\n                ],\n                norm_layer=torch.nn.LayerNorm(configs.d_model),\n                projection=nn.Linear(configs.d_model, configs.c_out, bias=True)\n            )\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.d_model * configs.seq_len, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.dec_embedding(x_dec, x_mark_dec)\n        dec_out = self.decoder(dec_out, enc_out, x_mask=None, cross_mask=None)\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.projection(enc_out)\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        # Output\n        output = self.act(enc_out)  # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.dropout(output)\n        output = output * x_mark_enc.unsqueeze(-1)  # zero-out padding embeddings\n        output = output.reshape(output.shape[0], -1)  # (batch_size, seq_length * d_model)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "models/WPMixer.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Sun Jan  5 16:10:01 2025\n@author: Murad\nSISLab, USF\nmmurad@usf.edu\nhttps://github.com/Secure-and-Intelligent-Systems-Lab/WPMixer\n\"\"\"\n\nimport torch.nn as nn\nimport torch\nfrom layers.DWT_Decomposition import Decomposition\n\n\nclass TokenMixer(nn.Module):\n    def __init__(self, input_seq=[], batch_size=[], channel=[], pred_seq=[], dropout=[], factor=[], d_model=[]):\n        super(TokenMixer, self).__init__()\n        self.input_seq = input_seq\n        self.batch_size = batch_size\n        self.channel = channel\n        self.pred_seq = pred_seq\n        self.dropout = dropout\n        self.factor = factor\n        self.d_model = d_model\n\n        self.dropoutLayer = nn.Dropout(self.dropout)\n        self.layers = nn.Sequential(nn.Linear(self.input_seq, self.pred_seq * self.factor),\n                                    nn.GELU(),\n                                    nn.Dropout(self.dropout),\n                                    nn.Linear(self.pred_seq * self.factor, self.pred_seq)\n                                    )\n\n    def forward(self, x):\n        x = x.transpose(1, 2)\n        x = self.layers(x)\n        x = x.transpose(1, 2)\n        return x\n\n\nclass Mixer(nn.Module):\n    def __init__(self,\n                 input_seq=[],\n                 out_seq=[],\n                 batch_size=[],\n                 channel=[],\n                 d_model=[],\n                 dropout=[],\n                 tfactor=[],\n                 dfactor=[]):\n        super(Mixer, self).__init__()\n        self.input_seq = input_seq\n        self.pred_seq = out_seq\n        self.batch_size = batch_size\n        self.channel = channel\n        self.d_model = d_model\n        self.dropout = dropout\n        self.tfactor = tfactor  # expansion factor for patch mixer\n        self.dfactor = dfactor  # expansion factor for embedding mixer\n\n        self.tMixer = TokenMixer(input_seq=self.input_seq, batch_size=self.batch_size, channel=self.channel,\n                                 pred_seq=self.pred_seq, dropout=self.dropout, factor=self.tfactor,\n                                 d_model=self.d_model)\n        self.dropoutLayer = nn.Dropout(self.dropout)\n        self.norm1 = nn.BatchNorm2d(self.channel)\n        self.norm2 = nn.BatchNorm2d(self.channel)\n\n        self.embeddingMixer = nn.Sequential(nn.Linear(self.d_model, self.d_model * self.dfactor),\n                                            nn.GELU(),\n                                            nn.Dropout(self.dropout),\n                                            nn.Linear(self.d_model * self.dfactor, self.d_model))\n\n    def forward(self, x):\n        '''\n        Parameters\n        ----------\n        x : input: [Batch, Channel, Patch_number, d_model]\n\n        Returns\n        -------\n        x: output: [Batch, Channel, Patch_number, d_model]\n\n        '''\n        x = self.norm1(x)\n        x = x.permute(0, 3, 1, 2)\n        x = self.dropoutLayer(self.tMixer(x))\n        x = x.permute(0, 2, 3, 1)\n        x = self.norm2(x)\n        x = x + self.dropoutLayer(self.embeddingMixer(x))\n        return x\n\n\nclass ResolutionBranch(nn.Module):\n    def __init__(self,\n                 input_seq=[],\n                 pred_seq=[],\n                 batch_size=[],\n                 channel=[],\n                 d_model=[],\n                 dropout=[],\n                 embedding_dropout=[],\n                 tfactor=[],\n                 dfactor=[],\n                 patch_len=[],\n                 patch_stride=[]):\n        super(ResolutionBranch, self).__init__()\n        self.input_seq = input_seq\n        self.pred_seq = pred_seq\n        self.batch_size = batch_size\n        self.channel = channel\n        self.d_model = d_model\n        self.dropout = dropout\n        self.embedding_dropout = embedding_dropout\n        self.tfactor = tfactor\n        self.dfactor = dfactor\n        self.patch_len = patch_len\n        self.patch_stride = patch_stride\n        self.patch_num = int((self.input_seq - self.patch_len) / self.patch_stride + 2)\n\n        self.patch_norm = nn.BatchNorm2d(self.channel)\n        self.patch_embedding_layer = nn.Linear(self.patch_len, self.d_model)  # shared among all channels\n        self.mixer1 = Mixer(input_seq=self.patch_num,\n                            out_seq=self.patch_num,\n                            batch_size=self.batch_size,\n                            channel=self.channel,\n                            d_model=self.d_model,\n                            dropout=self.dropout,\n                            tfactor=self.tfactor,\n                            dfactor=self.dfactor)\n        self.mixer2 = Mixer(input_seq=self.patch_num,\n                            out_seq=self.patch_num,\n                            batch_size=self.batch_size,\n                            channel=self.channel,\n                            d_model=self.d_model,\n                            dropout=self.dropout,\n                            tfactor=self.tfactor,\n                            dfactor=self.dfactor)\n        self.norm = nn.BatchNorm2d(self.channel)\n        self.dropoutLayer = nn.Dropout(self.embedding_dropout)\n        self.head = nn.Sequential(nn.Flatten(start_dim=-2, end_dim=-1),\n                                  nn.Linear(self.patch_num * self.d_model, self.pred_seq))\n\n    def forward(self, x):\n        '''\n        Parameters\n        ----------\n        x : input coefficient series: [Batch, channel, length_of_coefficient_series]\n\n        Returns\n        -------\n        out : predicted coefficient series: [Batch, channel, length_of_pred_coeff_series]\n        '''\n\n        x_patch = self.do_patching(x)\n        x_patch = self.patch_norm(x_patch)\n        x_emb = self.dropoutLayer(self.patch_embedding_layer(x_patch))\n\n        out = self.mixer1(x_emb)\n        res = out\n        out = res + self.mixer2(out)\n        out = self.norm(out)\n\n        out = self.head(out)\n        return out\n\n    def do_patching(self, x):\n        x_end = x[:, :, -1:]\n        x_padding = x_end.repeat(1, 1, self.patch_stride)\n        x_new = torch.cat((x, x_padding), dim=-1)\n        x_patch = x_new.unfold(dimension=-1, size=self.patch_len, step=self.patch_stride)\n        return x_patch\n\n\nclass WPMixerCore(nn.Module):\n    def __init__(self,\n                 input_length=[],\n                 pred_length=[],\n                 wavelet_name=[],\n                 level=[],\n                 batch_size=[],\n                 channel=[],\n                 d_model=[],\n                 dropout=[],\n                 embedding_dropout=[],\n                 tfactor=[],\n                 dfactor=[],\n                 device=[],\n                 patch_len=[],\n                 patch_stride=[],\n                 no_decomposition=[],\n                 use_amp=[]):\n        super(WPMixerCore, self).__init__()\n        self.input_length = input_length\n        self.pred_length = pred_length\n        self.wavelet_name = wavelet_name\n        self.level = level\n        self.batch_size = batch_size\n        self.channel = channel\n        self.d_model = d_model\n        self.dropout = dropout\n        self.embedding_dropout = embedding_dropout\n        self.device = device\n        self.no_decomposition = no_decomposition\n        self.tfactor = tfactor\n        self.dfactor = dfactor\n        self.use_amp = use_amp\n\n        self.Decomposition_model = Decomposition(input_length=self.input_length,\n                                                 pred_length=self.pred_length,\n                                                 wavelet_name=self.wavelet_name,\n                                                 level=self.level,\n                                                 batch_size=self.batch_size,\n                                                 channel=self.channel,\n                                                 d_model=self.d_model,\n                                                 tfactor=self.tfactor,\n                                                 dfactor=self.dfactor,\n                                                 device=self.device,\n                                                 no_decomposition=self.no_decomposition,\n                                                 use_amp=self.use_amp)\n\n        self.input_w_dim = self.Decomposition_model.input_w_dim  # list of the length of the input coefficient series\n        self.pred_w_dim = self.Decomposition_model.pred_w_dim  # list of the length of the predicted coefficient series\n\n        self.patch_len = patch_len\n        self.patch_stride = patch_stride\n\n        # (m+1) number of resolutionBranch\n        self.resolutionBranch = nn.ModuleList([ResolutionBranch(input_seq=self.input_w_dim[i],\n                                                                pred_seq=self.pred_w_dim[i],\n                                                                batch_size=self.batch_size,\n                                                                channel=self.channel,\n                                                                d_model=self.d_model,\n                                                                dropout=self.dropout,\n                                                                embedding_dropout=self.embedding_dropout,\n                                                                tfactor=self.tfactor,\n                                                                dfactor=self.dfactor,\n                                                                patch_len=self.patch_len,\n                                                                patch_stride=self.patch_stride) for i in\n                                               range(len(self.input_w_dim))])\n\n    def forward(self, xL):\n        '''\n        Parameters\n        ----------\n        xL : Look back window: [Batch, look_back_length, channel]\n\n        Returns\n        -------\n        xT : Prediction time series: [Batch, prediction_length, output_channel]\n        '''\n        x = xL.transpose(1, 2)  # [batch, channel, look_back_length]\n\n        # xA: approximation coefficient series,\n        # xD: detail coefficient series\n        # yA: predicted approximation coefficient series\n        # yD: predicted detail coefficient series\n\n        xA, xD = self.Decomposition_model.transform(x)\n\n        yA = self.resolutionBranch[0](xA)\n        yD = []\n        for i in range(len(xD)):\n            yD_i = self.resolutionBranch[i + 1](xD[i])\n            yD.append(yD_i)\n\n        y = self.Decomposition_model.inv_transform(yA, yD)\n        y = y.transpose(1, 2)\n        xT = y[:, -self.pred_length:, :]  # decomposition output is always even, but pred length can be odd\n\n        return xT\n\n\nclass Model(nn.Module):\n    def __init__(self, args, tfactor=5, dfactor=5, wavelet='db2', level=1, stride=8, no_decomposition=False):\n        super(Model, self).__init__()\n        self.args = args\n        self.task_name = args.task_name\n        self.wpmixerCore = WPMixerCore(input_length=self.args.seq_len,\n                                       pred_length=self.args.pred_len,\n                                       wavelet_name=wavelet,\n                                       level=level,\n                                       batch_size=self.args.batch_size,\n                                       channel=self.args.c_out,\n                                       d_model=self.args.d_model,\n                                       dropout=self.args.dropout,\n                                       embedding_dropout=self.args.dropout,\n                                       tfactor=tfactor,\n                                       dfactor=dfactor,\n                                       device=self.args.device,\n                                       patch_len=self.args.patch_len,\n                                       patch_stride=stride,\n                                       no_decomposition=no_decomposition,\n                                       use_amp=self.args.use_amp)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, batch_y_mark):\n        # Normalization\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        pred = self.wpmixerCore(x_enc)\n        pred = pred[:, :, -self.args.c_out:]\n\n        # De-Normalization\n        dec_out = pred * (stdev[:, 0].unsqueeze(1).repeat(1, self.args.pred_len, 1))\n        dec_out = dec_out + (means[:, 0].unsqueeze(1).repeat(1, self.args.pred_len, 1))\n        return dec_out\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'imputation':\n            raise NotImplementedError(\"Task imputation for WPMixer is temporarily not supported\")\n        if self.task_name == 'anomaly_detection':\n            raise NotImplementedError(\"Task anomaly_detection for WPMixer is temporarily not supported\")\n        if self.task_name == 'classification':\n            raise NotImplementedError(\"Task classification for WPMixer is temporarily not supported\")\n        return None\n"
  },
  {
    "path": "models/__init__.py",
    "content": "pass "
  },
  {
    "path": "models/iTransformer.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom layers.Transformer_EncDec import Encoder, EncoderLayer\nfrom layers.SelfAttention_Family import FullAttention, AttentionLayer\nfrom layers.Embed import DataEmbedding_inverted\nimport numpy as np\n\n\nclass Model(nn.Module):\n    \"\"\"\n    Paper link: https://arxiv.org/abs/2310.06625\n    \"\"\"\n\n    def __init__(self, configs):\n        super(Model, self).__init__()\n        self.task_name = configs.task_name\n        self.seq_len = configs.seq_len\n        self.pred_len = configs.pred_len\n        # Embedding\n        self.enc_embedding = DataEmbedding_inverted(configs.seq_len, configs.d_model, configs.embed, configs.freq,\n                                                    configs.dropout)\n        # Encoder\n        self.encoder = Encoder(\n            [\n                EncoderLayer(\n                    AttentionLayer(\n                        FullAttention(False, configs.factor, attention_dropout=configs.dropout,\n                                      output_attention=False), configs.d_model, configs.n_heads),\n                    configs.d_model,\n                    configs.d_ff,\n                    dropout=configs.dropout,\n                    activation=configs.activation\n                ) for l in range(configs.e_layers)\n            ],\n            norm_layer=torch.nn.LayerNorm(configs.d_model)\n        )\n        # Decoder\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            self.projection = nn.Linear(configs.d_model, configs.pred_len, bias=True)\n        if self.task_name == 'imputation':\n            self.projection = nn.Linear(configs.d_model, configs.seq_len, bias=True)\n        if self.task_name == 'anomaly_detection':\n            self.projection = nn.Linear(configs.d_model, configs.seq_len, bias=True)\n        if self.task_name == 'classification':\n            self.act = F.gelu\n            self.dropout = nn.Dropout(configs.dropout)\n            self.projection = nn.Linear(configs.d_model * configs.enc_in, configs.num_class)\n\n    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        _, _, N = x_enc.shape\n\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.projection(enc_out).permute(0, 2, 1)[:, :, :N]\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))\n        return dec_out\n\n    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        _, L, N = x_enc.shape\n\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, x_mark_enc)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.projection(enc_out).permute(0, 2, 1)[:, :, :N]\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, L, 1))\n        dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, L, 1))\n        return dec_out\n\n    def anomaly_detection(self, x_enc):\n        # Normalization from Non-stationary Transformer\n        means = x_enc.mean(1, keepdim=True).detach()\n        x_enc = x_enc - means\n        stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\n        x_enc /= stdev\n\n        _, L, N = x_enc.shape\n\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        dec_out = self.projection(enc_out).permute(0, 2, 1)[:, :, :N]\n        # De-Normalization from Non-stationary Transformer\n        dec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, L, 1))\n        dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, L, 1))\n        return dec_out\n\n    def classification(self, x_enc, x_mark_enc):\n        # Embedding\n        enc_out = self.enc_embedding(x_enc, None)\n        enc_out, attns = self.encoder(enc_out, attn_mask=None)\n\n        # Output\n        output = self.act(enc_out)  # the output transformer encoder/decoder embeddings don't include non-linearity\n        output = self.dropout(output)\n        output = output.reshape(output.shape[0], -1)  # (batch_size, c_in * d_model)\n        output = self.projection(output)  # (batch_size, num_classes)\n        return output\n\n    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\n        if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\n            dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\n            return dec_out[:, -self.pred_len:, :]  # [B, L, D]\n        if self.task_name == 'imputation':\n            dec_out = self.imputation(x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'anomaly_detection':\n            dec_out = self.anomaly_detection(x_enc)\n            return dec_out  # [B, L, D]\n        if self.task_name == 'classification':\n            dec_out = self.classification(x_enc, x_mark_enc)\n            return dec_out  # [B, N]\n        return None\n"
  },
  {
    "path": "requirements.txt",
    "content": "einops==0.8.1\nlocal-attention==1.11.2\nreformer-pytorch==1.4.4\n\nnumpy==2.1.2\nscipy==1.16.3\nscikit-learn==1.7.2\npandas==2.3.3\nmatplotlib==3.10.8\nsktime==0.40.1\nsympy==1.13.1\nPyWavelets==1.9.0\ndatasets==4.5.0\n\ntqdm==4.66.5\npatool==4.0.3\n\ntransformers==4.57.3\nhuggingface_hub==0.36.0\nchronos-forecasting==2.2.1\ntirex-ts==1.3.0\ntimesfm==1.3.0\n\n# uni2ts deps\n######\ngluonts==0.16.2\nlightning==2.6.0\nhydra-core==1.3.0\njax==0.8.1\njaxtyping==0.3.4\norjson==3.11.5\ntensorboard==2.20.0\npython-dotenv==1.0.0\n######\n"
  },
  {
    "path": "run.py",
    "content": "import argparse\nimport os\nimport torch\nimport torch.backends\nfrom utils.print_args import print_args\nimport random\nimport numpy as np\n\nif __name__ == '__main__':\n    fix_seed = 2021\n    random.seed(fix_seed)\n    torch.manual_seed(fix_seed)\n    np.random.seed(fix_seed)\n\n    parser = argparse.ArgumentParser(description='TimesNet')\n\n    # basic config\n    parser.add_argument('--task_name', type=str, required=True, default='long_term_forecast',\n                        help='task name, options:[long_term_forecast, short_term_forecast, imputation, classification, anomaly_detection]')\n    parser.add_argument('--is_training', type=int, required=True, default=1, help='status')\n    parser.add_argument('--model_id', type=str, required=True, default='test', help='model id')\n    parser.add_argument('--model', type=str, required=True, default='Autoformer',\n                        help='model name, options: [Autoformer, Transformer, TimesNet]')\n\n    # data loader\n    parser.add_argument('--data', type=str, required=True, default='ETTh1', help='dataset type')\n    parser.add_argument('--root_path', type=str, default='./data/ETT/', help='root path of the data file')\n    parser.add_argument('--data_path', type=str, default='ETTh1.csv', help='data file')\n    parser.add_argument('--features', type=str, default='M',\n                        help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')\n    parser.add_argument('--target', type=str, default='OT', help='target feature in S or MS task')\n    parser.add_argument('--freq', type=str, default='h',\n                        help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')\n    parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location of model checkpoints')\n\n    # forecasting task\n    parser.add_argument('--seq_len', type=int, default=96, help='input sequence length')\n    parser.add_argument('--label_len', type=int, default=48, help='start token length')\n    parser.add_argument('--pred_len', type=int, default=96, help='prediction sequence length')\n    parser.add_argument('--seasonal_patterns', type=str, default='Monthly', help='subset for M4')\n    parser.add_argument('--inverse', action='store_true', help='inverse output data', default=False)\n\n    # inputation task\n    parser.add_argument('--mask_rate', type=float, default=0.25, help='mask ratio')\n\n    # anomaly detection task\n    parser.add_argument('--anomaly_ratio', type=float, default=0.25, help='prior anomaly ratio (%%)')\n\n    # model define\n    parser.add_argument('--expand', type=int, default=2, help='expansion factor for Mamba')\n    parser.add_argument('--d_conv', type=int, default=4, help='conv kernel size for Mamba')\n    parser.add_argument('--tv_dt', type=int, default=0, help='whether to use time variant dt for MambaSL')\n    parser.add_argument('--tv_B', type=int, default=0, help='whether to use time variant B for MambaSL')\n    parser.add_argument('--tv_C', type=int, default=0, help='whether to use time variant C for MambaSL')\n    parser.add_argument('--use_D', type=int, default=0, help='whether to use D for MambaSL')\n    parser.add_argument('--top_k', type=int, default=5, help='for TimesBlock')\n    parser.add_argument('--num_kernels', type=int, default=6, help='for Inception')\n    parser.add_argument('--enc_in', type=int, default=7, help='encoder input size')\n    parser.add_argument('--dec_in', type=int, default=7, help='decoder input size')\n    parser.add_argument('--c_out', type=int, default=7, help='output size')\n    parser.add_argument('--d_model', type=int, default=512, help='dimension of model')\n    parser.add_argument('--n_heads', type=int, default=8, help='num of heads')\n    parser.add_argument('--e_layers', type=int, default=2, help='num of encoder layers')\n    parser.add_argument('--d_layers', type=int, default=1, help='num of decoder layers')\n    parser.add_argument('--d_ff', type=int, default=2048, help='dimension of fcn')\n    parser.add_argument('--moving_avg', type=int, default=25, help='window size of moving average')\n    parser.add_argument('--factor', type=int, default=1, help='attn factor')\n    parser.add_argument('--distil', action='store_false',\n                        help='whether to use distilling in encoder, using this argument means not using distilling',\n                        default=True)\n    parser.add_argument('--dropout', type=float, default=0.1, help='dropout')\n    parser.add_argument('--embed', type=str, default='timeF',\n                        help='time features encoding, options:[timeF, fixed, learned]')\n    parser.add_argument('--activation', type=str, default='gelu', help='activation')\n    parser.add_argument('--channel_independence', type=int, default=1,\n                        help='0: channel dependence 1: channel independence for FreTS model')\n    parser.add_argument('--decomp_method', type=str, default='moving_avg',\n                        help='method of series decompsition, only support moving_avg or dft_decomp')\n    parser.add_argument('--use_norm', type=int, default=1, help='whether to use normalize; True 1 False 0')\n    parser.add_argument('--down_sampling_layers', type=int, default=0, help='num of down sampling layers')\n    parser.add_argument('--down_sampling_window', type=int, default=1, help='down sampling window size')\n    parser.add_argument('--down_sampling_method', type=str, default=None,\n                        help='down sampling method, only support avg, max, conv')\n    parser.add_argument('--seg_len', type=int, default=96,\n                        help='the length of segmen-wise iteration of SegRNN')\n\n    # optimization\n    parser.add_argument('--num_workers', type=int, default=10, help='data loader num workers')\n    parser.add_argument('--itr', type=int, default=1, help='experiments times')\n    parser.add_argument('--train_epochs', type=int, default=10, help='train epochs')\n    parser.add_argument('--batch_size', type=int, default=32, help='batch size of train input data')\n    parser.add_argument('--patience', type=int, default=3, help='early stopping patience')\n    parser.add_argument('--learning_rate', type=float, default=0.0001, help='optimizer learning rate')\n    parser.add_argument('--des', type=str, default='test', help='exp description')\n    parser.add_argument('--loss', type=str, default='MSE', help='loss function')\n    parser.add_argument('--lradj', type=str, default='type1', help='adjust learning rate')\n    parser.add_argument('--use_amp', action='store_true', help='use automatic mixed precision training', default=False)\n\n    # GPU\n    parser.add_argument('--use_gpu', action='store_true', default=True, help='use gpu (default: on)')\n    parser.add_argument('--no_use_gpu', action='store_false', dest='use_gpu', help='disable gpu (force cpu)')\n    parser.add_argument('--gpu', type=int, default=0, help='gpu')\n    parser.add_argument('--gpu_type', type=str, default='cuda', help='gpu type')  # cuda or mps\n    parser.add_argument('--use_multi_gpu', action='store_true', help='use multiple gpus', default=False)\n    parser.add_argument('--devices', type=str, default='0,1,2,3', help='device ids of multile gpus')\n\n    # de-stationary projector params\n    parser.add_argument('--p_hidden_dims', type=int, nargs='+', default=[128, 128],\n                        help='hidden layer dimensions of projector (List)')\n    parser.add_argument('--p_hidden_layers', type=int, default=2, help='number of hidden layers in projector')\n\n    # metrics (dtw)\n    parser.add_argument('--use_dtw', action='store_true', default=False,\n                        help='enable dtw metric (time consuming; default: off)')\n\n    # Augmentation\n    parser.add_argument('--augmentation_ratio', type=int, default=0, help=\"How many times to augment\")\n    parser.add_argument('--seed', type=int, default=2, help=\"Randomization seed\")\n    parser.add_argument('--jitter', default=False, action=\"store_true\", help=\"Jitter preset augmentation\")\n    parser.add_argument('--scaling', default=False, action=\"store_true\", help=\"Scaling preset augmentation\")\n    parser.add_argument('--permutation', default=False, action=\"store_true\",\n                        help=\"Equal Length Permutation preset augmentation\")\n    parser.add_argument('--randompermutation', default=False, action=\"store_true\",\n                        help=\"Random Length Permutation preset augmentation\")\n    parser.add_argument('--magwarp', default=False, action=\"store_true\", help=\"Magnitude warp preset augmentation\")\n    parser.add_argument('--timewarp', default=False, action=\"store_true\", help=\"Time warp preset augmentation\")\n    parser.add_argument('--windowslice', default=False, action=\"store_true\", help=\"Window slice preset augmentation\")\n    parser.add_argument('--windowwarp', default=False, action=\"store_true\", help=\"Window warp preset augmentation\")\n    parser.add_argument('--rotation', default=False, action=\"store_true\", help=\"Rotation preset augmentation\")\n    parser.add_argument('--spawner', default=False, action=\"store_true\", help=\"SPAWNER preset augmentation\")\n    parser.add_argument('--dtwwarp', default=False, action=\"store_true\", help=\"DTW warp preset augmentation\")\n    parser.add_argument('--shapedtwwarp', default=False, action=\"store_true\", help=\"Shape DTW warp preset augmentation\")\n    parser.add_argument('--wdba', default=False, action=\"store_true\", help=\"Weighted DBA preset augmentation\")\n    parser.add_argument('--discdtw', default=False, action=\"store_true\",\n                        help=\"Discrimitive DTW warp preset augmentation\")\n    parser.add_argument('--discsdtw', default=False, action=\"store_true\",\n                        help=\"Discrimitive shapeDTW warp preset augmentation\")\n    parser.add_argument('--extra_tag', type=str, default=\"\", help=\"Anything extra\")\n\n    # TimeXer\n    parser.add_argument('--patch_len', type=int, default=16, help='patch length')\n\n    # GCN\n    parser.add_argument('--node_dim', type=int, default=10, help='each node embbed to dim dimentions')\n    parser.add_argument('--gcn_depth', type=int, default=2, help='')\n    parser.add_argument('--gcn_dropout', type=float, default=0.3, help='')\n    parser.add_argument('--propalpha', type=float, default=0.3, help='')\n    parser.add_argument('--conv_channel', type=int, default=32, help='')\n    parser.add_argument('--skip_channel', type=int, default=32, help='')\n\n    parser.add_argument('--individual', action='store_true', default=False,\n                        help='DLinear: a linear layer for each variate(channel) individually')\n\n    # TimeFilter\n    parser.add_argument('--alpha', type=float, default=0.1, help='KNN for Graph Construction')\n    parser.add_argument('--top_p', type=float, default=0.5, help='Dynamic Routing in MoE')\n    parser.add_argument('--pos', type=int, choices=[0, 1], default=1, help='Positional Embedding. Set pos to 0 or 1')\n\n    args = parser.parse_args()\n    if torch.cuda.is_available() and args.use_gpu:\n        args.device = torch.device('cuda:{}'.format(args.gpu))\n        print('Using GPU')\n    else:\n        if hasattr(torch.backends, \"mps\"):\n            args.device = torch.device(\"mps\") if torch.backends.mps.is_available() else torch.device(\"cpu\")\n        else:\n            args.device = torch.device(\"cpu\")\n        print('Using cpu or mps')\n\n    if args.use_gpu and args.use_multi_gpu:\n        args.devices = args.devices.replace(' ', '')\n        device_ids = args.devices.split(',')\n        args.device_ids = [int(id_) for id_ in device_ids]\n        args.gpu = args.device_ids[0]\n\n    print('Args in experiment:')\n    print_args(args)\n\n\n    if args.task_name == 'long_term_forecast':\n        from exp.exp_long_term_forecasting import Exp_Long_Term_Forecast\n        Exp = Exp_Long_Term_Forecast\n    elif args.task_name == 'short_term_forecast':\n        from exp.exp_short_term_forecasting import Exp_Short_Term_Forecast\n        Exp = Exp_Short_Term_Forecast\n    elif args.task_name == 'imputation':\n        from exp.exp_imputation import Exp_Imputation\n        Exp = Exp_Imputation\n    elif args.task_name == 'anomaly_detection':\n        from exp.exp_anomaly_detection import Exp_Anomaly_Detection\n        Exp = Exp_Anomaly_Detection\n    elif args.task_name == 'classification':\n        from exp.exp_classification import Exp_Classification\n        Exp = Exp_Classification\n    elif args.task_name == 'zero_shot_forecast':\n        from exp.exp_zero_shot_forecasting import Exp_Zero_Shot_Forecast\n        Exp = Exp_Zero_Shot_Forecast\n    else:\n        from exp.exp_long_term_forecasting import Exp_Long_Term_Forecast\n        Exp = Exp_Long_Term_Forecast\n\n    if args.is_training:\n        for ii in range(args.itr):\n            # setting record of experiments\n            exp = Exp(args)  # set experiments\n            setting = '{}_{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_expand{}_dc{}_fc{}_eb{}_dt{}_{}_{}'.format(\n                args.task_name,\n                args.model_id,\n                args.model,\n                args.data,\n                args.features,\n                args.seq_len,\n                args.label_len,\n                args.pred_len,\n                args.d_model,\n                args.n_heads,\n                args.e_layers,\n                args.d_layers,\n                args.d_ff,\n                args.expand,\n                args.d_conv,\n                args.factor,\n                args.embed,\n                args.distil,\n                args.des, ii)\n            \n            # Override setting for specific model to ensure proper checkpoint naming and logging\n            if args.model == 'MambaSingleLayer' and args.task_name == 'classification':\n                setting = f'{args.task_name}_CLS_{args.model_id}_{args.model}_{args.data}_ft{args.features}' \\\n                        + f'_sl{args.seq_len}_ll{args.label_len}_pl{args.pred_len}_dm{args.d_model}_ds{args.d_ff}' \\\n                        + f'_expand{args.expand}_dc{args.d_conv}_nk{args.num_kernels}' \\\n                        + f'_tvdt{int(args.tv_dt)}_tvB{int(args.tv_B)}_tvC{int(args.tv_C)}_useD{int(args.use_D)}_{args.des}_{ii}'\n\n            print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))\n            exp.train(setting)\n\n            print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))\n            exp.test(setting)\n            if args.use_gpu:\n                if args.gpu_type == 'mps':\n                    torch.backends.mps.empty_cache()\n                elif args.gpu_type == 'cuda':\n                    torch.cuda.empty_cache()\n    else:\n        exp = Exp(args)  # set experiments\n        ii = 0\n        setting = '{}_{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_expand{}_dc{}_fc{}_eb{}_dt{}_{}_{}'.format(\n            args.task_name,\n            args.model_id,\n            args.model,\n            args.data,\n            args.features,\n            args.seq_len,\n            args.label_len,\n            args.pred_len,\n            args.d_model,\n            args.n_heads,\n            args.e_layers,\n            args.d_layers,\n            args.d_ff,\n            args.expand,\n            args.d_conv,\n            args.factor,\n            args.embed,\n            args.distil,\n            args.des, ii)\n        \n        # Override setting for specific model to ensure proper checkpoint naming and logging\n        if args.model == 'MambaSingleLayer' and args.task_name == 'classification':\n            setting = f'{args.task_name}_CLS_{args.model_id}_{args.model}_{args.data}_ft{args.features}' \\\n                    + f'_sl{args.seq_len}_ll{args.label_len}_pl{args.pred_len}_dm{args.d_model}_ds{args.d_ff}' \\\n                    + f'_expand{args.expand}_dc{args.d_conv}_nk{args.num_kernels}' \\\n                    + f'_tvdt{args.tv_dt}_tvB{args.tv_B}_tvC{args.tv_C}_useD{int(args.use_D)}_{args.des}_{ii}'\n\n        print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))\n        exp.test(setting, test=1)\n        if args.use_gpu:\n            if args.gpu_type == 'mps':\n                torch.backends.mps.empty_cache()\n            elif args.gpu_type == 'cuda':\n                torch.cuda.empty_cache()\n"
  },
  {
    "path": "scripts/anomaly_detection/MSL/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model Autoformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model Crossformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/DLinear.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model DLinear \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 100 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/ETSformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model ETSformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 100 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/FEDformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model FEDformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model FiLM \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 100 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 32 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/Informer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model Informer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/KANAD.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model KANAD \\\n  --data MSL \\\n  --features M \\\n  --seq_len 64 \\\n  --d_model 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --learning_rate 0.01 \\\n  --batch_size 128 \\\n  --num_workers 4 \\\n  --patience 5 \\\n  --train_epochs 100"
  },
  {
    "path": "scripts/anomaly_detection/MSL/LightTS.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model LightTS \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model MICN \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model Pyraformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/Reformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model Reformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model TimesNet \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 8 \\\n  --d_ff 16 \\\n  --e_layers 1 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 1"
  },
  {
    "path": "scripts/anomaly_detection/MSL/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model Transformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/MSL/iTransformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/MSL \\\n  --model_id MSL \\\n  --model iTransformer \\\n  --data MSL \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 55 \\\n  --c_out 55 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/PSM/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/PSM \\\n  --model_id PSM \\\n  --model Autoformer \\\n  --data PSM \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/PSM/DLinear.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/PSM \\\n  --model_id PSM \\\n  --model DLinear \\\n  --data PSM \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 100 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/PSM/KANAD.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/PSM \\\n  --model_id PSM \\\n  --model KANAD \\\n  --data PSM \\\n  --features M \\\n  --seq_len 64 \\\n  --d_model 6 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --learning_rate 0.01 \\\n  --batch_size 128 \\\n  --num_workers 4 \\\n  --patience 5 \\\n  --train_epochs 100"
  },
  {
    "path": "scripts/anomaly_detection/PSM/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/PSM \\\n  --model_id PSM \\\n  --model TimesNet \\\n  --data PSM \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --e_layers 2 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/PSM/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/PSM \\\n  --model_id PSM \\\n  --model Transformer \\\n  --data PSM \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/SMAP/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMAP \\\n  --model_id SMAP \\\n  --model Autoformer \\\n  --data SMAP \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/SMAP/KANAD.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMAP \\\n  --model_id SMAP \\\n  --model KANAD \\\n  --data SMAP \\\n  --features M \\\n  --seq_len 64 \\\n  --d_model 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --learning_rate 0.01 \\\n  --batch_size 128 \\\n  --num_workers 4 \\\n  --patience 5 \\\n  --train_epochs 100"
  },
  {
    "path": "scripts/anomaly_detection/SMAP/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMAP \\\n  --model_id SMAP \\\n  --model TimesNet \\\n  --data SMAP \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/SMAP/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMAP \\\n  --model_id SMAP \\\n  --model Transformer \\\n  --data SMAP \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 25 \\\n  --c_out 25 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/SMD/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMD \\\n  --model_id SMD \\\n  --model Autoformer \\\n  --data SMD \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 38 \\\n  --c_out 38 \\\n  --anomaly_ratio 0.5 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/SMD/KANAD.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMD \\\n  --model_id SMD \\\n  --model KANAD \\\n  --data SMD \\\n  --features M \\\n  --seq_len 96 \\\n  --d_model 4 \\\n  --enc_in 38 \\\n  --c_out 38 \\\n  --anomaly_ratio 0.5 \\\n  --learning_rate 0.01 \\\n  --batch_size 128 \\\n  --num_workers 4 \\\n  --patience 5 \\\n  --train_epochs 100"
  },
  {
    "path": "scripts/anomaly_detection/SMD/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMD \\\n  --model_id SMD \\\n  --model TimesNet \\\n  --data SMD \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --e_layers 2 \\\n  --enc_in 38 \\\n  --c_out 38 \\\n  --top_k 5 \\\n  --anomaly_ratio 0.5 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/SMD/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SMD \\\n  --model_id SMD \\\n  --model Transformer \\\n  --data SMD \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 38 \\\n  --c_out 38 \\\n  --anomaly_ratio 0.5 \\\n  --batch_size 128 \\\n  --train_epochs 10"
  },
  {
    "path": "scripts/anomaly_detection/SWAT/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model Autoformer \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/SWAT/KANAD.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model KANAD \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 80 \\\n  --d_model 1 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --anomaly_ratio 1 \\\n  --learning_rate 0.01 \\\n  --batch_size 128 \\\n  --num_workers 4 \\\n  --patience 5 \\\n  --train_epochs 100"
  },
  {
    "path": "scripts/anomaly_detection/SWAT/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 8 \\\n  --d_ff 8 \\\n  --e_layers 3 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 16 \\\n  --d_ff 16 \\\n  --e_layers 3 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --e_layers 3 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --e_layers 3 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 8 \\\n  --d_ff 8 \\\n  --e_layers 2 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 16 \\\n  --d_ff 16 \\\n  --e_layers 2 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --e_layers 2 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model TimesNet \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --e_layers 2 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/anomaly_detection/SWAT/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\npython -u run.py \\\n  --task_name anomaly_detection \\\n  --is_training 1 \\\n  --root_path ./dataset/SWaT \\\n  --model_id SWAT \\\n  --model Transformer \\\n  --data SWAT \\\n  --features M \\\n  --seq_len 100 \\\n  --pred_len 0 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --e_layers 3 \\\n  --enc_in 51 \\\n  --c_out 51 \\\n  --top_k 3 \\\n  --anomaly_ratio 1 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/classification/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/DLinear.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=DLinear\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/ETSformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=ETSformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --d_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/FEDformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=FEDformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --seq_len 1751 \\\n  --pred_len 1751 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/Informer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Informer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/LightTS.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=LightTS\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --c_out 3 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/MambaSL.out",
    "content": "Using GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           ArticularyWordRecognitionModel:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/ArticularyWordRecognition\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            128                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               8                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n275\n300\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_ArticularyWordRecognition_MambaSingleLayer_UEA_ftM_sl144_ll0_pl0_dm128_ds8_expand1_dc4_nk3_tvdt0_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n300\nloading model\ntest shape: torch.Size([300, 25]) torch.Size([300, 1])\naccuracy:0.9933333333333333\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           AtrialFibrillation  Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/AtrialFibrillation\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        13                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               16                  \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n15\n15\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_AtrialFibrillation_MambaSingleLayer_UEA_ftM_sl640_ll0_pl0_dm32_ds16_expand1_dc4_nk13_tvdt1_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n15\nloading model\ntest shape: torch.Size([15, 3]) torch.Size([15, 1])\naccuracy:0.5333333333333333\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           BasicMotions        Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/BasicMotions\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n40\n40\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_BasicMotions_MambaSingleLayer_UEA_ftM_sl100_ll0_pl0_dm32_ds1_expand1_dc4_nk3_tvdt0_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n40\nloading model\ntest shape: torch.Size([40, 4]) torch.Size([40, 1])\naccuracy:1.0\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           CharacterTrajectoriesModel:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/CharacterTrajectories\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        4                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            128                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n1422\n1436\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_CharacterTrajectories_MambaSingleLayer_UEA_ftM_sl182_ll0_pl0_dm128_ds1_expand1_dc4_nk4_tvdt1_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n1436\nloading model\ntest shape: torch.Size([1436, 20]) torch.Size([1436, 1])\naccuracy:0.9972144846796658\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           Cricket             Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/Cricket\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        24                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n108\n72\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_Cricket_MambaSingleLayer_UEA_ftM_sl1197_ll0_pl0_dm32_ds4_expand1_dc4_nk24_tvdt0_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n72\nloading model\ntest shape: torch.Size([72, 12]) torch.Size([72, 1])\naccuracy:1.0\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           DuckDuckGeese       Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/DuckDuckGeese\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        6                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               2                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n50\n50\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_DuckDuckGeese_MambaSingleLayer_UEA_ftM_sl270_ll0_pl0_dm1024_ds2_expand1_dc4_nk6_tvdt0_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n50\nloading model\ntest shape: torch.Size([50, 5]) torch.Size([50, 1])\naccuracy:0.7\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           EigenWorms          Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/EigenWorms\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        360                 \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         4                   \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n128\n131\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_EigenWorms_MambaSingleLayer_UEA_ftM_sl17984_ll0_pl0_dm32_ds1_expand1_dc4_nk360_tvdt1_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n131\nloading model\ntest shape: torch.Size([131, 5]) torch.Size([131, 1])\naccuracy:0.8396946564885496\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           Epilepsy            Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/Epilepsy\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        5                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n137\n138\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_Epilepsy_MambaSingleLayer_UEA_ftM_sl206_ll0_pl0_dm32_ds1_expand1_dc4_nk5_tvdt1_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n138\nloading model\ntest shape: torch.Size([138, 4]) torch.Size([138, 1])\naccuracy:0.9782608695652174\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           ERing               Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/ERing\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            128                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               8                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n30\n270\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_ERing_MambaSingleLayer_UEA_ftM_sl65_ll0_pl0_dm128_ds8_expand1_dc4_nk3_tvdt1_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n270\nloading model\ntest shape: torch.Size([270, 6]) torch.Size([270, 1])\naccuracy:0.937037037037037\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           EthanolConcentrationModel:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/EthanolConcentration\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        36                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            512                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n261\n263\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_EthanolConcentration_MambaSingleLayer_UEA_ftM_sl1751_ll0_pl0_dm512_ds4_expand1_dc4_nk36_tvdt0_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n263\nloading model\ntest shape: torch.Size([263, 4]) torch.Size([263, 1])\naccuracy:0.42585551330798477\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           FaceDetection       Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/FaceDetection\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            256                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               16                  \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n5890\n3524\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_FaceDetection_MambaSingleLayer_UEA_ftM_sl62_ll0_pl0_dm256_ds16_expand1_dc4_nk3_tvdt1_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n3524\nloading model\ntest shape: torch.Size([3524, 2]) torch.Size([3524, 1])\naccuracy:0.6929625425652668\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           FingerMovements     Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/FingerMovements\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n316\n100\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_FingerMovements_MambaSingleLayer_UEA_ftM_sl50_ll0_pl0_dm32_ds1_expand1_dc4_nk3_tvdt0_tvB1_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n100\nloading model\ntest shape: torch.Size([100, 2]) torch.Size([100, 1])\naccuracy:0.71\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           HandMovementDirectionModel:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/HandMovementDirection\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        8                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            256                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               16                  \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n160\n74\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_HandMovementDirection_MambaSingleLayer_UEA_ftM_sl400_ll0_pl0_dm256_ds16_expand1_dc4_nk8_tvdt1_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n74\nloading model\ntest shape: torch.Size([74, 4]) torch.Size([74, 1])\naccuracy:0.7027027027027027\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           Handwriting         Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/Handwriting\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        4                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n150\n850\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_Handwriting_MambaSingleLayer_UEA_ftM_sl152_ll0_pl0_dm1024_ds4_expand1_dc4_nk4_tvdt1_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n850\nloading model\ntest shape: torch.Size([850, 26]) torch.Size([850, 1])\naccuracy:0.6082352941176471\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           Heartbeat           Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/Heartbeat\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        9                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            64                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               16                  \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n204\n205\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_Heartbeat_MambaSingleLayer_UEA_ftM_sl405_ll0_pl0_dm64_ds16_expand1_dc4_nk9_tvdt0_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n205\nloading model\ntest shape: torch.Size([205, 2]) torch.Size([205, 1])\naccuracy:0.8048780487804879\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           InsectWingbeat      Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/InsectWingbeat\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               8                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n25000\n25000\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_InsectWingbeat_MambaSingleLayer_UEA_ftM_sl22_ll0_pl0_dm1024_ds8_expand1_dc4_nk3_tvdt0_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n25000\nloading model\ntest shape: torch.Size([25000, 10]) torch.Size([25000, 1])\naccuracy:0.66304\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           JapaneseVowels      Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/JapaneseVowels\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            128                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               8                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n270\n370\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_JapaneseVowels_MambaSingleLayer_UEA_ftM_sl29_ll0_pl0_dm128_ds8_expand1_dc4_nk3_tvdt1_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n370\nloading model\ntest shape: torch.Size([370, 9]) torch.Size([370, 1])\naccuracy:0.9864864864864865\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           Libras              Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/Libras\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n180\n180\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_Libras_MambaSingleLayer_UEA_ftM_sl45_ll0_pl0_dm1024_ds4_expand1_dc4_nk3_tvdt1_tvB1_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n180\nloading model\ntest shape: torch.Size([180, 15]) torch.Size([180, 1])\naccuracy:0.9166666666666666\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           LSST                Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/LSST\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n2459\n2466\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_LSST_MambaSingleLayer_UEA_ftM_sl36_ll0_pl0_dm1024_ds4_expand1_dc4_nk3_tvdt1_tvB1_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n2466\nloading model\ntest shape: torch.Size([2466, 14]) torch.Size([2466, 1])\naccuracy:0.4557988645579886\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           MotorImagery        Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/MotorImagery\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        60                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               8                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n278\n100\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_MotorImagery_MambaSingleLayer_UEA_ftM_sl3000_ll0_pl0_dm32_ds8_expand1_dc4_nk60_tvdt0_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n100\nloading model\ntest shape: torch.Size([100, 2]) torch.Size([100, 1])\naccuracy:0.69\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           NATOPS              Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/NATOPS\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            512                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               2                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n180\n180\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_NATOPS_MambaSingleLayer_UEA_ftM_sl51_ll0_pl0_dm512_ds2_expand1_dc4_nk3_tvdt0_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n180\nloading model\ntest shape: torch.Size([180, 6]) torch.Size([180, 1])\naccuracy:0.9888888888888889\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           PEMS-SF             Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/PEMS-SF\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            512                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n267\n173\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_PEMS-SF_MambaSingleLayer_UEA_ftM_sl144_ll0_pl0_dm512_ds1_expand1_dc4_nk3_tvdt1_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n173\nloading model\ntest shape: torch.Size([173, 7]) torch.Size([173, 1])\naccuracy:0.8554913294797688\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           PenDigits           Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/PenDigits\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            64                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n7494\n3498\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_PenDigits_MambaSingleLayer_UEA_ftM_sl8_ll0_pl0_dm64_ds1_expand1_dc4_nk3_tvdt0_tvB1_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n3498\nloading model\ntest shape: torch.Size([3498, 10]) torch.Size([3498, 1])\naccuracy:0.9925671812464265\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           PhonemeSpectra      Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/PhonemeSpectra\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        5                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            256                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n3315\n3353\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_PhonemeSpectra_MambaSingleLayer_UEA_ftM_sl217_ll0_pl0_dm256_ds4_expand1_dc4_nk5_tvdt1_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n3353\nloading model\ntest shape: torch.Size([3353, 39]) torch.Size([3353, 1])\naccuracy:0.3033104682373993\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           RacketSports        Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/RacketSports\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               4                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n151\n152\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_RacketSports_MambaSingleLayer_UEA_ftM_sl30_ll0_pl0_dm1024_ds4_expand1_dc4_nk3_tvdt1_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n152\nloading model\ntest shape: torch.Size([152, 4]) torch.Size([152, 1])\naccuracy:0.9276315789473685\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           SelfRegulationSCP1  Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/SelfRegulationSCP1\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        18                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            256                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               16                  \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n268\n293\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_SelfRegulationSCP1_MambaSingleLayer_UEA_ftM_sl896_ll0_pl0_dm256_ds16_expand1_dc4_nk18_tvdt1_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n293\nloading model\ntest shape: torch.Size([293, 2]) torch.Size([293, 1])\naccuracy:0.9249146757679181\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           SelfRegulationSCP2  Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/SelfRegulationSCP2\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        24                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            256                 \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               16                  \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n200\n180\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_SelfRegulationSCP2_MambaSingleLayer_UEA_ftM_sl1152_ll0_pl0_dm256_ds16_expand1_dc4_nk24_tvdt1_tvB1_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n180\nloading model\ntest shape: torch.Size([180, 2]) torch.Size([180, 1])\naccuracy:0.65\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           SpokenArabicDigits  Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/SpokenArabicDigits\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        3                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               8                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n6599\n2199\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_SpokenArabicDigits_MambaSingleLayer_UEA_ftM_sl93_ll0_pl0_dm1024_ds8_expand1_dc4_nk3_tvdt0_tvB1_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n2199\nloading model\ntest shape: torch.Size([2199, 10]) torch.Size([2199, 1])\naccuracy:0.9995452478399273\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           StandWalkJump       Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/StandWalkJump\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        50                  \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            32                  \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               1                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n12\n15\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_StandWalkJump_MambaSingleLayer_UEA_ftM_sl2500_ll0_pl0_dm32_ds1_expand1_dc4_nk50_tvdt1_tvB0_tvC0_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n15\nloading model\ntest shape: torch.Size([15, 3]) torch.Size([15, 1])\naccuracy:0.7333333333333333\nUsing GPU\nArgs in experiment:\n\u001b[1mBasic Config\u001b[0m\n  Task Name:          classification      Is Training:        0                   \n  Model ID:           UWaveGestureLibrary Model:              MambaSingleLayer    \n\n\u001b[1mData Loader\u001b[0m\n  Data:               UEA                 Root Path:          ./dataset/UWaveGestureLibrary\n  Data Path:          ETTh1.csv           Features:           M                   \n  Target:             OT                  Freq:               h                   \n  Checkpoints:        ./checkpoints_best/MambaSL\n\n\u001b[1mModel Parameters\u001b[0m\n  Top k:              5                   Num Kernels:        7                   \n  Enc In:             7                   Dec In:             7                   \n  C Out:              7                   d model:            1024                \n  n heads:            8                   e layers:           2                   \n  d layers:           1                   d FF:               2                   \n  Moving Avg:         25                  Factor:             1                   \n  Distil:             1                   Dropout:            0.1                 \n  Embed:              timeF               Activation:         gelu                \n\n\u001b[1mRun Parameters\u001b[0m\n  Num Workers:        10                  Itr:                1                   \n  Train Epochs:       100                 Batch Size:         16                  \n  Patience:           10                  Learning Rate:      0.001               \n  Des:                gating4proposed     Loss:               MSE                 \n  Lradj:              type1               Use Amp:            0                   \n\n\u001b[1mGPU\u001b[0m\n  Use GPU:            1                   GPU:                0                   \n  Use Multi GPU:      0                   Devices:            0,1,2,3             \n\n\u001b[1mDe-stationary Projector Params\u001b[0m\n  P Hidden Dims:      128, 128            P Hidden Layers:    2                   \n\nUse GPU: cuda:0\n120\n320\n🚀 Lazy Loading: MambaSingleLayer ...\n>>>>>>>testing : classification_CLS_UWaveGestureLibrary_MambaSingleLayer_UEA_ftM_sl315_ll0_pl0_dm1024_ds2_expand1_dc4_nk7_tvdt0_tvB0_tvC1_useD0_gating4proposed_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n320\nloading model\ntest shape: torch.Size([320, 8]) torch.Size([320, 1])\naccuracy:0.934375\n"
  },
  {
    "path": "scripts/classification/MambaSL.sh",
    "content": "# This script is for reproducing the MambaSL classification results on the 30 UEA datasets.\n\n# Download checkpoints \n#   from https://drive.google.com/drive/folders/1dJx_rpB7UnkMuxrCEoHJcXXzhaACS5Sx?usp=share_link (checkpoint_best/MambaSL.zip)\n#   and change the `checkpoint_dir` variable to the path of the downloaded checkpoints.\n\n# If you want to reproduce the other baseline results reported in MambaSL paper (https://openreview.net/pdf?id=YDl4vqQqGP),\n#   please refer to the official MambaSL repo: https://github.com/yoom618/MambaSL\n\n\n# Global Setting\nmodel_name=\"MambaSingleLayer\"\ngpu_id=0\nresource_dir=\".\"\ndata_dir=\"${resource_dir}/dataset\"\ncheckpoint_dir=\"${resource_dir}/checkpoints_best/MambaSL\"\n\nrun_model() {\n  local dn=$1; local dm=$2; local df=$3; local dt=$4; local tb=$5; local tc=$6; local nk=$7; local bs=${8:-16}\n\n  python run.py \\\n    --use_gpu --gpu_type cuda --gpu ${gpu_id} \\\n    --task_name classification --data UEA \\\n    --root_path \"${data_dir}/${dn}\" \\\n    --checkpoints \"${checkpoint_dir}\" \\\n    --model \"${model_name}\" \\\n    --model_id \"${dn}\" \\\n    --d_model $dm --d_ff $df --expand 1 --d_conv 4 \\\n    --tv_dt $dt --tv_B $tb --tv_C $tc --use_D 0 \\\n    --num_kernels $nk \\\n    --is_training 0 --pred_len 0 --label_len 0 --batch_size $bs \\\n    --des gating4proposed --itr 1 --dropout 0.1 \\\n    --learning_rate 0.001 --train_epochs 100 --patience 10\n}\n\n# ArticularyWordRecognition\nrun_model \"ArticularyWordRecognition\" 128 8 0 0 1 3 16\n\n# AtrialFibrillation\nrun_model \"AtrialFibrillation\" 32 16 1 0 0 13 16\n\n# BasicMotions\nrun_model \"BasicMotions\" 32 1 0 0 0 3 16\n\n# CharacterTrajectories\nrun_model \"CharacterTrajectories\" 128 1 1 0 0 4 16\n\n# Cricket\nrun_model \"Cricket\" 32 4 0 1 0 24 16\n\n# DuckDuckGeese\nrun_model \"DuckDuckGeese\" 1024 2 0 0 1 6 16\n\n# EigenWorms\nrun_model \"EigenWorms\" 32 1 1 1 0 360 4\n\n# Epilepsy\nrun_model \"Epilepsy\" 32 1 1 1 0 5 16\n\n# ERing\nrun_model \"ERing\" 128 8 1 0 1 3 16\n\n# EthanolConcentration\nrun_model \"EthanolConcentration\" 512 4 0 0 0 36 16\n\n# FaceDetection\nrun_model \"FaceDetection\" 256 16 1 0 1 3 16\n\n# FingerMovements\nrun_model \"FingerMovements\" 32 1 0 1 1 3 16\n\n# HandMovementDirection\nrun_model \"HandMovementDirection\" 256 16 1 0 1 8 16\n\n# Handwriting\nrun_model \"Handwriting\" 1024 4 1 0 1 4 16\n\n# Heartbeat\nrun_model \"Heartbeat\" 64 16 0 0 0 9 16\n\n# InsectWingbeat\nrun_model \"InsectWingbeat\" 1024 8 0 0 0 3 16\n\n# JapaneseVowels\nrun_model \"JapaneseVowels\" 128 8 1 1 0 3 16\n\n# Libras\nrun_model \"Libras\" 1024 4 1 1 1 3 16\n\n# LSST\nrun_model \"LSST\" 1024 4 1 1 1 3 16\n\n# MotorImagery\nrun_model \"MotorImagery\" 32 8 0 0 0 60 16\n\n# NATOPS\nrun_model \"NATOPS\" 512 2 0 1 0 3 16\n\n# PEMS-SF\nrun_model \"PEMS-SF\" 512 1 1 1 0 3 16\n\n# PenDigits\nrun_model \"PenDigits\" 64 1 0 1 1 3 16\n\n# PhonemeSpectra\nrun_model \"PhonemeSpectra\" 256 4 1 1 0 5 16\n\n# RacketSports\nrun_model \"RacketSports\" 1024 4 1 0 1 3 16\n\n# SelfRegulationSCP1\nrun_model \"SelfRegulationSCP1\" 256 16 1 0 1 18 16\n\n# SelfRegulationSCP2\nrun_model \"SelfRegulationSCP2\" 256 16 1 1 1 24 16\n\n# SpokenArabicDigits\nrun_model \"SpokenArabicDigits\" 1024 8 0 1 0 3 16\n\n# StandWalkJump\nrun_model \"StandWalkJump\" 32 1 1 0 0 50 16\n\n# UWaveGestureLibrary\nrun_model \"UWaveGestureLibrary\" 1024 2 0 0 1 7 16"
  },
  {
    "path": "scripts/classification/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 4 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/Reformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Reformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 2 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 2 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --num_kernels 4 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython run.py \\\n--task_name classification \\\n--is_training 1 \\\n--root_path ./dataset/Handwriting/ \\\n--model_id Handwriting \\\n--model TimesNet \\\n--data UEA \\\n--e_layers 2 \\\n--batch_size 16 \\\n--d_model 32 \\\n--d_ff 64 \\\n--top_k 3 \\\n--des 'Exp' \\\n--itr 1 \\\n--learning_rate 0.001 \\\n--train_epochs 30 \\\n--patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 1 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 2 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 60 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 6 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 2 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 2 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model TimesNet \\\n  --data UEA \\\n  --e_layers 2 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 64 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 30 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10\n"
  },
  {
    "path": "scripts/classification/iTransformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 2048 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/FaceDetection/ \\\n  --model_id FaceDetection \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Handwriting/ \\\n  --model_id Handwriting \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/Heartbeat/ \\\n  --model_id Heartbeat \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/JapaneseVowels/ \\\n  --model_id JapaneseVowels \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/PEMS-SF/ \\\n  --model_id PEMS-SF \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP1/ \\\n  --model_id SelfRegulationSCP1 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SelfRegulationSCP2/ \\\n  --model_id SelfRegulationSCP2 \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/SpokenArabicDigits/ \\\n  --model_id SpokenArabicDigits \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/UWaveGestureLibrary/ \\\n  --model_id UWaveGestureLibrary \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --enc_in 3\n"
  },
  {
    "path": "scripts/exogenous_forecast/ECL/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des $des \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des $des \\\n  --batch_size 32 \\\n  --itr 1\n\n python -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des $des \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des $des \\\n  --d_model 512 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/exogenous_forecast/EPF/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\ndes='Timexer-MS'\npatch_len=24\n\n\npython -u run.py \\\n  --is_training 1 \\\n  --task_name long_term_forecast \\\n  --root_path ./dataset/EPF/ \\\n  --data_path NP.csv \\\n  --model_id NP_168_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 168 \\\n  --pred_len 24 \\\n  --e_layers 3 \\\n  --enc_in 3 \\\n  --dec_in 3 \\\n  --c_out 1 \\\n  --des $des \\\n  --patch_len $patch_len \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --is_training 1 \\\n  --task_name long_term_forecast \\\n  --root_path ./dataset/EPF/ \\\n  --data_path PJM.csv \\\n  --model_id PJM_168_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 168 \\\n  --pred_len 24 \\\n  --e_layers 3 \\\n  --enc_in 3 \\\n  --dec_in 3 \\\n  --c_out 1 \\\n  --des $des \\\n  --patch_len $patch_len \\\n  --d_model 512 \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --is_training 1 \\\n  --task_name long_term_forecast \\\n  --root_path ./dataset/EPF/ \\\n  --data_path BE.csv \\\n  --model_id BE_168_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 168 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --enc_in 3 \\\n  --dec_in 3 \\\n  --c_out 1 \\\n  --des $des \\\n  --patch_len $patch_len \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --itr 1\n\n\npython -u run.py \\\n  --is_training 1 \\\n  --task_name long_term_forecast \\\n  --root_path ./dataset/EPF/ \\\n  --data_path FR.csv \\\n  --model_id FR_168_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 168 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --enc_in 3 \\\n  --dec_in 3 \\\n  --c_out 1 \\\n  --des $des \\\n  --patch_len $patch_len \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --itr 1\n\npython -u run.py \\\n  --is_training 1 \\\n  --task_name long_term_forecast \\\n  --root_path ./dataset/EPF/ \\\n  --data_path DE.csv \\\n  --model_id DE_168_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 168 \\\n  --pred_len 24 \\\n  --e_layers 1 \\\n  --enc_in 3 \\\n  --dec_in 3 \\\n  --c_out 1 \\\n  --des $des \\\n  --patch_len $patch_len \\\n  --batch_size 4 \\\n  --d_model 512 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/exogenous_forecast/ETTh1/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --batch_size 4 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 32 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 512 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n"
  },
  {
    "path": "scripts/exogenous_forecast/ETTh2/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --d_ff 512 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --batch_size 16 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des $des \\\n  --itr 1"
  },
  {
    "path": "scripts/exogenous_forecast/ETTm1/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1"
  },
  {
    "path": "scripts/exogenous_forecast/ETTm2/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 512 \\\n  --batch_size 16 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --batch_size 4 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --batch_size 128 \\\n  --des $des \\\n  --itr 1\n"
  },
  {
    "path": "scripts/exogenous_forecast/Traffic/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --des $des \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --des $des \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --des $des \\\n  --batch_size 4 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/exogenous_forecast/Weather/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=TimeXer\ndes='Timexer-MS'\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des $des \\\n  --d_model 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des $des \\\n  --d_model 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des $des \\\n  --d_model 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features MS \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des $des \\\n  --d_model 128 \\\n  --itr 1"
  },
  {
    "path": "scripts/imputation/ECL_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/DLinear.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=DLinear\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/ETSformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=ETSformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/FEDformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=FEDformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/Informer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Informer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/LightTS.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=LightTS\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/Reformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Reformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ECL_script/iTransformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Autoformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Autoformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Autoformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Autoformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Crossformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/DLinear_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=DLinear\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/FiLM_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/MICN_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --conv_kernel 12 16 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --conv_kernel 12 16 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --conv_kernel 12 16 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --conv_kernel 12 16 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Nonstationary_Transformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n"
  },
  {
    "path": "scripts/imputation/ETT_script/TiDE_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TiDE\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 256 \\\n  --d_ff 256 \\\n  --dropout 0.3 \\\n  --learning_rate 0.1 \\\n  --patience 5 \\\n  --train_epochs 10 \\\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/TimesNet_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/TimesNet_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/TimesNet_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/TimesNet_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Transformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Transformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Transformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/Transformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/ETT_script/iTransformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/Weather_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/Weather_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 3 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/imputation/Weather_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.125 \\\n  --mask_rate 0.125 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.25 \\\n  --mask_rate 0.25 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.375 \\\n  --mask_rate 0.375 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n\npython -u run.py \\\n  --task_name imputation \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_mask_0.5 \\\n  --mask_rate 0.5 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 0 \\\n  --pred_len 0 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \\\n  --learning_rate 0.001\n"
  },
  {
    "path": "scripts/long_term_forecast/AugmentSample/Classification/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=PatchTST\n\nfor aug in jitter scaling permutation magwarp timewarp windowslice windowwarp rotation spawner dtwwarp shapedtwwarp wdba discdtw discsdtw\ndo\necho using augmentation: ${aug}\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --augmentation_ratio 1 \\\n  --${aug}\n done"
  },
  {
    "path": "scripts/long_term_forecast/AugmentSample/Forecasting/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=PatchTST\nfor aug in jitter scaling permutation magwarp timewarp windowslice windowwarp rotation spawner dtwwarp shapedtwwarp discdtw discsdtw\ndo\nfor pred_len in 96 192 336 720\ndo\necho using augmentation: ${aug}\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_${pred_len} \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len ${pred_len} \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --augmentation_ratio 1 \\\n  --${aug}\ndone\ndone"
  },
  {
    "path": "scripts/long_term_forecast/AugmentSample/ReadMe.md",
    "content": "# Augmentation Feature Roadbook\n\nHi there! For those who are interested in testing \naugmentation techniques in `Time-Series-Library`.\n\nFor now, we have embedded several augmentation methods\nin this repo. We are still collecting publicly available \naugmentation algorithms, and we appreciate your valuable\nadvice!\n\n```\nThe Implemented Augmentation Methods\n1. jitter \n2. scaling \n3. permutation \n4. magwarp \n5. timewarp \n6. windowslice \n7. windowwarp \n8. rotation \n9. spawner \n10. dtwwarp \n11. shapedtwwarp \n12. wdba (Specially Designed for Classification tasks)\n13. discdtw\n```\n\n## Usage\n\nIn this folder, we present two sample of shell scripts \ndoing augmentation in `Forecasting` and `Classification`\ntasks.\n\nTake `Forecasting` task for example, we test multiple\naugmentation algorithms on `EthanolConcentration` dataset\n(a subset of the popular classification benchmark `UEA`) \nusing `PatchTST` model.\n\n```shell\nexport CUDA_VISIBLE_DEVICES=0\n\nmodel_name=PatchTST\n\nfor aug in jitter scaling permutation magwarp timewarp windowslice windowwarp rotation spawner dtwwarp shapedtwwarp wdba discdtw discsdtw\ndo\necho using augmentation: ${aug}\n\npython -u run.py \\\n  --task_name classification \\\n  --is_training 1 \\\n  --root_path ./dataset/EthanolConcentration/ \\\n  --model_id EthanolConcentration \\\n  --model $model_name \\\n  --data UEA \\\n  --e_layers 3 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --d_ff 256 \\\n  --top_k 3 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --train_epochs 100 \\\n  --patience 10 \\\n  --augmentation_ratio 1 \\\n  --${aug}\n done\n```\n\nHere, parameter `augmentation_ratio` represents how many\ntimes do we want to perform our augmentation method.\nParameter `${aug}` represents a string of augmentation\ntype label. \n\nThe example here only perform augmentation once, so we\ncan set `augmentation_ratio` to `1`, followed by one\naugmentation type label. Trivially, you can set \n`augmentation_ratio` to an integer `num` followed by \n`num` augmentation type labels.\n\nThe augmentation code obeys the same prototype of \n`Time-Series-Library`. If you want to adjust other \ntraining parameters, feel free to add arguments to the\nshell scripts and play around. The full list of parameters\ncan be seen in `run.py`.\n\n## Contact Us!\n\nThis piece of code is written and maintained by \n[Yunzhong Qiu](https://github.com/DigitalLifeYZQiu). \nWe thank [Haixu Wu](https://github.com/wuhaixu2016) and\n[Jiaxiang Dong](https://github.com/dongjiaxiang) for \ninsightful discussion and solid support.\n\nIf you have difficulties or find bugs in our code, please\ncontact us:\n- Email: qiuyz24@mails.tsinghua.edu.cn"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/DLinear.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=DLinear\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/ETSformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=ETSformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/FEDformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=FEDformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 192 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 192 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 192 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 192 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Informer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Informer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Koopa.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_192_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_288_144 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_384_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/LightTS.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=LightTS\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Mamba.sh",
    "content": "model_name=Mamba\n\nfor pred_len in 96 192 336 720\n# for pred_len in 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 321 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 321 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/MultiPatchFormer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MultiPatchFormer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Nonstationary_Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 2048\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 2048\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 2048\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 2048\n"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Reformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Reformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/SegRNN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 321 \\\n  --d_model 512 \\\n  --dropout 0 \\\n  --learning_rate 0.001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n\n"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/TSMixer.sh",
    "content": "\nmodel_name=TSMixer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/TimeMixer.sh",
    "content": "#export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=3\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=16\nd_ff=32\nbatch_size=32\ntrain_epochs=20\npatience=10\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_$seq_len'_'96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_$seq_len'_'192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_$seq_len'_'336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_$seq_len'_'720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 4 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --d_ff 512 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 4 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features S \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/WPMixer.sh",
    "content": "\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=electricity\nseq_lens=(512 512 512 512)\npred_lens=(96 192 336 720)\nlearning_rates=(0.00328086 0.000493286 0.002505375 0.001977516)\nbatches=(32 32 32 32)\nepochs=(100 100 100 100)\ndropouts=(0.1 0.1 0.2 0.1)\npatch_lens=(16 16 16 16)\nlradjs=(type3 type3 type3 type3)\nd_models=(32 32 32 32)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(sym3 coif5 sym4 db2)\nlevels=(2 3 1 2)\ntfactors=(3 7 5 7)\ndfactors=(5 5 7 8)\nstrides=(8 8 8 8)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/electricity/ \\\n\t\t--data_path electricity.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ECL_script/iTransformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.0005 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.0005 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.0005 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/electricity/ \\\n  --data_path electricity.csv \\\n  --model_id ECL_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 321 \\\n  --dec_in 321 \\\n  --c_out 321 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.0005 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Autoformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Autoformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Autoformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Autoformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Crossformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Crossformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Crossformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Crossformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/DLinear_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=DLinear\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/ETSformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=ETSformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/FEDformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=FEDformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/FiLM_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 336 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 336 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 336 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 336 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/FiLM_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 168 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 168 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 168 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 168 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/FiLM_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/FiLM_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Informer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Informer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Koopa_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_48 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_192_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_288_144 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_384_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Koopa_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_48 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_192_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_288_144 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_384_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Koopa_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_48 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_192_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_288_144 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_384_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Koopa_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_48 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_192_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_288_144 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_384_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/LTSM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\n\nmodel_name=Chronos2\n\n\nseq_len=2048\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name zero_shot_forecast \\\n  --is_training 0 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name zero_shot_forecast \\\n  --is_training 0 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 7 \\\n  --d_model 256 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n\n\nfor pred_len in 192 336 720\ndo\npython -u run.py \\\n  --task_name zero_shot_forecast \\\n  --is_training 0 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n\n\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name zero_shot_forecast \\\n  --is_training 0 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/LightTS_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=LightTS\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MICN_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MICN_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MICN_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MICN_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --top_k 5 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MambaSimple_ETTh1.sh",
    "content": "model_name=MambaSimple\n\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Mamba_ETT_all.sh",
    "content": "./scripts/long_term_forecast/ETT_script/Mamba_ETTh1.sh | tee mamba_ett.txt\n./scripts/long_term_forecast/ETT_script/Mamba_ETTh2.sh | tee mamba_ett.txt -a\n./scripts/long_term_forecast/ETT_script/Mamba_ETTm1.sh | tee mamba_ett.txt -a\n./scripts/long_term_forecast/ETT_script/Mamba_ETTm2.sh | tee mamba_ett.txt -a"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Mamba_ETTh1.sh",
    "content": "model_name=Mamba\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Mamba_ETTh2.sh",
    "content": "model_name=Mamba\n\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --enc_in 7 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Mamba_ETTm1.sh",
    "content": "model_name=Mamba\n\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --enc_in 7 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Mamba_ETTm2.sh",
    "content": "model_name=Mamba\n\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --enc_in 7 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 7 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MultiPatchFormer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MultiPatchFormer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/MultiPatchFormer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MultiPatchFormer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Nonstationary_Transformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 128\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 128\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 128\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n  --d_model 128"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Nonstationary_Transformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 256 256 \\\n  --p_hidden_layers 4 \\\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2 \\\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Nonstationary_Transformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 16 16 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 16 16 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 16 16 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 16 16 \\\n  --p_hidden_layers 4"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Nonstationary_Transformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 256 256 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 256 256 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 16 16 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 16 16 \\\n  --p_hidden_layers 4"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/PAttn_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=PAttn\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 16 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/PatchTST_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 16 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/PatchTST_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/PatchTST_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --batch_size 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --batch_size 128 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/PatchTST_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 16 \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --batch_size 128 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Pyraformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Pyraformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Pyraformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Pyraformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Reformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Reformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/SegRNN_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/SegRNN_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/SegRNN_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 48 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/SegRNN_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 48 \\\n  --enc_in 7 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TSMixer_ETTh1.sh",
    "content": "\nmodel_name=TSMixer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TSMixer_ETTh2.sh",
    "content": "\nmodel_name=TSMixer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TSMixer_ETTm1.sh",
    "content": "\nmodel_name=TSMixer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TSMixer_ETTm2.sh",
    "content": "\nmodel_name=TSMixer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TiDE_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TiDE\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 8 \\\n  --d_model 256 \\\n  --d_ff 256 \\\n  --dropout 0.3 \\\n  --batch_size 512 \\\n  --learning_rate 0.1 \\\n  --patience 5 \\\n  --train_epochs 10 \\\n\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 8 \\\n  --d_model 256 \\\n  --d_ff 256 \\\n  --dropout 0.3 \\\n  --batch_size 512 \\\n  --learning_rate 0.1 \\\n  --patience 5 \\\n  --train_epochs 10 \\\n\n \n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 8 \\\n  --d_model 256 \\\n  --d_ff 256 \\\n  --dropout 0.3 \\\n  --batch_size 512 \\\n  --learning_rate 0.1 \\\n  --patience 5 \\\n  --train_epochs 10 \\\n\n\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 8 \\\n  --d_model 256 \\\n  --d_ff 256 \\\n  --dropout 0.3 \\\n  --batch_size 512 \\\n  --learning_rate 0.1 \\\n  --patience 5 \\\n  --train_epochs 10 \\\n\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeMixer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=2\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=16\nd_ff=32\ntrain_epochs=10\npatience=10\nbatch_size=16\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path  ./dataset/ETT-small/\\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$seq_len'_'96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --batch_size 128 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$seq_len'_'192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --batch_size 128 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$seq_len'_'336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --batch_size 128 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_$seq_len'_'720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --batch_size 128 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeMixer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=2\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=16\nd_ff=32\nbatch_size=16\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path  ./dataset/ETT-small/\\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$seq_len'_'96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$seq_len'_'192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$seq_len'_'336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_$seq_len'_'720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeMixer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=2\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=16\nd_ff=32\nbatch_size=16\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path  ./dataset/ETT-small/\\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$seq_len'_'96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$seq_len'_'192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$seq_len'_'336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_$seq_len'_'720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeMixer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=2\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=32\nd_ff=32\nbatch_size=16\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path  ./dataset/ETT-small/\\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$seq_len'_'96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$seq_len'_'192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$seq_len'_'336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_$seq_len'_'720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --enc_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeXer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --batch_size 4 \\\n  --des 'exp' \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 1024 \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 256 \\\n  --d_ff 1024 \\\n  --batch_size 16 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeXer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 256 \\\n  --d_ff 1024 \\\n  --batch_size 16 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 256 \\\n  --d_ff 1024 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 1024 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 256 \\\n  --d_ff 1024 \\\n  --batch_size 16 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeXer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --batch_size 4 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 256 \\\n  --batch_size 4 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 1024 \\\n  --batch_size 4 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --batch_size 4 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimeXer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 256 \\\n  --d_ff 1024 \\\n  --batch_size 16 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 512 \\\n  --d_ff 1024 \\\n  --des 'Exp' \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimesNet_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5 \n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --top_k 5\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimesNet_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimesNet_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/TimesNet_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --itr 1 \\\n  --train_epochs 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Transformer_ETTh1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_96 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_192 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_336 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh1.csv \\\n  --model_id ETTh1_96_720 \\\n  --model $model_name \\\n  --data ETTh1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Transformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Transformer_ETTm1.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_96 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_192 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_336 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm1.csv \\\n  --model_id ETTm1_96_720 \\\n  --model $model_name \\\n  --data ETTm1 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/Transformer_ETTm2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=2\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_96 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_192 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_336 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTm2.csv \\\n  --model_id ETTm2_96_720 \\\n  --model $model_name \\\n  --data ETTm2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 1 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/WPMixer_ETTh1.sh",
    "content": "\n# Set the GPU to use\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=ETTh1\nseq_lens=(512 512 512 512)\npred_lens=(96 192 336 720)\nlearning_rates=(0.000242438 0.000201437 0.000132929 0.000239762)\nbatches=(256 256 256 256)\nepochs=(30 30 30 30)\ndropouts=(0.4 0.05 0.0 0.2)\npatch_lens=(16 16 16 16)\nlradjs=(type3 type3 type3 type3)\nd_models=(256 256 256 128)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(db2 db3 db2 db2)\nlevels=(2 2 1 1)\ntfactors=(5 5 3 5)\ndfactors=(8 5 3 3)\nstrides=(8 8 8 8)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/ETT/ \\\n\t\t--data_path ETTh1.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/WPMixer_ETTh2.sh",
    "content": "\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=ETTh2\nseq_lens=(512 512 512 512)\npred_lens=(96 192 336 720)\nlearning_rates=(0.000466278 0.000294929 0.000617476 0.000810205)\nbatches=(256 256 256 256)\nepochs=(30 30 30 30)\ndropouts=(0.0 0.0 0.1 0.4)\npatch_lens=(16 16 16 16)\nlradjs=(type3 type3 type3 type3)\nd_models=(256 256 128 128)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(db2 db2 db2 db2)\nlevels=(2 3 5 5)\ntfactors=(5 3 5 5)\ndfactors=(5 8 3 5)\nstrides=(8 8 8 8)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/ETT/ \\\n\t\t--data_path ETTh2.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/WPMixer_ETTm1.sh",
    "content": "\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=ETTm1\nseq_lens=(512 512 512 512)\npred_lens=(96 192 336 720)\nlearning_rates=(0.001277976 0.002415901 0.001594735 0.002011441)\nbatches=(256 256 256 256)\nepochs=(80 80 80 80)\ndropouts=(0.4 0.4 0.4 0.4)\npatch_lens=(48 48 48 48)\nlradjs=(type3 type3 type3 type3)\nd_models=(256 128 256 128)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(db2 db3 db5 db5)\nlevels=(1 1 1 4)\ntfactors=(5 3 7 3)\ndfactors=(3 7 7 8)\nstrides=(24 24 24 24)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/ETT/ \\\n\t\t--data_path ETTm1.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/WPMixer_ETTm2.sh",
    "content": "\n# Set the GPU to use\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=ETTm2\nseq_lens=(512 512 512 512)\npred_lens=(96 192 336 720)\nlearning_rates=(0.00076587 0.000275775 0.000234608 0.001039536)\nbatches=(256 256 256 256)\nepochs=(80 80 80 80)\ndropouts=(0.4 0.2 0.4 0.4)\npatch_lens=(48 48 48 48)\nlradjs=(type3 type3 type3 type3)\nd_models=(256 256 256 256)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(bior3.1 db2 db2 db2)\nlevels=(1 1 1 1)\ntfactors=(3 3 3 3)\ndfactors=(8 7 5 8)\nstrides=(24 24 24 24)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/ETT/ \\\n\t\t--data_path ETTm2.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/ETT_script/iTransformer_ETTh2.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_96 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_192 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_336 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/ETT-small/ \\\n  --data_path ETTh2.csv \\\n  --model_id ETTh2_96_720 \\\n  --model $model_name \\\n  --data ETTh2 \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --d_ff 128 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name  \\\n  --data custom \\\n  --features M \\\n  --seq_len 384 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name  \\\n  --data custom \\\n  --features M \\\n  --seq_len 384 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\n  \npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name  \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name  \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Koopa.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_192_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_288_144 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_384_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Mamba.sh",
    "content": "model_name=Mamba\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 8 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 8 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Nonstationary_Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 64 64 64 64 \\\n  --p_hidden_layers 4\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Exchange_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/exchange_rate/ \\\n  --data_path exchange_rate.csv \\\n  --model_id Exchange_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 8 \\\n  --dec_in 8 \\\n  --c_out 8 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --dropout 0.6 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  -dropout 0.6 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  -dropout 0.6 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  -dropout 0.6 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 60 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n  \n  \n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 60 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 60 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n  \n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 60 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/Koopa.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_48_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 48 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_72_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 72 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_96_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_120_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 120 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 36 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 36 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 36 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 36 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/Nonstationary_Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 32 32 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 32 32 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 16 16 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 8 8 \\\n  --p_hidden_layers 2"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --d_model 1024\\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --d_model 2048\\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 4 \\\n  --d_model 2048\\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --n_heads 16 \\\n  --d_model 2048\\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --d_model 768 \\\n  --d_ff 768 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/ILI_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_24 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 24 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_36 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 36 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/illness/ \\\n  --data_path national_illness.csv \\\n  --model_id ili_36_60 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 36 \\\n  --label_len 18 \\\n  --pred_len 60 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 7 \\\n  --dec_in 7 \\\n  --c_out 7 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Mamba_all.sh",
    "content": "./scripts/long_term_forecast/ECL_script/Mamba.sh\n./scripts/long_term_forecast/Traffic_script/Mamba.sh\n./scripts/long_term_forecast/Exchange_script/Mamba.sh\n./scripts/long_term_forecast/Weather_script/Mamba.sh\n"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --n_heads 2 \\\n  --batch_size 4 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --batch_size 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --batch_size 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --batch_size 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --batch_size 2"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Koopa.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=Koopa\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_48 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --pred_len 48 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_192_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 192 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_288_144 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 288 \\\n  --pred_len 144 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_384_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 384 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Mamba.sh",
    "content": "model_name=Mamba\n\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 862 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 862 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/MultiPatchFormer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MultiPatchFormer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Nonstationary_Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3 \\\n  --p_hidden_dims 128 128 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3 \\\n  --p_hidden_dims 128 128 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3 \\\n  --p_hidden_dims 16 16 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3 \\\n  --p_hidden_dims 128 128 \\\n  --p_hidden_layers 2"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --batch_size 4 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/SegRNN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 24 \\\n  --enc_in 862 \\\n  --d_model 512 \\\n  --dropout 0 \\\n  --learning_rate 0.001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n\n"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/TSMixer.sh",
    "content": "\nmodel_name=TSMixer\nlearning_rate=0.001\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/TimeMixer.sh",
    "content": "#export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=3\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=32\nd_ff=64\nbatch_size=8\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id Traffic_$seq_len'_'96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id Traffic_$seq_len'_'192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id Traffic_$seq_len'_'336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id Traffic_$seq_len'_'720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size $batch_size \\\n  --learning_rate $learning_rate \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 3 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/WPMixer.sh",
    "content": "\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=traffic\nseq_lens=(1200 1200 1200 1200)\npred_lens=(96 192 336 720)\nlearning_rates=(0.0010385 0.000567053 0.001026715 0.001496217)\nbatches=(16 16 16 16)\nepochs=(60 60 50 60)\ndropouts=(0.05 0.05 0.0 0.05)\npatch_lens=(16 16 16 16)\nlradjs=(type3 type3 type3 type3)\nd_models=(16 32 32 32)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(db3 db3 bior3.1 db3)\nlevels=(1 1 1 1)\ntfactors=(3 3 7 7)\ndfactors=(5 5 7 3)\nstrides=(8 8 8 8)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/traffic/ \\\n\t\t--data_path traffic.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/Traffic_script/iTransformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/traffic/ \\\n  --data_path traffic.csv \\\n  --model_id traffic_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 4 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 862 \\\n  --dec_in 862 \\\n  --c_out 862 \\\n  --des 'Exp' \\\n  --d_model 512 \\\n  --d_ff 512 \\\n  --batch_size 16 \\\n  --learning_rate 0.001 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/Autoformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/Crossformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/FiLM.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 720 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 192 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model FiLM \\\n  --data custom \\\n  --features M \\\n  --seq_len 336 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/MICN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 96 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/Mamba.sh",
    "content": "model_name=Mamba\n\nfor pred_len in 96 192 336 720\ndo\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_$pred_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $pred_len \\\n  --label_len 48 \\\n  --pred_len $pred_len \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --enc_in 21 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 21 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\ndone"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/MultiPatchFormer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=MultiPatchFormer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 1 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --des 'Exp' \\\n  --n_heads 8 \\\n  --batch_size 32 \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/Nonstationary_Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=6\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3 \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 128 128 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 128 128 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --p_hidden_dims 128 128 \\\n  --p_hidden_layers 2"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/PatchTST.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=PatchTST\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --n_heads 4 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --n_heads 16 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --n_heads 4 \\\n  --batch_size 128 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --n_heads 4 \\\n  --batch_size 128 \\\n  --train_epochs 3"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/Pyraformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 2\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/SegRNN.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=SegRNN\n\nseq_len=96\nfor pred_len in 96 192 336 720\ndo\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_$seq_len'_'$pred_len \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --pred_len $pred_len \\\n  --seg_len 48 \\\n  --enc_in 21 \\\n  --d_model 512 \\\n  --dropout 0.5 \\\n  --learning_rate 0.0001 \\\n  --des 'Exp' \\\n  --itr 1\ndone\n\n"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/TSMixer.sh",
    "content": "\nmodel_name=TSMixer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/TimeMixer.sh",
    "content": "#export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\nseq_len=96\ne_layers=3\ndown_sampling_layers=3\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=16\nd_ff=32\nbatch_size=16\ntrain_epochs=20\npatience=10\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 96 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 192 \\\n  --e_layers $e_layers \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 336 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len $seq_len \\\n  --label_len 0 \\\n  --pred_len 720 \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --d_model $d_model \\\n  --d_ff $d_ff \\\n  --batch_size 128 \\\n  --learning_rate $learning_rate \\\n  --train_epochs $train_epochs \\\n  --patience $patience \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/TimeXer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeXer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 256 \\\n  --d_ff 512 \\\n  --batch_size 4 \\\n  --itr 1 \\\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --d_ff 1024 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 256 \\\n  --batch_size 4 \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 128 \\\n  --batch_size 4 \\\n  --itr 1\n"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/TimesNet.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/Transformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=7\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --train_epochs 3\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --itr 1"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/WPMixer.sh",
    "content": "\nexport CUDA_VISIBLE_DEVICES=0\n\n# Model name\nmodel_name=WPMixer\n\n# Datasets and prediction lengths\ndataset=weather\nseq_lens=(512 512 512 512)\npred_lens=(96 192 336 720)\nlearning_rates=(0.000913333 0.001379042 0.000607991 0.001470479)\nbatches=(32 64 32 128)\nepochs=(60 60 60 60)\ndropouts=(0.4 0.4 0.4 0.4)\npatch_lens=(16 16 16 16)\nlradjs=(type3 type3 type3 type3)\nd_models=(256 128 128 128)\npatiences=(12 12 12 12)\n\n# Model params below need to be set in WPMixer.py Line 15, instead of this script\nwavelets=(db3 db3 db3 db2)\nlevels=(2 1 2 1)\ntfactors=(3 3 7 7)\ndfactors=(7 7 7 5)\nstrides=(8 8 8 8)\n\n# Loop over datasets and prediction lengths\nfor i in \"${!pred_lens[@]}\"; do\n\tpython -u run.py \\\n\t\t--is_training 1 \\\n\t\t--root_path ./data/weather/ \\\n\t\t--data_path weather.csv \\\n\t\t--model_id wpmixer \\\n\t\t--model $model_name \\\n\t\t--task_name long_term_forecast \\\n\t\t--data $dataset \\\n\t\t--seq_len ${seq_lens[$i]} \\\n\t\t--pred_len ${pred_lens[$i]} \\\n\t\t--label_len 0 \\\n\t\t--d_model ${d_models[$i]} \\\n\t\t--patch_len ${patch_lens[$i]} \\\n\t\t--batch_size ${batches[$i]} \\\n\t\t--learning_rate ${learning_rates[$i]} \\\n\t\t--lradj ${lradjs[$i]} \\\n\t\t--dropout ${dropouts[$i]} \\\n\t\t--patience ${patiences[$i]} \\\n\t\t--train_epochs ${epochs[$i]} \\\n\t\t--use_amp\ndone\n"
  },
  {
    "path": "scripts/long_term_forecast/Weather_script/iTransformer.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_96 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 96 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 512\\\n  --d_ff 512\\\n  --itr 1 \\\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_192 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 192 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 512\\\n  --d_ff 512\\\n  --itr 1 \\\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_336 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 336 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 512\\\n  --d_ff 512\\\n  --itr 1 \\\n\n\npython -u run.py \\\n  --task_name long_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/weather/ \\\n  --data_path weather.csv \\\n  --model_id weather_96_720 \\\n  --model $model_name \\\n  --data custom \\\n  --features M \\\n  --seq_len 96 \\\n  --label_len 48 \\\n  --pred_len 720 \\\n  --e_layers 3 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 21 \\\n  --dec_in 21 \\\n  --c_out 21 \\\n  --des 'Exp' \\\n  --d_model 512\\\n  --d_ff 512\\\n  --itr 1"
  },
  {
    "path": "scripts/short_term_forecast/Autoformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Autoformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/Crossformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=5\n\nmodel_name=Crossformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 16 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'"
  },
  {
    "path": "scripts/short_term_forecast/DLinear_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=DLinear\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/ETSformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=ETSformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ../dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 2 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/FEDformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=FEDformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/FiLM_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=3\n\nmodel_name=FiLM\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 16 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'"
  },
  {
    "path": "scripts/short_term_forecast/Informer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Informer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/LightTS_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=LightTS\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/MICN_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=4\n\nmodel_name=MICN\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 16 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'"
  },
  {
    "path": "scripts/short_term_forecast/Mamba_M4.sh",
    "content": "# export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Mamba\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --enc_in 1 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'  \n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --enc_in 1 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --enc_in 1 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --enc_in 1 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --enc_in 1 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --enc_in 1 \\\n  --expand 2 \\\n  --d_ff 16 \\\n  --d_conv 4 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 128 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'"
  },
  {
    "path": "scripts/short_term_forecast/Nonstationary_Transformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Nonstationary_Transformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE' \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE' \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE' \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE' \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE' \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE' \\\n  --p_hidden_dims 256 256 \\\n  --p_hidden_layers 2"
  },
  {
    "path": "scripts/short_term_forecast/Pyraformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Pyraformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/Reformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Reformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/TSMixer_M4.sh",
    "content": "#export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=MTSMixer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/TimeMixer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimeMixer\n\ne_layers=4\ndown_sampling_layers=1\ndown_sampling_window=2\nlearning_rate=0.01\nd_model=32\nd_ff=32\nbatch_size=16\n\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 128 \\\n  --d_model $d_model \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n  --train_epochs 50 \\\n  --patience 20 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 128 \\\n  --d_model $d_model \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n  --train_epochs 50 \\\n  --patience 20 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 128 \\\n  --d_model $d_model \\\n  --d_ff 64 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n  --train_epochs 50 \\\n  --patience 20 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 128 \\\n  --d_model $d_model \\\n  --d_ff 16 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n  --train_epochs 50 \\\n  --patience 20 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 128 \\\n  --d_model $d_model \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n  --train_epochs 50 \\\n  --patience 20 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers $e_layers \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 128 \\\n  --d_model $d_model \\\n  --d_ff 32 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate $learning_rate \\\n  --train_epochs 50 \\\n  --patience 20 \\\n  --down_sampling_layers $down_sampling_layers \\\n  --down_sampling_method avg \\\n  --down_sampling_window $down_sampling_window \\\n  --loss 'SMAPE'"
  },
  {
    "path": "scripts/short_term_forecast/TimesNet_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=TimesNet\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 64 \\\n  --d_ff 64 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 16 \\\n  --d_ff 16 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 32 \\\n  --d_ff 32 \\\n  --top_k 5 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n"
  },
  {
    "path": "scripts/short_term_forecast/Transformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=1\n\nmodel_name=Transformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'"
  },
  {
    "path": "scripts/short_term_forecast/iTransformer_M4.sh",
    "content": "export CUDA_VISIBLE_DEVICES=0\n\nmodel_name=iTransformer\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Monthly' \\\n  --model_id m4_Monthly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Yearly' \\\n  --model_id m4_Yearly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Quarterly' \\\n  --model_id m4_Quarterly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Weekly' \\\n  --model_id m4_Weekly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Daily' \\\n  --model_id m4_Daily \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'\n\npython -u run.py \\\n  --task_name short_term_forecast \\\n  --is_training 1 \\\n  --root_path ./dataset/m4 \\\n  --seasonal_patterns 'Hourly' \\\n  --model_id m4_Hourly \\\n  --model $model_name \\\n  --data m4 \\\n  --features M \\\n  --e_layers 2 \\\n  --d_layers 1 \\\n  --factor 3 \\\n  --enc_in 1 \\\n  --dec_in 1 \\\n  --c_out 1 \\\n  --batch_size 16 \\\n  --d_model 512 \\\n  --des 'Exp' \\\n  --itr 1 \\\n  --learning_rate 0.001 \\\n  --loss 'SMAPE'"
  },
  {
    "path": "tutorial/TimesNet_tutorial.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# TimesNet Tutorial\\n\",\n    \"**Set-up instructions:** this notebook give a tutorial on the learning task supported by `TimesNet`.\\n\",\n    \"\\n\",\n    \"`TimesNet` can support basically 5 tasks, which are respectively long-term forecast, short-term forecast, imputation, anomaly detection, classification.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 1. Install Python 3.8. For convenience, execute the following command.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"vscode\": {\n     \"languageId\": \"shellscript\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pip install -r requirements.txt\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 2. Package Import\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import torch    \\n\",\n    \"import torch.nn as nn\\n\",\n    \"import torch.nn.functional as F\\n\",\n    \"import torch.fft\\n\",\n    \"from layers.Embed import DataEmbedding\\n\",\n    \"from layers.Conv_Blocks import Inception_Block_V1   \\n\",\n    \"            #convolution block used for convoluting the 2D time data, changeable\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 3. TimesBlock Construction\\n\",\n    \" The core idea of `TimesNet` lies in the construction of `TimesBlock`, which generally gets the base frequencies by implementing FFT on the data, and then reshapes the times series to 2D variation respectively from the main base frequencies, followed by a 2D convolution whose outputs are reshaped back and added with weight to form the final output.\\n\",\n    \"\\n\",\n    \" In the following section, we will have a detailed view on `TimesBlock`.\\n\",\n    \"\\n\",\n    \" TimesBlock has 2 members. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class TimesBlock(nn.Module):\\n\",\n    \"    def __init__(self, configs):\\n\",\n    \"        ...\\n\",\n    \"    \\n\",\n    \"    def forward(self, x):\\n\",\n    \"        ...\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, let's focus on ```__init__(self, configs):```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def __init__(self, configs):    ##configs is the configuration defined for TimesBlock\\n\",\n    \"    super(TimesBlock, self).__init__() \\n\",\n    \"    self.seq_len = configs.seq_len   ##sequence length \\n\",\n    \"    self.pred_len = configs.pred_len ##prediction length\\n\",\n    \"    self.k = configs.top_k    ##k denotes how many top frequencies are \\n\",\n    \"                                                            #taken into consideration\\n\",\n    \"    # parameter-efficient design\\n\",\n    \"    self.conv = nn.Sequential(\\n\",\n    \"        Inception_Block_V1(configs.d_model, configs.d_ff,\\n\",\n    \"                           num_kernels=configs.num_kernels),\\n\",\n    \"        nn.GELU(),\\n\",\n    \"        Inception_Block_V1(configs.d_ff, configs.d_model,\\n\",\n    \"                           num_kernels=configs.num_kernels)\\n\",\n    \"    )\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Then, have a look at ```forward(self, x)```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def forward(self, x):\\n\",\n    \"        B, T, N = x.size()\\n\",\n    \"            #B: batch size  T: length of time series  N:number of features\\n\",\n    \"        period_list, period_weight = FFT_for_Period(x, self.k)\\n\",\n    \"            #FFT_for_Period() will be shown later. Here, period_list([top_k]) denotes \\n\",\n    \"            #the top_k-significant period and period_weight([B, top_k]) denotes its weight(amplitude)\\n\",\n    \"\\n\",\n    \"        res = []\\n\",\n    \"        for i in range(self.k):\\n\",\n    \"            period = period_list[i]\\n\",\n    \"\\n\",\n    \"            # padding : to form a 2D map, we need total length of the sequence, plus the part \\n\",\n    \"            # to be predicted, to be divisible by the period, so padding is needed\\n\",\n    \"            if (self.seq_len + self.pred_len) % period != 0:\\n\",\n    \"                length = (\\n\",\n    \"                                 ((self.seq_len + self.pred_len) // period) + 1) * period\\n\",\n    \"                padding = torch.zeros([x.shape[0], (length - (self.seq_len + self.pred_len)), x.shape[2]]).to(x.device)\\n\",\n    \"                out = torch.cat([x, padding], dim=1)\\n\",\n    \"            else:\\n\",\n    \"                length = (self.seq_len + self.pred_len)\\n\",\n    \"                out = x\\n\",\n    \"\\n\",\n    \"            # reshape: we need each channel of a single piece of data to be a 2D variable,\\n\",\n    \"            # Also, in order to implement the 2D conv later on, we need to adjust the 2 dimensions \\n\",\n    \"            # to be convolutioned to the last 2 dimensions, by calling the permute() func.\\n\",\n    \"            # Whereafter, to make the tensor contiguous in memory, call contiguous()\\n\",\n    \"            out = out.reshape(B, length // period, period,\\n\",\n    \"                              N).permute(0, 3, 1, 2).contiguous()\\n\",\n    \"            \\n\",\n    \"            #2D convolution to grap the intra- and inter- period information\\n\",\n    \"            out = self.conv(out)\\n\",\n    \"\\n\",\n    \"            # reshape back, similar to reshape\\n\",\n    \"            out = out.permute(0, 2, 3, 1).reshape(B, -1, N)\\n\",\n    \"            \\n\",\n    \"            #truncating down the padded part of the output and put it to result\\n\",\n    \"            res.append(out[:, :(self.seq_len + self.pred_len), :])\\n\",\n    \"        res = torch.stack(res, dim=-1) #res: 4D [B, length , N, top_k]\\n\",\n    \"\\n\",\n    \"        # adaptive aggregation\\n\",\n    \"        #First, use softmax to get the normalized weight from amplitudes --> 2D [B,top_k]\\n\",\n    \"        period_weight = F.softmax(period_weight, dim=1) \\n\",\n    \"\\n\",\n    \"        #after two unsqueeze(1),shape -> [B,1,1,top_k],so repeat the weight to fit the shape of res\\n\",\n    \"        period_weight = period_weight.unsqueeze(\\n\",\n    \"            1).unsqueeze(1).repeat(1, T, N, 1)\\n\",\n    \"        \\n\",\n    \"        #add by weight the top_k periods' result, getting the result of this TimesBlock\\n\",\n    \"        res = torch.sum(res * period_weight, -1)\\n\",\n    \"\\n\",\n    \"        # residual connection\\n\",\n    \"        res = res + x\\n\",\n    \"        return res\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The ```FFT_for_Period``` above is given by:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def FFT_for_Period(x, k=2):\\n\",\n    \"    # xf shape [B, T, C], denoting the amplitude of frequency(T) given the datapiece at B,N\\n\",\n    \"    xf = torch.fft.rfft(x, dim=1) \\n\",\n    \"\\n\",\n    \"    # find period by amplitudes: here we assume that the periodic features are basically constant\\n\",\n    \"    # in different batch and channel, so we mean out these two dimensions, getting a list frequency_list with shape[T] \\n\",\n    \"    # each element at pos t of frequency_list denotes the overall amplitude at frequency (t)\\n\",\n    \"    frequency_list = abs(xf).mean(0).mean(-1) \\n\",\n    \"    frequency_list[0] = 0\\n\",\n    \"\\n\",\n    \"    #by torch.topk(),we can get the biggest k elements of frequency_list, and its positions(i.e. the k-main frequencies in top_list)\\n\",\n    \"    _, top_list = torch.topk(frequency_list, k)\\n\",\n    \"\\n\",\n    \"    #Returns a new Tensor 'top_list', detached from the current graph.\\n\",\n    \"    #The result will never require gradient.Convert to a numpy instance\\n\",\n    \"    top_list = top_list.detach().cpu().numpy()\\n\",\n    \"     \\n\",\n    \"    #period:a list of shape [top_k], recording the periods of mean frequencies respectively\\n\",\n    \"    period = x.shape[1] // top_list\\n\",\n    \"\\n\",\n    \"    #Here,the 2nd item returned has a shape of [B, top_k],representing the biggest top_k amplitudes \\n\",\n    \"    # for each piece of data, with N features being averaged.\\n\",\n    \"    return period, abs(xf).mean(-1)[:, top_list] \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To make it clearer, please see the figures below.\\n\",\n    \"\\n\",\n    \"![FFT demonstrator](./fft.png)\\n\",\n    \"\\n\",\n    \"![2D Conv demonstrator](./conv.png)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For more details, please read the our paper \\n\",\n    \"(link: https://openreview.net/pdf?id=ju_Uqw384Oq)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 4. TimesNet\\n\",\n    \"\\n\",\n    \"So far we've got `TimesBlock`, which is excel at retrieving  intra- and inter- period temporal information. We become capable of building a `TimesNet`.  `TimesNet` is proficient in multitasks including short- and long-term forecasting, imputation, classification, and anomaly detection.\\n\",\n    \"\\n\",\n    \"In this section, we'll have a detailed overview on how `TimesNet` gains its power in these tasks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Model(nn.Module):\\n\",\n    \"    def __init__(self, configs):\\n\",\n    \"        ...\\n\",\n    \"    \\n\",\n    \"    def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\\n\",\n    \"        ...\\n\",\n    \"\\n\",\n    \"    def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\\n\",\n    \"        ...\\n\",\n    \"\\n\",\n    \"    def anomaly_detection(self, x_enc):\\n\",\n    \"        ...\\n\",\n    \"    \\n\",\n    \"    def classification(self, x_enc, x_mark_enc):\\n\",\n    \"        ...\\n\",\n    \"\\n\",\n    \"    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\\n\",\n    \"        ...\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First of all, let's focus on ```__init__(self, configs):```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def __init__(self, configs):\\n\",\n    \"    super(Model, self).__init__()\\n\",\n    \"    #params init\\n\",\n    \"    self.configs = configs\\n\",\n    \"    self.task_name = configs.task_name\\n\",\n    \"    self.seq_len = configs.seq_len\\n\",\n    \"    self.label_len = configs.label_len\\n\",\n    \"    self.pred_len = configs.pred_len\\n\",\n    \"\\n\",\n    \"    #stack TimesBlock for e_layers times to form the main part of TimesNet, named model\\n\",\n    \"    self.model = nn.ModuleList([TimesBlock(configs)\\n\",\n    \"                                for _ in range(configs.e_layers)])\\n\",\n    \"    \\n\",\n    \"    #embedding & normalization\\n\",\n    \"    # enc_in is the encoder input size, the number of features for a piece of data\\n\",\n    \"    # d_model is the dimension of embedding\\n\",\n    \"    self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,\\n\",\n    \"                                       configs.dropout)\\n\",\n    \"    self.layer = configs.e_layers # num of encoder layers\\n\",\n    \"    self.layer_norm = nn.LayerNorm(configs.d_model)\\n\",\n    \"\\n\",\n    \"    #define the some layers for different tasks\\n\",\n    \"    if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\\n\",\n    \"        self.predict_linear = nn.Linear(\\n\",\n    \"            self.seq_len, self.pred_len + self.seq_len)\\n\",\n    \"        self.projection = nn.Linear(\\n\",\n    \"            configs.d_model, configs.c_out, bias=True)\\n\",\n    \"    if self.task_name == 'imputation' or self.task_name == 'anomaly_detection':\\n\",\n    \"        self.projection = nn.Linear(\\n\",\n    \"            configs.d_model, configs.c_out, bias=True)\\n\",\n    \"    if self.task_name == 'classification':\\n\",\n    \"        self.act = F.gelu\\n\",\n    \"        self.dropout = nn.Dropout(configs.dropout)\\n\",\n    \"        self.projection = nn.Linear(\\n\",\n    \"            configs.d_model * configs.seq_len, configs.num_class)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 4.1 Forecast\\n\",\n    \"\\n\",\n    \"The basic idea of forecasting is to lengthen the known sequence to (seq_len+pred_len), which is the total length after forecasting. Then by several TimesBlock layers together with layer normalization, some underlying intra- and inter- period information is represented. With these information, we can project it to the output space. Whereafter by denorm ( if Non-stationary Transformer) we get the final output.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):\\n\",\n    \"    # Normalization from Non-stationary Transformer at temporal dimension\\n\",\n    \"    means = x_enc.mean(1, keepdim=True).detach() #[B,T]\\n\",\n    \"    x_enc = x_enc - means\\n\",\n    \"    stdev = torch.sqrt(\\n\",\n    \"        torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\\n\",\n    \"    x_enc /= stdev\\n\",\n    \"\\n\",\n    \"    # embedding: projecting a number to a C-channel vector\\n\",\n    \"    enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C] C is d_model\\n\",\n    \"    enc_out = self.predict_linear(enc_out.permute(0, 2, 1)).permute(\\n\",\n    \"        0, 2, 1)  # align temporal dimension [B,pred_len+seq_len,C]\\n\",\n    \"    \\n\",\n    \"    # TimesNet: pass through TimesBlock for self.layer times each with layer normalization\\n\",\n    \"    for i in range(self.layer):\\n\",\n    \"        enc_out = self.layer_norm(self.model[i](enc_out))\\n\",\n    \"\\n\",\n    \"    # project back  #[B,T,d_model]-->[B,T,c_out]\\n\",\n    \"    dec_out = self.projection(enc_out) \\n\",\n    \"\\n\",\n    \"    # De-Normalization from Non-stationary Transformer\\n\",\n    \"    dec_out = dec_out * \\\\\\n\",\n    \"              (stdev[:, 0, :].unsqueeze(1).repeat(\\n\",\n    \"                  1, self.pred_len + self.seq_len, 1)) #lengthen the stdev to fit the dec_out\\n\",\n    \"    dec_out = dec_out + \\\\\\n\",\n    \"              (means[:, 0, :].unsqueeze(1).repeat(\\n\",\n    \"                  1, self.pred_len + self.seq_len, 1)) #lengthen the mean to fit the dec_out\\n\",\n    \"    return dec_out\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 4.2 Imputation\\n\",\n    \"\\n\",\n    \"Imputation is a task aiming at completing some missing value in the time series, so in some degree it's similar to forecast. We can still use the similar step to cope with it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):\\n\",\n    \"    # Normalization from Non-stationary Transformer\\n\",\n    \"    means = torch.sum(x_enc, dim=1) / torch.sum(mask == 1, dim=1)\\n\",\n    \"    means = means.unsqueeze(1).detach()\\n\",\n    \"    x_enc = x_enc - means\\n\",\n    \"    x_enc = x_enc.masked_fill(mask == 0, 0)\\n\",\n    \"    stdev = torch.sqrt(torch.sum(x_enc * x_enc, dim=1) /\\n\",\n    \"                       torch.sum(mask == 1, dim=1) + 1e-5)\\n\",\n    \"    stdev = stdev.unsqueeze(1).detach()\\n\",\n    \"    x_enc /= stdev\\n\",\n    \"\\n\",\n    \"    # embedding\\n\",\n    \"    enc_out = self.enc_embedding(x_enc, x_mark_enc)  # [B,T,C]\\n\",\n    \"    # TimesNet\\n\",\n    \"    for i in range(self.layer):\\n\",\n    \"        enc_out = self.layer_norm(self.model[i](enc_out))\\n\",\n    \"    # project back\\n\",\n    \"    dec_out = self.projection(enc_out)\\n\",\n    \"\\n\",\n    \"    # De-Normalization from Non-stationary Transformer\\n\",\n    \"    dec_out = dec_out * \\\\\\n\",\n    \"              (stdev[:, 0, :].unsqueeze(1).repeat(\\n\",\n    \"                  1, self.pred_len + self.seq_len, 1))\\n\",\n    \"    dec_out = dec_out + \\\\\\n\",\n    \"              (means[:, 0, :].unsqueeze(1).repeat(\\n\",\n    \"                  1, self.pred_len + self.seq_len, 1))\\n\",\n    \"    return dec_out\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 4.3 Anomaly Detection\\n\",\n    \"\\n\",\n    \"Similar to Imputation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def anomaly_detection(self, x_enc):\\n\",\n    \"    # Normalization from Non-stationary Transformer\\n\",\n    \"    means = x_enc.mean(1, keepdim=True).detach()\\n\",\n    \"    x_enc = x_enc - means\\n\",\n    \"    stdev = torch.sqrt(\\n\",\n    \"        torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)\\n\",\n    \"    x_enc /= stdev\\n\",\n    \"    # embedding\\n\",\n    \"    enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\\n\",\n    \"    # TimesNet\\n\",\n    \"    for i in range(self.layer):\\n\",\n    \"        enc_out = self.layer_norm(self.model[i](enc_out))\\n\",\n    \"    # project back\\n\",\n    \"    dec_out = self.projection(enc_out)\\n\",\n    \"    # De-Normalization from Non-stationary Transformer\\n\",\n    \"    dec_out = dec_out * \\\\\\n\",\n    \"              (stdev[:, 0, :].unsqueeze(1).repeat(\\n\",\n    \"                  1, self.pred_len + self.seq_len, 1))\\n\",\n    \"    dec_out = dec_out + \\\\\\n\",\n    \"              (means[:, 0, :].unsqueeze(1).repeat(\\n\",\n    \"                  1, self.pred_len + self.seq_len, 1))\\n\",\n    \"    return dec_out\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 4.4 Classification\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def classification(self, x_enc, x_mark_enc):\\n\",\n    \"        # embedding\\n\",\n    \"        enc_out = self.enc_embedding(x_enc, None)  # [B,T,C]\\n\",\n    \"        # TimesNet\\n\",\n    \"        for i in range(self.layer):\\n\",\n    \"            enc_out = self.layer_norm(self.model[i](enc_out))\\n\",\n    \"\\n\",\n    \"        # Output\\n\",\n    \"        # the output transformer encoder/decoder embeddings don't include non-linearity\\n\",\n    \"        output = self.act(enc_out)\\n\",\n    \"        output = self.dropout(output)\\n\",\n    \"\\n\",\n    \"        # zero-out padding embeddings:The primary role of x_mark_enc in the code is to \\n\",\n    \"        # zero out the embeddings for padding positions in the output tensor through \\n\",\n    \"        # element-wise multiplication, helping the model to focus on meaningful data \\n\",\n    \"        # while disregarding padding.\\n\",\n    \"        output = output * x_mark_enc.unsqueeze(-1)\\n\",\n    \"        \\n\",\n    \"        # (batch_size, seq_length * d_model)\\n\",\n    \"        output = output.reshape(output.shape[0], -1)\\n\",\n    \"        output = self.projection(output)  # (batch_size, num_classes)\\n\",\n    \"        return output\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the end, with so many tasks above, we become able to complete `forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):`. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):\\n\",\n    \"    if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':\\n\",\n    \"        dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)\\n\",\n    \"        return dec_out[:, -self.pred_len:, :]  # [B, L, D] return the predicted part of sequence\\n\",\n    \"    if self.task_name == 'imputation':\\n\",\n    \"        dec_out = self.imputation(\\n\",\n    \"            x_enc, x_mark_enc, x_dec, x_mark_dec, mask)\\n\",\n    \"        return dec_out  # [B, L, D] return the whole sequence with missing value estimated\\n\",\n    \"    if self.task_name == 'anomaly_detection':\\n\",\n    \"        dec_out = self.anomaly_detection(x_enc)\\n\",\n    \"        return dec_out  # [B, L, D] return the sequence that should be correct\\n\",\n    \"    if self.task_name == 'classification':\\n\",\n    \"        dec_out = self.classification(x_enc, x_mark_enc)\\n\",\n    \"        return dec_out  # [B, N] return the classification result\\n\",\n    \"    return None\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 5. Training and Settings\\n\",\n    \"\\n\",\n    \"By now we've successfully build up `TimesNet`. We are now facing the problem how to train and test this neural network. The action of training, validating as well as testing is implemented at __*exp*__ part, in which codes for different tasks are gathered. These experiments are not only for `TimesNet` training, but also feasible for any other time series representation model. But here, we simply use `TimesNet` to analyse.\\n\",\n    \"\\n\",\n    \"`TimesNet` is a state-of-art in multiple tasks, while here we would only introduce its training for long-term forecast task, since the backbone of the training process for other tasks is similar to this one. Again, test and validation code can be easily understood once you've aware how the training process works. So first of all, we are going to focus on the training of `TimesNet` on task long-term forecasting.\\n\",\n    \"\\n\",\n    \"We will discuss many aspects, including the training process, training loss etc.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 5.1 Training for Long-term Forecast Task\\n\",\n    \"\\n\",\n    \"The following codes represents the process of training model for long-term forecasting task. We'll have a detailed look at it. To make it brief, the training part can be briefly divided into several parts, including Data Preparation, Creating Save Path, Initialization, Optimizer and Loss Function Selection, Using Mixed Precision Training, Training Loop, Validation and Early Stopping, Learning Rate Adjustment, Loading the Best Model.\\n\",\n    \"\\n\",\n    \"For more details, please see the code below. 'train' process is defined in the experiment  <font color=orange>__class Exp_Long_Term_Forecast__</font>.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def train(self, setting):  #setting is the args for this model training\\n\",\n    \"    #get train dataloader\\n\",\n    \"    train_data, train_loader = self._get_data(flag='train')\\n\",\n    \"    vali_data, vali_loader = self._get_data(flag='val')\\n\",\n    \"    test_data, test_loader = self._get_data(flag='test')\\n\",\n    \"\\n\",\n    \"    # set path of checkpoint for saving and loading model\\n\",\n    \"    path = os.path.join(self.args.checkpoints, setting)\\n\",\n    \"    if not os.path.exists(path):\\n\",\n    \"        os.makedirs(path)\\n\",\n    \"    time_now = time.time()\\n\",\n    \"\\n\",\n    \"    train_steps = len(train_loader)\\n\",\n    \"\\n\",\n    \"    # EarlyStopping is typically a custom class or function that monitors the performance \\n\",\n    \"    # of a model during training, usually by tracking a certain metric (commonly validation \\n\",\n    \"    # loss or accuracy).It's a common technique used in deep learning to prevent overfitting \\n\",\n    \"    # during the training\\n\",\n    \"    early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)\\n\",\n    \"\\n\",\n    \"    #Optimizer and Loss Function Selection\\n\",\n    \"    model_optim = self._select_optimizer()\\n\",\n    \"    criterion = self._select_criterion()\\n\",\n    \"\\n\",\n    \"    # AMP training is a technique that uses lower-precision data types (e.g., float16) \\n\",\n    \"    # for certain computations to accelerate training and reduce memory usage.\\n\",\n    \"    if self.args.use_amp:  \\n\",\n    \"        scaler = torch.cuda.amp.GradScaler()\\n\",\n    \"    for epoch in range(self.args.train_epochs):\\n\",\n    \"        iter_count = 0\\n\",\n    \"        train_loss = []\\n\",\n    \"        self.model.train()\\n\",\n    \"        epoch_time = time.time()\\n\",\n    \"\\n\",\n    \"        #begin training in this epoch\\n\",\n    \"        for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader):\\n\",\n    \"            iter_count += 1\\n\",\n    \"            model_optim.zero_grad()\\n\",\n    \"            batch_x = batch_x.float().to(self.device)  #input features\\n\",\n    \"            batch_y = batch_y.float().to(self.device)  #target features\\n\",\n    \"\\n\",\n    \"            # _mark holds information about time-related features. Specifically, it is a \\n\",\n    \"            # tensor that encodes temporal information and is associated with the \\n\",\n    \"            # input data batch_x.\\n\",\n    \"            batch_x_mark = batch_x_mark.float().to(self.device)\\n\",\n    \"            batch_y_mark = batch_y_mark.float().to(self.device)\\n\",\n    \"            # decoder input(didn't use in TimesNet case)\\n\",\n    \"            dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\\n\",\n    \"            dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\\n\",\n    \"            # encoder - decoder\\n\",\n    \"            if self.args.use_amp: #in the case of TimesNet, use_amp should be False\\n\",\n    \"                with torch.cuda.amp.autocast():\\n\",\n    \"                    # whether to output attention in ecoder,in TimesNet case is no\\n\",\n    \"                    if self.args.output_attention: \\n\",\n    \"                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]\\n\",\n    \"                    # model the input\\n\",\n    \"                    else:\\n\",\n    \"                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\\n\",\n    \"\\n\",\n    \"                    # forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, \\n\",\n    \"                    # S:univariate predict univariate, MS:multivariate predict univariate'\\n\",\n    \"                    #if multivariate predict univariate',then output should be the last column of the decoder\\n\",\n    \"                    # output, so f_dim = -1 to only contain the last column, else is all columns\\n\",\n    \"                    f_dim = -1 if self.args.features == 'MS' else 0 \\n\",\n    \"                    outputs = outputs[:, -self.args.pred_len:, f_dim:]\\n\",\n    \"                    batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\\n\",\n    \"\\n\",\n    \"                    # calc loss\\n\",\n    \"                    loss = criterion(outputs, batch_y)\\n\",\n    \"                    train_loss.append(loss.item())\\n\",\n    \"            else:  #similar to when use_amp is True\\n\",\n    \"                if self.args.output_attention:\\n\",\n    \"                    outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]\\n\",\n    \"                else:\\n\",\n    \"                    outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\\n\",\n    \"                f_dim = -1 if self.args.features == 'MS' else 0\\n\",\n    \"                outputs = outputs[:, -self.args.pred_len:, f_dim:]\\n\",\n    \"                batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\\n\",\n    \"                loss = criterion(outputs, batch_y)\\n\",\n    \"                train_loss.append(loss.item())\\n\",\n    \"\\n\",\n    \"            # When train rounds attain some 100-multiple, print speed, left time, loss. etc feedback\\n\",\n    \"            if (i + 1) % 100 == 0:\\n\",\n    \"                print(\\\"\\\\titers: {0}, epoch: {1} | loss: {2:.7f}\\\".format(i + 1, epoch + 1, loss.item()))\\n\",\n    \"                speed = (time.time() - time_now) / iter_count\\n\",\n    \"                left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)\\n\",\n    \"                print('\\\\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time))\\n\",\n    \"                iter_count = 0\\n\",\n    \"                time_now = time.time()\\n\",\n    \"\\n\",\n    \"            #BP\\n\",\n    \"            if self.args.use_amp:\\n\",\n    \"                scaler.scale(loss).backward()\\n\",\n    \"                scaler.step(model_optim)\\n\",\n    \"                scaler.update()\\n\",\n    \"            else:\\n\",\n    \"                loss.backward()\\n\",\n    \"                model_optim.step()\\n\",\n    \"        \\n\",\n    \"        #This epoch comes to end, print information\\n\",\n    \"        print(\\\"Epoch: {} cost time: {}\\\".format(epoch + 1, time.time() - epoch_time))\\n\",\n    \"        train_loss = np.average(train_loss)\\n\",\n    \"\\n\",\n    \"        #run test and validation on current model\\n\",\n    \"        vali_loss = self.vali(vali_data, vali_loader, criterion)\\n\",\n    \"        test_loss = self.vali(test_data, test_loader, criterion)\\n\",\n    \"\\n\",\n    \"        #print train, test, vali loss information\\n\",\n    \"        print(\\\"Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}\\\".format(\\n\",\n    \"            epoch + 1, train_steps, train_loss, vali_loss, test_loss))\\n\",\n    \"        \\n\",\n    \"        #Decide whether to trigger Early Stopping. if early_stop is true, it means that \\n\",\n    \"        #this epoch's training is now at a flat slope, so stop further training for this epoch.\\n\",\n    \"        early_stopping(vali_loss, self.model, path)\\n\",\n    \"        if early_stopping.early_stop:\\n\",\n    \"            print(\\\"Early stopping\\\")\\n\",\n    \"            break\\n\",\n    \"\\n\",\n    \"        #adjust learning keys\\n\",\n    \"        adjust_learning_rate(model_optim, epoch + 1, self.args)\\n\",\n    \"    best_model_path = path + '/' + 'checkpoint.pth'\\n\",\n    \"\\n\",\n    \"    # loading the trained model's state dictionary from a saved checkpoint file \\n\",\n    \"    # located at best_model_path.\\n\",\n    \"    self.model.load_state_dict(torch.load(best_model_path))\\n\",\n    \"    return self.model\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you want to learn more, please see it at exp/exp_long_term_forecasting.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 5.2 Early Stopping Mechanism\\n\",\n    \"\\n\",\n    \"<font color=purple>__EarlyStopping__</font> is typically a custom class or function that monitors the performance of a model during training, usually by tracking a certain metric (commonly validation loss or accuracy).It's a common technique used in deep learning to prevent overfitting during the training.\\n\",\n    \"\\n\",\n    \"Let's see the code below(original code is in `tools.py`).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class EarlyStopping:\\n\",\n    \"    def __init__(self, patience=7, verbose=False, delta=0):\\n\",\n    \"        self.patience = patience # how many times will you tolerate for loss not being on decrease\\n\",\n    \"        self.verbose = verbose  # whether to print tip info\\n\",\n    \"        self.counter = 0 # now how many times loss not on decrease\\n\",\n    \"        self.best_score = None\\n\",\n    \"        self.early_stop = False\\n\",\n    \"        self.val_loss_min = np.inf\\n\",\n    \"        self.delta = delta\\n\",\n    \"\\n\",\n    \"    def __call__(self, val_loss, model, path):\\n\",\n    \"        score = -val_loss\\n\",\n    \"        if self.best_score is None:\\n\",\n    \"            self.best_score = score\\n\",\n    \"            self.save_checkpoint(val_loss, model, path)\\n\",\n    \"\\n\",\n    \"        # meaning: current score is not 'delta' better than best_score, representing that \\n\",\n    \"        # further training may not bring remarkable improvement in loss. \\n\",\n    \"        elif score < self.best_score + self.delta:  \\n\",\n    \"            self.counter += 1\\n\",\n    \"            print(f'EarlyStopping counter: {self.counter} out of {self.patience}')\\n\",\n    \"            # 'No Improvement' times become higher than patience --> Stop Further Training\\n\",\n    \"            if self.counter >= self.patience:\\n\",\n    \"                self.early_stop = True\\n\",\n    \"\\n\",\n    \"        else: #model's loss is still on decrease, save the now best model and go on training\\n\",\n    \"            self.best_score = score\\n\",\n    \"            self.save_checkpoint(val_loss, model, path)\\n\",\n    \"            self.counter = 0\\n\",\n    \"\\n\",\n    \"    def save_checkpoint(self, val_loss, model, path):\\n\",\n    \"    ### used for saving the current best model\\n\",\n    \"        if self.verbose:\\n\",\n    \"            print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')\\n\",\n    \"        torch.save(model.state_dict(), path + '/' + 'checkpoint.pth')\\n\",\n    \"        self.val_loss_min = val_loss\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 5.3 Optimizer and Criterion\\n\",\n    \"\\n\",\n    \"The optimizer and criterion are defined in <font color=orange>__class Exp_Long_Term_Forecast__</font> and called in the training process by function `self._select_optimizer()` and `self._select_criterion()`. Here, for long-term forecasting task, we simply adopt Adam optimizer and MSELoss to meature the loss between real data and predicted ones.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def _select_optimizer(self):\\n\",\n    \"    model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)\\n\",\n    \"    return model_optim\\n\",\n    \"\\n\",\n    \"def _select_criterion(self):\\n\",\n    \"    criterion = nn.MSELoss()\\n\",\n    \"    return criterion\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 5.4 Automatic Mixed Precision（AMP）\\n\",\n    \"\\n\",\n    \"AMP is a technique used in deep learning to improve training speed and reduce memory usage. AMP achieves this by mixing calculations in half-precision (16-bit floating-point) and single-precision (32-bit floating-point).\\n\",\n    \"\\n\",\n    \"Let's have a closer look on this snippet:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#in forward process:\\n\",\n    \"with torch.cuda.amp.autocast():\\n\",\n    \"\\n\",\n    \"...\\n\",\n    \"\\n\",\n    \"#in BP process:\\n\",\n    \"if self.args.use_amp:\\n\",\n    \"    scaler.scale(loss).backward()\\n\",\n    \"    scaler.step(model_optim)\\n\",\n    \"    scaler.update()\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"` with torch.cuda.amp.autocast():` :  The purpose of using torch.cuda.amp.autocast() is to take advantage of the speed and memory efficiency benefits of mixed-precision training while maintaining numerical stability. Some deep learning models can benefit significantly from this technique, especially on modern GPUs with hardware support for half-precision arithmetic. It allows you to perform certain calculations more quickly while still ensuring that critical calculations (e.g., gradient updates) are performed with sufficient precision to avoid loss of accuracy.\\n\",\n    \"\\n\",\n    \"`scaler.scale(loss).backward()`: If AMP is enabled, it uses a scaler object created with torch.cuda.amp.GradScaler() to automatically scale the loss and perform backward propagation. This is a crucial part of AMP, ensuring numerical stability. Before backpropagation, the loss is scaled to an appropriate range to prevent gradients from diverging too quickly or causing numerical instability.\\n\",\n    \"\\n\",\n    \"`scaler.step(model_optim)`: Next, the scaler calls the step method, which applies the scaled gradients to the model's optimizer (model_optim). This is used to update the model's weights to minimize the loss function.\\n\",\n    \"\\n\",\n    \"`scaler.update()`: Finally, the scaler calls the update method, which updates the scaling factor to ensure correct scaling of the loss for the next iteration. This step helps dynamically adjust the scaling of gradients to adapt to different training scenarios.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 5.5 Learning Rate Adjustment\\n\",\n    \"\\n\",\n    \"While the optimizer are responsible for adapting the learning rate with epochs, we would still like to do some adjustment on it manually, as indicated in the function `adjust_learning_rate(model_optim, epoch + 1, self.args)`, whose codes are shown below(original code is in `tools.py`): \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def adjust_learning_rate(optimizer, epoch, args):\\n\",\n    \"\\n\",\n    \"    #first type: learning rate decrease with epoch by exponential\\n\",\n    \"    if args.lradj == 'type1':\\n\",\n    \"        lr_adjust = {epoch: args.learning_rate * (0.5 ** ((epoch - 1) // 1))}\\n\",\n    \"\\n\",\n    \"    #second type: learning rate decrease manually\\n\",\n    \"    elif args.lradj == 'type2':\\n\",\n    \"        lr_adjust = {\\n\",\n    \"            2: 5e-5, 4: 1e-5, 6: 5e-6, 8: 1e-6,\\n\",\n    \"            10: 5e-7, 15: 1e-7, 20: 5e-8\\n\",\n    \"        }\\n\",\n    \"\\n\",\n    \"    #1st type: update in each epoch\\n\",\n    \"    #2nd type: only update in epochs that are written in Dict lr_adjust\\n\",\n    \"    if epoch in lr_adjust.keys():\\n\",\n    \"        lr = lr_adjust[epoch]\\n\",\n    \"    \\n\",\n    \"        # change the learning rate for different parameter groups within the optimizer\\n\",\n    \"        for param_group in optimizer.param_groups:\\n\",\n    \"            param_group['lr'] = lr\\n\",\n    \"        print('Updating learning rate to {}'.format(lr))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 6. Validation and Testing\\n\",\n    \"\\n\",\n    \"During training, the model continuously adjusts its weights and parameters to minimize training error. However, this may not reflect the model's performance on unseen data. Validation allows us to periodically assess the model's performance on data that is different from the training data, providing insights into the model's generalization ability.\\n\",\n    \"\\n\",\n    \"By comparing performance on the validation set, we can identify whether the model is overfitting. Overfitting occurs when a model performs well on training data but poorly on unseen data. Monitoring performance on the validation set helps detect overfitting early and take measures to prevent it, such as early stopping or adjusting hyperparameters.\\n\",\n    \"\\n\",\n    \"Here, we still take long-term forecasting as an example, similar to train process:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def vali(self, vali_data, vali_loader, criterion):\\n\",\n    \"        total_loss = []\\n\",\n    \"\\n\",\n    \"        #evaluation mode\\n\",\n    \"        self.model.eval()\\n\",\n    \"        with torch.no_grad():\\n\",\n    \"            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(vali_loader):\\n\",\n    \"                batch_x = batch_x.float().to(self.device)\\n\",\n    \"                batch_y = batch_y.float()\\n\",\n    \"\\n\",\n    \"                batch_x_mark = batch_x_mark.float().to(self.device)\\n\",\n    \"                batch_y_mark = batch_y_mark.float().to(self.device)\\n\",\n    \"\\n\",\n    \"                # decoder input\\n\",\n    \"                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\\n\",\n    \"                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\\n\",\n    \"                # encoder - decoder\\n\",\n    \"                if self.args.use_amp:\\n\",\n    \"                    with torch.cuda.amp.autocast():\\n\",\n    \"                        if self.args.output_attention:\\n\",\n    \"                            outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]\\n\",\n    \"                        else:\\n\",\n    \"                            outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\\n\",\n    \"                else:\\n\",\n    \"                    if self.args.output_attention:\\n\",\n    \"                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]\\n\",\n    \"                    else:\\n\",\n    \"                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\\n\",\n    \"                f_dim = -1 if self.args.features == 'MS' else 0\\n\",\n    \"                outputs = outputs[:, -self.args.pred_len:, f_dim:]\\n\",\n    \"                batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\\n\",\n    \"\\n\",\n    \"                pred = outputs.detach().cpu()\\n\",\n    \"                true = batch_y.detach().cpu()\\n\",\n    \"\\n\",\n    \"                loss = criterion(pred, true)\\n\",\n    \"\\n\",\n    \"                total_loss.append(loss)\\n\",\n    \"        total_loss = np.average(total_loss)\\n\",\n    \"        self.model.train()\\n\",\n    \"        return total_loss\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Testing is similar to validation, but it's purpose is to examine how well the model behaves, so it's common to add some visualization with __matplotlib.pyplot__. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"\\n\",\n    \"def visual(true, preds=None, name='./pic/test.pdf'):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Results visualization\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    plt.figure()\\n\",\n    \"    plt.plot(true, label='GroundTruth', linewidth=2)\\n\",\n    \"    if preds is not None:\\n\",\n    \"        plt.plot(preds, label='Prediction', linewidth=2)\\n\",\n    \"    plt.legend()\\n\",\n    \"    plt.savefig(name, bbox_inches='tight')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def test(self, setting, test=0):\\n\",\n    \"        test_data, test_loader = self._get_data(flag='test')\\n\",\n    \"        if test:\\n\",\n    \"            print('loading model')\\n\",\n    \"            self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth')))\\n\",\n    \"\\n\",\n    \"        preds = []\\n\",\n    \"        trues = []\\n\",\n    \"        folder_path = './test_results/' + setting + '/'\\n\",\n    \"        if not os.path.exists(folder_path):\\n\",\n    \"            os.makedirs(folder_path)\\n\",\n    \"\\n\",\n    \"        self.model.eval()\\n\",\n    \"        with torch.no_grad():\\n\",\n    \"            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader):\\n\",\n    \"                batch_x = batch_x.float().to(self.device)\\n\",\n    \"                batch_y = batch_y.float().to(self.device)\\n\",\n    \"\\n\",\n    \"                batch_x_mark = batch_x_mark.float().to(self.device)\\n\",\n    \"                batch_y_mark = batch_y_mark.float().to(self.device)\\n\",\n    \"\\n\",\n    \"                # decoder input\\n\",\n    \"                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()\\n\",\n    \"                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)\\n\",\n    \"                # encoder - decoder\\n\",\n    \"                if self.args.use_amp:\\n\",\n    \"                    with torch.cuda.amp.autocast():\\n\",\n    \"                        if self.args.output_attention:\\n\",\n    \"                            outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]\\n\",\n    \"                        else:\\n\",\n    \"                            outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\\n\",\n    \"                else:\\n\",\n    \"                    if self.args.output_attention:\\n\",\n    \"                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]\\n\",\n    \"\\n\",\n    \"                    else:\\n\",\n    \"                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\\n\",\n    \"\\n\",\n    \"                f_dim = -1 if self.args.features == 'MS' else 0\\n\",\n    \"                outputs = outputs[:, -self.args.pred_len:, f_dim:]\\n\",\n    \"                batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)\\n\",\n    \"                outputs = outputs.detach().cpu().numpy()\\n\",\n    \"                batch_y = batch_y.detach().cpu().numpy()\\n\",\n    \"\\n\",\n    \"                #inverse the data if scaled\\n\",\n    \"                if test_data.scale and self.args.inverse:\\n\",\n    \"                    outputs = test_data.inverse_transform(outputs)\\n\",\n    \"                    batch_y = test_data.inverse_transform(batch_y)\\n\",\n    \"\\n\",\n    \"                pred = outputs\\n\",\n    \"                true = batch_y\\n\",\n    \"\\n\",\n    \"                preds.append(pred)\\n\",\n    \"                trues.append(true)\\n\",\n    \"\\n\",\n    \"                #visualize one piece of data every 20\\n\",\n    \"                if i % 20 == 0:\\n\",\n    \"                    input = batch_x.detach().cpu().numpy()\\n\",\n    \"                    #the whole sequence\\n\",\n    \"                    gt = np.concatenate((input[0, :, -1], true[0, :, -1]), axis=0)\\n\",\n    \"                    pd = np.concatenate((input[0, :, -1], pred[0, :, -1]), axis=0)\\n\",\n    \"                    visual(gt, pd, os.path.join(folder_path, str(i) + '.pdf'))\\n\",\n    \"\\n\",\n    \"        preds = np.array(preds)\\n\",\n    \"        trues = np.array(trues)  # shape[batch_num, batch_size, pred_len, features]\\n\",\n    \"        print('test shape:', preds.shape, trues.shape)\\n\",\n    \"        preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1])\\n\",\n    \"        trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1])\\n\",\n    \"        print('test shape:', preds.shape, trues.shape)\\n\",\n    \"\\n\",\n    \"        # result save\\n\",\n    \"        folder_path = './results/' + setting + '/'\\n\",\n    \"        if not os.path.exists(folder_path):\\n\",\n    \"            os.makedirs(folder_path)\\n\",\n    \"\\n\",\n    \"        mae, mse, rmse, mape, mspe = metric(preds, trues)\\n\",\n    \"        print('mse:{}, mae:{}'.format(mse, mae))\\n\",\n    \"        f = open(\\\"result_long_term_forecast.txt\\\", 'a')\\n\",\n    \"        f.write(setting + \\\"  \\\\n\\\")\\n\",\n    \"        f.write('mse:{}, mae:{}'.format(mse, mae))\\n\",\n    \"        f.write('\\\\n')\\n\",\n    \"        f.write('\\\\n')\\n\",\n    \"        f.close()\\n\",\n    \"        \\n\",\n    \"        np.save(folder_path + 'metrics.npy', np.array([mae, mse, rmse, mape, mspe]))\\n\",\n    \"        np.save(folder_path + 'pred.npy', preds)\\n\",\n    \"        np.save(folder_path + 'true.npy', trues)\\n\",\n    \"\\n\",\n    \"        return\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 7. Dataloader and DataProvider\\n\",\n    \"\\n\",\n    \"In the process of training, we simply take the dataloader for granted, by the function `self._get_data(flag='train')`. So how does this line work? Have a look at the definition(in  <font color=orange>__class Exp_Long_Term_Forecast__</font>):\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def _get_data(self, flag):\\n\",\n    \"        data_set, data_loader = data_provider(self.args, flag)\\n\",\n    \"        return data_set, data_loader\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"One step forward, see `data_provider(self.args, flag)`(in `data_factory.py`):\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Below are some dataloaders defined in data_loader.py. If you want to add your own data, \\n\",\n    \"# go and check data_loader.py to rewrite a dataloader to fit your data.\\n\",\n    \"data_dict = {\\n\",\n    \"    'ETTh1': Dataset_ETT_hour,\\n\",\n    \"    'ETTh2': Dataset_ETT_hour,\\n\",\n    \"    'ETTm1': Dataset_ETT_minute,\\n\",\n    \"    'ETTm2': Dataset_ETT_minute,\\n\",\n    \"    'custom': Dataset_Custom,\\n\",\n    \"    'm4': Dataset_M4,\\n\",\n    \"    'PSM': PSMSegLoader,\\n\",\n    \"    'MSL': MSLSegLoader,\\n\",\n    \"    'SMAP': SMAPSegLoader,\\n\",\n    \"    'SMD': SMDSegLoader,\\n\",\n    \"    'SWAT': SWATSegLoader,\\n\",\n    \"    'UEA': UEAloader\\n\",\n    \"}\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def data_provider(args, flag):\\n\",\n    \"    Data = data_dict[args.data]  #data_provider\\n\",\n    \"\\n\",\n    \"    # time features encoding, options:[timeF, fixed, learned]\\n\",\n    \"    timeenc = 0 if args.embed != 'timeF' else 1\\n\",\n    \"\\n\",\n    \"    #test data provider\\n\",\n    \"    if flag == 'test':\\n\",\n    \"        shuffle_flag = False\\n\",\n    \"        drop_last = True\\n\",\n    \"        if args.task_name == 'anomaly_detection' or args.task_name == 'classification':\\n\",\n    \"            batch_size = args.batch_size\\n\",\n    \"\\n\",\n    \"        #Some tasks during the testing phase may require evaluating samples one at a time. \\n\",\n    \"        # This could be due to variations in sample sizes in the test data or because the \\n\",\n    \"        # evaluation process demands finer-grained results or different processing. \\n\",\n    \"        else:\\n\",\n    \"            batch_size = 1  # bsz=1 for evaluation\\n\",\n    \"\\n\",\n    \"        #freq for time features encoding, \\n\",\n    \"        # options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly,\\n\",\n    \"        #  m:monthly], you can also use more detailed freq like 15min or 3h')\\n\",\n    \"        freq = args.freq\\n\",\n    \"    else:\\n\",\n    \"        shuffle_flag = True\\n\",\n    \"        drop_last = True\\n\",\n    \"        batch_size = args.batch_size  # bsz for train and valid\\n\",\n    \"        freq = args.freq\\n\",\n    \"\\n\",\n    \"    if args.task_name == 'anomaly_detection':\\n\",\n    \"        drop_last = False\\n\",\n    \"        data_set = Data(\\n\",\n    \"            root_path=args.root_path, #root path of the data file\\n\",\n    \"            win_size=args.seq_len,    #input sequence length\\n\",\n    \"            flag=flag,\\n\",\n    \"        )\\n\",\n    \"        print(flag, len(data_set))\\n\",\n    \"        data_loader = DataLoader(\\n\",\n    \"            data_set,\\n\",\n    \"            batch_size=batch_size,\\n\",\n    \"            shuffle=shuffle_flag,\\n\",\n    \"            num_workers=args.num_workers,#data loader num workers\\n\",\n    \"            drop_last=drop_last)\\n\",\n    \"        return data_set, data_loader\\n\",\n    \"\\n\",\n    \"    elif args.task_name == 'classification':\\n\",\n    \"        drop_last = False\\n\",\n    \"        data_set = Data(\\n\",\n    \"            root_path=args.root_path,\\n\",\n    \"            flag=flag,\\n\",\n    \"        )\\n\",\n    \"\\n\",\n    \"        data_loader = DataLoader(\\n\",\n    \"            data_set,\\n\",\n    \"            batch_size=batch_size,\\n\",\n    \"            shuffle=shuffle_flag,\\n\",\n    \"            num_workers=args.num_workers,\\n\",\n    \"            drop_last=drop_last,\\n\",\n    \"            collate_fn=lambda x: collate_fn(x, max_len=args.seq_len) \\n\",\n    \"            #define some limits to collate pieces of data into batches\\n\",\n    \"        )\\n\",\n    \"        return data_set, data_loader\\n\",\n    \"    else:\\n\",\n    \"        if args.data == 'm4':\\n\",\n    \"            drop_last = False\\n\",\n    \"        data_set = Data(\\n\",\n    \"            root_path=args.root_path, #eg.  ./data/ETT/\\n\",\n    \"            data_path=args.data_path, #eg.  ETTh1.csv\\n\",\n    \"            flag=flag,\\n\",\n    \"            size=[args.seq_len, args.label_len, args.pred_len],\\n\",\n    \"            features=args.features,   #forecasting task, options:[M, S, MS]; \\n\",\n    \"            # M:multivariate predict multivariate, S:univariate predict univariate,\\n\",\n    \"            # MS:multivariate predict univariate\\n\",\n    \"            \\n\",\n    \"            target=args.target,       #target feature in S or MS task\\n\",\n    \"            timeenc=timeenc,\\n\",\n    \"            freq=freq,\\n\",\n    \"            seasonal_patterns=args.seasonal_patterns\\n\",\n    \"        )\\n\",\n    \"        print(flag, len(data_set))\\n\",\n    \"        data_loader = DataLoader(\\n\",\n    \"            data_set,\\n\",\n    \"            batch_size=batch_size,\\n\",\n    \"            shuffle=shuffle_flag,\\n\",\n    \"            num_workers=args.num_workers,\\n\",\n    \"            drop_last=drop_last)\\n\",\n    \"        return data_set, data_loader\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"From above, it's easy to find that data_provider is responsible for collate the dataset into batches according to different tasks and running mode. It passes the parameters to dataloader(`Data`) to instruct it how to manage a data file into pieces of usable data. Then it also generates the final dara_loader by passing the built-up dataset and some other params to the standard class Dataloader. After that, a dataset that fits the need of the model and a enumerable dataloader are generated. \\n\",\n    \"\\n\",\n    \"So how to organize the data file into pieces of data that fits the model? Let's see `data_loader.py`! There are many dataloaders in it, and of course you can write your own dataloader, but here we'll only focus on <font color=orange>__class Dataset_ETT_hour(Dataset)__</font> as an example.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Dataset_ETT_hour(Dataset):\\n\",\n    \"        def __init__(self, root_path, flag='train', size=None,\\n\",\n    \"                 features='S', data_path='ETTh1.csv',\\n\",\n    \"                 target='OT', scale=True, timeenc=0, freq='h', seasonal_patterns=None):\\n\",\n    \"                ...     \\n\",\n    \"        def __read_data__(self):\\n\",\n    \"                ...     \\n\",\n    \"        def __getitem__(self, index):\\n\",\n    \"                ...\\n\",\n    \"        \\n\",\n    \"        def __len__(self):\\n\",\n    \"                ...\\n\",\n    \"        \\n\",\n    \"        def inverse_transform(self, data):\\n\",\n    \"                ...\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`__init__()`  is the constructor used to initialize various parameters and attributes of the dataset. It takes a series of arguments, including the path to the data file, the dataset's flag (e.g., train, validate, test), dataset size, feature type, target variable, whether to scale the data, time encoding, time frequency, and more. These parameters are used to configure how the dataset is loaded and processed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def __init__(self, root_path, flag='train', size=None,\\n\",\n    \"             features='S', data_path='ETTh1.csv',\\n\",\n    \"             target='OT', scale=True, timeenc=0, freq='h', seasonal_patterns=None):\\n\",\n    \"    # size [seq_len, label_len, pred_len]\\n\",\n    \"    # info\\n\",\n    \"    if size == None:\\n\",\n    \"        self.seq_len = 24 * 4 * 4\\n\",\n    \"        self.label_len = 24 * 4\\n\",\n    \"        self.pred_len = 24 * 4\\n\",\n    \"    else:\\n\",\n    \"        self.seq_len = size[0]\\n\",\n    \"        self.label_len = size[1]\\n\",\n    \"        self.pred_len = size[2]\\n\",\n    \"    # init\\n\",\n    \"    assert flag in ['train', 'test', 'val']\\n\",\n    \"    type_map = {'train': 0, 'val': 1, 'test': 2}\\n\",\n    \"    self.set_type = type_map[flag]\\n\",\n    \"    self.features = features\\n\",\n    \"    self.target = target\\n\",\n    \"    self.scale = scale\\n\",\n    \"    self.timeenc = timeenc\\n\",\n    \"    self.freq = freq\\n\",\n    \"    self.root_path = root_path\\n\",\n    \"    self.data_path = data_path\\n\",\n    \"    \\n\",\n    \"    # After initialization, call __read_data__() to manage the data file.\\n\",\n    \"    self.__read_data__()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The actual process of managing data file into usable data pieces happens in `__read_data__()`, see below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def __read_data__(self):\\n\",\n    \"    self.scaler = StandardScaler()\\n\",\n    \"\\n\",\n    \"    #get raw data from path\\n\",\n    \"    df_raw = pd.read_csv(os.path.join(self.root_path,\\n\",\n    \"                                      self.data_path))\\n\",\n    \"\\n\",\n    \"    # split data set into train, vali, test. border1 is the left border and border2 is the right.\\n\",\n    \"    # Once flag(train, vali, test) is determined, __read_data__ will return certain part of the dataset.\\n\",\n    \"    border1s = [0, 12 * 30 * 24 - self.seq_len, 12 * 30 * 24 + 4 * 30 * 24 - self.seq_len]\\n\",\n    \"    border2s = [12 * 30 * 24, 12 * 30 * 24 + 4 * 30 * 24, 12 * 30 * 24 + 8 * 30 * 24]\\n\",\n    \"    border1 = border1s[self.set_type]\\n\",\n    \"    border2 = border2s[self.set_type]\\n\",\n    \"\\n\",\n    \"    #decide which columns to select\\n\",\n    \"    if self.features == 'M' or self.features == 'MS':\\n\",\n    \"        cols_data = df_raw.columns[1:] # column name list (remove 'date')\\n\",\n    \"        df_data = df_raw[cols_data]  #remove the first column, which is time stamp info\\n\",\n    \"    elif self.features == 'S':\\n\",\n    \"        df_data = df_raw[[self.target]] # target column\\n\",\n    \"\\n\",\n    \"    #scale data by the scaler that fits training data\\n\",\n    \"    if self.scale:\\n\",\n    \"        train_data = df_data[border1s[0]:border2s[0]]\\n\",\n    \"        #train_data.values: turn pandas DataFrame into 2D numpy\\n\",\n    \"        self.scaler.fit(train_data.values)  \\n\",\n    \"        data = self.scaler.transform(df_data.values)\\n\",\n    \"    else:\\n\",\n    \"        data = df_data.values \\n\",\n    \"    \\n\",\n    \"    #time stamp:df_stamp is a object of <class 'pandas.core.frame.DataFrame'> and\\n\",\n    \"    # has one column called 'date' like 2016-07-01 00:00:00\\n\",\n    \"    df_stamp = df_raw[['date']][border1:border2]\\n\",\n    \"    \\n\",\n    \"    # Since the date format is uncertain across different data file, we need to \\n\",\n    \"    # standardize it so we call func 'pd.to_datetime'\\n\",\n    \"    df_stamp['date'] = pd.to_datetime(df_stamp.date) \\n\",\n    \"\\n\",\n    \"    if self.timeenc == 0:  #time feature encoding is fixed or learned\\n\",\n    \"        df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1)\\n\",\n    \"        df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1)\\n\",\n    \"        df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1)\\n\",\n    \"        df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1)\\n\",\n    \"        #now df_frame has multiple columns recording the month, day etc. time stamp\\n\",\n    \"        # next we delete the 'date' column and turn 'DataFrame' to a list\\n\",\n    \"        data_stamp = df_stamp.drop(['date'], 1).values\\n\",\n    \"\\n\",\n    \"    elif self.timeenc == 1: #time feature encoding is timeF\\n\",\n    \"        '''\\n\",\n    \"         when entering this branch, we choose arg.embed as timeF meaning we want to \\n\",\n    \"         encode the temporal info. 'freq' should be the smallest time step, and has \\n\",\n    \"          options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')\\n\",\n    \"         So you should check the timestep of your data and set 'freq' arg. \\n\",\n    \"         After the time_features encoding, each date info format will be encoded into \\n\",\n    \"         a list, with each element denoting the relative position of this time point\\n\",\n    \"         (e.g. Day of Week, Day of Month, Hour of Day) and each normalized within scope[-0.5, 0.5]\\n\",\n    \"         '''\\n\",\n    \"        data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq)\\n\",\n    \"        data_stamp = data_stamp.transpose(1, 0)\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    # data_x and data_y are same copy of a certain part of data\\n\",\n    \"    self.data_x = data[border1:border2]\\n\",\n    \"    self.data_y = data[border1:border2]\\n\",\n    \"    self.data_stamp = data_stamp\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`__read_data__()` splits the dataset into 3 parts, selects the needed columns and manages time stamp info. It gives out the well-managed data array for later use. Next, we have to finish the overload of <font color=orange>__class Dataset__</font>, see `__getitem__(self, index)` and `__len__(self)`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def __getitem__(self, index):\\n\",\n    \"    #given an index, calculate the positions after this index to truncate the dataset\\n\",\n    \"    s_begin = index\\n\",\n    \"    s_end = s_begin + self.seq_len\\n\",\n    \"    r_begin = s_end - self.label_len\\n\",\n    \"    r_end = r_begin + self.label_len + self.pred_len\\n\",\n    \"\\n\",\n    \"    #input and output sequence\\n\",\n    \"    seq_x = self.data_x[s_begin:s_end]\\n\",\n    \"    seq_y = self.data_y[r_begin:r_end]\\n\",\n    \"\\n\",\n    \"    #time mark\\n\",\n    \"    seq_x_mark = self.data_stamp[s_begin:s_end]\\n\",\n    \"    seq_y_mark = self.data_stamp[r_begin:r_end]\\n\",\n    \"\\n\",\n    \"    return seq_x, seq_y, seq_x_mark, seq_y_mark\\n\",\n    \"\\n\",\n    \"def __len__(self):\\n\",\n    \"    return len(self.data_x) - self.seq_len - self.pred_len + 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also add an inverse_transform for scaler if needed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def inverse_transform(self, data):\\n\",\n    \"    return self.scaler.inverse_transform(data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"By now, we have finished constructing the dataset and dataloader. If you want to construct your own data and run it on the net, you can find proper data and try to accomplish the functions listed above. Here are some widely used datasets in times series analysis.\\n\",\n    \"\\n\",\n    \"![common dataset](./dataset.png)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 8. Running the Experiment and Visualizing Result\\n\",\n    \"\\n\",\n    \"After managing the data, model well, we need to write a shell script for the experiment. In the script, we need to run `run.py` with several arguments, which is part of the configuration. Here, let's see `TimesNet` on task long-term forecast with dataset ETTh1 for example.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"vscode\": {\n     \"languageId\": \"shellscript\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"model_name=TimesNet\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"python -u run.py \\\\\\n\",\n    \"  --task_name long_term_forecast \\\\\\n\",\n    \"  --is_training 1 \\\\\\n\",\n    \"  --root_path ./dataset/ETT-small/ \\\\\\n\",\n    \"  --data_path ETTh1.csv \\\\\\n\",\n    \"  --model_id ETTh1_96_96 \\\\\\n\",\n    \"  --model $model_name \\\\\\n\",\n    \"  --data ETTh1 \\\\\\n\",\n    \"  --features M \\\\\\n\",\n    \"  --seq_len 96 \\\\\\n\",\n    \"  --label_len 48 \\\\\\n\",\n    \"  --pred_len 96 \\\\\\n\",\n    \"  --e_layers 2 \\\\\\n\",\n    \"  --d_layers 1 \\\\\\n\",\n    \"  --factor 3 \\\\\\n\",\n    \"  --enc_in 7 \\\\\\n\",\n    \"  --dec_in 7 \\\\\\n\",\n    \"  --c_out 7 \\\\\\n\",\n    \"  --d_model 16 \\\\\\n\",\n    \"  --d_ff 32 \\\\\\n\",\n    \"  --des 'Exp' \\\\\\n\",\n    \"  --itr 1 \\\\\\n\",\n    \"  --top_k 5\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After finishing the shell script, you can run it in shell using bash. For example, you can run the following command, for `TimesNet` ETTh1 long-term forecast:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"vscode\": {\n     \"languageId\": \"shellscript\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"bash ./scripts/long_term_forecast/ETT_script/TimesNet_ETTh1.sh\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here, the bash command may not be successfully implemented due to a lack of proper packages in the environment. If that's the case, simply follow the error information to install the missing package step by step until you achieve success. The sign of a successful experiment running is that information about the experiment is printed out, such as:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"vscode\": {\n     \"languageId\": \"plaintext\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"Namespace(task_name='long_term_forecast', is_training=1, model_id='ETTh1_96_96', model='TimesNet', data='ETTh1', root_path='./dataset/ETT-small/', data_path='ETTh1.csv', features='M', target='OT', freq='h', checkpoints='./checkpoints/', seq_len=96, label_len=48, pred_len=96, seasonal_patterns='Monthly', inverse=False, mask_rate=0.25, anomaly_ratio=0.25, top_k=5, num_kernels=6, enc_in=7, dec_in=7, c_out=7, d_model=16, n_heads=8, e_layers=2, d_layers=1, d_ff=32, moving_avg=25, factor=3, distil=True, dropout=0.1, embed='timeF', activation='gelu', output_attention=False, num_workers=10, itr=1, train_epochs=10, batch_size=32, patience=3, learning_rate=0.0001, des='Exp', loss='MSE', lradj='type1', use_amp=False, use_gpu=False, gpu=0, use_multi_gpu=False, devices='0,1,2,3', p_hidden_dims=[128, 128], p_hidden_layers=2)\\n\",\n    \"Use GPU: cuda:0\\n\",\n    \">>>>>>>start training : long_term_forecast_ETTh1_96_96_TimesNet_ETTh1_ftM_sl96_ll48_pl96_dm16_nh8_el2_dl1_df32_fc3_ebtimeF_dtTrue_Exp_0>>>>>>>>>>>>>>>>>>>>>>>>>>\\n\",\n    \"train 8449\\n\",\n    \"val 2785\\n\",\n    \"test 2785\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Then, the model starts training. Once one epoch finishes training, information like below will be printer out：\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"vscode\": {\n     \"languageId\": \"plaintext\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"        iters: 100, epoch: 1 | loss: 0.4701951\\n\",\n    \"        speed: 0.2108s/iter; left time: 535.7317s\\n\",\n    \"        iters: 200, epoch: 1 | loss: 0.4496171\\n\",\n    \"        speed: 0.0615s/iter; left time: 150.0223s\\n\",\n    \"Epoch: 1 cost time: 30.09317970275879\\n\",\n    \"Epoch: 1, Steps: 264 | Train Loss: 0.4964185 Vali Loss: 0.8412074 Test Loss: 0.4290483\\n\",\n    \"Validation loss decreased (inf --> 0.841207).  Saving model ...\\n\",\n    \"Updating learning rate to 0.0001\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When all epochs are done, the model steps into testing. The following information about testing will be printed out, giving the MAE and MSE of test.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"vscode\": {\n     \"languageId\": \"plaintext\"\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \">>>>>>>testing : long_term_forecast_ETTh1_96_96_TimesNet_ETTh1_ftM_sl96_ll48_pl96_dm16_nh8_el2_dl1_df32_fc3_ebtimeF_dtTrue_Exp_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\\n\",\n    \"test 2785\\n\",\n    \"test shape: (2785, 1, 96, 7) (2785, 1, 96, 7)\\n\",\n    \"test shape: (2785, 96, 7) (2785, 96, 7)\\n\",\n    \"mse:0.3890332877635956, mae:0.41201362013816833\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After test finishes, some visible information are already stored in the test_results folder in PDF format. For example:\\n\",\n    \"\\n\",\n    \"![result ETTm1 2440](./result.png)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"language_info\": {\n   \"name\": \"python\"\n  },\n  \"orig_nbformat\": 4\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "utils/ADFtest.py",
    "content": "import pandas as pd\nimport numpy as np\nimport os\nfrom statsmodels.tsa.stattools import adfuller\nfrom arch.unitroot import ADF\n\ndef calculate_ADF(root_path,data_path):\n    df_raw = pd.read_csv(os.path.join(root_path,data_path))\n    cols = list(df_raw.columns)\n    cols.remove('date')\n    df_raw = df_raw[cols]\n    adf_list = []\n    for i in cols:\n        df_data = df_raw[i]\n        adf = adfuller(df_data, maxlag = 1)\n        print(adf)\n        adf_list.append(adf)\n    return np.array(adf_list)\n\ndef calculate_target_ADF(root_path,data_path,target='OT'):\n    df_raw = pd.read_csv(os.path.join(root_path,data_path))\n    target_cols = target.split(',')\n    # df_data = df_raw[target]\n    df_raw = df_raw[target_cols]\n    adf_list = []\n    for i in target_cols:\n        df_data = df_raw[i]\n        adf = adfuller(df_data, maxlag = 1)\n        # print(adf)\n        adf_list.append(adf)\n    return np.array(adf_list)\n\ndef archADF(root_path, data_path):\n    df = pd.read_csv(os.path.join(root_path,data_path))\n    cols = df.columns[1:]\n    stats = 0\n    for target_col in cols:\n        series = df[target_col].values\n        adf = ADF(series)\n        stat = adf.stat\n        stats += stat\n    return stats/len(cols)\n\nif __name__ == '__main__':\n\n    # * Exchange - result: -1.902402344564288 | report: -1.889\n    ADFmetric = archADF(root_path=\"./dataset/exchange_rate/\",data_path=\"exchange_rate.csv\")\n    print(\"Exchange ADF metric\", ADFmetric)\n\n    # * Illness - result: -5.33416661870624 | report: -5.406\n    ADFmetric = archADF(root_path=\"./dataset/illness/\",data_path=\"national_illness.csv\") \n    print(\"Illness ADF metric\", ADFmetric)\n\n    # * ETTm2 - result: -5.663628743471695 | report: -6.225\n    ADFmetric = archADF(root_path=\"./dataset/ETT-small/\",data_path=\"ETTm2.csv\")\n    print(\"ETTm2 ADF metric\", ADFmetric)\n\n    # * Electricity - result: -8.44485821939281 | report: -8.483\n    ADFmetric = archADF(root_path=\"./dataset/electricity/\",data_path=\"electricity.csv\")\n    print(\"Electricity ADF metric\", ADFmetric)\n\n    # * Traffic - result: -15.020978067839014 | report: -15.046\n    ADFmetric = archADF(root_path=\"./dataset/traffic/\",data_path=\"traffic.csv\")\n    print(\"Traffic ADF metric\", ADFmetric)\n\n    # * Weather - result: -26.681433085204866 | report: -26.661\n    ADFmetric = archADF(root_path=\"./dataset/weather/\",data_path=\"weather.csv\")\n    print(\"Weather ADF metric\", ADFmetric)\n\n\n    # print(ADFmetric)\n\n    # mean_ADFmetric = ADFmetric[:,0].mean()\n    # print(mean_ADFmetric)"
  },
  {
    "path": "utils/__init__.py",
    "content": ""
  },
  {
    "path": "utils/augmentation.py",
    "content": "import numpy as np\nfrom tqdm import tqdm\n\ndef jitter(x, sigma=0.03):\n    # https://arxiv.org/pdf/1706.00527.pdf\n    return x + np.random.normal(loc=0., scale=sigma, size=x.shape)\n\n\ndef scaling(x, sigma=0.1):\n    # https://arxiv.org/pdf/1706.00527.pdf\n    factor = np.random.normal(loc=1., scale=sigma, size=(x.shape[0],x.shape[2]))\n    return np.multiply(x, factor[:,np.newaxis,:])\n\ndef rotation(x):\n    x = np.array(x)\n    flip = np.random.choice([-1, 1], size=(x.shape[0],x.shape[2]))\n    rotate_axis = np.arange(x.shape[2])\n    np.random.shuffle(rotate_axis)\n    return flip[:,np.newaxis,:] * x[:,:,rotate_axis]\n\ndef permutation(x, max_segments=5, seg_mode=\"equal\"):\n    orig_steps = np.arange(x.shape[1])\n    \n    num_segs = np.random.randint(1, max_segments, size=(x.shape[0]))\n    \n    ret = np.zeros_like(x)\n    for i, pat in enumerate(x):\n        if num_segs[i] > 1:\n            if seg_mode == \"random\":\n                split_points = np.random.choice(x.shape[1]-2, num_segs[i]-1, replace=False)\n                split_points.sort()\n                splits = np.split(orig_steps, split_points)\n            else:\n                splits = np.array_split(orig_steps, num_segs[i])\n            warp = np.concatenate(np.random.permutation(splits)).ravel()\n            # ? Question: What is the point of making segments?\n            # for i in range(len(splits)):\n            #     permute = np.random.permutation(splits[i])\n\n\n            ret[i] = pat[warp]\n        else:\n            ret[i] = pat\n    return ret\n\ndef magnitude_warp(x, sigma=0.2, knot=4):\n    from scipy.interpolate import CubicSpline\n    orig_steps = np.arange(x.shape[1])\n    \n    random_warps = np.random.normal(loc=1.0, scale=sigma, size=(x.shape[0], knot+2, x.shape[2]))\n    warp_steps = (np.ones((x.shape[2],1))*(np.linspace(0, x.shape[1]-1., num=knot+2))).T\n    ret = np.zeros_like(x)\n    for i, pat in enumerate(x):\n        warper = np.array([CubicSpline(warp_steps[:,dim], random_warps[i,:,dim])(orig_steps) for dim in range(x.shape[2])]).T\n        ret[i] = pat * warper\n\n    return ret\n\ndef time_warp(x, sigma=0.2, knot=4):\n    from scipy.interpolate import CubicSpline\n    orig_steps = np.arange(x.shape[1])\n    \n    random_warps = np.random.normal(loc=1.0, scale=sigma, size=(x.shape[0], knot+2, x.shape[2]))\n    warp_steps = (np.ones((x.shape[2],1))*(np.linspace(0, x.shape[1]-1., num=knot+2))).T\n    \n    ret = np.zeros_like(x)\n    for i, pat in enumerate(x):\n        for dim in range(x.shape[2]):\n            time_warp = CubicSpline(warp_steps[:,dim], warp_steps[:,dim] * random_warps[i,:,dim])(orig_steps)\n            scale = (x.shape[1]-1)/time_warp[-1]\n            ret[i,:,dim] = np.interp(orig_steps, np.clip(scale*time_warp, 0, x.shape[1]-1), pat[:,dim]).T\n    return ret\n\ndef window_slice(x, reduce_ratio=0.9):\n    # https://halshs.archives-ouvertes.fr/halshs-01357973/document\n    target_len = np.ceil(reduce_ratio*x.shape[1]).astype(int)\n    if target_len >= x.shape[1]:\n        return x\n    starts = np.random.randint(low=0, high=x.shape[1]-target_len, size=(x.shape[0])).astype(int)\n    ends = (target_len + starts).astype(int)\n    \n    ret = np.zeros_like(x)\n    for i, pat in enumerate(x):\n        for dim in range(x.shape[2]):\n            ret[i,:,dim] = np.interp(np.linspace(0, target_len, num=x.shape[1]), np.arange(target_len), pat[starts[i]:ends[i],dim]).T\n    return ret\n\ndef window_warp(x, window_ratio=0.1, scales=[0.5, 2.]):\n    # https://halshs.archives-ouvertes.fr/halshs-01357973/document\n    warp_scales = np.random.choice(scales, x.shape[0])\n    warp_size = np.ceil(window_ratio*x.shape[1]).astype(int)\n    window_steps = np.arange(warp_size)\n        \n    window_starts = np.random.randint(low=1, high=x.shape[1]-warp_size-1, size=(x.shape[0])).astype(int)\n    window_ends = (window_starts + warp_size).astype(int)\n            \n    ret = np.zeros_like(x)\n    for i, pat in enumerate(x):\n        for dim in range(x.shape[2]):\n            start_seg = pat[:window_starts[i],dim]\n            window_seg = np.interp(np.linspace(0, warp_size-1, num=int(warp_size*warp_scales[i])), window_steps, pat[window_starts[i]:window_ends[i],dim])\n            end_seg = pat[window_ends[i]:,dim]\n            warped = np.concatenate((start_seg, window_seg, end_seg))                \n            ret[i,:,dim] = np.interp(np.arange(x.shape[1]), np.linspace(0, x.shape[1]-1., num=warped.size), warped).T\n    return ret\n\ndef spawner(x, labels, sigma=0.05, verbose=0):\n    # https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6983028/\n    # use verbose=-1 to turn off warnings\n    # use verbose=1 to print out figures\n    \n    import utils.dtw as dtw\n    random_points = np.random.randint(low=1, high=x.shape[1]-1, size=x.shape[0])\n    window = np.ceil(x.shape[1] / 10.).astype(int)\n    orig_steps = np.arange(x.shape[1])\n    l = np.argmax(labels, axis=1) if labels.ndim > 1 else labels\n    \n    ret = np.zeros_like(x)\n    # for i, pat in enumerate(tqdm(x)):\n    for i, pat in enumerate(x):\n        # guarentees that same one isnt selected\n        choices = np.delete(np.arange(x.shape[0]), i)\n        # remove ones of different classes\n        choices = np.where(l[choices] == l[i])[0]\n        if choices.size > 0:     \n            random_sample = x[np.random.choice(choices)]\n            # SPAWNER splits the path into two randomly\n            path1 = dtw.dtw(pat[:random_points[i]], random_sample[:random_points[i]], dtw.RETURN_PATH, slope_constraint=\"symmetric\", window=window)\n            path2 = dtw.dtw(pat[random_points[i]:], random_sample[random_points[i]:], dtw.RETURN_PATH, slope_constraint=\"symmetric\", window=window)\n            combined = np.concatenate((np.vstack(path1), np.vstack(path2+random_points[i])), axis=1)\n            if verbose:\n                # print(random_points[i])\n                dtw_value, cost, DTW_map, path = dtw.dtw(pat, random_sample, return_flag = dtw.RETURN_ALL, slope_constraint=slope_constraint, window=window)\n                dtw.draw_graph1d(cost, DTW_map, path, pat, random_sample)\n                dtw.draw_graph1d(cost, DTW_map, combined, pat, random_sample)\n            mean = np.mean([pat[combined[0]], random_sample[combined[1]]], axis=0)\n            for dim in range(x.shape[2]):\n                ret[i,:,dim] = np.interp(orig_steps, np.linspace(0, x.shape[1]-1., num=mean.shape[0]), mean[:,dim]).T\n        else:\n            # if verbose > -1:\n            #     print(\"There is only one pattern of class {}, skipping pattern average\".format(l[i]))\n            ret[i,:] = pat\n    return jitter(ret, sigma=sigma)\n\ndef wdba(x, labels, batch_size=6, slope_constraint=\"symmetric\", use_window=True, verbose=0):\n    # https://ieeexplore.ieee.org/document/8215569\n    # use verbose = -1 to turn off warnings    \n    # slope_constraint is for DTW. \"symmetric\" or \"asymmetric\"\n    x = np.array(x)\n    import utils.dtw as dtw\n    \n    if use_window:\n        window = np.ceil(x.shape[1] / 10.).astype(int)\n    else:\n        window = None\n    orig_steps = np.arange(x.shape[1])\n    l = np.argmax(labels, axis=1) if labels.ndim > 1 else labels\n        \n    ret = np.zeros_like(x)\n    # for i in tqdm(range(ret.shape[0])):\n    for i in range(ret.shape[0]):\n        # get the same class as i\n        choices = np.where(l == l[i])[0]\n        if choices.size > 0:        \n            # pick random intra-class pattern\n            k = min(choices.size, batch_size)\n            random_prototypes = x[np.random.choice(choices, k, replace=False)]\n            \n            # calculate dtw between all\n            dtw_matrix = np.zeros((k, k))\n            for p, prototype in enumerate(random_prototypes):\n                for s, sample in enumerate(random_prototypes):\n                    if p == s:\n                        dtw_matrix[p, s] = 0.\n                    else:\n                        dtw_matrix[p, s] = dtw.dtw(prototype, sample, dtw.RETURN_VALUE, slope_constraint=slope_constraint, window=window)\n                        \n            # get medoid\n            medoid_id = np.argsort(np.sum(dtw_matrix, axis=1))[0]\n            nearest_order = np.argsort(dtw_matrix[medoid_id])\n            medoid_pattern = random_prototypes[medoid_id]\n            \n            # start weighted DBA\n            average_pattern = np.zeros_like(medoid_pattern)\n            weighted_sums = np.zeros((medoid_pattern.shape[0]))\n            for nid in nearest_order:\n                if nid == medoid_id or dtw_matrix[medoid_id, nearest_order[1]] == 0.:\n                    average_pattern += medoid_pattern\n                    weighted_sums += np.ones_like(weighted_sums) \n                else:\n                    path = dtw.dtw(medoid_pattern, random_prototypes[nid], dtw.RETURN_PATH, slope_constraint=slope_constraint, window=window)\n                    dtw_value = dtw_matrix[medoid_id, nid]\n                    warped = random_prototypes[nid, path[1]]\n                    weight = np.exp(np.log(0.5)*dtw_value/dtw_matrix[medoid_id, nearest_order[1]])\n                    average_pattern[path[0]] += weight * warped\n                    weighted_sums[path[0]] += weight \n            \n            ret[i,:] = average_pattern / weighted_sums[:,np.newaxis]\n        else:\n            # if verbose > -1:\n            #     print(\"There is only one pattern of class {}, skipping pattern average\".format(l[i]))\n            ret[i,:] = x[i]\n    return ret\n\n# Proposed\n\ndef random_guided_warp(x, labels, slope_constraint=\"symmetric\", use_window=True, dtw_type=\"normal\", verbose=0):\n    # use verbose = -1 to turn off warnings\n    # slope_constraint is for DTW. \"symmetric\" or \"asymmetric\"\n    # dtw_type is for shapeDTW or DTW. \"normal\" or \"shape\"\n    \n    import utils.dtw as dtw\n    \n    if use_window:\n        window = np.ceil(x.shape[1] / 10.).astype(int)\n    else:\n        window = None\n    orig_steps = np.arange(x.shape[1])\n    l = np.argmax(labels, axis=1) if labels.ndim > 1 else labels\n    \n    ret = np.zeros_like(x)\n    # for i, pat in enumerate(tqdm(x)):\n    for i, pat in enumerate(x):\n        # guarentees that same one isnt selected\n        choices = np.delete(np.arange(x.shape[0]), i)\n        # remove ones of different classes\n        choices = np.where(l[choices] == l[i])[0]\n        if choices.size > 0:        \n            # pick random intra-class pattern\n            random_prototype = x[np.random.choice(choices)]\n            \n            if dtw_type == \"shape\":\n                path = dtw.shape_dtw(random_prototype, pat, dtw.RETURN_PATH, slope_constraint=slope_constraint, window=window)\n            else:\n                path = dtw.dtw(random_prototype, pat, dtw.RETURN_PATH, slope_constraint=slope_constraint, window=window)\n                            \n            # Time warp\n            warped = pat[path[1]]\n            for dim in range(x.shape[2]):\n                ret[i,:,dim] = np.interp(orig_steps, np.linspace(0, x.shape[1]-1., num=warped.shape[0]), warped[:,dim]).T\n        else:\n            # if verbose > -1:\n            #     print(\"There is only one pattern of class {}, skipping timewarping\".format(l[i]))\n            ret[i,:] = pat\n    return ret\n\ndef random_guided_warp_shape(x, labels, slope_constraint=\"symmetric\", use_window=True):\n    return random_guided_warp(x, labels, slope_constraint, use_window, dtw_type=\"shape\")\n\ndef discriminative_guided_warp(x, labels, batch_size=6, slope_constraint=\"symmetric\", use_window=True, dtw_type=\"normal\", use_variable_slice=True, verbose=0):\n    # use verbose = -1 to turn off warnings\n    # slope_constraint is for DTW. \"symmetric\" or \"asymmetric\"\n    # dtw_type is for shapeDTW or DTW. \"normal\" or \"shape\"\n    \n    import utils.dtw as dtw\n    \n    if use_window:\n        window = np.ceil(x.shape[1] / 10.).astype(int)\n    else:\n        window = None\n    orig_steps = np.arange(x.shape[1])\n    l = np.argmax(labels, axis=1) if labels.ndim > 1 else labels\n    \n    positive_batch = np.ceil(batch_size / 2).astype(int)\n    negative_batch = np.floor(batch_size / 2).astype(int)\n        \n    ret = np.zeros_like(x)\n    warp_amount = np.zeros(x.shape[0])\n    # for i, pat in enumerate(tqdm(x)):\n    for i, pat in enumerate(x):\n        # guarentees that same one isnt selected\n        choices = np.delete(np.arange(x.shape[0]), i)\n        \n        # remove ones of different classes\n        positive = np.where(l[choices] == l[i])[0]\n        negative = np.where(l[choices] != l[i])[0]\n        \n        if positive.size > 0 and negative.size > 0:\n            pos_k = min(positive.size, positive_batch)\n            neg_k = min(negative.size, negative_batch)\n            positive_prototypes = x[np.random.choice(positive, pos_k, replace=False)]\n            negative_prototypes = x[np.random.choice(negative, neg_k, replace=False)]\n                        \n            # vector embedding and nearest prototype in one\n            pos_aves = np.zeros((pos_k))\n            neg_aves = np.zeros((pos_k))\n            if dtw_type == \"shape\":\n                for p, pos_prot in enumerate(positive_prototypes):\n                    for ps, pos_samp in enumerate(positive_prototypes):\n                        if p != ps:\n                            pos_aves[p] += (1./(pos_k-1.))*dtw.shape_dtw(pos_prot, pos_samp, dtw.RETURN_VALUE, slope_constraint=slope_constraint, window=window)\n                    for ns, neg_samp in enumerate(negative_prototypes):\n                        neg_aves[p] += (1./neg_k)*dtw.shape_dtw(pos_prot, neg_samp, dtw.RETURN_VALUE, slope_constraint=slope_constraint, window=window)\n                selected_id = np.argmax(neg_aves - pos_aves)\n                path = dtw.shape_dtw(positive_prototypes[selected_id], pat, dtw.RETURN_PATH, slope_constraint=slope_constraint, window=window)\n            else:\n                for p, pos_prot in enumerate(positive_prototypes):\n                    for ps, pos_samp in enumerate(positive_prototypes):\n                        if p != ps:\n                            pos_aves[p] += (1./(pos_k-1.))*dtw.dtw(pos_prot, pos_samp, dtw.RETURN_VALUE, slope_constraint=slope_constraint, window=window)\n                    for ns, neg_samp in enumerate(negative_prototypes):\n                        neg_aves[p] += (1./neg_k)*dtw.dtw(pos_prot, neg_samp, dtw.RETURN_VALUE, slope_constraint=slope_constraint, window=window)\n                selected_id = np.argmax(neg_aves - pos_aves)\n                path = dtw.dtw(positive_prototypes[selected_id], pat, dtw.RETURN_PATH, slope_constraint=slope_constraint, window=window)\n                   \n            # Time warp\n            warped = pat[path[1]]\n            warp_path_interp = np.interp(orig_steps, np.linspace(0, x.shape[1]-1., num=warped.shape[0]), path[1])\n            warp_amount[i] = np.sum(np.abs(orig_steps-warp_path_interp))\n            for dim in range(x.shape[2]):\n                ret[i,:,dim] = np.interp(orig_steps, np.linspace(0, x.shape[1]-1., num=warped.shape[0]), warped[:,dim]).T\n        else:\n            # if verbose > -1:\n            #     print(\"There is only one pattern of class {}\".format(l[i]))\n            ret[i,:] = pat\n            warp_amount[i] = 0.\n    if use_variable_slice:\n        max_warp = np.max(warp_amount)\n        if max_warp == 0:\n            # unchanged\n            ret = window_slice(ret, reduce_ratio=0.9)\n        else:\n            for i, pat in enumerate(ret):\n                # Variable Sllicing\n                ret[i] = window_slice(pat[np.newaxis,:,:], reduce_ratio=0.9+0.1*warp_amount[i]/max_warp)[0]\n    return ret\n\ndef discriminative_guided_warp_shape(x, labels, batch_size=6, slope_constraint=\"symmetric\", use_window=True):\n    return discriminative_guided_warp(x, labels, batch_size, slope_constraint, use_window, dtw_type=\"shape\")\n\n\ndef run_augmentation(x, y, args):\n    print(\"Augmenting %s\"%args.data)\n    np.random.seed(args.seed)\n    x_aug = x\n    y_aug = y\n    if args.augmentation_ratio > 0:\n        augmentation_tags = \"%d\"%args.augmentation_ratio\n        for n in range(args.augmentation_ratio):\n            x_temp, augmentation_tags = augment(x, y, args)\n            x_aug = np.append(x_aug, x_temp, axis=0)\n            y_aug = np.append(y_aug, y, axis=0)\n            print(\"Round %d: %s done\"%(n, augmentation_tags))\n        if args.extra_tag:\n            augmentation_tags += \"_\"+args.extra_tag\n    else:\n        augmentation_tags = args.extra_tag\n    return x_aug, y_aug, augmentation_tags\n\ndef run_augmentation_single(x, y, args):\n    # print(\"Augmenting %s\"%args.data)\n    np.random.seed(args.seed)\n\n    x_aug = x\n    y_aug = y\n\n\n    if len(x.shape)<3:\n        # Augmenting on the entire series: using the input data as \"One Big Batch\"\n        #   Before  -   (sequence_length, num_channels)\n        #   After   -   (1, sequence_length, num_channels)\n        # Note: the 'sequence_length' here is actually the length of the entire series\n        x_input = x[np.newaxis,:]\n    elif len(x.shape)==3:\n        # Augmenting on the batch series: keep current dimension (batch_size, sequence_length, num_channels)\n        x_input = x\n    else:\n        raise ValueError(\"Input must be (batch_size, sequence_length, num_channels) dimensional\")\n\n    if args.augmentation_ratio > 0:\n        augmentation_tags = \"%d\"%args.augmentation_ratio\n        for n in range(args.augmentation_ratio):\n            x_aug, augmentation_tags = augment(x_input, y, args)\n            # print(\"Round %d: %s done\"%(n, augmentation_tags))\n        if args.extra_tag:\n            augmentation_tags += \"_\"+args.extra_tag\n    else:\n        augmentation_tags = args.extra_tag\n\n    if(len(x.shape)<3):\n        # Reverse to two-dimensional in whole series augmentation scenario\n        x_aug = x_aug.squeeze(0)\n    return x_aug, y_aug, augmentation_tags\n\n\ndef augment(x, y, args):\n    import utils.augmentation as aug\n    augmentation_tags = \"\"\n    if args.jitter:\n        x = aug.jitter(x)\n        augmentation_tags += \"_jitter\"\n    if args.scaling:\n        x = aug.scaling(x)\n        augmentation_tags += \"_scaling\"\n    if args.rotation:\n        x = aug.rotation(x)\n        augmentation_tags += \"_rotation\"\n    if args.permutation:\n        x = aug.permutation(x)\n        augmentation_tags += \"_permutation\"\n    if args.randompermutation:\n        x = aug.permutation(x, seg_mode=\"random\")\n        augmentation_tags += \"_randomperm\"\n    if args.magwarp:\n        x = aug.magnitude_warp(x)\n        augmentation_tags += \"_magwarp\"\n    if args.timewarp:\n        x = aug.time_warp(x)\n        augmentation_tags += \"_timewarp\"\n    if args.windowslice:\n        x = aug.window_slice(x)\n        augmentation_tags += \"_windowslice\"\n    if args.windowwarp:\n        x = aug.window_warp(x)\n        augmentation_tags += \"_windowwarp\"\n    if args.spawner:\n        x = aug.spawner(x, y)\n        augmentation_tags += \"_spawner\"\n    if args.dtwwarp:\n        x = aug.random_guided_warp(x, y)\n        augmentation_tags += \"_rgw\"\n    if args.shapedtwwarp:\n        x = aug.random_guided_warp_shape(x, y)\n        augmentation_tags += \"_rgws\"\n    if args.wdba:\n        x = aug.wdba(x, y)\n        augmentation_tags += \"_wdba\"\n    if args.discdtw:\n        x = aug.discriminative_guided_warp(x, y)\n        augmentation_tags += \"_dgw\"\n    if args.discsdtw:\n        x = aug.discriminative_guided_warp_shape(x, y)\n        augmentation_tags += \"_dgws\"\n    return x, augmentation_tags\n"
  },
  {
    "path": "utils/dtw.py",
    "content": "__author__ = 'Brian Iwana'\n\nimport numpy as np\nimport math\nimport sys\n\nRETURN_VALUE = 0\nRETURN_PATH = 1\nRETURN_ALL = -1\n\n# Core DTW\ndef _traceback(DTW, slope_constraint):\n    i, j = np.array(DTW.shape) - 1\n    p, q = [i-1], [j-1]\n    \n    if slope_constraint == \"asymmetric\":\n        while (i > 1):\n            tb = np.argmin((DTW[i-1, j], DTW[i-1, j-1], DTW[i-1, j-2]))\n\n            if (tb == 0):\n                i = i - 1\n            elif (tb == 1):\n                i = i - 1\n                j = j - 1\n            elif (tb == 2):\n                i = i - 1\n                j = j - 2\n\n            p.insert(0, i-1)\n            q.insert(0, j-1)\n    elif slope_constraint == \"symmetric\":\n        while (i > 1 or j > 1):\n            tb = np.argmin((DTW[i-1, j-1], DTW[i-1, j], DTW[i, j-1]))\n\n            if (tb == 0):\n                i = i - 1\n                j = j - 1\n            elif (tb == 1):\n                i = i - 1\n            elif (tb == 2):\n                j = j - 1\n\n            p.insert(0, i-1)\n            q.insert(0, j-1)\n    else:\n        sys.exit(\"Unknown slope constraint %s\"%slope_constraint)\n        \n    return (np.array(p), np.array(q))\n\ndef dtw(prototype, sample, return_flag = RETURN_VALUE, slope_constraint=\"asymmetric\", window=None):\n    \"\"\" Computes the DTW of two sequences.\n    :param prototype: np array [0..b]\n    :param sample: np array [0..t]\n    :param extended: bool\n    \"\"\"\n    p = prototype.shape[0]\n    assert p != 0, \"Prototype empty!\"\n    s = sample.shape[0]\n    assert s != 0, \"Sample empty!\"\n    \n    if window is None:\n        window = s\n    \n    cost = np.full((p, s), np.inf)\n    for i in range(p):\n        start = max(0, i-window)\n        end = min(s, i+window)+1\n        cost[i,start:end]=np.linalg.norm(sample[start:end] - prototype[i], axis=1)\n\n    DTW = _cummulative_matrix(cost, slope_constraint, window)\n        \n    if return_flag == RETURN_ALL:\n        return DTW[-1,-1], cost, DTW[1:,1:], _traceback(DTW, slope_constraint)\n    elif return_flag == RETURN_PATH:\n        return _traceback(DTW, slope_constraint)\n    else:\n        return DTW[-1,-1]\n\ndef _cummulative_matrix(cost, slope_constraint, window):\n    p = cost.shape[0]\n    s = cost.shape[1]\n    \n    # Note: DTW is one larger than cost and the original patterns\n    DTW = np.full((p+1, s+1), np.inf)\n\n    DTW[0, 0] = 0.0\n\n    if slope_constraint == \"asymmetric\":\n        for i in range(1, p+1):\n            if i <= window+1:\n                DTW[i,1] = cost[i-1,0] + min(DTW[i-1,0], DTW[i-1,1])\n            for j in range(max(2, i-window), min(s, i+window)+1):\n                DTW[i,j] = cost[i-1,j-1] + min(DTW[i-1,j-2], DTW[i-1,j-1], DTW[i-1,j])\n    elif slope_constraint == \"symmetric\":\n        for i in range(1, p+1):\n            for j in range(max(1, i-window), min(s, i+window)+1):\n                DTW[i,j] = cost[i-1,j-1] + min(DTW[i-1,j-1], DTW[i,j-1], DTW[i-1,j])\n    else:\n        sys.exit(\"Unknown slope constraint %s\"%slope_constraint)\n        \n    return DTW\n\ndef shape_dtw(prototype, sample, return_flag = RETURN_VALUE, slope_constraint=\"asymmetric\", window=None, descr_ratio=0.05):\n    \"\"\" Computes the shapeDTW of two sequences.\n    :param prototype: np array [0..b]\n    :param sample: np array [0..t]\n    :param extended: bool\n    \"\"\"\n    # shapeDTW\n    # https://www.sciencedirect.com/science/article/pii/S0031320317303710\n    \n    p = prototype.shape[0]\n    assert p != 0, \"Prototype empty!\"\n    s = sample.shape[0]\n    assert s != 0, \"Sample empty!\"\n    \n    if window is None:\n        window = s\n        \n    p_feature_len = np.clip(np.round(p * descr_ratio), 5, 100).astype(int)\n    s_feature_len = np.clip(np.round(s * descr_ratio), 5, 100).astype(int)\n    \n    # padding\n    p_pad_front = (np.ceil(p_feature_len / 2.)).astype(int)\n    p_pad_back = (np.floor(p_feature_len / 2.)).astype(int)\n    s_pad_front = (np.ceil(s_feature_len / 2.)).astype(int)\n    s_pad_back = (np.floor(s_feature_len / 2.)).astype(int)\n    \n    prototype_pad = np.pad(prototype, ((p_pad_front, p_pad_back), (0, 0)), mode=\"edge\") \n    sample_pad = np.pad(sample, ((s_pad_front, s_pad_back), (0, 0)), mode=\"edge\") \n    p_p = prototype_pad.shape[0]\n    s_p = sample_pad.shape[0]\n        \n    cost = np.full((p, s), np.inf)\n    for i in range(p):\n        for j in range(max(0, i-window), min(s, i+window)):\n            cost[i, j] = np.linalg.norm(sample_pad[j:j+s_feature_len] - prototype_pad[i:i+p_feature_len])\n            \n    DTW = _cummulative_matrix(cost, slope_constraint=slope_constraint, window=window)\n    \n    if return_flag == RETURN_ALL:\n        return DTW[-1,-1], cost, DTW[1:,1:], _traceback(DTW, slope_constraint)\n    elif return_flag == RETURN_PATH:\n        return _traceback(DTW, slope_constraint)\n    else:\n        return DTW[-1,-1]\n    \n# Draw helpers\ndef draw_graph2d(cost, DTW, path, prototype, sample):\n    import matplotlib.pyplot as plt\n    plt.figure(figsize=(12, 8))\n   # plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05, hspace=.01)\n\n    #cost\n    plt.subplot(2, 3, 1)\n    plt.imshow(cost.T, cmap=plt.cm.gray, interpolation='none', origin='lower')\n    plt.plot(path[0], path[1], 'y')\n    plt.xlim((-0.5, cost.shape[0]-0.5))\n    plt.ylim((-0.5, cost.shape[0]-0.5))\n\n    #dtw\n    plt.subplot(2, 3, 2)\n    plt.imshow(DTW.T, cmap=plt.cm.gray, interpolation='none', origin='lower')\n    plt.plot(path[0]+1, path[1]+1, 'y')\n    plt.xlim((-0.5, DTW.shape[0]-0.5))\n    plt.ylim((-0.5, DTW.shape[0]-0.5))\n\n    #prototype\n    plt.subplot(2, 3, 4)\n    plt.plot(prototype[:,0], prototype[:,1], 'b-o')\n\n    #connection\n    plt.subplot(2, 3, 5)\n    for i in range(0,path[0].shape[0]):\n        plt.plot([prototype[path[0][i],0], sample[path[1][i],0]],[prototype[path[0][i],1], sample[path[1][i],1]], 'y-')\n    plt.plot(sample[:,0], sample[:,1], 'g-o')\n    plt.plot(prototype[:,0], prototype[:,1], 'b-o')\n\n    #sample\n    plt.subplot(2, 3, 6)\n    plt.plot(sample[:,0], sample[:,1], 'g-o')\n\n    plt.tight_layout()\n    plt.show()\n\ndef draw_graph1d(cost, DTW, path, prototype, sample):\n    import matplotlib.pyplot as plt\n    plt.figure(figsize=(12, 8))\n   # plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05, hspace=.01)\n    p_steps = np.arange(prototype.shape[0])\n    s_steps = np.arange(sample.shape[0])\n\n    #cost\n    plt.subplot(2, 3, 1)\n    plt.imshow(cost.T, cmap=plt.cm.gray, interpolation='none', origin='lower')\n    plt.plot(path[0], path[1], 'y')\n    plt.xlim((-0.5, cost.shape[0]-0.5))\n    plt.ylim((-0.5, cost.shape[0]-0.5))\n\n    #dtw\n    plt.subplot(2, 3, 2)\n    plt.imshow(DTW.T, cmap=plt.cm.gray, interpolation='none', origin='lower')\n    plt.plot(path[0]+1, path[1]+1, 'y')\n    plt.xlim((-0.5, DTW.shape[0]-0.5))\n    plt.ylim((-0.5, DTW.shape[0]-0.5))\n\n    #prototype\n    plt.subplot(2, 3, 4)\n    plt.plot(p_steps, prototype[:,0], 'b-o')\n\n    #connection\n    plt.subplot(2, 3, 5)\n    for i in range(0,path[0].shape[0]):\n        plt.plot([path[0][i], path[1][i]],[prototype[path[0][i],0], sample[path[1][i],0]], 'y-')\n    plt.plot(p_steps, sample[:,0], 'g-o')\n    plt.plot(s_steps, prototype[:,0], 'b-o')\n\n    #sample\n    plt.subplot(2, 3, 6)\n    plt.plot(s_steps, sample[:,0], 'g-o')\n\n    plt.tight_layout()\n    plt.show()"
  },
  {
    "path": "utils/dtw_metric.py",
    "content": "from numpy import array, zeros, full, argmin, inf, ndim\nfrom scipy.spatial.distance import cdist\nfrom math import isinf\n\n\ndef dtw(x, y, dist, warp=1, w=inf, s=1.0):\n    \"\"\"\n    Computes Dynamic Time Warping (DTW) of two sequences.\n\n    :param array x: N1*M array\n    :param array y: N2*M array\n    :param func dist: distance used as cost measure\n    :param int warp: how many shifts are computed.\n    :param int w: window size limiting the maximal distance between indices of matched entries |i,j|.\n    :param float s: weight applied on off-diagonal moves of the path. As s gets larger, the warping path is increasingly biased towards the diagonal\n    Returns the minimum distance, the cost matrix, the accumulated cost matrix, and the wrap path.\n    \"\"\"\n    assert len(x)\n    assert len(y)\n    assert isinf(w) or (w >= abs(len(x) - len(y)))\n    assert s > 0\n    r, c = len(x), len(y)\n    if not isinf(w):\n        D0 = full((r + 1, c + 1), inf)\n        for i in range(1, r + 1):\n            D0[i, max(1, i - w):min(c + 1, i + w + 1)] = 0\n        D0[0, 0] = 0\n    else:\n        D0 = zeros((r + 1, c + 1))\n        D0[0, 1:] = inf\n        D0[1:, 0] = inf\n    D1 = D0[1:, 1:]  # view\n    for i in range(r):\n        for j in range(c):\n            if (isinf(w) or (max(0, i - w) <= j <= min(c, i + w))):\n                D1[i, j] = dist(x[i], y[j])\n    C = D1.copy()\n    jrange = range(c)\n    for i in range(r):\n        if not isinf(w):\n            jrange = range(max(0, i - w), min(c, i + w + 1))\n        for j in jrange:\n            min_list = [D0[i, j]]\n            for k in range(1, warp + 1):\n                i_k = min(i + k, r)\n                j_k = min(j + k, c)\n                min_list += [D0[i_k, j] * s, D0[i, j_k] * s]\n            D1[i, j] += min(min_list)\n    if len(x) == 1:\n        path = zeros(len(y)), range(len(y))\n    elif len(y) == 1:\n        path = range(len(x)), zeros(len(x))\n    else:\n        path = _traceback(D0)\n    return D1[-1, -1], C, D1, path\n\n\ndef accelerated_dtw(x, y, dist, warp=1):\n    \"\"\"\n    Computes Dynamic Time Warping (DTW) of two sequences in a faster way.\n    Instead of iterating through each element and calculating each distance,\n    this uses the cdist function from scipy (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html)\n\n    :param array x: N1*M array\n    :param array y: N2*M array\n    :param string or func dist: distance parameter for cdist. When string is given, cdist uses optimized functions for the distance metrics.\n    If a string is passed, the distance function can be 'braycurtis', 'canberra', 'chebyshev', 'cityblock', 'correlation', 'cosine', 'dice', 'euclidean', 'hamming', 'jaccard', 'kulsinski', 'mahalanobis', 'matching', 'minkowski', 'rogerstanimoto', 'russellrao', 'seuclidean', 'sokalmichener', 'sokalsneath', 'sqeuclidean', 'wminkowski', 'yule'.\n    :param int warp: how many shifts are computed.\n    Returns the minimum distance, the cost matrix, the accumulated cost matrix, and the wrap path.\n    \"\"\"\n    assert len(x)\n    assert len(y)\n    if ndim(x) == 1:\n        x = x.reshape(-1, 1)\n    if ndim(y) == 1:\n        y = y.reshape(-1, 1)\n    r, c = len(x), len(y)\n    D0 = zeros((r + 1, c + 1))\n    D0[0, 1:] = inf\n    D0[1:, 0] = inf\n    D1 = D0[1:, 1:]\n    D0[1:, 1:] = cdist(x, y, dist)\n    C = D1.copy()\n    for i in range(r):\n        for j in range(c):\n            min_list = [D0[i, j]]\n            for k in range(1, warp + 1):\n                min_list += [D0[min(i + k, r), j],\n                             D0[i, min(j + k, c)]]\n            D1[i, j] += min(min_list)\n    if len(x) == 1:\n        path = zeros(len(y)), range(len(y))\n    elif len(y) == 1:\n        path = range(len(x)), zeros(len(x))\n    else:\n        path = _traceback(D0)\n    return D1[-1, -1], C, D1, path\n\n\ndef _traceback(D):\n    i, j = array(D.shape) - 2\n    p, q = [i], [j]\n    while (i > 0) or (j > 0):\n        tb = argmin((D[i, j], D[i, j + 1], D[i + 1, j]))\n        if tb == 0:\n            i -= 1\n            j -= 1\n        elif tb == 1:\n            i -= 1\n        else:  # (tb == 2):\n            j -= 1\n        p.insert(0, i)\n        q.insert(0, j)\n    return array(p), array(q)\n\n\nif __name__ == '__main__':\n    w = inf\n    s = 1.0\n    if 1:  # 1-D numeric\n        from sklearn.metrics.pairwise import manhattan_distances\n        x = [0, 0, 1, 1, 2, 4, 2, 1, 2, 0]\n        y = [1, 1, 1, 2, 2, 2, 2, 3, 2, 0]\n        dist_fun = manhattan_distances\n        w = 1\n        # s = 1.2\n    elif 0:  # 2-D numeric\n        from sklearn.metrics.pairwise import euclidean_distances\n        x = [[0, 0], [0, 1], [1, 1], [1, 2], [2, 2], [4, 3], [2, 3], [1, 1], [2, 2], [0, 1]]\n        y = [[1, 0], [1, 1], [1, 1], [2, 1], [4, 3], [4, 3], [2, 3], [3, 1], [1, 2], [1, 0]]\n        dist_fun = euclidean_distances\n    else:  # 1-D list of strings\n        from nltk.metrics.distance import edit_distance\n        # x = ['we', 'shelled', 'clams', 'for', 'the', 'chowder']\n        # y = ['class', 'too']\n        x = ['i', 'soon', 'found', 'myself', 'muttering', 'to', 'the', 'walls']\n        y = ['see', 'drown', 'himself']\n        # x = 'we talked about the situation'.split()\n        # y = 'we talked about the situation'.split()\n        dist_fun = edit_distance\n    dist, cost, acc, path = dtw(x, y, dist_fun, w=w, s=s)\n\n    # Vizualize\n    from matplotlib import pyplot as plt\n    plt.imshow(cost.T, origin='lower', cmap=plt.cm.Reds, interpolation='nearest')\n    plt.plot(path[0], path[1], '-o')  # relation\n    plt.xticks(range(len(x)), x)\n    plt.yticks(range(len(y)), y)\n    plt.xlabel('x')\n    plt.ylabel('y')\n    plt.axis('tight')\n    if isinf(w):\n        plt.title('Minimum distance: {}, slope weight: {}'.format(dist, s))\n    else:\n        plt.title('Minimum distance: {}, window widht: {}, slope weight: {}'.format(dist, w, s))\n    plt.show()"
  },
  {
    "path": "utils/losses.py",
    "content": "# This source code is provided for the purposes of scientific reproducibility\n# under the following limited license from Element AI Inc. The code is an\n# implementation of the N-BEATS model (Oreshkin et al., N-BEATS: Neural basis\n# expansion analysis for interpretable time series forecasting,\n# https://arxiv.org/abs/1905.10437). The copyright to the source code is\n# licensed under the Creative Commons - Attribution-NonCommercial 4.0\n# International license (CC BY-NC 4.0):\n# https://creativecommons.org/licenses/by-nc/4.0/.  Any commercial use (whether\n# for the benefit of third parties or internally in production) requires an\n# explicit license. The subject-matter of the N-BEATS model and associated\n# materials are the property of Element AI Inc. and may be subject to patent\n# protection. No license to patents is granted hereunder (whether express or\n# implied). Copyright © 2020 Element AI Inc. All rights reserved.\n\n\"\"\"\nLoss functions for PyTorch.\n\"\"\"\n\nimport torch as t\nimport torch.nn as nn\nimport numpy as np\nimport pdb\n\n\ndef divide_no_nan(a, b):\n    \"\"\"\n    a/b where the resulted NaN or Inf are replaced by 0.\n    \"\"\"\n    result = a / b\n    result[result != result] = .0\n    result[result == np.inf] = .0\n    return result\n\n\nclass mape_loss(nn.Module):\n    def __init__(self):\n        super(mape_loss, self).__init__()\n\n    def forward(self, insample: t.Tensor, freq: int,\n                forecast: t.Tensor, target: t.Tensor, mask: t.Tensor) -> t.float:\n        \"\"\"\n        MAPE loss as defined in: https://en.wikipedia.org/wiki/Mean_absolute_percentage_error\n\n        :param forecast: Forecast values. Shape: batch, time\n        :param target: Target values. Shape: batch, time\n        :param mask: 0/1 mask. Shape: batch, time\n        :return: Loss value\n        \"\"\"\n        weights = divide_no_nan(mask, target)\n        return t.mean(t.abs((forecast - target) * weights))\n\n\nclass smape_loss(nn.Module):\n    def __init__(self):\n        super(smape_loss, self).__init__()\n\n    def forward(self, insample: t.Tensor, freq: int,\n                forecast: t.Tensor, target: t.Tensor, mask: t.Tensor) -> t.float:\n        \"\"\"\n        sMAPE loss as defined in https://robjhyndman.com/hyndsight/smape/ (Makridakis 1993)\n\n        :param forecast: Forecast values. Shape: batch, time\n        :param target: Target values. Shape: batch, time\n        :param mask: 0/1 mask. Shape: batch, time\n        :return: Loss value\n        \"\"\"\n        return 200 * t.mean(divide_no_nan(t.abs(forecast - target),\n                                          t.abs(forecast.data) + t.abs(target.data)) * mask)\n\n\nclass mase_loss(nn.Module):\n    def __init__(self):\n        super(mase_loss, self).__init__()\n\n    def forward(self, insample: t.Tensor, freq: int,\n                forecast: t.Tensor, target: t.Tensor, mask: t.Tensor) -> t.float:\n        \"\"\"\n        MASE loss as defined in \"Scaled Errors\" https://robjhyndman.com/papers/mase.pdf\n\n        :param insample: Insample values. Shape: batch, time_i\n        :param freq: Frequency value\n        :param forecast: Forecast values. Shape: batch, time_o\n        :param target: Target values. Shape: batch, time_o\n        :param mask: 0/1 mask. Shape: batch, time_o\n        :return: Loss value\n        \"\"\"\n        masep = t.mean(t.abs(insample[:, freq:] - insample[:, :-freq]), dim=1)\n        masked_masep_inv = divide_no_nan(mask, masep[:, None])\n        return t.mean(t.abs(target - forecast) * masked_masep_inv)\n"
  },
  {
    "path": "utils/m4_summary.py",
    "content": "# This source code is provided for the purposes of scientific reproducibility\n# under the following limited license from Element AI Inc. The code is an\n# implementation of the N-BEATS model (Oreshkin et al., N-BEATS: Neural basis\n# expansion analysis for interpretable time series forecasting,\n# https://arxiv.org/abs/1905.10437). The copyright to the source code is\n# licensed under the Creative Commons - Attribution-NonCommercial 4.0\n# International license (CC BY-NC 4.0):\n# https://creativecommons.org/licenses/by-nc/4.0/.  Any commercial use (whether\n# for the benefit of third parties or internally in production) requires an\n# explicit license. The subject-matter of the N-BEATS model and associated\n# materials are the property of Element AI Inc. and may be subject to patent\n# protection. No license to patents is granted hereunder (whether express or\n# implied). Copyright 2020 Element AI Inc. All rights reserved.\n\n\"\"\"\nM4 Summary\n\"\"\"\nfrom collections import OrderedDict\n\nimport numpy as np\nimport pandas as pd\n\nfrom data_provider.m4 import M4Dataset\nfrom data_provider.m4 import M4Meta\nimport os\n\n\ndef group_values(values, groups, group_name):\n    return np.array([v[~np.isnan(v)] for v in values[groups == group_name]])\n\n\ndef mase(forecast, insample, outsample, frequency):\n    return np.mean(np.abs(forecast - outsample)) / np.mean(np.abs(insample[:-frequency] - insample[frequency:]))\n\n\ndef smape_2(forecast, target):\n    denom = np.abs(target) + np.abs(forecast)\n    # divide by 1.0 instead of 0.0, in case when denom is zero the enumerator will be 0.0 anyway.\n    denom[denom == 0.0] = 1.0\n    return 200 * np.abs(forecast - target) / denom\n\n\ndef mape(forecast, target):\n    denom = np.abs(target)\n    # divide by 1.0 instead of 0.0, in case when denom is zero the enumerator will be 0.0 anyway.\n    denom[denom == 0.0] = 1.0\n    return 100 * np.abs(forecast - target) / denom\n\n\nclass M4Summary:\n    def __init__(self, file_path, root_path):\n        self.file_path = file_path\n        self.training_set = M4Dataset.load(training=True, dataset_file=root_path)\n        self.test_set = M4Dataset.load(training=False, dataset_file=root_path)\n        self.naive_path = os.path.join(root_path, 'submission-Naive2.csv')\n\n    def evaluate(self):\n        \"\"\"\n        Evaluate forecasts using M4 test dataset.\n\n        :param forecast: Forecasts. Shape: timeseries, time.\n        :return: sMAPE and OWA grouped by seasonal patterns.\n        \"\"\"\n        grouped_owa = OrderedDict()\n\n        naive2_forecasts = pd.read_csv(self.naive_path).values[:, 1:].astype(np.float32)\n        naive2_forecasts = np.array([v[~np.isnan(v)] for v in naive2_forecasts])\n\n        model_mases = {}\n        naive2_smapes = {}\n        naive2_mases = {}\n        grouped_smapes = {}\n        grouped_mapes = {}\n        for group_name in M4Meta.seasonal_patterns:\n            file_name = self.file_path + group_name + \"_forecast.csv\"\n            if os.path.exists(file_name):\n                model_forecast = pd.read_csv(file_name).values\n\n            naive2_forecast = group_values(naive2_forecasts, self.test_set.groups, group_name)\n            target = group_values(self.test_set.values, self.test_set.groups, group_name)\n            # all timeseries within group have same frequency\n            frequency = self.training_set.frequencies[self.test_set.groups == group_name][0]\n            insample = group_values(self.training_set.values, self.test_set.groups, group_name)\n\n            model_mases[group_name] = np.mean([mase(forecast=model_forecast[i],\n                                                    insample=insample[i],\n                                                    outsample=target[i],\n                                                    frequency=frequency) for i in range(len(model_forecast))])\n            naive2_mases[group_name] = np.mean([mase(forecast=naive2_forecast[i],\n                                                     insample=insample[i],\n                                                     outsample=target[i],\n                                                     frequency=frequency) for i in range(len(model_forecast))])\n\n            naive2_smapes[group_name] = np.mean(smape_2(naive2_forecast, target))\n            grouped_smapes[group_name] = np.mean(smape_2(forecast=model_forecast, target=target))\n            grouped_mapes[group_name] = np.mean(mape(forecast=model_forecast, target=target))\n\n        grouped_smapes = self.summarize_groups(grouped_smapes)\n        grouped_mapes = self.summarize_groups(grouped_mapes)\n        grouped_model_mases = self.summarize_groups(model_mases)\n        grouped_naive2_smapes = self.summarize_groups(naive2_smapes)\n        grouped_naive2_mases = self.summarize_groups(naive2_mases)\n        for k in grouped_model_mases.keys():\n            grouped_owa[k] = (grouped_model_mases[k] / grouped_naive2_mases[k] +\n                              grouped_smapes[k] / grouped_naive2_smapes[k]) / 2\n\n        def round_all(d):\n            return dict(map(lambda kv: (kv[0], np.round(kv[1], 3)), d.items()))\n\n        return round_all(grouped_smapes), round_all(grouped_owa), round_all(grouped_mapes), round_all(\n            grouped_model_mases)\n\n    def summarize_groups(self, scores):\n        \"\"\"\n        Re-group scores respecting M4 rules.\n        :param scores: Scores per group.\n        :return: Grouped scores.\n        \"\"\"\n        scores_summary = OrderedDict()\n\n        def group_count(group_name):\n            return len(np.where(self.test_set.groups == group_name)[0])\n\n        weighted_score = {}\n        for g in ['Yearly', 'Quarterly', 'Monthly']:\n            weighted_score[g] = scores[g] * group_count(g)\n            scores_summary[g] = scores[g]\n\n        others_score = 0\n        others_count = 0\n        for g in ['Weekly', 'Daily', 'Hourly']:\n            others_score += scores[g] * group_count(g)\n            others_count += group_count(g)\n        weighted_score['Others'] = others_score\n        scores_summary['Others'] = others_score / others_count\n\n        average = np.sum(list(weighted_score.values())) / len(self.test_set.groups)\n        scores_summary['Average'] = average\n\n        return scores_summary\n"
  },
  {
    "path": "utils/masking.py",
    "content": "import torch\n\n\nclass TriangularCausalMask():\n    def __init__(self, B, L, device=\"cpu\"):\n        mask_shape = [B, 1, L, L]\n        with torch.no_grad():\n            self._mask = torch.triu(torch.ones(mask_shape, dtype=torch.bool), diagonal=1).to(device)\n\n    @property\n    def mask(self):\n        return self._mask\n\n\nclass ProbMask():\n    def __init__(self, B, H, L, index, scores, device=\"cpu\"):\n        _mask = torch.ones(L, scores.shape[-1], dtype=torch.bool).to(device).triu(1)\n        _mask_ex = _mask[None, None, :].expand(B, H, L, scores.shape[-1])\n        indicator = _mask_ex[torch.arange(B)[:, None, None],\n                    torch.arange(H)[None, :, None],\n                    index, :].to(device)\n        self._mask = indicator.view(scores.shape).to(device)\n\n    @property\n    def mask(self):\n        return self._mask\n"
  },
  {
    "path": "utils/metrics.py",
    "content": "import numpy as np\n\n\ndef RSE(pred, true):\n    return np.sqrt(np.sum((true - pred) ** 2)) / np.sqrt(np.sum((true - true.mean()) ** 2))\n\n\ndef CORR(pred, true):\n    u = ((true - true.mean(0)) * (pred - pred.mean(0))).sum(0)\n    d = np.sqrt(((true - true.mean(0)) ** 2 * (pred - pred.mean(0)) ** 2).sum(0))\n    return (u / d).mean(-1)\n\n\ndef MAE(pred, true):\n    return np.mean(np.abs(true - pred))\n\n\ndef MSE(pred, true):\n    return np.mean((true - pred) ** 2)\n\n\ndef RMSE(pred, true):\n    return np.sqrt(MSE(pred, true))\n\n\ndef MAPE(pred, true):\n    return np.mean(np.abs((true - pred) / true))\n\n\ndef MSPE(pred, true):\n    return np.mean(np.square((true - pred) / true))\n\n\ndef metric(pred, true):\n    mae = MAE(pred, true)\n    mse = MSE(pred, true)\n    rmse = RMSE(pred, true)\n    mape = MAPE(pred, true)\n    mspe = MSPE(pred, true)\n\n    return mae, mse, rmse, mape, mspe\n"
  },
  {
    "path": "utils/print_args.py",
    "content": "def print_args(args):\n    print(\"\\033[1m\" + \"Basic Config\" + \"\\033[0m\")\n    print(f'  {\"Task Name:\":<20}{args.task_name:<20}{\"Is Training:\":<20}{args.is_training:<20}')\n    print(f'  {\"Model ID:\":<20}{args.model_id:<20}{\"Model:\":<20}{args.model:<20}')\n    print()\n\n    print(\"\\033[1m\" + \"Data Loader\" + \"\\033[0m\")\n    print(f'  {\"Data:\":<20}{args.data:<20}{\"Root Path:\":<20}{args.root_path:<20}')\n    print(f'  {\"Data Path:\":<20}{args.data_path:<20}{\"Features:\":<20}{args.features:<20}')\n    print(f'  {\"Target:\":<20}{args.target:<20}{\"Freq:\":<20}{args.freq:<20}')\n    print(f'  {\"Checkpoints:\":<20}{args.checkpoints:<20}')\n    print()\n\n    if args.task_name in ['long_term_forecast', 'short_term_forecast']:\n        print(\"\\033[1m\" + \"Forecasting Task\" + \"\\033[0m\")\n        print(f'  {\"Seq Len:\":<20}{args.seq_len:<20}{\"Label Len:\":<20}{args.label_len:<20}')\n        print(f'  {\"Pred Len:\":<20}{args.pred_len:<20}{\"Seasonal Patterns:\":<20}{args.seasonal_patterns:<20}')\n        print(f'  {\"Inverse:\":<20}{args.inverse:<20}')\n        print()\n\n    if args.task_name == 'imputation':\n        print(\"\\033[1m\" + \"Imputation Task\" + \"\\033[0m\")\n        print(f'  {\"Mask Rate:\":<20}{args.mask_rate:<20}')\n        print()\n\n    if args.task_name == 'anomaly_detection':\n        print(\"\\033[1m\" + \"Anomaly Detection Task\" + \"\\033[0m\")\n        print(f'  {\"Anomaly Ratio:\":<20}{args.anomaly_ratio:<20}')\n        print()\n\n    print(\"\\033[1m\" + \"Model Parameters\" + \"\\033[0m\")\n    print(f'  {\"Top k:\":<20}{args.top_k:<20}{\"Num Kernels:\":<20}{args.num_kernels:<20}')\n    print(f'  {\"Enc In:\":<20}{args.enc_in:<20}{\"Dec In:\":<20}{args.dec_in:<20}')\n    print(f'  {\"C Out:\":<20}{args.c_out:<20}{\"d model:\":<20}{args.d_model:<20}')\n    print(f'  {\"n heads:\":<20}{args.n_heads:<20}{\"e layers:\":<20}{args.e_layers:<20}')\n    print(f'  {\"d layers:\":<20}{args.d_layers:<20}{\"d FF:\":<20}{args.d_ff:<20}')\n    print(f'  {\"Moving Avg:\":<20}{args.moving_avg:<20}{\"Factor:\":<20}{args.factor:<20}')\n    print(f'  {\"Distil:\":<20}{args.distil:<20}{\"Dropout:\":<20}{args.dropout:<20}')\n    print(f'  {\"Embed:\":<20}{args.embed:<20}{\"Activation:\":<20}{args.activation:<20}')\n    print()\n\n    print(\"\\033[1m\" + \"Run Parameters\" + \"\\033[0m\")\n    print(f'  {\"Num Workers:\":<20}{args.num_workers:<20}{\"Itr:\":<20}{args.itr:<20}')\n    print(f'  {\"Train Epochs:\":<20}{args.train_epochs:<20}{\"Batch Size:\":<20}{args.batch_size:<20}')\n    print(f'  {\"Patience:\":<20}{args.patience:<20}{\"Learning Rate:\":<20}{args.learning_rate:<20}')\n    print(f'  {\"Des:\":<20}{args.des:<20}{\"Loss:\":<20}{args.loss:<20}')\n    print(f'  {\"Lradj:\":<20}{args.lradj:<20}{\"Use Amp:\":<20}{args.use_amp:<20}')\n    print()\n\n    print(\"\\033[1m\" + \"GPU\" + \"\\033[0m\")\n    print(f'  {\"Use GPU:\":<20}{args.use_gpu:<20}{\"GPU:\":<20}{args.gpu:<20}')\n    print(f'  {\"Use Multi GPU:\":<20}{args.use_multi_gpu:<20}{\"Devices:\":<20}{args.devices:<20}')\n    print()\n\n    print(\"\\033[1m\" + \"De-stationary Projector Params\" + \"\\033[0m\")\n    p_hidden_dims_str = ', '.join(map(str, args.p_hidden_dims))\n    print(f'  {\"P Hidden Dims:\":<20}{p_hidden_dims_str:<20}{\"P Hidden Layers:\":<20}{args.p_hidden_layers:<20}') \n    print()\n"
  },
  {
    "path": "utils/timefeatures.py",
    "content": "# From: gluonts/src/gluonts/time_feature/_base.py\n# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\").\n# You may not use this file except in compliance with the License.\n# A copy of the License is located at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# or in the \"license\" file accompanying this file. This file is distributed\n# on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n# express or implied. See the License for the specific language governing\n# permissions and limitations under the License.\n\nfrom typing import List\n\nimport numpy as np\nimport pandas as pd\nfrom pandas.tseries import offsets\nfrom pandas.tseries.frequencies import to_offset\n\n\nclass TimeFeature:\n    def __init__(self):\n        pass\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        pass\n\n    def __repr__(self):\n        return self.__class__.__name__ + \"()\"\n\n\nclass SecondOfMinute(TimeFeature):\n    \"\"\"Minute of hour encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return index.second / 59.0 - 0.5\n\n\nclass MinuteOfHour(TimeFeature):\n    \"\"\"Minute of hour encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return index.minute / 59.0 - 0.5\n\n\nclass HourOfDay(TimeFeature):\n    \"\"\"Hour of day encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return index.hour / 23.0 - 0.5\n\n\nclass DayOfWeek(TimeFeature):\n    \"\"\"Hour of day encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return index.dayofweek / 6.0 - 0.5\n\n\nclass DayOfMonth(TimeFeature):\n    \"\"\"Day of month encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return (index.day - 1) / 30.0 - 0.5\n\n\nclass DayOfYear(TimeFeature):\n    \"\"\"Day of year encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return (index.dayofyear - 1) / 365.0 - 0.5\n\n\nclass MonthOfYear(TimeFeature):\n    \"\"\"Month of year encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return (index.month - 1) / 11.0 - 0.5\n\n\nclass WeekOfYear(TimeFeature):\n    \"\"\"Week of year encoded as value between [-0.5, 0.5]\"\"\"\n\n    def __call__(self, index: pd.DatetimeIndex) -> np.ndarray:\n        return (index.isocalendar().week - 1) / 52.0 - 0.5\n\n\ndef time_features_from_frequency_str(freq_str: str) -> List[TimeFeature]:\n    \"\"\"\n    Returns a list of time features that will be appropriate for the given frequency string.\n    Parameters\n    ----------\n    freq_str\n        Frequency string of the form [multiple][granularity] such as \"12H\", \"5min\", \"1D\" etc.\n    \"\"\"\n\n    features_by_offsets = {\n        offsets.YearEnd: [],\n        offsets.QuarterEnd: [MonthOfYear],\n        offsets.MonthEnd: [MonthOfYear],\n        offsets.Week: [DayOfMonth, WeekOfYear],\n        offsets.Day: [DayOfWeek, DayOfMonth, DayOfYear],\n        offsets.BusinessDay: [DayOfWeek, DayOfMonth, DayOfYear],\n        offsets.Hour: [HourOfDay, DayOfWeek, DayOfMonth, DayOfYear],\n        offsets.Minute: [\n            MinuteOfHour,\n            HourOfDay,\n            DayOfWeek,\n            DayOfMonth,\n            DayOfYear,\n        ],\n        offsets.Second: [\n            SecondOfMinute,\n            MinuteOfHour,\n            HourOfDay,\n            DayOfWeek,\n            DayOfMonth,\n            DayOfYear,\n        ],\n    }\n\n    offset = to_offset(freq_str)\n\n    for offset_type, feature_classes in features_by_offsets.items():\n        if isinstance(offset, offset_type):\n            return [cls() for cls in feature_classes]\n\n    supported_freq_msg = f\"\"\"\n    Unsupported frequency {freq_str}\n    The following frequencies are supported:\n        Y   - yearly\n            alias: A\n        M   - monthly\n        W   - weekly\n        D   - daily\n        B   - business days\n        H   - hourly\n        T   - minutely\n            alias: min\n        S   - secondly\n    \"\"\"\n    raise RuntimeError(supported_freq_msg)\n\n\ndef time_features(dates, freq='h'):\n    return np.vstack([feat(dates) for feat in time_features_from_frequency_str(freq)])\n"
  },
  {
    "path": "utils/tools.py",
    "content": "import os\n\nimport numpy as np\nimport torch\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport math\n\nplt.switch_backend('agg')\n\n\ndef adjust_learning_rate(optimizer, epoch, args):\n    # lr = args.learning_rate * (0.2 ** (epoch // 2))\n    if args.lradj == 'type1':\n        lr_adjust = {epoch: args.learning_rate * (0.5 ** ((epoch - 1) // 1))}\n    elif args.lradj == 'type2':\n        lr_adjust = {\n            2: 5e-5, 4: 1e-5, 6: 5e-6, 8: 1e-6,\n            10: 5e-7, 15: 1e-7, 20: 5e-8\n        }\n    elif args.lradj == 'type3':\n        lr_adjust = {epoch: args.learning_rate if epoch < 3 else args.learning_rate * (0.9 ** ((epoch - 3) // 1))}\n    elif args.lradj == \"cosine\":\n        lr_adjust = {epoch: args.learning_rate /2 * (1 + math.cos(epoch / args.train_epochs * math.pi))}\n    if epoch in lr_adjust.keys():\n        lr = lr_adjust[epoch]\n        for param_group in optimizer.param_groups:\n            param_group['lr'] = lr\n        print('Updating learning rate to {}'.format(lr))\n\n\nclass EarlyStopping:\n    def __init__(self, patience=7, verbose=False, delta=0):\n        self.patience = patience\n        self.verbose = verbose\n        self.counter = 0\n        self.best_score = None\n        self.early_stop = False\n        self.val_loss_min = np.inf\n        self.delta = delta\n\n    def __call__(self, val_loss, model, path):\n        score = -val_loss\n        if self.best_score is None:\n            self.best_score = score\n            self.save_checkpoint(val_loss, model, path)\n        elif score < self.best_score + self.delta:\n            self.counter += 1\n            print(f'EarlyStopping counter: {self.counter} out of {self.patience}')\n            if self.counter >= self.patience:\n                self.early_stop = True\n        else:\n            self.best_score = score\n            self.save_checkpoint(val_loss, model, path)\n            self.counter = 0\n\n    def save_checkpoint(self, val_loss, model, path):\n        if self.verbose:\n            print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')\n        torch.save(model.state_dict(), path + '/' + 'checkpoint.pth')\n        self.val_loss_min = val_loss\n\n\nclass dotdict(dict):\n    \"\"\"dot.notation access to dictionary attributes\"\"\"\n    __getattr__ = dict.get\n    __setattr__ = dict.__setitem__\n    __delattr__ = dict.__delitem__\n\n\nclass StandardScaler():\n    def __init__(self, mean, std):\n        self.mean = mean\n        self.std = std\n\n    def transform(self, data):\n        return (data - self.mean) / self.std\n\n    def inverse_transform(self, data):\n        return (data * self.std) + self.mean\n\n\ndef visual(true, preds=None, name='./pic/test.pdf'):\n    \"\"\"\n    Results visualization\n    \"\"\"\n    plt.figure()\n    if preds is not None:\n        plt.plot(preds, label='Prediction', linewidth=2)\n    plt.plot(true, label='GroundTruth', linewidth=2)\n    plt.legend()\n    plt.savefig(name, bbox_inches='tight')\n\n\ndef adjustment(gt, pred):\n    anomaly_state = False\n    for i in range(len(gt)):\n        if gt[i] == 1 and pred[i] == 1 and not anomaly_state:\n            anomaly_state = True\n            for j in range(i, -1, -1):\n                if gt[j] == 0:\n                    break\n                else:\n                    if pred[j] == 0:\n                        pred[j] = 1\n            for j in range(i, len(gt)):\n                if gt[j] == 0:\n                    break\n                else:\n                    if pred[j] == 0:\n                        pred[j] = 1\n        elif gt[i] == 0:\n            anomaly_state = False\n        if anomaly_state:\n            pred[i] = 1\n    return gt, pred\n\n\ndef cal_accuracy(y_pred, y_true):\n    return np.mean(y_pred == y_true)\n"
  }
]