├── .github ├── dependabot.yml └── workflows │ ├── build_wheels.yml │ └── run_tests.yml ├── .gitignore ├── 404.html ├── LICENSE ├── MANIFEST.in ├── README.md ├── api ├── basic_simulators │ └── index.html ├── config │ └── index.html ├── dataset_generators │ └── index.html ├── ssms │ └── index.html └── support_utils │ └── index.html ├── assets ├── _mkdocstrings.css ├── images │ └── favicon.png ├── javascripts │ ├── bundle.d7c377c4.min.js │ ├── bundle.d7c377c4.min.js.map │ ├── bundle.dff1b7c8.min.js │ ├── bundle.dff1b7c8.min.js.map │ ├── lunr │ │ ├── min │ │ │ ├── lunr.ar.min.js │ │ │ ├── lunr.da.min.js │ │ │ ├── lunr.de.min.js │ │ │ ├── lunr.du.min.js │ │ │ ├── lunr.el.min.js │ │ │ ├── lunr.es.min.js │ │ │ ├── lunr.fi.min.js │ │ │ ├── lunr.fr.min.js │ │ │ ├── lunr.he.min.js │ │ │ ├── lunr.hi.min.js │ │ │ ├── lunr.hu.min.js │ │ │ ├── lunr.hy.min.js │ │ │ ├── lunr.it.min.js │ │ │ ├── lunr.ja.min.js │ │ │ ├── lunr.jp.min.js │ │ │ ├── lunr.kn.min.js │ │ │ ├── lunr.ko.min.js │ │ │ ├── lunr.multi.min.js │ │ │ ├── lunr.nl.min.js │ │ │ ├── lunr.no.min.js │ │ │ ├── lunr.pt.min.js │ │ │ ├── lunr.ro.min.js │ │ │ ├── lunr.ru.min.js │ │ │ ├── lunr.sa.min.js │ │ │ ├── lunr.stemmer.support.min.js │ │ │ ├── lunr.sv.min.js │ │ │ ├── lunr.ta.min.js │ │ │ ├── lunr.te.min.js │ │ │ ├── lunr.th.min.js │ │ │ ├── lunr.tr.min.js │ │ │ ├── lunr.vi.min.js │ │ │ └── lunr.zh.min.js │ │ ├── tinyseg.js │ │ └── wordcut.js │ └── workers │ │ ├── search.dfff1995.min.js │ │ ├── search.dfff1995.min.js.map │ │ ├── search.f886a092.min.js │ │ └── search.f886a092.min.js.map └── stylesheets │ ├── main.046329b4.min.css │ ├── main.046329b4.min.css.map │ ├── main.45e1311d.min.css │ ├── main.45e1311d.min.css.map │ ├── palette.06af60db.min.css │ ├── palette.06af60db.min.css.map │ ├── palette.85d0ee34.min.css │ └── palette.85d0ee34.min.css.map ├── basic_tutorial.md ├── basic_tutorial └── basic_tutorial │ └── index.html ├── docs ├── api │ ├── basic_simulators.md │ ├── config.md │ ├── dataset_generators.md │ ├── ssms.md │ └── support_utils.md ├── basic_tutorial │ └── basic_tutorial.ipynb ├── index.md ├── overrides │ └── main.html ├── site │ ├── 404.html │ ├── api │ │ ├── basic_simulators │ │ │ └── index.html │ │ ├── config │ │ │ └── index.html │ │ ├── dataset_generators │ │ │ └── index.html │ │ ├── ssms │ │ │ └── index.html │ │ └── support_utils │ │ │ └── index.html │ ├── assets │ │ ├── _mkdocstrings.css │ │ ├── images │ │ │ └── favicon.png │ │ ├── javascripts │ │ │ ├── bundle.dff1b7c8.min.js │ │ │ ├── bundle.dff1b7c8.min.js.map │ │ │ ├── lunr │ │ │ │ ├── min │ │ │ │ │ ├── lunr.ar.min.js │ │ │ │ │ ├── lunr.da.min.js │ │ │ │ │ ├── lunr.de.min.js │ │ │ │ │ ├── lunr.du.min.js │ │ │ │ │ ├── lunr.es.min.js │ │ │ │ │ ├── lunr.fi.min.js │ │ │ │ │ ├── lunr.fr.min.js │ │ │ │ │ ├── lunr.he.min.js │ │ │ │ │ ├── lunr.hi.min.js │ │ │ │ │ ├── lunr.hu.min.js │ │ │ │ │ ├── lunr.hy.min.js │ │ │ │ │ ├── lunr.it.min.js │ │ │ │ │ ├── lunr.ja.min.js │ │ │ │ │ ├── lunr.jp.min.js │ │ │ │ │ ├── lunr.kn.min.js │ │ │ │ │ ├── lunr.ko.min.js │ │ │ │ │ ├── lunr.multi.min.js │ │ │ │ │ ├── lunr.nl.min.js │ │ │ │ │ ├── lunr.no.min.js │ │ │ │ │ ├── lunr.pt.min.js │ │ │ │ │ ├── lunr.ro.min.js │ │ │ │ │ ├── lunr.ru.min.js │ │ │ │ │ ├── lunr.sa.min.js │ │ │ │ │ ├── lunr.stemmer.support.min.js │ │ │ │ │ ├── lunr.sv.min.js │ │ │ │ │ ├── lunr.ta.min.js │ │ │ │ │ ├── lunr.te.min.js │ │ │ │ │ ├── lunr.th.min.js │ │ │ │ │ ├── lunr.tr.min.js │ │ │ │ │ ├── lunr.vi.min.js │ │ │ │ │ └── lunr.zh.min.js │ │ │ │ ├── tinyseg.js │ │ │ │ └── wordcut.js │ │ │ └── workers │ │ │ │ ├── search.dfff1995.min.js │ │ │ │ └── search.dfff1995.min.js.map │ │ └── stylesheets │ │ │ ├── main.046329b4.min.css │ │ │ ├── main.046329b4.min.css.map │ │ │ ├── palette.85d0ee34.min.css │ │ │ └── palette.85d0ee34.min.css.map │ ├── basic_tutorial │ │ └── basic_tutorial │ │ │ └── index.html │ ├── index.html │ ├── objects.inv │ ├── overrides │ │ └── main.html │ ├── search │ │ └── search_index.json │ ├── sitemap.xml │ └── sitemap.xml.gz └── tutorials │ └── kde_class.ipynb ├── index.html ├── install_req.md ├── mkdocs.yml ├── mkdocs_tmp.yml ├── notebooks ├── basic_tutorial.ipynb ├── basic_tutorial_10012025.ipynb ├── basic_tutorial_12122024.ipynb ├── basic_tutorial_old.ipynb ├── basic_tutorial_tmp.ipynb ├── essential_tests.ipynb ├── test_deadline.ipynb ├── test_deadline_functionality.ipynb ├── test_lba.ipynb ├── test_mic2_ornstein.ipynb ├── test_sampling_from_subspaces.ipynb └── test_seq2.ipynb ├── objects.inv ├── overrides └── main.html ├── pyproject.toml ├── search └── search_index.json ├── setup.py ├── sitemap.xml ├── sitemap.xml.gz ├── src ├── __init__.py └── cssm.pyx ├── ssms ├── __init__.py ├── basic_simulators │ ├── __init__.py │ ├── boundary_functions.py │ ├── constants.py │ ├── drift_functions.py │ ├── simulator.py │ └── theta_processor.py ├── cli │ ├── config_data_generation.yaml │ └── generate.py ├── config │ ├── __init__.py │ ├── _modelconfig │ │ ├── __init__.py │ │ ├── angle.py │ │ ├── base.py │ │ ├── ddm.py │ │ ├── ddm_par2.py │ │ ├── ddm_random.py │ │ ├── ddm_seq2.py │ │ ├── dev_rlwm_lba.py │ │ ├── ds_conflict_drift.py │ │ ├── full_ddm.py │ │ ├── gamma_drift.py │ │ ├── lba.py │ │ ├── lca.py │ │ ├── levy.py │ │ ├── mic2 │ │ │ ├── __init__.py │ │ │ ├── adj.py │ │ │ ├── leak.py │ │ │ ├── multinoise.py │ │ │ └── ornstein.py │ │ ├── ornstein.py │ │ ├── race.py │ │ ├── shrink.py │ │ ├── tradeoff.py │ │ ├── validation.py │ │ └── weibull.py │ ├── generator_config │ │ └── data_generator_config.py │ └── kde_constants.py ├── dataset_generators │ ├── __init__.py │ └── lan_mlp.py ├── hssm_support.py └── support_utils │ ├── __init__.py │ ├── kde_class.py │ └── utils.py └── tests ├── __init__.py ├── data_generator ├── expected_constrained_param_space.py ├── expected_shapes.py └── test_data_generator.py ├── test_deprecate.py ├── test_generate_cli.py ├── test_hssm_support.py ├── test_kde_class.py ├── test_model_config.py └── test_simulator.py /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Set update schedule for GitHub Actions 2 | 3 | version: 2 4 | updates: 5 | 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | # Check for updates to GitHub Actions every month 10 | interval: "monthly" 11 | -------------------------------------------------------------------------------- /.github/workflows/build_wheels.yml: -------------------------------------------------------------------------------- 1 | name: Build and upload to PyPI 2 | 3 | on: 4 | workflow_dispatch: 5 | pull_request: 6 | push: 7 | branches: 8 | - main 9 | release: 10 | types: 11 | - published 12 | 13 | jobs: 14 | build_wheels: 15 | name: Build wheels on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | strategy: 18 | matrix: 19 | os: [ubuntu-latest, windows-latest, macos-latest] 20 | 21 | steps: 22 | - uses: actions/checkout@v5 23 | 24 | - name: Build wheels 25 | uses: pypa/cibuildwheel@v3.2.0 26 | env: 27 | CIBW_BUILD: cp310-* cp311-* cp312-* 28 | CIBW_ARCHS_MACOS: "x86_64 arm64" 29 | CIBW_ARCHS_LINUX: auto64 30 | CIBW_ARCHS_WINDOWS: auto64 31 | CIBW_BUILD_FRONTEND: build 32 | CIBW_BUILD_VERBOSITY: 3 33 | 34 | - uses: actions/upload-artifact@v4 35 | with: 36 | name: wheels-${{ matrix.os }} 37 | path: ./wheelhouse/*.whl 38 | 39 | build_sdist: 40 | name: Build source distribution 41 | runs-on: ubuntu-latest 42 | steps: 43 | - uses: actions/checkout@v5 44 | 45 | - name: Build sdist 46 | run: pipx run build --sdist 47 | 48 | - uses: actions/upload-artifact@v4 49 | with: 50 | name: sdist 51 | path: dist/*.tar.gz 52 | 53 | upload_test_pypi: 54 | needs: [build_wheels, build_sdist] 55 | runs-on: ubuntu-latest 56 | if: github.event_name == 'release' && github.event.action == 'published' 57 | # or, alternatively, upload to PyPI on every tag starting with 'v' (remove on: release above to use this) 58 | # if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') 59 | steps: 60 | - uses: actions/download-artifact@v5 61 | with: 62 | pattern: "*" 63 | path: dist 64 | merge-multiple: true 65 | 66 | - uses: pypa/gh-action-pypi-publish@release/v1 67 | with: 68 | password: ${{ secrets.TEST_PYPI_TOKEN }} 69 | repository-url: https://test.pypi.org/legacy/ 70 | 71 | upload_pypi: 72 | needs: [build_wheels, build_sdist, upload_test_pypi] 73 | runs-on: ubuntu-latest 74 | # Add these back after setting up trusted publishing 75 | # environment: pypi 76 | # permissions: 77 | # id-token: write 78 | if: github.event_name == 'release' && github.event.action == 'published' 79 | # or, alternatively, upload to PyPI on every tag starting with 'v' (remove on: release above to use this) 80 | # if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') 81 | steps: 82 | - uses: actions/download-artifact@v5 83 | with: 84 | pattern: "*" 85 | path: dist 86 | merge-multiple: true 87 | 88 | - uses: pypa/gh-action-pypi-publish@release/v1 89 | with: 90 | password: ${{ secrets.PYPI_TOKEN }} 91 | -------------------------------------------------------------------------------- /.github/workflows/run_tests.yml: -------------------------------------------------------------------------------- 1 | name: Run tests 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | run_tests: 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | fail-fast: true 12 | matrix: 13 | python-version: ["3.10", "3.11", "3.12"] 14 | 15 | steps: 16 | - uses: actions/checkout@v5 17 | 18 | - name: Setup Python 19 | uses: actions/setup-python@v6 20 | with: 21 | python-version: ${{ matrix.python-version }} 22 | 23 | - name: Install uv 24 | uses: astral-sh/setup-uv@v6 25 | with: 26 | version: "latest" 27 | enable-cache: true 28 | cache-dependency-glob: "pyproject.toml pdm.lock" 29 | 30 | - name: Install package 31 | run: uv sync --all-groups 32 | 33 | - name: Check styling 34 | run: uv run ruff format --check . 35 | 36 | - name: Linting 37 | run: uv run ruff check . 38 | 39 | - name: Run pytest 40 | run: uv run pytest -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # MY PACKAGE SPECIFIC ADDITIONS 2 | generated_data/ 3 | data/ 4 | ssm_simulators.egg-info/ 5 | .vscode/ 6 | #.ruff_cache/ 7 | src/cssm.cpp 8 | sysconfig.sh 9 | 10 | # Byte-compiled / optimized / DLL files 11 | __pycache__/ 12 | *.py[cod] 13 | *$py.class 14 | 15 | # C extensions 16 | *.so 17 | 18 | # Distribution / packaging 19 | .Python 20 | build/ 21 | develop-eggs/ 22 | dist/ 23 | downloads/ 24 | eggs/ 25 | .eggs/ 26 | lib/ 27 | lib64/ 28 | parts/ 29 | sdist/ 30 | var/ 31 | wheels/ 32 | pip-wheel-metadata/ 33 | share/python-wheels/ 34 | *.egg-info/ 35 | .installed.cfg 36 | *.egg 37 | MANIFEST 38 | 39 | # PyInstaller 40 | # Usually these files are written by a python script from a template 41 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 42 | *.manifest 43 | *.spec 44 | 45 | # Installer logs 46 | pip-log.txt 47 | pip-delete-this-directory.txt 48 | 49 | # Unit test / coverage reports 50 | htmlcov/ 51 | .tox/ 52 | .nox/ 53 | .coverage 54 | .coverage.* 55 | .cache 56 | nosetests.xml 57 | coverage.xml 58 | *.cover 59 | *.py,cover 60 | .hypothesis/ 61 | .pytest_cache/ 62 | 63 | # Translations 64 | *.mo 65 | *.pot 66 | 67 | # Django stuff: 68 | *.log 69 | local_settings.py 70 | db.sqlite3 71 | db.sqlite3-journal 72 | 73 | # Flask stuff: 74 | instance/ 75 | .webassets-cache 76 | 77 | # Scrapy stuff: 78 | .scrapy 79 | 80 | # Sphinx documentation 81 | docs/_build/ 82 | 83 | # PyBuilder 84 | target/ 85 | 86 | # Jupyter Notebook 87 | .ipynb_checkpoints 88 | 89 | # IPython 90 | profile_default/ 91 | ipython_config.py 92 | 93 | # pyenv 94 | .python-version 95 | 96 | # pipenv 97 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 98 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 99 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 100 | # install all needed dependencies. 101 | #Pipfile.lock 102 | 103 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 104 | __pypackages__/ 105 | 106 | # Celery stuff 107 | celerybeat-schedule 108 | celerybeat.pid 109 | 110 | # SageMath parsed files 111 | *.sage.py 112 | 113 | # Environments 114 | .env 115 | .venv 116 | env/ 117 | venv/ 118 | ENV/ 119 | env.bak/ 120 | venv.bak/ 121 | 122 | # Spyder project settings 123 | .spyderproject 124 | .spyproject 125 | 126 | # Rope project settings 127 | .ropeproject 128 | 129 | # mkdocs documentation 130 | /site 131 | 132 | # mypy 133 | .mypy_cache/ 134 | .dmypy.json 135 | dmypy.json 136 | 137 | # Pyre type checker 138 | .pyre/ 139 | uv.lock 140 | 141 | .vscode/* 142 | 143 | explorations/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Alexander Fengler 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include docs 2 | include README.md LICENSE 3 | include ssms *.py 4 | include src/*.pyx 5 | include notebooks/* 6 | global-exclude .gitignore 7 | global-exclude .git 8 | global-exclude *~ 9 | global-exclude *.pyc 10 | global-exclude .#* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SSMS (Sequential Sampling Model Simulators) 2 | 3 | [![DOI](https://zenodo.org/badge/370812185.svg)](https://doi.org/10.5281/zenodo.17156205) 4 | ![PyPI](https://img.shields.io/pypi/v/ssm-simulators) 5 | ![PyPI_dl](https://img.shields.io/pypi/dm/ssm-simulators) 6 | [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) 7 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 8 | [![codecov](https://codecov.io/gh/lnccbrown/ssm-simulators/branch/main/graph/badge.svg)](https://codecov.io/gh/lnccbrown/ssm-simulators) 9 | 10 | Python Package to collect simulators for Sequential Sampling Models. 11 | 12 | Find the package documentation [here](https://lnccbrown.github.io/ssm-simulators/). 13 | 14 | 15 | ### Quick Start 16 | 17 | The `ssms` package serves two purposes. 18 | 19 | 1. Easy access to *fast simulators of sequential sampling models* 20 | 2. Support infrastructure to construct training data for various approaches to likelihood / posterior amortization 21 | 22 | A number of tutorial notebooks are available under the `/notebooks` directory. 23 | 24 | #### Installation 25 | 26 | ```sh 27 | pip install ssm-simulators 28 | ``` 29 | 30 | > [!NOTE] 31 | > Building from source or developing this package requires a C compiler (such as GCC). 32 | > On Linux, you can install GCC with: 33 | > ```bash 34 | > sudo apt-get install build-essential 35 | > ``` 36 | > Most users installing from PyPI wheels do **not** need to install GCC. 37 | 38 | #### Command Line Interface 39 | The package exposes a command-line tool, `generate`, for creating training data from a YAML configuration file. 40 | 41 | ```bash 42 | generate --config-path --output [--log-level INFO] 43 | ``` 44 | 45 | - `--config-path`: Path to your YAML configuration file (required). 46 | - `--output`: Directory where generated data will be saved (required). 47 | - `--n-files`: (Optional) Number of data files to generate. Default is `1` file. 48 | - `--log-level`: (Optional) Set the logging level (`DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`). Default is `WARNING`. 49 | 50 | Below is a sample YAML configuration you can use with the `generate` command: 51 | 52 | ```yaml 53 | MODEL: 'ddm' 54 | N_SAMPLES: 2000 55 | N_PARAMETER_SETS: 100 56 | DELTA_T: 0.001 57 | N_TRAINING_SAMPLES_BY_PARAMETER_SET: 200 58 | N_SUBRUNS: 20 59 | GENERATOR_APPROACH: 'lan' 60 | ``` 61 | 62 | Configuration file parameter details follow. 63 | 64 | | Option | Definition | 65 | | ------ | ---------- | 66 | | `MODEL` | The type of model you want to simulate | 67 | | `N_SAMPLES` | Number of samples a simulation run should entail for a given parameter set| 68 | | `N_PARAMETER_SETS` | Number of parameter vectors that are used for training | 69 | | `DELTA_T` | Time discretization step used in numerical simulation of the model. Interval between updates of evidence-accumulation. | 70 | | `N_TRAINING_SAMPLES_BY_PARAMETER_SET` | Number of times the kernal density estimate (KDE) is evaluated after creating the KDE from simulations of each set of model parameters. | 71 | | `N_SUBRUNS` | Number of repetitions of each call to generate data | 72 | | `GENERATOR_APPROACH` | Type of generator used to generate data | 73 | 74 | To make your own configuration file, you can copy the example above into a new `.yaml` file and modify it with your preferences. 75 | 76 | If you are using `uv` (see below), you can use the `uv run` command to run `generate` from the command line 77 | 78 | This will generate training data according to your configuration and save it in the specified output directory. 79 | 80 | ### Tutorial 81 | 82 | Check the basic tutorial [here](docs/basic_tutorial/basic_tutorial.ipynb). 83 | 84 | ### Advanced: Dependency Management with uv 85 | 86 | We use `uv` for fast and efficient dependency management. To get started: 87 | 88 | 1. Install `uv`: 89 | ```bash 90 | curl -LsSf https://astral.sh/uv/install.sh | sh 91 | ``` 92 | 93 | 2. Install dependencies (including development): 94 | ```bash 95 | uv sync --all-groups # Installs all dependency groups 96 | ``` 97 | 98 | ### Cite `ssm-simulators` 99 | 100 | Please use the this DOI to cite ssm-simulators: [https://doi.org/10.5281/zenodo.17156205](https://doi.org/10.5281/zenodo.17156205) 101 | -------------------------------------------------------------------------------- /assets/_mkdocstrings.css: -------------------------------------------------------------------------------- 1 | 2 | /* Don't capitalize names. */ 3 | h5.doc-heading { 4 | text-transform: none !important; 5 | } 6 | 7 | /* Avoid breaking parameters name, etc. in table cells. */ 8 | .doc-contents td code { 9 | word-break: normal !important; 10 | } 11 | 12 | /* For pieces of Markdown rendered in table cells. */ 13 | .doc-contents td p { 14 | margin-top: 0 !important; 15 | margin-bottom: 0 !important; 16 | } 17 | -------------------------------------------------------------------------------- /assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lnccbrown/ssm-simulators/fec1aa37edeab0b389c9295d59e4dcdc37803909/assets/images/favicon.png -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.da.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Danish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.he.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.he=function(){this.pipeline.reset(),this.pipeline.add(e.he.trimmer,e.he.stopWordFilter,e.he.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.he.stemmer))},e.he.wordCharacters="֑-״א-תa-zA-Za-zA-Z0-90-9",e.he.trimmer=e.trimmerSupport.generateTrimmer(e.he.wordCharacters),e.Pipeline.registerFunction(e.he.trimmer,"trimmer-he"),e.he.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ה ו י ת",pre2:"ב כ ל מ ש כש",pre3:"הב הכ הל המ הש בש לכ",pre4:"וב וכ ול ומ וש",pre5:"מה שה כל",pre6:"מב מכ מל ממ מש",pre7:"בה בו בי בת כה כו כי כת לה לו לי לת",pre8:"ובה ובו ובי ובת וכה וכו וכי וכת ולה ולו ולי ולת"},e.suf={suf1:"ך כ ם ן נ",suf2:"ים ות וך וכ ום ון ונ הם הן יכ יך ינ ים",suf3:"תי תך תכ תם תן תנ",suf4:"ותי ותך ותכ ותם ותן ותנ",suf5:"נו כם כן הם הן",suf6:"ונו וכם וכן והם והן",suf7:"תכם תכן תנו תהם תהן",suf8:"הוא היא הם הן אני אתה את אנו אתם אתן",suf9:"ני נו כי כו כם כן תי תך תכ תם תן",suf10:"י ך כ ם ן נ ת"},e.patterns=JSON.parse('{"hebrewPatterns": [{"pt1": [{"c": "ה", "l": 0}]}, {"pt2": [{"c": "ו", "l": 0}]}, {"pt3": [{"c": "י", "l": 0}]}, {"pt4": [{"c": "ת", "l": 0}]}, {"pt5": [{"c": "מ", "l": 0}]}, {"pt6": [{"c": "ל", "l": 0}]}, {"pt7": [{"c": "ב", "l": 0}]}, {"pt8": [{"c": "כ", "l": 0}]}, {"pt9": [{"c": "ש", "l": 0}]}, {"pt10": [{"c": "כש", "l": 0}]}, {"pt11": [{"c": "בה", "l": 0}]}, {"pt12": [{"c": "וב", "l": 0}]}, {"pt13": [{"c": "וכ", "l": 0}]}, {"pt14": [{"c": "ול", "l": 0}]}, {"pt15": [{"c": "ומ", "l": 0}]}, {"pt16": [{"c": "וש", "l": 0}]}, {"pt17": [{"c": "הב", "l": 0}]}, {"pt18": [{"c": "הכ", "l": 0}]}, {"pt19": [{"c": "הל", "l": 0}]}, {"pt20": [{"c": "המ", "l": 0}]}, {"pt21": [{"c": "הש", "l": 0}]}, {"pt22": [{"c": "מה", "l": 0}]}, {"pt23": [{"c": "שה", "l": 0}]}, {"pt24": [{"c": "כל", "l": 0}]}]}'),e.execArray=["cleanWord","removeDiacritics","removeStopWords","normalizeHebrewCharacters"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHebrewCharacters=function(){return e.word=e.word.replace("ך","כ"),e.word=e.word.replace("ם","מ"),e.word=e.word.replace("ן","נ"),e.word=e.word.replace("ף","פ"),e.word=e.word.replace("ץ","צ"),!1},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}}(),e.Pipeline.registerFunction(e.he.stemmer,"stemmer-he"),e.he.stopWordFilter=e.generateStopWordFilter("אבל או אולי אותו אותי אותך אותם אותן אותנו אז אחר אחרות אחרי אחריכן אחרים אחרת אי איזה איך אין איפה אל אלה אלו אם אנחנו אני אף אפשר את אתה אתכם אתכן אתם אתן באיזה באיזו בגלל בין בלבד בעבור בעזרת בכל בכן בלי במידה במקום שבו ברוב בשביל בשעה ש בתוך גם דרך הוא היא היה היי היכן היתה היתי הם הן הנה הסיבה שבגללה הרי ואילו ואת זאת זה זות יהיה יוכל יוכלו יותר מדי יכול יכולה יכולות יכולים יכל יכלה יכלו יש כאן כאשר כולם כולן כזה כי כיצד כך כל כלל כמו כן כפי כש לא לאו לאיזותך לאן לבין לה להיות להם להן לו לזה לזות לי לך לכם לכן למה למעלה למעלה מ למטה למטה מ למעט למקום שבו למרות לנו לעבר לעיכן לפיכך לפני מאד מאחורי מאיזו סיבה מאין מאיפה מבלי מבעד מדוע מה מהיכן מול מחוץ מי מידע מכאן מכל מכן מלבד מן מנין מסוגל מעט מעטים מעל מצד מקום בו מתחת מתי נגד נגר נו עד עז על עלי עליו עליה עליהם עליך עלינו עם עצמה עצמהם עצמהן עצמו עצמי עצמם עצמן עצמנו פה רק שוב של שלה שלהם שלהן שלו שלי שלך שלכה שלכם שלכן שלנו שם תהיה תחת".split(" ")),e.Pipeline.registerFunction(e.he.stopWordFilter,"stopWordFilter-he")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.hi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.hy.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.ja.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.sa.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम्‌ एकम्‌ इत्यस्मिन्‌ तथा तत्‌ वा अयम्‌ इत्यस्य ते आहूत उपरि तेषाम्‌ किन्तु तेषाम्‌ तदा इत्यनेन अधिकः इत्यस्य तत्‌ केचन बहवः द्वि तथा महत्वपूर्णः अयम्‌ अस्य विषये अयं अस्ति तत्‌ प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम्‌ द न्यूनम्‌ कश्चित्‌ वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम्‌ अपि अत्र सर्वे विविधाः तत्‌ बहवः यतः इदानीम्‌ द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम्‌ सर्वे एकैकम्‌ इत्यादि। एते सन्ति उत इत्थम्‌ मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम्‌ समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान्‌ धृतः तदा पुनः पूर्वं सः आगतः किम्‌ कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत्‌ ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.stemmer.support.min.js: -------------------------------------------------------------------------------- 1 | !function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.sv.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Swedish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.ta.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.te.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷౤౥",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.th.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.vi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); -------------------------------------------------------------------------------- /assets/javascripts/lunr/min/lunr.zh.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); -------------------------------------------------------------------------------- /assets/stylesheets/palette.06af60db.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/templates/assets/stylesheets/palette/_scheme.scss","../../../../src/templates/assets/stylesheets/palette.scss","src/templates/assets/stylesheets/palette/_accent.scss","src/templates/assets/stylesheets/palette/_primary.scss","src/templates/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"} -------------------------------------------------------------------------------- /assets/stylesheets/palette.85d0ee34.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"} -------------------------------------------------------------------------------- /docs/api/basic_simulators.md: -------------------------------------------------------------------------------- 1 | :::ssms.basic_simulators -------------------------------------------------------------------------------- /docs/api/config.md: -------------------------------------------------------------------------------- 1 | :::ssms.config -------------------------------------------------------------------------------- /docs/api/dataset_generators.md: -------------------------------------------------------------------------------- 1 | :::ssms.dataset_generators -------------------------------------------------------------------------------- /docs/api/ssms.md: -------------------------------------------------------------------------------- 1 | :::ssms -------------------------------------------------------------------------------- /docs/api/support_utils.md: -------------------------------------------------------------------------------- 1 | :::ssms.support_utils -------------------------------------------------------------------------------- /docs/overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block announce %} 4 | 5 | 6 | {% include ".icons/fontawesome/solid/angles-down.svg" %} 7 | 8 | Navigate the site here! 9 | 10 | 11 | v0.6.1 is out! 12 | 13 | 14 | 15 | {% include ".icons/material/head-question.svg" %} 16 | 17 | 18 | {% endblock %} -------------------------------------------------------------------------------- /docs/site/assets/_mkdocstrings.css: -------------------------------------------------------------------------------- 1 | 2 | /* Avoid breaking parameter names, etc. in table cells. */ 3 | .doc-contents td code { 4 | word-break: normal !important; 5 | } 6 | 7 | /* No line break before first paragraph of descriptions. */ 8 | .doc-md-description, 9 | .doc-md-description>p:first-child { 10 | display: inline; 11 | } 12 | 13 | /* Max width for docstring sections tables. */ 14 | .doc .md-typeset__table, 15 | .doc .md-typeset__table table { 16 | display: table !important; 17 | width: 100%; 18 | } 19 | 20 | .doc .md-typeset__table tr { 21 | display: table-row; 22 | } 23 | 24 | /* Defaults in Spacy table style. */ 25 | .doc-param-default { 26 | float: right; 27 | } 28 | 29 | /* Keep headings consistent. */ 30 | h1.doc-heading, 31 | h2.doc-heading, 32 | h3.doc-heading, 33 | h4.doc-heading, 34 | h5.doc-heading, 35 | h6.doc-heading { 36 | font-weight: 400; 37 | line-height: 1.5; 38 | color: inherit; 39 | text-transform: none; 40 | } 41 | 42 | h1.doc-heading { 43 | font-size: 1.6rem; 44 | } 45 | 46 | h2.doc-heading { 47 | font-size: 1.2rem; 48 | } 49 | 50 | h3.doc-heading { 51 | font-size: 1.15rem; 52 | } 53 | 54 | h4.doc-heading { 55 | font-size: 1.10rem; 56 | } 57 | 58 | h5.doc-heading { 59 | font-size: 1.05rem; 60 | } 61 | 62 | h6.doc-heading { 63 | font-size: 1rem; 64 | } -------------------------------------------------------------------------------- /docs/site/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lnccbrown/ssm-simulators/fec1aa37edeab0b389c9295d59e4dcdc37803909/docs/site/assets/images/favicon.png -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.da.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Danish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.he.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.he=function(){this.pipeline.reset(),this.pipeline.add(e.he.trimmer,e.he.stopWordFilter,e.he.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.he.stemmer))},e.he.wordCharacters="֑-״א-תa-zA-Za-zA-Z0-90-9",e.he.trimmer=e.trimmerSupport.generateTrimmer(e.he.wordCharacters),e.Pipeline.registerFunction(e.he.trimmer,"trimmer-he"),e.he.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ה ו י ת",pre2:"ב כ ל מ ש כש",pre3:"הב הכ הל המ הש בש לכ",pre4:"וב וכ ול ומ וש",pre5:"מה שה כל",pre6:"מב מכ מל ממ מש",pre7:"בה בו בי בת כה כו כי כת לה לו לי לת",pre8:"ובה ובו ובי ובת וכה וכו וכי וכת ולה ולו ולי ולת"},e.suf={suf1:"ך כ ם ן נ",suf2:"ים ות וך וכ ום ון ונ הם הן יכ יך ינ ים",suf3:"תי תך תכ תם תן תנ",suf4:"ותי ותך ותכ ותם ותן ותנ",suf5:"נו כם כן הם הן",suf6:"ונו וכם וכן והם והן",suf7:"תכם תכן תנו תהם תהן",suf8:"הוא היא הם הן אני אתה את אנו אתם אתן",suf9:"ני נו כי כו כם כן תי תך תכ תם תן",suf10:"י ך כ ם ן נ ת"},e.patterns=JSON.parse('{"hebrewPatterns": [{"pt1": [{"c": "ה", "l": 0}]}, {"pt2": [{"c": "ו", "l": 0}]}, {"pt3": [{"c": "י", "l": 0}]}, {"pt4": [{"c": "ת", "l": 0}]}, {"pt5": [{"c": "מ", "l": 0}]}, {"pt6": [{"c": "ל", "l": 0}]}, {"pt7": [{"c": "ב", "l": 0}]}, {"pt8": [{"c": "כ", "l": 0}]}, {"pt9": [{"c": "ש", "l": 0}]}, {"pt10": [{"c": "כש", "l": 0}]}, {"pt11": [{"c": "בה", "l": 0}]}, {"pt12": [{"c": "וב", "l": 0}]}, {"pt13": [{"c": "וכ", "l": 0}]}, {"pt14": [{"c": "ול", "l": 0}]}, {"pt15": [{"c": "ומ", "l": 0}]}, {"pt16": [{"c": "וש", "l": 0}]}, {"pt17": [{"c": "הב", "l": 0}]}, {"pt18": [{"c": "הכ", "l": 0}]}, {"pt19": [{"c": "הל", "l": 0}]}, {"pt20": [{"c": "המ", "l": 0}]}, {"pt21": [{"c": "הש", "l": 0}]}, {"pt22": [{"c": "מה", "l": 0}]}, {"pt23": [{"c": "שה", "l": 0}]}, {"pt24": [{"c": "כל", "l": 0}]}]}'),e.execArray=["cleanWord","removeDiacritics","removeStopWords","normalizeHebrewCharacters"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHebrewCharacters=function(){return e.word=e.word.replace("ך","כ"),e.word=e.word.replace("ם","מ"),e.word=e.word.replace("ן","נ"),e.word=e.word.replace("ף","פ"),e.word=e.word.replace("ץ","צ"),!1},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}}(),e.Pipeline.registerFunction(e.he.stemmer,"stemmer-he"),e.he.stopWordFilter=e.generateStopWordFilter("אבל או אולי אותו אותי אותך אותם אותן אותנו אז אחר אחרות אחרי אחריכן אחרים אחרת אי איזה איך אין איפה אל אלה אלו אם אנחנו אני אף אפשר את אתה אתכם אתכן אתם אתן באיזה באיזו בגלל בין בלבד בעבור בעזרת בכל בכן בלי במידה במקום שבו ברוב בשביל בשעה ש בתוך גם דרך הוא היא היה היי היכן היתה היתי הם הן הנה הסיבה שבגללה הרי ואילו ואת זאת זה זות יהיה יוכל יוכלו יותר מדי יכול יכולה יכולות יכולים יכל יכלה יכלו יש כאן כאשר כולם כולן כזה כי כיצד כך כל כלל כמו כן כפי כש לא לאו לאיזותך לאן לבין לה להיות להם להן לו לזה לזות לי לך לכם לכן למה למעלה למעלה מ למטה למטה מ למעט למקום שבו למרות לנו לעבר לעיכן לפיכך לפני מאד מאחורי מאיזו סיבה מאין מאיפה מבלי מבעד מדוע מה מהיכן מול מחוץ מי מידע מכאן מכל מכן מלבד מן מנין מסוגל מעט מעטים מעל מצד מקום בו מתחת מתי נגד נגר נו עד עז על עלי עליו עליה עליהם עליך עלינו עם עצמה עצמהם עצמהן עצמו עצמי עצמם עצמן עצמנו פה רק שוב של שלה שלהם שלהן שלו שלי שלך שלכה שלכם שלכן שלנו שם תהיה תחת".split(" ")),e.Pipeline.registerFunction(e.he.stopWordFilter,"stopWordFilter-he")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.hi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.hy.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.ja.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.sa.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम्‌ एकम्‌ इत्यस्मिन्‌ तथा तत्‌ वा अयम्‌ इत्यस्य ते आहूत उपरि तेषाम्‌ किन्तु तेषाम्‌ तदा इत्यनेन अधिकः इत्यस्य तत्‌ केचन बहवः द्वि तथा महत्वपूर्णः अयम्‌ अस्य विषये अयं अस्ति तत्‌ प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम्‌ द न्यूनम्‌ कश्चित्‌ वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम्‌ अपि अत्र सर्वे विविधाः तत्‌ बहवः यतः इदानीम्‌ द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम्‌ सर्वे एकैकम्‌ इत्यादि। एते सन्ति उत इत्थम्‌ मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम्‌ समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान्‌ धृतः तदा पुनः पूर्वं सः आगतः किम्‌ कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत्‌ ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js: -------------------------------------------------------------------------------- 1 | !function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.sv.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Swedish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.ta.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.te.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷౤౥",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.th.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.vi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); -------------------------------------------------------------------------------- /docs/site/assets/javascripts/lunr/min/lunr.zh.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); -------------------------------------------------------------------------------- /docs/site/assets/stylesheets/palette.85d0ee34.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"} -------------------------------------------------------------------------------- /docs/site/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lnccbrown/ssm-simulators/fec1aa37edeab0b389c9295d59e4dcdc37803909/docs/site/objects.inv -------------------------------------------------------------------------------- /docs/site/overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block announce %} 4 | 5 | 6 | {% include ".icons/fontawesome/solid/angles-down.svg" %} 7 | 8 | Navigate the site here! 9 | 10 | 11 | v0.6.1 is out! 12 | 13 | 14 | 15 | {% include ".icons/material/head-question.svg" %} 16 | 17 | 18 | {% endblock %} -------------------------------------------------------------------------------- /docs/site/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /docs/site/sitemap.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lnccbrown/ssm-simulators/fec1aa37edeab0b389c9295d59e4dcdc37803909/docs/site/sitemap.xml.gz -------------------------------------------------------------------------------- /install_req.md: -------------------------------------------------------------------------------- 1 | # Python version 2 | 3.7.10 3 | 4 | # Packages that need installing 5 | 6 | cython 7 | scipy 8 | 9 | 10 | # Run 11 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: SSMS (Sequential Sampling Model Simulators) 2 | repo_name: lnccbrown/ssm-simulators 3 | repo_url: https://github.com/lnccbrown/ssm-simulators 4 | site_url: https://lnccbrown.github.io/ssm-simulators 5 | edit_uri: edit/main/docs 6 | 7 | nav: 8 | - Home: 9 | - Overview: index.md 10 | - Basic Tutorial: 11 | - Installation: basic_tutorial/basic_tutorial.ipynb 12 | - Tutorials: 13 | - KDE Class: tutorials/kde_class.ipynb 14 | - API: 15 | - ssms: api/ssms.md 16 | - basic simulators: api/basic_simulators.md 17 | - config: api/config.md 18 | - data generators: api/dataset_generators.md 19 | - support utils: api/support_utils.md 20 | 21 | plugins: 22 | - search 23 | - autorefs 24 | - mkdocs-jupyter: 25 | execute: True 26 | execute_ignore: 27 | - basic_tutorial/basic_tutorial.ipynb 28 | - mkdocstrings: 29 | default_handler: python 30 | handlers: 31 | python: 32 | import: 33 | - https://docs.python.org/3/objects.inv 34 | - https://mkdocstrings.github.io/objects.inv 35 | - https://mkdocstrings.github.io/griffe/objects.inv 36 | options: 37 | show_submodules: true 38 | separate_signature: true 39 | merge_init_into_class: true 40 | docstring_options: 41 | ignore_init_summary: true 42 | docstring_style: "numpy" 43 | docstring_section_style: "list" 44 | show_root_members_full_path: true 45 | show_object_full_path: false 46 | show_category_heading: true 47 | show_signature_annotations: false 48 | show_source: false 49 | group_by_category: false 50 | signature_crossrefs: true 51 | 52 | theme: 53 | name: material 54 | custom_dir: docs/overrides 55 | features: 56 | - navigation.tracking 57 | - navigation.tabs 58 | - navigation.tabs.sticky 59 | - navigation.sections 60 | - navigation.path 61 | - navigation.top 62 | - content.code.copy 63 | - content.action.view 64 | - content.action.edit 65 | - header.autohide 66 | - announce.dismiss 67 | palette: 68 | # Palette toggle for automatic mode 69 | - media: "(prefers-color-scheme)" 70 | toggle: 71 | icon: material/brightness-auto 72 | name: Switch to dark mode 73 | 74 | # Palette toggle for light mode 75 | - media: "(prefers-color-scheme: light)" 76 | scheme: default 77 | toggle: 78 | icon: material/brightness-7 79 | name: Switch to light mode 80 | 81 | # Palette toggle for dark mode 82 | - media: "(prefers-color-scheme: dark)" 83 | scheme: slate 84 | toggle: 85 | icon: material/brightness-4 86 | name: Switch to automatic mode 87 | 88 | extra: 89 | homepage: "https://lnccbrown.github.io/ssm-simulators/" 90 | 91 | markdown_extensions: 92 | - admonition 93 | - pymdownx.highlight: 94 | anchor_linenums: true 95 | line_spans: __span 96 | pygments_lang_class: true 97 | - pymdownx.inlinehilite 98 | - pymdownx.snippets 99 | - pymdownx.superfences 100 | - attr_list 101 | - pymdownx.emoji: 102 | emoji_index: !!python/name:material.extensions.emoji.twemoji 103 | emoji_generator: !!python/name:material.extensions.emoji.to_svg -------------------------------------------------------------------------------- /mkdocs_tmp.yml: -------------------------------------------------------------------------------- 1 | site_name: SSMS (Sequential Sampling Model Simulators) 2 | repo_name: lnccbrown/ssm-simulators 3 | repo_url: https://github.com/lnccbrown/ssm-simulators 4 | edit_uri: edit/main/docs 5 | 6 | nav: 7 | - Home: 8 | - Overview: index.md 9 | - Basic Tutorial: 10 | - Installation: basic_tutorial/basic_tutorial.ipynb 11 | 12 | plugins: 13 | - search 14 | - autorefs 15 | - mkdocs-jupyter: 16 | execute: True 17 | execute_ignore: 18 | - basic_tutorial/basic_tutorial.ipynb 19 | - mkdocstrings: 20 | default_handler: python 21 | handlers: 22 | python: 23 | import: 24 | - https://docs.python.org/3/objects.inv 25 | - https://mkdocstrings.github.io/objects.inv 26 | - https://mkdocstrings.github.io/griffe/objects.inv 27 | options: 28 | separate_signature: true 29 | merge_init_into_class: true 30 | docstring_options: 31 | ignore_init_summary: true 32 | docstring_style: "numpy" 33 | docstring_section_style: "list" 34 | show_root_members_full_path: true 35 | show_object_full_path: false 36 | show_category_heading: true 37 | show_signature_annotations: true 38 | show_source: false 39 | group_by_category: false 40 | signature_crossrefs: true 41 | theme: 42 | name: material 43 | custom_dir: docs/overrides 44 | features: 45 | - navigation.tracking 46 | - navigation.tabs 47 | - navigation.tabs.sticky 48 | - navigation.sections 49 | - navigation.path 50 | - navigation.top 51 | - content.code.copy 52 | - content.action.view 53 | - content.action.edit 54 | - header.autohide 55 | - announce.dismiss 56 | palette: 57 | # Palette toggle for automatic mode 58 | - media: "(prefers-color-scheme)" 59 | toggle: 60 | icon: material/brightness-auto 61 | name: Switch to automatic mode 62 | 63 | # Palette toggle for light mode 64 | - media: "(prefers-color-scheme: light)" 65 | scheme: default 66 | toggle: 67 | icon: material/brightness-7 68 | name: Switch to light mode 69 | 70 | # Palette toggle for dark mode 71 | - media: "(prefers-color-scheme: dark)" 72 | scheme: slate 73 | toggle: 74 | icon: material/brightness-4 75 | name: Switch to dark mode 76 | 77 | extra: 78 | homepage: "https://lnccbrown.github.io/ssm-simulators/" 79 | 80 | markdown_extensions: 81 | - admonition 82 | - pymdownx.highlight: 83 | anchor_linenums: true 84 | line_spans: __span 85 | pygments_lang_class: true 86 | - pymdownx.inlinehilite 87 | - pymdownx.snippets 88 | - pymdownx.superfences 89 | - attr_list 90 | - pymdownx.emoji: 91 | emoji_index: !!python/name:materialx.emoji.twemoji 92 | emoji_generator: !!python/name:materialx.emoji.to_svg -------------------------------------------------------------------------------- /objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lnccbrown/ssm-simulators/fec1aa37edeab0b389c9295d59e4dcdc37803909/objects.inv -------------------------------------------------------------------------------- /overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block announce %} 4 | 5 | 6 | {% include ".icons/fontawesome/solid/angles-down.svg" %} 7 | 8 | Navigate the site here! 9 | 10 | 11 | v0.6.1 is out! 12 | 13 | 14 | 15 | {% include ".icons/material/head-question.svg" %} 16 | 17 | 18 | {% endblock %} -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools", "wheel", "Cython>=0.29.23", "numpy >= 2.0"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "ssm-simulators" 7 | version = "0.11.3" 8 | description = "SSMS is a package collecting simulators and training data generators for cognitive science, neuroscience, and approximate bayesian computation" 9 | authors = [ 10 | { name = "Alexander Fengler", email = "alexander_fengler@brown.edu" }, 11 | ] 12 | readme = "README.md" 13 | license = { file = "LICENSE" } 14 | requires-python = ">3.10,<3.13" # for compatibility with lanfactory 15 | dependencies = [ 16 | "scipy >= 1.6.3", 17 | "pandas >= 1.0.0", 18 | "matplotlib", 19 | "scikit-learn >= 0.24.0", 20 | "psutil >= 5.0.0", 21 | "pathos >= 0.3.0", 22 | "numpy>=2.0", 23 | "typer>=0.15.3", 24 | "pyyaml>=6.0.2", 25 | "tqdm>=4.67.1", 26 | ] 27 | classifiers = [ 28 | "Development Status :: 3 - Alpha", 29 | "Intended Audience :: Science/Research", 30 | "License :: OSI Approved :: MIT License", 31 | "Programming Language :: Python :: 3.10", 32 | "Programming Language :: Python :: 3.11", 33 | "Programming Language :: Python :: 3.12", 34 | "Topic :: Scientific/Engineering :: Bio-Informatics", 35 | ] 36 | 37 | [dependency-groups] 38 | dev = [ 39 | "pytest", 40 | "mypy", 41 | "black", 42 | "ruff", 43 | "pre-commit", 44 | "pytest-cov>=6.0.0", 45 | "pytest-xdist>=3.6.1", 46 | "ipykernel>=6.29.5", 47 | "nbconvert>=7.16.6", 48 | "nb-clean>=4.0.1", 49 | "pytest-timer>=1.0.0", 50 | "pytest-rerunfailures>=16.0.1", 51 | ] 52 | 53 | [project.urls] 54 | Homepage = "https://github.com/lnccbrown/ssm-simulators" 55 | "Bug Tracker" = "https://github.com/lnccbrown/ssm-simulators/issues" 56 | 57 | [tool.setuptools.packages.find] 58 | include = ["ssms", "ssms.*"] 59 | 60 | [tool.pytest.ini_options] 61 | log_cli = true 62 | log_cli_level = "INFO" # set minimum log level for console output 63 | testpaths = ["tests"] 64 | addopts = [ 65 | "--cov=.", 66 | "--cov-report=term-missing", 67 | "--cov-report=xml", 68 | "--timer-top-n=25", 69 | "--reruns=2", 70 | "--reruns-delay=1", 71 | ] 72 | 73 | [tool.ruff] 74 | line-length = 88 75 | exclude = ["notebooks", "docs"] 76 | 77 | [tool.ruff.lint] 78 | exclude = ["notebooks", "docs"] 79 | ignore = [ 80 | # space before : (needed for how black formats slicing) 81 | # "E203", # not yet implemented 82 | # module level import not at top of file 83 | "E402", 84 | # do not assign a lambda expression, use a def 85 | "E731", 86 | # line break before binary operator 87 | # "W503", # not yet implemented 88 | # line break after binary operator 89 | # "W504", # not yet implemented 90 | # controversial 91 | "B006", 92 | # controversial 93 | "B007", 94 | # controversial 95 | "B008", 96 | # setattr is used to side-step mypy 97 | "B009", 98 | # getattr is used to side-step mypy 99 | "B010", 100 | # tests use assert False 101 | "B011", 102 | # tests use comparisons but not their returned value 103 | "B015", 104 | # false positives 105 | "B019", 106 | # Loop control variable overrides iterable it iterates 107 | "B020", 108 | # Function definition does not bind loop variable 109 | "B023", 110 | # zip()` without an explicit `strict= 111 | "B905", 112 | # Functions defined inside a loop must not use variables redefined in the loop 113 | # "B301", # not yet implemented 114 | # Too many arguments to function call 115 | "PLR0913", 116 | # Too many returns 117 | "PLR0911", 118 | # Too many branches 119 | "PLR0912", 120 | # Too many statements 121 | "PLR0915", 122 | # Global statements are discouraged 123 | "PLW0603", 124 | # Docstrings should not be included in stubs 125 | "PYI021", 126 | # Use typing_extensions.TypeAlias for type aliases 127 | # "PYI026", # not yet implemented 128 | # Use "collections.abc.*" instead of "typing.*" (PEP 585 syntax) 129 | # "PYI027", # not yet implemented 130 | # while int | float can be shortened to float, the former is more explicit 131 | # "PYI041", # not yet implemented 132 | 133 | # Additional checks that don't pass yet 134 | # Within an except clause, raise exceptions with ... 135 | "B904", 136 | # Magic number 137 | "PLR2004", 138 | # Consider `elif` instead of `else` then `if` to remove indentation level 139 | "PLR5501", 140 | # Ignore "Use `float` instead of `int | float`." 141 | "PYI041", 142 | # Allow importing from parent modules 143 | "TID252", 144 | ] 145 | 146 | [tool.mypy] 147 | python_version = "3.10" 148 | warn_return_any = true 149 | warn_unused_configs = true 150 | 151 | [[tool.mypy.overrides]] 152 | module = ["bambi"] 153 | ignore_missing_imports = true 154 | 155 | [tool.coverage.run] 156 | omit = ["*/setup.py", "*/__init__.py"] 157 | 158 | [project.scripts] 159 | generate = "ssms.cli.generate:app" 160 | 161 | [tool.setuptools.package-data] 162 | "ssms.cli" = ["config_network_training_lan.yaml"] 163 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, Extension, find_packages 2 | import numpy 3 | 4 | # Try to build with Cython if available 5 | try: 6 | from Cython.Build import cythonize 7 | 8 | ext_modules = cythonize( 9 | [Extension("cssm", ["src/cssm.pyx"], language="c++")], 10 | compiler_directives={"language_level": "3"}, 11 | ) 12 | except ImportError: 13 | ext_modules = [Extension("cssm", ["src/cssm.pyx"], language="c++")] 14 | 15 | # Use find_packages to automatically discover all packages 16 | packages = find_packages(include=["ssms", "ssms.*"]) 17 | 18 | setup( 19 | name="ssm-simulators", 20 | version="0.10.2", 21 | packages=packages, 22 | package_data={ 23 | "ssms": ["**/*.py", "**/*.pyx", "**/*.pxd", "**/*.so", "**/*.pyd"], 24 | }, 25 | include_package_data=True, 26 | include_dirs=[numpy.get_include()], 27 | ext_modules=ext_modules, 28 | install_requires=[ 29 | "numpy", 30 | "pandas", 31 | "scipy", 32 | "matplotlib", 33 | "tqdm", 34 | "pyyaml", 35 | "typer", 36 | ], 37 | ) 38 | -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /sitemap.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lnccbrown/ssm-simulators/fec1aa37edeab0b389c9295d59e4dcdc37803909/sitemap.xml.gz -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | from . import cssm # noqa: D104 2 | 3 | __all__ = ["cssm"] 4 | -------------------------------------------------------------------------------- /ssms/__init__.py: -------------------------------------------------------------------------------- 1 | import importlib.metadata 2 | 3 | from . import basic_simulators 4 | from . import dataset_generators 5 | from . import config 6 | from . import support_utils 7 | from . import hssm_support 8 | 9 | __version__ = importlib.metadata.version("ssm-simulators") 10 | 11 | __all__ = [ 12 | "basic_simulators", 13 | "dataset_generators", 14 | "config", 15 | "support_utils", 16 | "hssm_support", 17 | ] 18 | -------------------------------------------------------------------------------- /ssms/basic_simulators/__init__.py: -------------------------------------------------------------------------------- 1 | from . import boundary_functions 2 | from . import drift_functions 3 | from . import simulator 4 | from . import theta_processor 5 | from . import constants 6 | 7 | __all__ = [ 8 | "boundary_functions", 9 | "drift_functions", 10 | "simulator", 11 | "theta_processor", 12 | "constants", 13 | ] 14 | -------------------------------------------------------------------------------- /ssms/basic_simulators/boundary_functions.py: -------------------------------------------------------------------------------- 1 | """Define a collection of boundary functions for the simulators in the package.""" 2 | 3 | # External 4 | from collections.abc import Callable 5 | 6 | import numpy as np 7 | from scipy.stats import gamma # type: ignore 8 | 9 | # Collection of boundary functions 10 | 11 | 12 | # TODO: #82 Revise how the constant function is implemented. It is not clear what it's supposed to do. # noqa: FIX002 13 | # Constant: (multiplicative) 14 | def constant(t: float | np.ndarray = 0) -> float | np.ndarray: # noqa: ARG001 15 | """Constant boundary function. 16 | 17 | Arguments 18 | --------- 19 | t (float or np.ndarray, optional): Time point(s). Defaults to 0. 20 | 21 | Returns 22 | ------- 23 | float or np.ndarray: Constant boundary value(s), same shape as t 24 | """ 25 | return 1 26 | 27 | 28 | # Angle (additive) 29 | def angle(t: float | np.ndarray = 1, theta: float = 1) -> np.ndarray: 30 | """Angle boundary function. 31 | 32 | Arguments 33 | --------- 34 | t (float or np.ndarray, optional): Time point(s). Defaults to 1. 35 | theta (float, optional): Angle in radians. Defaults to 1. 36 | 37 | Returns 38 | ------- 39 | np.ndarray: Array of boundary values, same shape as t 40 | """ 41 | return np.multiply(t, (-np.sin(theta) / np.cos(theta))) 42 | 43 | 44 | # Generalized logistic bound (additive) 45 | def generalized_logistic( 46 | t: float | np.ndarray = 1, 47 | B: float = 2.0, # noqa: N803 48 | M: float = 3.0, # noqa: N803 49 | v: float = 0.5, # noqa: N803 50 | ) -> np.ndarray: 51 | """Generalized logistic bound. 52 | 53 | Arguments 54 | --------- 55 | t (float or np.ndarray, optional): Time point(s). Defaults to 1. 56 | B (float, optional): Growth rate. Defaults to 2.0. 57 | M (float, optional): Time of maximum growth. Defaults to 3.0. 58 | v (float, optional): Affects near which asymptote maximum growth occurs. 59 | Defaults to 0.5. 60 | 61 | Returns 62 | ------- 63 | np.ndarray: Array of boundary values, same shape as t 64 | """ 65 | return 1 - (1 / np.power(1 + np.exp(-B * (t - M)), 1 / v)) 66 | 67 | 68 | # Weibull survival fun (multiplicative) 69 | def weibull_cdf( 70 | t: float | np.ndarray = 1, alpha: float = 1, beta: float = 1 71 | ) -> np.ndarray: 72 | """Boundary based on weibull survival function. 73 | 74 | Arguments 75 | --------- 76 | t (float or np.ndarray, optional): Time point(s). Defaults to 1. 77 | alpha (float, optional): Shape parameter. Defaults to 1. 78 | beta (float, optional): Scale parameter. Defaults to 1. 79 | 80 | Returns 81 | ------- 82 | np.ndarray: Array of boundary values, same shape as t 83 | """ 84 | return np.exp(-np.power(np.divide(t, beta), alpha)) 85 | 86 | 87 | def conflict_gamma( 88 | t: float | np.ndarray = np.arange( # noqa: B008 89 | 0, 20, 0.1 90 | ), # TODO: #81 B008 Do not perform function call `np.arange` in argument defaults; instead, perform the call within the function, or read the default from a module-level singleton variable # noqa: B008, FIX002 91 | theta: float = 0.5, 92 | scale: float = 1, 93 | alphaGamma: float = 1.01, 94 | scaleGamma: float = 0.3, 95 | ) -> np.ndarray: 96 | """Conflict bound that allows initial divergence then collapse. 97 | 98 | Arguments 99 | --------- 100 | t: (float, np.ndarray) 101 | Time points (with arbitrary measure, but in HDDM it is used as seconds), 102 | at which to evaluate the bound. Defaults to np.arange(0, 20, 0.1). 103 | theta: float 104 | Collapse angle. Defaults to 0.5. 105 | scale: float 106 | Scaling the gamma distribution of the boundary 107 | (since bound does not have to integrate to one). Defaults to 1.0. 108 | alphaGamma: float 109 | alpha parameter for a gamma in scale shape parameterization. Defaults to 110 | """ 111 | return ( 112 | scale * gamma.pdf(t, a=alphaGamma, loc=0, scale=scaleGamma) 113 | + np.multiply(t, (-np.sin(theta) / np.cos(theta))), 114 | ) 115 | 116 | 117 | # Define Type alias for boundary functions 118 | BoundaryFunction = Callable[..., np.ndarray] 119 | 120 | constant: BoundaryFunction = constant # noqa: PLW0127 121 | angle: BoundaryFunction = angle # noqa: PLW0127 122 | generalized_logistic: BoundaryFunction = generalized_logistic # noqa: PLW0127 123 | weibull_cdf: BoundaryFunction = weibull_cdf # noqa: PLW0127 124 | conflict_gamma: BoundaryFunction = conflict_gamma # noqa: PLW0127 125 | -------------------------------------------------------------------------------- /ssms/basic_simulators/constants.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | 3 | 4 | DEFAULT_SIM_PARAMS: dict[str, Any] = { 5 | "max_t": 20.0, 6 | "n_samples": 2000, 7 | "n_trials": 1000, 8 | "delta_t": 0.001, 9 | "random_state": None, 10 | "return_option": "full", 11 | "smooth_unif": False, 12 | } 13 | -------------------------------------------------------------------------------- /ssms/cli/config_data_generation.yaml: -------------------------------------------------------------------------------- 1 | MODEL: 'ddm' 2 | N_SAMPLES: 2000 3 | N_PARAMETER_SETS: 100 4 | DELTA_T: 0.001 5 | N_TRAINING_SAMPLES_BY_PARAMETER_SET: 200 6 | N_SUBRUNS: 20 7 | GENERATOR_APPROACH: 'lan' 8 | 9 | -------------------------------------------------------------------------------- /ssms/config/__init__.py: -------------------------------------------------------------------------------- 1 | """Configuration module for SSM simulators. 2 | 3 | This module provides access to model configurations, boundary and drift function 4 | configurations, and various generator configurations used throughout the SSMS package. 5 | It centralizes all configuration-related functionality to ensure consistent 6 | parameter settings across simulations. 7 | """ 8 | 9 | import copy 10 | 11 | from ssms.config._modelconfig import get_model_config 12 | 13 | from ._modelconfig.base import boundary_config, drift_config 14 | from .generator_config.data_generator_config import ( 15 | data_generator_config, # TODO: remove from interface in v1.0.0 16 | get_cpn_only_config, 17 | get_default_generator_config, 18 | get_defective_detector_config, 19 | get_kde_simulation_filters, 20 | get_lan_config, 21 | get_opn_only_config, 22 | get_ratio_estimator_config, 23 | ) 24 | from .kde_constants import KDE_NO_DISPLACE_T # noqa: F401 25 | 26 | 27 | def boundary_config_to_function_params(config: dict) -> dict: 28 | """ 29 | Convert boundary configuration to function parameters. 30 | 31 | Parameters 32 | ---------- 33 | config: dict 34 | Dictionary containing the boundary configuration 35 | 36 | Returns 37 | ------- 38 | dict 39 | Dictionary with adjusted key names so that they match function parameters names 40 | directly. 41 | """ 42 | return {f"boundary_{k}": v for k, v in config.items()} 43 | 44 | 45 | class CopyOnAccessDict(dict): 46 | """A dict that returns a deep copy of the value on lookup.""" 47 | 48 | def __getitem__(self, key): 49 | return copy.deepcopy(super().__getitem__(key)) 50 | 51 | 52 | model_config = CopyOnAccessDict(get_model_config()) 53 | 54 | __all__ = [ 55 | "model_config", 56 | "boundary_config", 57 | "drift_config", 58 | "boundary_config_to_function_params", 59 | "get_lan_config", 60 | "get_opn_only_config", 61 | "get_cpn_only_config", 62 | "get_kde_simulation_filters", 63 | "get_defective_detector_config", 64 | "get_ratio_estimator_config", 65 | "get_default_generator_config", 66 | "data_generator_config", # TODO: remove from interface in v1.0.0 67 | ] 68 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/angle.py: -------------------------------------------------------------------------------- 1 | """Angle model configuration.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_angle_config(): 8 | """Get the configuration for the Angle model.""" 9 | return { 10 | "name": "angle", 11 | "params": ["v", "a", "z", "t", "theta"], 12 | "param_bounds": [[-3.0, 0.3, 0.1, 1e-3, -0.1], [3.0, 3.0, 0.9, 2.0, 1.3]], 13 | "boundary_name": "angle", 14 | "boundary": bf.angle, 15 | "n_params": 5, 16 | "default_params": [0.0, 1.0, 0.5, 1e-3, 0.0], 17 | "nchoices": 2, 18 | "choices": [-1, 1], 19 | "n_particles": 1, 20 | "simulator": cssm.ddm_flexbound, 21 | } 22 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/base.py: -------------------------------------------------------------------------------- 1 | """Base configurations and utilities for model configs.""" 2 | 3 | from ssms.basic_simulators import boundary_functions as bf 4 | from ssms.basic_simulators import drift_functions as df 5 | 6 | # Boundary configurations 7 | boundary_config = { 8 | "constant": { 9 | "fun": bf.constant, 10 | "params": [], 11 | "multiplicative": True, 12 | }, 13 | "angle": { 14 | "fun": bf.angle, 15 | "params": ["theta"], 16 | "multiplicative": False, 17 | }, 18 | "weibull_cdf": { 19 | "fun": bf.weibull_cdf, 20 | "params": ["alpha", "beta"], 21 | "multiplicative": True, 22 | }, 23 | "generalized_logistic": { 24 | "fun": bf.generalized_logistic, 25 | "params": ["B", "M", "v"], 26 | "multiplicative": True, 27 | }, 28 | "conflict_gamma": { 29 | "fun": bf.conflict_gamma, 30 | "params": ["theta", "scale", "alphaGamma", "scaleGamma"], 31 | "multiplicative": False, 32 | }, 33 | } 34 | 35 | # Drift configurations 36 | drift_config = { 37 | "constant": { 38 | "fun": df.constant, 39 | "params": [], 40 | }, 41 | "gamma_drift": { 42 | "fun": df.gamma_drift, 43 | "params": ["shape", "scale", "c"], 44 | }, 45 | "ds_conflict_drift": { 46 | "fun": df.ds_conflict_drift, 47 | "params": ["tinit", "dinit", "tslope", "dslope", "tfixedp", "tcoh", "dcoh"], 48 | }, 49 | "ds_conflict_stimflexons_drift": { 50 | "fun": df.ds_conflict_stimflexons_drift, 51 | "params": [ 52 | "tinit", 53 | "dinit", 54 | "tslope", 55 | "dslope", 56 | "tfixedp", 57 | "tcoh", 58 | "dcoh", 59 | "tonset", 60 | "donset", 61 | ], 62 | }, 63 | "attend_drift": { 64 | "fun": df.attend_drift, 65 | "params": ["ptarget", "pouter", "pinner", "r", "sda"], 66 | }, 67 | "attend_drift_simple": { 68 | "fun": df.attend_drift_simple, 69 | "params": ["ptarget", "pouter", "r", "sda"], 70 | }, 71 | } 72 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/ddm.py: -------------------------------------------------------------------------------- 1 | """DDM model configuration.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_config(): 8 | """Get the configuration for the DDM model.""" 9 | return { 10 | "name": "ddm", 11 | "params": ["v", "a", "z", "t"], 12 | "param_bounds": [[-3.0, 0.3, 0.1, 0.0], [3.0, 2.5, 0.9, 2.0]], 13 | "boundary_name": "constant", 14 | "boundary": bf.constant, 15 | "boundary_params": [], 16 | "n_params": 4, 17 | "default_params": [0.0, 1.0, 0.5, 1e-3], 18 | "nchoices": 2, 19 | "choices": [-1, 1], 20 | "n_particles": 1, 21 | "simulator": cssm.ddm_flexbound, 22 | } 23 | 24 | 25 | def get_ddm_legacy_config(): 26 | """Get the configuration for the DDM legacy model.""" 27 | return { 28 | "name": "ddm_legacy", 29 | "params": ["v", "a", "z", "t"], 30 | "param_bounds": [[-3.0, 0.3, 0.1, 0.0], [3.0, 2.5, 0.9, 2.0]], 31 | "boundary_name": "constant", 32 | "boundary": bf.constant, 33 | "n_params": 4, 34 | "default_params": [0.0, 1.0, 0.5, 1e-3], 35 | "nchoices": 2, 36 | "choices": [-1, 1], 37 | "n_particles": 1, 38 | "simulator": cssm.ddm, 39 | } 40 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/ddm_par2.py: -------------------------------------------------------------------------------- 1 | """Configuration for DDM par2 models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_par2_config(): 8 | return { 9 | "name": "ddm_par2", 10 | "params": ["vh", "vl1", "vl2", "a", "zh", "zl1", "zl2", "t"], 11 | "param_bounds": [ 12 | [-4.0, -4.0, -4.0, 0.3, 0.2, 0.2, 0.2, 0.0], 13 | [4.0, 4.0, 4.0, 2.5, 0.8, 0.8, 0.8, 2.0], 14 | ], 15 | "boundary_name": "constant", 16 | "boundary": bf.constant, 17 | "n_params": 8, 18 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0], 19 | "nchoices": 4, 20 | "choices": [0, 1, 2, 3], 21 | "n_particles": 1, 22 | "simulator": cssm.ddm_flexbound_par2, 23 | } 24 | 25 | 26 | def get_ddm_par2_no_bias_config(): 27 | return { 28 | "name": "ddm_par2_no_bias", 29 | "params": ["vh", "vl1", "vl2", "a", "t"], 30 | "param_bounds": [[-4.0, -4.0, -4.0, 0.3, 0.0], [4.0, 4.0, 4.0, 2.5, 2.0]], 31 | "boundary_name": "constant", 32 | "boundary": bf.constant, 33 | "n_params": 5, 34 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0], 35 | "nchoices": 4, 36 | "choices": [0, 1, 2, 3], 37 | "n_particles": 1, 38 | "simulator": cssm.ddm_flexbound_par2, 39 | } 40 | 41 | 42 | def get_ddm_par2_conflict_gamma_no_bias_config(): 43 | return { 44 | "name": "ddm_par2_conflict_gamma_no_bias", 45 | "params": [ 46 | "vh", 47 | "vl1", 48 | "vl2", 49 | "t", 50 | "a", 51 | "theta", 52 | "scale", 53 | "alphaGamma", 54 | "scaleGamma", 55 | ], 56 | "param_bounds": [ 57 | [-4.0, -4.0, -4.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 58 | [4.0, 4.0, 4.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 59 | ], 60 | "boundary_name": "conflict_gamma", 61 | "boundary": bf.conflict_gamma, 62 | "n_params": 9, 63 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0, 0.5, 1.0, 2, 2], 64 | "nchoices": 4, 65 | "choices": [0, 1, 2, 3], 66 | "n_particles": 1, 67 | "simulator": cssm.ddm_flexbound_par2, 68 | } 69 | 70 | 71 | def get_ddm_par2_angle_no_bias_config(): 72 | return { 73 | "name": "ddm_par2_angle_no_bias", 74 | "params": ["vh", "vl1", "vl2", "a", "t", "theta"], 75 | "param_bounds": [ 76 | [-4.0, -4.0, -4.0, 0.3, 0.0, -0.1], 77 | [4.0, 4.0, 4.0, 2.5, 2.0, 1.0], 78 | ], 79 | "boundary_name": "angle", 80 | "boundary": bf.angle, 81 | "boundary_multiplicative": False, 82 | "n_params": 6, 83 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0, 0.0], 84 | "nchoices": 4, 85 | "choices": [0, 1, 2, 3], 86 | "n_particles": 1, 87 | "simulator": cssm.ddm_flexbound_par2, 88 | } 89 | 90 | 91 | def get_ddm_par2_weibull_no_bias_config(): 92 | return { 93 | "name": "ddm_par2_weibull_no_bias", 94 | "params": ["vh", "vl1", "vl2", "a", "t", "alpha", "beta"], 95 | "param_bounds": [ 96 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.31, 0.31], 97 | [4.0, 4.0, 4.0, 2.5, 2.0, 4.99, 6.99], 98 | ], 99 | "boundary_name": "weibull_cdf", 100 | "boundary": bf.weibull_cdf, 101 | "boundary_multiplicative": True, 102 | "n_params": 7, 103 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 3.0], 104 | "nchoices": 4, 105 | "choices": [0, 1, 2, 3], 106 | "n_particles": 1, 107 | "simulator": cssm.ddm_flexbound_par2, 108 | } 109 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/ddm_random.py: -------------------------------------------------------------------------------- 1 | """Configuration for DDM models with random variables.""" 2 | 3 | import functools 4 | import numpy as np 5 | import scipy.stats as sps 6 | 7 | import cssm 8 | from ssms.basic_simulators import boundary_functions as bf 9 | 10 | 11 | def get_ddm_st_config(): 12 | """Get configuration for DDM with random non-decision time.""" 13 | return { 14 | "name": "ddm_st", 15 | "params": ["v", "a", "z", "t", "st"], 16 | "param_bounds": [ 17 | [-3.0, 0.3, 0.3, 0.25, 1e-3], 18 | [3.0, 2.5, 0.7, 2.25, 0.25], 19 | ], 20 | "boundary_name": "constant", 21 | "boundary": bf.constant, 22 | "n_params": 5, 23 | "default_params": [0.0, 1.0, 0.5, 0.25, 1e-3], 24 | "nchoices": 2, 25 | "choices": [-1, 1], 26 | "n_particles": 1, 27 | "simulator": cssm.full_ddm_rv, 28 | "simulator_fixed_params": { 29 | "z_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 30 | "v_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 31 | }, 32 | "simulator_param_mappings": { 33 | "t_dist": lambda st: functools.partial( 34 | sps.uniform.rvs, loc=(-1) * st, scale=2 * st 35 | ), 36 | }, 37 | } 38 | 39 | 40 | def get_ddm_truncnormt_config(): 41 | """Get configuration for DDM with truncated normal non-decision time.""" 42 | return { 43 | "name": "ddm_truncnormt", 44 | "params": ["v", "a", "z", "mt", "st"], 45 | "param_bounds": [ 46 | [-3.0, 0.3, 0.3, 0.05, 1e-3], 47 | [3.0, 2.5, 0.7, 2.25, 0.5], 48 | ], 49 | "boundary_name": "constant", 50 | "boundary": bf.constant, 51 | "n_params": 5, 52 | "default_params": [0.0, 1.0, 0.5, 0.25, 1e-3], 53 | "nchoices": 2, 54 | "choices": [-1, 1], 55 | "n_particles": 1, 56 | "simulator": cssm.full_ddm_rv, 57 | "simulator_fixed_params": { 58 | "z_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 59 | "v_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 60 | "t": 0.0, 61 | }, 62 | "simulator_param_mappings": { 63 | "t_dist": lambda mt, st: functools.partial( 64 | sps.truncnorm.rvs, 65 | a=(-1) * np.divide(mt, st), 66 | b=np.inf, 67 | loc=mt, 68 | scale=st, 69 | ), 70 | }, 71 | } 72 | 73 | 74 | def get_ddm_rayleight_config(): 75 | """Get configuration for DDM with Rayleigh non-decision time.""" 76 | return { 77 | "name": "ddm_rayleight", 78 | "params": ["v", "a", "z", "st"], 79 | "param_bounds": [ 80 | [-3.0, 0.3, 0.3, 1e-3], 81 | [3.0, 2.5, 0.7, 1.0], 82 | ], 83 | "boundary_name": "constant", 84 | "boundary": bf.constant, 85 | "n_params": 4, 86 | "default_params": [0.0, 1.0, 0.5, 0.2], 87 | "nchoices": 2, 88 | "choices": [-1, 1], 89 | "n_particles": 1, 90 | "simulator": cssm.full_ddm_rv, 91 | "simulator_fixed_params": { 92 | "z_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 93 | "v_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 94 | "t": 0.0, 95 | }, 96 | "simulator_param_mappings": { 97 | "t_dist": lambda st: functools.partial( 98 | sps.rayleigh.rvs, 99 | loc=0, 100 | scale=st, 101 | ), 102 | }, 103 | } 104 | 105 | 106 | def get_ddm_sdv_config(): 107 | """Get configuration for DDM with random drift rate.""" 108 | return { 109 | "name": "ddm_sdv", 110 | "params": ["v", "a", "z", "t", "sv"], 111 | "param_bounds": [[-3.0, 0.3, 0.1, 1e-3, 1e-3], [3.0, 2.5, 0.9, 2.0, 2.5]], 112 | "boundary_name": "constant", 113 | "boundary": bf.constant, 114 | "n_params": 5, 115 | "default_params": [0.0, 1.0, 0.5, 1e-3, 1e-3], 116 | "nchoices": 2, 117 | "choices": [-1, 1], 118 | "n_particles": 1, 119 | "simulator": cssm.full_ddm_rv, 120 | "simulator_fixed_params": { 121 | "z_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 122 | "t_dist": functools.partial(sps.norm.rvs, loc=0, scale=0), 123 | }, 124 | "simulator_param_mappings": { 125 | "v_dist": lambda sv: functools.partial( 126 | sps.norm.rvs, 127 | loc=0, 128 | scale=sv, 129 | ), 130 | }, 131 | } 132 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/ddm_seq2.py: -------------------------------------------------------------------------------- 1 | """Configuration for DDM seq2 models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_seq2_config(): 8 | """Get the configuration for the DDM seq2 model.""" 9 | return { 10 | "name": "ddm_seq2", 11 | "params": ["vh", "vl1", "vl2", "a", "zh", "zl1", "zl2", "t"], 12 | "param_bounds": [ 13 | [-4.0, -4.0, -4.0, 0.3, 0.2, 0.2, 0.2, 0.0], 14 | [4.0, 4.0, 4.0, 2.5, 0.8, 0.8, 0.8, 2.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "n_params": 8, 19 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0], 20 | "nchoices": 4, 21 | "choices": [0, 1, 2, 3], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound_seq2, 24 | } 25 | 26 | 27 | def get_ddm_seq2_no_bias_config(): 28 | """Get the configuration for the DDM seq2 no bias model.""" 29 | return { 30 | "name": "ddm_seq2_no_bias", 31 | "params": ["vh", "vl1", "vl2", "a", "t"], 32 | "param_bounds": [[-4.0, -4.0, -4.0, 0.3, 0.0], [4.0, 4.0, 4.0, 2.5, 2.0]], 33 | "boundary_name": "constant", 34 | "boundary": bf.constant, 35 | "n_params": 5, 36 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0], 37 | "nchoices": 4, 38 | "choices": [0, 1, 2, 3], 39 | "n_particles": 1, 40 | "simulator": cssm.ddm_flexbound_seq2, 41 | } 42 | 43 | 44 | def get_ddm_seq2_conflict_gamma_no_bias_config(): 45 | """Get the configuration for the DDM seq2 conflict gamma no bias model.""" 46 | return { 47 | "name": "ddm_seq2_conflict_gamma_no_bias", 48 | "params": [ 49 | "vh", 50 | "vl1", 51 | "vl2", 52 | "t", 53 | "a", 54 | "theta", 55 | "scale", 56 | "alphaGamma", 57 | "scaleGamma", 58 | ], 59 | "param_bounds": [ 60 | [-4.0, -4.0, -4.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 61 | [4.0, 4.0, 4.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 62 | ], 63 | "boundary_name": "conflict_gamma", 64 | "boundary": bf.conflict_gamma, 65 | "n_params": 9, 66 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0, 0.5, 1.0, 2, 2], 67 | "nchoices": 4, 68 | "choices": [0, 1, 2, 3], 69 | "n_particles": 1, 70 | "simulator": cssm.ddm_flexbound_seq2, 71 | } 72 | 73 | 74 | def get_ddm_seq2_angle_no_bias_config(): 75 | """Get the configuration for the DDM seq2 angle no bias model.""" 76 | return { 77 | "name": "ddm_seq2_angle_no_bias", 78 | "params": ["vh", "vl1", "vl2", "a", "t", "theta"], 79 | "param_bounds": [ 80 | [-4.0, -4.0, -4.0, 0.3, 0.0, -0.1], 81 | [4.0, 4.0, 4.0, 2.5, 2.0, 1.0], 82 | ], 83 | "boundary_name": "angle", 84 | "boundary": bf.angle, 85 | "boundary_multiplicative": False, 86 | "n_params": 6, 87 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0, 0.0], 88 | "nchoices": 4, 89 | "choices": [0, 1, 2, 3], 90 | "n_particles": 1, 91 | "simulator": cssm.ddm_flexbound_seq2, 92 | } 93 | 94 | 95 | def get_ddm_seq2_weibull_no_bias_config(): 96 | """Get the configuration for the DDM seq2 weibull no bias model.""" 97 | return { 98 | "name": "ddm_seq2_weibull_no_bias", 99 | "params": ["vh", "vl1", "vl2", "a", "t", "alpha", "beta"], 100 | "param_bounds": [ 101 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.31, 0.31], 102 | [4.0, 4.0, 4.0, 2.5, 2.0, 4.99, 6.99], 103 | ], 104 | "boundary_name": "weibull_cdf", 105 | "boundary": bf.weibull_cdf, 106 | "boundary_multiplicative": True, 107 | "n_params": 7, 108 | "default_params": [0.0, 0.0, 0.0, 1.0, 1.0, 2.5, 3.5], 109 | "nchoices": 4, 110 | "choices": [0, 1, 2, 3], 111 | "n_particles": 1, 112 | "simulator": cssm.ddm_flexbound_seq2, 113 | } 114 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/dev_rlwm_lba.py: -------------------------------------------------------------------------------- 1 | """Configuration for RLWM LBA models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_dev_rlwm_lba_pw_v1_config(): 8 | """Get configuration for RLWM LBA pairwise v1 model.""" 9 | return { 10 | "name": "dev_rlwm_lba_pw_v1", 11 | "params": [ 12 | "vRL0", 13 | "vRL1", 14 | "vRL2", 15 | "vWM0", 16 | "vWM1", 17 | "vWM2", 18 | "a", 19 | "z", 20 | "tWM", 21 | ], 22 | "param_bounds": [ 23 | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.0, 0.01], 24 | [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.1, 0.5, 0.5], 25 | ], 26 | "boundary_name": "constant", 27 | "boundary": bf.constant, 28 | "n_params": 9, 29 | "default_params": [0.5, 0.3, 0.2, 0.5, 0.3, 0.2, 0.5, 0.2, 0.1], 30 | "nchoices": 3, 31 | "n_particles": 3, 32 | "simulator": cssm.rlwm_lba_pw_v1, 33 | } 34 | 35 | 36 | def get_dev_rlwm_lba_race_v1_config(): 37 | """Get configuration for RLWM LBA race v1 model.""" 38 | return { 39 | # RLWM_Race_LBA_3 without ndt; sum of all vRL = 1 and sum of all vWM = 1 40 | "name": "dev_rlwm_lba_race_v1", 41 | "params": [ 42 | "vRL0", 43 | "vRL1", 44 | "vRL2", 45 | "vWM0", 46 | "vWM1", 47 | "vWM2", 48 | "a", 49 | "z", 50 | ], 51 | "param_bounds": [ 52 | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.0], 53 | [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.1, 0.5], 54 | ], 55 | "boundary_name": "constant", 56 | "boundary": bf.constant, 57 | "n_params": 8, 58 | "default_params": [0.5, 0.3, 0.2, 0.5, 0.3, 0.2, 0.5, 0.2], 59 | "nchoices": 3, 60 | "choices": [0, 1, 2], 61 | "n_particles": 3, 62 | "simulator": cssm.rlwm_lba_race, 63 | } 64 | 65 | 66 | def get_dev_rlwm_lba_race_v2_config(): 67 | """Get configuration for RLWM LBA race v2 model.""" 68 | return { 69 | # RLWM_Race_LBA_3 without ndt; no constraints on the sum of vRL and vWM. 70 | "name": "dev_rlwm_lba_race_v2", 71 | "params": [ 72 | "vRL0", 73 | "vRL1", 74 | "vRL2", 75 | "vWM0", 76 | "vWM1", 77 | "vWM2", 78 | "a", 79 | "z", 80 | ], 81 | "param_bounds": [ 82 | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.0], 83 | [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 2.0], 84 | ], 85 | "boundary_name": "constant", 86 | "boundary": bf.constant, 87 | "n_params": 8, 88 | "default_params": [0.5, 0.3, 0.2, 0.5, 0.3, 0.2, 0.5, 0.2], 89 | "nchoices": 3, 90 | "n_particles": 3, 91 | "simulator": cssm.rlwm_lba_race, 92 | } 93 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/ds_conflict_drift.py: -------------------------------------------------------------------------------- 1 | """Configuration for conflict models with dynamical drift.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf, drift_functions as df 5 | 6 | 7 | def get_ds_conflict_drift_config(): 8 | return { 9 | "name": "ds_conflict_drift", 10 | "params": [ 11 | "a", 12 | "z", 13 | "t", 14 | "tinit", 15 | "dinit", 16 | "tslope", 17 | "dslope", 18 | "tfixedp", 19 | "tcoh", 20 | "dcoh", 21 | ], 22 | "param_bounds": [ 23 | [0.3, 0.1, 1e-3, 0.0, 0.0, 0.01, 0.01, 0.0, -1.0, -1.0], 24 | [3.0, 0.9, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0], 25 | ], 26 | "boundary_name": "constant", 27 | "boundary": bf.constant, 28 | "drift_name": "ds_conflict_drift", 29 | "drift_fun": df.ds_conflict_drift, 30 | "n_params": 10, 31 | "default_params": [2.0, 0.5, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 0.5, -0.5], 32 | "nchoices": 2, 33 | "choices": [-1, 1], 34 | "n_particles": 1, 35 | "simulator": cssm.ddm_flex, 36 | } 37 | 38 | 39 | def get_ds_conflict_drift_angle_config(): 40 | return { 41 | "name": "ds_conflict_drift_angle", 42 | "params": [ 43 | "a", 44 | "z", 45 | "t", 46 | "tinit", 47 | "dinit", 48 | "tslope", 49 | "dslope", 50 | "tfixedp", 51 | "tcoh", 52 | "dcoh", 53 | "theta", 54 | ], 55 | "param_bounds": [ 56 | [0.3, 0.1, 1e-3, 0.0, 0.0, 0.01, 0.01, 0.0, -1.0, -1.0, 0.0], 57 | [3.0, 0.9, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 1.3], 58 | ], 59 | "boundary_name": "angle", 60 | "boundary": bf.angle, 61 | "drift_name": "ds_conflict_drift", 62 | "drift_fun": df.ds_conflict_drift, 63 | "n_params": 11, 64 | "default_params": [2.0, 0.5, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 0.5, -0.5, 0.0], 65 | "nchoices": 2, 66 | "choices": [-1, 1], 67 | "n_particles": 1, 68 | "simulator": cssm.ddm_flex, 69 | } 70 | 71 | 72 | def get_ds_conflict_stimflexons_drift_config(): 73 | return { 74 | "name": "ds_conflict_stimflexons_drift", 75 | "params": [ 76 | "a", 77 | "z", 78 | "t", 79 | "tinit", 80 | "dinit", 81 | "tslope", 82 | "dslope", 83 | "tfixedp", 84 | "tcoh", 85 | "dcoh", 86 | "tonset", 87 | "donset", 88 | ], 89 | "param_bounds": [ 90 | [0.3, 0.1, 1e-3, 0.0, 0.0, 0.01, 0.01, 0.0, -1.0, -1.0, 0.0, 0.0], 91 | [3.0, 0.9, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 1.0, 1.0], 92 | ], 93 | "boundary_name": "constant", 94 | "boundary": bf.constant, 95 | "drift_name": "ds_conflict_stimflexons_drift", 96 | "drift_fun": df.ds_conflict_stimflexons_drift, 97 | "n_params": 12, 98 | "default_params": [2.0, 0.5, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 0.5, -0.5, 0.0, 0.0], 99 | "nchoices": 2, 100 | "choices": [-1, 1], 101 | "n_particles": 1, 102 | "simulator": cssm.ddm_flex, 103 | } 104 | 105 | 106 | def get_ds_conflict_stimflexons_drift_angle_config(): 107 | return { 108 | "name": "ds_conflict_stimflexons_drift_angle", 109 | "params": [ 110 | "a", 111 | "z", 112 | "t", 113 | "tinit", 114 | "dinit", 115 | "tslope", 116 | "dslope", 117 | "tfixedp", 118 | "tcoh", 119 | "dcoh", 120 | "tonset", 121 | "donset", 122 | "theta", 123 | ], 124 | "param_bounds": [ 125 | [0.3, 0.1, 1e-3, 0.0, 0.0, 0.01, 0.01, 0.0, -1.0, -1.0, 0.0, 0.0, 0.0], 126 | [3.0, 0.9, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 1.0, 1.0, 1.3], 127 | ], 128 | "boundary_name": "angle", 129 | "boundary": bf.angle, 130 | "drift_name": "ds_conflict_stimflexons_drift", 131 | "drift_fun": df.ds_conflict_stimflexons_drift, 132 | "n_params": 13, 133 | "default_params": [ 134 | 2.0, 135 | 0.5, 136 | 1.0, 137 | 2.0, 138 | 2.0, 139 | 2.0, 140 | 2.0, 141 | 3.0, 142 | 0.5, 143 | -0.5, 144 | 0.0, 145 | 0.0, 146 | 0.0, 147 | ], 148 | "nchoices": 2, 149 | "choices": [-1, 1], 150 | "n_particles": 1, 151 | "simulator": cssm.ddm_flex, 152 | } 153 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/full_ddm.py: -------------------------------------------------------------------------------- 1 | """Full DDM model configuration.""" 2 | 3 | import functools 4 | import scipy.stats as sps # type: ignore 5 | 6 | import cssm 7 | from ssms.basic_simulators import boundary_functions as bf 8 | 9 | 10 | def get_full_ddm_config(): 11 | """Get the configuration for the Full DDM model.""" 12 | return { 13 | "name": "full_ddm", 14 | "params": ["v", "a", "z", "t", "sz", "sv", "st"], 15 | "param_bounds": [ 16 | [-3.0, 0.3, 0.3, 0.25, 1e-3, 1e-3, 1e-3], 17 | [3.0, 2.5, 0.7, 2.25, 0.2, 2.0, 0.25], 18 | ], 19 | "boundary_name": "constant", 20 | "boundary": bf.constant, 21 | "n_params": 7, 22 | "default_params": [0.0, 1.0, 0.5, 0.25, 1e-3, 1e-3, 1e-3], 23 | "nchoices": 2, 24 | "choices": [-1, 1], 25 | "n_particles": 1, 26 | "simulator": cssm.full_ddm, 27 | } 28 | 29 | 30 | def get_full_ddm_rv_config(): 31 | """Get configuration for full DDM with random variables.""" 32 | return { 33 | "name": "full_ddm_rv", 34 | "params": ["v", "a", "z", "t", "sz", "sv", "st"], 35 | "param_bounds": { 36 | "v": (-3.0, 3.0), 37 | "a": (0.3, 2.5), 38 | "z": (0.3, 0.7), 39 | "t": (0.25, 2.25), 40 | "sz": (1e-3, 0.2), 41 | "sv": (1e-3, 2.0), 42 | "st": (1e-3, "t"), 43 | }, 44 | "boundary_name": "constant", 45 | "boundary": bf.constant, 46 | "n_params": 7, 47 | "default_params": [0.0, 1.0, 0.5, 0.25, 1e-3, 1e-3, 1e-3], 48 | "nchoices": 2, 49 | "choices": [-1, 1], 50 | "n_particles": 1, 51 | "simulator": cssm.full_ddm_rv, 52 | "simulator_fixed_params": {}, 53 | "simulator_param_mappings": { 54 | "t_dist": lambda st: functools.partial( 55 | sps.uniform.rvs, loc=(-1) * st, scale=2 * st 56 | ), 57 | "v_dist": lambda sv: functools.partial( 58 | sps.norm.rvs, 59 | loc=0, 60 | scale=sv, 61 | ), 62 | "z_dist": lambda sz: functools.partial( 63 | sps.uniform.rvs, loc=(-1) * sz, scale=2 * sz 64 | ), 65 | }, 66 | } 67 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/gamma_drift.py: -------------------------------------------------------------------------------- 1 | """Gamma drift model configuration.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf, drift_functions as df 5 | 6 | 7 | def get_gamma_drift_config(): 8 | """Get the configuration for the Gamma drift model.""" 9 | return { 10 | "name": "gamma_drift", 11 | "params": ["v", "a", "z", "t", "shape", "scale", "c"], 12 | "param_bounds": [ 13 | [-3.0, 0.3, 0.1, 1e-3, 2.0, 0.01, -3.0], 14 | [3.0, 3.0, 0.9, 2.0, 10.0, 1.0, 3.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "drift_name": "gamma_drift", 19 | "drift_fun": df.gamma_drift, 20 | "n_params": 7, 21 | "default_params": [0.0, 1.0, 0.5, 0.25, 5.0, 0.5, 1.0], 22 | "nchoices": 2, 23 | "choices": [-1, 1], 24 | "n_particles": 1, 25 | "simulator": cssm.ddm_flex, 26 | } 27 | 28 | 29 | def get_gamma_drift_angle_config(): 30 | """Get the configuration for the Gamma drift angle model.""" 31 | return { 32 | "name": "gamma_drift_angle", 33 | "params": ["v", "a", "z", "t", "theta", "shape", "scale", "c"], 34 | "param_bounds": [ 35 | [-3.0, 0.3, 0.1, 1e-3, -0.1, 2.0, 0.01, -3.0], 36 | [3.0, 3.0, 0.9, 2.0, 1.3, 10.0, 1.0, 3.0], 37 | ], 38 | "boundary_name": "angle", 39 | "boundary": bf.angle, 40 | "drift_name": "gamma_drift", 41 | "drift_fun": df.gamma_drift, 42 | "n_params": 8, 43 | "default_params": [0.0, 1.0, 0.5, 0.25, 0.0, 5.0, 0.5, 1.0], 44 | "nchoices": 2, 45 | "choices": [-1, 1], 46 | "n_particles": 1, 47 | "simulator": cssm.ddm_flex, 48 | } 49 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/lba.py: -------------------------------------------------------------------------------- 1 | """LBA (Linear Ballistic Accumulator) model configurations.""" 2 | 3 | from ssms.basic_simulators import boundary_functions as bf 4 | import cssm 5 | 6 | 7 | def get_lba2_config(): 8 | """Get configuration for LBA2 model.""" 9 | return { 10 | "name": "lba2", 11 | "params": ["A", "b", "v0", "v1"], 12 | "param_bounds": [[0.0, 0.0, 0.0, 0.1], [1.0, 1.0, 1.0, 1.1]], 13 | "boundary_name": "constant", 14 | "boundary": bf.constant, 15 | "n_params": 4, 16 | "default_params": [0.3, 0.5, 0.5, 0.5], 17 | "nchoices": 2, 18 | "choices": [0, 1], 19 | "n_particles": 2, 20 | "simulator": cssm.lba_vanilla, 21 | } 22 | 23 | 24 | def get_lba3_config(): 25 | """Get configuration for LBA3 model.""" 26 | return { 27 | "name": "lba3", 28 | "params": ["A", "b", "v0", "v1", "v2"], 29 | "param_bounds": [[0.0, 0.0, 0.0, 0.1, 0.1], [1.0, 1.0, 1.0, 1.1, 0.50]], 30 | "boundary_name": "constant", 31 | "boundary": bf.constant, 32 | "n_params": 5, 33 | "default_params": [0.3, 0.5, 0.25, 0.5, 0.25], 34 | "nchoices": 3, 35 | "choices": [0, 1, 2], 36 | "n_particles": 3, 37 | "simulator": cssm.lba_vanilla, 38 | } 39 | 40 | 41 | def get_lba_3_vs_constraint_config(): 42 | """Get configuration for LBA3 with vs constraint model.""" 43 | return { 44 | # conventional analytical LBA with constraints on vs (sum of all v = 1) 45 | "name": "lba_3_vs_constraint", 46 | "params": ["v0", "v1", "v2", "a", "z"], 47 | "param_bounds": [[0.0, 0.0, 0.0, 0.1, 0.1], [1.0, 1.0, 1.0, 1.1, 0.50]], 48 | "boundary_name": "constant", 49 | "boundary": bf.constant, 50 | "n_params": 5, 51 | "default_params": [0.5, 0.3, 0.2, 0.5, 0.2], 52 | "nchoices": 3, 53 | "choices": [0, 1, 2], 54 | "n_particles": 3, 55 | "simulator": cssm.lba_vanilla, 56 | } 57 | 58 | 59 | def get_lba_angle_3_vs_constraint_config(): 60 | """Get configuration for LBA angle 3 vs constraint model.""" 61 | return { 62 | # conventional analytical LBA with angle with constraints on vs (sum of all v=1) 63 | "name": "lba_angle_3_vs_constraint", 64 | "params": ["v0", "v1", "v2", "a", "z", "theta"], 65 | "param_bounds": [[0.0, 0.0, 0.0, 0.1, 0.0, 0], [1.0, 1.0, 1.0, 1.1, 0.5, 1.3]], 66 | "boundary_name": "constant", 67 | "boundary": bf.constant, 68 | "n_params": 6, 69 | "default_params": [0.5, 0.3, 0.2, 0.5, 0.2, 0.0], 70 | "nchoices": 3, 71 | "choices": [0, 1, 2], 72 | "n_particles": 3, 73 | "simulator": cssm.lba_angle, 74 | } 75 | 76 | 77 | def get_lba_angle_3_config(): 78 | """Get configuration for LBA angle 3 model without vs constraints.""" 79 | return { 80 | # conventional analytical LBA with angle without any constraints on vs 81 | "name": "lba_angle_3", 82 | "params": ["v0", "v1", "v2", "a", "z", "theta"], 83 | "param_bounds": [[0.0, 0.0, 0.0, 0.1, 0.0, 0], [6.0, 6.0, 6.0, 1.1, 0.5, 1.3]], 84 | "boundary_name": "constant", 85 | "boundary": bf.constant, 86 | "n_params": 6, 87 | "default_params": [0.5, 0.3, 0.2, 0.5, 0.2, 0.0], 88 | "nchoices": 3, 89 | "n_particles": 3, 90 | "simulator": cssm.lba_angle, 91 | } 92 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/levy.py: -------------------------------------------------------------------------------- 1 | """Configuration for levy models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_levy_config(): 8 | """Get configuration for levy model.""" 9 | return { 10 | "name": "levy", 11 | "params": ["v", "a", "z", "alpha", "t"], 12 | "param_bounds": [[-3.0, 0.3, 0.1, 1.0, 1e-3], [3.0, 3.0, 0.9, 2.0, 2]], 13 | "boundary_name": "constant", 14 | "boundary": bf.constant, 15 | "n_params": 5, 16 | "default_params": [0.0, 1.0, 0.5, 1.5, 0.1], 17 | "nchoices": 2, 18 | "choices": [-1, 1], 19 | "n_particles": 1, 20 | "simulator": cssm.levy_flexbound, 21 | } 22 | 23 | 24 | def get_levy_angle_config(): 25 | """Get configuration for levy model with angle boundary.""" 26 | return { 27 | "name": "levy_angle", 28 | "params": ["v", "a", "z", "alpha", "t", "theta"], 29 | "param_bounds": [ 30 | [-3.0, 0.3, 0.1, 1.0, 1e-3, -0.1], 31 | [3.0, 3.0, 0.9, 2.0, 2, 1.3], 32 | ], 33 | "boundary_name": "angle", 34 | "boundary": bf.angle, 35 | "n_params": 6, 36 | "default_params": [0.0, 1.0, 0.5, 1.5, 0.1, 0.01], 37 | "nchoices": 2, 38 | "choices": [-1, 1], 39 | "n_particles": 1, 40 | "simulator": cssm.levy_flexbound, 41 | } 42 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/mic2/__init__.py: -------------------------------------------------------------------------------- 1 | """Configuration for DDM mic2 models.""" 2 | 3 | from .adj import ( 4 | get_ddm_mic2_adj_config, 5 | get_ddm_mic2_adj_no_bias_config, 6 | get_ddm_mic2_adj_conflict_gamma_no_bias_config, 7 | get_ddm_mic2_adj_angle_no_bias_config, 8 | get_ddm_mic2_adj_weibull_no_bias_config, 9 | ) 10 | from .multinoise import ( 11 | get_ddm_mic2_multinoise_no_bias_config, 12 | get_ddm_mic2_multinoise_conflict_gamma_no_bias_config, 13 | get_ddm_mic2_multinoise_angle_no_bias_config, 14 | get_ddm_mic2_multinoise_weibull_no_bias_config, 15 | ) 16 | 17 | from .ornstein import ( 18 | get_ddm_mic2_ornstein_config, 19 | get_ddm_mic2_ornstein_no_bias_config, 20 | get_ddm_mic2_ornstein_conflict_gamma_no_bias_config, 21 | get_ddm_mic2_ornstein_angle_no_bias_config, 22 | get_ddm_mic2_ornstein_weibull_no_bias_config, 23 | ) 24 | 25 | from .leak import ( 26 | get_ddm_mic2_leak_config, 27 | get_ddm_mic2_leak_no_bias_config, 28 | get_ddm_mic2_leak_conflict_gamma_no_bias_config, 29 | get_ddm_mic2_leak_angle_no_bias_config, 30 | get_ddm_mic2_leak_weibull_no_bias_config, 31 | ) 32 | 33 | __all__ = [ 34 | "get_ddm_mic2_adj_config", 35 | "get_ddm_mic2_adj_no_bias_config", 36 | "get_ddm_mic2_adj_conflict_gamma_no_bias_config", 37 | "get_ddm_mic2_adj_angle_no_bias_config", 38 | "get_ddm_mic2_adj_weibull_no_bias_config", 39 | "get_ddm_mic2_multinoise_no_bias_config", 40 | "get_ddm_mic2_multinoise_conflict_gamma_no_bias_config", 41 | "get_ddm_mic2_multinoise_angle_no_bias_config", 42 | "get_ddm_mic2_multinoise_weibull_no_bias_config", 43 | "get_ddm_mic2_ornstein_config", 44 | "get_ddm_mic2_ornstein_no_bias_config", 45 | "get_ddm_mic2_ornstein_conflict_gamma_no_bias_config", 46 | "get_ddm_mic2_ornstein_angle_no_bias_config", 47 | "get_ddm_mic2_ornstein_weibull_no_bias_config", 48 | "get_ddm_mic2_leak_config", 49 | "get_ddm_mic2_leak_no_bias_config", 50 | "get_ddm_mic2_leak_conflict_gamma_no_bias_config", 51 | "get_ddm_mic2_leak_angle_no_bias_config", 52 | "get_ddm_mic2_leak_weibull_no_bias_config", 53 | ] 54 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/mic2/adj.py: -------------------------------------------------------------------------------- 1 | """Configuration for DDM mic2 models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_mic2_adj_config(): 8 | """Get configuration for DDM mic2 adj model.""" 9 | return { 10 | "name": "ddm_mic2_adj", 11 | "params": ["vh", "vl1", "vl2", "a", "zh", "zl1", "zl2", "d", "t"], 12 | "param_bounds": [ 13 | [-4.0, -4.0, -4.0, 0.3, 0.2, 0.2, 0.2, 0.0, 0.0], 14 | [4.0, 4.0, 4.0, 2.5, 0.8, 0.8, 0.8, 1.0, 2.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "n_params": 9, 19 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5], 20 | "nchoices": 4, 21 | "choices": [0, 1, 2, 3], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 24 | } 25 | 26 | 27 | def get_ddm_mic2_adj_no_bias_config(): 28 | """Get configuration for DDM mic2 adj no bias model.""" 29 | return { 30 | "name": "ddm_mic2_adj_no_bias", 31 | "params": ["vh", "vl1", "vl2", "a", "d", "t"], 32 | "param_bounds": [ 33 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0], 34 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0], 35 | ], 36 | "boundary_name": "constant", 37 | "boundary": bf.constant, 38 | "n_params": 6, 39 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0], 40 | "nchoices": 4, 41 | "choices": [0, 1, 2, 3], 42 | "n_particles": 1, 43 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 44 | } 45 | 46 | 47 | def get_ddm_mic2_adj_conflict_gamma_no_bias_config(): 48 | """Get configuration for DDM mic2 adj conflict gamma no bias model.""" 49 | return { 50 | "name": "ddm_mic2_adj_conflict_gamma_no_bias", 51 | "params": [ 52 | "vh", 53 | "vl1", 54 | "vl2", 55 | "d", 56 | "t", 57 | "a", 58 | "theta", 59 | "scale", 60 | "alphaGamma", 61 | "scaleGamma", 62 | ], 63 | "param_bounds": [ 64 | [-4.0, -4.0, -4.0, 0.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 65 | [4.0, 4.0, 4.0, 1.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 66 | ], 67 | "boundary_name": "conflict_gamma", 68 | "boundary": bf.conflict_gamma, 69 | "n_params": 10, 70 | "default_params": [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 2, 2], 71 | "nchoices": 4, 72 | "choices": [0, 1, 2, 3], 73 | "n_particles": 1, 74 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 75 | } 76 | 77 | 78 | def get_ddm_mic2_adj_angle_no_bias_config(): 79 | """Get configuration for DDM mic2 adj angle no bias model.""" 80 | return { 81 | "name": "ddm_mic2_adj_angle_no_bias", 82 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "theta"], 83 | "param_bounds": [ 84 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, -0.1], 85 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 1.0], 86 | ], 87 | "boundary_name": "angle", 88 | "boundary": bf.angle, 89 | "boundary_multiplicative": False, 90 | "n_params": 7, 91 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 0.0], 92 | "nchoices": 4, 93 | "choices": [0, 1, 2, 3], 94 | "n_particles": 1, 95 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 96 | } 97 | 98 | 99 | def get_ddm_mic2_adj_weibull_no_bias_config(): 100 | """Get configuration for DDM mic2 adj weibull no bias model.""" 101 | return { 102 | "name": "ddm_mic2_adj_weibull_no_bias", 103 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "alpha", "beta"], 104 | "param_bounds": [ 105 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.31, 0.31], 106 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 4.99, 6.99], 107 | ], 108 | "boundary_name": "weibull_cdf", 109 | "boundary": bf.weibull_cdf, 110 | "boundary_multiplicative": True, 111 | "n_params": 8, 112 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 2.5, 3.5], 113 | "nchoices": 4, 114 | "choices": [0, 1, 2, 3], 115 | "n_particles": 1, 116 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 117 | } 118 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/mic2/leak.py: -------------------------------------------------------------------------------- 1 | """Leak model configurations.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_mic2_leak_config(): 8 | """Get configuration for DDM mic2 leak model.""" 9 | return { 10 | "name": "ddm_mic2_leak", 11 | "params": ["vh", "vl1", "vl2", "a", "zh", "zl1", "zl2", "d", "t"], 12 | "param_bounds": [ 13 | [-4.0, -4.0, -4.0, 0.3, 0.2, 0.2, 0.2, 0.0, 0.0], 14 | [4.0, 4.0, 4.0, 2.5, 0.8, 0.8, 0.8, 1.0, 2.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "n_params": 9, 19 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5], 20 | "nchoices": 4, 21 | "choices": [0, 1, 2, 3], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 24 | } 25 | 26 | 27 | def get_ddm_mic2_leak_no_bias_config(): 28 | """Get configuration for DDM mic2 leak no bias model.""" 29 | return { 30 | "name": "ddm_mic2_leak_no_bias", 31 | "params": ["vh", "vl1", "vl2", "a", "d", "t"], 32 | "param_bounds": [ 33 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0], 34 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0], 35 | ], 36 | "boundary_name": "constant", 37 | "boundary": bf.constant, 38 | "n_params": 6, 39 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0], 40 | "nchoices": 4, 41 | "choices": [0, 1, 2, 3], 42 | "n_particles": 1, 43 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 44 | } 45 | 46 | 47 | def get_ddm_mic2_leak_conflict_gamma_no_bias_config(): 48 | """Get configuration for DDM mic2 leak conflict gamma no bias model.""" 49 | return { 50 | "name": "ddm_mic2_leak_conflict_gamma_no_bias", 51 | "params": [ 52 | "vh", 53 | "vl1", 54 | "vl2", 55 | "d", 56 | "t", 57 | "a", 58 | "theta", 59 | "scale", 60 | "alphaGamma", 61 | "scaleGamma", 62 | ], 63 | "param_bounds": [ 64 | [-4.0, -4.0, -4.0, 0.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 65 | [4.0, 4.0, 4.0, 1.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 66 | ], 67 | "boundary_name": "conflict_gamma", 68 | "boundary": bf.conflict_gamma, 69 | "n_params": 10, 70 | "default_params": [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 2, 2], 71 | "nchoices": 4, 72 | "choices": [0, 1, 2, 3], 73 | "n_particles": 1, 74 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 75 | } 76 | 77 | 78 | def get_ddm_mic2_leak_angle_no_bias_config(): 79 | """Get configuration for DDM mic2 leak angle no bias model.""" 80 | return { 81 | "name": "ddm_mic2_leak_angle_no_bias", 82 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "theta"], 83 | "param_bounds": [ 84 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, -0.1], 85 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 1.0], 86 | ], 87 | "boundary_name": "angle", 88 | "boundary": bf.angle, 89 | "boundary_multiplicative": False, 90 | "n_params": 7, 91 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 0.0], 92 | "nchoices": 4, 93 | "choices": [0, 1, 2, 3], 94 | "n_particles": 1, 95 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 96 | } 97 | 98 | 99 | def get_ddm_mic2_leak_weibull_no_bias_config(): 100 | """Get configuration for DDM mic2 leak weibull no bias model.""" 101 | return { 102 | "name": "ddm_mic2_leak_weibull_no_bias", 103 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "alpha", "beta"], 104 | "param_bounds": [ 105 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.31, 0.31], 106 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 4.99, 6.99], 107 | ], 108 | "boundary_name": "weibull_cdf", 109 | "boundary": bf.weibull_cdf, 110 | "boundary_multiplicative": True, 111 | "n_params": 8, 112 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 2.5, 3.5], 113 | "nchoices": 4, 114 | "choices": [0, 1, 2, 3], 115 | "n_particles": 1, 116 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 117 | } 118 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/mic2/multinoise.py: -------------------------------------------------------------------------------- 1 | """Configuration for multinoise models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_mic2_multinoise_no_bias_config(): 8 | """Get configuration for DDM MIC2 multinoise model without bias.""" 9 | return { 10 | "name": "ddm_mic2_multinoise_no_bias", 11 | "params": ["vh", "vl1", "vl2", "a", "d", "t"], 12 | "param_bounds": [ 13 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0], 14 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "n_params": 6, 19 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0], 20 | "nchoices": 4, 21 | "choices": [0, 1, 2, 3], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound_mic2_multinoise, 24 | } 25 | 26 | 27 | def get_ddm_mic2_multinoise_conflict_gamma_no_bias_config(): 28 | """Get configuration for DDM MIC2 multinoise model with conflict gamma boundary and no bias.""" 29 | return { 30 | "name": "ddm_mic2_multinoise_conflict_gamma_no_bias", 31 | "params": [ 32 | "vh", 33 | "vl1", 34 | "vl2", 35 | "d", 36 | "t", 37 | "a", 38 | "theta", 39 | "scale", 40 | "alphaGamma", 41 | "scaleGamma", 42 | ], 43 | "param_bounds": [ 44 | [-4.0, -4.0, -4.0, 0.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 45 | [4.0, 4.0, 4.0, 1.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 46 | ], 47 | "boundary_name": "conflict_gamma", 48 | "boundary": bf.conflict_gamma, 49 | "n_params": 10, 50 | "default_params": [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 2, 2], 51 | "nchoices": 4, 52 | "choices": [0, 1, 2, 3], 53 | "n_particles": 1, 54 | "simulator": cssm.ddm_flexbound_mic2_multinoise, 55 | } 56 | 57 | 58 | def get_ddm_mic2_multinoise_angle_no_bias_config(): 59 | """Get configuration for DDM MIC2 multinoise model with angle boundary and no bias.""" 60 | return { 61 | "name": "ddm_mic2_multinoise_angle_no_bias", 62 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "theta"], 63 | "param_bounds": [ 64 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, -0.1], 65 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 1.0], 66 | ], 67 | "boundary_name": "angle", 68 | "boundary": bf.angle, 69 | "boundary_multiplicative": False, 70 | "n_params": 7, 71 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 0.0], 72 | "nchoices": 4, 73 | "choices": [0, 1, 2, 3], 74 | "n_particles": 1, 75 | "simulator": cssm.ddm_flexbound_mic2_multinoise, 76 | } 77 | 78 | 79 | def get_ddm_mic2_multinoise_weibull_no_bias_config(): 80 | """Get configuration for DDM MIC2 multinoise model with Weibull boundary and no bias.""" 81 | return { 82 | "name": "ddm_mic2_multinoise_weibull_no_bias", 83 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "alpha", "beta"], 84 | "param_bounds": [ 85 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.31, 0.31], 86 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 4.99, 6.99], 87 | ], 88 | "boundary_name": "weibull_cdf", 89 | "boundary": bf.weibull_cdf, 90 | "boundary_multiplicative": True, 91 | "n_params": 8, 92 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 2.5, 3.5], 93 | "nchoices": 4, 94 | "choices": [0, 1, 2, 3], 95 | "n_particles": 1, 96 | "simulator": cssm.ddm_flexbound_mic2_multinoise, 97 | } 98 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/mic2/ornstein.py: -------------------------------------------------------------------------------- 1 | """Configuration for DDM mic2 models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ddm_mic2_ornstein_config(): 8 | """Get configuration for DDM mic2 ornstein model.""" 9 | return { 10 | "name": "ddm_mic2_ornstein", 11 | "params": ["vh", "vl1", "vl2", "a", "zh", "zl1", "zl2", "d", "g", "t"], 12 | "param_bounds": [ 13 | [-4.0, -4.0, -4.0, 0.3, 0.2, 0.2, 0.2, 0.0, 0.0, 0.0], 14 | [4.0, 4.0, 4.0, 2.5, 0.8, 0.8, 0.8, 1.0, 3.0, 2.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "n_params": 10, 19 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 0.5, 1.5, 0.5], 20 | "nchoices": 4, 21 | "choices": [0, 1, 2, 3], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 24 | } 25 | 26 | 27 | def get_ddm_mic2_ornstein_no_bias_config(): 28 | """Get configuration for DDM mic2 ornstein no bias model.""" 29 | return { 30 | "name": "ddm_mic2_ornstein_no_bias", 31 | "params": ["vh", "vl1", "vl2", "a", "d", "g", "t"], 32 | "param_bounds": [ 33 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.0], 34 | [4.0, 4.0, 4.0, 2.5, 1.0, 3.0, 2.0], 35 | ], 36 | "boundary_name": "constant", 37 | "boundary": bf.constant, 38 | "n_params": 7, 39 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.5, 1.0], 40 | "nchoices": 4, 41 | "choices": [0, 1, 2, 3], 42 | "n_particles": 1, 43 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 44 | } 45 | 46 | 47 | def get_ddm_mic2_ornstein_conflict_gamma_no_bias_config(): 48 | """Get configuration for DDM mic2 ornstein conflict gamma no bias model.""" 49 | return { 50 | "name": "ddm_mic2_ornstein_conflict_gamma_no_bias", 51 | "params": [ 52 | "vh", 53 | "vl1", 54 | "vl2", 55 | "d", 56 | "g", 57 | "t", 58 | "a", 59 | "theta", 60 | "scale", 61 | "alphaGamma", 62 | "scaleGamma", 63 | ], 64 | "param_bounds": [ 65 | [-4.0, -4.0, -4.0, 0.0, 0.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 66 | [4.0, 4.0, 4.0, 1.0, 3.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 67 | ], 68 | "boundary_name": "conflict_gamma", 69 | "boundary": bf.conflict_gamma, 70 | "n_params": 11, 71 | "default_params": [0.0, 0.0, 0.0, 0.5, 1.5, 1.0, 1.0, 1.0, 1.0, 2, 2], 72 | "nchoices": 4, 73 | "choices": [0, 1, 2, 3], 74 | "n_particles": 1, 75 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 76 | } 77 | 78 | 79 | def get_ddm_mic2_ornstein_angle_no_bias_config(): 80 | """Get configuration for DDM mic2 ornstein angle no bias model.""" 81 | return { 82 | "name": "ddm_mic2_ornstein_angle_no_bias", 83 | "params": ["vh", "vl1", "vl2", "a", "d", "g", "t", "theta"], 84 | "param_bounds": [ 85 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.0, -0.1], 86 | [4.0, 4.0, 4.0, 2.5, 1.0, 3.0, 2.0, 1.0], 87 | ], 88 | "boundary_name": "angle", 89 | "boundary": bf.angle, 90 | "boundary_multiplicative": False, 91 | "n_params": 8, 92 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.5, 1.0, 0.0], 93 | "nchoices": 4, 94 | "choices": [0, 1, 2, 3], 95 | "n_particles": 1, 96 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 97 | } 98 | 99 | 100 | def get_ddm_mic2_ornstein_weibull_no_bias_config(): 101 | """Get configuration for DDM mic2 ornstein weibull no bias model.""" 102 | return { 103 | "name": "ddm_mic2_ornstein_weibull_no_bias", 104 | "params": ["vh", "vl1", "vl2", "a", "d", "g", "t", "alpha", "beta"], 105 | "param_bounds": [ 106 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.0, 0.31, 0.31], 107 | [4.0, 4.0, 4.0, 2.5, 1.0, 3.0, 2.0, 4.99, 6.99], 108 | ], 109 | "boundary_name": "weibull_cdf", 110 | "boundary": bf.weibull_cdf, 111 | "boundary_multiplicative": True, 112 | "n_params": 9, 113 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.5, 1.0, 2.5, 3.5], 114 | "nchoices": 4, 115 | "choices": [0, 1, 2, 3], 116 | "n_particles": 1, 117 | "simulator": cssm.ddm_flexbound_mic2_ornstein, 118 | } 119 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/ornstein.py: -------------------------------------------------------------------------------- 1 | """Ornstein models configurations.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_ornstein_config(): 8 | """Get the configuration for the Ornstein model.""" 9 | return { 10 | "name": "ornstein", 11 | "params": ["v", "a", "z", "g", "t"], 12 | "param_bounds": [[-2.0, 0.3, 0.1, -1.0, 1e-3], [2.0, 3.0, 0.9, 1.0, 2]], 13 | "boundary_name": "constant", 14 | "boundary": bf.constant, 15 | "n_params": 5, 16 | "default_params": [0.0, 1.0, 0.5, 0.0, 1e-3], 17 | "nchoices": 2, 18 | "choices": [-1, 1], 19 | "n_particles": 1, 20 | "simulator": cssm.ornstein_uhlenbeck, 21 | } 22 | 23 | 24 | def get_ornstein_angle_config(): 25 | """Get the configuration for the Ornstein angle model.""" 26 | return { 27 | "name": "ornstein_angle", 28 | "params": ["v", "a", "z", "g", "t", "theta"], 29 | "param_bounds": [ 30 | [-2.0, 0.3, 0.1, -1.0, 1e-3, -0.1], 31 | [2.0, 3.0, 0.9, 1.0, 2, 1.3], 32 | ], 33 | "boundary_name": "angle", 34 | "boundary": bf.angle, 35 | "n_params": 6, 36 | "default_params": [0.0, 1.0, 0.5, 0.0, 1e-3, 0.1], 37 | "nchoices": 2, 38 | "choices": [-1, 1], 39 | "n_particles": 1, 40 | "simulator": cssm.ornstein_uhlenbeck, 41 | } 42 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/shrink.py: -------------------------------------------------------------------------------- 1 | """Shrink model configurations.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | from ssms.basic_simulators import drift_functions as df 6 | 7 | 8 | def get_shrink_spot_config(): 9 | """Get configuration for shrink spot model.""" 10 | return { 11 | "name": "shrink_spot", 12 | "params": [ 13 | "a", 14 | "z", 15 | "t", 16 | "ptarget", 17 | "pouter", 18 | "pinner", 19 | "r", 20 | "sda", 21 | ], 22 | "param_bounds": [ 23 | [0.3, 0.1, 1e-3, 2.0, -5.5, -5.5, 1e-2, 1], 24 | [3.0, 0.9, 2.0, 5.5, 5.5, 5.5, 0.05, 3], 25 | ], 26 | "boundary_name": "constant", 27 | "boundary": bf.constant, 28 | "drift_name": "attend_drift", 29 | "drift_fun": df.attend_drift, 30 | "n_params": 8, 31 | "default_params": [0.7, 0.5, 0.25, 2.0, -2.0, -2.0, 0.01, 1], 32 | "nchoices": 2, 33 | "choices": [-1, 1], 34 | "n_particles": 1, 35 | "simulator": cssm.ddm_flex, 36 | } 37 | 38 | 39 | def get_shrink_spot_extended_config(): 40 | """Get configuration for extended shrink spot model.""" 41 | return { 42 | "name": "shrink_spot", 43 | "params": [ 44 | "a", 45 | "z", 46 | "t", 47 | "ptarget", 48 | "pouter", 49 | "pinner", 50 | "r", 51 | "sda", 52 | ], 53 | "param_bounds": [ 54 | [0.3, 0.1, 1e-3, 2.0, -5.5, -5.5, 0.01, 1], 55 | [3.0, 0.9, 2.0, 5.5, 5.5, 5.5, 1.0, 3], 56 | ], 57 | "boundary_name": "constant", 58 | "boundary": bf.constant, 59 | "drift_name": "attend_drift", 60 | "drift_fun": df.attend_drift, 61 | "n_params": 8, 62 | "default_params": [0.7, 0.5, 0.25, 2.0, -2.0, -2.0, 0.01, 1], 63 | "nchoices": 2, 64 | "choices": [-1, 1], 65 | "n_particles": 1, 66 | "simulator": cssm.ddm_flex, 67 | } 68 | 69 | 70 | def get_shrink_spot_simple_config(): 71 | """Get configuration for simple shrink spot model.""" 72 | return { 73 | "name": "shrink_spot_simple", 74 | "params": [ 75 | "a", 76 | "z", 77 | "t", 78 | "ptarget", 79 | "pouter", 80 | "r", 81 | "sda", 82 | ], 83 | "param_bounds": [ 84 | [0.3, 0.1, 1e-3, 2.0, -5.5, 0.01, 1], 85 | [3.0, 0.9, 2.0, 5.5, 5.5, 0.05, 3], 86 | ], 87 | "boundary_name": "constant", 88 | "boundary": bf.constant, 89 | "drift_name": "attend_drift_simple", 90 | "drift_fun": df.attend_drift_simple, 91 | "n_params": 7, 92 | "default_params": [0.7, 0.5, 0.25, 2.0, -2.0, 0.01, 1], 93 | "nchoices": 2, 94 | "choices": [-1, 1], 95 | "n_particles": 1, 96 | "simulator": cssm.ddm_flex, 97 | } 98 | 99 | 100 | def get_shrink_spot_simple_extended_config(): 101 | """Get configuration for extended simple shrink spot model.""" 102 | return { 103 | "name": "shrink_spot_simple_extended", 104 | "params": [ 105 | "a", 106 | "z", 107 | "t", 108 | "ptarget", 109 | "pouter", 110 | "r", 111 | "sda", 112 | ], 113 | "param_bounds": [ 114 | [0.3, 0.1, 1e-3, 2.0, -5.5, 0.01, 1], 115 | [3.0, 0.9, 2.0, 5.5, 5.5, 1.0, 3], 116 | ], 117 | "boundary_name": "constant", 118 | "boundary": bf.constant, 119 | "drift_name": "attend_drift_simple", 120 | "drift_fun": df.attend_drift_simple, 121 | "n_params": 7, 122 | "default_params": [0.7, 0.5, 0.25, 2.0, -2.0, 0.01, 1], 123 | "nchoices": 2, 124 | "choices": [-1, 1], 125 | "n_particles": 1, 126 | "simulator": cssm.ddm_flex, 127 | } 128 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/tradeoff.py: -------------------------------------------------------------------------------- 1 | """Configuration for tradeoff models.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_tradeoff_no_bias_config(): 8 | """Get configuration for tradeoff model without bias.""" 9 | return { 10 | "name": "tradeoff_no_bias", 11 | "params": ["vh", "vl1", "vl2", "a", "d", "t"], 12 | "param_bounds": [ 13 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0], 14 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0], 15 | ], 16 | "boundary_name": "constant", 17 | "boundary": bf.constant, 18 | "n_params": 6, 19 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0], 20 | "nchoices": 4, 21 | "choices": [0, 1, 2, 3], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound_tradeoff, 24 | } 25 | 26 | 27 | def get_tradeoff_angle_no_bias_config(): 28 | """Get configuration for tradeoff model with angle boundary and no bias.""" 29 | return { 30 | "name": "tradeoff_angle_no_bias", 31 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "theta"], 32 | "param_bounds": [ 33 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, -0.1], 34 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 1.0], 35 | ], 36 | "boundary_name": "angle", 37 | "boundary": bf.angle, 38 | "boundary_multiplicative": False, 39 | "n_params": 7, 40 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 0.0], 41 | "nchoices": 4, 42 | "choices": [0, 1, 2, 3], 43 | "n_particles": 1, 44 | "simulator": cssm.ddm_flexbound_tradeoff, 45 | } 46 | 47 | 48 | def get_tradeoff_weibull_no_bias_config(): 49 | """Get configuration for tradeoff model with Weibull boundary and no bias.""" 50 | return { 51 | "name": "tradeoff_weibull_no_bias", 52 | "params": ["vh", "vl1", "vl2", "a", "d", "t", "alpha", "beta"], 53 | "param_bounds": [ 54 | [-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.31, 0.31], 55 | [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 4.99, 6.99], 56 | ], 57 | "boundary_name": "weibull_cdf", 58 | "boundary": bf.weibull_cdf, 59 | "boundary_multiplicative": True, 60 | "n_params": 8, 61 | "default_params": [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 2.5, 3.5], 62 | "nchoices": 4, 63 | "n_particles": 1, 64 | "simulator": cssm.ddm_flexbound_tradeoff, 65 | } 66 | 67 | 68 | def get_tradeoff_conflict_gamma_no_bias_config(): 69 | """Get configuration for tradeoff model with conflict gamma boundary and no bias.""" 70 | return { 71 | "name": "tradeoff_conflict_gamma_no_bias", 72 | "params": [ 73 | "vh", 74 | "vl1", 75 | "vl2", 76 | "d", 77 | "t", 78 | "a", 79 | "theta", 80 | "scale", 81 | "alphagamma", 82 | "scalegamma", 83 | ], 84 | "param_bounds": [ 85 | [-4.0, -4.0, -4.0, 0.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], 86 | [4.0, 4.0, 4.0, 1.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0], 87 | ], 88 | "boundary_name": "conflict_gamma", 89 | "boundary": bf.conflict_gamma, 90 | "boundary_multiplicative": True, 91 | "n_params": 10, 92 | "default_params": [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 2, 2], 93 | "nchoices": 4, 94 | "choices": [0, 1, 2, 3], 95 | "n_particles": 1, 96 | "simulator": cssm.ddm_flexbound_tradeoff, 97 | } 98 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/validation.py: -------------------------------------------------------------------------------- 1 | """Validation helpers for model configuration dicts. 2 | 3 | This enforces rules for parameter names. 4 | """ 5 | 6 | from __future__ import annotations 7 | 8 | import re 9 | from typing import Any, List 10 | 11 | NAME_RE = re.compile(r"^[a-zA-Z][a-zA-Z0-9]{0,30}$") 12 | 13 | 14 | def is_valid_param_name(name: Any) -> bool: 15 | """Return True if ``name`` is an allowed parameter name. 16 | 17 | Rules: 18 | - must be a str 19 | - must not be in RESERVED_NAMES 20 | - must match NAME_RE 21 | """ 22 | if not isinstance(name, str): 23 | return False 24 | return bool(NAME_RE.match(name)) 25 | 26 | 27 | def validate_param_names(params: list) -> None: 28 | """Validate only the parameter names in ``params``. 29 | 30 | This checks that `params` is a list, that there are no duplicates, 31 | and that every name satisfies `is_valid_param_name`. 32 | 33 | """ 34 | if not isinstance(params, list): 35 | raise TypeError(f"'params' must be a list, got {type(params).__name__}") 36 | # duplicates 37 | seen = set() 38 | dupes: List[str] = [] 39 | for p in params: 40 | if p in seen: 41 | dupes.append(p) 42 | seen.add(p) 43 | if dupes: 44 | raise ValueError(f"Duplicate parameter names: {sorted(set(dupes))}") 45 | # name checks 46 | invalid = [p for p in params if not is_valid_param_name(p)] 47 | if invalid: 48 | raise ValueError( 49 | "Invalid parameter name(s): {}. Names must be str and match '{}'.".format( 50 | invalid, NAME_RE.pattern 51 | ) 52 | ) 53 | 54 | 55 | __all__ = ["is_valid_param_name", "validate_param_names"] 56 | -------------------------------------------------------------------------------- /ssms/config/_modelconfig/weibull.py: -------------------------------------------------------------------------------- 1 | """Weibull model configuration.""" 2 | 3 | import cssm 4 | from ssms.basic_simulators import boundary_functions as bf 5 | 6 | 7 | def get_weibull_config(): 8 | """Get the configuration for the Weibull model.""" 9 | return { 10 | "name": "weibull", 11 | "params": ["v", "a", "z", "t", "alpha", "beta"], 12 | "param_bounds": [ 13 | [-2.5, 0.3, 0.2, 1e-3, 0.31, 0.31], 14 | [2.5, 2.5, 0.8, 2.0, 4.99, 6.99], 15 | ], 16 | "boundary_name": "weibull_cdf", 17 | "boundary": bf.weibull_cdf, 18 | "n_params": 6, 19 | "default_params": [0.0, 1.0, 0.5, 1e-3, 3.0, 3.0], 20 | "nchoices": 2, 21 | "choices": [-1, 1], 22 | "n_particles": 1, 23 | "simulator": cssm.ddm_flexbound, 24 | } 25 | -------------------------------------------------------------------------------- /ssms/config/kde_constants.py: -------------------------------------------------------------------------------- 1 | KDE_NO_DISPLACE_T = [ # noqa: D100 2 | "full_ddm_rv", 3 | "full_ddm", 4 | "ddm_st", 5 | "ddm_truncnormt", 6 | "ddm_rayleight", 7 | ] 8 | -------------------------------------------------------------------------------- /ssms/dataset_generators/__init__.py: -------------------------------------------------------------------------------- 1 | from . import lan_mlp # noqa: D104 2 | 3 | __all__ = ["lan_mlp"] 4 | -------------------------------------------------------------------------------- /ssms/support_utils/__init__.py: -------------------------------------------------------------------------------- 1 | from . import kde_class, utils # noqa: D104 2 | from .utils import sample_parameters_from_constraints 3 | 4 | __all__ = ["kde_class", "utils", "sample_parameters_from_constraints"] 5 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | """Tests go here""" 2 | -------------------------------------------------------------------------------- /tests/data_generator/expected_constrained_param_space.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file contains the expected constrained parameter space for various models. 3 | """ 4 | 5 | 6 | def infer_constrained_param_space(conf: dict) -> dict: 7 | """Infer a conservative constrained parameter space from a model config. 8 | 9 | Supports two formats for ``param_bounds``: 10 | 1. ``[[low_1, ...], [high_1, ...]]`` aligned with ``params`` order. 11 | 2. ``{param: (low, high)}`` mapping. 12 | 13 | Silently skips malformed / mismatched entries. 14 | """ 15 | params = conf.get("params") 16 | bounds = conf.get("param_bounds") 17 | 18 | if isinstance(bounds, dict): 19 | return bounds.copy() 20 | 21 | if ( 22 | params 23 | and isinstance(bounds, (list, tuple)) 24 | and len(bounds) == 2 25 | and isinstance(bounds[0], (list, tuple)) 26 | and isinstance(bounds[1], (list, tuple)) 27 | ): 28 | lows, highs = bounds 29 | return {p: (low, high) for p, low, high in zip(params, lows, highs)} 30 | 31 | return {} 32 | -------------------------------------------------------------------------------- /tests/data_generator/expected_shapes.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file contains the expected shapes of the data generated by the 3 | data generator for different models and configurations. 4 | """ 5 | 6 | 7 | def get_expected_shapes( 8 | _model_config, n_parameter_sets, n_training_samples_by_parameter_set 9 | ): 10 | n_model_parameters = _model_config["n_params"] 11 | n_choice_options = _model_config["nchoices"] 12 | lan_data_samples = ( 13 | n_parameter_sets * n_training_samples_by_parameter_set - 2 * n_parameter_sets 14 | ) 15 | cpn_labels_b = n_choice_options if n_choice_options > 2 else n_choice_options - 1 16 | cpn_labels = ( 17 | (n_parameter_sets,) if cpn_labels_b == 1 else (n_parameter_sets, cpn_labels_b) 18 | ) 19 | 20 | return { 21 | "binned_128": (n_parameter_sets, 128, n_choice_options), 22 | "binned_256": (n_parameter_sets, 256, n_choice_options), 23 | "cpn_data": (n_parameter_sets, n_model_parameters), 24 | "cpn_labels": cpn_labels, 25 | "cpn_no_omission_data": (n_parameter_sets, n_model_parameters), 26 | "cpn_no_omission_labels": cpn_labels, 27 | "gonogo_data": (n_parameter_sets, n_model_parameters), 28 | "gonogo_labels": (n_parameter_sets, 1), 29 | "lan_data": ( 30 | lan_data_samples, 31 | n_model_parameters + 2, 32 | ), # because you need the extra choice / rt dims 33 | "lan_labels": ( 34 | lan_data_samples, 35 | ), # always this (possible we should make this (..., 1) but need to take care of downstream for that) 36 | "opn_data": (n_parameter_sets, n_model_parameters), 37 | "opn_labels": (n_parameter_sets, 1), 38 | "thetas": (n_parameter_sets, n_model_parameters), 39 | } 40 | -------------------------------------------------------------------------------- /tests/data_generator/test_data_generator.py: -------------------------------------------------------------------------------- 1 | import random 2 | from copy import deepcopy 3 | 4 | import numpy as np 5 | import pytest 6 | 7 | from ssms.config import get_lan_config, model_config 8 | from ssms.dataset_generators.lan_mlp import data_generator 9 | 10 | from expected_shapes import get_expected_shapes 11 | from expected_constrained_param_space import infer_constrained_param_space 12 | 13 | 14 | N_PARAMETER_SETS = random.randint(2, 10) 15 | N_TRAINING_SAMPLES_BY_PARAMETER_SET = random.randint(2, 10) 16 | N_TRAINING_SAMPLES_BY_PARAMETER_SET = random.randint( 17 | 6, 10 18 | ) # seems to need to be at least 6 for n_paramsets = 1 19 | N_SAMPLES = 4 # lowerbound seems to be 4 -- breaks if random number is chosen 20 | 21 | 22 | def _make_gen_config( 23 | n_parameter_sets=N_PARAMETER_SETS, 24 | n_training_samples_by_parameter_set=N_TRAINING_SAMPLES_BY_PARAMETER_SET, 25 | n_samples=10, 26 | n_subruns=1, 27 | ): 28 | return { 29 | "n_parameter_sets": n_parameter_sets, 30 | "n_training_samples_by_parameter_set": n_training_samples_by_parameter_set, 31 | "n_samples": n_samples, 32 | "n_subruns": n_subruns, 33 | } 34 | 35 | 36 | gen_config = get_lan_config() 37 | gen_config.update( 38 | _make_gen_config( 39 | N_PARAMETER_SETS, N_TRAINING_SAMPLES_BY_PARAMETER_SET, N_SAMPLES, 1 40 | ) 41 | ) 42 | 43 | 44 | EXPECTED_KEYS = [ 45 | "cpn_data", 46 | "cpn_labels", 47 | "cpn_no_omission_data", 48 | "cpn_no_omission_labels", 49 | "opn_data", 50 | "opn_labels", 51 | "gonogo_data", 52 | "gonogo_labels", 53 | "thetas", 54 | "lan_data", 55 | "lan_labels", 56 | "binned_128", 57 | "binned_256", 58 | "generator_config", 59 | "model_config", 60 | ] 61 | 62 | # TODO: Remove this once #114 is fixed 63 | broken_models = [ 64 | "lba_3_vs_constraint", # broken 65 | "lba_angle_3_vs_constraint", # broken 66 | "dev_rlwm_lba_race_v2", # broken 67 | ] 68 | 69 | # Ultra slow models, likely broken? 70 | slow_prefixes = ( 71 | "race", 72 | "dev_rlwm", 73 | "lba3", 74 | "lba_angle_3", 75 | "lca", 76 | "ddm_par2", 77 | "ddm_seq2", 78 | "ddm_mic2", 79 | "tradeoff", 80 | ) 81 | 82 | 83 | @pytest.mark.parametrize("model_name,model_conf", model_config.items()) 84 | def test_data_generator(model_name, model_conf): 85 | if model_name in broken_models: 86 | pytest.skip(f"Skipping broken model: {model_name}") 87 | if model_name.startswith(slow_prefixes): 88 | pytest.skip(f"Skipping slow model: {model_name}") 89 | 90 | generator_config = deepcopy(gen_config) 91 | generator_config["dgp_list"] = model_name 92 | 93 | my_dataset_generator = data_generator( 94 | generator_config=generator_config, model_config=model_conf 95 | ) 96 | training_data = my_dataset_generator.generate_data_training_uniform(save=False) 97 | 98 | # Because randomly generated arrays may differ across OS and versions of Python, 99 | # even when setting a random seed, we check for array shape only 100 | td_array_shapes = { 101 | k: v.shape for k, v in training_data.items() if isinstance(v, np.ndarray) 102 | } 103 | 104 | assert td_array_shapes == get_expected_shapes( 105 | model_conf, N_PARAMETER_SETS, N_TRAINING_SAMPLES_BY_PARAMETER_SET 106 | ) 107 | 108 | assert training_data["model_config"][ 109 | "constrained_param_space" 110 | ] == infer_constrained_param_space(model_config[model_name]) 111 | 112 | 113 | def test_data_persistance(tmp_path): 114 | model_conf = model_config["ddm"] 115 | generator_config = deepcopy(gen_config) 116 | generator_config["dgp_list"] = "ddm" 117 | generator_config["output_folder"] = str(tmp_path) 118 | generator_config["n_subruns"] = 1 119 | 120 | my_dataset_generator = data_generator( 121 | generator_config=generator_config, model_config=model_conf 122 | ) 123 | my_dataset_generator.generate_data_training_uniform(save=True) 124 | new_data_file = list(tmp_path.iterdir())[0] 125 | assert new_data_file.exists() 126 | assert new_data_file.suffix == ".pickle" 127 | 128 | 129 | @pytest.mark.parametrize("model_name", list(model_config.keys())) 130 | def test_model_config(model_name): 131 | # Take an example config for a given model 132 | model_conf = deepcopy(model_config[model_name]) 133 | 134 | assert type(model_conf["simulator"]).__name__ == "cython_function_or_method" 135 | 136 | assert callable(model_conf["simulator"]) 137 | assert callable(model_conf["boundary"]) 138 | 139 | 140 | def test_bad_inputs(): 141 | model_conf = model_config["ddm"] 142 | 143 | with pytest.raises(ValueError): 144 | data_generator(generator_config=gen_config, model_config=None) 145 | 146 | with pytest.raises(ValueError): 147 | data_generator(generator_config=None, model_config=model_conf) 148 | -------------------------------------------------------------------------------- /tests/test_deprecate.py: -------------------------------------------------------------------------------- 1 | from ssms.config.generator_config.data_generator_config import ( 2 | DeprecatedDict, 3 | ) 4 | 5 | 6 | def test_deprecated_dict_warns(recwarn): 7 | d = DeprecatedDict(lambda x: x, "replacement") 8 | val = d["foo"] 9 | w = recwarn.pop(DeprecationWarning) 10 | message = str(w.message) 11 | assert "deprecated" in message 12 | assert "replacement" in message 13 | assert val == "foo" 14 | -------------------------------------------------------------------------------- /tests/test_generate_cli.py: -------------------------------------------------------------------------------- 1 | import io 2 | import yaml 3 | 4 | import pytest 5 | 6 | from ssms.cli.generate import ( 7 | try_gen_folder, 8 | make_data_generator_configs, 9 | collect_data_generator_config, 10 | ) 11 | 12 | 13 | @pytest.fixture 14 | def yaml_config(): 15 | return { 16 | "GENERATOR_APPROACH": "lan", 17 | "N_SAMPLES": 1000, 18 | "DELTA_T": 0.1, 19 | "MODEL": "ddm", 20 | "N_PARAMETER_SETS": 10, 21 | "N_TRAINING_SAMPLES_BY_PARAMETER_SET": 100, 22 | "N_SUBRUNS": 1, 23 | } 24 | 25 | 26 | def test_try_gen_folder(tmp_path): 27 | # Test creating a folder 28 | test_folder = tmp_path / "test_folder" 29 | try_gen_folder(test_folder) 30 | assert test_folder.exists() 31 | assert test_folder.is_dir() 32 | 33 | # Test creating nested folders 34 | test_nested_folder = tmp_path / "parent" / "child" 35 | try_gen_folder(test_nested_folder) 36 | assert test_nested_folder.exists() 37 | assert test_nested_folder.is_dir() 38 | 39 | # Test error when folder is None 40 | with pytest.raises(ValueError, match="Folder path cannot be None or empty."): 41 | try_gen_folder(None) 42 | 43 | # Test warning for absolute path when not allowed 44 | with pytest.warns(UserWarning, match="Absolute folder path provided"): 45 | try_gen_folder(tmp_path.resolve(), allow_abs_path_folder_generation=False) 46 | 47 | 48 | def test_make_data_generator_configs(tmp_path): 49 | # Test default configuration 50 | result = make_data_generator_configs() 51 | assert isinstance(result, dict), "Default configuration should return a dictionary" 52 | assert "model_config" in result 53 | assert "data_config" in result 54 | 55 | # Test with custom arguments 56 | custom_config = make_data_generator_configs( 57 | model="ddm", 58 | generator_approach="lan", 59 | data_generator_arg_dict={"n_samples": 1000}, 60 | model_config_arg_dict={"drift": 0.5}, 61 | save_name="test_config.pkl", 62 | save_folder=tmp_path, 63 | ) 64 | assert custom_config["data_config"]["n_samples"] == 1000 65 | assert custom_config["model_config"]["drift"] == 0.5 66 | assert (tmp_path / "test_config.pkl").exists() 67 | 68 | 69 | def test_collect_data_generator_config(tmp_path, yaml_config): 70 | # Use StringIO to create an in-memory file-like object 71 | yaml_buffer = io.StringIO() 72 | yaml.dump(yaml_config, yaml_buffer) 73 | yaml_buffer.seek(0) # Reset buffer position to the start 74 | 75 | # Test configuration retrieval 76 | config_dict = collect_data_generator_config( 77 | yaml_config_path=yaml_buffer, base_path=tmp_path 78 | ) 79 | 80 | data_config = config_dict["data_config"] 81 | assert data_config["n_samples"] == 1000 82 | assert data_config["model"] == "ddm" 83 | assert data_config["delta_t"] == 0.1 84 | 85 | 86 | # TODO: test app object and CLI commands. Harder to do than with argparse 87 | -------------------------------------------------------------------------------- /tests/test_kde_class.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import numpy as np 3 | from ssms.support_utils.kde_class import LogKDE, bandwidth_silverman 4 | from ssms.basic_simulators.simulator import simulator 5 | 6 | 7 | @pytest.fixture 8 | def sample_ddm_data(): 9 | return simulator( 10 | model="ddm", theta=dict(v=1.0, a=1.5, z=0.5, t=0.3), n_samples=1000 11 | ) 12 | 13 | 14 | def test_logkde_initialization(sample_ddm_data): 15 | """Test basic initialization of LogKDE class.""" 16 | kde = LogKDE(simulator_data=sample_ddm_data) 17 | assert kde.simulator_info == sample_ddm_data["metadata"] 18 | assert not kde.displace_t 19 | assert kde.auto_bandwidth is True 20 | assert kde.bandwidth_type == "silverman" 21 | 22 | 23 | def test_bandwidth_silverman_with_std(): 24 | """Test bandwidth_silverman function.""" 25 | sample = np.array([1.0, 2.0, 3.0]) 26 | bw = bandwidth_silverman(sample) 27 | assert isinstance(bw, float) 28 | assert bw > 0 29 | 30 | 31 | def test_bandwidth_silverman_without_std(): 32 | """Test bandwidth_silverman function.""" 33 | sample = np.array([1.0, 1.0, 1.0]) 34 | bw = bandwidth_silverman(sample, std_cutoff=0.001) 35 | assert isinstance(bw, float) 36 | assert np.allclose(bw, 0.0008, atol=0.001) 37 | 38 | 39 | @pytest.mark.parametrize( 40 | "std_proc,expected", 41 | [ 42 | ("restrict", lambda x: x > 0), # bandwidth should be positive 43 | ("kill", lambda x: x == 0), # bandwidth should be zero 44 | ], 45 | ) 46 | def test_bandwidth_silverman_with_std_proc(std_proc, expected): 47 | """Test bandwidth_silverman function with different std_proc options.""" 48 | # Use a sample with zero standard deviation to test std_proc behavior 49 | sample = np.array([1.0, 1.0, 1.0]) 50 | bw = bandwidth_silverman(sample, std_cutoff=0.01, std_proc=std_proc) 51 | print(f"Bandwidth with std_proc={std_proc}: {bw}") 52 | assert isinstance(bw, float) 53 | assert expected(bw) 54 | 55 | 56 | def test_logkde_compute_bandwidths(sample_ddm_data): 57 | """Test compute_bandwidths method.""" 58 | kde = LogKDE(simulator_data=sample_ddm_data) 59 | bandwidths = kde.compute_bandwidths() 60 | assert isinstance(bandwidths, list) 61 | assert len(bandwidths) == 2 # For two choices (-1, 1) 62 | 63 | 64 | def test_kde_eval(sample_ddm_data): 65 | """Test kde_eval method.""" 66 | kde = LogKDE(simulator_data=sample_ddm_data) 67 | eval_data = {"rts": np.array([0.6, 0.8]), "choices": np.array([1, -1])} 68 | result = kde.kde_eval(eval_data, lb=-66.774) 69 | assert isinstance(result, np.ndarray) 70 | assert len(result) == 2 71 | assert np.all(result >= -66.774) 72 | 73 | 74 | def test_kde_sample(sample_ddm_data): 75 | """Test kde_sample method.""" 76 | kde = LogKDE(simulator_data=sample_ddm_data) 77 | samples = kde.kde_sample(n_samples=100) 78 | assert isinstance(samples, dict) 79 | assert "rts" in samples 80 | assert "choices" in samples 81 | assert len(samples["rts"]) == 100 82 | assert len(samples["choices"]) == 100 83 | 84 | 85 | def test_displace_t_validation(): 86 | """Test validation of t parameter when displace_t is True.""" 87 | data = { 88 | "rts": np.array([0.5, 0.6, 0.7, 0.8]), 89 | "choices": np.array([1, -1, 1, -1]), 90 | "metadata": { 91 | "max_t": 20.0, 92 | "possible_choices": [-1, 1], 93 | "t": np.array([0.1, 0.2]), # Different t values 94 | }, 95 | } 96 | with pytest.raises( 97 | ValueError, match="Multiple t values in simulator data. Can't shift." 98 | ): 99 | LogKDE(simulator_data=data, displace_t=True) 100 | 101 | 102 | def test_invalid_data_kde_eval(sample_ddm_data): 103 | """Test kde_eval with invalid data.""" 104 | kde = LogKDE(simulator_data=sample_ddm_data) 105 | with pytest.raises( 106 | ValueError, match="data dictionary must contain either rts or log_rts as keys!" 107 | ): 108 | kde.kde_eval({"invalid_key": np.array([0.6])}) 109 | -------------------------------------------------------------------------------- /tests/test_model_config.py: -------------------------------------------------------------------------------- 1 | import random 2 | import ssms 3 | from ssms.config import model_config 4 | 5 | 6 | class TestModelConfig: 7 | def test_model_config_dict_type(self): 8 | assert isinstance(model_config, ssms.config.CopyOnAccessDict) 9 | 10 | def test_model_config_copy_on_access(self): 11 | model_name = random.choice(list(model_config)) 12 | selected_model = model_config[model_name] 13 | list_params = selected_model["params"] 14 | list_params.append("p_outlier") 15 | assert "p_outlier" not in model_config[model_name]["params"] 16 | -------------------------------------------------------------------------------- /tests/test_simulator.py: -------------------------------------------------------------------------------- 1 | from copy import deepcopy 2 | import logging 3 | 4 | import numpy as np 5 | import pandas as pd 6 | import pytest 7 | 8 | from ssms.basic_simulators.simulator import simulator 9 | from ssms.config import model_config 10 | 11 | logger = logging.getLogger(__name__) 12 | 13 | 14 | @pytest.fixture(scope="module") 15 | def sim_input_data(): 16 | data = dict() 17 | 18 | # Prepare input data for each model 19 | for key, config in model_config.items(): 20 | # Get model parameter names 21 | model_param_list = config["params"] 22 | 23 | # Dictionary with all scalar values 24 | theta_dict_all_scalars = { 25 | param: config["default_params"][i] 26 | for i, param in enumerate(model_param_list) 27 | } 28 | 29 | # Dictionary with all vectors 30 | theta_dict_all_vectors = { 31 | param: np.tile( 32 | np.array(config["default_params"][i]), 33 | 100, 34 | ) 35 | for i, param in enumerate(model_param_list) 36 | } 37 | 38 | # Dictionary with mix of scalars and vectors 39 | theta_dict_sca_vec = deepcopy(theta_dict_all_vectors) 40 | cnt = 0 41 | for tmp_key in theta_dict_all_scalars: 42 | theta_dict_sca_vec[tmp_key] = theta_dict_all_scalars[tmp_key] 43 | if cnt > 0: 44 | break 45 | cnt += 1 46 | 47 | # Dictionary with vectors of uneven length 48 | theta_dict_uneven = deepcopy(theta_dict_all_vectors) 49 | 50 | cnt = 0 51 | for tmp_key in theta_dict_all_scalars: 52 | if cnt > 0: 53 | break 54 | theta_dict_uneven[tmp_key] = np.concatenate( 55 | [theta_dict_all_vectors[tmp_key], np.zeros(2)] 56 | ) 57 | cnt += 1 58 | 59 | # Input is list 60 | theta_list = [ 61 | config["default_params"][i] for i, param in enumerate(model_param_list) 62 | ] 63 | 64 | # Input is numpy array 65 | theta_nparray = np.array(theta_list) 66 | 67 | # Input is pd.DataFrame 68 | theta_pd_1 = pd.DataFrame([theta_nparray], columns=model_param_list) 69 | 70 | theta_pd_n = pd.DataFrame( 71 | np.tile(theta_nparray, (100, 1)), columns=model_param_list 72 | ) 73 | 74 | data[key] = { 75 | "theta_dict_all_scalars": theta_dict_all_scalars, 76 | "theta_dict_all_vectors": theta_dict_all_vectors, 77 | "theta_dict_sca_vec": theta_dict_sca_vec, 78 | "theta_dict_uneven": theta_dict_uneven, 79 | "theta_list": theta_list, 80 | "theta_nparray": theta_nparray, 81 | "theta_pd_1": theta_pd_1, 82 | "theta_pd_n": theta_pd_n, 83 | } 84 | 85 | return data 86 | 87 | 88 | def test_simulator_runs(sim_input_data): 89 | """Test that simulator runs for all models""" 90 | # Go over model names 91 | for key in model_config: 92 | # Go over different types of input data 93 | # (listed above in sim_input_data() fixture) 94 | for subkey in sim_input_data[key]: 95 | logger.debug(f"{key} -> {subkey}") 96 | 97 | # Go over different number of samples 98 | if subkey == "theta_dict_uneven": 99 | for n_samples in [1, 10]: 100 | with pytest.raises(ValueError): 101 | simulator( 102 | model=key, 103 | theta=sim_input_data[key][subkey], 104 | n_samples=n_samples, 105 | ) 106 | else: 107 | for n_samples in [1, 10]: 108 | logger.debug("input data: %s", sim_input_data[key][subkey]) 109 | logger.debug("n_samples: %s", n_samples) 110 | out = simulator( 111 | model=key, 112 | theta=sim_input_data[key][subkey], 113 | n_samples=n_samples, 114 | ) 115 | assert isinstance(out, dict) 116 | assert "metadata" in out 117 | assert "rts" in out 118 | assert "choices" in out 119 | --------------------------------------------------------------------------------