diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8372f83a..5cf85bbd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,63 +1,24 @@ -name: CI +name: ci/cd on: + workflow_dispatch: pull_request: branches: - main - - feat* - - dev* - - release* + push: + branches: + - main jobs: - linters: - runs-on: windows-latest - strategy: - matrix: - python-version: ["3.11"] - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: "3.11" - - name: Install dependencies - run: | - python -m pip install -e .[linters] --no-cache-dir - - name: Run ruff format - run: ruff format . - - name: Run ruff check - run: ruff check . - - name: Run codespell - run : codespell . - - tests: - runs-on: windows-latest - steps: - - uses: actions/checkout@v3 - - - name: Setup .NET Core SDK - uses: actions/setup-dotnet@v4.0.0 - with: - dotnet-version: 7.x - - name: Restore dotnet tools - run: dotnet tool restore - - name: Setup Bonsai - working-directory: bonsai - run: .\Setup.ps1 - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: '3.11' + python-linting: + uses: AllenNeuralDynamics/Aind.Behavior.GitHubActions/.github/workflows/python-linting.yml@main + with: + runs-on: ubuntu-latest - - name: Install dependencies - run: | - python -m pip install -e . --no-cache-dir - - name: Run tests - run: python -m unittest - - name: Regenerate schemas - run: python .\scripts\regenerate.py - - name: Check for uncommitted changes - run: | - git config --global core.safecrlf false - git diff --exit-code || (echo "Untracked changes found" && exit 1) + aind-behavior-framework-testing: + uses: AllenNeuralDynamics/Aind.Behavior.GitHubActions/.github/workflows/test-aind-behavior-framework.yml@main + with: + python-version-path: .python-version + run-coverage: false + run-schema: true \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 6b8123c8..beeb07d5 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,7 +3,7 @@ name: Deploy Sphinx documentation to Pages on: workflow_dispatch: push: - branches: [main] + branches: main jobs: pages: diff --git a/.github/workflows/tag_and_publish.yml b/.github/workflows/tag_and_publish.yml new file mode 100644 index 00000000..1f566ac7 --- /dev/null +++ b/.github/workflows/tag_and_publish.yml @@ -0,0 +1,10 @@ +name: Tag and Publish + +on: + workflow_dispatch: {} + +jobs: + tag-and-publish: + uses : AllenNeuralDynamics/Aind.Behavior.GitHubActions/.github/workflows/python-package-tag-and-publish.yml@main + with: + publish: false \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..06c7113d --- /dev/null +++ b/.python-version @@ -0,0 +1,3 @@ +3.11 +3.12 +3.13 \ No newline at end of file diff --git a/README.md b/README.md index c4fa67e9..83fe6cd4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # aind-vr-foraging +![CI](https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/actions/workflows/ci.yml/badge.svg) +[![PyPI - Version](https://img.shields.io/pypi/v/aind-behavior-vr-foraging)](https://pypi.org/project/aind-behavior-vr-foraging/) +[![License](https://img.shields.io/badge/license-MIT-brightgreen)](LICENSE) +[![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) +[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv) + A repository for the VR Foraging task. --- diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index 62f0fdef..59d78b71 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -4,15 +4,17 @@ - - - - - - - - + + + + + + + + + + @@ -66,11 +68,12 @@ + - + @@ -79,11 +82,13 @@ + + @@ -123,15 +128,17 @@ - - - - - - - - + + + + + + + + + + @@ -182,6 +189,7 @@ + @@ -190,7 +198,7 @@ - + diff --git a/bonsai/setup.ps1 b/bonsai/setup.ps1 index 7f43d41c..01cfba61 100644 --- a/bonsai/setup.ps1 +++ b/bonsai/setup.ps1 @@ -1,9 +1,21 @@ +Push-Location $PSScriptRoot if (!(Test-Path "./Bonsai.exe")) { - Invoke-WebRequest "https://github.com/bonsai-rx/bonsai/releases/download/2.8.5/Bonsai.zip" -OutFile "temp.zip" - Move-Item -Path "NuGet.config" "temp.config" + $release = "https://github.com/bonsai-rx/bonsai/releases/latest/download/Bonsai.zip" + $configPath = "./Bonsai.config" + if (Test-Path $configPath) { + [xml]$config = Get-Content $configPath + $bootstrapper = $config.PackageConfiguration.Packages.Package.where{$_.id -eq 'Bonsai'} + if ($bootstrapper) { + $version = $bootstrapper.version + $release = "https://github.com/bonsai-rx/bonsai/releases/download/$version/Bonsai.zip" + } + } + Invoke-WebRequest $release -OutFile "temp.zip" + Move-Item -Path "NuGet.config" "temp.config" -ErrorAction SilentlyContinue Expand-Archive "temp.zip" -DestinationPath "." -Force - Move-Item -Path "temp.config" "NuGet.config" -Force + Move-Item -Path "temp.config" "NuGet.config" -Force -ErrorAction SilentlyContinue Remove-Item -Path "temp.zip" Remove-Item -Path "Bonsai32.exe" } -& .\Bonsai.exe --no-editor \ No newline at end of file +& .\Bonsai.exe --no-editor +Pop-Location \ No newline at end of file diff --git a/examples/examples.py b/examples/examples.py index dda2bc7b..fdc8750a 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -21,6 +21,12 @@ OlfactometerChannelConfig, OlfactometerChannelType, ) +from aind_behavior_services.calibration.treadmill import ( + Treadmill, + TreadmillCalibration, + TreadmillCalibrationInput, + TreadmillCalibrationOutput, +) from aind_behavior_services.calibration.water_valve import ( Measurement, WaterValveCalibration, @@ -36,10 +42,7 @@ HarpLickometer, HarpOlfactometer, HarpSniffDetector, - HarpTreadmill, RigCalibration, - Screen, - Treadmill, ) from aind_behavior_vr_foraging.task_logic import ( AindVrForagingTaskLogic, @@ -126,7 +129,7 @@ def mock_rig() -> AindVrForagingRig: ] ) water_valve_calibration = WaterValveCalibration( - input=water_valve_input, output=water_valve_input.calibrate_output(), calibration_date=datetime.datetime.now() + input=water_valve_input, output=water_valve_input.calibrate_output(), date=datetime.datetime.now() ) water_valve_calibration.output = WaterValveCalibrationOutput(slope=1, offset=0) # For testing purposes @@ -152,16 +155,17 @@ def mock_rig() -> AindVrForagingRig: harp_clock_generator=HarpClockGenerator(port_name="COM6"), harp_analog_input=None, harp_sniff_detector=HarpSniffDetector(port_name="COM7"), - harp_treadmill=HarpTreadmill( + harp_treadmill=Treadmill( port_name="COM8", - calibration=Treadmill( - wheel_diameter=15, - pulses_per_revolution=28800, - break_lookup_calibration=[[0, 0], [1, 65535]], + calibration=TreadmillCalibration( + input=TreadmillCalibrationInput(), + output=TreadmillCalibrationOutput( + wheel_diameter=15, pulses_per_revolution=28800, brake_lookup_calibration=[[0, 0], [1, 65535]] + ), ), ), manipulator=AindManipulatorDevice(port_name="COM9", calibration=manipulator_calibration), - screen=Screen(display_index=1), + screen=rig.Screen(display_index=1), calibration=RigCalibration(water_valve=water_valve_calibration), ) @@ -302,7 +306,10 @@ def PostPatch_VirtualSiteGeneratorHelper(contrast: float = 1, friction: float = task_parameters=AindVrForagingTaskParameters( rng_seed=None, updaters=updaters, - environment_statistics=environment_statistics, + environment=vr_task_logic.BlockStructure( + blocks=[vr_task_logic.Block(environment_statistics=environment_statistics, end_conditions=[])], + sampling_mode="Random", + ), task_mode_settings=vr_task_logic.ForagingSettings(), operation_control=operation_control, ) diff --git a/pyproject.toml b/pyproject.toml index fbe26339..8412d494 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,24 +4,35 @@ build-backend = "setuptools.build_meta" [project] name = "aind-behavior-vr-foraging" -description = "A library that defines AIND data schema for the Aind Behavior VR Foraing experiment." +description = "A library that defines AIND data schema for the Aind Behavior VR Foraging experiment." +authors = [ {name = "Bruno Cruz", email = "bruno.cruz@alleninstitute.org"}] license = {text = "MIT"} requires-python = ">=3.11" classifiers = [ - "Programming Language :: Python :: 3" + "Programming Language :: Python :: 3.11", + "License :: OSI Approved :: MIT License", + "Operating System :: Microsoft :: Windows", ] readme = "README.md" dynamic = ["version"] dependencies = [ - "aind_behavior_services@git+https://github.com/AllenNeuralDynamics/Aind.Behavior.Services@0.7.14", + "aind_behavior_services>=0.9, <0.10", ] +[project.urls] +Documentation = "https://allenneuraldynamics.github.io/Aind.Behavior.VrForaging/" +Repository = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/" +Issues = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/issues" +Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/releases" + [project.optional-dependencies] -linters = [ - 'ruff', - 'codespell' +launcher = ["aind_behavior_experiment_launcher[aind-services]<0.4"] + +dev = ["aind_behavior_vr_foraging[launcher]", + "ruff", + "codespell" ] docs = [ @@ -33,12 +44,16 @@ docs = [ 'sphinx-jsonschema' ] +[project.scripts] +clabe = "aind_behavior_vr_foraging.launcher:main" +regenerate = "aind_behavior_vr_foraging.regenerate:main" + [tool.setuptools.packages.find] where = ["src/DataSchemas"] [tool.setuptools.dynamic] version = {attr = "aind_behavior_vr_foraging.__version__"} -readme = {file = ["README.md"]} +readme = {file = "README.md", content-type = "text/markdown"} [tool.ruff] line-length = 120 @@ -51,5 +66,5 @@ mccabe = { max-complexity = 14 } pydocstyle = { convention = 'google' } [tool.codespell] -skip = '.git,*.pdf,*.svg,./bonsai,*.bonsai,./docs/_build' +skip = '.git,*.pdf,*.svg,./bonsai,*.bonsai,./docs/_build,uv.lock' ignore-words-list = 'nd' \ No newline at end of file diff --git a/scripts/deploy.ps1 b/scripts/deploy.ps1 index af7ecdb1..1cfed848 100644 --- a/scripts/deploy.ps1 +++ b/scripts/deploy.ps1 @@ -8,7 +8,7 @@ if (Test-Path -Path ./.venv) { &python -m venv ./.venv .\.venv\Scripts\Activate.ps1 Write-Output "Installing python packages..." -&pip install . +&pip install .[aind-services] Write-Output "Creating a Bonsai environment and installing packages..." Set-Location "bonsai" .\setup.ps1 diff --git a/scripts/launcher.ps1 b/scripts/launcher.ps1 index c4d84221..32e582dc 100644 --- a/scripts/launcher.ps1 +++ b/scripts/launcher.ps1 @@ -1,4 +1,4 @@ $scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location -Path (Split-Path -Parent $scriptPath) .\.venv\Scripts\Activate.ps1 -& python .\scripts\launcher.py \ No newline at end of file +& clabe \ No newline at end of file diff --git a/scripts/launcher.py b/scripts/launcher.py deleted file mode 100644 index 8c0ff9a9..00000000 --- a/scripts/launcher.py +++ /dev/null @@ -1,16 +0,0 @@ -from aind_behavior_services.launcher import LauncherCli -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic - -if __name__ == "__main__": - launcher_cli = LauncherCli( - rig_schema=AindVrForagingRig, - session_schema=AindBehaviorSessionModel, - task_logic_schema=AindVrForagingTaskLogic, - data_dir=r"C:/Data", - remote_data_dir=r"\\allen\aind\scratch\vr-foraging\data", - config_library_dir=r"\\allen\aind\scratch\AindBehavior.db\AindVrForaging", - workflow=r"./src/vr-foraging.bonsai", - ) - launcher_cli.run() diff --git a/scripts/regenerate.cmd b/scripts/regenerate.cmd deleted file mode 100644 index 7179544c..00000000 --- a/scripts/regenerate.cmd +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -setlocal -set "scriptPath=%~dp0" -set "pythonScriptPath=%scriptPath%regenerate.ps1" -powershell -ExecutionPolicy Bypass -File "%pythonScriptPath%" -endlocal diff --git a/scripts/regenerate.ps1 b/scripts/regenerate.ps1 deleted file mode 100644 index 732f62b3..00000000 --- a/scripts/regenerate.ps1 +++ /dev/null @@ -1,4 +0,0 @@ -$scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path -Set-Location -Path (Split-Path -Parent $scriptPath) -.\.venv\Scripts\Activate.ps1 -& python .\scripts\regenerate.py \ No newline at end of file diff --git a/src/.gitignore b/src/.gitignore index ed998d9a..f2d70a3e 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -2,4 +2,4 @@ .vs .vscode src.sln -*bonsai.layout \ No newline at end of file +.bonsai \ No newline at end of file diff --git a/src/Calibration/Monitors/center_extrinsics.yml b/src/Calibration/Monitors/center_extrinsics.yml deleted file mode 100644 index 6d96280e..00000000 --- a/src/Calibration/Monitors/center_extrinsics.yml +++ /dev/null @@ -1,9 +0,0 @@ -%YAML:1.0 -rotation: - x: 0. - y: 0. - z: 0. -translation: - x: 0. - y: 1.309016 - z: -13.27 \ No newline at end of file diff --git a/src/Calibration/Monitors/center_intrinsics.yml b/src/Calibration/Monitors/center_intrinsics.yml deleted file mode 100644 index 4d60c2ae..00000000 --- a/src/Calibration/Monitors/center_intrinsics.yml +++ /dev/null @@ -1,6 +0,0 @@ -%YAML:1.0 -display_id: 1 -frame_width: 1920 -frame_height: 1080 -display_width: 20 -display_height: 15 diff --git a/src/Calibration/Monitors/left_extrinsics.yml b/src/Calibration/Monitors/left_extrinsics.yml deleted file mode 100644 index a32397e1..00000000 --- a/src/Calibration/Monitors/left_extrinsics.yml +++ /dev/null @@ -1,9 +0,0 @@ -%YAML:1.0 -rotation: - x: 0. - y: 1.0472 - z: 0. -translation: - x: -16.6917756 - y: 1.309016 - z: -3.575264 \ No newline at end of file diff --git a/src/Calibration/Monitors/left_intrinsics.yml b/src/Calibration/Monitors/left_intrinsics.yml deleted file mode 100644 index 4d60c2ae..00000000 --- a/src/Calibration/Monitors/left_intrinsics.yml +++ /dev/null @@ -1,6 +0,0 @@ -%YAML:1.0 -display_id: 1 -frame_width: 1920 -frame_height: 1080 -display_width: 20 -display_height: 15 diff --git a/src/Calibration/Monitors/right_extrinsics.yml b/src/Calibration/Monitors/right_extrinsics.yml deleted file mode 100644 index 7d09b950..00000000 --- a/src/Calibration/Monitors/right_extrinsics.yml +++ /dev/null @@ -1,9 +0,0 @@ -%YAML:1.0 -rotation: - x: 0. - y: -1.0472 - z: 0. -translation: - x: 16.6917756 - y: 1.309016 - z: -3.575264 \ No newline at end of file diff --git a/src/Calibration/Monitors/right_intrinsics.yml b/src/Calibration/Monitors/right_intrinsics.yml deleted file mode 100644 index 4d60c2ae..00000000 --- a/src/Calibration/Monitors/right_intrinsics.yml +++ /dev/null @@ -1,6 +0,0 @@ -%YAML:1.0 -display_id: 1 -frame_width: 1920 -frame_height: 1080 -display_width: 20 -display_height: 15 diff --git a/src/DataSchemas/aind_behavior_session_model.json b/src/DataSchemas/aind_behavior_session_model.json index c4cd00f0..0663cfd4 100644 --- a/src/DataSchemas/aind_behavior_session_model.json +++ b/src/DataSchemas/aind_behavior_session_model.json @@ -1,8 +1,14 @@ { "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.9.0", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, "version": { - "const": "0.2.0", - "default": "0.2.0", + "const": "0.3.0", + "default": "0.3.0", "title": "Version", "type": "string" }, @@ -31,9 +37,9 @@ "title": "Root Path", "type": "string" }, - "remote_path": { + "session_name": { "default": null, - "description": "Remote path where data will be attempted to be copied to after experiment is done", + "description": "Name of the session. This will be used to create a folder in the root path.", "oneOf": [ { "type": "string" @@ -42,7 +48,7 @@ "type": "null" } ], - "title": "Remote Path" + "title": "Session Name" }, "subject": { "description": "Name of the subject", diff --git a/src/DataSchemas/aind_behavior_vr_foraging/__init__.py b/src/DataSchemas/aind_behavior_vr_foraging/__init__.py index f6b7e267..3d187266 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging/__init__.py +++ b/src/DataSchemas/aind_behavior_vr_foraging/__init__.py @@ -1 +1 @@ -__version__ = "0.4.3" +__version__ = "0.5.0" diff --git a/src/DataSchemas/aind_behavior_vr_foraging/data_mappers.py b/src/DataSchemas/aind_behavior_vr_foraging/data_mappers.py new file mode 100644 index 00000000..750c4cd0 --- /dev/null +++ b/src/DataSchemas/aind_behavior_vr_foraging/data_mappers.py @@ -0,0 +1,479 @@ +import datetime +import logging +import os +from pathlib import Path +from typing import Callable, Dict, List, Optional, Self, Tuple, Type, TypeVar, Union + +import aind_behavior_services.rig as AbsRig +import aind_data_schema +import aind_data_schema.base +import aind_data_schema.components.coordinates +import aind_data_schema.components.devices +import aind_data_schema.components.stimulus +import aind_data_schema.core.rig +import aind_data_schema.core.session +import git +import pydantic +from aind_behavior_experiment_launcher.data_mapper import DataMapper +from aind_behavior_experiment_launcher.data_mapper import aind_data_schema as ads +from aind_behavior_experiment_launcher.data_mapper import helpers as data_mapper_helpers +from aind_behavior_experiment_launcher.launcher.behavior_launcher import BehaviorLauncher +from aind_behavior_experiment_launcher.records.subject import WaterLogResult +from aind_behavior_services.calibration import Calibration +from aind_behavior_services.calibration.olfactometer import OlfactometerChannelType +from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.utils import model_from_json_file, utcnow + +from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic + +TFrom = TypeVar("TFrom", bound=Union[pydantic.BaseModel, dict]) +TTo = TypeVar("TTo", bound=pydantic.BaseModel) + +T = TypeVar("T") + +logger = logging.getLogger(__name__) + +_DATABASE_DIR = "AindDataSchemaRig" + + +class AindRigDataMapper(ads.AindDataSchemaRigDataMapper): + def __init__( + self, + *, + rig_schema_filename: str, + db_root: os.PathLike, + db_suffix: Optional[str] = None, + ): + super().__init__() + self.filename = rig_schema_filename + self.db_root = db_root + self.db_dir = db_suffix if db_suffix else f"{_DATABASE_DIR}/{os.environ['COMPUTERNAME']}" + self.target_file = Path(self.db_root) / self.db_dir / self.filename + self._mapped: Optional[aind_data_schema.core.rig.Rig] = None + + @property + def session_name(self): + raise NotImplementedError("Method not implemented.") + + def write_standard_file(self, directory: os.PathLike) -> None: + self.mapped.write_standard_file(directory) + + def map(self) -> aind_data_schema.core.rig.Rig: + logger.info("Mapping aind-data-schema Rig.") + + file_exists = self.target_file.exists() + if not file_exists: + raise FileNotFoundError(f"File {self.target_file} does not exist.") + + try: + self._mapped = model_from_json_file(self.target_file, aind_data_schema.core.rig.Rig) + except (pydantic.ValidationError, ValueError, IOError) as e: + logger.error("Failed to map to aind-data-schema Session. %s", e) + raise e + else: + return self.mapped + + @property + def mapped(self) -> aind_data_schema.core.rig.Rig: + if self._mapped is None: + raise ValueError("Data has not been mapped yet.") + return self._mapped + + def is_mapped(self) -> bool: + return self.mapped is not None + + +class AindSessionDataMapper(ads.AindDataSchemaSessionDataMapper): + def __init__( + self, + session_model: AindBehaviorSessionModel, + rig_model: AindVrForagingRig, + task_logic_model: AindVrForagingTaskLogic, + repository: Union[os.PathLike, git.Repo], + script_path: os.PathLike, + session_end_time: Optional[datetime.datetime] = None, + output_parameters: Optional[Dict] = None, + subject_info: Optional[WaterLogResult] = None, + ): + self.session_model = session_model + self.rig_model = rig_model + self.task_logic_model = task_logic_model + self.repository = repository + self.script_path = script_path + self.session_end_time = session_end_time + self.output_parameters = output_parameters + self.subject_info = subject_info + self._mapped: Optional[aind_data_schema.core.session.Session] = None + + @property + def session_name(self): + raise self.session_model.session_name + + @property + def mapped(self) -> aind_data_schema.core.session.Session: + if self._mapped is None: + raise ValueError("Data has not been mapped yet.") + return self._mapped + + def is_mapped(self) -> bool: + return self.mapped is not None + + def map(self) -> Optional[aind_data_schema.core.session.Session]: + logger.info("Mapping aind-data-schema Session.") + try: + self._mapped = self._map( + session_model=self.session_model, + rig_model=self.rig_model, + task_logic_model=self.task_logic_model, + repository=self.repository, + script_path=self.script_path, + session_end_time=self.session_end_time, + output_parameters=self.output_parameters, + subject_info=self.subject_info, + ) + except (pydantic.ValidationError, ValueError, IOError) as e: + logger.error("Failed to map to aind-data-schema Session. %s", e) + raise e + else: + return self._mapped + + def write_standard_file(self, directory: os.PathLike) -> None: + self.mapped.write_standard_file(directory) + + @classmethod + def _map( + cls, + session_model: AindBehaviorSessionModel, + rig_model: AindVrForagingRig, + task_logic_model: AindVrForagingTaskLogic, + repository: Union[os.PathLike, git.Repo], + script_path: os.PathLike, + session_end_time: Optional[datetime.datetime] = None, + output_parameters: Optional[Dict] = None, + subject_info: Optional[WaterLogResult] = None, + **kwargs, + ) -> aind_data_schema.core.session.Session: + # Normalize repository + if isinstance(repository, os.PathLike | str): + repository = git.Repo(Path(repository)) + repository_remote_url = repository.remote().url + repository_sha = repository.head.commit.hexsha + repository_relative_script_path = Path(script_path).resolve().relative_to(repository.working_dir) + + # Populate calibrations: + # calibrations = [cls._mapper_calibration(rig_model.calibration.water_valve)] + + # TODO: Hack until someone solves https://github.com/AllenNeuralDynamics/aind-data-schema/issues/1248 + _out = ( + rig_model.calibration.water_valve.output.model_copy(update={"interval_average": None}) + if rig_model.calibration.water_valve.output + else None + ) + water_calibration = aind_data_schema.core.rig.Calibration( + calibration_date=rig_model.calibration.water_valve.date + if rig_model.calibration.water_valve.date + else utcnow(), + device_name=rig_model.calibration.water_valve.device_name, + description=rig_model.calibration.water_valve.description, + input=rig_model.calibration.water_valve.input.model_dump() + if rig_model.calibration.water_valve.input + else {}, + output=_out.model_dump() if _out else {}, + ) + calibrations = [water_calibration] + + # Populate cameras + cameras = data_mapper_helpers.get_cameras(rig_model, exclude_without_video_writer=True) + # populate devices + devices = [ + device[0] + for device in data_mapper_helpers.get_fields_of_type(rig_model, AbsRig.HarpDeviceGeneric) + if device[0] + ] + # Populate modalities + modalities: list[aind_data_schema.core.session.Modality] = [ + getattr(aind_data_schema.core.session.Modality, "BEHAVIOR") + ] + if len(cameras) > 0: + modalities.append(getattr(aind_data_schema.core.session.Modality, "BEHAVIOR_VIDEOS")) + modalities = list(set(modalities)) + # Populate stimulus modalities + stimulus_modalities: list[aind_data_schema.core.session.StimulusModality] = [] + stimulation_parameters: List[ + aind_data_schema.core.session.AuditoryStimulation + | aind_data_schema.core.session.OlfactoryStimulation + | aind_data_schema.core.session.VisualStimulation + ] = [] + stimulation_devices: List[str] = [] + # Olfactory Stimulation + stimulus_modalities.append(aind_data_schema.core.session.StimulusModality.OLFACTORY) + olfactory_stimulus_channel_config: List[aind_data_schema.components.stimulus.OlfactometerChannelConfig] = [] + for _, channel in rig_model.harp_olfactometer.calibration.input.channel_config.items(): + if channel.channel_type == OlfactometerChannelType.ODOR: + olfactory_stimulus_channel_config.append( + coerce_to_aind_data_schema(channel, aind_data_schema.components.stimulus.OlfactometerChannelConfig) + ) + stimulation_parameters.append( + aind_data_schema.core.session.OlfactoryStimulation( + stimulus_name="Olfactory", channels=olfactory_stimulus_channel_config + ) + ) + + _olfactory_device = data_mapper_helpers.get_fields_of_type(rig_model, AbsRig.HarpOlfactometer) + if len(_olfactory_device) > 0: + if _olfactory_device[0][0]: + stimulation_devices.append(_olfactory_device[0][0]) + else: + logger.error("Olfactometer device not found in rig model.") + raise ValueError("Olfactometer device not found in rig model.") + + # Auditory Stimulation + stimulus_modalities.append(aind_data_schema.core.session.StimulusModality.AUDITORY) + + stimulation_parameters.append( + aind_data_schema.core.session.AuditoryStimulation(sitmulus_name="Beep", sample_frequency=0) + ) + speaker_config = aind_data_schema.core.session.SpeakerConfig(name="Speaker", volume=60) + stimulation_devices.append("speaker") + # Visual/VR Stimulation + stimulus_modalities.extend( + [ + aind_data_schema.core.session.StimulusModality.VISUAL, + aind_data_schema.core.session.StimulusModality.VIRTUAL_REALITY, + ] + ) + + stimulation_parameters.append( + aind_data_schema.core.session.VisualStimulation( + stimulus_name="VrScreen", + stimulus_parameters={}, + ) + ) + _screen_device = data_mapper_helpers.get_fields_of_type(rig_model, AbsRig.Screen) + if len(_screen_device) > 0: + if _screen_device[0][0]: + stimulation_devices.append(_screen_device[0][0]) + else: + logger.error("Screen device not found in rig model.") + raise ValueError("Screen device not found in rig model.") + + stimulus_modalities.append(aind_data_schema.core.session.StimulusModality.WHEEL_FRICTION) + # Mouse platform + mouse_platform: str = "wheel" + + # Reward delivery + if rig_model.manipulator.calibration is None: + logger.error("Manipulator calibration is not set.") + raise ValueError("Manipulator calibration is not set.") + initial_position = rig_model.manipulator.calibration.input.initial_position + reward_delivery_config = aind_data_schema.core.session.RewardDeliveryConfig( + reward_solution=aind_data_schema.core.session.RewardSolution.WATER, + reward_spouts=[ + aind_data_schema.core.session.RewardSpoutConfig( + side=aind_data_schema.components.devices.SpoutSide.CENTER, + variable_position=True, + starting_position=aind_data_schema.components.devices.RelativePosition( + device_position_transformations=[ + aind_data_schema.components.coordinates.Translation3dTransform( + translation=[initial_position.x, initial_position.y2, initial_position.z] + ) + ], + device_origin="Manipulator home", + device_axes=[ + aind_data_schema.components.coordinates.Axis( + name=aind_data_schema.components.coordinates.AxisName.X, direction="Left" + ), + aind_data_schema.components.coordinates.Axis( + name=aind_data_schema.components.coordinates.AxisName.Y, direction="Front" + ), + aind_data_schema.components.coordinates.Axis( + name=aind_data_schema.components.coordinates.AxisName.Z, direction="Top" + ), + ], + ), + ) + ], + ) + + end_time = datetime.datetime.now() + + # Construct aind-data-schema session + aind_data_schema_session = aind_data_schema.core.session.Session( + animal_weight_post=subject_info.weight_g if subject_info else None, + reward_consumed_total=subject_info.water_earned_ml if subject_info else None, + reward_delivery=reward_delivery_config, + experimenter_full_name=session_model.experimenter, + session_start_time=session_model.date, + session_end_time=session_end_time, + session_type=session_model.experiment, + rig_id=rig_model.rig_name, + subject_id=session_model.subject, + notes=session_model.notes, + data_streams=[ + aind_data_schema.core.session.Stream( + daq_names=devices, + stream_modalities=modalities, + stream_start_time=session_model.date, + stream_end_time=session_end_time if session_end_time else end_time, + camera_names=list(cameras.keys()), + ), + ], + calibrations=calibrations, + mouse_platform_name=mouse_platform, + active_mouse_platform=True, + stimulus_epochs=[ + aind_data_schema.core.session.StimulusEpoch( + stimulus_name=session_model.experiment, + stimulus_start_time=session_model.date, + stimulus_end_time=session_end_time if session_end_time else end_time, + stimulus_modalities=stimulus_modalities, + stimulus_parameters=stimulation_parameters, + software=[ + aind_data_schema.core.session.Software( + name="Bonsai", + version=f"{repository_remote_url}/blob/{repository_sha}/bonsai/Bonsai.config", + url=f"{repository_remote_url}/blob/{repository_sha}/bonsai", + parameters=data_mapper_helpers.snapshot_bonsai_environment( + config_file=kwargs.get("bonsai_config_path", Path("./bonsai/bonsai.config")) + ), + ), + aind_data_schema.core.session.Software( + name="Python", + version=f"{repository_remote_url}/blob/{repository_sha}/pyproject.toml", + url=f"{repository_remote_url}/blob/{repository_sha}", + parameters=data_mapper_helpers.snapshot_python_environment(), + ), + ], + script=aind_data_schema.core.session.Software( + name=Path(script_path).stem, + version=session_model.commit_hash if session_model.commit_hash else repository_sha, + url=f"{repository_remote_url}/blob/{repository_sha}/{repository_relative_script_path}", + parameters=task_logic_model.model_dump(), + ), + output_parameters=output_parameters if output_parameters else {}, + speaker_config=speaker_config, + reward_consumed_during_epoch=subject_info.total_water_ml if subject_info else None, + stimulus_device_names=stimulation_devices, + ) # type: ignore + ], + ) # type: ignore + return aind_data_schema_session + + @staticmethod + def _mapper_calibration(calibration: Calibration) -> aind_data_schema.components.devices.Calibration: + return ads.create_encoding_model(aind_data_schema.components.devices.Calibration)( + device_name=calibration.device_name, + input=calibration.input.model_dump() if calibration.input else {}, + output=calibration.output.model_dump() if calibration.output else {}, + calibration_date=calibration.date if calibration.date else utcnow(), + description=calibration.description if calibration.description else "", + notes=calibration.notes, + ) + + +def coerce_to_aind_data_schema(value: TFrom, target_type: Type[TTo]) -> TTo: + _normalized_input: dict + if isinstance(value, pydantic.BaseModel): + _normalized_input = value.model_dump() + elif isinstance(value, dict): + _normalized_input = value + else: + raise ValueError(f"Expected value to be a pydantic.BaseModel or a dict, got {type(value)}") + target_fields = target_type.model_fields + _normalized_input = {k: v for k, v in _normalized_input.items() if k in target_fields} + return target_type(**_normalized_input) + + +def aind_session_data_mapper_factory(launcher: BehaviorLauncher) -> AindSessionDataMapper: + now = utcnow() + return AindSessionDataMapper( + session_model=launcher.session_schema, + rig_model=launcher.rig_schema, + task_logic_model=launcher.task_logic_schema, + repository=launcher.repository, + script_path=launcher.services_factory_manager.bonsai_app.workflow, + session_end_time=now, + ) + + +def aind_rig_data_mapper_factory( + launcher: BehaviorLauncher[AindVrForagingRig, AindBehaviorSessionModel, AindVrForagingTaskLogic], +) -> AindRigDataMapper: + rig_schema: AindVrForagingRig = launcher.rig_schema + return AindRigDataMapper( + rig_schema_filename=f"{rig_schema.rig_name}.json", + db_suffix=f"{_DATABASE_DIR}/{launcher.computer_name}", + db_root=launcher.config_library_dir, + ) + + +class AindDataMapperWrapper(DataMapper): + def __init__( + self, + *, + launcher: Optional[BehaviorLauncher] = None, + rig_data_mapper_factory: Optional[Callable[[BehaviorLauncher], AindRigDataMapper]] = None, + session_data_mapper_factory: Optional[Callable[[BehaviorLauncher], AindSessionDataMapper]] = None, + ): + super().__init__() + self._rig_mapper_factory = rig_data_mapper_factory or aind_rig_data_mapper_factory + self._session_mapper_factory = session_data_mapper_factory or aind_session_data_mapper_factory + + self._rig_mapper: Optional[AindRigDataMapper] = None + self._session_mapper: Optional[AindSessionDataMapper] = None + + self._session_schema: Optional[aind_data_schema.core.session.Session] = None + self._rig_schema: Optional[aind_data_schema.core.rig.Rig] = None + + self._launcher = launcher + self._mapped: Optional[aind_data_schema.core.rig.Rig] = None + + @property + def session_directory(self): + return self._launcher.session_directory + + @property + def session_name(self): + if self._launcher.session_schema_model is not None: + return self._launcher.session_schema_model.session_name + else: + raise ValueError("Can't infer session name from _launcher.") + + @classmethod + def from_launcher( + cls, + launcher: BehaviorLauncher[AindVrForagingRig, AindBehaviorSessionModel, AindVrForagingTaskLogic], + rig_data_mapper_factory: Optional[Callable[[BehaviorLauncher], AindRigDataMapper]] = None, + session_data_mapper_factory: Optional[Callable[[BehaviorLauncher], AindSessionDataMapper]] = None, + ) -> Self: + return cls( + launcher=launcher, + rig_data_mapper_factory=rig_data_mapper_factory, + session_data_mapper_factory=session_data_mapper_factory, + ) + + def map(self) -> Tuple[aind_data_schema.core.rig.Rig, aind_data_schema.core.session.Session]: + if self._launcher is None: + raise ValueError("Launcher is not set.") + self._rig_mapper = self._rig_mapper_factory(self._launcher) + self._session_mapper = self._session_mapper_factory(self._launcher) + self._rig_schema = self._rig_mapper.map() + self._session_schema = self._session_mapper.map() + if self._rig_schema is None or self._session_schema is None: + raise ValueError("Failed to map data.") + self._session_schema.rig_id = self._rig_schema.rig_id + logger.info("Writing session.json to %s", self.session_directory) + self._session_schema.write_standard_file(self.session_directory) + logger.info("Writing rig.json to %s", self.session_directory) + self._rig_schema.write_standard_file(self.session_directory) + return self.mapped + + @property + def mapped(self) -> Tuple[aind_data_schema.core.rig.Rig, aind_data_schema.core.session.Session]: + if self._rig_mapper is None or self._session_mapper is None: + raise ValueError("Data has not been mapped yet.") + return (self._rig_schema, self._session_schema) + + def is_mapped(self) -> bool: + return (self._rig_schema is not None) and (self._session_schema is not None) diff --git a/src/DataSchemas/aind_behavior_vr_foraging/launcher.py b/src/DataSchemas/aind_behavior_vr_foraging/launcher.py new file mode 100644 index 00000000..0373cf02 --- /dev/null +++ b/src/DataSchemas/aind_behavior_vr_foraging/launcher.py @@ -0,0 +1,111 @@ +import datetime +import os +from functools import partial +from pathlib import Path +from typing import Callable, Optional + +import aind_behavior_experiment_launcher.launcher.behavior_launcher as behavior_launcher +from aind_behavior_experiment_launcher import resource_monitor +from aind_behavior_experiment_launcher.apps import BonsaiApp +from aind_behavior_experiment_launcher.data_transfer import aind_watchdog +from aind_behavior_services.session import AindBehaviorSessionModel + +from aind_behavior_vr_foraging.data_mappers import AindDataMapperWrapper +from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic + + +def make_launcher() -> behavior_launcher.BehaviorLauncher: + data_dir = r"C:/Data" + remote_dir = Path(r"\\allen\aind\scratch\vr-foraging\data") + srv = behavior_launcher.BehaviorServicesFactoryManager() + srv.attach_bonsai_app(BonsaiApp(r"./src/vr-foraging.bonsai")) + srv.attach_data_mapper(AindDataMapperWrapper.from_launcher) + srv.attach_data_transfer( + watchdog_data_transfer_factory(remote_dir, project_name="Cognitive flexibility in patch foraging") + ) + + srv.attach_resource_monitor( + resource_monitor.ResourceMonitor( + constrains=[ + resource_monitor.available_storage_constraint_factory(data_dir, 2e11), + resource_monitor.remote_dir_exists_constraint_factory(Path(remote_dir)), + ] + ) + ) + + return behavior_launcher.BehaviorLauncher( + rig_schema_model=AindVrForagingRig, + session_schema_model=AindBehaviorSessionModel, + task_logic_schema_model=AindVrForagingTaskLogic, + data_dir=data_dir, + config_library_dir=r"\\allen\aind\scratch\AindBehavior.db\AindVrForaging", + temp_dir=r"./local/.temp", + allow_dirty=False, + skip_hardware_validation=False, + debug_mode=False, + group_by_subject_log=True, + services=srv, + validate_init=True, + ) + + +def watchdog_data_transfer_factory( + destination: os.PathLike, + schedule_time: Optional[datetime.time] = datetime.time(hour=20), + project_name: Optional[str] = None, + **watchdog_kwargs, +) -> Callable[[behavior_launcher.BehaviorLauncher], aind_watchdog.WatchdogDataTransferService]: + return partial( + _watchdog_data_transfer_factory, + destination=destination, + schedule_time=schedule_time, + project_name=project_name, + **watchdog_kwargs, + ) + + +def _watchdog_data_transfer_factory( + launcher: behavior_launcher.BehaviorLauncher, + destination: os.PathLike, + **watchdog_kwargs, +) -> aind_watchdog.WatchdogDataTransferService: + if launcher.services_factory_manager.data_mapper is None: + raise ValueError("Data mapper service is not set. Cannot create watchdog.") + if not isinstance(launcher.services_factory_manager.data_mapper, AindDataMapperWrapper): + raise ValueError( + "Data mapper service is not of the correct type (AindDataMapperWrapper). Cannot create watchdog." + ) + if not launcher.services_factory_manager.data_mapper.is_mapped(): + raise ValueError("Data mapper has not mapped yet. Cannot create watchdog.") + + if not isinstance(launcher.session_schema, AindBehaviorSessionModel): + raise ValueError( + "Session schema is not of the correct type (AindBehaviorSessionModel). Cannot create watchdog." + ) + + if not launcher.session_schema.session_name: + raise ValueError("Session name is not set. Cannot create watchdog.") + + destination = Path(destination) + if launcher.group_by_subject_log: + destination = destination / launcher.session_schema.subject + + watchdog = aind_watchdog.WatchdogDataTransferService( + source=launcher.session_directory, + aind_session_data_mapper=launcher.services_factory_manager.data_mapper._session_mapper, + session_name=launcher.session_schema.session_name, + destination=destination, + **watchdog_kwargs, + ) + return watchdog + + +def main(): + launcher = make_launcher() + launcher.main() + return None + + +if __name__ == "__main__": + main() diff --git a/scripts/regenerate.py b/src/DataSchemas/aind_behavior_vr_foraging/regenerate.py similarity index 99% rename from scripts/regenerate.py rename to src/DataSchemas/aind_behavior_vr_foraging/regenerate.py index b9db9e2e..279045f2 100644 --- a/scripts/regenerate.py +++ b/src/DataSchemas/aind_behavior_vr_foraging/regenerate.py @@ -1,8 +1,6 @@ import inspect from pathlib import Path -import aind_behavior_vr_foraging.rig -import aind_behavior_vr_foraging.task_logic from aind_behavior_services.session import AindBehaviorSessionModel from aind_behavior_services.utils import ( convert_pydantic_to_bonsai, @@ -10,6 +8,9 @@ snake_to_pascal_case, ) +import aind_behavior_vr_foraging.rig +import aind_behavior_vr_foraging.task_logic + SCHEMA_ROOT = Path("./src/DataSchemas/") EXTENSIONS_ROOT = Path("./src/Extensions/") NAMESPACE_PREFIX = "AindVrForagingDataSchema" diff --git a/src/DataSchemas/aind_behavior_vr_foraging/rig.py b/src/DataSchemas/aind_behavior_vr_foraging/rig.py index 1c45c4ee..6593b2f5 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging/rig.py +++ b/src/DataSchemas/aind_behavior_vr_foraging/rig.py @@ -2,12 +2,13 @@ from __future__ import annotations # Import core types -from typing import Annotated, List, Literal, Optional +from typing import List, Literal, Optional import aind_behavior_services.calibration.olfactometer as oc import aind_behavior_services.calibration.water_valve as wvc import aind_behavior_services.rig as rig from aind_behavior_services.calibration import aind_manipulator +from aind_behavior_services.calibration.treadmill import Treadmill from aind_behavior_services.rig import ( AindBehaviorRigModel, HarpAnalogInput, @@ -15,26 +16,10 @@ HarpClockGenerator, HarpLickometer, HarpSniffDetector, - Screen, ) from pydantic import BaseModel, Field -__version__ = "0.3.0" - - -ValuePair = Annotated[List[float], Field(min_length=2, max_length=2, description="A tuple of two values")] - - -class Treadmill(rig.Treadmill): - """Overrides the default settings for the treadmill calibration by spec'ing brake_lookup_calibration field""" - - brake_lookup_calibration: List[ValuePair] = Field( - default=[[0, 0], [1, 65535]], - validate_default=True, - min_length=2, - description="Brake lookup calibration. Each Tuple is (0-1 (percent), 0-full-scale). \ - Values are linearly interpolated", - ) +__version__ = "0.4.0" class AindManipulatorAdditionalSettings(BaseModel): @@ -51,16 +36,10 @@ class AindManipulatorDevice(aind_manipulator.AindManipulatorDevice): ) -class HarpTreadmill(rig.HarpTreadmill): - """Overrides the default settings for the treadmill calibration""" - - calibration: Treadmill = Field(Treadmill(), description="Treadmill calibration settings", validate_default=True) - - class HarpOlfactometer(rig.HarpOlfactometer): """Overrides the default settings for the olfactometer calibration""" - calibration: Optional[oc.OlfactometerCalibration] = Field(default=None, description="Olfactometer calibration") + calibration: oc.OlfactometerCalibration = Field(default=None, description="Olfactometer calibration") class RigCalibration(BaseModel): @@ -83,8 +62,9 @@ class AindVrForagingRig(AindBehaviorRigModel): harp_clock_generator: HarpClockGenerator = Field(..., description="Harp clock generator") harp_clock_repeaters: List[HarpClockGenerator] = Field(default=[], description="Harp clock repeaters") harp_analog_input: Optional[HarpAnalogInput] = Field(default=None, description="Harp analog input") - harp_treadmill: HarpTreadmill = Field(..., description="Harp treadmill") - harp_sniff_detector: Optional[HarpSniffDetector] = Field(None, description="Sniff detector settings") + harp_treadmill: Treadmill = Field(..., description="Harp treadmill") + harp_sniff_detector: Optional[HarpSniffDetector] = Field(default=None, description="Sniff detector settings") + harp_environment_sensor: Optional[rig.HarpEnvironmentSensor] = Field(default=None, description="Environment sensor") manipulator: AindManipulatorDevice = Field(..., description="Manipulator") - screen: rig.Screen = Field(default=Screen(), description="Screen settings") + screen: rig.Screen = Field(default=rig.Screen(), description="Screen settings") calibration: RigCalibration = Field(..., description="Calibration models") diff --git a/src/DataSchemas/aind_behavior_vr_foraging/task_logic.py b/src/DataSchemas/aind_behavior_vr_foraging/task_logic.py index 4d39b1f3..4b3ce190 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging/task_logic.py +++ b/src/DataSchemas/aind_behavior_vr_foraging/task_logic.py @@ -1,13 +1,13 @@ from __future__ import annotations from enum import Enum -from typing import Annotated, Dict, List, Literal, Optional, Union +from typing import Annotated, Dict, List, Literal, Optional, Self, Union import aind_behavior_services.task_logic.distributions as distributions from aind_behavior_services.task_logic import AindBehaviorTaskLogicModel, TaskParameters -from pydantic import BaseModel, Field, NonNegativeFloat, RootModel +from pydantic import BaseModel, Field, NonNegativeFloat, RootModel, model_validator -__version__ = "0.4.0" +__version__ = "0.5.0" def scalar_value(value: float) -> distributions.Scalar: @@ -90,7 +90,7 @@ class OperantLogic(BaseModel): class PowerFunction(BaseModel): function_type: Literal["PowerFunction"] = "PowerFunction" - mininum: float = Field(default=0, description="Minimum value of the function") + minimum: float = Field(default=0, description="Minimum value of the function") maximum: float = Field(default=1, description="Maximum value of the function") a: float = Field(default=1, description="Coefficient a of the function: value = a * pow(b, c * x) + d") b: float = Field( @@ -102,7 +102,7 @@ class PowerFunction(BaseModel): class LinearFunction(BaseModel): function_type: Literal["LinearFunction"] = "LinearFunction" - mininum: float = Field(default=0, description="Minimum value of the function") + minimum: float = Field(default=0, description="Minimum value of the function") maximum: float = Field(default=9999, description="Maximum value of the function") a: float = Field(default=1, description="Coefficient a of the function: value = a * x + b") b: float = Field(default=0, description="Coefficient b of the function: value = a * x + b") @@ -113,14 +113,29 @@ class ConstantFunction(BaseModel): value: float = Field(default=1, description="Value of the function") +class LookupTableFunction(BaseModel): + function_type: Literal["LookupTableFunction"] = "LookupTableFunction" + lut_keys: List[float] = Field(..., description="List of keys of the lookup table", min_length=1) + lut_values: List[float] = Field(..., description="List of values of the lookup table", min_length=1) + + @model_validator(mode="after") + def _validate_lut(self) -> Self: + if len(self.lut_keys) != len(self.lut_values): + raise ValueError("The number of keys and values must be the same.") + return self + + class RewardFunction(RootModel): - root: Annotated[Union[ConstantFunction, LinearFunction, PowerFunction], Field(discriminator="function_type")] + root: Annotated[ + Union[ConstantFunction, LinearFunction, PowerFunction, LookupTableFunction], + Field(discriminator="function_type"), + ] class DepletionRule(str, Enum): - ON_REWARD = ("OnReward",) - ON_CHOICE = ("OnChoice",) - ON_TIME = ("OnTime",) + ON_REWARD = "OnReward" + ON_CHOICE = "OnChoice" + ON_TIME = "OnTime" ON_DISTANCE = "OnDistance" @@ -136,7 +151,7 @@ class PatchRewardFunction(BaseModel): validate_default=True, ) available: RewardFunction = Field( - default=LinearFunction(mininum=0, a=-1, b=5), + default=LinearFunction(minimum=0, a=-1, b=5), description="Determines the total amount of reward available left in the patch. The value is in microliters", validate_default=True, ) @@ -358,9 +373,63 @@ class TaskModeSettings(RootModel): root: Annotated[Union[HabituationSettings, ForagingSettings, DebugSettings], Field(discriminator="task_mode")] +class _BlockEndConditionBase(BaseModel): + condition_type: str + + +class BlockEndConditionDuration(_BlockEndConditionBase): + condition_type: Literal["Duration"] = "Duration" + value: distributions.Distribution = Field(..., description="Time after which the block ends.") + + +class BlockEndConditionDistance(_BlockEndConditionBase): + condition_type: Literal["Distance"] = "Distance" + value: distributions.Distribution = Field(..., description="Distance after which the block ends.") + + +class BlockEndConditionChoice(_BlockEndConditionBase): + condition_type: Literal["Choice"] = "Choice" + value: distributions.Distribution = Field(..., description="Number of choices after which the block ends.") + + +class BlockEndConditionReward(_BlockEndConditionBase): + condition_type: Literal["Reward"] = "Reward" + value: distributions.Distribution = Field(..., description="Number of rewards after which the block ends.") + + +class BlockEndConditionPatchCount(_BlockEndConditionBase): + condition_type: Literal["PatchCount"] = "PatchCount" + value: distributions.Distribution = Field(..., description="Number of patches after which the block will end.") + + +class BlockEndCondition(RootModel): + root: Annotated[ + Union[ + BlockEndConditionDuration, + BlockEndConditionDistance, + BlockEndConditionChoice, + BlockEndConditionReward, + BlockEndConditionPatchCount, + ], + Field(discriminator="condition_type"), + ] + + +class Block(BaseModel): + environment_statistics: EnvironmentStatistics = Field(..., description="Statistics of the environment") + end_conditions: List[BlockEndCondition] = Field( + [], description="List of end conditions that must be true for the block to end." + ) + + +class BlockStructure(BaseModel): + blocks: List[Block] = Field(..., description="Statistics of the environment", min_length=1) + sampling_mode: Literal["Random", "Sequential"] = Field("Sequential", description="Sampling mode of the blocks.") + + class AindVrForagingTaskParameters(TaskParameters): updaters: Dict[str, NumericalUpdater] = Field(default_factory=dict, description="List of numerical updaters") - environment_statistics: EnvironmentStatistics = Field(..., description="Statistics of the environment") + environment: BlockStructure = Field(..., description="Statistics of the environment") task_mode_settings: TaskModeSettings = Field( default=ForagingSettings(), description="Settings of the task stage", validate_default=True ) @@ -369,5 +438,5 @@ class AindVrForagingTaskParameters(TaskParameters): class AindVrForagingTaskLogic(AindBehaviorTaskLogicModel): version: Literal[__version__] = __version__ - name: str = Field(default="AindVrForaging", description="Name of the task logic", frozen=True) + name: Literal["AindVrForaging"] = Field(default="AindVrForaging", description="Name of the task logic", frozen=True) task_parameters: AindVrForagingTaskParameters = Field(..., description="Parameters of the task logic") diff --git a/src/DataSchemas/aind_vr_foraging_rig.json b/src/DataSchemas/aind_vr_foraging_rig.json index 72d4ccb7..22e2ecaf 100644 --- a/src/DataSchemas/aind_vr_foraging_rig.json +++ b/src/DataSchemas/aind_vr_foraging_rig.json @@ -4,11 +4,7 @@ "description": "Additional settings for the manipulator device", "properties": { "spout_axis": { - "allOf": [ - { - "$ref": "#/definitions/Axis" - } - ], + "$ref": "#/definitions/Axis", "default": 2, "description": "Spout axis" } @@ -26,19 +22,11 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/definitions/AindManipulatorCalibrationInput" - } - ], + "$ref": "#/definitions/AindManipulatorCalibrationInput", "title": "Input of the calibration" }, "output": { - "allOf": [ - { - "$ref": "#/definitions/AindManipulatorCalibrationOutput" - } - ], + "$ref": "#/definitions/AindManipulatorCalibrationOutput", "title": "Output of the calibration." }, "date": { @@ -83,11 +71,7 @@ "AindManipulatorCalibrationInput": { "properties": { "full_step_to_mm": { - "allOf": [ - { - "$ref": "#/definitions/ManipulatorPosition" - } - ], + "$ref": "#/definitions/ManipulatorPosition", "default": { "x": 0.01, "y1": 0.01, @@ -159,11 +143,7 @@ "type": "array" }, "initial_position": { - "allOf": [ - { - "$ref": "#/definitions/ManipulatorPosition" - } - ], + "$ref": "#/definitions/ManipulatorPosition", "default": { "x": 0.0, "y1": 0.0, @@ -190,11 +170,7 @@ "type": "string" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/definitions/AindManipulatorAdditionalSettings" - } - ], + "$ref": "#/definitions/AindManipulatorAdditionalSettings", "default": { "spout_axis": 2 }, @@ -266,11 +242,7 @@ "description": "Axis configuration", "properties": { "axis": { - "allOf": [ - { - "$ref": "#/definitions/Axis" - } - ], + "$ref": "#/definitions/Axis", "title": "Axis to be configured" }, "step_acceleration_interval": { @@ -290,11 +262,7 @@ "type": "integer" }, "microstep_resolution": { - "allOf": [ - { - "$ref": "#/definitions/MicrostepResolution" - } - ], + "$ref": "#/definitions/MicrostepResolution", "default": 0, "title": "Microstep resolution" }, @@ -306,11 +274,7 @@ "type": "integer" }, "motor_operation_mode": { - "allOf": [ - { - "$ref": "#/definitions/MotorOperationMode" - } - ], + "$ref": "#/definitions/MotorOperationMode", "default": 0, "title": "Motor operation mode" }, @@ -458,6 +422,202 @@ "title": "CameraController[WebCamera]", "type": "object" }, + "ConnectedClockOutput": { + "properties": { + "target_device": { + "default": null, + "description": "Optional device name to provide user additional information", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Target Device" + }, + "output_channel": { + "description": "Output channel", + "minimum": 0, + "title": "Output Channel", + "type": "integer" + } + }, + "required": [ + "output_channel" + ], + "title": "ConnectedClockOutput", + "type": "object" + }, + "DisplayCalibration": { + "properties": { + "intrinsics": { + "$ref": "#/definitions/DisplayIntrinsics", + "default": { + "frame_width": 1920, + "frame_height": 1080, + "display_width": 20.0, + "display_height": 15.0 + }, + "description": "Intrinsics" + }, + "extrinsics": { + "$ref": "#/definitions/DisplayExtrinsics", + "default": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "translation": { + "x": 0.0, + "y": 1.309016, + "z": -13.27 + } + }, + "description": "Extrinsics" + } + }, + "title": "DisplayCalibration", + "type": "object" + }, + "DisplayExtrinsics": { + "properties": { + "rotation": { + "$ref": "#/definitions/Vector3", + "default": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "description": "Rotation vector (radians)" + }, + "translation": { + "$ref": "#/definitions/Vector3", + "default": { + "x": 0.0, + "y": 1.309016, + "z": -13.27 + }, + "description": "Translation (in cm)" + } + }, + "title": "DisplayExtrinsics", + "type": "object" + }, + "DisplayIntrinsics": { + "properties": { + "frame_width": { + "default": 1920, + "description": "Frame width (px)", + "minimum": 0, + "title": "Frame Width", + "type": "integer" + }, + "frame_height": { + "default": 1080, + "description": "Frame height (px)", + "minimum": 0, + "title": "Frame Height", + "type": "integer" + }, + "display_width": { + "default": 20, + "description": "Display width (cm)", + "minimum": 0.0, + "title": "Display Width", + "type": "number" + }, + "display_height": { + "default": 15, + "description": "Display width (cm)", + "minimum": 0.0, + "title": "Display Height", + "type": "number" + } + }, + "title": "DisplayIntrinsics", + "type": "object" + }, + "DisplaysCalibration": { + "properties": { + "left": { + "$ref": "#/definitions/DisplayCalibration", + "default": { + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + }, + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 1.0472, + "z": 0.0 + }, + "translation": { + "x": -16.6917756, + "y": 1.309016, + "z": -3.575264 + } + } + }, + "description": "Left display calibration" + }, + "center": { + "$ref": "#/definitions/DisplayCalibration", + "default": { + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + }, + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "translation": { + "x": 0.0, + "y": 1.309016, + "z": -13.27 + } + } + }, + "description": "Center display calibration" + }, + "right": { + "$ref": "#/definitions/DisplayCalibration", + "default": { + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + }, + "extrinsics": { + "rotation": { + "x": 0.0, + "y": -1.0472, + "z": 0.0 + }, + "translation": { + "x": 16.6917756, + "y": 1.309016, + "z": -3.575264 + } + } + }, + "description": "Right display calibration" + } + }, + "title": "DisplaysCalibration", + "type": "object" + }, "HarpAnalogInput": { "properties": { "device_type": { @@ -639,6 +799,15 @@ "description": "Device port name", "title": "Port Name", "type": "string" + }, + "connected_clock_outputs": { + "default": [], + "description": "Connected clock outputs", + "items": { + "$ref": "#/definitions/ConnectedClockOutput" + }, + "title": "Connected Clock Outputs", + "type": "array" } }, "required": [ @@ -647,11 +816,11 @@ "title": "HarpClockGenerator", "type": "object" }, - "HarpLickometer": { + "HarpEnvironmentSensor": { "properties": { "device_type": { - "const": "lickometer", - "default": "lickometer", + "const": "environmentsensor", + "default": "environmentsensor", "title": "Device Type", "type": "string" }, @@ -680,8 +849,8 @@ ] }, "who_am_i": { - "const": 1400, - "default": 1400, + "const": 1405, + "default": 1405, "title": "Who Am I", "type": "integer" }, @@ -707,15 +876,14 @@ "required": [ "port_name" ], - "title": "HarpLickometer", + "title": "HarpEnvironmentSensor", "type": "object" }, - "HarpOlfactometer": { - "description": "Overrides the default settings for the olfactometer calibration", + "HarpLickometer": { "properties": { "device_type": { - "const": "olfactometer", - "default": "olfactometer", + "const": "lickometer", + "default": "lickometer", "title": "Device Type", "type": "string" }, @@ -733,10 +901,10 @@ }, "calibration": { "default": null, - "description": "Olfactometer calibration", + "description": "Calibration", "oneOf": [ { - "$ref": "#/definitions/OlfactometerCalibration" + "$ref": "#/definitions/BaseModel" }, { "type": "null" @@ -744,8 +912,8 @@ ] }, "who_am_i": { - "const": 1140, - "default": 1140, + "const": 1400, + "default": 1400, "title": "Who Am I", "type": "integer" }, @@ -771,14 +939,15 @@ "required": [ "port_name" ], - "title": "HarpOlfactometer", + "title": "HarpLickometer", "type": "object" }, - "HarpSniffDetector": { + "HarpOlfactometer": { + "description": "Overrides the default settings for the olfactometer calibration", "properties": { "device_type": { - "const": "sniffdetector", - "default": "sniffdetector", + "const": "olfactometer", + "default": "olfactometer", "title": "Device Type", "type": "string" }, @@ -795,20 +964,13 @@ ] }, "calibration": { + "$ref": "#/definitions/OlfactometerCalibration", "default": null, - "description": "Calibration", - "oneOf": [ - { - "$ref": "#/definitions/BaseModel" - }, - { - "type": "null" - } - ] + "description": "Olfactometer calibration" }, "who_am_i": { - "const": 1401, - "default": 1401, + "const": 1140, + "default": 1140, "title": "Who Am I", "type": "integer" }, @@ -834,15 +996,14 @@ "required": [ "port_name" ], - "title": "HarpSniffDetector", + "title": "HarpOlfactometer", "type": "object" }, - "HarpTreadmill": { - "description": "Overrides the default settings for the treadmill calibration", + "HarpSniffDetector": { "properties": { "device_type": { - "const": "treadmill", - "default": "treadmill", + "const": "sniffdetector", + "default": "sniffdetector", "title": "Device Type", "type": "string" }, @@ -859,31 +1020,20 @@ ] }, "calibration": { - "allOf": [ + "default": null, + "description": "Calibration", + "oneOf": [ { - "$ref": "#/definitions/Treadmill" + "$ref": "#/definitions/BaseModel" + }, + { + "type": "null" } - ], - "default": { - "wheel_diameter": 15.0, - "pulses_per_revolution": 28800, - "invert_direction": false, - "brake_lookup_calibration": [ - [ - 0.0, - 0.0 - ], - [ - 1.0, - 65535.0 - ] - ] - }, - "description": "Treadmill calibration settings" + ] }, "who_am_i": { - "const": 1402, - "default": 1402, + "const": 1401, + "default": 1401, "title": "Who Am I", "type": "integer" }, @@ -909,7 +1059,7 @@ "required": [ "port_name" ], - "title": "HarpTreadmill", + "title": "HarpSniffDetector", "type": "object" }, "ManipulatorPosition": { @@ -1019,19 +1169,11 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/definitions/OlfactometerCalibrationInput" - } - ], + "$ref": "#/definitions/OlfactometerCalibrationInput", "title": "Input of the calibration" }, "output": { - "allOf": [ - { - "$ref": "#/definitions/OlfactometerCalibrationOutput" - } - ], + "$ref": "#/definitions/OlfactometerCalibrationOutput", "title": "Output of the calibration" }, "date": { @@ -1081,6 +1223,9 @@ }, "default": {}, "description": "Configuration of olfactometer channels", + "propertyNames": { + "$ref": "#/definitions/OlfactometerChannel" + }, "title": "Channel Config", "type": "object" } @@ -1093,6 +1238,23 @@ "title": "OlfactometerCalibrationOutput", "type": "object" }, + "OlfactometerChannel": { + "description": "Harp Olfactometer available channel", + "enum": [ + 0, + 1, + 2, + 3 + ], + "title": "OlfactometerChannel", + "type": "integer", + "x-enumNames": [ + "Channel0", + "Channel1", + "Channel2", + "Channel3" + ] + }, "OlfactometerChannelConfig": { "properties": { "channel_index": { @@ -1100,11 +1262,7 @@ "type": "integer" }, "channel_type": { - "allOf": [ - { - "$ref": "#/definitions/OlfactometerChannelType" - } - ], + "$ref": "#/definitions/OlfactometerChannelType", "default": "Odor", "title": "Channel type" }, @@ -1163,15 +1321,45 @@ "title": "OlfactometerChannelType", "type": "string" }, + "Rect": { + "properties": { + "x": { + "default": 0, + "description": "X coordinate of the top-left corner", + "minimum": 0, + "title": "X", + "type": "integer" + }, + "y": { + "default": 0, + "description": "Y coordinate of the top-left corner", + "minimum": 0, + "title": "Y", + "type": "integer" + }, + "width": { + "default": 0, + "description": "Width of the rectangle", + "minimum": 0, + "title": "Width", + "type": "integer" + }, + "height": { + "default": 0, + "description": "Height of the rectangle", + "minimum": 0, + "title": "Height", + "type": "integer" + } + }, + "title": "Rect", + "type": "object" + }, "RigCalibration": { "description": "Container class for calibration models. In a future release these will be moved to the respective devices", "properties": { "water_valve": { - "allOf": [ - { - "$ref": "#/definitions/WaterValveCalibration" - } - ], + "$ref": "#/definitions/WaterValveCalibration", "description": "Water valve calibration" } }, @@ -1203,16 +1391,70 @@ ] }, "calibration": { - "default": null, - "description": "Calibration", - "oneOf": [ - { - "$ref": "#/definitions/BaseModel" + "$ref": "#/definitions/DisplaysCalibration", + "default": { + "left": { + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 1.0472, + "z": 0.0 + }, + "translation": { + "x": -16.6917756, + "y": 1.309016, + "z": -3.575264 + } + }, + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + } }, - { - "type": "null" + "center": { + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "translation": { + "x": 0.0, + "y": 1.309016, + "z": -13.27 + } + }, + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + } + }, + "right": { + "extrinsics": { + "rotation": { + "x": 0.0, + "y": -1.0472, + "z": 0.0 + }, + "translation": { + "x": 16.6917756, + "y": 1.309016, + "z": -3.575264 + } + }, + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + } } - ] + }, + "description": "Screen calibration" }, "display_index": { "default": 1, @@ -1232,12 +1474,6 @@ "title": "Target Update Frequency", "type": "number" }, - "calibration_directory": { - "default": "Calibration\\Monitors\\", - "description": "Calibration directory", - "title": "Calibration Directory", - "type": "string" - }, "texture_assets_directory": { "default": "Textures", "description": "Calibration directory", @@ -1333,6 +1569,54 @@ "title": "Gain", "type": "number" }, + "gamma": { + "default": null, + "description": "Gamma. If None, will disable gamma correction.", + "oneOf": [ + { + "minimum": 0.0, + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Gamma" + }, + "adc_bit_depth": { + "default": 0, + "description": "ADC bit depth. If None will be left as default.", + "oneOf": [ + { + "$ref": "#/definitions/SpinnakerCameraAdcBitDepth" + }, + { + "type": "null" + } + ] + }, + "pixel_format": { + "default": 0, + "description": "Pixel format. If None will be left as default.", + "oneOf": [ + { + "$ref": "#/definitions/SpinnakerCameraPixelFormat" + }, + { + "type": "null" + } + ] + }, + "region_of_interest": { + "$ref": "#/definitions/Rect", + "default": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "description": "Region of interest" + }, "video_writer": { "default": null, "description": "Video writer. If not provided, no video will be saved.", @@ -1352,8 +1636,441 @@ "title": "SpinnakerCamera", "type": "object" }, + "SpinnakerCameraAdcBitDepth": { + "enum": [ + 0, + 1, + 2 + ], + "title": "SpinnakerCameraAdcBitDepth", + "type": "integer", + "x-enumNames": [ + "Adc8bit", + "Adc10bit", + "Adc12bit" + ] + }, + "SpinnakerCameraPixelFormat": { + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143 + ], + "title": "SpinnakerCameraPixelFormat", + "type": "integer", + "x-enumNames": [ + "Mono8", + "Mono16", + "Rgb8packed", + "Bayergr8", + "Bayerrg8", + "Bayergb8", + "Bayerbg8", + "Bayergr16", + "Bayerrg16", + "Bayergb16", + "Bayerbg16", + "Mono12packed", + "Bayergr12packed", + "Bayerrg12packed", + "Bayergb12packed", + "Bayerbg12packed", + "Yuv411packed", + "Yuv422packed", + "Yuv444packed", + "Mono12p", + "Bayergr12p", + "Bayerrg12p", + "Bayergb12p", + "Bayerbg12p", + "Ycbcr8", + "Ycbcr4228", + "Ycbcr4118", + "Bgr8", + "Bgra8", + "Mono10packed", + "Bayergr10packed", + "Bayerrg10packed", + "Bayergb10packed", + "Bayerbg10packed", + "Mono10p", + "Bayergr10p", + "Bayerrg10p", + "Bayergb10p", + "Bayerbg10p", + "Mono1p", + "Mono2p", + "Mono4p", + "Mono8s", + "Mono10", + "Mono12", + "Mono14", + "Mono16s", + "Mono32f", + "Bayerbg10", + "Bayerbg12", + "Bayergb10", + "Bayergb12", + "Bayergr10", + "Bayergr12", + "Bayerrg10", + "Bayerrg12", + "Rgba8", + "Rgba10", + "Rgba10p", + "Rgba12", + "Rgba12p", + "Rgba14", + "Rgba16", + "Rgb8", + "Rgb8Planar", + "Rgb10", + "Rgb10Planar", + "Rgb10p", + "Rgb10p32", + "Rgb12", + "Rgb12Planar", + "Rgb12p", + "Rgb14", + "Rgb16", + "Rgb16s", + "Rgb32f", + "Rgb16Planar", + "Rgb565p", + "Bgra10", + "Bgra10p", + "Bgra12", + "Bgra12p", + "Bgra14", + "Bgra16", + "Rgba32f", + "Bgr10", + "Bgr10p", + "Bgr12", + "Bgr12p", + "Bgr14", + "Bgr16", + "Bgr565p", + "R8", + "R10", + "R12", + "R16", + "G8", + "G10", + "G12", + "G16", + "B8", + "B10", + "B12", + "B16", + "Coord3dAbc8", + "Coord3dAbc8Planar", + "Coord3dAbc10p", + "Coord3dAbc10pPlanar", + "Coord3dAbc12p", + "Coord3dAbc12pPlanar", + "Coord3dAbc16", + "Coord3dAbc16Planar", + "Coord3dAbc32f", + "Coord3dAbc32fPlanar", + "Coord3dAc8", + "Coord3dAc8Planar", + "Coord3dAc10p", + "Coord3dAc10pPlanar", + "Coord3dAc12p", + "Coord3dAc12pPlanar", + "Coord3dAc16", + "Coord3dAc16Planar", + "Coord3dAc32f", + "Coord3dAc32fPlanar", + "Coord3dA8", + "Coord3dA10p", + "Coord3dA12p", + "Coord3dA16", + "Coord3dA32f", + "Coord3dB8", + "Coord3dB10p", + "Coord3dB12p", + "Coord3dB16", + "Coord3dB32f", + "Coord3dC8", + "Coord3dC10p", + "Coord3dC12p", + "Coord3dC16", + "Coord3dC32f", + "Confidence1", + "Confidence1p", + "Confidence8", + "Confidence16", + "Confidence32f" + ] + }, "Treadmill": { - "description": "Overrides the default settings for the treadmill calibration by spec'ing brake_lookup_calibration field", + "properties": { + "device_type": { + "const": "treadmill", + "default": "treadmill", + "title": "Device Type", + "type": "string" + }, + "additional_settings": { + "default": null, + "description": "Additional settings", + "oneOf": [ + { + "$ref": "#/definitions/BaseModel" + }, + { + "type": "null" + } + ] + }, + "calibration": { + "default": null, + "oneOf": [ + { + "$ref": "#/definitions/TreadmillCalibration" + }, + { + "type": "null" + } + ], + "title": "Calibration of the treadmill" + }, + "who_am_i": { + "const": 1402, + "default": 1402, + "title": "Who Am I", + "type": "integer" + }, + "serial_number": { + "default": null, + "description": "Device serial number", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Serial Number" + }, + "port_name": { + "description": "Device port name", + "title": "Port Name", + "type": "string" + } + }, + "required": [ + "port_name" + ], + "title": "Treadmill", + "type": "object" + }, + "TreadmillCalibration": { + "description": "Treadmill calibration class", + "properties": { + "device_name": { + "default": "Treadmill", + "description": "Must match a device name in rig/instrument", + "title": "Device name", + "type": "string" + }, + "input": { + "$ref": "#/definitions/TreadmillCalibrationInput", + "title": "Input of the calibration" + }, + "output": { + "$ref": "#/definitions/TreadmillCalibrationOutput", + "title": "Output of the calibration." + }, + "date": { + "default": null, + "oneOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Date" + }, + "description": { + "const": "Calibration of the treadmill system", + "default": "Calibration of the treadmill system", + "title": "Description", + "type": "string" + }, + "notes": { + "default": null, + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Notes" + } + }, + "required": [ + "input", + "output" + ], + "title": "TreadmillCalibration", + "type": "object" + }, + "TreadmillCalibrationInput": { + "properties": {}, + "title": "TreadmillCalibrationInput", + "type": "object" + }, + "TreadmillCalibrationOutput": { "properties": { "wheel_diameter": { "default": 15, @@ -1376,19 +2093,8 @@ "type": "boolean" }, "brake_lookup_calibration": { - "default": [ - [ - 0, - 0 - ], - [ - 1, - 65535 - ] - ], - "description": "Brake lookup calibration. Each Tuple is (0-1 (percent), 0-full-scale). Values are linearly interpolated", + "description": "Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16])", "items": { - "description": "A tuple of two values", "items": { "type": "number" }, @@ -1401,7 +2107,34 @@ "type": "array" } }, - "title": "Treadmill", + "required": [ + "brake_lookup_calibration" + ], + "title": "TreadmillCalibrationOutput", + "type": "object" + }, + "Vector3": { + "properties": { + "x": { + "default": 0, + "description": "X coordinate of the point", + "title": "X", + "type": "number" + }, + "y": { + "default": 0, + "description": "Y coordinate of the point", + "title": "Y", + "type": "number" + }, + "z": { + "default": 0, + "description": "Z coordinate of the point", + "title": "Z", + "type": "number" + } + }, + "title": "Vector3", "type": "object" }, "VideoWriter": { @@ -1419,8 +2152,7 @@ { "$ref": "#/definitions/VideoWriterOpenCv" } - ], - "title": "VideoWriter" + ] }, "VideoWriterFfmpeg": { "properties": { @@ -1444,10 +2176,16 @@ "type": "string" }, "output_arguments": { - "default": "-c:v hevc_nvenc -pix_fmt x2rgb10le -color_range full -tune hq -preset p3 -rc vbr -cq 16 -rc-lookahead 56 -temporal-aq 1 -qmin 0 -qmax 10", + "default": "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M", "description": "Output arguments", "title": "Output Arguments", "type": "string" + }, + "input_arguments": { + "default": "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear", + "description": "Input arguments", + "title": "Input Arguments", + "type": "string" } }, "title": "VideoWriterFfmpeg", @@ -1494,19 +2232,11 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/definitions/WaterValveCalibrationInput" - } - ], + "$ref": "#/definitions/WaterValveCalibrationInput", "title": "Input of the calibration" }, "output": { - "allOf": [ - { - "$ref": "#/definitions/WaterValveCalibrationOutput" - } - ], + "$ref": "#/definitions/WaterValveCalibrationOutput", "title": "Output of the calibration." }, "date": { @@ -1692,9 +2422,15 @@ } }, "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.9.0", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, "version": { - "const": "0.3.0", - "default": "0.3.0", + "const": "0.4.0", + "default": "0.4.0", "title": "Version", "type": "string" }, @@ -1709,11 +2445,7 @@ "type": "string" }, "triggered_camera_controller": { - "allOf": [ - { - "$ref": "#/definitions/CameraController_SpinnakerCamera_" - } - ], + "$ref": "#/definitions/CameraController_SpinnakerCamera_", "description": "Required camera controller to triggered cameras." }, "monitoring_camera_controller": { @@ -1729,35 +2461,19 @@ ] }, "harp_behavior": { - "allOf": [ - { - "$ref": "#/definitions/HarpBehavior" - } - ], + "$ref": "#/definitions/HarpBehavior", "description": "Harp behavior" }, "harp_olfactometer": { - "allOf": [ - { - "$ref": "#/definitions/HarpOlfactometer" - } - ], + "$ref": "#/definitions/HarpOlfactometer", "description": "Harp olfactometer" }, "harp_lickometer": { - "allOf": [ - { - "$ref": "#/definitions/HarpLickometer" - } - ], + "$ref": "#/definitions/HarpLickometer", "description": "Harp lickometer" }, "harp_clock_generator": { - "allOf": [ - { - "$ref": "#/definitions/HarpClockGenerator" - } - ], + "$ref": "#/definitions/HarpClockGenerator", "description": "Harp clock generator" }, "harp_clock_repeaters": { @@ -1782,11 +2498,7 @@ ] }, "harp_treadmill": { - "allOf": [ - { - "$ref": "#/definitions/HarpTreadmill" - } - ], + "$ref": "#/definitions/Treadmill", "description": "Harp treadmill" }, "harp_sniff_detector": { @@ -1801,28 +2513,92 @@ } ] }, - "manipulator": { - "allOf": [ + "harp_environment_sensor": { + "default": null, + "description": "Environment sensor", + "oneOf": [ + { + "$ref": "#/definitions/HarpEnvironmentSensor" + }, { - "$ref": "#/definitions/AindManipulatorDevice" + "type": "null" } - ], + ] + }, + "manipulator": { + "$ref": "#/definitions/AindManipulatorDevice", "description": "Manipulator" }, "screen": { - "allOf": [ - { - "$ref": "#/definitions/Screen" - } - ], + "$ref": "#/definitions/Screen", "default": { "device_type": "Screen", "additional_settings": null, - "calibration": null, + "calibration": { + "center": { + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "translation": { + "x": 0.0, + "y": 1.309016, + "z": -13.27 + } + }, + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + } + }, + "left": { + "extrinsics": { + "rotation": { + "x": 0.0, + "y": 1.0472, + "z": 0.0 + }, + "translation": { + "x": -16.6917756, + "y": 1.309016, + "z": -3.575264 + } + }, + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + } + }, + "right": { + "extrinsics": { + "rotation": { + "x": 0.0, + "y": -1.0472, + "z": 0.0 + }, + "translation": { + "x": 16.6917756, + "y": 1.309016, + "z": -3.575264 + } + }, + "intrinsics": { + "display_height": 15.0, + "display_width": 20.0, + "frame_height": 1080, + "frame_width": 1920 + } + } + }, "display_index": 1, "target_render_frequency": 60.0, "target_update_frequency": 120.0, - "calibration_directory": "Calibration\\Monitors\\", "texture_assets_directory": "Textures", "brightness": 0.0, "contrast": 1.0 @@ -1830,11 +2606,7 @@ "description": "Screen settings" }, "calibration": { - "allOf": [ - { - "$ref": "#/definitions/RigCalibration" - } - ], + "$ref": "#/definitions/RigCalibration", "description": "Calibration models" } }, diff --git a/src/DataSchemas/aind_vr_foraging_task_logic.json b/src/DataSchemas/aind_vr_foraging_task_logic.json index c17260e2..4afd5486 100644 --- a/src/DataSchemas/aind_vr_foraging_task_logic.json +++ b/src/DataSchemas/aind_vr_foraging_task_logic.json @@ -16,6 +16,12 @@ ], "title": "Rng Seed" }, + "aind_behavior_services_pkg_version": { + "default": "0.9.0", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", + "title": "aind_behavior_services package version", + "type": "string" + }, "updaters": { "additionalProperties": { "$ref": "#/definitions/NumericalUpdater" @@ -24,36 +30,24 @@ "title": "Updaters", "type": "object" }, - "environment_statistics": { - "allOf": [ - { - "$ref": "#/definitions/EnvironmentStatistics" - } - ], + "environment": { + "$ref": "#/definitions/BlockStructure", "description": "Statistics of the environment" }, "task_mode_settings": { - "allOf": [ - { - "$ref": "#/definitions/TaskModeSettings" - } - ], + "$ref": "#/definitions/TaskModeSettings", "default": { "task_mode": "FORAGING" }, "description": "Settings of the task stage" }, "operation_control": { - "allOf": [ - { - "$ref": "#/definitions/OperationControl" - } - ], + "$ref": "#/definitions/OperationControl", "description": "Control of the operation" } }, "required": [ - "environment_statistics", + "environment", "operation_control" ], "title": "AindVrForagingTaskParameters", @@ -88,11 +82,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/BetaDistributionParameters" - } - ], + "$ref": "#/definitions/BetaDistributionParameters", "default": { "family": "Beta", "alpha": 5.0, @@ -163,11 +153,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/BinomialDistributionParameters" - } - ], + "$ref": "#/definitions/BinomialDistributionParameters", "default": { "family": "Binomial", "n": 1, @@ -230,6 +216,181 @@ "title": "BinomialDistributionParameters", "type": "object" }, + "Block": { + "properties": { + "environment_statistics": { + "$ref": "#/definitions/EnvironmentStatistics", + "description": "Statistics of the environment" + }, + "end_conditions": { + "default": [], + "description": "List of end conditions that must be true for the block to end.", + "items": { + "$ref": "#/definitions/BlockEndCondition" + }, + "title": "End Conditions", + "type": "array" + } + }, + "required": [ + "environment_statistics" + ], + "title": "Block", + "type": "object" + }, + "BlockEndCondition": { + "discriminator": { + "mapping": { + "Choice": "#/definitions/BlockEndConditionChoice", + "Distance": "#/definitions/BlockEndConditionDistance", + "Duration": "#/definitions/BlockEndConditionDuration", + "PatchCount": "#/definitions/BlockEndConditionPatchCount", + "Reward": "#/definitions/BlockEndConditionReward" + }, + "propertyName": "condition_type" + }, + "oneOf": [ + { + "$ref": "#/definitions/BlockEndConditionDuration" + }, + { + "$ref": "#/definitions/BlockEndConditionDistance" + }, + { + "$ref": "#/definitions/BlockEndConditionChoice" + }, + { + "$ref": "#/definitions/BlockEndConditionReward" + }, + { + "$ref": "#/definitions/BlockEndConditionPatchCount" + } + ], + "title": "BlockEndCondition" + }, + "BlockEndConditionChoice": { + "properties": { + "condition_type": { + "const": "Choice", + "default": "Choice", + "title": "Condition Type", + "type": "string" + }, + "value": { + "$ref": "#/definitions/Distribution", + "description": "Number of choices after which the block ends." + } + }, + "required": [ + "value" + ], + "title": "BlockEndConditionChoice", + "type": "object" + }, + "BlockEndConditionDistance": { + "properties": { + "condition_type": { + "const": "Distance", + "default": "Distance", + "title": "Condition Type", + "type": "string" + }, + "value": { + "$ref": "#/definitions/Distribution", + "description": "Distance after which the block ends." + } + }, + "required": [ + "value" + ], + "title": "BlockEndConditionDistance", + "type": "object" + }, + "BlockEndConditionDuration": { + "properties": { + "condition_type": { + "const": "Duration", + "default": "Duration", + "title": "Condition Type", + "type": "string" + }, + "value": { + "$ref": "#/definitions/Distribution", + "description": "Time after which the block ends." + } + }, + "required": [ + "value" + ], + "title": "BlockEndConditionDuration", + "type": "object" + }, + "BlockEndConditionPatchCount": { + "properties": { + "condition_type": { + "const": "PatchCount", + "default": "PatchCount", + "title": "Condition Type", + "type": "string" + }, + "value": { + "$ref": "#/definitions/Distribution", + "description": "Number of patches after which the block will end." + } + }, + "required": [ + "value" + ], + "title": "BlockEndConditionPatchCount", + "type": "object" + }, + "BlockEndConditionReward": { + "properties": { + "condition_type": { + "const": "Reward", + "default": "Reward", + "title": "Condition Type", + "type": "string" + }, + "value": { + "$ref": "#/definitions/Distribution", + "description": "Number of rewards after which the block ends." + } + }, + "required": [ + "value" + ], + "title": "BlockEndConditionReward", + "type": "object" + }, + "BlockStructure": { + "properties": { + "blocks": { + "description": "Statistics of the environment", + "items": { + "$ref": "#/definitions/Block" + }, + "minItems": 1, + "title": "Blocks", + "type": "array" + }, + "sampling_mode": { + "default": "Sequential", + "description": "Sampling mode of the blocks.", + "enum": [ + "Random", + "Sequential" + ], + "title": "Sampling Mode", + "type": "string" + } + }, + "required": [ + "blocks" + ], + "title": "BlockStructure", + "type": "object" + }, "ConstantFunction": { "properties": { "function_type": { @@ -290,7 +451,6 @@ "type": "string" }, "Distribution": { - "description": "Available distributions", "discriminator": { "mapping": { "Beta": "#/definitions/BetaDistribution", @@ -299,6 +459,7 @@ "Gamma": "#/definitions/GammaDistribution", "LogNormal": "#/definitions/LogNormalDistribution", "Normal": "#/definitions/NormalDistribution", + "Pdf": "#/definitions/PdfDistribution", "Poisson": "#/definitions/PoissonDistribution", "Scalar": "#/definitions/Scalar", "Uniform": "#/definitions/UniformDistribution" @@ -332,9 +493,11 @@ }, { "$ref": "#/definitions/GammaDistribution" + }, + { + "$ref": "#/definitions/PdfDistribution" } - ], - "title": "Distribution" + ] }, "EnvironmentStatistics": { "properties": { @@ -394,11 +557,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/ExponentialDistributionParameters" - } - ], + "$ref": "#/definitions/ExponentialDistributionParameters", "default": { "family": "Exponential", "rate": 0.0 @@ -473,11 +632,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/GammaDistributionParameters" - } - ], + "$ref": "#/definitions/GammaDistributionParameters", "default": { "family": "Gamma", "shape": 1.0, @@ -548,19 +703,11 @@ "type": "string" }, "distance_to_reward": { - "allOf": [ - { - "$ref": "#/definitions/Distribution" - } - ], + "$ref": "#/definitions/Distribution", "description": "Distance (cm) to the reward" }, "render_specification": { - "allOf": [ - { - "$ref": "#/definitions/RenderSpecification" - } - ], + "$ref": "#/definitions/RenderSpecification", "default": { "contrast": null }, @@ -581,10 +728,10 @@ "title": "Function Type", "type": "string" }, - "mininum": { + "minimum": { "default": 0, "description": "Minimum value of the function", - "title": "Mininum", + "title": "Minimum", "type": "number" }, "maximum": { @@ -618,11 +765,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/LogNormalDistributionParameters" - } - ], + "$ref": "#/definitions/LogNormalDistributionParameters", "default": { "family": "LogNormal", "mean": 0.0, @@ -682,6 +825,40 @@ "title": "LogNormalDistributionParameters", "type": "object" }, + "LookupTableFunction": { + "properties": { + "function_type": { + "const": "LookupTableFunction", + "default": "LookupTableFunction", + "title": "Function Type", + "type": "string" + }, + "lut_keys": { + "description": "List of keys of the lookup table", + "items": { + "type": "number" + }, + "minItems": 1, + "title": "Lut Keys", + "type": "array" + }, + "lut_values": { + "description": "List of values of the lookup table", + "items": { + "type": "number" + }, + "minItems": 1, + "title": "Lut Values", + "type": "array" + } + }, + "required": [ + "lut_keys", + "lut_values" + ], + "title": "LookupTableFunction", + "type": "object" + }, "MovableSpoutControl": { "properties": { "enabled": { @@ -717,11 +894,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/NormalDistributionParameters" - } - ], + "$ref": "#/definitions/NormalDistributionParameters", "default": { "family": "Normal", "mean": 0.0, @@ -784,20 +957,12 @@ "NumericalUpdater": { "properties": { "operation": { - "allOf": [ - { - "$ref": "#/definitions/NumericalUpdaterOperation" - } - ], + "$ref": "#/definitions/NumericalUpdaterOperation", "default": "None", "description": "Operation to perform on the parameter" }, "parameters": { - "allOf": [ - { - "$ref": "#/definitions/NumericalUpdaterParameters" - } - ], + "$ref": "#/definitions/NumericalUpdaterParameters", "default": { "initial_value": 0.0, "increment": 0.0, @@ -953,11 +1118,7 @@ "OperationControl": { "properties": { "movable_spout_control": { - "allOf": [ - { - "$ref": "#/definitions/MovableSpoutControl" - } - ], + "$ref": "#/definitions/MovableSpoutControl", "default": { "enabled": false, "time_to_collect_after_reward": 1.0, @@ -966,11 +1127,7 @@ "description": "Control of the movable spout" }, "odor_control": { - "allOf": [ - { - "$ref": "#/definitions/OdorControl" - } - ], + "$ref": "#/definitions/OdorControl", "default": { "valve_max_open_time": 10.0, "target_total_flow": 1000.0, @@ -980,11 +1137,7 @@ "description": "Control of the odor" }, "position_control": { - "allOf": [ - { - "$ref": "#/definitions/PositionControl" - } - ], + "$ref": "#/definitions/PositionControl", "default": { "gain": { "x": 1.0, @@ -1002,11 +1155,7 @@ "description": "Control of the position" }, "audio_control": { - "allOf": [ - { - "$ref": "#/definitions/AudioControl" - } - ], + "$ref": "#/definitions/AudioControl", "default": { "duration": 0.2, "frequency": 1000.0 @@ -1020,11 +1169,7 @@ "PatchRewardFunction": { "properties": { "amount": { - "allOf": [ - { - "$ref": "#/definitions/RewardFunction" - } - ], + "$ref": "#/definitions/RewardFunction", "default": { "function_type": "ConstantFunction", "value": 1.0 @@ -1032,11 +1177,7 @@ "description": "Determines the amount of reward to be delivered. The value is in microliters" }, "probability": { - "allOf": [ - { - "$ref": "#/definitions/RewardFunction" - } - ], + "$ref": "#/definitions/RewardFunction", "default": { "function_type": "ConstantFunction", "value": 1.0 @@ -1044,14 +1185,10 @@ "description": "Determines the probability that a reward will be delivered" }, "available": { - "allOf": [ - { - "$ref": "#/definitions/RewardFunction" - } - ], + "$ref": "#/definitions/RewardFunction", "default": { "function_type": "LinearFunction", - "mininum": 0.0, + "minimum": 0.0, "maximum": 9999.0, "a": -1.0, "b": 5.0 @@ -1059,11 +1196,7 @@ "description": "Determines the total amount of reward available left in the patch. The value is in microliters" }, "depletion_rule": { - "allOf": [ - { - "$ref": "#/definitions/DepletionRule" - } - ], + "$ref": "#/definitions/DepletionRule", "default": "OnChoice", "description": "Depletion" } @@ -1111,11 +1244,7 @@ ] }, "virtual_site_generation": { - "allOf": [ - { - "$ref": "#/definitions/VirtualSiteGeneration" - } - ], + "$ref": "#/definitions/VirtualSiteGeneration", "default": { "inter_site": { "label": "InterSite", @@ -1173,20 +1302,100 @@ "title": "PatchStatistics", "type": "object" }, - "PoissonDistribution": { + "PdfDistribution": { "properties": { "family": { - "const": "Poisson", - "default": "Poisson", + "const": "Pdf", + "default": "Pdf", "title": "Family", "type": "string" }, "distribution_parameters": { - "allOf": [ + "$ref": "#/definitions/PdfDistributionParameters", + "default": { + "family": "Pdf", + "pdf": [ + 1.0 + ], + "index": [ + 0.0 + ] + }, + "description": "Parameters of the distribution" + }, + "truncation_parameters": { + "default": null, + "description": "Truncation parameters of the distribution", + "oneOf": [ + { + "$ref": "#/definitions/TruncationParameters" + }, + { + "type": "null" + } + ] + }, + "scaling_parameters": { + "default": null, + "description": "Scaling parameters of the distribution", + "oneOf": [ + { + "$ref": "#/definitions/ScalingParameters" + }, { - "$ref": "#/definitions/PoissonDistributionParameters" + "type": "null" } + ] + } + }, + "title": "PdfDistribution", + "type": "object" + }, + "PdfDistributionParameters": { + "properties": { + "family": { + "const": "Pdf", + "default": "Pdf", + "title": "Family", + "type": "string" + }, + "pdf": { + "default": [ + 1 + ], + "description": "The probability density function", + "items": { + "minimum": 0.0, + "type": "number" + }, + "title": "Pdf", + "type": "array" + }, + "index": { + "default": [ + 0 ], + "description": "The index of the probability density function", + "items": { + "type": "number" + }, + "title": "Index", + "type": "array" + } + }, + "title": "PdfDistributionParameters", + "type": "object" + }, + "PoissonDistribution": { + "properties": { + "family": { + "const": "Poisson", + "default": "Poisson", + "title": "Family", + "type": "string" + }, + "distribution_parameters": { + "$ref": "#/definitions/PoissonDistributionParameters", "default": { "family": "Poisson", "rate": 1.0 @@ -1243,11 +1452,7 @@ "PositionControl": { "properties": { "gain": { - "allOf": [ - { - "$ref": "#/definitions/Vector3" - } - ], + "$ref": "#/definitions/Vector3", "default": { "x": 1.0, "y": 1.0, @@ -1256,11 +1461,7 @@ "description": "Gain of the position control." }, "initial_position": { - "allOf": [ - { - "$ref": "#/definitions/Vector3" - } - ], + "$ref": "#/definitions/Vector3", "default": { "x": 0.0, "y": 2.56, @@ -1295,10 +1496,10 @@ "title": "Function Type", "type": "string" }, - "mininum": { + "minimum": { "default": 0, "description": "Minimum value of the function", - "title": "Mininum", + "title": "Minimum", "type": "number" }, "maximum": { @@ -1361,6 +1562,7 @@ "mapping": { "ConstantFunction": "#/definitions/ConstantFunction", "LinearFunction": "#/definitions/LinearFunction", + "LookupTableFunction": "#/definitions/LookupTableFunction", "PowerFunction": "#/definitions/PowerFunction" }, "propertyName": "function_type" @@ -1374,6 +1576,9 @@ }, { "$ref": "#/definitions/PowerFunction" + }, + { + "$ref": "#/definitions/LookupTableFunction" } ], "title": "RewardFunction" @@ -1393,11 +1598,7 @@ ] }, "delay": { - "allOf": [ - { - "$ref": "#/definitions/Distribution" - } - ], + "$ref": "#/definitions/Distribution", "default": { "family": "Scalar", "distribution_parameters": { @@ -1410,11 +1611,7 @@ "description": "The optional distribution where the delay to reward will be drawn from" }, "reward_function": { - "allOf": [ - { - "$ref": "#/definitions/PatchRewardFunction" - } - ], + "$ref": "#/definitions/PatchRewardFunction", "default": { "amount": { "function_type": "ConstantFunction", @@ -1429,7 +1626,7 @@ "b": 5.0, "function_type": "LinearFunction", "maximum": 9999.0, - "mininum": 0.0 + "minimum": 0.0 }, "depletion_rule": "OnChoice" }, @@ -1448,11 +1645,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/ScalarDistributionParameter" - } - ], + "$ref": "#/definitions/ScalarDistributionParameter", "default": { "family": "Scalar", "value": 0.0 @@ -1560,11 +1753,7 @@ "type": "string" }, "size": { - "allOf": [ - { - "$ref": "#/definitions/Size" - } - ], + "$ref": "#/definitions/Size", "default": { "width": 40.0, "height": 40.0 @@ -1626,11 +1815,7 @@ "type": "string" }, "distribution_parameters": { - "allOf": [ - { - "$ref": "#/definitions/UniformDistributionParameters" - } - ], + "$ref": "#/definitions/UniformDistributionParameters", "default": { "family": "Uniform", "min": 0.0, @@ -1724,11 +1909,7 @@ "type": "integer" }, "label": { - "allOf": [ - { - "$ref": "#/definitions/VirtualSiteLabels" - } - ], + "$ref": "#/definitions/VirtualSiteLabels", "default": "Unspecified", "description": "Label of the virtual site" }, @@ -1770,11 +1951,7 @@ ] }, "render_specification": { - "allOf": [ - { - "$ref": "#/definitions/RenderSpecification" - } - ], + "$ref": "#/definitions/RenderSpecification", "default": { "contrast": null }, @@ -1799,11 +1976,7 @@ "VirtualSiteGeneration": { "properties": { "inter_site": { - "allOf": [ - { - "$ref": "#/definitions/VirtualSiteGenerator" - } - ], + "$ref": "#/definitions/VirtualSiteGenerator", "default": { "render_specification": { "contrast": null @@ -1823,11 +1996,7 @@ "description": "Generator of the inter-site virtual sites" }, "inter_patch": { - "allOf": [ - { - "$ref": "#/definitions/VirtualSiteGenerator" - } - ], + "$ref": "#/definitions/VirtualSiteGenerator", "default": { "render_specification": { "contrast": null @@ -1859,11 +2028,7 @@ ] }, "reward_site": { - "allOf": [ - { - "$ref": "#/definitions/VirtualSiteGenerator" - } - ], + "$ref": "#/definitions/VirtualSiteGenerator", "default": { "render_specification": { "contrast": null @@ -1889,31 +2054,19 @@ "VirtualSiteGenerator": { "properties": { "render_specification": { - "allOf": [ - { - "$ref": "#/definitions/RenderSpecification" - } - ], + "$ref": "#/definitions/RenderSpecification", "default": { "contrast": null }, "description": "Contrast of the environment" }, "label": { - "allOf": [ - { - "$ref": "#/definitions/VirtualSiteLabels" - } - ], + "$ref": "#/definitions/VirtualSiteLabels", "default": "Unspecified", "description": "Label of the virtual site" }, "length_distribution": { - "allOf": [ - { - "$ref": "#/definitions/Distribution" - } - ], + "$ref": "#/definitions/Distribution", "default": { "family": "Scalar", "distribution_parameters": { @@ -1962,11 +2115,7 @@ "type": "integer" }, "size": { - "allOf": [ - { - "$ref": "#/definitions/Size" - } - ], + "$ref": "#/definitions/Size", "default": { "width": 40.0, "height": 40.0 @@ -1988,11 +2137,7 @@ "type": "number" }, "textures": { - "allOf": [ - { - "$ref": "#/definitions/WallTextures" - } - ], + "$ref": "#/definitions/WallTextures", "description": "The textures of the corridor" } }, @@ -2005,35 +2150,19 @@ "WallTextures": { "properties": { "floor": { - "allOf": [ - { - "$ref": "#/definitions/Texture" - } - ], + "$ref": "#/definitions/Texture", "description": "The texture of the floor" }, "ceiling": { - "allOf": [ - { - "$ref": "#/definitions/Texture" - } - ], + "$ref": "#/definitions/Texture", "description": "The texture of the ceiling" }, "left": { - "allOf": [ - { - "$ref": "#/definitions/Texture" - } - ], + "$ref": "#/definitions/Texture", "description": "The texture of the left" }, "right": { - "allOf": [ - { - "$ref": "#/definitions/Texture" - } - ], + "$ref": "#/definitions/Texture", "description": "The texture of the right" } }, @@ -2050,6 +2179,7 @@ "additionalProperties": false, "properties": { "name": { + "const": "AindVrForaging", "default": "AindVrForaging", "description": "Name of the task logic", "title": "Name", @@ -2062,16 +2192,12 @@ "type": "string" }, "task_parameters": { - "allOf": [ - { - "$ref": "#/definitions/AindVrForagingTaskParameters" - } - ], + "$ref": "#/definitions/AindVrForagingTaskParameters", "description": "Parameters of the task logic" }, "version": { - "const": "0.4.0", - "default": "0.4.0", + "const": "0.5.0", + "default": "0.5.0", "title": "Version", "type": "string" }, diff --git a/src/Extensions.csproj b/src/Extensions.csproj index 24de266a..5a8efe51 100644 --- a/src/Extensions.csproj +++ b/src/Extensions.csproj @@ -1,15 +1,15 @@ - net472 + net48 true - + - + \ No newline at end of file diff --git a/src/Extensions/AindBehaviorSessionModel.cs b/src/Extensions/AindBehaviorSessionModel.cs index b756e0ed..cec51c14 100644 --- a/src/Extensions/AindBehaviorSessionModel.cs +++ b/src/Extensions/AindBehaviorSessionModel.cs @@ -15,7 +15,9 @@ namespace AindVrForagingDataSchema.Session public partial class AindBehaviorSessionModel { - private string _version = "0.2.0"; + private string _aindBehaviorServicesPkgVersion = "0.9.0"; + + private string _version = "0.3.0"; private string _experiment; @@ -25,7 +27,7 @@ public partial class AindBehaviorSessionModel private string _rootPath; - private string _remotePath; + private string _sessionName; private string _subject; @@ -45,12 +47,13 @@ public AindBehaviorSessionModel() protected AindBehaviorSessionModel(AindBehaviorSessionModel other) { + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; _version = other._version; _experiment = other._experiment; _experimenter = other._experimenter; _date = other._date; _rootPath = other._rootPath; - _remotePath = other._remotePath; + _sessionName = other._sessionName; _subject = other._subject; _experimentVersion = other._experimentVersion; _notes = other._notes; @@ -59,6 +62,19 @@ protected AindBehaviorSessionModel(AindBehaviorSessionModel other) _skipHardwareValidation = other._skipHardwareValidation; } + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + [Newtonsoft.Json.JsonPropertyAttribute("version")] public string Version { @@ -143,20 +159,19 @@ public string RootPath } /// - /// Remote path where data will be attempted to be copied to after experiment is done + /// Name of the session. This will be used to create a folder in the root path. /// - [Newtonsoft.Json.JsonPropertyAttribute("remote_path")] - [System.ComponentModel.DescriptionAttribute("Remote path where data will be attempted to be copied to after experiment is done" + - "")] - public string RemotePath + [Newtonsoft.Json.JsonPropertyAttribute("session_name")] + [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path.")] + public string SessionName { get { - return _remotePath; + return _sessionName; } set { - _remotePath = value; + _sessionName = value; } } @@ -274,12 +289,13 @@ public System.IObservable Process(System.IObs protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { + stringBuilder.Append("aind_behavior_services_pkg_version = " + _aindBehaviorServicesPkgVersion + ", "); stringBuilder.Append("version = " + _version + ", "); stringBuilder.Append("experiment = " + _experiment + ", "); stringBuilder.Append("experimenter = " + _experimenter + ", "); stringBuilder.Append("date = " + _date + ", "); stringBuilder.Append("root_path = " + _rootPath + ", "); - stringBuilder.Append("remote_path = " + _remotePath + ", "); + stringBuilder.Append("session_name = " + _sessionName + ", "); stringBuilder.Append("subject = " + _subject + ", "); stringBuilder.Append("experiment_version = " + _experimentVersion + ", "); stringBuilder.Append("notes = " + _notes + ", "); diff --git a/src/Extensions/AindManipulator.bonsai b/src/Extensions/AindManipulator.bonsai index 83daa890..c1fcbc24 100644 --- a/src/Extensions/AindManipulator.bonsai +++ b/src/Extensions/AindManipulator.bonsai @@ -2,7 +2,6 @@ @@ -22,11 +21,8 @@ COMx - - - - StartExperiment + TriggerHarpReadDump Write @@ -39,11 +35,6 @@ Enabled - - - 1 - - StepperDriverCommands @@ -54,8 +45,6 @@ - - \ No newline at end of file diff --git a/src/Extensions/AindVrForagingRig.cs b/src/Extensions/AindVrForagingRig.cs index df100a01..d50423cd 100644 --- a/src/Extensions/AindVrForagingRig.cs +++ b/src/Extensions/AindVrForagingRig.cs @@ -1125,149 +1125,159 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpAnalogInput + public partial class ConnectedClockOutput { - private string _deviceType = "analoginput"; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private int _whoAmI = 1236; - - private string _serialNumber; + private string _targetDevice; - private string _portName; + private int _outputChannel; - public HarpAnalogInput() + public ConnectedClockOutput() { } - protected HarpAnalogInput(HarpAnalogInput other) + protected ConnectedClockOutput(ConnectedClockOutput other) { - _deviceType = other._deviceType; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _targetDevice = other._targetDevice; + _outputChannel = other._outputChannel; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Optional device name to provide user additional information + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_device")] + [System.ComponentModel.DescriptionAttribute("Optional device name to provide user additional information")] + public string TargetDevice { get { - return _deviceType; + return _targetDevice; } set { - _deviceType = value; + _targetDevice = value; } } /// - /// Additional settings + /// Output channel /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Output channel")] + public int OutputChannel { get { - return _additionalSettings; + return _outputChannel; } set { - _additionalSettings = value; + _outputChannel = value; } } - /// - /// Calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + public System.IObservable Process() { - get - { - return _calibration; - } - set - { - _calibration = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + public System.IObservable Process(System.IObservable source) { - get - { - return _whoAmI; - } - set + return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("target_device = " + _targetDevice + ", "); + stringBuilder.Append("output_channel = " + _outputChannel); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _whoAmI = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class DisplayCalibration + { + + private DisplayIntrinsics _intrinsics; + + private DisplayExtrinsics _extrinsics; + + public DisplayCalibration() + { + } + + protected DisplayCalibration(DisplayCalibration other) + { + _intrinsics = other._intrinsics; + _extrinsics = other._extrinsics; } /// - /// Device serial number + /// Intrinsics /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("intrinsics")] + [System.ComponentModel.DescriptionAttribute("Intrinsics")] + public DisplayIntrinsics Intrinsics { get { - return _serialNumber; + return _intrinsics; } set { - _serialNumber = value; + _intrinsics = value; } } /// - /// Device port name + /// Extrinsics /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("extrinsics")] + [System.ComponentModel.DescriptionAttribute("Extrinsics")] + public DisplayExtrinsics Extrinsics { get { - return _portName; + return _extrinsics; } set { - _portName = value; + _extrinsics = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpAnalogInput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayCalibration(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpAnalogInput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_type = " + _deviceType + ", "); - stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); - stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("who_am_i = " + _whoAmI + ", "); - stringBuilder.Append("serial_number = " + _serialNumber + ", "); - stringBuilder.Append("port_name = " + _portName); + stringBuilder.Append("intrinsics = " + _intrinsics + ", "); + stringBuilder.Append("extrinsics = " + _extrinsics); return true; } @@ -1289,149 +1299,201 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpBehavior + public partial class DisplayExtrinsics { - private string _deviceType = "behavior"; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private int _whoAmI = 1216; - - private string _serialNumber; + private Vector3 _rotation; - private string _portName; + private Vector3 _translation; - public HarpBehavior() + public DisplayExtrinsics() { } - protected HarpBehavior(HarpBehavior other) + protected DisplayExtrinsics(DisplayExtrinsics other) { - _deviceType = other._deviceType; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _rotation = other._rotation; + _translation = other._translation; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Rotation vector (radians) + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("rotation")] + [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] + public Vector3 Rotation { get { - return _deviceType; + return _rotation; } set { - _deviceType = value; + _rotation = value; } } /// - /// Additional settings + /// Translation (in cm) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("translation")] + [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] + public Vector3 Translation { get { - return _additionalSettings; + return _translation; } set { - _additionalSettings = value; + _translation = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayExtrinsics(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayExtrinsics(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("rotation = " + _rotation + ", "); + stringBuilder.Append("translation = " + _translation); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class DisplayIntrinsics + { + + private int _frameWidth = 1920; + + private int _frameHeight = 1080; + + private double _displayWidth = 20D; + + private double _displayHeight = 15D; + + public DisplayIntrinsics() + { + } + + protected DisplayIntrinsics(DisplayIntrinsics other) + { + _frameWidth = other._frameWidth; + _frameHeight = other._frameHeight; + _displayWidth = other._displayWidth; + _displayHeight = other._displayHeight; } /// - /// Calibration + /// Frame width (px) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("frame_width")] + [System.ComponentModel.DescriptionAttribute("Frame width (px)")] + public int FrameWidth { get { - return _calibration; + return _frameWidth; } set { - _calibration = value; + _frameWidth = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// Frame height (px) + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_height")] + [System.ComponentModel.DescriptionAttribute("Frame height (px)")] + public int FrameHeight { get { - return _whoAmI; + return _frameHeight; } set { - _whoAmI = value; + _frameHeight = value; } } /// - /// Device serial number + /// Display width (cm) /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("display_width")] + [System.ComponentModel.DescriptionAttribute("Display width (cm)")] + public double DisplayWidth { get { - return _serialNumber; + return _displayWidth; } set { - _serialNumber = value; + _displayWidth = value; } } /// - /// Device port name + /// Display width (cm) /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("display_height")] + [System.ComponentModel.DescriptionAttribute("Display width (cm)")] + public double DisplayHeight { get { - return _portName; + return _displayHeight; } set { - _portName = value; + _displayHeight = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayIntrinsics(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayIntrinsics(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_type = " + _deviceType + ", "); - stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); - stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("who_am_i = " + _whoAmI + ", "); - stringBuilder.Append("serial_number = " + _serialNumber + ", "); - stringBuilder.Append("port_name = " + _portName); + stringBuilder.Append("frame_width = " + _frameWidth + ", "); + stringBuilder.Append("frame_height = " + _frameHeight + ", "); + stringBuilder.Append("display_width = " + _displayWidth + ", "); + stringBuilder.Append("display_height = " + _displayHeight); return true; } @@ -1453,85 +1515,195 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpClockGenerator + public partial class DisplaysCalibration { - private string _deviceType = "clockgenerator"; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private int _whoAmI = 1158; + private DisplayCalibration _left; - private string _serialNumber; + private DisplayCalibration _center; - private string _portName; + private DisplayCalibration _right; - public HarpClockGenerator() + public DisplaysCalibration() { } - protected HarpClockGenerator(HarpClockGenerator other) + protected DisplaysCalibration(DisplaysCalibration other) { - _deviceType = other._deviceType; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _left = other._left; + _center = other._center; + _right = other._right; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Left display calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("left")] + [System.ComponentModel.DescriptionAttribute("Left display calibration")] + public DisplayCalibration Left { get { - return _deviceType; + return _left; } set { - _deviceType = value; + _left = value; } } /// - /// Additional settings + /// Center display calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("center")] + [System.ComponentModel.DescriptionAttribute("Center display calibration")] + public DisplayCalibration Center { get { - return _additionalSettings; + return _center; } set { - _additionalSettings = value; + _center = value; } } /// - /// Calibration + /// Right display calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("right")] + [System.ComponentModel.DescriptionAttribute("Right display calibration")] + public DisplayCalibration Right { get { - return _calibration; + return _right; } set { - _calibration = value; + _right = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplaysCalibration(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new DisplaysCalibration(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("left = " + _left + ", "); + stringBuilder.Append("center = " + _center + ", "); + stringBuilder.Append("right = " + _right); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class HarpAnalogInput + { + + private string _deviceType = "analoginput"; + + private BaseModel _additionalSettings; + + private BaseModel _calibration; + + private int _whoAmI = 1236; + + private string _serialNumber; + + private string _portName; + + public HarpAnalogInput() + { + } + + protected HarpAnalogInput(HarpAnalogInput other) + { + _deviceType = other._deviceType; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } + + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings + { + get + { + return _additionalSettings; + } + set + { + _additionalSettings = value; + } + } + + /// + /// Calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] public int WhoAmI { get @@ -1578,14 +1750,14 @@ public string PortName } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpClockGenerator(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpAnalogInput(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpClockGenerator(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpAnalogInput(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -1617,26 +1789,26 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpLickometer + public partial class HarpBehavior { - private string _deviceType = "lickometer"; + private string _deviceType = "behavior"; private BaseModel _additionalSettings; private BaseModel _calibration; - private int _whoAmI = 1400; + private int _whoAmI = 1216; private string _serialNumber; private string _portName; - public HarpLickometer() + public HarpBehavior() { } - protected HarpLickometer(HarpLickometer other) + protected HarpBehavior(HarpBehavior other) { _deviceType = other._deviceType; _additionalSettings = other._additionalSettings; @@ -1742,14 +1914,14 @@ public string PortName } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpLickometer(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpLickometer(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -1778,33 +1950,31 @@ public override string ToString() } - /// - /// Overrides the default settings for the olfactometer calibration - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Overrides the default settings for the olfactometer calibration")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpOlfactometer + public partial class HarpClockGenerator { - private string _deviceType = "olfactometer"; + private string _deviceType = "clockgenerator"; private BaseModel _additionalSettings; - private OlfactometerCalibration _calibration; + private BaseModel _calibration; - private int _whoAmI = 1140; + private int _whoAmI = 1158; private string _serialNumber; private string _portName; - public HarpOlfactometer() + private System.Collections.Generic.List _connectedClockOutputs = new System.Collections.Generic.List(); + + public HarpClockGenerator() { } - protected HarpOlfactometer(HarpOlfactometer other) + protected HarpClockGenerator(HarpClockGenerator other) { _deviceType = other._deviceType; _additionalSettings = other._additionalSettings; @@ -1812,6 +1982,7 @@ protected HarpOlfactometer(HarpOlfactometer other) _whoAmI = other._whoAmI; _serialNumber = other._serialNumber; _portName = other._portName; + _connectedClockOutputs = other._connectedClockOutputs; } [Newtonsoft.Json.JsonPropertyAttribute("device_type")] @@ -1846,12 +2017,12 @@ public BaseModel AdditionalSettings } /// - /// Olfactometer calibration + /// Calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Olfactometer calibration")] - public OlfactometerCalibration Calibration + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration { get { @@ -1910,14 +2081,32 @@ public string PortName } } - public System.IObservable Process() + /// + /// Connected clock outputs + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] + [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] + public System.Collections.Generic.List ConnectedClockOutputs { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpOlfactometer(this))); + get + { + return _connectedClockOutputs; + } + set + { + _connectedClockOutputs = value; + } } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpOlfactometer(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpClockGenerator(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new HarpClockGenerator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -1927,7 +2116,8 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("calibration = " + _calibration + ", "); stringBuilder.Append("who_am_i = " + _whoAmI + ", "); stringBuilder.Append("serial_number = " + _serialNumber + ", "); - stringBuilder.Append("port_name = " + _portName); + stringBuilder.Append("port_name = " + _portName + ", "); + stringBuilder.Append("connected_clock_outputs = " + _connectedClockOutputs); return true; } @@ -1949,26 +2139,26 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpSniffDetector + public partial class HarpEnvironmentSensor { - private string _deviceType = "sniffdetector"; + private string _deviceType = "environmentsensor"; private BaseModel _additionalSettings; private BaseModel _calibration; - private int _whoAmI = 1401; + private int _whoAmI = 1405; private string _serialNumber; private string _portName; - public HarpSniffDetector() + public HarpEnvironmentSensor() { } - protected HarpSniffDetector(HarpSniffDetector other) + protected HarpEnvironmentSensor(HarpEnvironmentSensor other) { _deviceType = other._deviceType; _additionalSettings = other._additionalSettings; @@ -2074,14 +2264,14 @@ public string PortName } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpSniffDetector(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpEnvironmentSensor(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpSniffDetector(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpEnvironmentSensor(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -2110,33 +2300,29 @@ public override string ToString() } - /// - /// Overrides the default settings for the treadmill calibration - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Overrides the default settings for the treadmill calibration")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class HarpTreadmill + public partial class HarpLickometer { - private string _deviceType = "treadmill"; + private string _deviceType = "lickometer"; private BaseModel _additionalSettings; - private Treadmill _calibration; + private BaseModel _calibration; - private int _whoAmI = 1402; + private int _whoAmI = 1400; private string _serialNumber; private string _portName; - public HarpTreadmill() + public HarpLickometer() { } - protected HarpTreadmill(HarpTreadmill other) + protected HarpLickometer(HarpLickometer other) { _deviceType = other._deviceType; _additionalSettings = other._additionalSettings; @@ -2178,12 +2364,12 @@ public BaseModel AdditionalSettings } /// - /// Treadmill calibration settings + /// Calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Treadmill calibration settings")] - public Treadmill Calibration + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration { get { @@ -2242,14 +2428,14 @@ public string PortName } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpTreadmill(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpLickometer(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpTreadmill(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpLickometer(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -2278,100 +2464,156 @@ public override string ToString() } + /// + /// Overrides the default settings for the olfactometer calibration + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Overrides the default settings for the olfactometer calibration")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class ManipulatorPosition + public partial class HarpOlfactometer { - private double _x; + private string _deviceType = "olfactometer"; - private double _y1; + private BaseModel _additionalSettings; - private double _y2; + private OlfactometerCalibration _calibration; - private double _z; + private int _whoAmI = 1140; - public ManipulatorPosition() + private string _serialNumber; + + private string _portName; + + public HarpOlfactometer() { } - protected ManipulatorPosition(ManipulatorPosition other) + protected HarpOlfactometer(HarpOlfactometer other) { - _x = other._x; - _y1 = other._y1; - _y2 = other._y2; - _z = other._z; + _deviceType = other._deviceType; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - [Newtonsoft.Json.JsonPropertyAttribute("x", Required=Newtonsoft.Json.Required.Always)] - public double X + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _x; + return _deviceType; } set { - _x = value; + _deviceType = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("y1", Required=Newtonsoft.Json.Required.Always)] - public double Y1 + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings { get { - return _y1; + return _additionalSettings; } set { - _y1 = value; + _additionalSettings = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("y2", Required=Newtonsoft.Json.Required.Always)] - public double Y2 + /// + /// Olfactometer calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Olfactometer calibration")] + public OlfactometerCalibration Calibration { get { - return _y2; + return _calibration; } set { - _y2 = value; + _calibration = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("z", Required=Newtonsoft.Json.Required.Always)] - public double Z + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _z; + return _whoAmI; } set { - _z = value; + _whoAmI = value; } } - public System.IObservable Process() + /// + /// Device serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ManipulatorPosition(this))); + get + { + return _serialNumber; + } + set + { + _serialNumber = value; + } } - public System.IObservable Process(System.IObservable source) + /// + /// Device port name + /// + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { - return System.Reactive.Linq.Observable.Select(source, _ => new ManipulatorPosition(this)); + get + { + return _portName; + } + set + { + _portName = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpOlfactometer(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new HarpOlfactometer(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("x = " + _x + ", "); - stringBuilder.Append("y1 = " + _y1 + ", "); - stringBuilder.Append("y2 = " + _y2 + ", "); - stringBuilder.Append("z = " + _z); + stringBuilder.Append("device_type = " + _deviceType + ", "); + stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); + stringBuilder.Append("calibration = " + _calibration + ", "); + stringBuilder.Append("who_am_i = " + _whoAmI + ", "); + stringBuilder.Append("serial_number = " + _serialNumber + ", "); + stringBuilder.Append("port_name = " + _portName); return true; } @@ -2390,121 +2632,152 @@ public override string ToString() } - /// - /// Input for water valve calibration class - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Input for water valve calibration class")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class Measurement + public partial class HarpSniffDetector { - private double _valveOpenInterval; + private string _deviceType = "sniffdetector"; - private double _valveOpenTime; + private BaseModel _additionalSettings; - private System.Collections.Generic.List _waterWeight = new System.Collections.Generic.List(); + private BaseModel _calibration; - private int _repeatCount; + private int _whoAmI = 1401; - public Measurement() + private string _serialNumber; + + private string _portName; + + public HarpSniffDetector() { } - protected Measurement(Measurement other) + protected HarpSniffDetector(HarpSniffDetector other) { - _valveOpenInterval = other._valveOpenInterval; - _valveOpenTime = other._valveOpenTime; - _waterWeight = other._waterWeight; - _repeatCount = other._repeatCount; + _deviceType = other._deviceType; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + } + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } /// - /// Time between two consecutive valve openings (s) + /// Additional settings /// - [Newtonsoft.Json.JsonPropertyAttribute("valve_open_interval", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Time between two consecutive valve openings (s)")] - public double ValveOpenInterval + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings { get { - return _valveOpenInterval; + return _additionalSettings; } set { - _valveOpenInterval = value; + _additionalSettings = value; } } /// - /// Valve open interval (s) + /// Calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("valve_open_time", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Valve open interval (s)")] - public double ValveOpenTime + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration { get { - return _valveOpenTime; + return _calibration; } set { - _valveOpenTime = value; + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI + { + get + { + return _whoAmI; + } + set + { + _whoAmI = value; } } /// - /// Weight of water delivered (g) + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("water_weight", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Weight of water delivered (g)")] - public System.Collections.Generic.List WaterWeight + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _waterWeight; + return _serialNumber; } set { - _waterWeight = value; + _serialNumber = value; } } /// - /// Number of times the valve opened. + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("repeat_count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of times the valve opened.")] - public int RepeatCount + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _repeatCount; + return _portName; } set { - _repeatCount = value; + _portName = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Measurement(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpSniffDetector(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Measurement(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpSniffDetector(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("valve_open_interval = " + _valveOpenInterval + ", "); - stringBuilder.Append("valve_open_time = " + _valveOpenTime + ", "); - stringBuilder.Append("water_weight = " + _waterWeight + ", "); - stringBuilder.Append("repeat_count = " + _repeatCount); + stringBuilder.Append("device_type = " + _deviceType + ", "); + stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); + stringBuilder.Append("calibration = " + _calibration + ", "); + stringBuilder.Append("who_am_i = " + _whoAmI + ", "); + stringBuilder.Append("serial_number = " + _serialNumber + ", "); + stringBuilder.Append("port_name = " + _portName); return true; } @@ -2524,174 +2797,99 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - public enum MicrostepResolution - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Microstep8 = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Microstep16 = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Microstep32 = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Microstep64 = 3, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - public enum MotorOperationMode - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - Quiet = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - Dynamic = 1, - } - - - /// - /// Olfactometer calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Olfactometer calibration class")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class OlfactometerCalibration + public partial class ManipulatorPosition { - private string _deviceName = "Olfactometer"; - - private OlfactometerCalibrationInput _input = new OlfactometerCalibrationInput(); - - private OlfactometerCalibrationOutput _output = new OlfactometerCalibrationOutput(); + private double _x; - private System.DateTimeOffset? _date; + private double _y1; - private string _description = "Calibration of the harp olfactometer device"; + private double _y2; - private string _notes; + private double _z; - public OlfactometerCalibration() + public ManipulatorPosition() { } - protected OlfactometerCalibration(OlfactometerCalibration other) + protected ManipulatorPosition(ManipulatorPosition other) { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; - } - - /// - /// Name of the device being calibrated - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Name of the device being calibrated")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public OlfactometerCalibrationInput Input - { - get - { - return _input; - } - set - { - _input = value; - } + _x = other._x; + _y1 = other._y1; + _y2 = other._y2; + _z = other._z; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public OlfactometerCalibrationOutput Output + [Newtonsoft.Json.JsonPropertyAttribute("x", Required=Newtonsoft.Json.Required.Always)] + public double X { get { - return _output; + return _x; } set { - _output = value; + _x = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date + [Newtonsoft.Json.JsonPropertyAttribute("y1", Required=Newtonsoft.Json.Required.Always)] + public double Y1 { get { - return _date; + return _y1; } set { - _date = value; + _y1 = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description + [Newtonsoft.Json.JsonPropertyAttribute("y2", Required=Newtonsoft.Json.Required.Always)] + public double Y2 { get { - return _description; + return _y2; } set { - _description = value; + _y2 = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes + [Newtonsoft.Json.JsonPropertyAttribute("z", Required=Newtonsoft.Json.Required.Always)] + public double Z { get { - return _notes; + return _z; } set { - _notes = value; + _z = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ManipulatorPosition(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ManipulatorPosition(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_name = " + _deviceName + ", "); - stringBuilder.Append("input = " + _input + ", "); - stringBuilder.Append("output = " + _output + ", "); - stringBuilder.Append("date = " + _date + ", "); - stringBuilder.Append("description = " + _description + ", "); - stringBuilder.Append("notes = " + _notes); + stringBuilder.Append("x = " + _x + ", "); + stringBuilder.Append("y1 = " + _y1 + ", "); + stringBuilder.Append("y2 = " + _y2 + ", "); + stringBuilder.Append("z = " + _z); return true; } @@ -2710,54 +2908,121 @@ public override string ToString() } + /// + /// Input for water valve calibration class + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Input for water valve calibration class")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class OlfactometerCalibrationInput + public partial class Measurement { - private System.Collections.Generic.IDictionary _channelConfig; + private double _valveOpenInterval; - public OlfactometerCalibrationInput() + private double _valveOpenTime; + + private System.Collections.Generic.List _waterWeight = new System.Collections.Generic.List(); + + private int _repeatCount; + + public Measurement() { } - protected OlfactometerCalibrationInput(OlfactometerCalibrationInput other) + protected Measurement(Measurement other) { - _channelConfig = other._channelConfig; + _valveOpenInterval = other._valveOpenInterval; + _valveOpenTime = other._valveOpenTime; + _waterWeight = other._waterWeight; + _repeatCount = other._repeatCount; } /// - /// Configuration of olfactometer channels + /// Time between two consecutive valve openings (s) + /// + [Newtonsoft.Json.JsonPropertyAttribute("valve_open_interval", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Time between two consecutive valve openings (s)")] + public double ValveOpenInterval + { + get + { + return _valveOpenInterval; + } + set + { + _valveOpenInterval = value; + } + } + + /// + /// Valve open interval (s) + /// + [Newtonsoft.Json.JsonPropertyAttribute("valve_open_time", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Valve open interval (s)")] + public double ValveOpenTime + { + get + { + return _valveOpenTime; + } + set + { + _valveOpenTime = value; + } + } + + /// + /// Weight of water delivered (g) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("channel_config")] - [System.ComponentModel.DescriptionAttribute("Configuration of olfactometer channels")] - public System.Collections.Generic.IDictionary ChannelConfig + [Newtonsoft.Json.JsonPropertyAttribute("water_weight", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Weight of water delivered (g)")] + public System.Collections.Generic.List WaterWeight { get { - return _channelConfig; + return _waterWeight; } set { - _channelConfig = value; + _waterWeight = value; } } - public System.IObservable Process() + /// + /// Number of times the valve opened. + /// + [Newtonsoft.Json.JsonPropertyAttribute("repeat_count", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of times the valve opened.")] + public int RepeatCount { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationInput(this))); + get + { + return _repeatCount; + } + set + { + _repeatCount = value; + } } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationInput(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Measurement(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Measurement(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("channel_config = " + _channelConfig); + stringBuilder.Append("valve_open_interval = " + _valveOpenInterval + ", "); + stringBuilder.Append("valve_open_time = " + _valveOpenTime + ", "); + stringBuilder.Append("water_weight = " + _waterWeight + ", "); + stringBuilder.Append("repeat_count = " + _repeatCount); return true; } @@ -2777,180 +3042,174 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.CombinatorAttribute()] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class OlfactometerCalibrationOutput + public enum MicrostepResolution { - public OlfactometerCalibrationOutput() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Microstep8 = 0, - protected OlfactometerCalibrationOutput(OlfactometerCalibrationOutput other) - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Microstep16 = 1, - public System.IObservable Process() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationOutput(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Microstep32 = 2, - public System.IObservable Process(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationOutput(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Microstep64 = 3, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum MotorOperationMode + { - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Quiet = 0, - public override string ToString() - { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Dynamic = 1, } + /// + /// Olfactometer calibration class + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Olfactometer calibration class")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class OlfactometerChannelConfig + public partial class OlfactometerCalibration { - private int _channelIndex; + private string _deviceName = "Olfactometer"; - private OlfactometerChannelType _channelType = AindVrForagingDataSchema.Rig.OlfactometerChannelType.Odor; + private OlfactometerCalibrationInput _input = new OlfactometerCalibrationInput(); - private OlfactometerChannelConfigFlowRateCapacity _flowRateCapacity = AindVrForagingDataSchema.Rig.OlfactometerChannelConfigFlowRateCapacity._100; + private OlfactometerCalibrationOutput _output = new OlfactometerCalibrationOutput(); - private double _flowRate = 100D; + private System.DateTimeOffset? _date; - private string _odorant; + private string _description = "Calibration of the harp olfactometer device"; - private double? _odorantDilution; + private string _notes; - public OlfactometerChannelConfig() + public OlfactometerCalibration() { } - protected OlfactometerChannelConfig(OlfactometerChannelConfig other) + protected OlfactometerCalibration(OlfactometerCalibration other) { - _channelIndex = other._channelIndex; - _channelType = other._channelType; - _flowRateCapacity = other._flowRateCapacity; - _flowRate = other._flowRate; - _odorant = other._odorant; - _odorantDilution = other._odorantDilution; + _deviceName = other._deviceName; + _input = other._input; + _output = other._output; + _date = other._date; + _description = other._description; + _notes = other._notes; } - [Newtonsoft.Json.JsonPropertyAttribute("channel_index", Required=Newtonsoft.Json.Required.Always)] - public int ChannelIndex + /// + /// Name of the device being calibrated + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Name of the device being calibrated")] + public string DeviceName { get { - return _channelIndex; + return _deviceName; } set { - _channelIndex = value; + _deviceName = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("channel_type")] - public OlfactometerChannelType ChannelType + [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] + public OlfactometerCalibrationInput Input { get { - return _channelType; + return _input; } set { - _channelType = value; + _input = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("flow_rate_capacity")] - public OlfactometerChannelConfigFlowRateCapacity FlowRateCapacity + [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] + public OlfactometerCalibrationOutput Output { get { - return _flowRateCapacity; + return _output; } set { - _flowRateCapacity = value; + _output = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("flow_rate")] - public double FlowRate + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + public System.DateTimeOffset? Date { get { - return _flowRate; + return _date; } set { - _flowRate = value; + _date = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("odorant")] - public string Odorant + [Newtonsoft.Json.JsonPropertyAttribute("description")] + public string Description { get { - return _odorant; + return _description; } set { - _odorant = value; + _description = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odorant_dilution")] - public double? OdorantDilution + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + public string Notes { get { - return _odorantDilution; + return _notes; } set { - _odorantDilution = value; + _notes = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerChannelConfig(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerChannelConfig(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("channel_index = " + _channelIndex + ", "); - stringBuilder.Append("channel_type = " + _channelType + ", "); - stringBuilder.Append("flow_rate_capacity = " + _flowRateCapacity + ", "); - stringBuilder.Append("flow_rate = " + _flowRate + ", "); - stringBuilder.Append("odorant = " + _odorant + ", "); - stringBuilder.Append("odorant_dilution = " + _odorantDilution); + stringBuilder.Append("device_name = " + _deviceName + ", "); + stringBuilder.Append("input = " + _input + ", "); + stringBuilder.Append("output = " + _output + ", "); + stringBuilder.Append("date = " + _date + ", "); + stringBuilder.Append("description = " + _description + ", "); + stringBuilder.Append("notes = " + _notes); return true; } @@ -2969,75 +3228,54 @@ public override string ToString() } - /// - /// Channel type - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum OlfactometerChannelType - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Odor")] - Odor = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="Carrier")] - Carrier = 1, - } - - - /// - /// Container class for calibration models. In a future release these will be moved to the respective devices - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Container class for calibration models. In a future release these will be moved t" + - "o the respective devices")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class RigCalibration + public partial class OlfactometerCalibrationInput { - private WaterValveCalibration _waterValve = new WaterValveCalibration(); + private System.Collections.Generic.IDictionary _channelConfig; - public RigCalibration() + public OlfactometerCalibrationInput() { } - protected RigCalibration(RigCalibration other) + protected OlfactometerCalibrationInput(OlfactometerCalibrationInput other) { - _waterValve = other._waterValve; + _channelConfig = other._channelConfig; } /// - /// Water valve calibration + /// Configuration of olfactometer channels /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("water_valve", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Water valve calibration")] - public WaterValveCalibration WaterValve + [Newtonsoft.Json.JsonPropertyAttribute("channel_config")] + [System.ComponentModel.DescriptionAttribute("Configuration of olfactometer channels")] + public System.Collections.Generic.IDictionary ChannelConfig { get { - return _waterValve; + return _channelConfig; } set { - _waterValve = value; + _channelConfig = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationInput(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationInput(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("water_valve = " + _waterValve); + stringBuilder.Append("channel_config = " + _channelConfig); return true; } @@ -3059,52 +3297,1478 @@ public override string ToString() [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class Screen + public partial class OlfactometerCalibrationOutput { - private string _deviceType = "Screen"; + public OlfactometerCalibrationOutput() + { + } - private BaseModel _additionalSettings; + protected OlfactometerCalibrationOutput(OlfactometerCalibrationOutput other) + { + } - private BaseModel _calibration; + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationOutput(this))); + } - private int _displayIndex = 1; + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationOutput(this)); + } - private double _targetRenderFrequency = 60D; + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } - private double _targetUpdateFrequency = 120D; + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Harp Olfactometer available channel + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum OlfactometerChannel + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Channel0 = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Channel1 = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Channel2 = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Channel3 = 3, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class OlfactometerChannelConfig + { + + private int _channelIndex; + + private OlfactometerChannelType _channelType = AindVrForagingDataSchema.Rig.OlfactometerChannelType.Odor; + + private OlfactometerChannelConfigFlowRateCapacity _flowRateCapacity = AindVrForagingDataSchema.Rig.OlfactometerChannelConfigFlowRateCapacity._100; + + private double _flowRate = 100D; + + private string _odorant; + + private double? _odorantDilution; + + public OlfactometerChannelConfig() + { + } + + protected OlfactometerChannelConfig(OlfactometerChannelConfig other) + { + _channelIndex = other._channelIndex; + _channelType = other._channelType; + _flowRateCapacity = other._flowRateCapacity; + _flowRate = other._flowRate; + _odorant = other._odorant; + _odorantDilution = other._odorantDilution; + } + + [Newtonsoft.Json.JsonPropertyAttribute("channel_index", Required=Newtonsoft.Json.Required.Always)] + public int ChannelIndex + { + get + { + return _channelIndex; + } + set + { + _channelIndex = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("channel_type")] + public OlfactometerChannelType ChannelType + { + get + { + return _channelType; + } + set + { + _channelType = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("flow_rate_capacity")] + public OlfactometerChannelConfigFlowRateCapacity FlowRateCapacity + { + get + { + return _flowRateCapacity; + } + set + { + _flowRateCapacity = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("flow_rate")] + public double FlowRate + { + get + { + return _flowRate; + } + set + { + _flowRate = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("odorant")] + public string Odorant + { + get + { + return _odorant; + } + set + { + _odorant = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("odorant_dilution")] + public double? OdorantDilution + { + get + { + return _odorantDilution; + } + set + { + _odorantDilution = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerChannelConfig(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerChannelConfig(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("channel_index = " + _channelIndex + ", "); + stringBuilder.Append("channel_type = " + _channelType + ", "); + stringBuilder.Append("flow_rate_capacity = " + _flowRateCapacity + ", "); + stringBuilder.Append("flow_rate = " + _flowRate + ", "); + stringBuilder.Append("odorant = " + _odorant + ", "); + stringBuilder.Append("odorant_dilution = " + _odorantDilution); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Channel type + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum OlfactometerChannelType + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Odor")] + Odor = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Carrier")] + Carrier = 1, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class Rect + { + + private int _x = 0; + + private int _y = 0; + + private int _width = 0; + + private int _height = 0; + + public Rect() + { + } + + protected Rect(Rect other) + { + _x = other._x; + _y = other._y; + _width = other._width; + _height = other._height; + } + + /// + /// X coordinate of the top-left corner + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] + public int X + { + get + { + return _x; + } + set + { + _x = value; + } + } + + /// + /// Y coordinate of the top-left corner + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the top-left corner")] + public int Y + { + get + { + return _y; + } + set + { + _y = value; + } + } + + /// + /// Width of the rectangle + /// + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] + public int Width + { + get + { + return _width; + } + set + { + _width = value; + } + } + + /// + /// Height of the rectangle + /// + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] + public int Height + { + get + { + return _height; + } + set + { + _height = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("x = " + _x + ", "); + stringBuilder.Append("y = " + _y + ", "); + stringBuilder.Append("width = " + _width + ", "); + stringBuilder.Append("height = " + _height); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Container class for calibration models. In a future release these will be moved to the respective devices + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Container class for calibration models. In a future release these will be moved t" + + "o the respective devices")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class RigCalibration + { + + private WaterValveCalibration _waterValve = new WaterValveCalibration(); + + public RigCalibration() + { + } + + protected RigCalibration(RigCalibration other) + { + _waterValve = other._waterValve; + } + + /// + /// Water valve calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("water_valve", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Water valve calibration")] + public WaterValveCalibration WaterValve + { + get + { + return _waterValve; + } + set + { + _waterValve = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("water_valve = " + _waterValve); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class Screen + { + + private string _deviceType = "Screen"; + + private BaseModel _additionalSettings; + + private DisplaysCalibration _calibration; + + private int _displayIndex = 1; + + private double _targetRenderFrequency = 60D; + + private double _targetUpdateFrequency = 120D; + + private string _textureAssetsDirectory = "Textures"; + + private double _brightness = 0D; + + private double _contrast = 1D; + + public Screen() + { + } + + protected Screen(Screen other) + { + _deviceType = other._deviceType; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _displayIndex = other._displayIndex; + _targetRenderFrequency = other._targetRenderFrequency; + _targetUpdateFrequency = other._targetUpdateFrequency; + _textureAssetsDirectory = other._textureAssetsDirectory; + _brightness = other._brightness; + _contrast = other._contrast; + } + + /// + /// Device type + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + [System.ComponentModel.DescriptionAttribute("Device type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } + + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings + { + get + { + return _additionalSettings; + } + set + { + _additionalSettings = value; + } + } + + /// + /// Screen calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Screen calibration")] + public DisplaysCalibration Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + /// + /// Display index + /// + [Newtonsoft.Json.JsonPropertyAttribute("display_index")] + [System.ComponentModel.DescriptionAttribute("Display index")] + public int DisplayIndex + { + get + { + return _displayIndex; + } + set + { + _displayIndex = value; + } + } + + /// + /// Target render frequency + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] + [System.ComponentModel.DescriptionAttribute("Target render frequency")] + public double TargetRenderFrequency + { + get + { + return _targetRenderFrequency; + } + set + { + _targetRenderFrequency = value; + } + } + + /// + /// Target update frequency + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] + [System.ComponentModel.DescriptionAttribute("Target update frequency")] + public double TargetUpdateFrequency + { + get + { + return _targetUpdateFrequency; + } + set + { + _targetUpdateFrequency = value; + } + } + + /// + /// Calibration directory + /// + [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] + [System.ComponentModel.DescriptionAttribute("Calibration directory")] + public string TextureAssetsDirectory + { + get + { + return _textureAssetsDirectory; + } + set + { + _textureAssetsDirectory = value; + } + } + + /// + /// Brightness + /// + [Newtonsoft.Json.JsonPropertyAttribute("brightness")] + [System.ComponentModel.DescriptionAttribute("Brightness")] + public double Brightness + { + get + { + return _brightness; + } + set + { + _brightness = value; + } + } + + /// + /// Contrast + /// + [Newtonsoft.Json.JsonPropertyAttribute("contrast")] + [System.ComponentModel.DescriptionAttribute("Contrast")] + public double Contrast + { + get + { + return _contrast; + } + set + { + _contrast = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Screen(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Screen(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("device_type = " + _deviceType + ", "); + stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); + stringBuilder.Append("calibration = " + _calibration + ", "); + stringBuilder.Append("display_index = " + _displayIndex + ", "); + stringBuilder.Append("target_render_frequency = " + _targetRenderFrequency + ", "); + stringBuilder.Append("target_update_frequency = " + _targetUpdateFrequency + ", "); + stringBuilder.Append("texture_assets_directory = " + _textureAssetsDirectory + ", "); + stringBuilder.Append("brightness = " + _brightness + ", "); + stringBuilder.Append("contrast = " + _contrast); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class SpinnakerCamera + { + + private string _deviceType = "SpinnakerCamera"; + + private BaseModel _additionalSettings; + + private BaseModel _calibration; + + private string _serialNumber; + + private int _binning = 1; + + private SpinnakerCameraColorProcessing _colorProcessing = AindVrForagingDataSchema.Rig.SpinnakerCameraColorProcessing.Default; + + private int _exposure = 1000; + + private double _gain = 0D; + + private double? _gamma; + + private SpinnakerCameraAdcBitDepth? _adcBitDepth = AindVrForagingDataSchema.Rig.SpinnakerCameraAdcBitDepth.Adc8bit; + + private SpinnakerCameraPixelFormat? _pixelFormat = AindVrForagingDataSchema.Rig.SpinnakerCameraPixelFormat.Mono8; + + private Rect _regionOfInterest; + + private VideoWriter _videoWriter; + + public SpinnakerCamera() + { + } + + protected SpinnakerCamera(SpinnakerCamera other) + { + _deviceType = other._deviceType; + _additionalSettings = other._additionalSettings; + _calibration = other._calibration; + _serialNumber = other._serialNumber; + _binning = other._binning; + _colorProcessing = other._colorProcessing; + _exposure = other._exposure; + _gain = other._gain; + _gamma = other._gamma; + _adcBitDepth = other._adcBitDepth; + _pixelFormat = other._pixelFormat; + _regionOfInterest = other._regionOfInterest; + _videoWriter = other._videoWriter; + } + + /// + /// Device type + /// + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + [System.ComponentModel.DescriptionAttribute("Device type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } + + /// + /// Additional settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] + [System.ComponentModel.DescriptionAttribute("Additional settings")] + public BaseModel AdditionalSettings + { + get + { + return _additionalSettings; + } + set + { + _additionalSettings = value; + } + } + + /// + /// Calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration")] + public BaseModel Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + /// + /// Camera serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Camera serial number")] + public string SerialNumber + { + get + { + return _serialNumber; + } + set + { + _serialNumber = value; + } + } + + /// + /// Binning + /// + [Newtonsoft.Json.JsonPropertyAttribute("binning")] + [System.ComponentModel.DescriptionAttribute("Binning")] + public int Binning + { + get + { + return _binning; + } + set + { + _binning = value; + } + } + + /// + /// Color processing + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] + [System.ComponentModel.DescriptionAttribute("Color processing")] + public SpinnakerCameraColorProcessing ColorProcessing + { + get + { + return _colorProcessing; + } + set + { + _colorProcessing = value; + } + } + + /// + /// Exposure time + /// + [Newtonsoft.Json.JsonPropertyAttribute("exposure")] + [System.ComponentModel.DescriptionAttribute("Exposure time")] + public int Exposure + { + get + { + return _exposure; + } + set + { + _exposure = value; + } + } + + /// + /// Gain + /// + [Newtonsoft.Json.JsonPropertyAttribute("gain")] + [System.ComponentModel.DescriptionAttribute("Gain")] + public double Gain + { + get + { + return _gain; + } + set + { + _gain = value; + } + } + + /// + /// Gamma. If None, will disable gamma correction. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("gamma")] + [System.ComponentModel.DescriptionAttribute("Gamma. If None, will disable gamma correction.")] + public double? Gamma + { + get + { + return _gamma; + } + set + { + _gamma = value; + } + } + + /// + /// ADC bit depth. If None will be left as default. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("adc_bit_depth")] + [System.ComponentModel.DescriptionAttribute("ADC bit depth. If None will be left as default.")] + public SpinnakerCameraAdcBitDepth? AdcBitDepth + { + get + { + return _adcBitDepth; + } + set + { + _adcBitDepth = value; + } + } + + /// + /// Pixel format. If None will be left as default. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("pixel_format")] + [System.ComponentModel.DescriptionAttribute("Pixel format. If None will be left as default.")] + public SpinnakerCameraPixelFormat? PixelFormat + { + get + { + return _pixelFormat; + } + set + { + _pixelFormat = value; + } + } + + /// + /// Region of interest + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("region_of_interest")] + [System.ComponentModel.DescriptionAttribute("Region of interest")] + public Rect RegionOfInterest + { + get + { + return _regionOfInterest; + } + set + { + _regionOfInterest = value; + } + } + + /// + /// Video writer. If not provided, no video will be saved. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] + [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] + public VideoWriter VideoWriter + { + get + { + return _videoWriter; + } + set + { + _videoWriter = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("device_type = " + _deviceType + ", "); + stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); + stringBuilder.Append("calibration = " + _calibration + ", "); + stringBuilder.Append("serial_number = " + _serialNumber + ", "); + stringBuilder.Append("binning = " + _binning + ", "); + stringBuilder.Append("color_processing = " + _colorProcessing + ", "); + stringBuilder.Append("exposure = " + _exposure + ", "); + stringBuilder.Append("gain = " + _gain + ", "); + stringBuilder.Append("gamma = " + _gamma + ", "); + stringBuilder.Append("adc_bit_depth = " + _adcBitDepth + ", "); + stringBuilder.Append("pixel_format = " + _pixelFormat + ", "); + stringBuilder.Append("region_of_interest = " + _regionOfInterest + ", "); + stringBuilder.Append("video_writer = " + _videoWriter); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraAdcBitDepth + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Adc8bit = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Adc10bit = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Adc12bit = 2, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraPixelFormat + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Mono8 = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Mono16 = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Rgb8packed = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Bayergr8 = 3, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] + Bayerrg8 = 4, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="5")] + Bayergb8 = 5, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="6")] + Bayerbg8 = 6, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="7")] + Bayergr16 = 7, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="8")] + Bayerrg16 = 8, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="9")] + Bayergb16 = 9, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] + Bayerbg16 = 10, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="11")] + Mono12packed = 11, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="12")] + Bayergr12packed = 12, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="13")] + Bayerrg12packed = 13, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="14")] + Bayergb12packed = 14, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="15")] + Bayerbg12packed = 15, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="16")] + Yuv411packed = 16, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="17")] + Yuv422packed = 17, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="18")] + Yuv444packed = 18, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="19")] + Mono12p = 19, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] + Bayergr12p = 20, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="21")] + Bayerrg12p = 21, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="22")] + Bayergb12p = 22, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="23")] + Bayerbg12p = 23, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="24")] + Ycbcr8 = 24, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="25")] + Ycbcr4228 = 25, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="26")] + Ycbcr4118 = 26, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="27")] + Bgr8 = 27, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="28")] + Bgra8 = 28, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="29")] + Mono10packed = 29, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] + Bayergr10packed = 30, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="31")] + Bayerrg10packed = 31, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="32")] + Bayergb10packed = 32, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="33")] + Bayerbg10packed = 33, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="34")] + Mono10p = 34, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="35")] + Bayergr10p = 35, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="36")] + Bayerrg10p = 36, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="37")] + Bayergb10p = 37, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="38")] + Bayerbg10p = 38, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="39")] + Mono1p = 39, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] + Mono2p = 40, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="41")] + Mono4p = 41, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="42")] + Mono8s = 42, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="43")] + Mono10 = 43, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="44")] + Mono12 = 44, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="45")] + Mono14 = 45, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="46")] + Mono16s = 46, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="47")] + Mono32f = 47, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="48")] + Bayerbg10 = 48, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="49")] + Bayerbg12 = 49, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] + Bayergb10 = 50, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="51")] + Bayergb12 = 51, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="52")] + Bayergr10 = 52, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="53")] + Bayergr12 = 53, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="54")] + Bayerrg10 = 54, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="55")] + Bayerrg12 = 55, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="56")] + Rgba8 = 56, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="57")] + Rgba10 = 57, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="58")] + Rgba10p = 58, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="59")] + Rgba12 = 59, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="60")] + Rgba12p = 60, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="61")] + Rgba14 = 61, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="62")] + Rgba16 = 62, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="63")] + Rgb8 = 63, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="64")] + Rgb8Planar = 64, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="65")] + Rgb10 = 65, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="66")] + Rgb10Planar = 66, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="67")] + Rgb10p = 67, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="68")] + Rgb10p32 = 68, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="69")] + Rgb12 = 69, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="70")] + Rgb12Planar = 70, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="71")] + Rgb12p = 71, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="72")] + Rgb14 = 72, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="73")] + Rgb16 = 73, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="74")] + Rgb16s = 74, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="75")] + Rgb32f = 75, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="76")] + Rgb16Planar = 76, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="77")] + Rgb565p = 77, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="78")] + Bgra10 = 78, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="79")] + Bgra10p = 79, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="80")] + Bgra12 = 80, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="81")] + Bgra12p = 81, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="82")] + Bgra14 = 82, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="83")] + Bgra16 = 83, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="84")] + Rgba32f = 84, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="85")] + Bgr10 = 85, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="86")] + Bgr10p = 86, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="87")] + Bgr12 = 87, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="88")] + Bgr12p = 88, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="89")] + Bgr14 = 89, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="90")] + Bgr16 = 90, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="91")] + Bgr565p = 91, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="92")] + R8 = 92, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="93")] + R10 = 93, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="94")] + R12 = 94, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="95")] + R16 = 95, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="96")] + G8 = 96, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="97")] + G10 = 97, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="98")] + G12 = 98, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="99")] + G16 = 99, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] + B8 = 100, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="101")] + B10 = 101, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="102")] + B12 = 102, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="103")] + B16 = 103, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="104")] + Coord3dAbc8 = 104, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="105")] + Coord3dAbc8Planar = 105, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="106")] + Coord3dAbc10p = 106, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="107")] + Coord3dAbc10pPlanar = 107, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="108")] + Coord3dAbc12p = 108, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="109")] + Coord3dAbc12pPlanar = 109, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="110")] + Coord3dAbc16 = 110, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="111")] + Coord3dAbc16Planar = 111, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="112")] + Coord3dAbc32f = 112, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="113")] + Coord3dAbc32fPlanar = 113, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="114")] + Coord3dAc8 = 114, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="115")] + Coord3dAc8Planar = 115, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="116")] + Coord3dAc10p = 116, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="117")] + Coord3dAc10pPlanar = 117, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="118")] + Coord3dAc12p = 118, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="119")] + Coord3dAc12pPlanar = 119, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="120")] + Coord3dAc16 = 120, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="121")] + Coord3dAc16Planar = 121, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="122")] + Coord3dAc32f = 122, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="123")] + Coord3dAc32fPlanar = 123, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="124")] + Coord3dA8 = 124, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="125")] + Coord3dA10p = 125, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="126")] + Coord3dA12p = 126, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="127")] + Coord3dA16 = 127, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="128")] + Coord3dA32f = 128, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="129")] + Coord3dB8 = 129, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="130")] + Coord3dB10p = 130, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="131")] + Coord3dB12p = 131, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="132")] + Coord3dB16 = 132, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="133")] + Coord3dB32f = 133, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="134")] + Coord3dC8 = 134, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="135")] + Coord3dC10p = 135, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="136")] + Coord3dC12p = 136, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="137")] + Coord3dC16 = 137, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="138")] + Coord3dC32f = 138, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="139")] + Confidence1 = 139, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="140")] + Confidence1p = 140, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="141")] + Confidence8 = 141, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="142")] + Confidence16 = 142, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="143")] + Confidence32f = 143, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class Treadmill + { + + private string _deviceType = "treadmill"; + + private BaseModel _additionalSettings; - private string _calibrationDirectory = "Calibration\\Monitors\\"; + private TreadmillCalibration _calibration; - private string _textureAssetsDirectory = "Textures"; + private int _whoAmI = 1402; - private double _brightness = 0D; + private string _serialNumber; - private double _contrast = 1D; + private string _portName; - public Screen() + public Treadmill() { } - protected Screen(Screen other) + protected Treadmill(Treadmill other) { _deviceType = other._deviceType; _additionalSettings = other._additionalSettings; _calibration = other._calibration; - _displayIndex = other._displayIndex; - _targetRenderFrequency = other._targetRenderFrequency; - _targetUpdateFrequency = other._targetUpdateFrequency; - _calibrationDirectory = other._calibrationDirectory; - _textureAssetsDirectory = other._textureAssetsDirectory; - _brightness = other._brightness; - _contrast = other._contrast; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Device type - /// [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] public string DeviceType { get @@ -3135,13 +4799,9 @@ public BaseModel AdditionalSettings } } - /// - /// Calibration - /// [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + public TreadmillCalibration Calibration { get { @@ -3153,133 +4813,61 @@ public BaseModel Calibration } } - /// - /// Display index - /// - [Newtonsoft.Json.JsonPropertyAttribute("display_index")] - [System.ComponentModel.DescriptionAttribute("Display index")] - public int DisplayIndex - { - get - { - return _displayIndex; - } - set - { - _displayIndex = value; - } - } - - /// - /// Target render frequency - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] - [System.ComponentModel.DescriptionAttribute("Target render frequency")] - public double TargetRenderFrequency - { - get - { - return _targetRenderFrequency; - } - set - { - _targetRenderFrequency = value; - } - } - - /// - /// Target update frequency - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] - [System.ComponentModel.DescriptionAttribute("Target update frequency")] - public double TargetUpdateFrequency - { - get - { - return _targetUpdateFrequency; - } - set - { - _targetUpdateFrequency = value; - } - } - - /// - /// Calibration directory - /// - [Newtonsoft.Json.JsonPropertyAttribute("calibration_directory")] - [System.ComponentModel.DescriptionAttribute("Calibration directory")] - public string CalibrationDirectory - { - get - { - return _calibrationDirectory; - } - set - { - _calibrationDirectory = value; - } - } - - /// - /// Calibration directory - /// - [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] - [System.ComponentModel.DescriptionAttribute("Calibration directory")] - public string TextureAssetsDirectory + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _textureAssetsDirectory; + return _whoAmI; } set { - _textureAssetsDirectory = value; + _whoAmI = value; } } /// - /// Brightness + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("brightness")] - [System.ComponentModel.DescriptionAttribute("Brightness")] - public double Brightness + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _brightness; + return _serialNumber; } set { - _brightness = value; + _serialNumber = value; } } /// - /// Contrast + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("contrast")] - [System.ComponentModel.DescriptionAttribute("Contrast")] - public double Contrast + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _contrast; + return _portName; } set { - _contrast = value; + _portName = value; } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Screen(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Screen(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -3287,13 +4875,9 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("device_type = " + _deviceType + ", "); stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("display_index = " + _displayIndex + ", "); - stringBuilder.Append("target_render_frequency = " + _targetRenderFrequency + ", "); - stringBuilder.Append("target_update_frequency = " + _targetUpdateFrequency + ", "); - stringBuilder.Append("calibration_directory = " + _calibrationDirectory + ", "); - stringBuilder.Append("texture_assets_directory = " + _textureAssetsDirectory + ", "); - stringBuilder.Append("brightness = " + _brightness + ", "); - stringBuilder.Append("contrast = " + _contrast); + stringBuilder.Append("who_am_i = " + _whoAmI + ", "); + stringBuilder.Append("serial_number = " + _serialNumber + ", "); + stringBuilder.Append("port_name = " + _portName); return true; } @@ -3312,226 +4896,190 @@ public override string ToString() } + /// + /// Treadmill calibration class + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class SpinnakerCamera + public partial class TreadmillCalibration { - private string _deviceType = "SpinnakerCamera"; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private string _serialNumber; + private string _deviceName = "Treadmill"; - private int _binning = 1; + private TreadmillCalibrationInput _input = new TreadmillCalibrationInput(); - private SpinnakerCameraColorProcessing _colorProcessing = AindVrForagingDataSchema.Rig.SpinnakerCameraColorProcessing.Default; + private TreadmillCalibrationOutput _output = new TreadmillCalibrationOutput(); - private int _exposure = 1000; + private System.DateTimeOffset? _date; - private double _gain = 0D; + private string _description = "Calibration of the treadmill system"; - private VideoWriter _videoWriter; + private string _notes; - public SpinnakerCamera() + public TreadmillCalibration() { } - protected SpinnakerCamera(SpinnakerCamera other) + protected TreadmillCalibration(TreadmillCalibration other) { - _deviceType = other._deviceType; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _serialNumber = other._serialNumber; - _binning = other._binning; - _colorProcessing = other._colorProcessing; - _exposure = other._exposure; - _gain = other._gain; - _videoWriter = other._videoWriter; + _deviceName = other._deviceName; + _input = other._input; + _output = other._output; + _date = other._date; + _description = other._description; + _notes = other._notes; } /// - /// Device type + /// Must match a device name in rig/instrument /// - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] - public string DeviceType + [Newtonsoft.Json.JsonPropertyAttribute("device_name")] + [System.ComponentModel.DescriptionAttribute("Must match a device name in rig/instrument")] + public string DeviceName { get { - return _deviceType; + return _deviceName; } set { - _deviceType = value; + _deviceName = value; } } - /// - /// Additional settings - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] + public TreadmillCalibrationInput Input { get { - return _additionalSettings; + return _input; } set { - _additionalSettings = value; + _input = value; } } - /// - /// Calibration - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - /// - /// Camera serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Camera serial number")] - public string SerialNumber - { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Binning - /// - [Newtonsoft.Json.JsonPropertyAttribute("binning")] - [System.ComponentModel.DescriptionAttribute("Binning")] - public int Binning + [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] + public TreadmillCalibrationOutput Output { get { - return _binning; + return _output; } set { - _binning = value; + _output = value; } } - /// - /// Color processing - /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] - [System.ComponentModel.DescriptionAttribute("Color processing")] - public SpinnakerCameraColorProcessing ColorProcessing + [Newtonsoft.Json.JsonPropertyAttribute("date")] + public System.DateTimeOffset? Date { get { - return _colorProcessing; + return _date; } set { - _colorProcessing = value; + _date = value; } } - /// - /// Exposure time - /// - [Newtonsoft.Json.JsonPropertyAttribute("exposure")] - [System.ComponentModel.DescriptionAttribute("Exposure time")] - public int Exposure + [Newtonsoft.Json.JsonPropertyAttribute("description")] + public string Description { get { - return _exposure; + return _description; } set { - _exposure = value; + _description = value; } } - /// - /// Gain - /// - [Newtonsoft.Json.JsonPropertyAttribute("gain")] - [System.ComponentModel.DescriptionAttribute("Gain")] - public double Gain + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + public string Notes { get { - return _gain; + return _notes; } set { - _gain = value; + _notes = value; } } - /// - /// Video writer. If not provided, no video will be saved. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] - [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] - public VideoWriter VideoWriter + public System.IObservable Process() { - get - { - return _videoWriter; - } - set + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("device_name = " + _deviceName + ", "); + stringBuilder.Append("input = " + _input + ", "); + stringBuilder.Append("output = " + _output + ", "); + stringBuilder.Append("date = " + _date + ", "); + stringBuilder.Append("description = " + _description + ", "); + stringBuilder.Append("notes = " + _notes); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _videoWriter = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class TreadmillCalibrationInput + { + + public TreadmillCalibrationInput() + { } - public System.IObservable Process() + protected TreadmillCalibrationInput(TreadmillCalibrationInput other) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibrationInput(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibrationInput(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("device_type = " + _deviceType + ", "); - stringBuilder.Append("additional_settings = " + _additionalSettings + ", "); - stringBuilder.Append("calibration = " + _calibration + ", "); - stringBuilder.Append("serial_number = " + _serialNumber + ", "); - stringBuilder.Append("binning = " + _binning + ", "); - stringBuilder.Append("color_processing = " + _colorProcessing + ", "); - stringBuilder.Append("exposure = " + _exposure + ", "); - stringBuilder.Append("gain = " + _gain + ", "); - stringBuilder.Append("video_writer = " + _videoWriter); - return true; + return false; } public override string ToString() @@ -3549,15 +5097,10 @@ public override string ToString() } - /// - /// Overrides the default settings for the treadmill calibration by spec'ing brake_lookup_calibration field - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Overrides the default settings for the treadmill calibration by spec\'ing brake_lo" + - "okup_calibration field")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - public partial class Treadmill + public partial class TreadmillCalibrationOutput { private double _wheelDiameter = 15D; @@ -3568,11 +5111,11 @@ public partial class Treadmill private System.Collections.Generic.List> _brakeLookupCalibration = new System.Collections.Generic.List>(); - public Treadmill() + public TreadmillCalibrationOutput() { } - protected Treadmill(Treadmill other) + protected TreadmillCalibrationOutput(TreadmillCalibrationOutput other) { _wheelDiameter = other._wheelDiameter; _pulsesPerRevolution = other._pulsesPerRevolution; @@ -3632,12 +5175,12 @@ public bool InvertDirection } /// - /// Brake lookup calibration. Each Tuple is (0-1 (percent), 0-full-scale). Values are linearly interpolated + /// Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16]) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration")] - [System.ComponentModel.DescriptionAttribute("Brake lookup calibration. Each Tuple is (0-1 (percent), 0-full-scale). " + - " Values are linearly interpolated")] + [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Brake lookup calibration. Each pair of values define (input [torque], output [bra" + + "ke set-point U16])")] public System.Collections.Generic.List> BrakeLookupCalibration { get @@ -3650,14 +5193,14 @@ public System.Collections.Generic.List> } } - public System.IObservable Process() + public System.IObservable Process() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibrationOutput(this))); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibrationOutput(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -3684,6 +5227,113 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class Vector3 + { + + private double _x = 0D; + + private double _y = 0D; + + private double _z = 0D; + + public Vector3() + { + } + + protected Vector3(Vector3 other) + { + _x = other._x; + _y = other._y; + _z = other._z; + } + + /// + /// X coordinate of the point + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] + public double X + { + get + { + return _x; + } + set + { + _x = value; + } + } + + /// + /// Y coordinate of the point + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] + public double Y + { + get + { + return _y; + } + set + { + _y = value; + } + } + + /// + /// Z coordinate of the point + /// + [Newtonsoft.Json.JsonPropertyAttribute("z")] + [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] + public double Z + { + get + { + return _z; + } + set + { + _z = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Vector3(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Vector3(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("x = " + _x + ", "); + stringBuilder.Append("y = " + _y + ", "); + stringBuilder.Append("z = " + _z); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] @@ -3741,7 +5391,9 @@ public partial class VideoWriterFfmpeg : VideoWriter private string _containerExtension = "mp4"; - private string _outputArguments = "-c:v hevc_nvenc -pix_fmt x2rgb10le -color_range full -tune hq -preset p3 -rc vbr -cq 16 -rc-lookahead 56 -temporal-aq 1 -qmin 0 -qmax 10"; + private string _outputArguments = "-vf \"scale=out_color_matrix=bt709:out_range=full,format=bgr24,scale=out_range=full\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M"; + + private string _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; public VideoWriterFfmpeg() { @@ -3753,6 +5405,7 @@ protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : _frameRate = other._frameRate; _containerExtension = other._containerExtension; _outputArguments = other._outputArguments; + _inputArguments = other._inputArguments; } /// @@ -3806,6 +5459,23 @@ public string OutputArguments } } + /// + /// Input arguments + /// + [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] + [System.ComponentModel.DescriptionAttribute("Input arguments")] + public string InputArguments + { + get + { + return _inputArguments; + } + set + { + _inputArguments = value; + } + } + public System.IObservable Process() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); @@ -3824,7 +5494,8 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) } stringBuilder.Append("frame_rate = " + _frameRate + ", "); stringBuilder.Append("container_extension = " + _containerExtension + ", "); - stringBuilder.Append("output_arguments = " + _outputArguments); + stringBuilder.Append("output_arguments = " + _outputArguments + ", "); + stringBuilder.Append("input_arguments = " + _inputArguments); return true; } } @@ -4467,7 +6138,9 @@ public override string ToString() public partial class AindVrForagingRig { - private string _version = "0.3.0"; + private string _aindBehaviorServicesPkgVersion = "0.9.0"; + + private string _version = "0.4.0"; private string _computerName; @@ -4489,10 +6162,12 @@ public partial class AindVrForagingRig private HarpAnalogInput _harpAnalogInput; - private HarpTreadmill _harpTreadmill = new HarpTreadmill(); + private Treadmill _harpTreadmill = new Treadmill(); private HarpSniffDetector _harpSniffDetector; + private HarpEnvironmentSensor _harpEnvironmentSensor; + private AindManipulatorDevice _manipulator = new AindManipulatorDevice(); private Screen _screen; @@ -4505,6 +6180,7 @@ public AindVrForagingRig() protected AindVrForagingRig(AindVrForagingRig other) { + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; _version = other._version; _computerName = other._computerName; _rigName = other._rigName; @@ -4518,11 +6194,25 @@ protected AindVrForagingRig(AindVrForagingRig other) _harpAnalogInput = other._harpAnalogInput; _harpTreadmill = other._harpTreadmill; _harpSniffDetector = other._harpSniffDetector; + _harpEnvironmentSensor = other._harpEnvironmentSensor; _manipulator = other._manipulator; _screen = other._screen; _calibration = other._calibration; } + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + [Newtonsoft.Json.JsonPropertyAttribute("version")] public string Version { @@ -4720,7 +6410,7 @@ public HarpAnalogInput HarpAnalogInput [System.Xml.Serialization.XmlIgnoreAttribute()] [Newtonsoft.Json.JsonPropertyAttribute("harp_treadmill", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Harp treadmill")] - public HarpTreadmill HarpTreadmill + public Treadmill HarpTreadmill { get { @@ -4750,6 +6440,24 @@ public HarpSniffDetector HarpSniffDetector } } + /// + /// Environment sensor + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_environment_sensor")] + [System.ComponentModel.DescriptionAttribute("Environment sensor")] + public HarpEnvironmentSensor HarpEnvironmentSensor + { + get + { + return _harpEnvironmentSensor; + } + set + { + _harpEnvironmentSensor = value; + } + } + /// /// Manipulator /// @@ -4816,6 +6524,7 @@ public System.IObservable Process(System.IObservable protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { + stringBuilder.Append("aind_behavior_services_pkg_version = " + _aindBehaviorServicesPkgVersion + ", "); stringBuilder.Append("version = " + _version + ", "); stringBuilder.Append("computer_name = " + _computerName + ", "); stringBuilder.Append("rig_name = " + _rigName + ", "); @@ -4829,6 +6538,7 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("harp_analog_input = " + _harpAnalogInput + ", "); stringBuilder.Append("harp_treadmill = " + _harpTreadmill + ", "); stringBuilder.Append("harp_sniff_detector = " + _harpSniffDetector + ", "); + stringBuilder.Append("harp_environment_sensor = " + _harpEnvironmentSensor + ", "); stringBuilder.Append("manipulator = " + _manipulator + ", "); stringBuilder.Append("screen = " + _screen + ", "); stringBuilder.Append("calibration = " + _calibration); @@ -5113,6 +6823,31 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -5128,6 +6863,11 @@ public System.IObservable Process(System.IObservable return Process(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -5143,11 +6883,6 @@ public System.IObservable Process(System.IObservable return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -5178,6 +6913,11 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -5198,6 +6938,26 @@ public System.IObservable Process(System.IObservable source) return Process(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -5256,23 +7016,33 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] diff --git a/src/Extensions/AindVrForagingTaskLogic.cs b/src/Extensions/AindVrForagingTaskLogic.cs index 1b932652..d512fc2d 100644 --- a/src/Extensions/AindVrForagingTaskLogic.cs +++ b/src/Extensions/AindVrForagingTaskLogic.cs @@ -17,9 +17,11 @@ public partial class AindVrForagingTaskParameters private double? _rngSeed; + private string _aindBehaviorServicesPkgVersion = "0.9.0"; + private System.Collections.Generic.IDictionary _updaters; - private EnvironmentStatistics _environmentStatistics = new EnvironmentStatistics(); + private BlockStructure _environment = new BlockStructure(); private TaskModeSettings _taskModeSettings; @@ -32,8 +34,9 @@ public AindVrForagingTaskParameters() protected AindVrForagingTaskParameters(AindVrForagingTaskParameters other) { _rngSeed = other._rngSeed; + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; _updaters = other._updaters; - _environmentStatistics = other._environmentStatistics; + _environment = other._environment; _taskModeSettings = other._taskModeSettings; _operationControl = other._operationControl; } @@ -56,6 +59,19 @@ public double? RngSeed } } + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion + { + get + { + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; + } + } + /// /// List of numerical updaters /// @@ -78,17 +94,17 @@ public System.Collections.Generic.IDictionary Updaters /// Statistics of the environment /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("environment_statistics", Required=Newtonsoft.Json.Required.Always)] + [Newtonsoft.Json.JsonPropertyAttribute("environment", Required=Newtonsoft.Json.Required.Always)] [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] - public EnvironmentStatistics EnvironmentStatistics + public BlockStructure Environment { get { - return _environmentStatistics; + return _environment; } set { - _environmentStatistics = value; + _environment = value; } } @@ -141,8 +157,9 @@ public System.IObservable Process(System. protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("rng_seed = " + _rngSeed + ", "); + stringBuilder.Append("aind_behavior_services_pkg_version = " + _aindBehaviorServicesPkgVersion + ", "); stringBuilder.Append("updaters = " + _updaters + ", "); - stringBuilder.Append("environment_statistics = " + _environmentStatistics + ", "); + stringBuilder.Append("environment = " + _environment + ", "); stringBuilder.Append("task_mode_settings = " + _taskModeSettings + ", "); stringBuilder.Append("operation_control = " + _operationControl); return true; @@ -659,6 +676,522 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class Block + { + + private EnvironmentStatistics _environmentStatistics = new EnvironmentStatistics(); + + private System.Collections.Generic.List _endConditions = new System.Collections.Generic.List(); + + public Block() + { + } + + protected Block(Block other) + { + _environmentStatistics = other._environmentStatistics; + _endConditions = other._endConditions; + } + + /// + /// Statistics of the environment + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("environment_statistics", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] + public EnvironmentStatistics EnvironmentStatistics + { + get + { + return _environmentStatistics; + } + set + { + _environmentStatistics = value; + } + } + + /// + /// List of end conditions that must be true for the block to end. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("end_conditions")] + [System.ComponentModel.DescriptionAttribute("List of end conditions that must be true for the block to end.")] + public System.Collections.Generic.List EndConditions + { + get + { + return _endConditions; + } + set + { + _endConditions = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Block(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Block(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("environment_statistics = " + _environmentStatistics + ", "); + stringBuilder.Append("end_conditions = " + _endConditions); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "condition_type")] + [JsonInheritanceAttribute("Duration", typeof(BlockEndConditionDuration))] + [JsonInheritanceAttribute("Distance", typeof(BlockEndConditionDistance))] + [JsonInheritanceAttribute("Choice", typeof(BlockEndConditionChoice))] + [JsonInheritanceAttribute("Reward", typeof(BlockEndConditionReward))] + [JsonInheritanceAttribute("PatchCount", typeof(BlockEndConditionPatchCount))] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockEndCondition + { + + public BlockEndCondition() + { + } + + protected BlockEndCondition(BlockEndCondition other) + { + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndCondition(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndCondition(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + return false; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockEndConditionChoice : BlockEndCondition + { + + private Distribution _value; + + public BlockEndConditionChoice() + { + } + + protected BlockEndConditionChoice(BlockEndConditionChoice other) : + base(other) + { + _value = other._value; + } + + /// + /// Number of choices after which the block ends. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of choices after which the block ends.")] + public Distribution Value + { + get + { + return _value; + } + set + { + _value = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionChoice(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionChoice(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("value = " + _value); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockEndConditionDistance : BlockEndCondition + { + + private Distribution _value; + + public BlockEndConditionDistance() + { + } + + protected BlockEndConditionDistance(BlockEndConditionDistance other) : + base(other) + { + _value = other._value; + } + + /// + /// Distance after which the block ends. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Distance after which the block ends.")] + public Distribution Value + { + get + { + return _value; + } + set + { + _value = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDistance(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDistance(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("value = " + _value); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockEndConditionDuration : BlockEndCondition + { + + private Distribution _value; + + public BlockEndConditionDuration() + { + } + + protected BlockEndConditionDuration(BlockEndConditionDuration other) : + base(other) + { + _value = other._value; + } + + /// + /// Time after which the block ends. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Time after which the block ends.")] + public Distribution Value + { + get + { + return _value; + } + set + { + _value = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDuration(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDuration(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("value = " + _value); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockEndConditionPatchCount : BlockEndCondition + { + + private Distribution _value; + + public BlockEndConditionPatchCount() + { + } + + protected BlockEndConditionPatchCount(BlockEndConditionPatchCount other) : + base(other) + { + _value = other._value; + } + + /// + /// Number of patches after which the block will end. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of patches after which the block will end.")] + public Distribution Value + { + get + { + return _value; + } + set + { + _value = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionPatchCount(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionPatchCount(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("value = " + _value); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockEndConditionReward : BlockEndCondition + { + + private Distribution _value; + + public BlockEndConditionReward() + { + } + + protected BlockEndConditionReward(BlockEndConditionReward other) : + base(other) + { + _value = other._value; + } + + /// + /// Number of rewards after which the block ends. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of rewards after which the block ends.")] + public Distribution Value + { + get + { + return _value; + } + set + { + _value = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionReward(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionReward(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("value = " + _value); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class BlockStructure + { + + private System.Collections.Generic.List _blocks = new System.Collections.Generic.List(); + + private BlockStructureSamplingMode _samplingMode = AindVrForagingDataSchema.TaskLogic.BlockStructureSamplingMode.Sequential; + + public BlockStructure() + { + } + + protected BlockStructure(BlockStructure other) + { + _blocks = other._blocks; + _samplingMode = other._samplingMode; + } + + /// + /// Statistics of the environment + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("blocks", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] + public System.Collections.Generic.List Blocks + { + get + { + return _blocks; + } + set + { + _blocks = value; + } + } + + /// + /// Sampling mode of the blocks. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("sampling_mode")] + [System.ComponentModel.DescriptionAttribute("Sampling mode of the blocks.")] + public BlockStructureSamplingMode SamplingMode + { + get + { + return _samplingMode; + } + set + { + _samplingMode = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockStructure(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new BlockStructure(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("blocks = " + _blocks + ", "); + stringBuilder.Append("sampling_mode = " + _samplingMode); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] @@ -811,9 +1344,6 @@ public enum DepletionRule } - /// - /// Available distributions - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] [JsonInheritanceAttribute("Scalar", typeof(Scalar))] @@ -825,7 +1355,7 @@ public enum DepletionRule [JsonInheritanceAttribute("Binomial", typeof(BinomialDistribution))] [JsonInheritanceAttribute("Beta", typeof(BetaDistribution))] [JsonInheritanceAttribute("Gamma", typeof(GammaDistribution))] - [System.ComponentModel.DescriptionAttribute("Available distributions")] + [JsonInheritanceAttribute("Pdf", typeof(PdfDistribution))] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] public partial class Distribution @@ -1487,7 +2017,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) public partial class LinearFunction : RewardFunction { - private double _mininum = 0D; + private double _minimum = 0D; private double _maximum = 9999D; @@ -1502,7 +2032,7 @@ public LinearFunction() protected LinearFunction(LinearFunction other) : base(other) { - _mininum = other._mininum; + _minimum = other._minimum; _maximum = other._maximum; _a = other._a; _b = other._b; @@ -1511,17 +2041,17 @@ protected LinearFunction(LinearFunction other) : /// /// Minimum value of the function /// - [Newtonsoft.Json.JsonPropertyAttribute("mininum")] + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] [System.ComponentModel.DescriptionAttribute("Minimum value of the function")] - public double Mininum + public double Minimum { get { - return _mininum; + return _minimum; } set { - _mininum = value; + _minimum = value; } } @@ -1592,7 +2122,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("mininum = " + _mininum + ", "); + stringBuilder.Append("minimum = " + _minimum + ", "); stringBuilder.Append("maximum = " + _maximum + ", "); stringBuilder.Append("a = " + _a + ", "); stringBuilder.Append("b = " + _b); @@ -1806,6 +2336,86 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class LookupTableFunction : RewardFunction + { + + private System.Collections.Generic.List _lutKeys = new System.Collections.Generic.List(); + + private System.Collections.Generic.List _lutValues = new System.Collections.Generic.List(); + + public LookupTableFunction() + { + } + + protected LookupTableFunction(LookupTableFunction other) : + base(other) + { + _lutKeys = other._lutKeys; + _lutValues = other._lutValues; + } + + /// + /// List of keys of the lookup table + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("lut_keys", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("List of keys of the lookup table")] + public System.Collections.Generic.List LutKeys + { + get + { + return _lutKeys; + } + set + { + _lutKeys = value; + } + } + + /// + /// List of values of the lookup table + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("lut_values", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("List of values of the lookup table")] + public System.Collections.Generic.List LutValues + { + get + { + return _lutValues; + } + set + { + _lutValues = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LookupTableFunction(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new LookupTableFunction(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("lut_keys = " + _lutKeys + ", "); + stringBuilder.Append("lut_values = " + _lutValues); + return true; + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] @@ -3136,6 +3746,213 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class PdfDistribution : Distribution + { + + private PdfDistributionParameters _distributionParameters; + + private TruncationParameters _truncationParameters; + + private ScalingParameters _scalingParameters; + + public PdfDistribution() + { + } + + protected PdfDistribution(PdfDistribution other) : + base(other) + { + _distributionParameters = other._distributionParameters; + _truncationParameters = other._truncationParameters; + _scalingParameters = other._scalingParameters; + } + + /// + /// Parameters of the distribution + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] + [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] + public PdfDistributionParameters DistributionParameters + { + get + { + return _distributionParameters; + } + set + { + _distributionParameters = value; + } + } + + /// + /// Truncation parameters of the distribution + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] + [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] + public TruncationParameters TruncationParameters + { + get + { + return _truncationParameters; + } + set + { + _truncationParameters = value; + } + } + + /// + /// Scaling parameters of the distribution + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] + [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] + public ScalingParameters ScalingParameters + { + get + { + return _scalingParameters; + } + set + { + _scalingParameters = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PdfDistribution(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PdfDistribution(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("distribution_parameters = " + _distributionParameters + ", "); + stringBuilder.Append("truncation_parameters = " + _truncationParameters + ", "); + stringBuilder.Append("scaling_parameters = " + _scalingParameters); + return true; + } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.CombinatorAttribute()] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + public partial class PdfDistributionParameters + { + + private string _family = "Pdf"; + + private System.Collections.Generic.List _pdf = new System.Collections.Generic.List(); + + private System.Collections.Generic.List _index = new System.Collections.Generic.List(); + + public PdfDistributionParameters() + { + } + + protected PdfDistributionParameters(PdfDistributionParameters other) + { + _family = other._family; + _pdf = other._pdf; + _index = other._index; + } + + [Newtonsoft.Json.JsonPropertyAttribute("family")] + public string Family + { + get + { + return _family; + } + set + { + _family = value; + } + } + + /// + /// The probability density function + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("pdf")] + [System.ComponentModel.DescriptionAttribute("The probability density function")] + public System.Collections.Generic.List Pdf + { + get + { + return _pdf; + } + set + { + _pdf = value; + } + } + + /// + /// The index of the probability density function + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("index")] + [System.ComponentModel.DescriptionAttribute("The index of the probability density function")] + public System.Collections.Generic.List Index + { + get + { + return _index; + } + set + { + _index = value; + } + } + + public System.IObservable Process() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PdfDistributionParameters(this))); + } + + public System.IObservable Process(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PdfDistributionParameters(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("family = " + _family + ", "); + stringBuilder.Append("pdf = " + _pdf + ", "); + stringBuilder.Append("index = " + _index); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(" "); + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] @@ -3457,7 +4274,7 @@ public override string ToString() public partial class PowerFunction : RewardFunction { - private double _mininum = 0D; + private double _minimum = 0D; private double _maximum = 1D; @@ -3476,7 +4293,7 @@ public PowerFunction() protected PowerFunction(PowerFunction other) : base(other) { - _mininum = other._mininum; + _minimum = other._minimum; _maximum = other._maximum; _a = other._a; _b = other._b; @@ -3487,17 +4304,17 @@ protected PowerFunction(PowerFunction other) : /// /// Minimum value of the function /// - [Newtonsoft.Json.JsonPropertyAttribute("mininum")] + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] [System.ComponentModel.DescriptionAttribute("Minimum value of the function")] - public double Mininum + public double Minimum { get { - return _mininum; + return _minimum; } set { - _mininum = value; + _minimum = value; } } @@ -3602,7 +4419,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("mininum = " + _mininum + ", "); + stringBuilder.Append("minimum = " + _minimum + ", "); stringBuilder.Append("maximum = " + _maximum + ", "); stringBuilder.Append("a = " + _a + ", "); stringBuilder.Append("b = " + _b + ", "); @@ -3684,6 +4501,7 @@ public override string ToString() [JsonInheritanceAttribute("ConstantFunction", typeof(ConstantFunction))] [JsonInheritanceAttribute("LinearFunction", typeof(LinearFunction))] [JsonInheritanceAttribute("PowerFunction", typeof(PowerFunction))] + [JsonInheritanceAttribute("LookupTableFunction", typeof(LookupTableFunction))] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] public partial class RewardFunction @@ -5603,7 +6421,7 @@ public partial class AindVrForagingTaskLogic private AindVrForagingTaskParameters _taskParameters = new AindVrForagingTaskParameters(); - private string _version = "0.4.0"; + private string _version = "0.5.0"; private string _stageName; @@ -5737,6 +6555,19 @@ public override string ToString() } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum BlockStructureSamplingMode + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Random")] + Random = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Sequential")] + Sequential = 1, + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.CombinatorAttribute()] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] @@ -5962,6 +6793,50 @@ private string GetSubtypeDiscriminator(System.Type objectType) } } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DefaultPropertyAttribute("Type")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchBlockEndCondition : Bonsai.Expressions.SingleArgumentExpressionBuilder + { + + public Bonsai.Expressions.TypeMapping Type { get; set; } + + public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + { + var typeMapping = Type; + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(BlockEndCondition); + return System.Linq.Expressions.Expression.Call( + typeof(MatchBlockEndCondition), + "Process", + new System.Type[] { returnType }, + System.Linq.Enumerable.Single(arguments)); + } + + + private static System.IObservable Process(System.IObservable source) + where TResult : BlockEndCondition + { + return System.Reactive.Linq.Observable.Create(observer => + { + var sourceObserver = System.Reactive.Observer.Create( + value => + { + var match = value as TResult; + if (match != null) observer.OnNext(match); + }, + observer.OnError, + observer.OnCompleted); + return System.ObservableExtensions.SubscribeSafe(source, sourceObserver); + }); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.3.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] @@ -5974,6 +6849,7 @@ private string GetSubtypeDiscriminator(System.Type objectType) [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class MatchDistribution : Bonsai.Expressions.SingleArgumentExpressionBuilder { @@ -6016,6 +6892,7 @@ private static System.IObservable Process(System.IObservable))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] public partial class MatchRewardFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder { @@ -6139,6 +7016,46 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -6204,6 +7121,11 @@ public System.IObservable Process(System.IObservable(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -6259,6 +7181,16 @@ public System.IObservable Process(System.IObservable so return Process(source); } + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + + public System.IObservable Process(System.IObservable source) + { + return Process(source); + } + public System.IObservable Process(System.IObservable source) { return Process(source); @@ -6404,6 +7336,14 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -6417,6 +7357,7 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -6428,6 +7369,8 @@ public System.IObservable Process(System.IObservable [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] diff --git a/src/Extensions/ApplyRewardFunction.cs b/src/Extensions/ApplyRewardFunction.cs index 56effa93..a0bda745 100644 --- a/src/Extensions/ApplyRewardFunction.cs +++ b/src/Extensions/ApplyRewardFunction.cs @@ -1,8 +1,10 @@ using Bonsai; using System; +using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reactive.Linq; +using MathNet.Numerics.Interpolation; namespace AindVrForagingDataSchema.TaskLogic { @@ -24,7 +26,7 @@ public override double Invoke(double value){ } public override double Clamp(double value){ - return Math.Min(Math.Max(value, Mininum), Maximum); + return Math.Min(Math.Max(value, Minimum), Maximum); } } @@ -34,7 +36,7 @@ public override double Invoke(double value){ } public override double Clamp(double value){ - return Math.Min(Math.Max(value, Mininum), Maximum); + return Math.Min(Math.Max(value, Minimum), Maximum); } } @@ -48,6 +50,31 @@ public override double Clamp(double value){ } } + partial class LookupTableFunction{ + + + private Dictionary LookupTable(){ + return LutKeys.Zip(LutValues, (key, value) => new { Key = key, Value = value }) + .ToDictionary(x => x.Key, x => x.Value); + } + + public override double Invoke(double value){ + Dictionary Table = LookupTable(); + if (value > Table.Keys.Max()){ + return Table[Table.Keys.Max()]; + } + if (value < Table.Keys.Min()){ + return Table[Table.Keys.Min()]; + } + IInterpolation interpolation = MathNet.Numerics.Interpolate.Linear(Table.Keys, Table.Values); + return interpolation.Interpolate(value); + } + + public override double Clamp(double value){ + return value; + } + } + [Combinator] [Description("Applies a reward function to the input data.")] diff --git a/src/Extensions/CorridorFactory.bonsai b/src/Extensions/CorridorFactory.bonsai new file mode 100644 index 00000000..7815ee1b --- /dev/null +++ b/src/Extensions/CorridorFactory.bonsai @@ -0,0 +1,567 @@ + + + + + + + + + + 120 + + + + + 1 + + + + VisualCorridorLength + + + + + + + 40 + + + + + 1 + + + + CorridorWidth + + + + + + + 30 + + + + + 1 + + + + CorridorHeight + + + DefineTextures + + + + + 40 + 40 + + + + + + + + + + Floor + + + + + + + + + + 40 + 40 + + + + + + + + + + Ceiling + + + + + + + + + + 40 + 40 + + + + + + + + + + LeftWall + + + + + + + + + + 40 + 40 + + + + + + + + + + RightWall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + TextureDefinition + + + Initialize + + + + TaskLogicParameters + + + OperationControl.PositionControl.InitialPosition + + + Z + + + + 1 + + + + InitPosition + + + FarClipHorizon + + + InitPosition + + + + + + + VisualCorridorLength + + + + + + + + + 120 + + + + Math.Ceiling(it) + + + + 1 + + + + Range + + + + Source1 + + + + 1 + + + + Count + + + InitPosition + + + + 1 + + + + + + + + + Count + + + + + + + + + -1 + 9 + + + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + Update + + + + CurrentPosition + + + Value + + + MaxPosition + + + + + + + + + Source1 + + + Item1.Z,Item2.Z + + + + + + + + + + + + + Item1.Z + + + FarClipHorizon + + + + + + + + + 1000 + + + + SigmaZ + + + + + + + + + 0 + + + + VisualCorridorLength + + + + + + + + + 120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VisualCorridorLength + + + + + + + + + 120 + + + + + + + new( +Item1 as Id, +Item2 as Start +) + + + + + + + + + + VisualCorridorLength + + + + + + + + CorridorWidth + + + + + + + + CorridorHeight + + + + + + + + TextureDefinition + + + + + + + + 0 + 0 + 120 + 0 + 0 + + + VisualCorridorSpecs + + + + VisualCorridorSpecs + + + + + + + + VisualCorridorSpecs + + + + VisualCorridorSpecs + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/DisplayCalibration.bonsai b/src/Extensions/DisplayCalibration.bonsai new file mode 100644 index 00000000..e30ca2fc --- /dev/null +++ b/src/Extensions/DisplayCalibration.bonsai @@ -0,0 +1,119 @@ + + + + + + Source1 + + + DisplayCalibration + + + + Source1 + + + + 1 + + + + this + + + this + + + Extrinsics.Rotation + + + + + + + + + + + 0 + 0 + 0 + + + + this + + + Extrinsics.Translation + + + + + + + + + + + 0 + 0 + 0 + + + + this + + + Intrinsics.DisplayWidth + + + this + + + Intrinsics.DisplayHeight + + + + + + new( +Item1 as Rotation, +Item2 as Translation, +Item3 as DisplayWidth, +Item4 as DisplayHeight) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HarpBehaviorDevice.bonsai b/src/Extensions/HarpBehaviorDevice.bonsai index 992a8ccb..f926ff84 100644 --- a/src/Extensions/HarpBehaviorDevice.bonsai +++ b/src/Extensions/HarpBehaviorDevice.bonsai @@ -1,5 +1,5 @@  - - - - COM5 - StartExperiment + TriggerHarpReadDump @@ -98,22 +95,21 @@ - - - + + + - - - - - + + + + + - - - - - + + + + \ No newline at end of file diff --git a/src/Extensions/Logging.bonsai b/src/Extensions/Logging.bonsai new file mode 100644 index 00000000..1adbcd1f --- /dev/null +++ b/src/Extensions/Logging.bonsai @@ -0,0 +1,1444 @@ + + + + + + Logging + + + + Behavior + + + + + + + Modality + Behavior + + + + 1 + + + + Modality + + + HarpLogging + + + + HarpBehaviorEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + Behavior + Behavior + + + StepperDriverEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + StepperDriver + StepperDriver + + + HarpOlfactometerEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + Olfactometer + Olfactometer + + + HarpLickometerEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + Lickometer + LicketySplit + + + HarpTreadmillEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + Treadmill + Treadmill + + + HarpSniffDetectorEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + SniffDetector + SniffDetector + + + HarpClockGenEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + ClockGenerator + TimestampGeneratorGen3 + + + HarpAnalogInputEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + AnalogInput + AnalogInput + + + HarpEnvironmentSensorEvents + + + Modality + + + + + + + + LoggingRootPath + Behavior + EnvironmentSensor + EnvironmentSensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HarpCommandsLogging + + + + HarpTimestampSource + + + + Timestamp + false + + + + HarpSeconds + + + HarpBehaviorCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/Behavior + Behavior + + + HarpOlfactometerCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/Olfactometer + Olfactometer + + + HarpAnalogInputCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/AnalogInput + AnalogInput + + + HarpLickometerCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/Lickometer + LicketySplit + + + HarpTreadmillCommands + + + HarpSeconds + + + + + + + + + + + + LoggingRootPath + Behavior + HarpCommands/Treadmill + Treadmill + + + HarpSniffDetectorCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/SniffDetector + SniffDetector + + + HarpClockGenCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/ClockGenerator + TimestampGeneratorGen3 + + + StepperDriverCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/StepperDriver + StepperDriver + + + HarpEnvironmentSensorCommands + + + HarpSeconds + + + + + + + + + + + + Modality + + + + + + + + LoggingRootPath + Behavior + HarpCommands/EnvironmentSensor + EnvironmentSensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Render + + + + RendererSynchState + + + Label + new( +it.FrameIndex.Value as FrameIndex, +it.FrameTimestamp.Value as FrameTimestamp, +it.SyncQuadValue.Value as SyncQuadValue) + + + Modality + + + + + + + + LoggingRootPath + + RendererSynchState + Renderer + + + + + + + + + + + + SoftwareEvents + + + + SoftwareEvent + + + + TaskPoolScheduler + + + + RendererSynchState + + + + TaskPoolScheduler + + + + + + + + + + HarpTimestampSource + + + + TaskPoolScheduler + + + + + + + + + + + + + Modality + + + + + + + + SoftwareEvents + LoggingRootPath + + + + + UpdaterEvents + + + + TaskPoolScheduler + + + + RendererSynchState + + + + TaskPoolScheduler + + + + + + + + + + HarpTimestampSource + + + + TaskPoolScheduler + + + + + + + + + + + + + Modality + + + + + + + + UpdaterEvents + LoggingRootPath + + + + Annotations + + + + Annotations + + + + + TaskPoolScheduler + + + + RendererSynchState + + + + TaskPoolScheduler + + + + + + + + + + HarpTimestampSource + + + + TaskPoolScheduler + + + + + + + + + + + + + Modality + + + + + + + + Annotations + LoggingRootPath + + + + Metadata + + + + Repository + + + + false + + + + + RepositoryStatus + + + + SoftwareEvent + + + RngSeedValue + + + + RngSeed + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OperationControl + + + + CurrentPosition + + + Seconds,Value.Z + + + new( +Item1 as Seconds, +Item2 as Position) + + + LogCsv + + + + Source1 + + + Modality + + + + + + + + LoggingRootPath + + CurrentPosition + OperationControl + + + + + + + + + + + + + TreadmillFriction + + + HarpTimestampSource + + + + Timestamp + false + + + + + + + + + + new( +Seconds as Seconds, +Value as Torque) + + + LogCsv + + + + Source1 + + + Modality + + + + + + + + LoggingRootPath + + Torque + OperationControl + + + + + + + + + + + + + IsStopped + + + new( +Seconds as Seconds, +Value as IsStopped) + + + LogCsv + + + + Source1 + + + Modality + + + + + + + + LoggingRootPath + + IsStopped + OperationControl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logs + + + + + Logs + + + + + 1 + + + + DeviceName + + + ConfigSchemaLogging + + + + SubjectSchema + + + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + + session_output + + + TaskLogicSchema + + + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + tasklogic_output + + + RigSchema + + + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + rig_output + + + RawRigSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + rig_input + json + + + RawSessionSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + session_input + json + + + RawTaskLogicSchema + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + Config + tasklogic_input + json + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logs + + + + EndExperiment + + + + ExperimentCompleted + + + + + SoftwareEvent + + + + HarpTimestampSource + + + + + + + + + + + + + + + Modality + + + + + + + + DeviceName + + + + + + + + LoggingRootPath + + + endsession + + + RuntimeLogging + + + + TaskPoolScheduler + + + + RendererSynchState + + + + TaskPoolScheduler + + + + + + + + + + HarpTimestampSource + + + + TaskPoolScheduler + + + + + + + + + + + + + Modality + + + + + + + + DeviceName + + + + RuntimeLogging + + + + + 1 + + + + + + + {0}/{1} + Item1,Item2 + + + + + + + + RuntimeLogging + LoggingRootPath + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BehaviorVideos + + + + + + + Modality + BehaviorVideos + + + + 1 + + + + Modality + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/ModifyManipulatorPosition.cs b/src/Extensions/ModifyManipulatorPosition.cs new file mode 100644 index 00000000..738c6d1f --- /dev/null +++ b/src/Extensions/ModifyManipulatorPosition.cs @@ -0,0 +1,27 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using AllenNeuralDynamics.AindManipulator; + +[Combinator] +[Description("Modifies a single axis of the ManipulatorPosition object given a specified value.")] +[WorkflowElementCategory(ElementCategory.Transform)] +public class ModifyManipulatorPosition +{ + public Axis Axis { get; set; } + public IObservable Process(IObservable> source) + { + return source.Select(value => { + var newPosition = new ManipulatorPosition(){ + X = value.Item1.X, + Y1 = value.Item1.Y1, + Y2 = value.Item1.Y2, + Z = value.Item1.Z + }; + newPosition[Axis] = value.Item2; + return newPosition; + }); + } +} diff --git a/src/Extensions/PatchFactory.bonsai b/src/Extensions/PatchFactory.bonsai new file mode 100644 index 00000000..63868083 --- /dev/null +++ b/src/Extensions/PatchFactory.bonsai @@ -0,0 +1,63 @@ + + + + + + TransitionMatrix + + + DepletionVariable + + + PatchStatistics + + + PatchRewardProbability + + + PatchRewardAmount + + + PatchRewardAvailable + + + ActivePatch + + + SiteSpecs + + + SiteSpecs + + + + + + + ActiveSite + + + + ActiveSite + + + + SoftwareEvent + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/PatchTransitionLogic.bonsai b/src/Extensions/PatchTransitionLogic.bonsai new file mode 100644 index 00000000..42ce0682 --- /dev/null +++ b/src/Extensions/PatchTransitionLogic.bonsai @@ -0,0 +1,775 @@ + + + + + + CurrentBlock + + + EnvironmentStatistics.FirstStateOccupancy + + + TransitionMatrix + + + + + + + + + ActiveStateIndex + + + ActiveStateIndex + + + UpdateState + + + + Source1 + + + + 1 + + + + PatchIndex + + + + 0 + + + + + 1 + + + + DepletionVariable + + + PatchStatistics + + + PatchIndex + + + + + + + + + 0 + + + + + 1 + + + + ThisPatch + + + ThisPatch + + + RewardSpecification + + + it != null + + + + 1 + + + + HasRewardSpec + + + DetermineDepletionRule + + + + ThisPatch + + + + 1 + + + + RewardSpecification.RewardFunction.DepletionRule + + + OnChoice + + + + Source1 + + + + + + + OnChoice + + + + + + + + + + + + + OnChoice + + + + HotChoiceFeedback + + + + 1 + + + + + + 1 + + + + single(it) + + + + + + + + + + + + + + OnReward + + + + Source1 + + + + + + + OnReward + + + + + + + + + + + + + OnReward + + + + HotGiveReward + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + + 1 + + + + + single(it) + + + + + + + + + + + + + + OnTime + + + + Source1 + + + + + + + OnTime + + + + + + + + + + + + + OnTime + + + + + + + TimeStep.ElapsedRealTime + + + + + + + + PT0S + PT1S + + + + + + + single(it) + + + + + + + + + + + + + + + + OnDistance + + + + Source1 + + + + + + + OnDistance + + + + + + + + + + + + + OnDistance + + + + CurrentPosition + + + Value.Z + + + CurrentPosition + + + Value.Z + + + + 1 + + + + + + + + + + + + PT0S + PT1S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DepletionVariable + + + + + + + + + + + + + + + + + + + + + + + + HasRewardSpec + + + + + + Source1 + + + + + + + + + + + + + DefaultTo0 + + + + HasRewardSpec + + + + + + + Source1 + + + + + + + + + + + 0 + + + + DepletionVariable + + + + + + + + + + + + + + + + + + + DetermineRewardSpecs + + + + DepletionVariable + + + ThisPatch + + + RewardSpecification.RewardFunction + + + Available + + + + + + + true + 0 + + + + PatchRewardAvailable + + + DepletionVariable + + + ThisPatch + + + RewardSpecification.RewardFunction + + + Amount + + + + + + + true + 0 + + + + PatchRewardAmount + + + DepletionVariable + + + ThisPatch + + + RewardSpecification.RewardFunction + + + Probability + + + + + + + true + 0 + + + + PatchRewardProbability + + + + + + + + + + + + + + + + + + + + + + + + + + HasRewardSpec + + + + + + Source1 + + + + + + + + + + + + + DefaultTo0 + + + + HasRewardSpec + + + + + + + Source1 + + + + + + + + + + + 0 + + + + PatchRewardAvailable + + + PatchRewardAmount + + + PatchRewardProbability + + + + + + + + + + + + + + + + + + + + + ThisPatch + + + ActivePatch + + + DepletionVariable + + + + DepletionVariable + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ActivePatch + + + + ActivePatch + + + + SoftwareEvent + + + PatchRewardAvailable + + + + PatchRewardAvailable + + + + SoftwareEvent + + + PatchRewardAmount + + + + PatchRewardAmount + + + + SoftwareEvent + + + PatchRewardProbability + + + + PatchRewardProbability + + + + SoftwareEvent + + + DepletionVariable + + + + DepletionVariable + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/SampleDistribution.cs b/src/Extensions/SampleDistribution.cs index 9d5a94f6..2ed7e010 100644 --- a/src/Extensions/SampleDistribution.cs +++ b/src/Extensions/SampleDistribution.cs @@ -107,6 +107,28 @@ private void ValidateTruncationParameters(TruncationParameters truncationParamet } } + partial class PdfDistribution{ + public override double SampleDistribution(Random random){ + var pdf = DistributionParameters.Pdf; + var index = DistributionParameters.Index; + if (pdf.Count != index.Count) + { + throw new ArgumentException("Pdf and Index must have the same length."); + } + var pdf_normalized = pdf.Select(x => x / pdf.Sum()).ToArray(); + var coin = random.NextDouble(); + double sum = 0; + for (int i = 0; i < pdf_normalized.Length; i++) + { + sum += pdf_normalized[i]; + if (coin < sum) + { + return index[i]; + } + } + return index.Last(); + } + } partial class Scalar{ public override double SampleDistribution(Random random){ diff --git a/src/Extensions/SolveBlockTransitions.bonsai b/src/Extensions/SolveBlockTransitions.bonsai new file mode 100644 index 00000000..16044a1d --- /dev/null +++ b/src/Extensions/SolveBlockTransitions.bonsai @@ -0,0 +1,749 @@ + + + + + + Source1 + + + BlockTransitionLogic + + + + Source1 + + + + 1 + + + + BlockStructure + + + BlockStructure + + + Blocks + + + Blocks + + + BlockStructure + + + RandomizeBlocks + + + + Source1 + + + + 1 + + + + Random + + + + Source1 + + + SamplingMode + + + + + + + Random + + + + + + + + + + + + + + Blocks + + + + + + RngSeed + + + + + + Sequential + + + + Source1 + + + SamplingMode + + + + + + + Sequential + + + + + + + + + + + + + + Blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BlockTransitionLogic + + + + Source1 + + + + 1 + + + + ThisBlock + + + ThisBlock + + + CurrentBlock + + + ThisBlock + + + EndConditions + + + + + + + + + OnDuration + + + + Source1 + + + + 1 + + + + This + + + This + + + HarpTimestampSource + + + + Timestamp + false + + + + + + + Item2 + + + + 1 + + + + EntryTime + + + EvaluateBlockEndConditions + + + HarpTimestampSource + + + + Timestamp + false + + + + + + + Item2 + + + EntryTime + + + This + + + Value + + + RngSeed + + + + + + + + + + + + + + Item1 - Item2 >= Item3 + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OnDistance + + + + Source1 + + + + 1 + + + + This + + + This + + + CurrentPosition + + + Value.Z + + + + + + Item2 + + + + 1 + + + + EntryPosition + + + EvaluateBlockEndConditions + + + CurrentPosition + + + Value.Z + + + + + + Item2 + + + EntryPosition + + + This + + + Value + + + RngSeed + + + + + + + + + + + + + + Item1 - Item2 >= Item3 + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OnReward + + + + Source1 + + + + 1 + + + + This + + + EvaluateBlockEndConditions + + + GiveReward + + + IsValid? + it.HasValue ? 1.0 : 0.0 + + + + This + + + Value + + + RngSeed + + + + + + + + + + + + + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + OnChoice + + + + Source1 + + + + 1 + + + + This + + + EvaluateBlockEndConditions + + + HotChoiceFeedback + + + + + + Index + + + This + + + Value + + + RngSeed + + + + + + + + + + + + + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + OnPatchCount + + + + Source1 + + + + 1 + + + + This + + + EvaluateBlockEndConditions + + + ActivePatch + + + + + + Index + + + This + + + Value + + + RngSeed + + + + + + + + + + + + + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ensure sequence never ends + + + + + false + + + + + + + + + + Source1 + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/TriggeredCameras.bonsai b/src/Extensions/TriggeredCameras.bonsai new file mode 100644 index 00000000..6d0d81ab --- /dev/null +++ b/src/Extensions/TriggeredCameras.bonsai @@ -0,0 +1,370 @@ + + + + + + TriggeredCameraController + + + Cameras + + + + + + Value.VideoWriter + + + + + + + Key + + + + + + FfmpegWriter + + + + Source1 + + + + 1 + + + + This + + + This + + + Item2 + + + ThisCameraName + + + This + + + Item1 + + + ThisWriter + + + TriggeredCamerasStream + + + + + + Source1 + + + Key + + + ThisCameraName + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + ThisCameraName + + + + + + + + ThisWriter + + + ContainerExtension + + + + + + + + Modality + + + + + + + + ThisWriter + + + + + + + + + + BehaviorVideos + FaceCamera + mp4 + -vf "scale=out_color_matrix=bt709:out_range=full" -c:v h264_nvenc -pix_fmt nv12 -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p4 -rc vbr -cq 12 -b:v 0M -maxrate 700M -bufsize 350M + -colorspace rgb -color_primaries bt709 -color_trc linear + Verbose + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TriggeredCameraController + + + Cameras + + + + + + Value.VideoWriter + + + + + + + Key + + + + + + OpenCvWriter + + + + Source1 + + + + 1 + + + + This + + + This + + + Item2 + + + ThisCameraName + + + This + + + Item1 + + + ThisWriter + + + TriggeredCamerasStream + + + + + + Source1 + + + Key + + + ThisCameraName + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + ThisCameraName + + + + + + + + ThisWriter + + + ContainerExtension + + + + + + + + Modality + + + + + + + + ThisWriter + + + + + + + + + BehaviorVideos + FaceCamera + mp4 + 30 + FMP4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/UpdateState.bonsai b/src/Extensions/UpdateState.bonsai index 77307372..2ebb7acf 100644 --- a/src/Extensions/UpdateState.bonsai +++ b/src/Extensions/UpdateState.bonsai @@ -1,5 +1,5 @@  - Source1 + + EvaluateBlockEndConditions + + + + Source1 + + + + EvaluateBlockEndConditions + + + + + + + + + + UpdateState @@ -166,6 +186,7 @@ + \ No newline at end of file diff --git a/src/Extensions/ValidateClkOutput.bonsai b/src/Extensions/ValidateClkOutput.bonsai new file mode 100644 index 00000000..4da0763a --- /dev/null +++ b/src/Extensions/ValidateClkOutput.bonsai @@ -0,0 +1,134 @@ + + + + + + ValidateClkOutput + + + + RigSchema + + + HarpClockGenerator.ConnectedClockOutputs + + + + + + OutputChannel + TargetDevice + + + + 1 + + + + ExpectedDevices + + + HarpClockGenEvents + + + Include + + + + + TimestampedU8 + false + + + + Value + + + ExpectedDevices + + + + + + + + + + + + + + Source1 + + + MissingChannels + + + Count + + + + 0 + + + + + + + + + + + + + + Error raised while validating the Harp Clock Output: +{0} + it + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/WebCameraControllerVisualizer.bonsai b/src/Extensions/WebCameraControllerVisualizer.bonsai new file mode 100644 index 00000000..7161b284 --- /dev/null +++ b/src/Extensions/WebCameraControllerVisualizer.bonsai @@ -0,0 +1,209 @@ + + + + + + Source1 + + + + + + Source1 + + + CamerasStream + + + + CamerasStream + + + Key + + + + + + true + true + + + + SelectedControllerCamera + + + + + + SelectedControllerCamera + + + + + + GetStream + + + + Source1 + + + + 1 + + + + Camera + + + + + + CamerasStream + + + Camera + + + + + + + + + + + Source1 + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Value + + + + + + + false + + + + + 1 + + + + CamerasStream + + + + true + + + + + + + + + + + + + ControllerVisualization + true + true + 1 + 2 + + + + Percent + 0.1 + + + Percent + 0.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/vr-foraging.bonsai b/src/vr-foraging.bonsai index 941a615c..20ed05e7 100644 --- a/src/vr-foraging.bonsai +++ b/src/vr-foraging.bonsai @@ -7,35 +7,34 @@ xmlns:p3="clr-namespace:AindVrForagingDataSchema.TaskLogic;assembly=Extensions" xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" xmlns:res="clr-namespace:Bonsai.Resources;assembly=Bonsai.System" + xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" + xmlns:p4="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:p4="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" - xmlns:p5="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" - xmlns:p6="clr-namespace:Harp.TimestampGeneratorGen3;assembly=Harp.TimestampGeneratorGen3" + xmlns:p5="clr-namespace:Harp.TimestampGeneratorGen3;assembly=Harp.TimestampGeneratorGen3" xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:sys="clr-namespace:System;assembly=mscorlib" + xmlns:cv="clr-namespace:Bonsai.Vision;assembly=Bonsai.Vision" + xmlns:p6="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" xmlns:p7="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:spk="clr-namespace:Bonsai.Spinnaker;assembly=Bonsai.Spinnaker" xmlns:vid="clr-namespace:Bonsai.Video;assembly=Bonsai.Video" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" xmlns:p8="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" - xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p9="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" xmlns:p10="clr-namespace:System.Reactive;assembly=System.Reactive.Core" xmlns:p11="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" xmlns:p12="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" xmlns:p13="clr-namespace:AllenNeuralDynamics.Core.Design;assembly=AllenNeuralDynamics.Core.Design" - xmlns:p14="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" - xmlns:io="clr-namespace:Bonsai.IO;assembly=Bonsai.System" - xmlns:cv="clr-namespace:Bonsai.Vision;assembly=Bonsai.Vision" - xmlns:p15="clr-namespace:;assembly=Extensions" + xmlns:p14="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" + xmlns:p15="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" + xmlns:p16="clr-namespace:;assembly=Extensions" xmlns:bv="clr-namespace:BonVision;assembly=BonVision" - xmlns:p16="clr-namespace:AllenNeuralDynamics.LicketySplit;assembly=AllenNeuralDynamics.LicketySplit" - xmlns:p17="clr-namespace:AllenNeuralDynamics.SniffDetector;assembly=AllenNeuralDynamics.SniffDetector" - xmlns:p18="clr-namespace:Bonsai.Numerics.Interpolation;assembly=Bonsai.Numerics" + xmlns:p17="clr-namespace:AllenNeuralDynamics.LicketySplit;assembly=AllenNeuralDynamics.LicketySplit" + xmlns:p18="clr-namespace:AllenNeuralDynamics.SniffDetector;assembly=AllenNeuralDynamics.SniffDetector" + xmlns:p19="clr-namespace:Bonsai.Numerics.Interpolation;assembly=Bonsai.Numerics" xmlns:gui="clr-namespace:Bonsai.Gui;assembly=Bonsai.Gui" xmlns:gli="clr-namespace:Bonsai.Shaders.Input;assembly=Bonsai.Shaders" - xmlns:p19="clr-namespace:Bonsai.Vision.Design;assembly=Bonsai.Vision.Design" xmlns:p20="clr-namespace:Bonsai.Design;assembly=Bonsai.Design" xmlns:zg="clr-namespace:Bonsai.Gui.ZedGraph;assembly=Bonsai.Gui.ZedGraph" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -136,9 +135,7 @@ ]]> - - StartExperiment - + @@ -210,15 +207,65 @@ RigSchema - Screen.CalibrationDirectory - - - - - + Screen.Calibration - - Calibration\Monitors + + LoadDisplayCalibration + + + + Source1 + + + calibration + + + calibration + + + Left + + + + calibration + + + Center + + + + calibration + + + Right + + + + + + + new( +Item1 as Left, +Item2 as Center, +Item3 as Right) + + + + + + + + + + + + + + + + + + @@ -226,7 +273,7 @@ - ScreenCalibration + DisplayCalibration RenderLoop @@ -347,10 +394,9 @@ - + - @@ -376,7 +422,7 @@ COM6 - StartExperiment + TriggerHarpReadDump true @@ -392,7 +438,7 @@ COMx - StartExperiment + TriggerHarpReadDump RigSchema @@ -407,7 +453,7 @@ COMx - StartExperiment + TriggerHarpReadDump RigSchema @@ -423,94 +469,9 @@ - - HarpTreadmill - - - - HarpTreadmillCommands - - - - - - - Active - On - true - On - Enabled - false - COMx - - - - HarpTreadmillEvents - - - - - - - StartExperiment - - - Write - - Active - true - false - On - On - Enabled - - - - - 1 - - - - HarpTreadmillCommands - - - HarpTreadmillEvents - - - - 1 - - - - - PT0.01S - - - - Write - - 250 - - - - HarpTreadmillCommands - - - - - - - - - - - - - - - - - + + COMx + TriggerHarpReadDump RigSchema @@ -527,8 +488,8 @@ - - + + RigSchema @@ -546,7 +507,6 @@ COMx - StartExperiment RigSchema @@ -561,7 +521,7 @@ COMx - StartExperiment + TriggerHarpReadDump RigSchema @@ -586,7 +546,7 @@ COMx - StartExperiment + TriggerHarpReadDump RigSchema @@ -601,6 +561,31 @@ RigSchema + + HarpEnvironmentSensor.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpEnvironmentSensor + + + + + + + RigSchema + HarpClockRepeaters @@ -637,7 +622,7 @@ - + Active On true @@ -653,11 +638,11 @@ ThisHarpClockGenEvents - - + + - + Repeater @@ -681,10 +666,10 @@ - + Write - - Repeater + + Repeater @@ -788,10 +773,17 @@ - + - + + + + + + + + @@ -930,6 +922,37 @@ + + + + + + + ThisCamera + + + Value + + + RegionOfInterest + + + + + + + + RegionOfInterest + + 0 + 0 + 0 + 0 + + + + + @@ -947,6 +970,7 @@ 0 0 + @@ -974,17 +998,23 @@ - + - - - + + + - + - - + + + + + + + + @@ -1372,25 +1402,15 @@ - - + - - C:\data\ - 672102 - 0001-01-01T00:00:00.0000000+00:00 + + + LoggingRootPath - - - 1 - - - - CompoundRootPath - @@ -1418,8 +1438,6 @@ - - @@ -1490,6 +1508,13 @@ ExperimentState + + StartExperiment + + + + TriggerHarpReadDump + @@ -1501,6 +1526,8 @@ + + @@ -1555,48 +1582,6 @@ TaskLogicParameters - - EnvironmentStatistics.Patches - - - Count - - - TransitionMatrix - - - Rows - - - - - - - - - - Source1 - - - - - - - - - - - 1 - - - - - Number of patches does not match transition matrix size. - - - - TaskLogicParameters - OperationControl.OdorControl.UseChannel3AsCarrier @@ -1933,7 +1918,7 @@ - Dropped frame detected during pre-session! + @@ -2143,34 +2128,84 @@ - - InstantiatedRepeaters - - - RigSchema - - - HarpClockRepeaters.Count - - - - - - StartExperiment - - - - - - - - - - + + Treadmill - - Source1 + + HarpTreadmillEvents + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + The treadmill current limit has been triggered. If this is a problem, please restart the session. + Treadmill limit trigger + Exclamation + + + + + + + + + + + + + StartExperiment + + + + + + InstantiatedRepeaters + + + RigSchema + + + HarpClockRepeaters.Count + + + + + + StartExperiment + + + + + + + + + + + + + + Source1 Item1 @@ -2201,6 +2236,7 @@ + @@ -2213,36 +2249,29 @@ - + - + - - - - - + + + - - - - + + + + + + + - - - + + + - - - - - - - - @@ -2287,3334 +2316,326 @@ + + + EndExperiment + + + + PT1S + + + + + + + StartLogging + + + + - Defer - + - - Logging + + OperationControl - - Behavior + + PositionControl - - + + TaskLogicParameters + + + OperationControl + + + PositionControl.VelocityThreshold + + + StopVelocityThreshold - - Modality - Behavior + + StopVelocityThreshold - - 1 + + StopVelocityTreshold - - Modality + + SoftwareEvent - HarpLogging + InitialPosition - HarpBehaviorEvents - - - Modality - - - - - - - - LoggingRootPath - Behavior - Behavior - Behavior - - - StepperDriverEvents - - - Modality - - - - - - - - LoggingRootPath - Behavior - StepperDriver - StepperDriver - - - HarpOlfactometerEvents - - - Modality - - - - - - - - LoggingRootPath - Behavior - Olfactometer - Olfactometer - - - HarpLickometerEvents - - - Modality - - - - - - - - LoggingRootPath - Behavior - Lickometer - LicketySplit - - - HarpTreadmillEvents - - - Modality - - - - - - - - LoggingRootPath - Behavior - Treadmill - Treadmill - - - HarpSniffDetectorEvents - - - Modality - - - - - - - - LoggingRootPath - Behavior - SniffDetector - SniffDetector - - - HarpClockGenEvents + TaskLogicParameters - - Modality + + OperationControl - - - - + + PositionControl.InitialPosition - - LoggingRootPath - Behavior - ClockGenerator - TimestampGeneratorGen3 + + Z - - HarpAnalogInputEvents + + + 0 + - - Modality + + - - - - + + - - LoggingRootPath - Behavior - AnalogInput - AnalogInput + + + 1 + + - + - - + + + + - - - - - - - - - - - - - - - - - - - + + - - HarpCommandsLogging - - - - HarpTimestampSource - - - - Timestamp - false - - - - HarpSeconds - - - HarpBehaviorCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/Behavior - Behavior - - - HarpOlfactometerCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/Olfactometer - Olfactometer - - - HarpAnalogInputCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/AnalogInput - AnalogInput - - - HarpLickometerCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/Lickometer - LicketySplit - - - HarpTreadmillCommands - - - HarpSeconds - - - - - - - - - - - - LoggingRootPath - Behavior - HarpCommands/Treadmill - Treadmill - - - HarpSniffDetectorCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/SniffDetector - SniffDetector - - - HarpClockGenCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/ClockGenerator - TimestampGeneratorGen3 - - - StepperDriverCommands - - - HarpSeconds - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - Behavior - HarpCommands/StepperDriver - StepperDriver - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Render - - - - RendererSynchState - - - Label - new( -it.FrameIndex.Value as FrameIndex, -it.FrameTimestamp.Value as FrameTimestamp, -it.SyncQuadValue.Value as SyncQuadValue) - - - Modality - - - - - - - - LoggingRootPath - - RendererSynchState - Renderer - - - - - - - - - - - - SoftwareEvents - - - - SoftwareEvent - - - - TaskPoolScheduler - - - - RendererSynchState - - - - TaskPoolScheduler - - - - - - - - - - HarpTimestampSource - - - - TaskPoolScheduler - - - - - - - - - - - - - Modality - - - - - - - - SoftwareEvents - LoggingRootPath - - - - - UpdaterEvents - - - - TaskPoolScheduler - - - - RendererSynchState - - - - TaskPoolScheduler - - - - - - - - - - HarpTimestampSource - - - - TaskPoolScheduler - - - - - - - - - - - - - Modality - - - - - - - - UpdaterEvents - LoggingRootPath - - - - Annotations - - - - Annotations - - - - - TaskPoolScheduler - - - - RendererSynchState - - - - TaskPoolScheduler - - - - - - - - - - HarpTimestampSource - - - - TaskPoolScheduler - - - - - - - - - - - - - Modality - - - - - - - - Annotations - LoggingRootPath - - - - Metadata - - - - Repository - - - - false - - - - - RepositoryStatus - - - - SoftwareEvent - - - RngSeedValue - - - - RngSeed - - - - SoftwareEvent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OperationControl - - - - CurrentPosition - - - Seconds,Value.Z - - - new( -Item1 as Seconds, -Item2 as Position) - - - LogCsv - - - - Source1 - - - Modality - - - - - - - - LoggingRootPath - - CurrentPosition - OperationControl - - - - - - - - - - - - - IsStopped - - - new( -Seconds as Seconds, -Value as IsStopped) - - - LogCsv - - - - Source1 - - - Modality - - - - - - - - LoggingRootPath - - IsStopped - OperationControl - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BehaviorVideos - - - - - - - Modality - BehaviorVideos - - - - 1 - - - - Modality - - - TriggeredCameras - - - - TriggeredCameraController - - - Cameras - - - - - - Value.VideoWriter - - - - - - - Key - - - - - - FfmpegWriter - - - - Source1 - - - - 1 - - - - This - - - This - - - Item2 - - - ThisCameraName - - - This - - - Item1 - - - ThisWriter - - - ThisCameraName - - - - - - - - ThisWriter - - - ContainerExtension - - - - - - - - Modality - - - - - - - - LoggingRootPath - BehaviorVideos - FaceCamera - mp4 - - - CameraLoggerPath - - - TriggeredCamerasStream - - - - - - Source1 - - - Key - - - ThisCameraName - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - Label - new( -Seconds as ReferenceTime, -Value.ChunkData.FrameID as CameraFrameNumber, -Value.ChunkData.Timestamp as CameraFrameTime, -Value.Image as Image) - - - - CameraLoggerPath - - - Metadata - - - - - - - - false - false - None - true - ReferenceTime,CameraFrameNumber,CameraFrameTime - - - Image - - - CameraLoggerPath - - - - - - - - ThisWriter - - - - - - - - - - false - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TriggeredCameraController - - - Cameras - - - - - - Value.VideoWriter - - - - - - - Key - - - - - - OpenCvWriter - - - - Source1 - - - - 1 - - - - This - - - This - - - Item2 - - - ThisCameraName - - - This - - - Item1 - - - ThisWriter - - - ThisCameraName - - - - - - - - ThisWriter - - - ContainerExtension - - - - - - - - Modality - - - - - - - - LoggingRootPath - BehaviorVideos - FaceCamera - mp4 - - - CameraLoggerPath - - - TriggeredCamerasStream - - - - - - Source1 - - - Key - - - ThisCameraName - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - Label - new( -Seconds as ReferenceTime, -Value.ChunkData.FrameID as CameraFrameNumber, -Value.ChunkData.Timestamp as CameraFrameTime, -Value.Image as Image) - - - - CameraLoggerPath - - - Metadata - - - - - - - - false - false - None - true - ReferenceTime,CameraFrameNumber,CameraFrameTime - - - Image - - - CameraLoggerPath - - - - - - - - ThisWriter - - - - - - - - - - None - true - false - FMP4 - 30 - - 0 - 0 - - NearestNeighbor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MonitoringCameras - - - - RigSchema - - - MonitoringCameraController - - - Cameras - - - - - - Value.VideoWriter - - - - - - - Key - - - - - - FfmpegWriter - - - - Source1 - - - - 1 - - - - This - - - This - - - Item2 - - - ThisCameraName - - - This - - - Item1 - - - ThisWriter - - - ThisCameraName - - - - - - - - ThisWriter - - - ContainerExtension - - - - - - - - Modality - - - - - - - - LoggingRootPath - BehaviorVideos - FaceCamera - mp4 - - - CameraLoggerPath - - - MonitoringCamerasStream - - - - - - Source1 - - - Key - - - ThisCameraName - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - Label - new( -Seconds as ReferenceTime, -Single.NaN as CameraFrameNumber, -Single.NaN as CameraFrameTime, -Value as Image) - - - - CameraLoggerPath - - - Metadata - - - - - - - - false - false - None - true - ReferenceTime,CameraFrameNumber,CameraFrameTime - - - Image - - - CameraLoggerPath - - - - - - - - ThisWriter - - - - - - - - - - false - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RigSchema - - - MonitoringCameraController - - - Cameras - - - - - - Value.VideoWriter - - - - - - - Key - - - - - - OpenCvWriter - - - - Source1 - - - - 1 - - - - This - - - This - - - Item2 - - - ThisCameraName - - - This - - - Item1 - - - ThisWriter - - - ThisCameraName - - - - - - - - ThisWriter - - - ContainerExtension - - - - - - - - Modality - - - - - - - - LoggingRootPath - BehaviorVideos - FaceCamera - mp4 - - - CameraLoggerPath - - - MonitoringCamerasStream - - - - - - Source1 - - - Key - - - ThisCameraName - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - Label - new( -Seconds as ReferenceTime, -Single.NaN as CameraFrameNumber, -Single.NaN as CameraFrameTime, -Value as Image) - - - - CameraLoggerPath - - - Metadata - - - - - - - - false - false - None - true - ReferenceTime,CameraFrameNumber,CameraFrameTime - - - Image - - - CameraLoggerPath - - - - - - - - ThisWriter - - - - - - - - - - None - true - false - FMP4 - 30 - - 0 - 0 - - NearestNeighbor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Other - - - - - - - Modality - Other - - - - 1 - - - - Modality - - - ConfigSchemaLogging - - - - SubjectSchema - - - - - - Modality - - - - - - - - LoggingRootPath - - Config - session_output - - - TaskLogicSchema - - - - - - Modality - - - - - - - - LoggingRootPath - - Config - tasklogic_output - - - RigSchema - - - - - - Modality - - - - - - - - LoggingRootPath - - Config - rig_output - - - RawRigSchema - - - Modality - - - - - - - - LoggingRootPath - - Config - rig_input - json - - - RawSessionSchema - - - Modality - - - - - - - - LoggingRootPath - - Config - session_input - json - - - RawTaskLogicSchema - - - Modality - - - - - - - - LoggingRootPath - - Config - tasklogic_input - json - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Logs - - - - EndExperiment - - - - ExperimentCompleted - - - - - SoftwareEvent - - - - HarpTimestampSource - - - - - - - - - - - - - - - Modality - - - - - - - - LoggingRootPath - - - endsession - - - RuntimeLogging - - - - TaskPoolScheduler - - - - RendererSynchState - - - - TaskPoolScheduler - - - - - - - - - - HarpTimestampSource - - - - TaskPoolScheduler - - - - - - - - - - - - - Modality - - - - - - - - RuntimeLogging - LoggingRootPath - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EndExperiment - - - - PT1S - - - - - - - StartLogging - - - - - - - - - OperationControl - - - - PositionControl - - - - TaskLogicParameters - - - OperationControl - - - PositionControl.VelocityThreshold - - - StopVelocityThreshold - - - StopVelocityThreshold - - - - StopVelocityTreshold - - - - SoftwareEvent - - - InitialPosition - - - - TaskLogicParameters - - - OperationControl - - - PositionControl.InitialPosition - - - Z - - - - 0 - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - EncoderSample - - - Value.Displacement,Seconds - - - - - - - - - Value - - - - - - - - - TaskLogicParameters - - - OperationControl.PositionControl.InitialPosition - - - - - - - - - - 0 - 4 - -1 - - - - Seconds - - - - - - - - - - - - CurrentPosition - - - EncoderSample - - - Value - - - InstantVelocity - - - TaskLogicParameters - - - OperationControl - - - PositionControl.FrequencyFilterCutoff - - - - - - - - TreadmillSamplingRate - - - - - - - - - 250 - 5 - 0 - 60 - LowPass - - - - FilteredCurrentVelocity - - - StopVelocityThreshold - - - - - - - - - 10 - - - - - - - Seconds - - - - - - - - - - - - IsStopped - - - CurrentPosition - - - Value - - - - 0 - 0 - -100000 - - - - - 1 - - - - - - - Source1 - - - Accumulation.Z > Value.Z ? Accumulation : Value - - - - - - - - - - - Max(Z) - - - - MaxPosition - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StartExperiment - - - - - - PatchStatistics - - - - ActivePatch - - - PatchRewardAvailable - - - PatchRewardAmount - - - PatchRewardProbability - - - DepletionVariable - - - TaskLogicParameters - - - EnvironmentStatistics.TransitionMatrix - - - - true - - - - TransitionMatrix - - - TaskLogicParameters - - - EnvironmentStatistics.Patches - - - - - - StateIndex - it - - - - 1 - - - - PatchStatistics - - - TaskLogicParameters - - - EnvironmentStatistics.FirstStateOccupancy - - - TransitionMatrix - - - - - - - - - ActiveStateIndex - - - ActiveStateIndex - - - UpdateState - - - - Source1 - - - - 1 - - - - PatchIndex - - - - 0 - - - - - 1 - - - - DepletionVariable - - - PatchStatistics - - - PatchIndex - - - - - - - - - 0 - - - - - 1 - - - - ThisPatch - - - ThisPatch - - - RewardSpecification - - - it != null - - - - 1 - - - - HasRewardSpec - - - DetermineDepletionRule - - - - ThisPatch - - - - 1 - - - - RewardSpecification.RewardFunction.DepletionRule - - - OnChoice - - - - Source1 - - - - - - - OnChoice - - - - - - - - - - - - - OnChoice - - - - HotChoiceFeedback - - - - 1 - - - - - 1 - - - - single(it) - - - - - - - - - - - - - OnReward - - - - Source1 - - - - - - - OnReward - - - - - - - - - - - - - OnReward - - - - HotGiveReward - - - HasValue - - - - Source1 - - - HasValue - - - - - - - - - - - - 1 - - - - - single(it) - - - - - - - - - - - - - - OnTime - - - - Source1 - - - - - - - OnTime - - - - - - - - - - - - - OnTime - - - - - - - TimeStep.ElapsedRealTime - - - - - - - - PT0S - PT1S - - - - - - - single(it) - - - - - - - - - - - - - - - - OnDistance - - - - Source1 - - - - - - - OnDistance - - - - - - - - - - - - - OnDistance - - - - CurrentPosition - - - Value.Z - - - CurrentPosition - - - Value.Z - - - - 1 - - - - - - - - - - - - PT0S - PT1S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DepletionVariable - - - - - - - - - - - - - - - - - - - - - - - - HasRewardSpec - - - - - - Source1 - - - - - - - - - - - - - DefaultTo0 - - - - HasRewardSpec - - - - - - - Source1 - - - - - - - - - - - 0 - - - - DepletionVariable - - - - - - - - - - - - - - - - - - - DetermineRewardSpecs - - - - DepletionVariable - - - ThisPatch - - - RewardSpecification.RewardFunction - - - Available - - - - - - - true - 0 - - - - PatchRewardAvailable - - - DepletionVariable - - - ThisPatch - - - RewardSpecification.RewardFunction - - - Amount - - - - - - - true - 0 - - - - PatchRewardAmount - - - DepletionVariable - - - ThisPatch - - - RewardSpecification.RewardFunction - - - Probability - - - - - - - true - 0 - - - - PatchRewardProbability - - - - - - - - - - - - - - - - - - - - - - - - - - HasRewardSpec - - - - - - Source1 - - - - - - - - - - - - - DefaultTo0 - - - - HasRewardSpec - - - - - - - Source1 - - - - - - - - - - - 0 - - - - PatchRewardAvailable - - - PatchRewardAmount - - - PatchRewardProbability - - - - - - - - - - - - - - - - - - - - - ThisPatch - - - ActivePatch - - - DepletionVariable - - - - DepletionVariable - - - - SoftwareEvent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + EncoderSample + + + Value.Displacement,Seconds - + + + + + + + Value + + + + + + - ActivePatch + TaskLogicParameters + + + OperationControl.PositionControl.InitialPosition + + + + + + - - ActivePatch + + 0 + 4 + -1 - - SoftwareEvent + + Seconds - - PatchRewardAvailable + + - - PatchRewardAvailable - + - - SoftwareEvent + + + + + CurrentPosition - PatchRewardAmount + EncoderSample + + + Value + + + InstantVelocity + + + TaskLogicParameters + + + OperationControl + + + PositionControl.FrequencyFilterCutoff + + + + + + + + TreadmillSamplingRate + + + + + - - PatchRewardAmount + + 250 + 5 + 0 + 60 + LowPass - - SoftwareEvent + + FilteredCurrentVelocity - PatchRewardProbability + StopVelocityThreshold + + + + + + + + + 10 + - - PatchRewardProbability - + - - SoftwareEvent + + Seconds + + + + + + + + + + + + IsStopped - DepletionVariable + CurrentPosition + + + Value - - DepletionVariable + + 0 + 0 + -100000 - - SoftwareEvent + + + 1 + + + + + + + Source1 + + + Accumulation.Z > Value.Z ? Accumulation : Value + + + + + + + + + + + Max(Z) + + + + MaxPosition + + + + - - + + - + + + - + - - + + + + + - + + + - - + + + + + + + + + + + + + + @@ -5766,283 +2787,45 @@ Value as Image) - - - Source1 - - - - - - - - - - Channel3Range - FlowRate100 - - - - - - - - - - - - - - - - - - - - - - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - HarpOlfactometerEvents - - - - 1 - - - - - - - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 - - - - ChannelsTargetFlow - - - OdorValveState - - - - - - HarpOlfactometerCommands - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ArmOdor - - - - ArmOdor - - - ArmOdor - - - - ArmOdor - - - - SoftwareEvent - - - ArmOdor - - - Index,Concentration - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - - - TaskLogicParameters - - - OperationControl.OdorControl.TargetOdorFlow - - - - - - - - TaskLogicParameters - - - OperationControl.OdorControl.TargetTotalFlow - - - - - - - - - false - 0 - 0 - 0 - 0 - false - 100 - 1000 - - - - ChannelsTargetFlow - - - OdorValveState - - - - - - HarpOlfactometerCommands - - - DO1Sync - None - - - - false - 0 - 0 - 0 - 0 - false - 100 - 1000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - EndValveControl - - - - HarpOlfactometerEvents - - - - 1 - - - - - false - - - - OdorEndValveState - - - OdorEndValveState - - - OdorPath - - - - Source1 + + + Source1 + + + + + + + + + + Channel3Range + FlowRate100 + + + + + + + + + + + - - EndValvesState - EndValve0 + + + FlowRate1000 + - - CarrierPath @@ -6055,670 +2838,472 @@ Value as Image) - - EndValvesState - None - - - - - - Write - - - - HarpOlfactometerCommands - - - - - - - - - - - - - - - - - - - - WaitForMaxOpenTime - - - - OdorEndValveState - - TaskLogicParameters - - - OperationControl.OdorControl.ValveMaxOpenTime - - - ToSeconds - TimeSpan.FromSeconds(it) - - - - - - - - PT5S - - - OdorEndValveState - - - - - - - - - - - - - - - - - - - - RewardControl - - - - WaterValve - - - - ValveOpenTimeMs - - - Write - - - - HarpBehaviorCommands - - - TriggerValve - - - Write - - SupplyPort0 - - - - HarpBehaviorCommands - - - - - - - - - - - - - - - 0 - true - - - - - 1 - - - - GiveReward - - - GiveReward - - - HotGiveReward - - - GiveReward - - - HasValue - - - - Source1 - - - HasValue - - - - - - - - - - - Value - - - GreaterThan0 - - - - Source1 - - - - 0 - + HarpOlfactometerEvents - - - - - - - - - - RigSchema - - - Calibration.WaterValve - - - Output - - - - - - RewardToTime - ((Item1 * 0.001) - Item2.Offset) / Item2.Slope - - - ToMilliseconds - - - - - 1000 - - - - - - - - - - 0 - - - - GreaterThan0 - - - - Source1 + + + 1 + - - - 0 - + + - - - - - - - - - - ValveOpenTimeMs - - - - TriggerValve - - - GiveReward - - - HasValue - - - - Source1 + + + true + 0 + 0 + 0 + NaN + true + 100 + 1000 + - HasValue + ChannelsTargetFlow + + + OdorValveState + + + + + + HarpOlfactometerCommands - - + + + + + + + + + + + + + + + + + + + + - - Value - - - - 0 - - - - - - - - SessionAccumulatedReward - - - GiveReward - - - - GiveReward - - - - SoftwareEvent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MovableSpoutControl - - - - Start with the spout at max distance - - - - - true - - - - - 1 - - - - SpoutAvailable - - - StartExperiment - - - ManipulatorPosition - - - - - - Item2 - - - - 1 - - - - RigSchema - - - Manipulator - - - AdditionalSettings.SpoutAxis - - - - - - - - CalcRetractedPosition + + ArmOdor - - + + ArmOdor - - Axis - Y1 + + ArmOdor - - 1 + + ArmOdor + + + + SoftwareEvent + + + ArmOdor + + + Index,Concentration + + + TaskLogicParameters + + + OperationControl.OdorControl.UseChannel3AsCarrier + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + + + + false + 0 + 0 + 0 + 0 + false + 100 + 1000 - - SpoutAxis + + ChannelsTargetFlow + + + OdorValveState + + + + + + HarpOlfactometerCommands - - Source1 + + DO1Sync + None - - 1 + + false + 0 + 0 + 0 + 0 + false + 100 + 1000 - - SpoutResetPosition - + + + + + + + + + + + + + + + + + + + + + + + + + + EndValveControl + + - SpoutResetPosition + HarpOlfactometerEvents - 1 - - 0 - 0 - 0 - 0 + + false - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - RetractingDistance + + OdorEndValveState - SpoutAxis + OdorEndValveState - - + + OdorPath + + + + Source1 + + + + + + + - - Assign - Item1[Item3] = Item2 + + EndValvesState + EndValve0 - - Item1 + + + CarrierPath + + + + Source1 + + + + + + + - - + + EndValvesState + None - - - 1 - + + + + Write + + + + HarpOlfactometerCommands - + - + + - - + + - - - - - - - - - - - - - - Rename - new(Item1 as ResetPosition, Item2 as RetractedPosition) - - - SpoutParkingPositions - - - SpoutAvailable - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - - - IsEnabled + + WaitForMaxOpenTime - - Source1 + + OdorEndValveState + + + TaskLogicParameters - Item2 + OperationControl.OdorControl.ValveMaxOpenTime + + + ToSeconds + TimeSpan.FromSeconds(it) + + + + + + + + PT5S + + + OdorEndValveState - + + + + + + - - Item1 - - - SpoutParkingPositions + + + + + + RewardControl + + + + WaterValve + + + + ValveOpenTimeMs + + + Write + + + + HarpBehaviorCommands + + + TriggerValve + + + Write + + SupplyPort0 + + + + HarpBehaviorCommands + + + + + + + + + + + - - - - GetPosition - it.Item1 ? it.Item2.ResetPosition : it.Item2.RetractedPosition - - - MoveTo - - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - SpoutAvailable + + 0 + true + - - StartExperiment + + + 1 + - - + + GiveReward GiveReward - - - false - + + HotGiveReward - SpoutAvailable + GiveReward - Condition + HasValue Source1 + + HasValue + + - - - true - - - - + + Value - - DelayWithdraw + + GreaterThan0 Source1 - - - 1 - - - - State - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - TimeToCollectAfterReward - - - FromSeconds - TimeSpan.FromSeconds(it) - - - - - - - - - PT0S - - - - State - - - - - - Item2 + + + 0 + - - - - - - - - - + + RigSchema + + + Calibration.WaterValve + + + Output + - + + + + RewardToTime + ((Item1 * 0.001) - Item2.Offset) / Item2.Slope + + + ToMilliseconds + + + + + 1000 + + + + + + + + + + 0 + - IsWithdraw? + GreaterThan0 Source1 - + + + 0 + + @@ -6728,201 +3313,136 @@ Value as Image) - SpoutAvailable + ValveOpenTimeMs - - StartExperiment + + + TriggerValve - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled + GiveReward + HasValue Source1 + + HasValue + + - - Enabled and Start - + + Value - + + 0 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FeedbackControl - - - - ChoiceFeedback - - - ChoiceFeedback - - - HotChoiceFeedback - - - ChoiceFeedback + - - - AudioTrigger + + + SessionAccumulatedReward - - ChoiceFeedback + GiveReward - ChoiceFeedback + GiveReward SoftwareEvent - - HarpBehaviorEvents - - - - 1 - - - - - true - - - - SpoutAvailable - - + - + + - + + + + + + + + + + + + + + + + + + - Lickometer + MovableSpoutControl - - HarpLickometerEvents + + Start with the spout at max distance + - - + + + true + - - Value + + + 1 + - - - Channel0 - + + SpoutAvailable - - - 0 - + + SpoutAvailable - - + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled - - LickometerState - - IsLickOnset + IsEnabled Source1 - Item1 + Item2 @@ -6933,317 +3453,417 @@ Value as Image) - Item2.Seconds - - - LickEvent - - - HarpLickometerEvents - - - - - - LickometerUntriggerThreshold - - - HarpLickometerEvents - - - - - - LickometerTriggerThreshold + Item1 - HarpLickometerEvents - - - Write - - Active - true - false - Off - Off - Enabled - + SpoutParkingPositions - - 1 - - - - HarpLickometerCommands - - - IncrementLickometerTrigger + - it ? 1 : -1 - it ? 1 : -1 + GetPosition + it.Item1 ? it.Item2.ResetPosition : it.Item2.RetractedPosition - - Offset + + MoveTo + + + InitialState - - Source1 + + ManipulatorPosition 1 + + RigSchema + + + Manipulator + + + AdditionalSettings.SpoutAxis + + + + + + + + CalculateRetractedPosition + + + + + + + Axis + Y1 + + + + 1 + + + + SpoutAxis + + + Source1 + + + + 1 + + + + SpoutResetPosition + + + SpoutResetPosition + + + + + 1 + + + + + 0 + 0 + 0 + 0 + + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + RetractingDistance + + + + + + SpoutAxis + + + + + + + + + None + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rename + new(Item1 as ResetPosition, Item2 as RetractedPosition) + - Offset + SpoutParkingPositions - LickometerTriggerThreshold + TaskLogicParameters - - - 1 - + + OperationControl.MovableSpoutControl + + + Enabled + + + + SpoutAvailable - Offset + GiveReward - + + false + - - - - - - - - - - - - - - - - Write - - - - HarpLickometerCommands - - - IncrementLickometerUntrigger - - - it ? 1 : -1 - it ? 1 : -1 - - - Offset - - - - Source1 + + SpoutAvailable + + + Condition + + + + Source1 + + + + + + + - - 1 + + true - - Offset + + - - LickometerUntriggerThreshold + + DelayWithdraw + + + + Source1 + + + + 1 + + + + State + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + TimeToCollectAfterReward + + + FromSeconds + TimeSpan.FromSeconds(it) + + + + + + + + + PT0S + + + + State + + + + + + Item2 + + + + + + + + + + + + + + + + + - - 1 - + + + + IsWithdraw? + + + + Source1 + + + + + + + + + + + + SpoutAvailable - Offset + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + + + Source1 + + + + + + + - + - - - + + + - + - + + + + + + + + + + + + + + + + + + + + - - Write - + + StartExperiment - - HarpLickometerCommands + + + + + - - - + - + - + + - - - - - - - - - - - - - + + + + - CameraControl + FeedbackControl - - HarpBehaviorHeartBeat - - - - 1 - - - - TextureBank - - - TriggeredCamerasReady - - - - - - - 1 - - - - - PT2S - - - - - true - - - - CameraState - - - CameraState - - - - - - Source1 - - - - - - - - - - Write - - CameraOutput0 - - - - - - - - Source1 - - - - - - - - - - Write - - CameraOutput0 - - - - - - - HarpBehaviorCommands + + ChoiceFeedback - StartLogging + ChoiceFeedback - - - 1 - + + HotChoiceFeedback - - - false - + + ChoiceFeedback + - CameraState + AudioTrigger + - StartExperiment - - - - 1 - + ChoiceFeedback - - true + + ChoiceFeedback - CameraState + SoftwareEvent - EndExperiment + HarpBehaviorEvents @@ -7252,971 +3872,818 @@ Value as Image) - false + true - CameraState + SpoutAvailable - - - - + + - - - + - + - - - - - - - - - - - - - Thermistor/Pressure + Lickometer - HarpSniffDetectorEvents + HarpLickometerEvents - - - - RigSchema + - HarpSniffDetector + Value + + + + Channel0 + + + + + 0 + - - + + + + - ThermistorData + LickometerState + + + IsLickOnset + + + + Source1 + + + Item1 + + + + + + + + + + + Item2.Seconds + + + LickEvent - - - - - - - - - - - - - Treadmill - - - StartLogging + HarpLickometerEvents + + + + + + LickometerUntriggerThreshold + + + HarpLickometerEvents + + + + + + LickometerTriggerThreshold + + + HarpLickometerEvents + + + Write + + Active + true + false + Off + Off + Enabled + + + + + 1 + + + + HarpLickometerCommands + + + IncrementLickometerTrigger + + + it ? 1 : -1 + it ? 1 : -1 - ClearCurrentLimit + Offset - - - PT0S - PT0.05S - - - - + + Source1 - 5 + 1 - - - - - ThrowOnRetryCount - - - - Source1 - - - - - - - Number of attempts ot clear the current limit state register has been exceeded. - - - - - - - - - - - - - Write - - 0 - - - - HarpTreadmillCommands + + Offset - HarpTreadmillEvents + LickometerTriggerThreshold - - Include - Write + + 1 - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - + + Offset - - 1 - + + - - - - - + + + + - - - + + + - - - - - - - - - 1 - - - - - 0 - - - - - 1 - - - - TreadmillFriction + + Write + - - HarpTreadmillEvents + + HarpLickometerCommands - - + + IncrementLickometerUntrigger - - TreadmillSamplingRate + + it ? 1 : -1 + it ? 1 : -1 - - DetermineTreadmillScaling + + Offset - - RigSchema - - - HarpTreadmill.Calibration + + Source1 - - WheelDiameter + + + 1 + - - Perimeter - it * Math.Pi + + Offset - - PulsesPerRevolution + + LickometerUntriggerThreshold - - - - CentimetersPerTick - Item1 / Item2 + + 1 + - - InvertDirection + + Offset - - - - Item2 ? -1.0 * Item1 : Item1 + + - - - - - - - - - - + + + + + - - TreadmillScaling + + Write + - - HarpTreadmillEvents + + HarpLickometerCommands - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CameraControl + + + + HarpBehaviorHeartBeat - + 1 - - - - - CalculateDisplacement - single(Item1.Value.Encoder - Item2.Value.Encoder) - - TreadmillScaling - - - - - + TextureBank - - - 0 - 1 - 0 - -0.005752427954571154 - Linear - + + TriggeredCamerasReady - - CalculateInstantSpeed - new( -Item1 as Displacement, -(Item1 / single(Item2.Item1.Seconds - Item2.Item2.Seconds)) as InstantVelocity -) - - - Item1.Seconds - - + + 1 + - - - - EncoderSample - - - TreadmillFriction + + PT2S + - - 0 - 1 - 0 - 1 - Clamp + + true - - + + CameraState - - GetInterpolator + + CameraState + + - - RigSchema - - - HarpTreadmill.Calibration - - - BrakeLookupCalibration - - - - - - - 0 - - - - - 1 - - - - - - - - - - + + Source1 - - - - - - - - - - - - - - - - - - + Write - + + CameraOutput0 + - - SendMessage + + Source1 - - - 1 - - - - HarpMessage - - - HarpTreadmillEvents - - - - - - HarpMessage - - - - - - - PT0.1S - PT0.1S - - - - HarpMessage - - - - - - Item2 - - - - - - HarpTreadmillCommands - - - - - - - 1 - - - - - - - - - - - - - - - + + Write + + CameraOutput0 + + - + + + + HarpBehaviorCommands + + + StartLogging + + + + 1 + + + + + false + + + + CameraState + + + StartExperiment + + + + 1 + + + + + true + + + + CameraState + + + EndExperiment + + + + 1 + + + + + false + + + + CameraState - - - + + + + - + + + - - - - - - - + + + - - + - - - - - - + - AudioControl + Thermistor/Pressure - - AudioDuration - - - - 1000 - - - - Write - - - - HarpBehaviorCommands + + HarpSniffDetectorEvents - - AudioFrequency + + - - Write - + + RigSchema - - HarpBehaviorCommands + + HarpSniffDetector - - AudioTrigger + + + - - Write - - PwmDO2 - + + ThermistorData - - HarpBehaviorCommands + + + + + + + + + + + + + Treadmill + + + + StartLogging - - InitialSettings + + ClearCurrentLimit - - HarpBehaviorHeartBeat + + + PT0S + PT0.05S + + + + + + + + 5 + + + + + + + ThrowOnRetryCount + + + + Source1 + + + + + + + Number of attempts ot clear the current limit state register has been exceeded. + + + + + + + + + + - + Write - - 1 + + 0 - - - 1 - - - HarpBehaviorCommands + HarpTreadmillCommands - TaskLogicParameters - - - OperationControl.AudioControl + HarpTreadmillEvents - - Duration + + + Include + Write + - - AudioDuration + + - - TaskLogicParameters + + + 0 + - - OperationControl.AudioControl + + + + + Source1 + + + + + + + - - Frequency + + - - AudioFrequency + + + 1 + + - - + + + - + + + + + - - HarpBehaviorHeartBeat - 1 - + + 0 + + + + + 1 + + + + TreadmillFriction + + + HarpTreadmillEvents + + + + + + TreadmillSamplingRate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VariableUpdaters - - - - TaskLogicParameters - - - Updaters - - - - 1 - - - - VariableUpdaters - - - UpdaterEvents - - - GiveReward - - - - true - - - - StopDurationOffset - 0 - - - StopDurationOffset - - - - UpdaterStopDurationOffset - - - - UpdaterEvents - - - GiveReward - - - - false - - - - TaskLogicParameters - - - OperationControl.PositionControl.VelocityThreshold - - - - - - - - StopVelocityThreshold - 0 - - - StopVelocityThreshold - - - - UpdaterStopVelocityThreshold - - - - UpdaterEvents - - - GiveReward - - - - true - - - - RewardDelayOffset - 0 - - - RewardDelayOffset - - - - UpdaterRewardDelayOffset - - - - UpdaterEvents - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TaskLogic - - - - - - - ProceduralGeneration - - - CorridorDrawing + DetermineTreadmillScaling - - + + RigSchema - - - 120 - + + HarpTreadmill.Calibration + + + Output + + + WheelDiameter + + + Perimeter + it * Math.Pi + + + PulsesPerRevolution - - 1 - + - - VisualCorridorLength + + CentimetersPerTick + Item1 / Item2 - - + + InvertDirection - - 40 - + + + + Item2 ? -1.0 * Item1 : Item1 + + + + + + + + + + + + + + + + + + + + + + TreadmillScaling + + + HarpTreadmillEvents + + + + + + + 1 + + + + + + + CalculateDisplacement + single(Item1.Value.Encoder - Item2.Value.Encoder) + + + TreadmillScaling + + + + + + + + + 0 + 1 + 0 + -0.005752427954571154 + Linear + + + + + + + CalculateInstantSpeed + new( +Item1 as Displacement, +(Item1 / single(Item2.Item1.Seconds - Item2.Item2.Seconds)) as InstantVelocity +) + + + Item1.Seconds + + + + + + + + + EncoderSample + + + TreadmillFriction + + + + 0 + 1 + 0 + 1 + Clamp + + + + + + + GetInterpolator + + + + RigSchema + + + HarpTreadmill.Calibration + + + Output + + + BrakeLookupCalibration - - 1 - + - - CorridorWidth + + + 0 + - - + + + 1 + - - 30 - + - - 1 - + - - CorridorHeight + + - - DefineTextures - - - - - 40 - 40 - - - - - - - - - - Floor - - - - - - - - - - 40 - 40 - - - - - - - - - - Ceiling - - - - - - - - - - 40 - 40 - - - - - - - - - - LeftWall - - - - - - - - - - 40 - 40 - - - - - - - - - - RightWall - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + Write + + + + SendMessage + + + + Source1 @@ -8224,339 +4691,465 @@ Item1 as Displacement, - TextureDefinition + HarpMessage - - Initialize - - - - TaskLogicParameters - - - OperationControl.PositionControl.InitialPosition - - - Z - - - - 1 - - - - InitPosition - - - FarClipHorizon - - - InitPosition - - - - - - - VisualCorridorLength - - - - - - - - - 120 - - - - Math.Ceiling(it) - - - - 1 - - - - Range - - - - Source1 - - - - 1 - - - - Count - - - InitPosition - - - - 1 - - - - - - - - - Count - - - - - - - - - -1 - 9 - - - - - - - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - + + HarpTreadmillEvents + + + + + + HarpMessage + + + + + + + PT0.1S + PT0.1S + + + + HarpMessage + + + + + + Item2 + + + + + + HarpTreadmillCommands + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AudioControl + + + + AudioDuration + + + + 1000 + + + + Write + + + + HarpBehaviorCommands + + + AudioFrequency + + + Write + + + + HarpBehaviorCommands + + + AudioTrigger + + + Write + + PwmDO2 + + + + HarpBehaviorCommands + + + InitialSettings + + + + HarpBehaviorHeartBeat - - Update - - - - CurrentPosition - - - Value - - - MaxPosition - - - - - - - - - Source1 - - - Item1.Z,Item2.Z - - - - - - - - - - - - - Item1.Z - - - FarClipHorizon - - - - - - - - - 1000 - - - - SigmaZ - - - - - - - - - 0 - - - - VisualCorridorLength - - - - - - - - - 120 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + Write + + 1 + - + + 1 + - - + + HarpBehaviorCommands + + + TaskLogicParameters + + + OperationControl.AudioControl + + + Duration + + + AudioDuration - VisualCorridorLength + TaskLogicParameters + + + OperationControl.AudioControl + + + Frequency + + + AudioFrequency + + + + + + + + + + + + + + + + + HarpBehaviorHeartBeat + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VariableUpdaters + + + + TaskLogicParameters + + + Updaters + + + + 1 + + + + VariableUpdaters + + + UpdaterEvents + + + GiveReward + + + + true + + + + StopDurationOffset + 0 + + + StopDurationOffset + + + + UpdaterStopDurationOffset + + + + UpdaterEvents + + + GiveReward + + + + false + + + + TaskLogicParameters + + + OperationControl.PositionControl.VelocityThreshold + + + + + + + + StopVelocityThreshold + 0 + + + StopVelocityThreshold + + + + UpdaterStopVelocityThreshold + + + + UpdaterEvents + + + GiveReward + + + + true + + + + RewardDelayOffset + 0 + + + RewardDelayOffset + + + + UpdaterRewardDelayOffset + + + + UpdaterEvents + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TaskLogic + + + + ProceduralGeneration + + + + 120 + 40 + 30 + + + + + + + + BlockFactory + + + + TaskLogicParameters + + + Environment + + + Blocks + + + CurrentBlock + + + EvaluateBlockEndConditions + + + Blocks + + + + CurrentBlock + + + + Block + + + + SoftwareEvent + + + CurrentBlock + + + EnvironmentStatistics.TransitionMatrix + + + + true + + + + TransitionMatrix + + + CurrentBlock + + + GetPatches + + + + Source1 - - - - + + EnvironmentStatistics - - - 120 - + + Patches - - - - new( -Item1 as Id, -Item2 as Start -) - - - - - - - - - - VisualCorridorLength - - - - - - - - CorridorWidth - - - - - - - - CorridorHeight - - - - - - - - TextureDefinition - - - - - - - - 0 - 0 - 120 - 0 - 0 - - - VisualCorridorSpecs - + - - VisualCorridorSpecs + + StateIndex + it - - + + 1 + @@ -8564,95 +5157,31 @@ Item2 as Start + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PatchGeneration - - - - SiteSpecs - - - SiteSpecs - - - - - - - - - - - ActiveSite - - - - ActiveSite - - - SoftwareEvent - - - VisualCorridorSpecs - - - - VisualCorridorSpecs - - - - SoftwareEvent + PatchStatistics - - + + - + + + + + + + - - - + Foraging @@ -9726,6 +6255,10 @@ Item2 as Start + + + EvaluateBlockEndConditions + @@ -9753,6 +6286,8 @@ Item2 as Start + + @@ -9780,8 +6315,6 @@ Item2 as Start - - @@ -10667,68 +7200,33 @@ Item2 as Start - TaskVisualizer - - - - TriggeredCamerasStream - - - - 1 - - - - - - - Value.Image + TaskVisualizer + + + + TriggeredCamerasStream + - + TriggeredCamerasStream - - - 1 - - - - - 1 - - - - - - - Value.Image - + - + MonitoringCamerasStream - - - 1 - - - - - - - Value - + - + CameraVisualizer - false + true true 3 1 @@ -10996,9 +7494,21 @@ Item2 as Start SubjectSchema + + Subject + + + TaskLogicSchema + + + Name,StageName + + + + - Animal {0} @ Task {1} - Subject,Experiment + Animal {0} // Task {1} @ Stage {2} + Item1,Item2.Item1,Item2.Item2 @@ -11008,6 +7518,7 @@ Item2 as Start true true + Microsoft Sans Serif, 20.25pt @@ -11016,9 +7527,22 @@ Item2 as Start true true 1 - 2 + 3 - + + + Percent + 0.48 + + + Percent + 0.48 + + + Percent + 0.04 + + @@ -11061,80 +7585,77 @@ Item2 as TotalReward) - + - - + + - + - + - + - - - + + + - + - - + + - + - + - + - + + - - - - + + + + + - - - - - + + + - + - + - - + + - - + + - + - + - - - - + + + + - + - + - - - - + @@ -11151,15 +7672,15 @@ Item2 as TotalReward) - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 + + true + 0 + 0 + 0 + NaN + true + 100 + 1000 @@ -11190,11 +7711,10 @@ Item2 as TotalReward) OdorEndValveState - - + Write - - 0 + + 0 @@ -11205,105 +7725,190 @@ Item2 as TotalReward) HarpTreadmillCommands - - LoggingRootPath - - - - - - - - SubjectSchema - - - RemotePath - - - NotNull + + ZeroYAxis - - Source1 + + RigSchema - - NullOrEmpty - String.IsNullOrEmpty(it) + + Manipulator + + + Calibration + + + Input + + + + + + + + + AxisConfiguration + + + + + + + + + Source1 + + + Axis + + + + Y1 + + + + + Y2 + + + + + + + + + + + + + + + + + + + + + ZeroAxis + + + + Source1 + + + + 1 + + + + axisConfiguration + + + axisConfiguration + + + Axis + + + OffsetRegister85 + it + 85 + + + + 1 + + + + TargetRegister + + + TargetRegister + + + + + + + + Write + + 0 + S32 + 0 + + + + StepperDriverCommands + + + + 1 + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + - - - - - CompoundRootPath - - - SessionPath - - - {0}/{1} - Item1, Item2 - - - - - - - - true - /E /DCOPY:DAT /R:100 /W:3 /tee - Normal + + 1 - - SubjectSchema - - - RemotePath + + Write + + 0 + - - NotNull - - - - Source1 - - - NullOrEmpty - String.IsNullOrEmpty(it) - - - - - - - - - - + + + 1 + - - StartExperiment + + HarpTreadmillCommands - - - + @@ -11315,26 +7920,17 @@ Item2 as TotalReward) - + + - + + - + - - - - - - - - - - - - - + + @@ -11357,23 +7953,22 @@ Item2 as TotalReward) - - - - - - - - - - - - + + + + + + + + + + + + - \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py index 2bc553f6..f7760d56 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,11 +1,16 @@ import glob import importlib.util +import logging from pathlib import Path from types import ModuleType EXAMPLES_DIR = Path(__file__).parents[1] / "examples" JSON_ROOT = Path("./local").resolve() +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) +logging.disable(logging.CRITICAL) + def build_example(script_path: str) -> ModuleType: module_name = Path(script_path).stem diff --git a/tests/test_aind_data_mapper.py b/tests/test_aind_data_mapper.py new file mode 100644 index 00000000..b5bf0f8f --- /dev/null +++ b/tests/test_aind_data_mapper.py @@ -0,0 +1,72 @@ +import sys +import unittest +from datetime import datetime +from pathlib import Path +from unittest.mock import MagicMock, patch + +from aind_behavior_vr_foraging.data_mappers import ( + AindRigDataMapper, + AindSessionDataMapper, +) +from aind_data_schema.core.rig import Rig +from git import Repo + +sys.path.append(".") +from examples.examples import mock_rig, mock_session, mock_task_logic # isort:skip # pylint: disable=wrong-import-position + + +class TestAindSessionDataMapper(unittest.TestCase): + def setUp(self): + self.session_model = mock_session() + self.rig_model = mock_rig() + self.task_logic_model = mock_task_logic() + self.repository = Repo(Path("./")) + self.script_path = Path("./src/vr-foraging.bonsai") + self.session_end_time = datetime.now() + self.session_directory = None + + self.mapper = AindSessionDataMapper( + session_model=self.session_model, + rig_model=self.rig_model, + task_logic_model=self.task_logic_model, + repository=self.repository, + script_path=self.script_path, + session_end_time=self.session_end_time, + ) + + @patch("aind_behavior_vr_foraging.data_mappers.AindSessionDataMapper._map") + def test_mock_map(self, mock_map): + mock_map.return_value = MagicMock() + result = self.mapper.map() + self.assertIsNotNone(result) + self.assertTrue(self.mapper.is_mapped()) + + def test_map(self): + mapped = self.mapper.map() + self.assertIsNotNone(mapped) + + +class TestAindRigDataMapper(unittest.TestCase): + def setUp(self): + self.rig_schema_filename = "rig_schema.json" + self.db_root = MagicMock() + self.session_directory = MagicMock() + self.db_suffix = "test_suffix" + self.mapper = AindRigDataMapper( + rig_schema_filename=self.rig_schema_filename, + db_root=self.db_root, + db_suffix=self.db_suffix, + ) + + @patch("pathlib.Path.exists", return_value=True) + @patch("aind_behavior_vr_foraging.data_mappers.model_from_json_file") + def test_mock_map(self, mock_model_from_json_file, mock_path_exists): + mock_model_from_json_file.return_value = MagicMock(spec=Rig) + result = self.mapper.map() + self.assertIsNotNone(result) + self.assertTrue(self.mapper.mapped) + self.assertIsInstance(result, Rig) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 1051f969..74d716dd 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -1,6 +1,7 @@ import os import sys import unittest +import warnings from pathlib import Path from typing import Generic, List, Optional, TypeVar, Union @@ -11,8 +12,8 @@ from pydantic import ValidationError sys.path.append(".") -from examples import examples # noqa: E402 # isort:skip # pylint: disable=wrong-import-position -from tests import JSON_ROOT # noqa: E402 # isort:skip # pylint: disable=wrong-import-position +from examples import examples # isort:skip # pylint: disable=wrong-import-position +from tests import JSON_ROOT # isort:skip # pylint: disable=wrong-import-position TModel = TypeVar("TModel", bound=Union[AindVrForagingRig, AindVrForagingTaskLogic, AindBehaviorSessionModel]) @@ -43,11 +44,13 @@ def test_deserialization(self): stdout = completed_proc.stdout.decode().split("\n") stdout = [line for line in stdout if (line or line != "")] - for model in models_to_test: - try: - model.try_deserialization(stdout) - except ValueError: - self.fail(f"Could not find a match for {model.input_model.__class__.__name__}.") + with warnings.catch_warnings(): # suppress the warnings relative to the coercion of version across schemas + warnings.simplefilter("ignore") + for model in models_to_test: + try: + model.try_deserialization(stdout) + except ValueError: + self.fail(f"Could not find a match for {model.input_model.__class__.__name__}.") class TestModel(Generic[TModel]): diff --git a/tests/test_examples.py b/tests/test_examples.py index 2cae94b0..d4643ec0 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -1,11 +1,11 @@ -""" testing examples """ +"""testing examples""" import glob import sys import unittest sys.path.append(".") -from tests import EXAMPLES_DIR, build_example # noqa: E402 # isort:skip # pylint: disable=wrong-import-position +from tests import EXAMPLES_DIR, build_example # isort:skip # pylint: disable=wrong-import-position class ExampleTests(unittest.TestCase): diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..b0ba78b8 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1671 @@ +version = 1 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] + +[[package]] +name = "aind-behavior-curriculum" +version = "0.0.30" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "pydantic" }, + { name = "semver" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/76/5dbd7f48de65b1cedd77c3edc34227788a8def5920ad2cf82023cdec6991/aind_behavior_curriculum-0.0.30.tar.gz", hash = "sha256:697567505fa3a3cc8c5ba24b7e70ae67e180c2671e5f6686e3c8c6cfdccc187f", size = 121445 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/bd/5c90c48f6079e27379d82cd6ac182df8193c81c4f8034d230b9a977257e7/aind_behavior_curriculum-0.0.30-py3-none-any.whl", hash = "sha256:193f243a69b663299afe75661d007ba545249d78a8b52c4277e18630dca2a149", size = 46762 }, +] + +[[package]] +name = "aind-behavior-experiment-launcher" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-behavior-services" }, + { name = "aind-slims-api" }, + { name = "gitpython" }, + { name = "pydantic" }, + { name = "semver" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/88/9e2f7a202bd478b864e1b3871f6fada8f41d4bcac0ef5b45b122553bd090/aind_behavior_experiment_launcher-0.3.2.tar.gz", hash = "sha256:2e111d5de9b57b850c9ac81639f942c6039e854aea68d8b130f79b4508894d1e", size = 121198 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/fb/5b57ebb9adf0d4a3edfab1ff05a865d0cdd512786e54a14979f9847a0d66/aind_behavior_experiment_launcher-0.3.2-py3-none-any.whl", hash = "sha256:0787c759040d2878f0399282be676ec1144f75029a27b1eb114fb8801a55f7f8", size = 32180 }, +] + +[package.optional-dependencies] +aind-services = [ + { name = "aind-data-schema" }, + { name = "aind-watchdog-service" }, +] + +[[package]] +name = "aind-behavior-services" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-behavior-curriculum" }, + { name = "gitpython" }, + { name = "harp-python" }, + { name = "pydantic" }, + { name = "scikit-learn" }, + { name = "semver" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/80/d1cd200bb33646f349e3022c9535b38075297ada53b5ca46c13deed93d52/aind_behavior_services-0.9.0.tar.gz", hash = "sha256:98b90a941eb77a7997ecdc9aa535202adfcf4776422aaeb8320c4aee5197025e", size = 132343 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/b6/5e52385734b15ce277154f8426fd7a8339833d038306bca59333b4fc5109/aind_behavior_services-0.9.0-py3-none-any.whl", hash = "sha256:fbbbb7c16b34957ba7e47aabaf503af4788683278ddfc14a22a1fa6f7ac96d54", size = 44208 }, +] + +[[package]] +name = "aind-behavior-vr-foraging" +source = { editable = "." } +dependencies = [ + { name = "aind-behavior-services" }, +] + +[package.optional-dependencies] +dev = [ + { name = "aind-behavior-experiment-launcher", extra = ["aind-services"] }, + { name = "codespell" }, + { name = "ruff" }, +] +docs = [ + { name = "autodoc-pydantic", extra = ["erdantic"] }, + { name = "furo" }, + { name = "myst-parser" }, + { name = "sphinx" }, + { name = "sphinx-jinja" }, + { name = "sphinx-jsonschema" }, +] +launcher = [ + { name = "aind-behavior-experiment-launcher", extra = ["aind-services"] }, +] + +[package.metadata] +requires-dist = [ + { name = "aind-behavior-experiment-launcher", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = "<0.4" }, + { name = "aind-behavior-services", specifier = ">=0.9,<0.10" }, + { name = "aind-behavior-vr-foraging", extras = ["launcher"], marker = "extra == 'dev'" }, + { name = "autodoc-pydantic", extras = ["erdantic"], marker = "extra == 'docs'" }, + { name = "codespell", marker = "extra == 'dev'" }, + { name = "furo", marker = "extra == 'docs'" }, + { name = "myst-parser", marker = "extra == 'docs'" }, + { name = "ruff", marker = "extra == 'dev'" }, + { name = "sphinx", marker = "extra == 'docs'", specifier = "<7.3" }, + { name = "sphinx-jinja", marker = "extra == 'docs'" }, + { name = "sphinx-jsonschema", marker = "extra == 'docs'" }, +] + +[[package]] +name = "aind-codeocean-pipeline-monitor" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "codeocean" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/05/ccb869264de5c7ab11af0bcd81452af9b221e9e9d904ec1e66f4b53fbe6b/aind_codeocean_pipeline_monitor-0.6.0.tar.gz", hash = "sha256:1ee0e6bd375e453dd15500cdb55c1f790a5c722e129a7e11703552bfaf1d7af9", size = 44432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/1a/981396d35a4ae4b780897daa6ee0054a291c904fc4ba924a6cd2340f4c5d/aind_codeocean_pipeline_monitor-0.6.0-py3-none-any.whl", hash = "sha256:7f9f61c1da3fa4da74eb1fb86f6d5a4bfc49b89cb33752777329a5e482030044", size = 9687 }, +] + +[[package]] +name = "aind-data-schema" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-data-schema-models" }, + { name = "dictdiffer" }, + { name = "inflection" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "semver" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/6d/5aadee80644650d8da8ea9ed9c1c6f2842d23017f752c005fbfb35699f62/aind_data_schema-1.2.0.tar.gz", hash = "sha256:bde6af195fcc2c037ef21287a1f1734c6f03795b064266949db0d6bba333b7a7", size = 434850 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/e0/b0d195ec470aadf8efd0da833d9ffa990c66c85ec6fb5f8c566b3aefd6f7/aind_data_schema-1.2.0-py3-none-any.whl", hash = "sha256:083ebf585c7d04ef0515546ca785f4093d9b7193a232ffbcbda4016057fc15d3", size = 62154 }, +] + +[[package]] +name = "aind-data-schema-models" +version = "0.7.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-resources" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/41/142150bb66ce16856e75469945a3e1ec21ea4c6cdaac27bacf962854e3ac/aind_data_schema_models-0.7.5.tar.gz", hash = "sha256:9605f0999930b595b9d92316ada0b3a8fa8d28c537330cc5f6198cc8e59d3dee", size = 552889 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/c1/e2177d7e0fa1102e4dcd4563d519c9ed56177d0b6df552dd9e50aacb1367/aind_data_schema_models-0.7.5-py3-none-any.whl", hash = "sha256:f6d934451c672e3c48691759cd5cfb615306c40f30625ef0323285dc69cfceff", size = 532063 }, +] + +[[package]] +name = "aind-data-transfer-models" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-codeocean-pipeline-monitor" }, + { name = "aind-data-schema-models" }, + { name = "aind-metadata-mapper" }, + { name = "aind-slurm-rest" }, + { name = "codeocean" }, + { name = "email-validator" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/45/b2a5bce7f4fd1d9f2c6147dabb8aabf99b7560841b9bb31601b442766c7e/aind_data_transfer_models-0.15.1.tar.gz", hash = "sha256:36a84c88b102620a88ac420d2ec824508521118def81af0a2f6b042ce060465b", size = 48619 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/4c/7de518f6b5fc89efae1e1d08b21303bb327d380839f1cc04ab5106125803/aind_data_transfer_models-0.15.1-py3-none-any.whl", hash = "sha256:a25ef648cb30fe1b96d2135848cc8e1cd54ea29301cda91e572fa0d47fc09256", size = 14014 }, +] + +[[package]] +name = "aind-metadata-mapper" +version = "0.18.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-data-schema-models" }, + { name = "pydantic-settings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/42/ca96fadf61cb2cd889bc89efe47cf9ca94635762ce0830f39780b019170f/aind_metadata_mapper-0.18.2.tar.gz", hash = "sha256:53bbbf8d32ee2123fa16856c7aeedd38c00c3e8d40d93f344fb8fbfd0eaa94bd", size = 661735 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/1c/14bf69391decd4309ac5e63f4ebf2ee1ec89632244409d109f3b4c7aa856/aind_metadata_mapper-0.18.2-py3-none-any.whl", hash = "sha256:88536e58faddd675ce705208fda92de4018b2d9e5dbb9cc16e7dc7910e138160", size = 91618 }, +] + +[[package]] +name = "aind-slims-api" +version = "0.1.19" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "slims-python-api" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/b7/efbf2aa737a618b500e1f57b8ce55129ab7a89f5bdfd10588ab6f0246403/aind_slims_api-0.1.19.tar.gz", hash = "sha256:93b8ba6c897f6a3acbf20c310d023a4a3f2d0c99bdbc7027755f33648dc979f9", size = 1198673 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/e9/6cc083d1bc3473cfa13e52cc7843bbd009b70c713a50951ea8ec90ec5768/aind_slims_api-0.1.19-py3-none-any.whl", hash = "sha256:c060fec354a77111b2c9c681692cbb1dd81da2619208124f04ee90088e4cccb0", size = 29893 }, +] + +[[package]] +name = "aind-slurm-rest" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/e8/771256e060bf2415c30354781256ad194b359d45fae4c127573bcc97e7af/aind_slurm_rest-0.2.1.tar.gz", hash = "sha256:a61aff6be83e098a1c33da90b9a086d2224686f1ad8700a1d1baa362504d97f2", size = 148990 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/1b/23d9ff2e501d46ded1e9acff9e0962a9cf087ff9ff26ee174849317e65ef/aind_slurm_rest-0.2.1-py3-none-any.whl", hash = "sha256:7edadbe5df69bdae9814e7aa128ad9df547fc24ebe178daaa02a7e944a632c16", size = 359526 }, +] + +[[package]] +name = "aind-watchdog-service" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aind-data-schema-models" }, + { name = "aind-data-transfer-models" }, + { name = "apscheduler" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/29/9beadd2043ee93e812a4ab6e049b6810fe686d76abdd2826d126b7d50ca9/aind_watchdog_service-0.1.1.tar.gz", hash = "sha256:a4d1862bae4f910af845b2c9634463d0202fb63833fd83df90a64cd6fd68003e", size = 389992 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/23/d4ab38e83c7a9c2e0885c0688594547abe9e416ffd6670f4ab577b9749c2/aind_watchdog_service-0.1.1-py3-none-any.whl", hash = "sha256:087d952405feb15523a4862c5af6ad337be8d624f24730a2369d6acdb4115852", size = 45999 }, +] + +[[package]] +name = "alabaster" +version = "0.7.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "apscheduler" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/00/6d6814ddc19be2df62c8c898c4df6b5b1914f3bd024b780028caa392d186/apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133", size = 107347 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/ae/9a053dd9229c0fde6b1f1f33f609ccff1ee79ddda364c756a924c6d8563b/APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da", size = 64004 }, +] + +[[package]] +name = "attrs" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, +] + +[[package]] +name = "autodoc-pydantic" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "sphinx" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001 }, +] + +[package.optional-dependencies] +erdantic = [ + { name = "erdantic" }, +] + +[[package]] +name = "babel" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "codeocean" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dataclasses-json" }, + { name = "requests" }, + { name = "requests-toolbelt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/70/e72cc532268d59fce77fca8f319dff199006f6dd018d22c053b1777e255e/codeocean-0.3.0.tar.gz", hash = "sha256:09b0c305d2e18abf86c775811e64b31a63489be9edd41f57d242f0a8b479fc3d", size = 7777 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/82/15750acf5fc829a619e6cd14ad3b5c2529117faf58808e574b6bbd937165/codeocean-0.3.0-py3-none-any.whl", hash = "sha256:42531c94aa03d5460fd4d6a1307747207bd165dacbe32f79625d3cebf157e5b1", size = 9106 }, +] + +[[package]] +name = "codespell" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/2f/706691245790ae6c63252d48b7ff5e3635951d55b3ce3c0ac13d898bf70b/codespell-2.4.0.tar.gz", hash = "sha256:587d45b14707fb8ce51339ba4cce50ae0e98ce228ef61f3c5e160e34f681be58", size = 344743 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/ce/39bfb82aa428a3ac4d94cc8c9faa3eadeadb2606eee3b584f68d9b575b43/codespell-2.4.0-py3-none-any.whl", hash = "sha256:b4c5b779f747dd481587aeecb5773301183f52b94b96ed51a28126d0482eec1d", size = 344508 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow" }, + { name = "typing-inspect" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, +] + +[[package]] +name = "dictdiffer" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/7b/35cbccb7effc5d7e40f4c55e2b79399e1853041997fcda15c9ff160abba0/dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578", size = 31513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/ef/4cb333825d10317a36a1154341ba37e6e9c087bac99c1990ef07ffdb376f/dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595", size = 16754 }, +] + +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, +] + +[[package]] +name = "docutils" +version = "0.20.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b", size = 2058365 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", size = 572666 }, +] + +[[package]] +name = "email-validator" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, +] + +[[package]] +name = "erdantic" +version = "1.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pydantic-core" }, + { name = "pygraphviz" }, + { name = "sortedcontainers-pydantic" }, + { name = "typenames" }, + { name = "typer" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/ff/30b37ea3aa78c84558d8042150adc653b2a6a9af2bde2785d37177646aca/erdantic-1.0.5.tar.gz", hash = "sha256:e35cc1babb37b8dc62fc220ce61a167afaebd11e391c6bd53882918a3b01644b", size = 813473 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/5e/eef0d436e53ca91dd5768ff5f7baa65bac8a27b90f94002c95b984556f5f/erdantic-1.0.5-py3-none-any.whl", hash = "sha256:f9ae0016d5e6116e14cf11b75c6a1ead467d7a13adbea9632df102199e22499a", size = 30261 }, +] + +[[package]] +name = "flask" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/50/dff6380f1c7f84135484e176e0cac8690af72fa90e932ad2a0a60e28c69b/flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", size = 680824 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136", size = 102979 }, +] + +[[package]] +name = "furo" +version = "2024.8.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "pygments" }, + { name = "sphinx" }, + { name = "sphinx-basic-ng" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, +] + +[[package]] +name = "gitpython" +version = "3.1.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, +] + +[[package]] +name = "harp-python" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pandas" }, + { name = "pydantic-yaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/104dcb4978e9d485c38677227c0252b0dacd2bd086066a41fce95ce7068c/harp_python-0.3.0.tar.gz", hash = "sha256:af6d406b9b7f697deabd6e70a9ed8bf1b0619bdc5672d8ed0a2eb645dbe1e79d", size = 13372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/a3/ec29a871fb25f2399cd74161a31c30fc028258ee2e2f50c599119659f53e/harp_python-0.3.0-py3-none-any.whl", hash = "sha256:a5eac6e460ba3b2d9aa52626d37cf57c4a43c59ec4a741ca55950c339945238f", size = 10939 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, +] + +[[package]] +name = "importlib-resources" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, +] + +[[package]] +name = "inflection" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454 }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "joblib" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "marshmallow" +version = "3.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/3a/b392ca6582ce5c2e515a8ca365f89b6e631d864a80ecdc72e0bc1bf3aec6/marshmallow-3.26.0.tar.gz", hash = "sha256:eb36762a1cc76d7abf831e18a3a1b26d3d481bbc74581b8e532a3d3a8115e1cb", size = 221490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/0d/80d7071803df1957c304bc096a714334dda7eb41ecfdd28dcfb49b1cde0e/marshmallow-3.26.0-py3-none-any.whl", hash = "sha256:1287bca04e6a5f4094822ac153c03da5e214a0a60bcd557b140f3e66991b8ca1", size = 50846 }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "myst-parser" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, +] + +[[package]] +name = "numpy" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/67/32c68756eed84df181c06528ff57e09138f893c4653448c4967311e0f992/numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189", size = 21220002 }, + { url = "https://files.pythonhosted.org/packages/3b/89/f43bcad18f2b2e5814457b1c7f7b0e671d0db12c8c0e43397ab8cb1831ed/numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323", size = 14391215 }, + { url = "https://files.pythonhosted.org/packages/9c/e6/efb8cd6122bf25e86e3dd89d9dbfec9e6861c50e8810eed77d4be59b51c6/numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac", size = 5391918 }, + { url = "https://files.pythonhosted.org/packages/47/e2/fccf89d64d9b47ffb242823d4e851fc9d36fa751908c9aac2807924d9b4e/numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e", size = 6933133 }, + { url = "https://files.pythonhosted.org/packages/34/22/5ece749c0e5420a9380eef6fbf83d16a50010bd18fef77b9193d80a6760e/numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c", size = 14338187 }, + { url = "https://files.pythonhosted.org/packages/5b/86/caec78829311f62afa6fa334c8dfcd79cffb4d24bcf96ee02ae4840d462b/numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f", size = 16393429 }, + { url = "https://files.pythonhosted.org/packages/c8/4e/0c25f74c88239a37924577d6ad780f3212a50f4b4b5f54f5e8c918d726bd/numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826", size = 15559103 }, + { url = "https://files.pythonhosted.org/packages/d4/bd/d557f10fa50dc4d5871fb9606af563249b66af2fc6f99041a10e8757c6f1/numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8", size = 18182967 }, + { url = "https://files.pythonhosted.org/packages/30/e9/66cc0f66386d78ed89e45a56e2a1d051e177b6e04477c4a41cd590ef4017/numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50", size = 6571499 }, + { url = "https://files.pythonhosted.org/packages/66/a3/4139296b481ae7304a43581046b8f0a20da6a0dfe0ee47a044cade796603/numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2", size = 12919805 }, + { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, + { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, + { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, + { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, + { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, + { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, + { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, + { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, + { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, + { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 }, + { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 }, + { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 }, + { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 }, + { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 }, + { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 }, + { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 }, + { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 }, + { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 }, + { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 }, + { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 }, + { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 }, + { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 }, + { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 }, + { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 }, + { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 }, + { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 }, + { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 }, + { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 }, + { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 }, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pydantic-settings" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 }, +] + +[[package]] +name = "pydantic-yaml" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "ruamel-yaml" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/b8/19446b74d31a6ff09eb69af3be01c5031c8bf5dc62e4205a22d50d629333/pydantic_yaml-1.4.0.tar.gz", hash = "sha256:09f6b9ec9d80550dd3a58596a6a0948a1830fae94b73329b95c2b9dbfc35ae00", size = 21454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/e1/e4b108753491a6545c66cdd7546e726b056bbe3902f9ef8a58ed118afd70/pydantic_yaml-1.4.0-py3-none-any.whl", hash = "sha256:f9ad82d8c0548e779e00d6ec639f6efa8f8c7e14d12d0bf9fdc400a37300d7ba", size = 17926 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pygraphviz" +version = "1.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b08e1f5aea12468ef334f0732c65cbb18df2a7f285c87/pygraphviz-1.14.tar.gz", hash = "sha256:c10df02377f4e39b00ae17c862f4ee7e5767317f1c6b2dfd04cea6acc7fc2bea", size = 106003 } + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "pytz" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 }, + { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 }, + { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 }, + { url = "https://files.pythonhosted.org/packages/9a/e9/835196a69cb229d5c31c13b8ae603bd2da9a6695f35fe4270d398e1db44c/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", size = 386171 }, + { url = "https://files.pythonhosted.org/packages/f9/8e/33fc4eba6683db71e91e6d594a2cf3a8fbceb5316629f0477f7ece5e3f75/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", size = 422676 }, + { url = "https://files.pythonhosted.org/packages/37/47/2e82d58f8046a98bb9497a8319604c92b827b94d558df30877c4b3c6ccb3/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", size = 446152 }, + { url = "https://files.pythonhosted.org/packages/e1/78/79c128c3e71abbc8e9739ac27af11dc0f91840a86fce67ff83c65d1ba195/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", size = 381300 }, + { url = "https://files.pythonhosted.org/packages/c9/5b/2e193be0e8b228c1207f31fa3ea79de64dadb4f6a4833111af8145a6bc33/rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", size = 409636 }, + { url = "https://files.pythonhosted.org/packages/c2/3f/687c7100b762d62186a1c1100ffdf99825f6fa5ea94556844bbbd2d0f3a9/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", size = 556708 }, + { url = "https://files.pythonhosted.org/packages/8c/a2/c00cbc4b857e8b3d5e7f7fc4c81e23afd8c138b930f4f3ccf9a41a23e9e4/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", size = 583554 }, + { url = "https://files.pythonhosted.org/packages/d0/08/696c9872cf56effdad9ed617ac072f6774a898d46b8b8964eab39ec562d2/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", size = 552105 }, + { url = "https://files.pythonhosted.org/packages/18/1f/4df560be1e994f5adf56cabd6c117e02de7c88ee238bb4ce03ed50da9d56/rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", size = 220199 }, + { url = "https://files.pythonhosted.org/packages/b8/1b/c29b570bc5db8237553002788dc734d6bd71443a2ceac2a58202ec06ef12/rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", size = 231775 }, + { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 }, + { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 }, + { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 }, + { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 }, + { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 }, + { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 }, + { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 }, + { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 }, + { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 }, + { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 }, + { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 }, + { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 }, + { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 }, + { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 }, + { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 }, + { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 }, + { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 }, + { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 }, + { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 }, + { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 }, + { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 }, + { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 }, + { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 }, + { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 }, + { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 }, + { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 }, + { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 }, + { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 }, + { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 }, + { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 }, + { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 }, + { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 }, + { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 }, + { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 }, + { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 }, + { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 }, + { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 }, + { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 }, + { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.13' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729 }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224 }, + { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480 }, + { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068 }, + { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012 }, + { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352 }, + { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344 }, + { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498 }, + { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205 }, + { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185 }, + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, +] + +[[package]] +name = "ruff" +version = "0.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/7f/60fda2eec81f23f8aa7cbbfdf6ec2ca11eb11c273827933fb2541c2ce9d8/ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a", size = 3586740 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/77/4fb790596d5d52c87fd55b7160c557c400e90f6116a56d82d76e95d9374a/ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624", size = 11656815 }, + { url = "https://files.pythonhosted.org/packages/a2/a8/3338ecb97573eafe74505f28431df3842c1933c5f8eae615427c1de32858/ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c", size = 11594821 }, + { url = "https://files.pythonhosted.org/packages/8e/89/320223c3421962762531a6b2dd58579b858ca9916fb2674874df5e97d628/ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4", size = 11040475 }, + { url = "https://files.pythonhosted.org/packages/b2/bd/1d775eac5e51409535804a3a888a9623e87a8f4b53e2491580858a083692/ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439", size = 11856207 }, + { url = "https://files.pythonhosted.org/packages/7f/c6/3e14e09be29587393d188454064a4aa85174910d16644051a80444e4fd88/ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5", size = 11420460 }, + { url = "https://files.pythonhosted.org/packages/ef/42/b7ca38ffd568ae9b128a2fa76353e9a9a3c80ef19746408d4ce99217ecc1/ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4", size = 12605472 }, + { url = "https://files.pythonhosted.org/packages/a6/a1/3167023f23e3530fde899497ccfe239e4523854cb874458ac082992d206c/ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1", size = 13243123 }, + { url = "https://files.pythonhosted.org/packages/d0/b4/3c600758e320f5bf7de16858502e849f4216cb0151f819fa0d1154874802/ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5", size = 12744650 }, + { url = "https://files.pythonhosted.org/packages/be/38/266fbcbb3d0088862c9bafa8b1b99486691d2945a90b9a7316336a0d9a1b/ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4", size = 14458585 }, + { url = "https://files.pythonhosted.org/packages/63/a6/47fd0e96990ee9b7a4abda62de26d291bd3f7647218d05b7d6d38af47c30/ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6", size = 12419624 }, + { url = "https://files.pythonhosted.org/packages/84/5d/de0b7652e09f7dda49e1a3825a164a65f4998175b6486603c7601279baad/ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730", size = 11843238 }, + { url = "https://files.pythonhosted.org/packages/9e/be/3f341ceb1c62b565ec1fb6fd2139cc40b60ae6eff4b6fb8f94b1bb37c7a9/ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2", size = 11484012 }, + { url = "https://files.pythonhosted.org/packages/a3/c8/ff8acbd33addc7e797e702cf00bfde352ab469723720c5607b964491d5cf/ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519", size = 12038494 }, + { url = "https://files.pythonhosted.org/packages/73/b1/8d9a2c0efbbabe848b55f877bc10c5001a37ab10aca13c711431673414e5/ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b", size = 12473639 }, + { url = "https://files.pythonhosted.org/packages/cb/44/a673647105b1ba6da9824a928634fe23186ab19f9d526d7bdf278cd27bc3/ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c", size = 9834353 }, + { url = "https://files.pythonhosted.org/packages/c3/01/65cadb59bf8d4fbe33d1a750103e6883d9ef302f60c28b73b773092fbde5/ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4", size = 10821444 }, + { url = "https://files.pythonhosted.org/packages/69/cb/b3fe58a136a27d981911cba2f18e4b29f15010623b79f0f2510fd0d31fd3/ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b", size = 10038168 }, +] + +[[package]] +name = "scikit-learn" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/2a/e291c29670795406a824567d1dfc91db7b699799a002fdaa452bceea8f6e/scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33", size = 12102620 }, + { url = "https://files.pythonhosted.org/packages/25/92/ee1d7a00bb6b8c55755d4984fd82608603a3cc59959245068ce32e7fb808/scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d", size = 11116234 }, + { url = "https://files.pythonhosted.org/packages/30/cd/ed4399485ef364bb25f388ab438e3724e60dc218c547a407b6e90ccccaef/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2", size = 12592155 }, + { url = "https://files.pythonhosted.org/packages/a8/f3/62fc9a5a659bb58a03cdd7e258956a5824bdc9b4bb3c5d932f55880be569/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8", size = 13497069 }, + { url = "https://files.pythonhosted.org/packages/a1/a6/c5b78606743a1f28eae8f11973de6613a5ee87366796583fb74c67d54939/scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415", size = 11139809 }, + { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516 }, + { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837 }, + { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728 }, + { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700 }, + { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613 }, + { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001 }, + { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360 }, + { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004 }, + { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776 }, + { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865 }, + { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804 }, + { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530 }, + { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852 }, + { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256 }, +] + +[[package]] +name = "scipy" +version = "1.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/c6/8eb0654ba0c7d0bb1bf67bf8fbace101a8e4f250f7722371105e8b6f68fc/scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6", size = 59407493 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/2e/7b71312da9c2dabff53e7c9a9d08231bc34d9d8fdabe88a6f1155b44591c/scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2", size = 41424362 }, + { url = "https://files.pythonhosted.org/packages/81/8c/ab85f1aa1cc200c796532a385b6ebf6a81089747adc1da7482a062acc46c/scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0", size = 32535910 }, + { url = "https://files.pythonhosted.org/packages/3b/9c/6f4b787058daa8d8da21ddff881b4320e28de4704a65ec147adb50cb2230/scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf", size = 24809398 }, + { url = "https://files.pythonhosted.org/packages/16/2b/949460a796df75fc7a1ee1becea202cf072edbe325ebe29f6d2029947aa7/scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac", size = 27918045 }, + { url = "https://files.pythonhosted.org/packages/5f/36/67fe249dd7ccfcd2a38b25a640e3af7e59d9169c802478b6035ba91dfd6d/scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df", size = 38332074 }, + { url = "https://files.pythonhosted.org/packages/fc/da/452e1119e6f720df3feb588cce3c42c5e3d628d4bfd4aec097bd30b7de0c/scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7", size = 40588469 }, + { url = "https://files.pythonhosted.org/packages/7f/71/5f94aceeac99a4941478af94fe9f459c6752d497035b6b0761a700f5f9ff/scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a", size = 42965214 }, + { url = "https://files.pythonhosted.org/packages/af/25/caa430865749d504271757cafd24066d596217e83326155993980bc22f97/scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b", size = 43896034 }, + { url = "https://files.pythonhosted.org/packages/d8/6e/a9c42d0d39e09ed7fd203d0ac17adfea759cba61ab457671fe66e523dbec/scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776", size = 41478318 }, + { url = "https://files.pythonhosted.org/packages/04/ee/e3e535c81828618878a7433992fecc92fa4df79393f31a8fea1d05615091/scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f", size = 32596696 }, + { url = "https://files.pythonhosted.org/packages/c4/5e/b1b0124be8e76f87115f16b8915003eec4b7060298117715baf13f51942c/scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04", size = 24870366 }, + { url = "https://files.pythonhosted.org/packages/14/36/c00cb73eefda85946172c27913ab995c6ad4eee00fa4f007572e8c50cd51/scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9", size = 28007461 }, + { url = "https://files.pythonhosted.org/packages/68/94/aff5c51b3799349a9d1e67a056772a0f8a47db371e83b498d43467806557/scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce", size = 38068174 }, + { url = "https://files.pythonhosted.org/packages/b0/3c/0de11ca154e24a57b579fb648151d901326d3102115bc4f9a7a86526ce54/scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2", size = 40249869 }, + { url = "https://files.pythonhosted.org/packages/15/09/472e8d0a6b33199d1bb95e49bedcabc0976c3724edd9b0ef7602ccacf41e/scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5", size = 42629068 }, + { url = "https://files.pythonhosted.org/packages/ff/ba/31c7a8131152822b3a2cdeba76398ffb404d81d640de98287d236da90c49/scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d", size = 43621992 }, + { url = "https://files.pythonhosted.org/packages/2b/bf/dd68965a4c5138a630eeed0baec9ae96e5d598887835bdde96cdd2fe4780/scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85", size = 41441136 }, + { url = "https://files.pythonhosted.org/packages/ef/5e/4928581312922d7e4d416d74c416a660addec4dd5ea185401df2269ba5a0/scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692", size = 32533699 }, + { url = "https://files.pythonhosted.org/packages/32/90/03f99c43041852837686898c66767787cd41c5843d7a1509c39ffef683e9/scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab", size = 24807289 }, + { url = "https://files.pythonhosted.org/packages/9d/52/bfe82b42ae112eaba1af2f3e556275b8727d55ac6e4932e7aef337a9d9d4/scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c", size = 27929844 }, + { url = "https://files.pythonhosted.org/packages/f6/77/54ff610bad600462c313326acdb035783accc6a3d5f566d22757ad297564/scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e", size = 38031272 }, + { url = "https://files.pythonhosted.org/packages/f1/26/98585cbf04c7cf503d7eb0a1966df8a268154b5d923c5fe0c1ed13154c49/scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e", size = 40210217 }, + { url = "https://files.pythonhosted.org/packages/fd/3f/3d2285eb6fece8bc5dbb2f9f94d61157d61d155e854fd5fea825b8218f12/scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4", size = 42587785 }, + { url = "https://files.pythonhosted.org/packages/48/7d/5b5251984bf0160d6533695a74a5fddb1fa36edd6f26ffa8c871fbd4782a/scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef", size = 43640439 }, + { url = "https://files.pythonhosted.org/packages/e7/b8/0e092f592d280496de52e152582030f8a270b194f87f890e1a97c5599b81/scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b", size = 41619862 }, + { url = "https://files.pythonhosted.org/packages/f6/19/0b6e1173aba4db9e0b7aa27fe45019857fb90d6904038b83927cbe0a6c1d/scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95", size = 32610387 }, + { url = "https://files.pythonhosted.org/packages/e7/02/754aae3bd1fa0f2479ade3cfdf1732ecd6b05853f63eee6066a32684563a/scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364", size = 24883814 }, + { url = "https://files.pythonhosted.org/packages/1f/ac/d7906201604a2ea3b143bb0de51b3966f66441ba50b7dc182c4505b3edf9/scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0", size = 27944865 }, + { url = "https://files.pythonhosted.org/packages/84/9d/8f539002b5e203723af6a6f513a45e0a7671e9dabeedb08f417ac17e4edc/scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54", size = 39883261 }, + { url = "https://files.pythonhosted.org/packages/97/c0/62fd3bab828bcccc9b864c5997645a3b86372a35941cdaf677565c25c98d/scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c", size = 42093299 }, + { url = "https://files.pythonhosted.org/packages/e4/1f/5d46a8d94e9f6d2c913cbb109e57e7eed914de38ea99e2c4d69a9fc93140/scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5", size = 43181730 }, +] + +[[package]] +name = "semver" +version = "3.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912 }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "slims-python-api" +version = "6.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecation" }, + { name = "flask" }, + { name = "requests" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/a0/c3e4894d833692f8693351d77a82631d907f26b5ea2bf64a72186141fba1/slims-python-api-6.9.0.tar.gz", hash = "sha256:195c6b30520425d75dea7ab8d326e59a2125efcd8d14cc966d5cfade93712265", size = 21087 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/6a/223b7fec5f5a9552c894d9600db5df78589be5d7639dd9cb815a05863009/slims_python_api-6.9.0-py2.py3-none-any.whl", hash = "sha256:15ddc0fc5da62329d2a4fd8cae2f5349202cd09aead90593a67e54d3c86e4798", size = 17005 }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, +] + +[[package]] +name = "sortedcontainers-pydantic" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "pydantic-core" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/39/b8dbaf922f4f0fd1d7d033f12fe22b5c8b14a41eac6caab671e9cb59144b/sortedcontainers_pydantic-1.0.0.tar.gz", hash = "sha256:eb0e4aeb5197d690165f0a7b1a55c490eabe4b21375c3a91726373b2551e25ee", size = 8191 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/f4/4d01fd09a88a6d9707b4609568415cb21585e83f42282dd848c9bc0af95c/sortedcontainers_pydantic-1.0.0-py3-none-any.whl", hash = "sha256:07e92e9b85dbf9248e0a5b59e0311a095e6fb27e0dc461b1209ead5a550b60b2", size = 4619 }, +] + +[[package]] +name = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + +[[package]] +name = "sphinx" +version = "7.2.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/8e/6e51da4b26665b4b92b1944ea18b2d9c825e753e19180cc5bdc818d0ed3b/sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5", size = 7015183 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560", size = 3207959 }, +] + +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, +] + +[[package]] +name = "sphinx-jinja" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/90/7cf0e91aadcb5b3ff4796acbaf2c7887a55434df360914af9fc067c753c1/sphinx-jinja-2.0.2.tar.gz", hash = "sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718", size = 4587 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/9f/81fe50b1861bda8c02b4272a166d14455411e04865ddaf3616f25d12cd50/sphinx_jinja-2.0.2-py3-none-any.whl", hash = "sha256:705ebeb9b7a6018ca3f93724315a7c1effa6ba3db44d630e7eaaa15e4ac081a8", size = 4355 }, +] + +[[package]] +name = "sphinx-jsonschema" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jsonpointer" }, + { name = "pyyaml" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/3f/559d054f977596c5535edfeeab1f3a278f3bbb81bada2a1cb3cadbf7bb67/sphinx-jsonschema-1.19.1.tar.gz", hash = "sha256:b2385fe1c7acf2e759152aefed0cb17c920645b2a75c9934000c9c528e7d53c1", size = 18599 } + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, +] + +[[package]] +name = "threadpoolctl" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b5148dcbf72f5cde221f8bfe3b6a540da7aa1842f6b491ad979a6c8b84af/threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107", size = 41936 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467", size = 18414 }, +] + +[[package]] +name = "typenames" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/39/4d9542b06191f7c5ab8cc9793f558fe7cd02efb10adaf13fbbc01a1a6489/typenames-1.3.0.tar.gz", hash = "sha256:205a1954512e28b6558e761c134e74d243003755676fe8cce49250b8fc192798", size = 45717 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/04/252cf801488cc05c355c5ddddb8a017be35b1f04b82a8ffcddbe59867218/typenames-1.3.0-py3-none-any.whl", hash = "sha256:666dfd7baebe3675dbdf950f19de08d5b15e5f9e0a71fe91fb8135ea68fe0889", size = 10528 }, +] + +[[package]] +name = "typer" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 }, +] + +[[package]] +name = "tzdata" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 }, +] + +[[package]] +name = "tzlocal" +version = "5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/d3/c19d65ae67636fe63953b20c2e4a8ced4497ea232c43ff8d01db16de8dc0/tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e", size = 30201 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/3f/c4c51c55ff8487f2e6d0e618dba917e3c3ee2caae6cf0fbb59c9b1876f2e/tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8", size = 17859 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, +] + +[[package]] +name = "werkzeug" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498 }, +]