diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 44b1c27d..134d7ab4 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "bonsai.sgen": { - "version": "0.6.1", + "version": "0.9.0", "commands": [ "bonsai.sgen" ] diff --git a/bonsai/Bonsai.config b/bonsai/Bonsai.config index ca095052..a220b5a6 100644 --- a/bonsai/Bonsai.config +++ b/bonsai/Bonsai.config @@ -4,10 +4,11 @@ - - - - + + + + + @@ -30,8 +31,8 @@ - - + + @@ -50,7 +51,7 @@ - + @@ -74,7 +75,7 @@ - + @@ -84,6 +85,7 @@ + @@ -132,10 +134,11 @@ - - - - + + + + + @@ -157,8 +160,8 @@ - - + + @@ -175,7 +178,7 @@ - + @@ -197,7 +200,7 @@ - + diff --git a/docs/conf.py b/docs/conf.py index 323ce512..1071ef14 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,6 +3,8 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html +from typing import Type + import erdantic as erd from pydantic import BaseModel @@ -81,7 +83,7 @@ def linkcode_resolve(domain, info): _static_path = "_static" -def export_model_diagram(model: BaseModel, root: str = _static_path) -> None: +def export_model_diagram(model: Type[BaseModel], root: str = _static_path) -> None: diagram = erd.create(model) diagram.draw(f"{root}/{model.__name__}.svg") diff --git a/examples/rig.py b/examples/rig.py index b55ccf99..33ab84d1 100644 --- a/examples/rig.py +++ b/examples/rig.py @@ -1,41 +1,31 @@ import datetime import os -import aind_behavior_services.rig as rig -from aind_behavior_services.calibration.aind_manipulator import ( +from aind_behavior_services.rig import cameras, visual_stimulation +from aind_behavior_services.rig.aind_manipulator import ( AindManipulatorCalibration, - AindManipulatorCalibrationInput, - AindManipulatorCalibrationOutput, Axis, AxisConfiguration, ManipulatorPosition, ) -from aind_behavior_services.calibration.olfactometer import ( +from aind_behavior_services.rig.harp import ( + HarpBehavior, + HarpLicketySplit, + HarpSniffDetector, + HarpWhiteRabbit, +) +from aind_behavior_services.rig.olfactometer import ( Olfactometer, OlfactometerCalibration, - OlfactometerCalibrationInput, - OlfactometerCalibrationOutput, OlfactometerChannel, OlfactometerChannelConfig, OlfactometerChannelType, ) -from aind_behavior_services.calibration.treadmill import ( +from aind_behavior_services.rig.treadmill import ( Treadmill, TreadmillCalibration, - TreadmillCalibrationInput, - TreadmillCalibrationOutput, -) -from aind_behavior_services.calibration.water_valve import ( - Measurement, - WaterValveCalibration, - WaterValveCalibrationInput, -) -from aind_behavior_services.rig.harp import ( - HarpBehavior, - HarpLicketySplit, - HarpSniffDetector, - HarpWhiteRabbit, ) +from aind_behavior_services.rig.water_valve import Measurement, calibrate_water_valves from aind_behavior_vr_foraging.rig import ( AindManipulatorDevice, @@ -44,85 +34,78 @@ ) manipulator_calibration = AindManipulatorCalibration( - output=AindManipulatorCalibrationOutput(), - input=AindManipulatorCalibrationInput( - full_step_to_mm=(ManipulatorPosition(x=0.010, y1=0.010, y2=0.010, z=0.010)), - axis_configuration=[ - AxisConfiguration(axis=Axis.Y1, min_limit=-0.01, max_limit=25), - AxisConfiguration(axis=Axis.Y2, min_limit=-0.01, max_limit=25), - AxisConfiguration(axis=Axis.X, min_limit=-0.01, max_limit=25), - AxisConfiguration(axis=Axis.Z, min_limit=-0.01, max_limit=25), - ], - homing_order=[Axis.Y1, Axis.Y2, Axis.X, Axis.Z], - initial_position=ManipulatorPosition(y1=0, y2=0, x=0, z=0), - ), + full_step_to_mm=(ManipulatorPosition(x=0.010, y1=0.010, y2=0.010, z=0.010)), + axis_configuration=[ + AxisConfiguration(axis=Axis.Y1, min_limit=-0.01, max_limit=25), + AxisConfiguration(axis=Axis.Y2, min_limit=-0.01, max_limit=25), + AxisConfiguration(axis=Axis.X, min_limit=-0.01, max_limit=25), + AxisConfiguration(axis=Axis.Z, min_limit=-0.01, max_limit=25), + ], + homing_order=[Axis.Y1, Axis.Y2, Axis.X, Axis.Z], + initial_position=ManipulatorPosition(y1=0, y2=0, x=0, z=0), ) olfactometer_calibration = OlfactometerCalibration( - output=OlfactometerCalibrationOutput(), date=datetime.datetime.now(), - input=OlfactometerCalibrationInput( - channel_config={ - OlfactometerChannel.Channel0: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel0, - channel_type=OlfactometerChannelType.ODOR, - flow_rate_capacity=100, - flow_rate=100, - odorant="Amyl Acetate", - odorant_dilution=1.5, - ), - OlfactometerChannel.Channel1: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel1, - channel_type=OlfactometerChannelType.ODOR, - flow_rate_capacity=100, - flow_rate=100, - odorant="Banana", - odorant_dilution=1.5, - ), - OlfactometerChannel.Channel2: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel2, - channel_type=OlfactometerChannelType.ODOR, - flow_rate_capacity=100, - flow_rate=100, - odorant="Apple", - odorant_dilution=1.5, - ), - OlfactometerChannel.Channel3: OlfactometerChannelConfig( - channel_index=OlfactometerChannel.Channel3, - channel_type=OlfactometerChannelType.CARRIER, - flow_rate_capacity=1000, - ), - } - ), + channel_config={ + OlfactometerChannel.Channel0: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel0, + channel_type=OlfactometerChannelType.ODOR, + flow_rate_capacity=100, + flow_rate=100, + odorant="Amyl Acetate", + odorant_dilution=1.5, + ), + OlfactometerChannel.Channel1: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel1, + channel_type=OlfactometerChannelType.ODOR, + flow_rate_capacity=100, + flow_rate=100, + odorant="Banana", + odorant_dilution=1.5, + ), + OlfactometerChannel.Channel2: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel2, + channel_type=OlfactometerChannelType.ODOR, + flow_rate_capacity=100, + flow_rate=100, + odorant="Apple", + odorant_dilution=1.5, + ), + OlfactometerChannel.Channel3: OlfactometerChannelConfig( + channel_index=OlfactometerChannel.Channel3, + channel_type=OlfactometerChannelType.CARRIER, + flow_rate_capacity=1000, + ), + }, ) -water_valve_input = WaterValveCalibrationInput( +water_valve_calibration = calibrate_water_valves( measurements=[ Measurement(valve_open_interval=0.2, valve_open_time=0.01, water_weight=[0.6, 0.6], repeat_count=200), Measurement(valve_open_interval=0.2, valve_open_time=0.02, water_weight=[1.2, 1.2], repeat_count=200), ] ) -water_valve_calibration = WaterValveCalibration( - input=water_valve_input, output=water_valve_input.calibrate_output(), date=datetime.datetime.now() -) -video_writer = rig.cameras.VideoWriterFfmpeg(frame_rate=120, container_extension="mp4") +video_writer = cameras.VideoWriterFfmpeg(frame_rate=120, container_extension="mp4") rig = AindVrForagingRig( + data_directory=r"C:/data", + computer_name="TestRigComputer", rig_name="test_rig", - triggered_camera_controller=rig.cameras.CameraController[rig.cameras.SpinnakerCamera]( + triggered_camera_controller=cameras.CameraController[cameras.SpinnakerCamera]( frame_rate=120, cameras={ - "FaceCamera": rig.cameras.SpinnakerCamera( + "FaceCamera": cameras.SpinnakerCamera( serial_number="SerialNumber", binning=1, exposure=5000, gain=0, video_writer=video_writer ), - "SideCamera": rig.cameras.SpinnakerCamera( + "SideCamera": cameras.SpinnakerCamera( serial_number="SerialNumber", binning=1, exposure=5000, gain=0, video_writer=video_writer ), }, ), - monitoring_camera_controller=rig.cameras.CameraController[rig.cameras.WebCamera]( - cameras={"WebCam0": rig.cameras.WebCamera(index=0)} + monitoring_camera_controller=cameras.CameraController[cameras.WebCamera]( + cameras={"WebCam0": cameras.WebCamera(index=0)} ), harp_behavior=HarpBehavior(port_name="COM3"), harp_olfactometer=Olfactometer(port_name="COM4", calibration=olfactometer_calibration), @@ -133,14 +116,11 @@ harp_treadmill=Treadmill( port_name="COM8", calibration=TreadmillCalibration( - input=TreadmillCalibrationInput(), - output=TreadmillCalibrationOutput( - wheel_diameter=15, pulses_per_revolution=28800, brake_lookup_calibration=[[0, 0], [1, 65535]] - ), + wheel_diameter=15, pulses_per_revolution=28800, brake_lookup_calibration=[[0, 0], [1, 65535]] ), ), manipulator=AindManipulatorDevice(port_name="COM9", calibration=manipulator_calibration), - screen=rig.visual_stimulation.Screen(display_index=1), + screen=visual_stimulation.ScreenAssembly(display_index=1), calibration=RigCalibration(water_valve=water_valve_calibration), ) diff --git a/examples/session.py b/examples/session.py index 3fed0bf1..d8e9c512 100644 --- a/examples/session.py +++ b/examples/session.py @@ -1,15 +1,13 @@ import datetime import os -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.session import Session -session = AindBehaviorSessionModel( +session = Session( date=datetime.datetime.now(tz=datetime.timezone.utc), experiment="AindVrForaging", - root_path="c://", subject="test", notes="test session", - experiment_version="0.1.0", allow_dirty_repo=True, skip_hardware_validation=False, experimenter=["Foo", "Bar"], diff --git a/examples/task_mcm.py b/examples/task_mcm.py index 9de7adb5..90e0593f 100644 --- a/examples/task_mcm.py +++ b/examples/task_mcm.py @@ -1,7 +1,7 @@ import os from typing import cast -import aind_behavior_services.task_logic.distributions as distributions +import aind_behavior_services.task.distributions as distributions import numpy as np from aind_behavior_curriculum import Stage, TrainerState from scipy.linalg import expm @@ -85,6 +85,10 @@ def compute_cmc_transition_probability(n_states, rep_rate, T=3.5, dt=0.1) -> np. rhos = [0.9, 0.9, 0.9] +def odor_concentration_from_index(odor_index: int) -> list[float]: + return [1.0 if i == odor_index else 0.0 for i in range(3)] + + def make_patch( label: str, state_index: int, @@ -118,7 +122,7 @@ def make_patch( return vr_task_logic.Patch( label=label, state_index=state_index, - odor_specification=vr_task_logic.OdorSpecification(index=odor_index, concentration=1), + odor_specification=odor_concentration_from_index(odor_index), reward_specification=vr_task_logic.RewardSpecification( amount=vr_task_logic.scalar_value(reward_amount), probability=vr_task_logic.scalar_value(p_max), diff --git a/examples/task_patch_foraging.py b/examples/task_patch_foraging.py index 70582382..3117810c 100644 --- a/examples/task_patch_foraging.py +++ b/examples/task_patch_foraging.py @@ -1,13 +1,9 @@ import os -import aind_behavior_services.task_logic.distributions as distributions +import aind_behavior_services.task.distributions as distributions from aind_behavior_curriculum import Stage, TrainerState import aind_behavior_vr_foraging.task_logic as vr_task_logic -from aind_behavior_vr_foraging.task_logic import ( - AindVrForagingTaskLogic, - AindVrForagingTaskParameters, -) def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimum, maximum): @@ -38,9 +34,7 @@ def NumericalUpdaterParametersHelper(initial_value, increment, decrement, minimu retracting_distance=2000, ), audio_control=vr_task_logic.AudioControl(frequency=1000, duration=0.2), - odor_control=vr_task_logic.OdorControl( - valve_max_open_time=100000, target_odor_flow=100, target_total_flow=1000, use_channel_3_as_carrier=True - ), + odor_control=vr_task_logic.OdorControl(target_odor_flow=100, target_total_flow=1000, use_channel_3_as_carrier=True), position_control=vr_task_logic.PositionControl( gain=vr_task_logic.Vector3(x=1, y=1, z=1), initial_position=vr_task_logic.Vector3(x=0, y=2.56, z=0), @@ -120,7 +114,7 @@ def PostPatchVirtualSiteGeneratorHelper(contrast: float = 1, friction: float = 0 patch1 = vr_task_logic.Patch( label="reset", state_index=0, - odor_specification=vr_task_logic.OdorSpecification(index=1, concentration=1), + odor_specification=[0.0, 1.0, 0.0], reward_specification=vr_task_logic.RewardSpecification( amount=vr_task_logic.scalar_value(1), probability=vr_task_logic.scalar_value(1), @@ -140,7 +134,7 @@ def PostPatchVirtualSiteGeneratorHelper(contrast: float = 1, friction: float = 0 patch2 = vr_task_logic.Patch( label="slow-replenish", state_index=1, - odor_specification=vr_task_logic.OdorSpecification(index=0, concentration=1), + odor_specification=[0.1, 0.0, 0.0], reward_specification=vr_task_logic.RewardSpecification( reward_function=[reward_function, replenish_function], operant_logic=OperantLogicHelper(), @@ -157,8 +151,8 @@ def PostPatchVirtualSiteGeneratorHelper(contrast: float = 1, friction: float = 0 first_state_occupancy=[1, 0], transition_matrix=[[1, 0], [0, 1]], patches=[patch1, patch2] ) -task_logic = AindVrForagingTaskLogic( - task_parameters=AindVrForagingTaskParameters( +task_logic = vr_task_logic.AindVrForagingTaskLogic( + task_parameters=vr_task_logic.AindVrForagingTaskParameters( rng_seed=42, updaters=updaters, environment=vr_task_logic.BlockStructure( diff --git a/examples/test_single_site_patch.py b/examples/test_single_site_patch.py index 032d9751..36f438b9 100644 --- a/examples/test_single_site_patch.py +++ b/examples/test_single_site_patch.py @@ -1,7 +1,7 @@ import os from typing import Optional -import aind_behavior_services.task_logic.distributions as distributions +import aind_behavior_services.task.distributions as distributions from aind_behavior_curriculum import Stage, TrainerState import aind_behavior_vr_foraging.task_logic as vr_task_logic @@ -31,6 +31,10 @@ ] +def odor_concentration_from_index(odor_index: int) -> list[float]: + return [1.0 if i == odor_index else 0.0 for i in range(3)] + + def make_patch( label: str, state_index: int, @@ -59,7 +63,7 @@ def make_patch( return vr_task_logic.Patch( label=label, state_index=state_index, - odor_specification=vr_task_logic.OdorSpecification(index=odor_index, concentration=1), + odor_specification=odor_concentration_from_index(odor_index), patch_terminators=[ vr_task_logic.PatchTerminatorOnChoice(count=vr_task_logic.scalar_value(1)), vr_task_logic.PatchTerminatorOnRejection(count=vr_task_logic.scalar_value(1)), diff --git a/pyproject.toml b/pyproject.toml index 98b45eb4..1402caa8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,11 +12,11 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Operating System :: Microsoft :: Windows", ] -version = "0.6.5" +version = "0.7.0rc0" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ - "aind_behavior_services>=0.12, <0.13", + "aind_behavior_services>=0.13.6", "pydantic-settings" ] @@ -31,10 +31,9 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor>=0.5.3, <0.6.0"] launcher = [ - "aind-clabe[aind-services]>=0.9.1", - "aind-data-schema>=2.2", + "aind-clabe[aind-services]>=0.10", + "aind-data-schema>=2.6", "aind_behavior_vr_foraging[data]", - "aind-watchdog-service==0.1.6.dev8" ] [dependency-groups] @@ -42,6 +41,8 @@ launcher = [ dev = [ "aind_behavior_vr_foraging[launcher]", "aind_behavior_vr_foraging[data]", + "aind-data-schema", + "aind-data-schema-models", "ruff", "codespell", ] diff --git a/scripts/aind.py b/scripts/aind.py new file mode 100644 index 00000000..1500755d --- /dev/null +++ b/scripts/aind.py @@ -0,0 +1,335 @@ +import logging +import os +from pathlib import Path +from typing import Any, cast + +from aind_behavior_services.rig.aind_manipulator import ManipulatorPosition +from aind_behavior_services.session import Session +from aind_behavior_services.utils import utcnow +from clabe import resource_monitor +from clabe.apps import ( + AindBehaviorServicesBonsaiApp, + CurriculumApp, + CurriculumSettings, + CurriculumSuggestion, +) +from clabe.data_transfer.aind_watchdog import WatchdogDataTransferService, WatchdogSettings +from clabe.launcher import Launcher, LauncherCliArgs, experiment +from clabe.pickers import ByAnimalModifier, DefaultBehaviorPickerSettings +from clabe.pickers.dataverse import DataversePicker +from contraqctor.contract.json import SoftwareEvents +from pydantic_settings import CliApp + +from aind_behavior_vr_foraging import data_contract +from aind_behavior_vr_foraging.data_mappers import DataMapperCli +from aind_behavior_vr_foraging.rig import AindVrForagingRig +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic + +logger = logging.getLogger(__name__) + + +@experiment() +async def aind_experiment_protocol(launcher: Launcher) -> None: + # Start experiment setup + picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + + # Pick and register session + session = picker.pick_session(Session) + + # Fetch the task settings + trainer_state, task_logic = picker.pick_trainer_state(AindVrForagingTaskLogic) + + # Fetch rig settings + rig = picker.pick_rig(AindVrForagingRig) + ensure_rig_and_computer_name(rig) + + launcher.register_session(session, rig.data_directory) + + resource_monitor.ResourceMonitor( + constrains=[ + resource_monitor.available_storage_constraint_factory(rig.data_directory, 2e11), + ] + ).run() + + input_trainer_state_path = launcher.session_directory / "behavior" / "trainer_state.json" + input_trainer_state_path.write_text(trainer_state.model_dump_json(indent=2), encoding="utf-8") + + # Post-fetching modifications + manipulator_modifier = ByAnimalManipulatorModifier( + subject_db_path=picker.subject_dir / session.subject, + model_path="manipulator.calibration.initial_position", + model_name="manipulator_init.json", + launcher=launcher, + ) + manipulator_modifier.inject(rig) + + # Run the task via Bonsai + bonsai_app = AindBehaviorServicesBonsaiApp( + workflow=Path(r"./src/main.bonsai"), + temp_directory=launcher.temp_dir, + rig=rig, + session=session, + task_logic=task_logic, + ) + await bonsai_app.run_async() + + # Update manipulator initial position for next session + try: + manipulator_modifier.dump() + except Exception as e: + logger.error(f"Failed to update manipulator initial position: {e}") + + # Curriculum + suggestion: CurriculumSuggestion | None = None + suggestion_path: Path | None = None + if not ( + (picker.trainer_state is None) + or (picker.trainer_state.is_on_curriculum is False) + or (picker.trainer_state.stage is None) + ): + trainer = CurriculumApp( + settings=CurriculumSettings( + input_trainer_state=input_trainer_state_path.resolve(), data_directory=launcher.session_directory + ) + ) + # Run the curriculum + await trainer.run_async() + suggestion = trainer.process_suggestion() + # Dump suggestion for debugging (for now, but we will prob remove this later) + suggestion_path = _dump_suggestion(suggestion, launcher.session_directory) + # Push updated trainer state back to the database + picker.push_new_suggestion(suggestion.trainer_state) + + # Mappers + assert launcher.repository.working_tree_dir is not None + + DataMapperCli( + data_path=launcher.session_directory, + repo_path=launcher.repository.working_tree_dir, # type: ignore[arg-type] + curriculum_suggestion=suggestion_path, + session_end_time=utcnow(), + ).cli_cmd() + + # Run data qc + if picker.ui_helper.prompt_yes_no_question("Would you like to generate a qc report?"): + try: + import webbrowser + + from contraqctor.qc.reporters import HtmlReporter + + from ..src.aind_behavior_vr_foraging.data_qc.data_qc import make_qc_runner + + vr_dataset = data_contract.dataset(launcher.session_directory) + runner = make_qc_runner(vr_dataset) + qc_path = launcher.session_directory / "Behavior" / "Logs" / "qc_report.html" + reporter = HtmlReporter(output_path=qc_path) + runner.run_all_with_progress(reporter=reporter) + webbrowser.open(qc_path.as_uri(), new=2) + except Exception as e: + logger.error(f"Failed to run data QC: {e}") + + # Watchdog + is_transfer = picker.ui_helper.prompt_yes_no_question("Would you like to transfer data?") + if not is_transfer: + logger.info("Data transfer skipped by user.") + return + + launcher.copy_logs() + watchdog_settings = WatchdogSettings() + watchdog_settings.destination = Path(watchdog_settings.destination) / launcher.session.subject + WatchdogDataTransferService( + source=launcher.session_directory, + settings=watchdog_settings, + session=session, + ).transfer() + + return + + +@experiment() +async def calibration_protocol(launcher: Launcher) -> None: + # Start experiment setup + picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + + # Pick and register session + session = Session(subject="CALIBRATION", experiment="CALIBRATION", date=utcnow()) + + # Fetch rig settings + rig = picker.pick_rig(AindVrForagingRig) + + launcher.register_session(session, rig.data_directory) + + resource_monitor.ResourceMonitor( + constrains=[ + resource_monitor.available_storage_constraint_factory(rig.data_directory, 2e11), + ] + ).run() + + # Run the task via Bonsai + bonsai_app = AindBehaviorServicesBonsaiApp( + workflow=Path(r"./src/main.bonsai"), + temp_directory=launcher.temp_dir, + rig=rig, + ) + await bonsai_app.run_async() + logger.info("Calibration protocol completed successfully.") + + +def _dump_suggestion(suggestion: CurriculumSuggestion, session_directory: Path) -> Path: + path = session_directory / "Behavior" / "Logs" / "suggestion.json" + logger.info("Dumping curriculum suggestion to: %s", path) + with open(path, "w", encoding="utf-8") as f: + f.write(suggestion.model_dump_json(indent=2)) + return path + + +class ByAnimalManipulatorModifier(ByAnimalModifier[AindVrForagingRig]): + """Modifier to set and update manipulator initial position based on animal-specific data.""" + + def __init__( + self, subject_db_path: Path, model_path: str, model_name: str, *, launcher: Launcher, **kwargs + ) -> None: + super().__init__(subject_db_path, model_path, model_name, **kwargs) + self._launcher = launcher + + def _process_before_dump(self) -> ManipulatorPosition: + _dataset = data_contract.dataset(self._launcher.session_directory) + manipulator_parking_position: SoftwareEvents = cast( + SoftwareEvents, _dataset["Behavior"]["SoftwareEvents"]["SpoutParkingPositions"].load() + ) + data: dict[str, Any] = manipulator_parking_position.data.iloc[0]["data"]["ResetPosition"] + position = ManipulatorPosition.model_validate(data) + return position + + +def ensure_rig_and_computer_name(rig: AindVrForagingRig) -> None: + """Ensures rig and computer name are set from environment variables if available, otherwise defaults to rig configuration values.""" + rig_name = os.environ.get("aibs_comp_id", None) + computer_name = os.environ.get("hostname", None) + + if rig_name is None: + logger.warning( + "'aibs_comp_id' environment variable not set. Defaulting to rig name from configuration. %s", rig.rig_name + ) + rig_name = rig.rig_name + if computer_name is None: + computer_name = rig.computer_name + logger.warning( + "'hostname' environment variable not set. Defaulting to computer name from configuration. %s", + rig.computer_name, + ) + + if rig_name != rig.rig_name or computer_name != rig.computer_name: + logger.warning( + "Rig name or computer name from environment variables do not match the rig configuration. " + "Forcing rig name: %s and computer name: %s from environment variables.", + rig_name, + computer_name, + ) + rig.rig_name = rig_name + rig.computer_name = computer_name + + +@experiment() +async def recover_session(launcher: Launcher) -> None: + # Start experiment setup + picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + session_path = Path(picker.ui_helper.input("Enter the path to the session you want to recover:")) + if not session_path.exists(): + logger.error("Session path does not exist: %s", session_path) + return + session_model = Session.model_validate_json( + (session_path / "behavior/Logs/session_input.json").read_text(encoding="utf-8") + ) + rig_model = AindVrForagingRig.model_validate_json( + (session_path / "behavior/Logs/rig_input.json").read_text(encoding="utf-8") + ) + trainer_state_files = list((session_path / "behavior").glob("trainer_state*.json")) + if trainer_state_files: + input_trainer_state_path = trainer_state_files[0] + else: + raise FileNotFoundError("Trainer state file not found.") + + ensure_rig_and_computer_name(rig_model) + + launcher.register_session(session_model, rig_model.data_directory) + + # Curriculum + suggestion: CurriculumSuggestion | None = None + suggestion_path: Path | None = None + if not ( + (picker.trainer_state is None) + or (picker.trainer_state.is_on_curriculum is False) + or (picker.trainer_state.stage is None) + ): + trainer = CurriculumApp( + settings=CurriculumSettings( + input_trainer_state=input_trainer_state_path.resolve(), data_directory=launcher.session_directory + ) + ) + # Run the curriculum + await trainer.run_async() + suggestion = trainer.process_suggestion() + # Dump suggestion for debugging (for now, but we will prob remove this later) + suggestion_path = _dump_suggestion(suggestion, launcher.session_directory) + # Push updated trainer state back to the database + picker.push_new_suggestion(suggestion.trainer_state) + + # Mappers + assert launcher.repository.working_tree_dir is not None + + DataMapperCli( + data_path=launcher.session_directory, + repo_path=launcher.repository.working_tree_dir, # type: ignore[arg-type] + curriculum_suggestion=suggestion_path, + session_end_time=utcnow(), + ).cli_cmd() + + # Run data qc + if picker.ui_helper.prompt_yes_no_question("Would you like to generate a qc report?"): + try: + import webbrowser + + from contraqctor.qc.reporters import HtmlReporter + + from ..src.aind_behavior_vr_foraging.data_qc.data_qc import make_qc_runner + + vr_dataset = data_contract.dataset(launcher.session_directory) + runner = make_qc_runner(vr_dataset) + qc_path = launcher.session_directory / "Behavior" / "Logs" / "qc_report.html" + reporter = HtmlReporter(output_path=qc_path) + runner.run_all_with_progress(reporter=reporter) + webbrowser.open(qc_path.as_uri(), new=2) + except Exception as e: + logger.error(f"Failed to run data QC: {e}") + + # Watchdog + is_transfer = picker.ui_helper.prompt_yes_no_question("Would you like to transfer data?") + if not is_transfer: + logger.info("Data transfer skipped by user.") + return + + watchdog_settings = WatchdogSettings() + watchdog_settings.destination = Path(watchdog_settings.destination) / launcher.session.subject + WatchdogDataTransferService( + source=launcher.session_directory, + settings=watchdog_settings, + session=session_model, + ).transfer() + + return + + +class ClabeCli(LauncherCliArgs): + def cli_cmd(self): + launcher = Launcher(settings=self) + launcher.run_experiment(aind_experiment_protocol) + return None + + +def main() -> None: + CliApp().run(ClabeCli) + + +if __name__ == "__main__": + main() diff --git a/scripts/launcher.ps1 b/scripts/launcher.ps1 index ce04aba0..a36181aa 100644 --- a/scripts/launcher.ps1 +++ b/scripts/launcher.ps1 @@ -1,3 +1,3 @@ $scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location -Path (Split-Path -Parent $scriptPath) -&uv run vr-foraging clabe +&uv run clabe run ./scripts/aind.py @args diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index 6c214c71..a358dba4 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -1,193 +1,14 @@ { "$defs": { - "AindBehaviorSessionModel": { - "properties": { - "aind_behavior_services_pkg_version": { - "default": "0.12.5", - "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.12.5", - "default": "0.12.5", - "title": "Version", - "type": "string" - }, - "experiment": { - "default": null, - "description": "Name of the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Experiment" - }, - "experimenter": { - "default": [], - "description": "Name of the experimenter", - "items": { - "type": "string" - }, - "title": "Experimenter", - "type": "array" - }, - "date": { - "description": "Date of the experiment", - "format": "date-time", - "title": "Date", - "type": "string" - }, - "root_path": { - "description": "Root path where data will be logged", - "title": "Root Path", - "type": "string" - }, - "session_name": { - "default": null, - "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Session Name" - }, - "subject": { - "description": "Name of the subject", - "title": "Subject", - "type": "string" - }, - "experiment_version": { - "default": "", - "deprecated": true, - "description": "Version of the experiment", - "title": "Experiment Version", - "type": "string" - }, - "notes": { - "default": null, - "description": "Notes about the experiment", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - }, - "commit_hash": { - "default": null, - "description": "Commit hash of the repository", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Commit Hash" - }, - "allow_dirty_repo": { - "default": false, - "description": "Allow running from a dirty repository", - "title": "Allow Dirty Repo", - "type": "boolean" - }, - "skip_hardware_validation": { - "default": false, - "description": "Skip hardware validation", - "title": "Skip Hardware Validation", - "type": "boolean" - } - }, - "required": [ - "root_path", - "subject" - ], - "title": "AindBehaviorSessionModel", - "type": "object" - }, - "AindManipulatorAdditionalSettings": { - "description": "Additional settings for the manipulator device", - "properties": { - "spout_axis": { - "$ref": "#/$defs/Axis", - "default": 2, - "description": "Spout axis" - } - }, - "title": "AindManipulatorAdditionalSettings", - "type": "object" - }, "AindManipulatorCalibration": { - "description": "Aind manipulator calibration class", + "description": "AindManipulator calibration class", "properties": { - "device_name": { - "default": "AindManipulator", - "description": "Must match a device name in rig/instrument", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/AindManipulatorCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/AindManipulatorCalibrationOutput", - "title": "Output of the calibration." - }, - "date": { - "default": null, - "oneOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Date" - }, "description": { - "const": "Calibration of the load cells system", - "default": "Calibration of the load cells system", + "const": "AindManipulator calibration and settings", + "default": "AindManipulator calibration and settings", "title": "Description", "type": "string" }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "AindManipulatorCalibration", - "type": "object" - }, - "AindManipulatorCalibrationInput": { - "properties": { "full_step_to_mm": { "$ref": "#/$defs/ManipulatorPosition", "default": { @@ -270,16 +91,12 @@ } } }, - "title": "AindManipulatorCalibrationInput", - "type": "object" - }, - "AindManipulatorCalibrationOutput": { - "properties": {}, - "title": "AindManipulatorCalibrationOutput", - "type": "object" + "title": "AindManipulatorCalibration", + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration" }, "AindManipulatorDevice": { - "description": "Overrides the default settings for the manipulator device by spec'ing additional_settings field", + "description": "Appends a task specific configuration to the base manipulator model.", "properties": { "device_type": { "const": "StepperDriver", @@ -287,37 +104,72 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "$ref": "#/$defs/AindManipulatorAdditionalSettings", - "default": { - "spout_axis": 2 - }, - "description": "Additional settings" - }, "calibration": { - "default": null, - "oneOf": [ - { - "$ref": "#/$defs/AindManipulatorCalibration" - }, - { - "type": "null" + "$ref": "#/$defs/AindManipulatorCalibration", + "default": { + "description": "AindManipulator calibration and settings", + "full_step_to_mm": { + "x": 0.01, + "y1": 0.01, + "y2": 0.01, + "z": 0.01 + }, + "axis_configuration": [ + { + "axis": 2, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + }, + { + "axis": 3, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + }, + { + "axis": 1, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + }, + { + "axis": 4, + "max_limit": 25.0, + "maximum_step_interval": 2000, + "microstep_resolution": 0, + "min_limit": -0.01, + "motor_operation_mode": 0, + "step_acceleration_interval": 100, + "step_interval": 100 + } + ], + "homing_order": [ + 2, + 3, + 1, + 4 + ], + "initial_position": { + "x": 0.0, + "y1": 0.0, + "y2": 0.0, + "z": 0.0 } - ], - "title": "Calibration of the manipulator" + }, + "description": "Calibration for the device." }, "who_am_i": { "const": 1130, @@ -342,6 +194,11 @@ "description": "Device port name", "title": "Port Name", "type": "string" + }, + "spout_axis": { + "$ref": "#/$defs/Axis", + "default": 2, + "description": "Spout axis" } }, "required": [ @@ -351,16 +208,17 @@ "type": "object" }, "AindVrForagingRig": { + "description": "Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task.", "properties": { "aind_behavior_services_pkg_version": { - "default": "0.12.5", + "default": "0.13.6", "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.6.5", - "default": "0.6.5", + "const": "0.7.0-rc0", + "default": "0.7.0-rc0", "title": "Version", "type": "string" }, @@ -374,6 +232,12 @@ "title": "Rig Name", "type": "string" }, + "data_directory": { + "description": "Directory where data will be saved to", + "format": "path", + "title": "Data Directory", + "type": "string" + }, "triggered_camera_controller": { "$ref": "#/$defs/CameraController_SpinnakerCamera_", "description": "Required camera controller to triggered cameras." @@ -398,6 +262,14 @@ "$ref": "#/$defs/Olfactometer", "description": "Harp olfactometer" }, + "harp_olfactometer_extension": { + "description": "A collection of subordinate olfactometers that can be added to increase the number of independently delivered odors. The order of the list determines the order by which odors are numbered", + "items": { + "$ref": "#/$defs/Olfactometer" + }, + "title": "Harp Olfactometer Extension", + "type": "array" + }, "harp_lickometer": { "$ref": "#/$defs/HarpLicketySplit", "description": "Harp lickometer" @@ -451,11 +323,9 @@ "description": "Manipulator" }, "screen": { - "$ref": "#/$defs/Screen", + "$ref": "#/$defs/ScreenAssembly", "default": { - "device_type": "Screen", - "device_name": "Screen", - "additional_settings": null, + "device_type": "ScreenAssembly", "calibration": { "center": { "extrinsics": { @@ -533,7 +403,9 @@ } }, "required": [ + "computer_name", "rig_name", + "data_directory", "triggered_camera_controller", "harp_behavior", "harp_olfactometer", @@ -568,8 +440,8 @@ "description": "Parameters of the task logic" }, "version": { - "const": "0.6.5", - "default": "0.6.5", + "const": "0.7.0-rc0", + "default": "0.7.0-rc0", "title": "Version", "type": "string" }, @@ -611,7 +483,7 @@ "title": "Rng Seed" }, "aind_behavior_services_pkg_version": { - "default": "0.12.5", + "default": "0.13.6", "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" @@ -682,7 +554,8 @@ "Y1", "Y2", "Z" - ] + ], + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.Axis" }, "AxisConfiguration": { "description": "Axis configuration", @@ -739,7 +612,8 @@ "axis" ], "title": "AxisConfiguration", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.AxisConfiguration" }, "BaseModel": { "properties": {}, @@ -790,7 +664,8 @@ } }, "title": "BetaDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BetaDistribution" }, "BetaDistributionParameters": { "description": "Parameters for a beta distribution.\n\nDefined by alpha and beta shape parameters.", @@ -817,7 +692,8 @@ } }, "title": "BetaDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BetaDistributionParameters" }, "BinomialDistribution": { "description": "A binomial probability distribution.\n\nModels the number of successes in a fixed number of independent\nBernoulli trials with constant success probability.", @@ -863,7 +739,8 @@ } }, "title": "BinomialDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BinomialDistribution" }, "BinomialDistributionParameters": { "description": "Parameters for a binomial distribution.\n\nDefined by number of trials (n) and success probability (p).", @@ -891,7 +768,8 @@ } }, "title": "BinomialDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.BinomialDistributionParameters" }, "Block": { "description": "Configuration for a single experimental block.\n\nA block represents a period of the experiment with specific environment\nstatistics and ending conditions. Each block defines the environmental\nparameters and termination criteria for that experimental phase.", @@ -1082,34 +960,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1156,34 +1009,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1364,23 +1192,43 @@ "type": "array" }, "rho": { - "description": "The underlying value goverining the stochastic process", + "description": "The underlying value governing the stochastic process", "title": "Rho", "type": "number" }, - "minimum": { - "default": 1, - "description": "Maximum value after update", - "title": "Minimum", + "dt": { + "const": 0.1, + "default": 0.1, + "description": "Sampling time step (s)", + "title": "Dt", "type": "number" }, - "maximum": { - "default": 0, - "description": "Minimum value after update", - "title": "Maximum", - "type": "number" - } - }, + "rate": { + "default": null, + "description": "Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only", + "oneOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Rate" + }, + "minimum": { + "default": 1, + "description": "Maximum value after update", + "title": "Minimum", + "type": "number" + }, + "maximum": { + "default": 0, + "description": "Minimum value after update", + "title": "Maximum", + "type": "number" + } + }, "required": [ "transition_matrix", "rho" @@ -1389,6 +1237,7 @@ "type": "object" }, "DisplayCalibration": { + "description": "Represents the calibration parameters of a display.", "properties": { "intrinsics": { "$ref": "#/$defs/DisplayIntrinsics", @@ -1421,9 +1270,10 @@ "type": "object" }, "DisplayExtrinsics": { + "description": "Represents the extrinsic parameters of a display.", "properties": { "rotation": { - "$ref": "#/$defs/aind_behavior_services__rig__visual_stimulation__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 0.0, "y": 0.0, @@ -1432,7 +1282,7 @@ "description": "Rotation vector (radians)" }, "translation": { - "$ref": "#/$defs/aind_behavior_services__rig__visual_stimulation__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 0.0, "y": 1.309016, @@ -1445,6 +1295,7 @@ "type": "object" }, "DisplayIntrinsics": { + "description": "Represents the intrinsic parameters of a display.", "properties": { "frame_width": { "default": 1920, @@ -1478,84 +1329,6 @@ "title": "DisplayIntrinsics", "type": "object" }, - "DisplaysCalibration": { - "properties": { - "left": { - "$ref": "#/$defs/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": "#/$defs/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": "#/$defs/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" - }, "Distribution": { "description": "Available distributions", "discriminator": { @@ -1605,7 +1378,8 @@ "$ref": "#/$defs/PdfDistribution" } ], - "title": "Distribution" + "title": "Distribution", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution" }, "EnvironmentStatistics": { "description": "Defines the statistical properties of the foraging environment.\n\nThis class specifies the patches available in the environment, their transition\nprobabilities, and initial state occupancy. It forms the core specification\nfor the foraging environment structure.", @@ -1700,7 +1474,8 @@ } }, "title": "ExponentialDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ExponentialDistribution" }, "ExponentialDistributionParameters": { "description": "Parameters for an exponential distribution.\n\nDefined by the rate parameter (inverse of mean).", @@ -1720,7 +1495,8 @@ } }, "title": "ExponentialDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ExponentialDistributionParameters" }, "GammaDistribution": { "description": "A gamma probability distribution.\n\nGeneralizes the exponential distribution. Used for modeling\npositive continuous variables with right-skewed distributions.", @@ -1766,7 +1542,8 @@ } }, "title": "GammaDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.GammaDistribution" }, "GammaDistributionParameters": { "description": "Parameters for a gamma distribution.\n\nDefined by shape (k) and rate (\u03b8\u207b\u00b9) parameters.", @@ -1793,7 +1570,8 @@ } }, "title": "GammaDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.GammaDistributionParameters" }, "HarpAnalogInput": { "properties": { @@ -1803,34 +1581,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1879,34 +1632,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -1955,34 +1683,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2031,34 +1734,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2107,34 +1785,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2183,34 +1836,9 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -2304,7 +1932,8 @@ } }, "title": "LogNormalDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.LogNormalDistribution" }, "LogNormalDistributionParameters": { "description": "Parameters for a log-normal distribution.\n\nDefined by the mean and standard deviation of the underlying normal distribution.", @@ -2329,7 +1958,8 @@ } }, "title": "LogNormalDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.LogNormalDistributionParameters" }, "LookupTableFunction": { "description": "A patch update function that uses lookup table interpolation.\n\nUpdate in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)].\nThis function maps input values to output values using a lookup table with\nlinear interpolation between defined points. Useful for complex, non-linear\nreward schedules or parameter updates.", @@ -2367,6 +1997,7 @@ "type": "object" }, "ManipulatorPosition": { + "description": "Represents a position in the manipulator coordinate system", "properties": { "x": { "title": "X coordinate", @@ -2392,7 +2023,8 @@ "z" ], "title": "ManipulatorPosition", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.ManipulatorPosition" }, "Measurement": { "description": "Input for water valve calibration class", @@ -2436,6 +2068,7 @@ "type": "object" }, "MicrostepResolution": { + "description": "Microstep resolution available", "enum": [ 0, 1, @@ -2449,9 +2082,11 @@ "Microstep16", "Microstep32", "Microstep64" - ] + ], + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.MicrostepResolution" }, "MotorOperationMode": { + "description": "Motor operation mode", "enum": [ 0, 1 @@ -2461,7 +2096,8 @@ "x-enumNames": [ "Quiet", "Dynamic" - ] + ], + "x-sgen-typename": "AllenNeuralDynamics.AindManipulator.MotorOperationMode" }, "MovableSpoutControl": { "description": "Controls the movable water spout behavior for reward delivery.\n\nThis class configures how the movable spout operates, including when it's\nenabled, timing for reward collection, and retraction distance for operant\nconditioning protocols.", @@ -2534,7 +2170,8 @@ } }, "title": "NormalDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.NormalDistribution" }, "NormalDistributionParameters": { "description": "Parameters for a normal (Gaussian) distribution.\n\nDefined by mean (center) and standard deviation (spread).", @@ -2559,7 +2196,8 @@ } }, "title": "NormalDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.NormalDistributionParameters" }, "NumericalUpdater": { "description": "A numerical updater that modifies task parameters during execution.\n\nThis class combines an operation type with parameters to define how values\nshould be updated dynamically during the task, enabling adaptive behavior\nbased on animal performance or other criteria.", @@ -2651,65 +2289,30 @@ "OdorControl": { "description": "Controls the odor delivery system parameters.\n\nThis class manages the olfactory stimulus delivery system, including flow rates,\nvalve timing, and carrier gas configuration. It ensures proper odor concentration\nand delivery timing for the behavioral task.", "properties": { - "valve_max_open_time": { - "default": 10, - "description": "Maximum time (s) the valve can be open continuously", - "minimum": 0, - "title": "Valve Max Open Time", - "type": "number" - }, "target_total_flow": { + "const": 1000, "default": 1000, "description": "Target total flow (ml/s) of the odor mixture", - "maximum": 1000, - "minimum": 100, + "ge": 100, + "le": 1000, "title": "Target Total Flow", - "type": "number" - }, - "use_channel_3_as_carrier": { - "default": true, - "description": "Whether to use channel 3 as carrier", - "title": "Use Channel 3 As Carrier", - "type": "boolean" + "type": "integer" }, "target_odor_flow": { + "const": 100, "default": 100, "description": "Target odor flow (ml/s) in the odor mixture", - "maximum": 100, - "minimum": 0, + "ge": 0, + "le": 100, "title": "Target Odor Flow", - "type": "number" - } - }, - "title": "OdorControl", - "type": "object" - }, - "OdorSpecification": { - "description": "Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdors can be delivered at specific locations to provide additional sensory\ninformation for navigation and foraging decisions.", - "properties": { - "index": { - "description": "Index of the odor to be used", - "maximum": 3, - "minimum": 0, - "title": "Index", "type": "integer" - }, - "concentration": { - "default": 1, - "description": "Concentration of the odor", - "maximum": 1, - "minimum": 0, - "title": "Concentration", - "type": "number" } }, - "required": [ - "index" - ], - "title": "OdorSpecification", + "title": "OdorControl", "type": "object" }, "Olfactometer": { + "description": "A calibrated olfactometer device", "properties": { "device_type": { "const": "Olfactometer", @@ -2717,41 +2320,12 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { - "default": null, - "oneOf": [ - { - "$ref": "#/$defs/OlfactometerCalibration" - }, - { - "type": "null" - } - ], + "$ref": "#/$defs/OlfactometerCalibration", + "default": { + "date": null, + "channel_config": {} + }, "title": "Calibration of the olfactometer" }, "who_am_i": { @@ -2786,24 +2360,11 @@ "type": "object" }, "OlfactometerCalibration": { - "description": "Olfactometer calibration class", + "description": "Olfactometer device configuration model", "properties": { - "device_name": { - "default": "Olfactometer", - "description": "Name of the device being calibrated", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/OlfactometerCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/OlfactometerCalibrationOutput", - "title": "Output of the calibration" - }, "date": { "default": null, + "description": "Date of the calibration", "oneOf": [ { "format": "date-time", @@ -2815,34 +2376,6 @@ ], "title": "Date" }, - "description": { - "const": "Calibration of the harp olfactometer device", - "default": "Calibration of the harp olfactometer device", - "title": "Description", - "type": "string" - }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "OlfactometerCalibration", - "type": "object" - }, - "OlfactometerCalibrationInput": { - "properties": { "channel_config": { "additionalProperties": { "$ref": "#/$defs/OlfactometerChannelConfig" @@ -2856,12 +2389,7 @@ "type": "object" } }, - "title": "OlfactometerCalibrationInput", - "type": "object" - }, - "OlfactometerCalibrationOutput": { - "properties": {}, - "title": "OlfactometerCalibrationOutput", + "title": "OlfactometerCalibration", "type": "object" }, "OlfactometerChannel": { @@ -2882,15 +2410,16 @@ ] }, "OlfactometerChannelConfig": { + "description": "Configuration for a single olfactometer channel", "properties": { "channel_index": { - "title": "Channel index", + "title": "Odor channel index", "type": "integer" }, "channel_type": { "$ref": "#/$defs/OlfactometerChannelType", "default": "Odor", - "title": "Channel type" + "title": "Olfactometer channel type" }, "flow_rate_capacity": { "default": 100, @@ -2939,7 +2468,7 @@ "type": "object" }, "OlfactometerChannelType": { - "description": "Channel type", + "description": "Olfactometer channel type", "enum": [ "Odor", "Carrier" @@ -3058,10 +2587,8 @@ "odor_control": { "$ref": "#/$defs/OdorControl", "default": { - "valve_max_open_time": 10.0, - "target_total_flow": 1000.0, - "use_channel_3_as_carrier": true, - "target_odor_flow": 100.0 + "target_total_flow": 1000, + "target_odor_flow": 100 }, "description": "Control of the odor" }, @@ -3180,16 +2707,13 @@ "type": "integer" }, "odor_specification": { - "default": null, - "description": "The optional odor specification of the patch", - "oneOf": [ - { - "$ref": "#/$defs/OdorSpecification" - }, - { - "type": "null" - } - ] + "description": "A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel", + "items": { + "minimum": 0, + "type": "number" + }, + "title": "Odor Specification", + "type": "array" }, "reward_specification": { "$ref": "#/$defs/RewardSpecification", @@ -3313,6 +2837,9 @@ "type": "array" } }, + "required": [ + "odor_specification" + ], "title": "Patch", "type": "object" }, @@ -3684,7 +3211,8 @@ } }, "title": "PdfDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PdfDistribution" }, "PdfDistributionParameters": { "description": "Parameters for a custom probability density function distribution.\n\nDefined by explicit probability values and their corresponding indices.\nProbabilities are automatically normalized to sum to 1.", @@ -3720,7 +3248,8 @@ } }, "title": "PdfDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PdfDistributionParameters" }, "PersistentRewardFunction": { "description": "A RewardFunction that is always active.", @@ -3832,7 +3361,8 @@ } }, "title": "PoissonDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PoissonDistribution" }, "PoissonDistributionParameters": { "description": "Parameters for a Poisson distribution.\n\nDefined by the rate parameter (average number of events).", @@ -3852,13 +3382,14 @@ } }, "title": "PoissonDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.PoissonDistributionParameters" }, "PositionControl": { "description": "Controls the position tracking and movement detection parameters.\n\nThis class manages the position control system including coordinate transformations,\ninitial positioning, signal filtering, and movement detection thresholds for the\nvirtual reality foraging task.", "properties": { "gain": { - "$ref": "#/$defs/aind_behavior_vr_foraging__task_logic__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 1.0, "y": 1.0, @@ -3867,13 +3398,13 @@ "description": "Gain of the position control." }, "initial_position": { - "$ref": "#/$defs/aind_behavior_vr_foraging__task_logic__Vector3", + "$ref": "#/$defs/Vector3", "default": { "x": 0.0, "y": 2.56, "z": 0.0 }, - "description": "Gain of the position control." + "description": "Initial position of the subject in the VR world." }, "frequency_filter_cutoff": { "default": 0.5, @@ -3895,6 +3426,7 @@ "type": "object" }, "Rect": { + "description": "Represents a rectangle defined by its top-left corner, width, and height.", "properties": { "x": { "default": 0, @@ -4056,7 +3588,7 @@ "type": "object" }, "RigCalibration": { - "description": "Container class for calibration models. In a future release these will be moved to the respective devices", + "description": "Container class for calibration models.", "properties": { "water_valve": { "$ref": "#/$defs/WaterValveCalibration", @@ -4087,20 +3619,33 @@ "description": "Parameters of the distribution" }, "truncation_parameters": { - "const": null, "default": null, - "title": "Truncation Parameters", - "type": "null" + "description": "Truncation parameters of the distribution", + "oneOf": [ + { + "$ref": "#/$defs/TruncationParameters" + }, + { + "type": "null" + } + ] }, "scaling_parameters": { - "const": null, "default": null, - "title": "Scaling Parameters", - "type": "null" + "description": "Scaling parameters of the distribution", + "oneOf": [ + { + "$ref": "#/$defs/ScalingParameters" + }, + { + "type": "null" + } + ] } }, "title": "Scalar", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.Scalar" }, "ScalarDistributionParameter": { "description": "Parameters for a scalar (constant) distribution.\n\nRepresents a deterministic value that always returns the same number.", @@ -4119,7 +3664,8 @@ } }, "title": "ScalarDistributionParameter", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ScalarDistributionParameter" }, "ScalingParameters": { "description": "Parameters for scaling and offsetting sampled distribution values.\nScaling is applied as (value * scale + offset).\n\nApplies linear transformation: result = (value * scale) + offset.", @@ -4138,44 +3684,20 @@ } }, "title": "ScalingParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.ScalingParameters" }, - "Screen": { + "ScreenAssembly": { + "description": "Represents a screen assembly (left, center and right screens) and respective configuration.", "properties": { "device_type": { - "const": "Screen", - "default": "Screen", - "description": "Device type", + "const": "ScreenAssembly", + "default": "ScreenAssembly", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { - "$ref": "#/$defs/DisplaysCalibration", + "$ref": "#/$defs/ScreenAssemblyCalibration", "default": { "left": { "extrinsics": { @@ -4238,7 +3760,7 @@ } } }, - "description": "Screen calibration" + "description": "Screen assembly calibration" }, "display_index": { "default": 1, @@ -4264,24 +3786,208 @@ "title": "Texture Assets Directory", "type": "string" }, - "brightness": { - "default": 0, - "description": "Brightness", - "maximum": 1, - "minimum": -1, - "title": "Brightness", - "type": "number" + "brightness": { + "default": 0, + "description": "Brightness", + "maximum": 1, + "minimum": -1, + "title": "Brightness", + "type": "number" + }, + "contrast": { + "default": 1, + "description": "Contrast", + "maximum": 1, + "minimum": -1, + "title": "Contrast", + "type": "number" + } + }, + "title": "ScreenAssembly", + "type": "object" + }, + "ScreenAssemblyCalibration": { + "description": "Represents the calibration parameters for a screen assembly with three displays.", + "properties": { + "left": { + "$ref": "#/$defs/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": "#/$defs/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": "#/$defs/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": "ScreenAssemblyCalibration", + "type": "object" + }, + "Session": { + "properties": { + "aind_behavior_services_pkg_version": { + "default": "0.13.6", + "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.13.6", + "default": "0.13.6", + "title": "Version", + "type": "string" + }, + "experiment": { + "default": null, + "description": "Name of the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Experiment" + }, + "experimenter": { + "default": [], + "description": "Name of the experimenter", + "items": { + "type": "string" + }, + "title": "Experimenter", + "type": "array" + }, + "date": { + "description": "Date of the experiment", + "format": "date-time", + "title": "Date", + "type": "string" + }, + "session_name": { + "default": null, + "description": "Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Name" + }, + "subject": { + "description": "Name of the subject", + "title": "Subject", + "type": "string" + }, + "notes": { + "default": null, + "description": "Notes about the experiment", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Notes" + }, + "commit_hash": { + "default": null, + "description": "Commit hash of the repository", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Hash" }, - "contrast": { - "default": 1, - "description": "Contrast", - "maximum": 1, - "minimum": -1, - "title": "Contrast", - "type": "number" + "allow_dirty_repo": { + "default": false, + "description": "Allow running from a dirty repository", + "title": "Allow Dirty Repo", + "type": "boolean" + }, + "skip_hardware_validation": { + "default": false, + "description": "Skip hardware validation", + "title": "Skip Hardware Validation", + "type": "boolean" } }, - "title": "Screen", + "required": [ + "subject" + ], + "title": "Session", "type": "object" }, "SetValueFunction": { @@ -4305,7 +4011,7 @@ "type": "object" }, "Size": { - "description": "Represents 2D dimensions with width and height.\n\nUsed for defining texture sizes, corridor dimensions, and other 2D measurements\nin the VR foraging environment.", + "description": "Represents 2D dimensions with width and height.", "properties": { "width": { "default": 0, @@ -4324,42 +4030,17 @@ "type": "object" }, "SpinnakerCamera": { + "description": "Spinnaker camera device configuration.", "properties": { "device_type": { "const": "SpinnakerCamera", "default": "SpinnakerCamera", - "description": "Device type", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -4473,6 +4154,7 @@ "type": "object" }, "SpinnakerCameraAdcBitDepth": { + "description": "ADC bit depth options for Spinnaker cameras.", "enum": [ 0, 1, @@ -4487,6 +4169,7 @@ ] }, "SpinnakerCameraPixelFormat": { + "description": "Pixel format options for Spinnaker cameras.", "enum": [ 0, 1, @@ -4804,6 +4487,7 @@ "type": "object" }, "Treadmill": { + "description": "A calibrated treadmill device", "properties": { "device_type": { "const": "Treadmill", @@ -4811,41 +4495,24 @@ "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { - "default": null, - "oneOf": [ - { - "$ref": "#/$defs/TreadmillCalibration" - }, - { - "type": "null" - } - ], + "$ref": "#/$defs/TreadmillCalibration", + "default": { + "date": null, + "wheel_diameter": 15.0, + "pulses_per_revolution": 28800, + "invert_direction": false, + "brake_lookup_calibration": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 65535.0 + ] + ] + }, "title": "Calibration of the treadmill" }, "who_am_i": { @@ -4882,22 +4549,9 @@ "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": "#/$defs/TreadmillCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/TreadmillCalibrationOutput", - "title": "Output of the calibration." - }, "date": { "default": null, + "description": "Date of the calibration", "oneOf": [ { "format": "date-time", @@ -4909,39 +4563,6 @@ ], "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, "description": "Wheel diameter", @@ -4963,6 +4584,16 @@ "type": "boolean" }, "brake_lookup_calibration": { + "default": [ + [ + 0, + 0 + ], + [ + 1, + 65535 + ] + ], "description": "Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16])", "items": { "items": { @@ -4977,10 +4608,7 @@ "type": "array" } }, - "required": [ - "brake_lookup_calibration" - ], - "title": "TreadmillCalibrationOutput", + "title": "TreadmillCalibration", "type": "object" }, "TreadmillSpecification": { @@ -5029,7 +4657,8 @@ } }, "title": "TruncationParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.TruncationParameters" }, "UniformDistribution": { "description": "A uniform probability distribution.\n\nAll values between min and max have equal probability of being sampled.", @@ -5075,7 +4704,8 @@ } }, "title": "UniformDistribution", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.UniformDistribution" }, "UniformDistributionParameters": { "description": "Parameters for a uniform distribution.\n\nDefined by minimum and maximum bounds of the distribution.", @@ -5100,7 +4730,8 @@ } }, "title": "UniformDistributionParameters", - "type": "object" + "type": "object", + "x-sgen-typename": "AllenNeuralDynamics.AindBehaviorServices.Distributions.UniformDistributionParameters" }, "UpdaterTarget": { "description": "Enumeration of parameters that can be targeted by numerical updaters.\n\nThese targets define which task parameters can be dynamically modified\nduring task execution to adapt to animal performance or experimental needs.", @@ -5112,6 +4743,31 @@ "title": "UpdaterTarget", "type": "string" }, + "Vector3": { + "description": "Represents a 3D vector with float coordinates.", + "properties": { + "x": { + "default": 0, + "description": "X coordinate of the vector", + "title": "X", + "type": "number" + }, + "y": { + "default": 0, + "description": "Y coordinate of the vector", + "title": "Y", + "type": "number" + }, + "z": { + "default": 0, + "description": "Z coordinate of the vector", + "title": "Z", + "type": "number" + } + }, + "title": "Vector3", + "type": "object" + }, "VideoWriter": { "discriminator": { "mapping": { @@ -5130,6 +4786,7 @@ ] }, "VideoWriterFfmpeg": { + "description": "FFMPEG video writer configuration.", "properties": { "video_writer_type": { "const": "FFMPEG", @@ -5145,13 +4802,13 @@ "type": "integer" }, "container_extension": { - "default": "mp4", + "default": "mkv", "description": "Container extension", "title": "Container Extension", "type": "string" }, "output_arguments": { - "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", + "default": "-vf \"scale=out_range=full,setparams=range=full:colorspace=bt709:color_primaries=bt709:color_trc=linear\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p3 -rc vbr -cq 18 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M -f matroska -write_crc32 0", "description": "Output arguments", "title": "Output Arguments", "type": "string" @@ -5167,6 +4824,7 @@ "type": "object" }, "VideoWriterOpenCv": { + "description": "OpenCV video writer configuration.", "properties": { "video_writer_type": { "const": "OPENCV", @@ -5230,12 +4888,18 @@ "description": "The optional odor specification of the virtual site", "oneOf": [ { - "$ref": "#/$defs/OdorSpecification" + "description": "The optional odor specification of the virtual site", + "items": { + "minimum": 0, + "type": "number" + }, + "type": "array" }, { "type": "null" } - ] + ], + "title": "Odor Specification" }, "reward_specification": { "default": null, @@ -5428,24 +5092,11 @@ "type": "object" }, "WaterValveCalibration": { - "description": "Water valve calibration class", + "description": "Represents a water valve calibration.", "properties": { - "device_name": { - "default": "WaterValve", - "description": "Name of the device being calibrated", - "title": "Device name", - "type": "string" - }, - "input": { - "$ref": "#/$defs/WaterValveCalibrationInput", - "title": "Input of the calibration" - }, - "output": { - "$ref": "#/$defs/WaterValveCalibrationOutput", - "title": "Output of the calibration." - }, "date": { "default": null, + "description": "Date of the calibration", "oneOf": [ { "format": "date-time", @@ -5457,34 +5108,6 @@ ], "title": "Date" }, - "description": { - "const": "Calibration of the water valve delivery system", - "default": "Calibration of the water valve delivery system", - "title": "Description", - "type": "string" - }, - "notes": { - "default": null, - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Notes" - } - }, - "required": [ - "input", - "output" - ], - "title": "WaterValveCalibration", - "type": "object" - }, - "WaterValveCalibrationInput": { - "properties": { "measurements": { "default": [], "description": "List of measurements", @@ -5493,14 +5116,7 @@ }, "title": "Measurements", "type": "array" - } - }, - "title": "WaterValveCalibrationInput", - "type": "object" - }, - "WaterValveCalibrationOutput": { - "description": "Output for water valve calibration class", - "properties": { + }, "interval_average": { "default": null, "description": "Dictionary keyed by measured valve interval and corresponding average single event volume.", @@ -5566,46 +5182,21 @@ "slope", "offset" ], - "title": "WaterValveCalibrationOutput", + "title": "WaterValveCalibration", "type": "object" }, "WebCamera": { + "description": "Web camera device configuration.", "properties": { "device_type": { "const": "WebCamera", "default": "WebCamera", - "description": "Device type", "title": "Device Type", "type": "string" }, - "device_name": { - "default": null, - "description": "Device name", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Device Name" - }, - "additional_settings": { - "default": null, - "description": "Additional settings", - "oneOf": [ - { - "$ref": "#/$defs/BaseModel" - }, - { - "type": "null" - } - ] - }, "calibration": { "default": null, - "description": "Calibration", + "description": "Calibration for the device.", "oneOf": [ { "$ref": "#/$defs/BaseModel" @@ -5637,55 +5228,6 @@ }, "title": "WebCamera", "type": "object" - }, - "aind_behavior_services__rig__visual_stimulation__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" - }, - "aind_behavior_vr_foraging__task_logic__Vector3": { - "description": "Represents a 3D point or vector with x, y, and z coordinates.\n\nUsed for 3D positioning and movement in the virtual reality environment,\nincluding camera positions, object locations, and 3D transformations.", - "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" } } } \ No newline at end of file diff --git a/src/Extensions.csproj b/src/Extensions.csproj index fb3b6fb9..19ff4931 100644 --- a/src/Extensions.csproj +++ b/src/Extensions.csproj @@ -13,13 +13,15 @@ - + - + + + \ No newline at end of file diff --git a/src/Extensions/AddGapSite.bonsai b/src/Extensions/AddGapSite.bonsai index 0d1b6ef9..7afa4531 100644 --- a/src/Extensions/AddGapSite.bonsai +++ b/src/Extensions/AddGapSite.bonsai @@ -1,8 +1,9 @@  - @@ -57,8 +58,9 @@ - + LengthDistribution + RngSeed @@ -69,7 +71,7 @@ - + @@ -97,7 +99,9 @@ - + + + @@ -112,6 +116,7 @@ 388 + 20.7234077 0 diff --git a/src/Extensions/AddInterPatchSite.bonsai b/src/Extensions/AddInterPatchSite.bonsai index d2267349..23bd868e 100644 --- a/src/Extensions/AddInterPatchSite.bonsai +++ b/src/Extensions/AddInterPatchSite.bonsai @@ -1,8 +1,9 @@  - @@ -46,7 +47,7 @@ - + LengthDistribution @@ -58,7 +59,7 @@ - + @@ -84,7 +85,9 @@ - + + + @@ -97,6 +100,7 @@ 0 + 120 0 diff --git a/src/Extensions/AddPostPatchSite.bonsai b/src/Extensions/AddPostPatchSite.bonsai index 1fb98db8..5ef5e83a 100644 --- a/src/Extensions/AddPostPatchSite.bonsai +++ b/src/Extensions/AddPostPatchSite.bonsai @@ -1,8 +1,9 @@  - @@ -55,8 +56,9 @@ - + LengthDistribution + RngSeed @@ -67,7 +69,7 @@ - + @@ -93,7 +95,9 @@ - + + + @@ -106,6 +110,7 @@ 0 + 120 0 diff --git a/src/Extensions/AddRewardSite.bonsai b/src/Extensions/AddRewardSite.bonsai index b9e9687d..ac50c6eb 100644 --- a/src/Extensions/AddRewardSite.bonsai +++ b/src/Extensions/AddRewardSite.bonsai @@ -3,6 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" + xmlns:p2="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -55,8 +56,9 @@ - + LengthDistribution + RngSeed @@ -67,7 +69,7 @@ - + @@ -106,7 +108,9 @@ - + + + @@ -136,6 +140,7 @@ 353 + 35.1602135 0 diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 924972de..26b2ace6 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -9,306 +9,159 @@ namespace AindVrForagingDataSchema { #pragma warning disable // Disable all warnings - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Appends a task specific configuration to the base manipulator model. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Appends a task specific configuration to the base manipulator model.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorSessionModel + public partial class AindManipulatorDevice { - private string _aindBehaviorServicesPkgVersion; - - private string _version; - - private string _experiment; - - private System.Collections.Generic.List _experimenter; - - private System.DateTimeOffset _date; - - private string _rootPath; - - private string _sessionName; - - private string _subject; - - private string _experimentVersion; - - private string _notes; - - private string _commitHash; + private string _deviceType; - private bool _allowDirtyRepo; + private AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration _calibration; - private bool _skipHardwareValidation; + private int _whoAmI; - public AindBehaviorSessionModel() - { - _aindBehaviorServicesPkgVersion = "0.12.5"; - _version = "0.12.5"; - _experimenter = new System.Collections.Generic.List(); - _experimentVersion = ""; - _allowDirtyRepo = false; - _skipHardwareValidation = false; - } + private string _serialNumber; - protected AindBehaviorSessionModel(AindBehaviorSessionModel other) - { - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _experiment = other._experiment; - _experimenter = other._experimenter; - _date = other._date; - _rootPath = other._rootPath; - _sessionName = other._sessionName; - _subject = other._subject; - _experimentVersion = other._experimentVersion; - _notes = other._notes; - _commitHash = other._commitHash; - _allowDirtyRepo = other._allowDirtyRepo; - _skipHardwareValidation = other._skipHardwareValidation; - } + private string _portName; - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion - { - get - { - return _aindBehaviorServicesPkgVersion; - } - set - { - _aindBehaviorServicesPkgVersion = value; - } - } + private AllenNeuralDynamics.AindManipulator.Axis _spoutAxis; - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version + public AindManipulatorDevice() { - get - { - return _version; - } - set - { - _version = value; - } + _deviceType = "StepperDriver"; + _calibration = new AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration(); + _whoAmI = 1130; + _spoutAxis = AllenNeuralDynamics.AindManipulator.Axis.Y1; } - /// - /// Name of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment")] - [System.ComponentModel.DescriptionAttribute("Name of the experiment")] - public string Experiment + protected AindManipulatorDevice(AindManipulatorDevice other) { - get - { - return _experiment; - } - set - { - _experiment = value; - } + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + _spoutAxis = other._spoutAxis; } - /// - /// Name of the experimenter - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] - [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] - public System.Collections.Generic.List Experimenter + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _experimenter; + return _deviceType; } set { - _experimenter = value; + _deviceType = value; } } /// - /// Date of the experiment + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - [System.ComponentModel.DescriptionAttribute("Date of the experiment")] - public System.DateTimeOffset Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - /// - /// Root path where data will be logged - /// - [Newtonsoft.Json.JsonPropertyAttribute("root_path", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Root path where data will be logged")] - public string RootPath - { - get - { - return _rootPath; - } - set - { - _rootPath = value; - } - } - - /// - /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. - /// - [Newtonsoft.Json.JsonPropertyAttribute("session_name")] - [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + - "t provided, it will be generated using subject and date.")] - public string SessionName - { - get - { - return _sessionName; - } - set - { - _sessionName = value; - } - } - - /// - /// Name of the subject - /// - [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Name of the subject")] - public string Subject - { - get - { - return _subject; - } - set - { - _subject = value; - } - } - - /// - /// Version of the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("experiment_version")] - [System.ComponentModel.DescriptionAttribute("Version of the experiment")] - public string ExperimentVersion + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public AllenNeuralDynamics.AindManipulator.AindManipulatorCalibration Calibration { get { - return _experimentVersion; + return _calibration; } set { - _experimentVersion = value; + _calibration = value; } } - /// - /// Notes about the experiment - /// - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] - public string Notes + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _notes; + return _whoAmI; } set { - _notes = value; + _whoAmI = value; } } /// - /// Commit hash of the repository + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] - [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] - public string CommitHash + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _commitHash; + return _serialNumber; } set { - _commitHash = value; + _serialNumber = value; } } /// - /// Allow running from a dirty repository + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] - [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] - public bool AllowDirtyRepo + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _allowDirtyRepo; + return _portName; } set { - _allowDirtyRepo = value; + _portName = value; } } /// - /// Skip hardware validation + /// Spout axis /// - [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] - [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] - public bool SkipHardwareValidation + [Newtonsoft.Json.JsonPropertyAttribute("spout_axis")] + [System.ComponentModel.DescriptionAttribute("Spout axis")] + public AllenNeuralDynamics.AindManipulator.Axis SpoutAxis { get { - return _skipHardwareValidation; + return _spoutAxis; } set { - _skipHardwareValidation = value; + _spoutAxis = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorSessionModel(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorDevice(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorSessionModel(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorDevice(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("Experiment = " + _experiment + ", "); - stringBuilder.Append("Experimenter = " + _experimenter + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("RootPath = " + _rootPath + ", "); - stringBuilder.Append("SessionName = " + _sessionName + ", "); - stringBuilder.Append("Subject = " + _subject + ", "); - stringBuilder.Append("ExperimentVersion = " + _experimentVersion + ", "); - stringBuilder.Append("Notes = " + _notes + ", "); - stringBuilder.Append("CommitHash = " + _commitHash + ", "); - stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); - stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName + ", "); + stringBuilder.Append("SpoutAxis = " + _spoutAxis); return true; } @@ -328,384 +181,456 @@ public override string ToString() /// - /// Additional settings for the manipulator device + /// Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Additional settings for the manipulator device")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the schema, and concrete instantiation, of a rig configuration to run " + + "the VrForaging behavior task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorAdditionalSettings + public partial class AindVrForagingRig { - private Axis _spoutAxis; + private string _aindBehaviorServicesPkgVersion; - public AindManipulatorAdditionalSettings() - { - _spoutAxis = AindVrForagingDataSchema.Axis.Y1; - } + private string _version; - protected AindManipulatorAdditionalSettings(AindManipulatorAdditionalSettings other) - { - _spoutAxis = other._spoutAxis; - } + private string _computerName; - /// - /// Spout axis - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("spout_axis")] - [System.ComponentModel.DescriptionAttribute("Spout axis")] - public Axis SpoutAxis - { - get - { - return _spoutAxis; - } - set - { - _spoutAxis = value; - } - } + private string _rigName; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorAdditionalSettings(this))); - } + private string _dataDirectory; - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorAdditionalSettings(this)); - } + private CameraControllerSpinnakerCamera _triggeredCameraController; - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("SpoutAxis = " + _spoutAxis); - return true; - } + private CameraControllerWebCamera _monitoringCameraController; - 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(); - } - } - - - /// - /// Aind manipulator calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Aind manipulator calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibration - { + private HarpBehavior _harpBehavior; - private string _deviceName; + private Olfactometer _harpOlfactometer; - private AindManipulatorCalibrationInput _input; + private System.Collections.Generic.List _harpOlfactometerExtension; - private AindManipulatorCalibrationOutput _output; + private HarpLicketySplit _harpLickometer; - private System.DateTimeOffset? _date; + private HarpWhiteRabbit _harpClockGenerator; - private string _description; + private HarpAnalogInput _harpAnalogInput; - private string _notes; + private Treadmill _harpTreadmill; + + private HarpSniffDetector _harpSniffDetector; + + private HarpEnvironmentSensor _harpEnvironmentSensor; + + private AindManipulatorDevice _manipulator; + + private ScreenAssembly _screen; - public AindManipulatorCalibration() + private RigCalibration _calibration; + + public AindVrForagingRig() { - _deviceName = "AindManipulator"; - _input = new AindManipulatorCalibrationInput(); - _output = new AindManipulatorCalibrationOutput(); - _description = "Calibration of the load cells system"; + _aindBehaviorServicesPkgVersion = "0.13.6"; + _version = "0.7.0-rc0"; + _triggeredCameraController = new CameraControllerSpinnakerCamera(); + _harpBehavior = new HarpBehavior(); + _harpOlfactometer = new Olfactometer(); + _harpOlfactometerExtension = new System.Collections.Generic.List(); + _harpLickometer = new HarpLicketySplit(); + _harpClockGenerator = new HarpWhiteRabbit(); + _harpTreadmill = new Treadmill(); + _manipulator = new AindManipulatorDevice(); + _screen = new ScreenAssembly(); + _calibration = new RigCalibration(); } - protected AindManipulatorCalibration(AindManipulatorCalibration other) + protected AindVrForagingRig(AindVrForagingRig other) { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _computerName = other._computerName; + _rigName = other._rigName; + _dataDirectory = other._dataDirectory; + _triggeredCameraController = other._triggeredCameraController; + _monitoringCameraController = other._monitoringCameraController; + _harpBehavior = other._harpBehavior; + _harpOlfactometer = other._harpOlfactometer; + _harpOlfactometerExtension = other._harpOlfactometerExtension; + _harpLickometer = other._harpLickometer; + _harpClockGenerator = other._harpClockGenerator; + _harpAnalogInput = other._harpAnalogInput; + _harpTreadmill = other._harpTreadmill; + _harpSniffDetector = other._harpSniffDetector; + _harpEnvironmentSensor = other._harpEnvironmentSensor; + _manipulator = other._manipulator; + _screen = other._screen; + _calibration = other._calibration; } - /// - /// Must match a device name in rig/instrument - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Must match a device name in rig/instrument")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion { get { - return _deviceName; + return _aindBehaviorServicesPkgVersion; } set { - _deviceName = value; + _aindBehaviorServicesPkgVersion = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public AindManipulatorCalibrationInput Input + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version { get { - return _input; + return _version; } set { - _input = value; + _version = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public AindManipulatorCalibrationOutput Output + /// + /// Computer name + /// + [Newtonsoft.Json.JsonPropertyAttribute("computer_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Computer name")] + public string ComputerName { get { - return _output; + return _computerName; } set { - _output = value; + _computerName = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date + /// + /// Rig name + /// + [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rig name")] + public string RigName { get { - return _date; + return _rigName; } set { - _date = value; + _rigName = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description + /// + /// Directory where data will be saved to + /// + [Newtonsoft.Json.JsonPropertyAttribute("data_directory", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Directory where data will be saved to")] + public string DataDirectory { get { - return _description; + return _dataDirectory; } set { - _description = value; + _dataDirectory = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes + /// + /// Required camera controller to triggered cameras. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Required camera controller to triggered cameras.")] + public CameraControllerSpinnakerCamera TriggeredCameraController { get { - return _notes; + return _triggeredCameraController; } set { - _notes = value; + _triggeredCameraController = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Optional camera controller for monitoring cameras. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("monitoring_camera_controller")] + [System.ComponentModel.DescriptionAttribute("Optional camera controller for monitoring cameras.")] + public CameraControllerWebCamera MonitoringCameraController { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); - return true; + get + { + return _monitoringCameraController; + } + set + { + _monitoringCameraController = value; + } } - public override string ToString() + /// + /// Harp behavior + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_behavior", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Harp behavior")] + public HarpBehavior HarpBehavior { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _harpBehavior; + } + set + { + _harpBehavior = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibrationInput - { - - private ManipulatorPosition _fullStepToMm; - private System.Collections.Generic.List _axisConfiguration; - - private System.Collections.Generic.List _homingOrder; - - private ManipulatorPosition _initialPosition; - - public AindManipulatorCalibrationInput() + /// + /// Harp olfactometer + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_olfactometer", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Harp olfactometer")] + public Olfactometer HarpOlfactometer { - _fullStepToMm = new ManipulatorPosition(); - _axisConfiguration = new System.Collections.Generic.List(); - _homingOrder = new System.Collections.Generic.List(); - _initialPosition = new ManipulatorPosition(); + get + { + return _harpOlfactometer; + } + set + { + _harpOlfactometer = value; + } } - protected AindManipulatorCalibrationInput(AindManipulatorCalibrationInput other) + /// + /// A collection of subordinate olfactometers that can be added to increase the number of independently delivered odors. The order of the list determines the order by which odors are numbered + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_olfactometer_extension")] + [System.ComponentModel.DescriptionAttribute("A collection of subordinate olfactometers that can be added to increase the numbe" + + "r of independently delivered odors. The order of the list determines the order b" + + "y which odors are numbered")] + public System.Collections.Generic.List HarpOlfactometerExtension { - _fullStepToMm = other._fullStepToMm; - _axisConfiguration = other._axisConfiguration; - _homingOrder = other._homingOrder; - _initialPosition = other._initialPosition; + get + { + return _harpOlfactometerExtension; + } + set + { + _harpOlfactometerExtension = value; + } } + /// + /// Harp lickometer + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("full_step_to_mm")] - public ManipulatorPosition FullStepToMm + [Newtonsoft.Json.JsonPropertyAttribute("harp_lickometer", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Harp lickometer")] + public HarpLicketySplit HarpLickometer { get { - return _fullStepToMm; + return _harpLickometer; } set { - _fullStepToMm = value; + _harpLickometer = value; } } + /// + /// Harp clock generator + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("axis_configuration")] - public System.Collections.Generic.List AxisConfiguration + [Newtonsoft.Json.JsonPropertyAttribute("harp_clock_generator", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Harp clock generator")] + public HarpWhiteRabbit HarpClockGenerator { get { - return _axisConfiguration; + return _harpClockGenerator; } set { - _axisConfiguration = value; + _harpClockGenerator = value; } } + /// + /// Harp analog input + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("homing_order")] - public System.Collections.Generic.List HomingOrder + [Newtonsoft.Json.JsonPropertyAttribute("harp_analog_input")] + [System.ComponentModel.DescriptionAttribute("Harp analog input")] + public HarpAnalogInput HarpAnalogInput { get { - return _homingOrder; + return _harpAnalogInput; } set { - _homingOrder = value; + _harpAnalogInput = value; } } + /// + /// Harp treadmill + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] - public ManipulatorPosition InitialPosition + [Newtonsoft.Json.JsonPropertyAttribute("harp_treadmill", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Harp treadmill")] + public Treadmill HarpTreadmill { get { - return _initialPosition; + return _harpTreadmill; } set { - _initialPosition = value; + _harpTreadmill = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibrationInput(this))); - } - - public System.IObservable Generate(System.IObservable source) + /// + /// Sniff detector settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_sniff_detector")] + [System.ComponentModel.DescriptionAttribute("Sniff detector settings")] + public HarpSniffDetector HarpSniffDetector { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibrationInput(this)); + get + { + return _harpSniffDetector; + } + set + { + _harpSniffDetector = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Environment sensor + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("harp_environment_sensor")] + [System.ComponentModel.DescriptionAttribute("Environment sensor")] + public HarpEnvironmentSensor HarpEnvironmentSensor { - stringBuilder.Append("FullStepToMm = " + _fullStepToMm + ", "); - stringBuilder.Append("AxisConfiguration = " + _axisConfiguration + ", "); - stringBuilder.Append("HomingOrder = " + _homingOrder + ", "); - stringBuilder.Append("InitialPosition = " + _initialPosition); - return true; + get + { + return _harpEnvironmentSensor; + } + set + { + _harpEnvironmentSensor = value; + } } - public override string ToString() + /// + /// Manipulator + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("manipulator", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Manipulator")] + public AindManipulatorDevice Manipulator { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _manipulator; + } + set + { + _manipulator = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorCalibrationOutput - { - public AindManipulatorCalibrationOutput() + /// + /// Screen settings + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("screen")] + [System.ComponentModel.DescriptionAttribute("Screen settings")] + public ScreenAssembly Screen { + get + { + return _screen; + } + set + { + _screen = value; + } } - protected AindManipulatorCalibrationOutput(AindManipulatorCalibrationOutput other) + /// + /// Calibration models + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Calibration models")] + public RigCalibration Calibration { + get + { + return _calibration; + } + set + { + _calibration = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorCalibrationOutput(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVrForagingRig(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorCalibrationOutput(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new AindVrForagingRig(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("ComputerName = " + _computerName + ", "); + stringBuilder.Append("RigName = " + _rigName + ", "); + stringBuilder.Append("DataDirectory = " + _dataDirectory + ", "); + stringBuilder.Append("TriggeredCameraController = " + _triggeredCameraController + ", "); + stringBuilder.Append("MonitoringCameraController = " + _monitoringCameraController + ", "); + stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); + stringBuilder.Append("HarpOlfactometer = " + _harpOlfactometer + ", "); + stringBuilder.Append("HarpOlfactometerExtension = " + _harpOlfactometerExtension + ", "); + stringBuilder.Append("HarpLickometer = " + _harpLickometer + ", "); + stringBuilder.Append("HarpClockGenerator = " + _harpClockGenerator + ", "); + stringBuilder.Append("HarpAnalogInput = " + _harpAnalogInput + ", "); + stringBuilder.Append("HarpTreadmill = " + _harpTreadmill + ", "); + stringBuilder.Append("HarpSniffDetector = " + _harpSniffDetector + ", "); + stringBuilder.Append("HarpEnvironmentSensor = " + _harpEnvironmentSensor + ", "); + stringBuilder.Append("Manipulator = " + _manipulator + ", "); + stringBuilder.Append("Screen = " + _screen + ", "); + stringBuilder.Append("Calibration = " + _calibration); + return true; } public override string ToString() @@ -724,176 +649,149 @@ public override string ToString() /// - /// Overrides the default settings for the manipulator device by spec'ing additional_settings field + /// Main task logic model for the AIND VR Foraging task. + /// + ///This is the top-level class that encapsulates the complete task logic + ///specification for the virtual reality foraging behavioral experiment. + ///It includes all task parameters, environment specifications, and control settings. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Overrides the default settings for the manipulator device by spec\'ing additional_" + - "settings field")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Main task logic model for the AIND VR Foraging task. + + This is the top-level class that encapsulates the complete task logic + specification for the virtual reality foraging behavioral experiment. + It includes all task parameters, environment specifications, and control settings.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindManipulatorDevice + public partial class AindVrForagingTaskLogic { - private string _deviceType; - - private string _deviceName; - - private AindManipulatorAdditionalSettings _additionalSettings; - - private AindManipulatorCalibration _calibration; + private string _name; - private int _whoAmI; + private string _description; - private string _serialNumber; + private AindVrForagingTaskParameters _taskParameters; - private string _portName; + private string _version; - public AindManipulatorDevice() - { - _deviceType = "StepperDriver"; - _additionalSettings = new AindManipulatorAdditionalSettings(); - _whoAmI = 1130; - } + private string _stageName; - protected AindManipulatorDevice(AindManipulatorDevice other) + public AindVrForagingTaskLogic() { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _name = "AindVrForaging"; + _description = ""; + _taskParameters = new AindVrForagingTaskParameters(); + _version = "0.7.0-rc0"; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + protected AindVrForagingTaskLogic(AindVrForagingTaskLogic other) { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _name = other._name; + _description = other._description; + _taskParameters = other._taskParameters; + _version = other._version; + _stageName = other._stageName; } /// - /// Device name + /// Name of the task logic /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("name")] + [System.ComponentModel.DescriptionAttribute("Name of the task logic")] + public string Name { get { - return _deviceName; + return _name; } set { - _deviceName = value; + _name = value; } } /// - /// Additional settings + /// Description of the task. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public AindManipulatorAdditionalSettings AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("description")] + [System.ComponentModel.DescriptionAttribute("Description of the task.")] + public string Description { get { - return _additionalSettings; + return _description; } set { - _additionalSettings = value; + _description = value; } } + /// + /// Parameters of the task logic + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - public AindManipulatorCalibration Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + [Newtonsoft.Json.JsonPropertyAttribute("task_parameters", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Parameters of the task logic")] + public AindVrForagingTaskParameters TaskParameters { get { - return _whoAmI; + return _taskParameters; } set { - _whoAmI = value; + _taskParameters = value; } } - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version { get { - return _serialNumber; + return _version; } set { - _serialNumber = value; + _version = value; } } /// - /// Device port name + /// Optional stage name the `Task` object instance represents. /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("stage_name")] + [System.ComponentModel.DescriptionAttribute("Optional stage name the `Task` object instance represents.")] + public string StageName { get { - return _portName; + return _stageName; } set { - _portName = value; + _stageName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindManipulatorDevice(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVrForagingTaskLogic(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindManipulatorDevice(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new AindVrForagingTaskLogic(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("Name = " + _name + ", "); + stringBuilder.Append("Description = " + _description + ", "); + stringBuilder.Append("TaskParameters = " + _taskParameters + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("StageName = " + _stageName); return true; } @@ -912,406 +810,293 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindVrForagingRig - { - - private string _aindBehaviorServicesPkgVersion; - - private string _version; - - private string _computerName; - - private string _rigName; - - private CameraControllerSpinnakerCamera _triggeredCameraController; - - private CameraControllerWebCamera _monitoringCameraController; - - private HarpBehavior _harpBehavior; - - private Olfactometer _harpOlfactometer; - - private HarpLicketySplit _harpLickometer; - - private HarpWhiteRabbit _harpClockGenerator; - - private HarpAnalogInput _harpAnalogInput; - - private Treadmill _harpTreadmill; + /// + /// Complete parameter specification for the AIND VR Foraging task. + /// + ///This class contains all configurable parameters for the VR foraging task, + ///including environment structure, task mode settings, operation control, + ///and numerical updaters for dynamic parameter modification. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Complete parameter specification for the AIND VR Foraging task. + + This class contains all configurable parameters for the VR foraging task, + including environment structure, task mode settings, operation control, + and numerical updaters for dynamic parameter modification.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AindVrForagingTaskParameters + { - private HarpSniffDetector _harpSniffDetector; + private double? _rngSeed; - private HarpEnvironmentSensor _harpEnvironmentSensor; + private string _aindBehaviorServicesPkgVersion; - private AindManipulatorDevice _manipulator; + private System.Collections.Generic.Dictionary _updaters; - private Screen _screen; + private BlockStructure _environment; - private RigCalibration _calibration; + private OperationControl _operationControl; - public AindVrForagingRig() + public AindVrForagingTaskParameters() { - _aindBehaviorServicesPkgVersion = "0.12.5"; - _version = "0.6.5"; - _triggeredCameraController = new CameraControllerSpinnakerCamera(); - _harpBehavior = new HarpBehavior(); - _harpOlfactometer = new Olfactometer(); - _harpLickometer = new HarpLicketySplit(); - _harpClockGenerator = new HarpWhiteRabbit(); - _harpTreadmill = new Treadmill(); - _manipulator = new AindManipulatorDevice(); - _screen = new Screen(); - _calibration = new RigCalibration(); + _aindBehaviorServicesPkgVersion = "0.13.6"; + _environment = new BlockStructure(); + _operationControl = new OperationControl(); } - protected AindVrForagingRig(AindVrForagingRig other) + protected AindVrForagingTaskParameters(AindVrForagingTaskParameters other) { + _rngSeed = other._rngSeed; _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _version = other._version; - _computerName = other._computerName; - _rigName = other._rigName; - _triggeredCameraController = other._triggeredCameraController; - _monitoringCameraController = other._monitoringCameraController; - _harpBehavior = other._harpBehavior; - _harpOlfactometer = other._harpOlfactometer; - _harpLickometer = other._harpLickometer; - _harpClockGenerator = other._harpClockGenerator; - _harpAnalogInput = other._harpAnalogInput; - _harpTreadmill = other._harpTreadmill; - _harpSniffDetector = other._harpSniffDetector; - _harpEnvironmentSensor = other._harpEnvironmentSensor; - _manipulator = other._manipulator; - _screen = other._screen; - _calibration = other._calibration; + _updaters = other._updaters; + _environment = other._environment; + _operationControl = other._operationControl; } - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion + /// + /// Seed of the random number generator + /// + [Newtonsoft.Json.JsonPropertyAttribute("rng_seed")] + [System.ComponentModel.DescriptionAttribute("Seed of the random number generator")] + public double? RngSeed { get { - return _aindBehaviorServicesPkgVersion; + return _rngSeed; } set { - _aindBehaviorServicesPkgVersion = value; + _rngSeed = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion { get { - return _version; + return _aindBehaviorServicesPkgVersion; } set { - _version = value; + _aindBehaviorServicesPkgVersion = value; } } /// - /// Computer name + /// Look-up table for numeric updaters /// - [Newtonsoft.Json.JsonPropertyAttribute("computer_name")] - [System.ComponentModel.DescriptionAttribute("Computer name")] - public string ComputerName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("updaters")] + [System.ComponentModel.DescriptionAttribute("Look-up table for numeric updaters")] + public System.Collections.Generic.Dictionary Updaters { get { - return _computerName; + return _updaters; } set { - _computerName = value; + _updaters = value; } } /// - /// Rig name + /// Statistics of the environment /// - [Newtonsoft.Json.JsonPropertyAttribute("rig_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rig name")] - public string RigName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("environment", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] + public BlockStructure Environment { get { - return _rigName; + return _environment; } set { - _rigName = value; + _environment = value; } } /// - /// Required camera controller to triggered cameras. + /// Control of the operation /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("triggered_camera_controller", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Required camera controller to triggered cameras.")] - public CameraControllerSpinnakerCamera TriggeredCameraController + [Newtonsoft.Json.JsonPropertyAttribute("operation_control", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Control of the operation")] + public OperationControl OperationControl { get { - return _triggeredCameraController; + return _operationControl; } set { - _triggeredCameraController = value; + _operationControl = value; } } - /// - /// Optional camera controller for monitoring cameras. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("monitoring_camera_controller")] - [System.ComponentModel.DescriptionAttribute("Optional camera controller for monitoring cameras.")] - public CameraControllerWebCamera MonitoringCameraController + public System.IObservable Generate() { - get - { - return _monitoringCameraController; - } - set - { - _monitoringCameraController = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVrForagingTaskParameters(this))); } - /// - /// Harp behavior - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_behavior", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Harp behavior")] - public HarpBehavior HarpBehavior + public System.IObservable Generate(System.IObservable source) { - get - { - return _harpBehavior; - } - set - { - _harpBehavior = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new AindVrForagingTaskParameters(this)); } - /// - /// Harp olfactometer - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_olfactometer", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Harp olfactometer")] - public Olfactometer HarpOlfactometer + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _harpOlfactometer; - } - set + stringBuilder.Append("RngSeed = " + _rngSeed + ", "); + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Updaters = " + _updaters + ", "); + stringBuilder.Append("Environment = " + _environment + ", "); + stringBuilder.Append("OperationControl = " + _operationControl); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _harpOlfactometer = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// Controls audio feedback parameters for the task. + /// + ///This class manages audio cue generation including tone duration and frequency + ///for auditory feedback during the behavioral task. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Controls audio feedback parameters for the task.\n\nThis class manages audio cue ge" + + "neration including tone duration and frequency\nfor auditory feedback during the " + + "behavioral task.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class AudioControl + { + + private double _duration; + + private double _frequency; + + public AudioControl() + { + _duration = 0.2D; + _frequency = 1000D; + } + + protected AudioControl(AudioControl other) + { + _duration = other._duration; + _frequency = other._frequency; } /// - /// Harp lickometer + /// Duration /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_lickometer", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Harp lickometer")] - public HarpLicketySplit HarpLickometer + [Newtonsoft.Json.JsonPropertyAttribute("duration")] + [System.ComponentModel.DescriptionAttribute("Duration")] + public double Duration { get { - return _harpLickometer; + return _duration; } set { - _harpLickometer = value; + _duration = value; } } /// - /// Harp clock generator + /// Frequency (Hz) of the audio cue /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_clock_generator", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Harp clock generator")] - public HarpWhiteRabbit HarpClockGenerator + [Newtonsoft.Json.JsonPropertyAttribute("frequency")] + [System.ComponentModel.DescriptionAttribute("Frequency (Hz) of the audio cue")] + public double Frequency { get { - return _harpClockGenerator; + return _frequency; } set { - _harpClockGenerator = value; + _frequency = value; } } - /// - /// Harp analog input - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_analog_input")] - [System.ComponentModel.DescriptionAttribute("Harp analog input")] - public HarpAnalogInput HarpAnalogInput - { - get - { - return _harpAnalogInput; - } - set - { - _harpAnalogInput = value; - } - } - - /// - /// Harp treadmill - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_treadmill", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Harp treadmill")] - public Treadmill HarpTreadmill + public System.IObservable Generate() { - get - { - return _harpTreadmill; - } - set - { - _harpTreadmill = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AudioControl(this))); } - /// - /// Sniff detector settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_sniff_detector")] - [System.ComponentModel.DescriptionAttribute("Sniff detector settings")] - public HarpSniffDetector HarpSniffDetector + public System.IObservable Generate(System.IObservable source) { - get - { - return _harpSniffDetector; - } - set - { - _harpSniffDetector = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new AudioControl(this)); } - /// - /// Environment sensor - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("harp_environment_sensor")] - [System.ComponentModel.DescriptionAttribute("Environment sensor")] - public HarpEnvironmentSensor HarpEnvironmentSensor + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _harpEnvironmentSensor; - } - set - { - _harpEnvironmentSensor = value; - } + stringBuilder.Append("Duration = " + _duration + ", "); + stringBuilder.Append("Frequency = " + _frequency); + return true; } - /// - /// Manipulator - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("manipulator", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Manipulator")] - public AindManipulatorDevice Manipulator + public override string ToString() { - get - { - return _manipulator; - } - set + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _manipulator = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class BaseModel + { - /// - /// Screen settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("screen")] - [System.ComponentModel.DescriptionAttribute("Screen settings")] - public Screen Screen + public BaseModel() { - get - { - return _screen; - } - set - { - _screen = value; - } } - /// - /// Calibration models - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Calibration models")] - public RigCalibration Calibration + protected BaseModel(BaseModel other) { - get - { - return _calibration; - } - set - { - _calibration = value; - } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVrForagingRig(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindVrForagingRig(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("ComputerName = " + _computerName + ", "); - stringBuilder.Append("RigName = " + _rigName + ", "); - stringBuilder.Append("TriggeredCameraController = " + _triggeredCameraController + ", "); - stringBuilder.Append("MonitoringCameraController = " + _monitoringCameraController + ", "); - stringBuilder.Append("HarpBehavior = " + _harpBehavior + ", "); - stringBuilder.Append("HarpOlfactometer = " + _harpOlfactometer + ", "); - stringBuilder.Append("HarpLickometer = " + _harpLickometer + ", "); - stringBuilder.Append("HarpClockGenerator = " + _harpClockGenerator + ", "); - stringBuilder.Append("HarpAnalogInput = " + _harpAnalogInput + ", "); - stringBuilder.Append("HarpTreadmill = " + _harpTreadmill + ", "); - stringBuilder.Append("HarpSniffDetector = " + _harpSniffDetector + ", "); - stringBuilder.Append("HarpEnvironmentSensor = " + _harpEnvironmentSensor + ", "); - stringBuilder.Append("Manipulator = " + _manipulator + ", "); - stringBuilder.Append("Screen = " + _screen + ", "); - stringBuilder.Append("Calibration = " + _calibration); - return true; + return false; } public override string ToString() @@ -1330,149 +1115,88 @@ public override string ToString() /// - /// Main task logic model for the AIND VR Foraging task. + /// Configuration for a single experimental block. /// - ///This is the top-level class that encapsulates the complete task logic - ///specification for the virtual reality foraging behavioral experiment. - ///It includes all task parameters, environment specifications, and control settings. + ///A block represents a period of the experiment with specific environment + ///statistics and ending conditions. Each block defines the environmental + ///parameters and termination criteria for that experimental phase. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Main task logic model for the AIND VR Foraging task. - - This is the top-level class that encapsulates the complete task logic - specification for the virtual reality foraging behavioral experiment. - It includes all task parameters, environment specifications, and control settings.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Configuration for a single experimental block.\n\nA block represents a period of th" + + "e experiment with specific environment\nstatistics and ending conditions. Each bl" + + "ock defines the environmental\nparameters and termination criteria for that exper" + + "imental phase.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindVrForagingTaskLogic + public partial class Block { - private string _name; - - private string _description; - - private AindVrForagingTaskParameters _taskParameters; - - private string _version; - - private string _stageName; + private EnvironmentStatistics _environmentStatistics; - public AindVrForagingTaskLogic() - { - _name = "AindVrForaging"; - _description = ""; - _taskParameters = new AindVrForagingTaskParameters(); - _version = "0.6.5"; - } + private System.Collections.Generic.List _endConditions; - protected AindVrForagingTaskLogic(AindVrForagingTaskLogic other) + public Block() { - _name = other._name; - _description = other._description; - _taskParameters = other._taskParameters; - _version = other._version; - _stageName = other._stageName; + _environmentStatistics = new EnvironmentStatistics(); + _endConditions = new System.Collections.Generic.List(); } - /// - /// Name of the task logic - /// - [Newtonsoft.Json.JsonPropertyAttribute("name")] - [System.ComponentModel.DescriptionAttribute("Name of the task logic")] - public string Name + protected Block(Block other) { - get - { - return _name; - } - set - { - _name = value; - } + _environmentStatistics = other._environmentStatistics; + _endConditions = other._endConditions; } /// - /// Description of the task. + /// Statistics of the environment /// - [Newtonsoft.Json.JsonPropertyAttribute("description")] - [System.ComponentModel.DescriptionAttribute("Description of the task.")] - public string Description + [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 _description; + return _environmentStatistics; } set { - _description = value; + _environmentStatistics = value; } } /// - /// Parameters of the task logic + /// List of end conditions that must be true for the block to end. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("task_parameters", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Parameters of the task logic")] - public AindVrForagingTaskParameters TaskParameters + [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 _taskParameters; + return _endConditions; } set { - _taskParameters = value; + _endConditions = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("version")] - public string Version + public System.IObservable Generate() { - get - { - return _version; - } - set - { - _version = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Block(this))); } - /// - /// Optional stage name the `Task` object instance represents. - /// - [Newtonsoft.Json.JsonPropertyAttribute("stage_name")] - [System.ComponentModel.DescriptionAttribute("Optional stage name the `Task` object instance represents.")] - public string StageName - { - get - { - return _stageName; - } - set - { - _stageName = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVrForagingTaskLogic(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindVrForagingTaskLogic(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Block(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Name = " + _name + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("TaskParameters = " + _taskParameters + ", "); - stringBuilder.Append("Version = " + _version + ", "); - stringBuilder.Append("StageName = " + _stageName); + stringBuilder.Append("EnvironmentStatistics = " + _environmentStatistics + ", "); + stringBuilder.Append("EndConditions = " + _endConditions); return true; } @@ -1492,741 +1216,600 @@ public override string ToString() /// - /// Complete parameter specification for the AIND VR Foraging task. + /// Block end condition based on time duration. /// - ///This class contains all configurable parameters for the VR foraging task, - ///including environment structure, task mode settings, operation control, - ///and numerical updaters for dynamic parameter modification. + ///This condition ends a block after a specified amount of time has elapsed. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Complete parameter specification for the AIND VR Foraging task. - - This class contains all configurable parameters for the VR foraging task, - including environment structure, task mode settings, operation control, - and numerical updaters for dynamic parameter modification.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.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))] + [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + + "specified amount of time has elapsed.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindVrForagingTaskParameters + public partial class BlockEndCondition { - private double? _rngSeed; - - private string _aindBehaviorServicesPkgVersion; - - private System.Collections.Generic.Dictionary _updaters; - - private BlockStructure _environment; + public BlockEndCondition() + { + } - private OperationControl _operationControl; + protected BlockEndCondition(BlockEndCondition other) + { + } - public AindVrForagingTaskParameters() + public System.IObservable Generate() { - _aindBehaviorServicesPkgVersion = "0.12.5"; - _environment = new BlockStructure(); - _operationControl = new OperationControl(); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndCondition(this))); } - protected AindVrForagingTaskParameters(AindVrForagingTaskParameters other) + public System.IObservable Generate(System.IObservable source) { - _rngSeed = other._rngSeed; - _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _updaters = other._updaters; - _environment = other._environment; - _operationControl = other._operationControl; + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndCondition(this)); } - /// - /// Seed of the random number generator - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rng_seed")] - [System.ComponentModel.DescriptionAttribute("Seed of the random number generator")] - public double? RngSeed + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _rngSeed; - } - set - { - _rngSeed = value; - } + return false; } - [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] - public string AindBehaviorServicesPkgVersion + public override string ToString() { - get - { - return _aindBehaviorServicesPkgVersion; - } - set + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - _aindBehaviorServicesPkgVersion = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + /// + /// Block end condition based on number of choices made. + /// + ///This condition ends a block after the animal has made a specified number + ///of choices (e.g., patch visits or reward attempts). + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on number of choices made.\n\nThis condition ends a block" + + " after the animal has made a specified number\nof choices (e.g., patch visits or " + + "reward attempts).")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class BlockEndConditionChoice : BlockEndCondition + { - /// - /// Look-up table for numeric updaters - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("updaters")] - [System.ComponentModel.DescriptionAttribute("Look-up table for numeric updaters")] - public System.Collections.Generic.Dictionary Updaters + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; + + public BlockEndConditionChoice() { - get - { - return _updaters; - } - set - { - _updaters = value; - } } - /// - /// Statistics of the environment - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("environment", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] - public BlockStructure Environment + protected BlockEndConditionChoice(BlockEndConditionChoice other) : + base(other) { - get - { - return _environment; - } - set - { - _environment = value; - } + _value = other._value; } /// - /// Control of the operation + /// Number of choices after which the block ends. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operation_control", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Control of the operation")] - public OperationControl OperationControl + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of choices after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _operationControl; + return _value; } set { - _operationControl = value; + _value = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindVrForagingTaskParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new AindVrForagingTaskParameters(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionChoice(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("RngSeed = " + _rngSeed + ", "); - stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("Updaters = " + _updaters + ", "); - stringBuilder.Append("Environment = " + _environment + ", "); - stringBuilder.Append("OperationControl = " + _operationControl); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionChoice(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Value = " + _value); + return true; } } /// - /// Controls audio feedback parameters for the task. + /// Block end condition based on distance traveled. /// - ///This class manages audio cue generation including tone duration and frequency - ///for auditory feedback during the behavioral task. + ///This condition ends a block after the animal has traveled a specified distance. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Controls audio feedback parameters for the task.\n\nThis class manages audio cue ge" + - "neration including tone duration and frequency\nfor auditory feedback during the " + - "behavioral task.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on distance traveled.\n\nThis condition ends a block afte" + + "r the animal has traveled a specified distance.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AudioControl + public partial class BlockEndConditionDistance : BlockEndCondition { - private double _duration; - - private double _frequency; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - public AudioControl() + public BlockEndConditionDistance() { - _duration = 0.2D; - _frequency = 1000D; } - protected AudioControl(AudioControl other) + protected BlockEndConditionDistance(BlockEndConditionDistance other) : + base(other) { - _duration = other._duration; - _frequency = other._frequency; + _value = other._value; } /// - /// Duration + /// Distance after which the block ends. /// - [Newtonsoft.Json.JsonPropertyAttribute("duration")] - [System.ComponentModel.DescriptionAttribute("Duration")] - public double Duration + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Distance after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _duration; + return _value; } set { - _duration = value; + _value = value; } } - /// - /// Frequency (Hz) of the audio cue - /// - [Newtonsoft.Json.JsonPropertyAttribute("frequency")] - [System.ComponentModel.DescriptionAttribute("Frequency (Hz) of the audio cue")] - public double Frequency + public System.IObservable Generate() { - get - { - return _frequency; - } - set - { - _frequency = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AudioControl(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AudioControl(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDistance(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Duration = " + _duration + ", "); - stringBuilder.Append("Frequency = " + _frequency); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDistance(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Value = " + _value); + return true; } } /// - /// Motor axis available - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum Axis - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] - None = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] - X = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] - Y1 = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] - Y2 = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] - Z = 4, - } - - - /// - /// Axis configuration + /// Block end condition based on time duration. + /// + ///This condition ends a block after a specified amount of time has elapsed. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Axis configuration")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + + "specified amount of time has elapsed.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AxisConfiguration + public partial class BlockEndConditionDuration : BlockEndCondition { - private Axis _axis; - - private int _stepAccelerationInterval; - - private int _stepInterval; - - private MicrostepResolution _microstepResolution; - - private int _maximumStepInterval; - - private MotorOperationMode _motorOperationMode; - - private double _maxLimit; - - private double _minLimit; - - public AxisConfiguration() - { - _stepAccelerationInterval = 100; - _stepInterval = 100; - _microstepResolution = AindVrForagingDataSchema.MicrostepResolution.Microstep8; - _maximumStepInterval = 2000; - _motorOperationMode = AindVrForagingDataSchema.MotorOperationMode.Quiet; - _maxLimit = 25D; - _minLimit = -0.01D; - } + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - protected AxisConfiguration(AxisConfiguration other) + public BlockEndConditionDuration() { - _axis = other._axis; - _stepAccelerationInterval = other._stepAccelerationInterval; - _stepInterval = other._stepInterval; - _microstepResolution = other._microstepResolution; - _maximumStepInterval = other._maximumStepInterval; - _motorOperationMode = other._motorOperationMode; - _maxLimit = other._maxLimit; - _minLimit = other._minLimit; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("axis", Required=Newtonsoft.Json.Required.Always)] - public Axis Axis + protected BlockEndConditionDuration(BlockEndConditionDuration other) : + base(other) { - get - { - return _axis; - } - set - { - _axis = value; - } + _value = other._value; } /// - /// Acceleration of the step interval in microseconds + /// Time after which the block ends. /// - [Newtonsoft.Json.JsonPropertyAttribute("step_acceleration_interval")] - [System.ComponentModel.DescriptionAttribute("Acceleration of the step interval in microseconds")] - public int StepAccelerationInterval + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Time after which the block ends.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _stepAccelerationInterval; + return _value; } set { - _stepAccelerationInterval = value; + _value = value; } } - /// - /// Step interval in microseconds. - /// - [Newtonsoft.Json.JsonPropertyAttribute("step_interval")] - [System.ComponentModel.DescriptionAttribute("Step interval in microseconds.")] - public int StepInterval + public System.IObservable Generate() { - get - { - return _stepInterval; - } - set - { - _stepInterval = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDuration(this))); } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("microstep_resolution")] - public MicrostepResolution MicrostepResolution + public System.IObservable Generate(System.IObservable source) { - get - { - return _microstepResolution; - } - set - { - _microstepResolution = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDuration(this)); } - [Newtonsoft.Json.JsonPropertyAttribute("maximum_step_interval")] - public int MaximumStepInterval + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _maximumStepInterval; - } - set + if (base.PrintMembers(stringBuilder)) { - _maximumStepInterval = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Value = " + _value); + return true; } + } + + + /// + /// Block end condition based on number of patches visited. + /// + ///This condition ends a block after the animal has visited a specified + ///number of unique patches. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on number of patches visited.\n\nThis condition ends a bl" + + "ock after the animal has visited a specified\nnumber of unique patches.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class BlockEndConditionPatchCount : BlockEndCondition + { - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("motor_operation_mode")] - public MotorOperationMode MotorOperationMode + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; + + public BlockEndConditionPatchCount() { - get - { - return _motorOperationMode; - } - set - { - _motorOperationMode = value; - } } - [Newtonsoft.Json.JsonPropertyAttribute("max_limit")] - public double MaxLimit + protected BlockEndConditionPatchCount(BlockEndConditionPatchCount other) : + base(other) { - get - { - return _maxLimit; - } - set - { - _maxLimit = value; - } + _value = other._value; } - [Newtonsoft.Json.JsonPropertyAttribute("min_limit")] - public double MinLimit + /// + /// 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 AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _minLimit; + return _value; } set { - _minLimit = value; + _value = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AxisConfiguration(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new AxisConfiguration(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionPatchCount(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Axis = " + _axis + ", "); - stringBuilder.Append("StepAccelerationInterval = " + _stepAccelerationInterval + ", "); - stringBuilder.Append("StepInterval = " + _stepInterval + ", "); - stringBuilder.Append("MicrostepResolution = " + _microstepResolution + ", "); - stringBuilder.Append("MaximumStepInterval = " + _maximumStepInterval + ", "); - stringBuilder.Append("MotorOperationMode = " + _motorOperationMode + ", "); - stringBuilder.Append("MaxLimit = " + _maxLimit + ", "); - stringBuilder.Append("MinLimit = " + _minLimit); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionPatchCount(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Value = " + _value); + return true; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Block end condition based on number of rewards obtained. + /// + ///This condition ends a block after the animal has obtained a specified + ///number of rewards. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Block end condition based on number of rewards obtained.\n\nThis condition ends a b" + + "lock after the animal has obtained a specified\nnumber of rewards.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BaseModel + public partial class BlockEndConditionReward : BlockEndCondition { - public BaseModel() + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; + + public BlockEndConditionReward() { } - protected BaseModel(BaseModel other) + protected BlockEndConditionReward(BlockEndConditionReward other) : + base(other) { + _value = other._value; } - public System.IObservable Generate() + /// + /// 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 AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BaseModel(this))); + get + { + return _value; + } + set + { + _value = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new BaseModel(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionReward(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - return false; + return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionReward(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Value = " + _value); + return true; } } /// - /// A beta probability distribution. + /// Structure defining the sequence and sampling of experimental blocks. /// - ///Continuous distribution bounded between 0 and 1. Commonly used - ///for modeling probabilities and proportions. + ///This class manages multiple experimental blocks and determines how they + ///are presented during the experiment (sequentially or randomly). /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A beta probability distribution.\n\nContinuous distribution bounded between 0 and 1" + - ". Commonly used\nfor modeling probabilities and proportions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Structure defining the sequence and sampling of experimental blocks.\n\nThis class " + + "manages multiple experimental blocks and determines how they\nare presented durin" + + "g the experiment (sequentially or randomly).")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BetaDistribution : Distribution + public partial class BlockStructure { - private BetaDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; + private System.Collections.Generic.List _blocks; - private ScalingParameters _scalingParameters; + private BlockStructureSamplingMode _samplingMode; - public BetaDistribution() + public BlockStructure() { - _distributionParameters = new BetaDistributionParameters(); + _blocks = new System.Collections.Generic.List(); + _samplingMode = BlockStructureSamplingMode.Sequential; } - protected BetaDistribution(BetaDistribution other) : - base(other) + protected BlockStructure(BlockStructure other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _blocks = other._blocks; + _samplingMode = other._samplingMode; } /// - /// Parameters of the distribution + /// Statistics of the environment /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public BetaDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("blocks", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] + public System.Collections.Generic.List Blocks { get { - return _distributionParameters; + return _blocks; } set { - _distributionParameters = value; + _blocks = value; } } /// - /// Truncation parameters of the distribution + /// Sampling mode of the blocks. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("sampling_mode")] + [System.ComponentModel.DescriptionAttribute("Sampling mode of the blocks.")] + public BlockStructureSamplingMode SamplingMode { get { - return _truncationParameters; + return _samplingMode; } set { - _truncationParameters = value; + _samplingMode = 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 + public System.IObservable Generate() { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockStructure(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BetaDistribution(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new BlockStructure(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new BetaDistribution(this)); + stringBuilder.Append("Blocks = " + _blocks + ", "); + stringBuilder.Append("SamplingMode = " + _samplingMode); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - /// - /// Parameters for a beta distribution. - /// - ///Defined by alpha and beta shape parameters. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a beta distribution.\n\nDefined by alpha and beta shape parameters.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BetaDistributionParameters + public partial class CameraControllerSpinnakerCamera { - private string _family; + private string _deviceType; + + private BaseModel _calibration; + + private System.Collections.Generic.Dictionary _cameras; - private double _alpha; + private int? _frameRate; - private double _beta; + public CameraControllerSpinnakerCamera() + { + _deviceType = "CameraController"; + _cameras = new System.Collections.Generic.Dictionary(); + _frameRate = 30; + } - public BetaDistributionParameters() + protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) { - _family = "Beta"; - _alpha = 5D; - _beta = 5D; + _deviceType = other._deviceType; + _calibration = other._calibration; + _cameras = other._cameras; + _frameRate = other._frameRate; } - protected BetaDistributionParameters(BetaDistributionParameters other) + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { - _family = other._family; - _alpha = other._alpha; - _beta = other._beta; + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// Calibration for the device. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _family; + return _calibration; } set { - _family = value; + _calibration = value; } } /// - /// Alpha parameter of the distribution + /// Cameras to be instantiated /// - [Newtonsoft.Json.JsonPropertyAttribute("alpha")] - [System.ComponentModel.DescriptionAttribute("Alpha parameter of the distribution")] - public double Alpha + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] + public System.Collections.Generic.Dictionary Cameras { get { - return _alpha; + return _cameras; } set { - _alpha = value; + _cameras = value; } } /// - /// Beta parameter of the distribution + /// Frame rate of the trigger to all cameras /// - [Newtonsoft.Json.JsonPropertyAttribute("beta")] - [System.ComponentModel.DescriptionAttribute("Beta parameter of the distribution")] - public double Beta + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] + public int? FrameRate { get { - return _beta; + return _frameRate; } set { - _beta = value; + _frameRate = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BetaDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BetaDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Alpha = " + _alpha + ", "); - stringBuilder.Append("Beta = " + _beta); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Cameras = " + _cameras + ", "); + stringBuilder.Append("FrameRate = " + _frameRate); return true; } @@ -2245,371 +1828,434 @@ public override string ToString() } - /// - /// A binomial probability distribution. - /// - ///Models the number of successes in a fixed number of independent - ///Bernoulli trials with constant success probability. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A binomial probability distribution.\n\nModels the number of successes in a fixed n" + - "umber of independent\nBernoulli trials with constant success probability.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BinomialDistribution : Distribution + public partial class CameraControllerWebCamera { - private BinomialDistributionParameters _distributionParameters; + private string _deviceType; + + private BaseModel _calibration; + + private System.Collections.Generic.Dictionary _cameras; - private TruncationParameters _truncationParameters; + private int? _frameRate; - private ScalingParameters _scalingParameters; + public CameraControllerWebCamera() + { + _deviceType = "CameraController"; + _cameras = new System.Collections.Generic.Dictionary(); + _frameRate = 30; + } - public BinomialDistribution() + protected CameraControllerWebCamera(CameraControllerWebCamera other) { - _distributionParameters = new BinomialDistributionParameters(); + _deviceType = other._deviceType; + _calibration = other._calibration; + _cameras = other._cameras; + _frameRate = other._frameRate; } - protected BinomialDistribution(BinomialDistribution other) : - base(other) + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } /// - /// Parameters of the distribution + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public BinomialDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _distributionParameters; + return _calibration; } set { - _distributionParameters = value; + _calibration = value; } } /// - /// Truncation parameters of the distribution + /// Cameras to be instantiated /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] + public System.Collections.Generic.Dictionary Cameras { get { - return _truncationParameters; + return _cameras; } set { - _truncationParameters = value; + _cameras = value; } } /// - /// Scaling parameters of the distribution + /// Frame rate of the trigger to all cameras /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] + public int? FrameRate { get { - return _scalingParameters; + return _frameRate; } set { - _scalingParameters = value; + _frameRate = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BinomialDistribution(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerWebCamera(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BinomialDistribution(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerWebCamera(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Cameras = " + _cameras + ", "); + stringBuilder.Append("FrameRate = " + _frameRate); + 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(" "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Parameters for a binomial distribution. + /// A patch update function that applies multiplicative rate updates with bounds. /// - ///Defined by number of trials (n) and success probability (p). + ///Update in the form of x = clamp(x * rate ** tick_value). + ///This function multiplies the current value by the rate parameter, maintaining + ///the result within specified minimum and maximum bounds. Useful for percentage- + ///based changes and exponential decay/growth patterns. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a binomial distribution.\n\nDefined by number of trials (n) and succ" + - "ess probability (p).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies multiplicative rate updates with bounds. + + Update in the form of x = clamp(x * rate ** tick_value). + This function multiplies the current value by the rate parameter, maintaining + the result within specified minimum and maximum bounds. Useful for percentage- + based changes and exponential decay/growth patterns.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BinomialDistributionParameters + public partial class ClampedMultiplicativeRateFunction : PatchUpdateFunction { - private string _family; + private double? _minimum; - private int _n; + private double? _maximum; - private double _p; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _rate; - public BinomialDistributionParameters() + public ClampedMultiplicativeRateFunction() { - _family = "Binomial"; - _n = 1; - _p = 0.5D; + _minimum = 0; } - protected BinomialDistributionParameters(BinomialDistributionParameters other) + protected ClampedMultiplicativeRateFunction(ClampedMultiplicativeRateFunction other) : + base(other) { - _family = other._family; - _n = other._n; - _p = other._p; + _minimum = other._minimum; + _maximum = other._maximum; + _rate = other._rate; } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// Minimum value of the rate + /// + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] + public double? Minimum { get { - return _family; + return _minimum; } set { - _family = value; + _minimum = value; } } /// - /// Number of trials + /// Maximum value of the rate /// - [Newtonsoft.Json.JsonPropertyAttribute("n")] - [System.ComponentModel.DescriptionAttribute("Number of trials")] - public int N + [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] + public double? Maximum { get { - return _n; + return _maximum; } set { - _n = value; + _maximum = value; } } /// - /// Probability of success + /// Rate of the replenishment, in value per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("p")] - [System.ComponentModel.DescriptionAttribute("Probability of success")] - public double P + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Rate { get { - return _p; + return _rate; } set { - _p = value; + _rate = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BinomialDistributionParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new BinomialDistributionParameters(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedMultiplicativeRateFunction(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("N = " + _n + ", "); - stringBuilder.Append("P = " + _p); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new ClampedMultiplicativeRateFunction(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum + ", "); + stringBuilder.Append("Rate = " + _rate); + return true; } } /// - /// Configuration for a single experimental block. + /// A patch update function that applies a clamped rate-based update. /// - ///A block represents a period of the experiment with specific environment - ///statistics and ending conditions. Each block defines the environmental - ///parameters and termination criteria for that experimental phase. + ///Update in the form of x = clamp(x + rate * tick_value). + ///This function updates values at a specified rate while keeping results within + ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + ///time, distance, choices). /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Configuration for a single experimental block.\n\nA block represents a period of th" + - "e experiment with specific environment\nstatistics and ending conditions. Each bl" + - "ock defines the environmental\nparameters and termination criteria for that exper" + - "imental phase.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. + + Update in the form of x = clamp(x + rate * tick_value). + This function updates values at a specified rate while keeping results within + defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + time, distance, choices).")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Block + public partial class ClampedRateFunction : PatchUpdateFunction { - private EnvironmentStatistics _environmentStatistics; + private double? _minimum; - private System.Collections.Generic.List _endConditions; + private double? _maximum; - public Block() + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _rate; + + public ClampedRateFunction() { - _environmentStatistics = new EnvironmentStatistics(); - _endConditions = new System.Collections.Generic.List(); + _minimum = 0; } - protected Block(Block other) + protected ClampedRateFunction(ClampedRateFunction other) : + base(other) { - _environmentStatistics = other._environmentStatistics; - _endConditions = other._endConditions; + _minimum = other._minimum; + _maximum = other._maximum; + _rate = other._rate; } /// - /// Statistics of the environment + /// Minimum value of the rate /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("environment_statistics", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Statistics of the environment")] - public EnvironmentStatistics EnvironmentStatistics + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] + public double? Minimum { get { - return _environmentStatistics; + return _minimum; } set { - _environmentStatistics = value; + _minimum = value; } } /// - /// List of end conditions that must be true for the block to end. + /// Maximum value of the rate /// - [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 + [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] + [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] + public double? Maximum { get { - return _endConditions; + return _maximum; } set { - _endConditions = value; + _maximum = value; } } - public System.IObservable Generate() + /// + /// Rate of the replenishment, in value per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Rate { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Block(this))); + get + { + return _rate; + } + set + { + _rate = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new Block(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedRateFunction(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("EnvironmentStatistics = " + _environmentStatistics + ", "); - stringBuilder.Append("EndConditions = " + _endConditions); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new ClampedRateFunction(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum + ", "); + stringBuilder.Append("Rate = " + _rate); + return true; } } - /// - /// Block end condition based on time duration. - /// - ///This condition ends a block after a specified amount of time has elapsed. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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))] - [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + - "specified amount of time has elapsed.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndCondition + public partial class ConnectedClockOutput { - public BlockEndCondition() + private string _targetDevice; + + private int _outputChannel; + + public ConnectedClockOutput() { } - protected BlockEndCondition(BlockEndCondition other) + protected ConnectedClockOutput(ConnectedClockOutput other) { + _targetDevice = other._targetDevice; + _outputChannel = other._outputChannel; } - public System.IObservable Generate() + /// + /// 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 { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndCondition(this))); + get + { + return _targetDevice; + } + set + { + _targetDevice = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Output channel + /// + [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Output channel")] + public int OutputChannel { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndCondition(this)); + get + { + return _outputChannel; + } + set + { + _outputChannel = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("TargetDevice = " + _targetDevice + ", "); + stringBuilder.Append("OutputChannel = " + _outputChannel); + return true; } public override string ToString() @@ -2628,188 +2274,168 @@ public override string ToString() /// - /// Block end condition based on number of choices made. + /// A patch update function that uses a continuous-time Markov chain (CTMC) + ///to determine patch updates based on a transition probability matrix. /// - ///This condition ends a block after the animal has made a specified number - ///of choices (e.g., patch visits or reward attempts). + ///It expects a transition matrix that takes the current value of the variable + ///of interest (e.g. Probability), and outputs a new value based on the defined + ///stochastic process in the transition matrix. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on number of choices made.\n\nThis condition ends a block" + - " after the animal has made a specified number\nof choices (e.g., patch visits or " + - "reward attempts).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses a continuous-time Markov chain (CTMC) + to determine patch updates based on a transition probability matrix. + + It expects a transition matrix that takes the current value of the variable + of interest (e.g. Probability), and outputs a new value based on the defined + stochastic process in the transition matrix.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionChoice : BlockEndCondition + public partial class CtcmFunction : PatchUpdateFunction { - private Distribution _value; + private System.Collections.Generic.List> _transitionMatrix; - public BlockEndConditionChoice() + private double _rho; + + private double _dt; + + private double? _rate; + + private double _minimum; + + private double _maximum; + + public CtcmFunction() { + _transitionMatrix = new System.Collections.Generic.List>(); + _dt = 0.1D; + _minimum = 1D; + _maximum = 0D; } - protected BlockEndConditionChoice(BlockEndConditionChoice other) : + protected CtcmFunction(CtcmFunction other) : base(other) { - _value = other._value; + _transitionMatrix = other._transitionMatrix; + _rho = other._rho; + _dt = other._dt; + _rate = other._rate; + _minimum = other._minimum; + _maximum = other._maximum; } /// - /// Number of choices after which the block ends. + /// Transition matrix between states /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Transition matrix between states")] + public System.Collections.Generic.List> TransitionMatrix { get { - return _value; + return _transitionMatrix; } set { - _value = value; + _transitionMatrix = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionChoice(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionChoice(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// The underlying value governing the stochastic process + /// + [Newtonsoft.Json.JsonPropertyAttribute("rho", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The underlying value governing the stochastic process")] + public double Rho { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _rho; + } + set + { + _rho = value; } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Block end condition based on distance traveled. - /// - ///This condition ends a block after the animal has traveled a specified distance. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on distance traveled.\n\nThis condition ends a block afte" + - "r the animal has traveled a specified distance.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - 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. + /// Sampling time step (s) /// - [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 + [Newtonsoft.Json.JsonPropertyAttribute("dt")] + [System.ComponentModel.DescriptionAttribute("Sampling time step (s)")] + public double Dt { get { - return _value; + return _dt; } set { - _value = value; + _dt = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDistance(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDistance(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only + /// + [Newtonsoft.Json.JsonPropertyAttribute("rate")] + [System.ComponentModel.DescriptionAttribute("Rate of the replenishment used to generate the matrix. This value is used for met" + + "adata keep sake only")] + public double? Rate { - if (base.PrintMembers(stringBuilder)) + get { - stringBuilder.Append(", "); + return _rate; + } + set + { + _rate = value; } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Block end condition based on time duration. - /// - ///This condition ends a block after a specified amount of time has elapsed. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on time duration.\n\nThis condition ends a block after a " + - "specified amount of time has elapsed.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionDuration : BlockEndCondition - { - - private Distribution _value; - - public BlockEndConditionDuration() - { } - protected BlockEndConditionDuration(BlockEndConditionDuration other) : - base(other) + /// + /// Maximum value after update + /// + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Maximum value after update")] + public double Minimum { - _value = other._value; + get + { + return _minimum; + } + set + { + _minimum = value; + } } /// - /// Time after which the block ends. + /// Minimum value after update /// - [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 + [Newtonsoft.Json.JsonPropertyAttribute("maximum")] + [System.ComponentModel.DescriptionAttribute("Minimum value after update")] + public double Maximum { get { - return _value; + return _maximum; } set { - _value = value; + _maximum = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionDuration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CtcmFunction(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionDuration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new CtcmFunction(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -2818,225 +2444,187 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("Value = " + _value); + stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); + stringBuilder.Append("Rho = " + _rho + ", "); + stringBuilder.Append("Dt = " + _dt + ", "); + stringBuilder.Append("Rate = " + _rate + ", "); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum); return true; } } /// - /// Block end condition based on number of patches visited. - /// - ///This condition ends a block after the animal has visited a specified - ///number of unique patches. + /// Represents the calibration parameters of a display. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on number of patches visited.\n\nThis condition ends a bl" + - "ock after the animal has visited a specified\nnumber of unique patches.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockEndConditionPatchCount : BlockEndCondition + public partial class DisplayCalibration { - private Distribution _value; + private DisplayIntrinsics _intrinsics; - public BlockEndConditionPatchCount() + private DisplayExtrinsics _extrinsics; + + public DisplayCalibration() { + _intrinsics = new DisplayIntrinsics(); + _extrinsics = new DisplayExtrinsics(); } - protected BlockEndConditionPatchCount(BlockEndConditionPatchCount other) : - base(other) + protected DisplayCalibration(DisplayCalibration other) { - _value = other._value; + _intrinsics = other._intrinsics; + _extrinsics = other._extrinsics; } /// - /// Number of patches after which the block will end. + /// Intrinsics /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("intrinsics")] + [System.ComponentModel.DescriptionAttribute("Intrinsics")] + public DisplayIntrinsics Intrinsics { get { - return _value; + return _intrinsics; } set { - _value = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionPatchCount(this))); - } - - public System.IObservable Generate(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(", "); + _intrinsics = value; } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Block end condition based on number of rewards obtained. - /// - ///This condition ends a block after the animal has obtained a specified - ///number of rewards. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Block end condition based on number of rewards obtained.\n\nThis condition ends a b" + - "lock after the animal has obtained a specified\nnumber of rewards.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - 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. + /// Extrinsics /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("extrinsics")] + [System.ComponentModel.DescriptionAttribute("Extrinsics")] + public DisplayExtrinsics Extrinsics { get { - return _value; + return _extrinsics; } set { - _value = value; + _extrinsics = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockEndConditionReward(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockEndConditionReward(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayCalibration(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("Intrinsics = " + _intrinsics + ", "); + stringBuilder.Append("Extrinsics = " + _extrinsics); + 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(" "); } - stringBuilder.Append("Value = " + _value); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Structure defining the sequence and sampling of experimental blocks. - /// - ///This class manages multiple experimental blocks and determines how they - ///are presented during the experiment (sequentially or randomly). + /// Represents the extrinsic parameters of a display. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Structure defining the sequence and sampling of experimental blocks.\n\nThis class " + - "manages multiple experimental blocks and determines how they\nare presented durin" + - "g the experiment (sequentially or randomly).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the extrinsic parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class BlockStructure + public partial class DisplayExtrinsics { - private System.Collections.Generic.List _blocks; + private Vector3 _rotation; - private BlockStructureSamplingMode _samplingMode; + private Vector3 _translation; - public BlockStructure() + public DisplayExtrinsics() { - _blocks = new System.Collections.Generic.List(); - _samplingMode = AindVrForagingDataSchema.BlockStructureSamplingMode.Sequential; + _rotation = new Vector3(); + _translation = new Vector3(); } - protected BlockStructure(BlockStructure other) + protected DisplayExtrinsics(DisplayExtrinsics other) { - _blocks = other._blocks; - _samplingMode = other._samplingMode; + _rotation = other._rotation; + _translation = other._translation; } /// - /// Statistics of the environment + /// Rotation vector (radians) /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("rotation")] + [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] + public Vector3 Rotation { get { - return _blocks; + return _rotation; } set { - _blocks = value; + _rotation = value; } } /// - /// Sampling mode of the blocks. + /// Translation (in cm) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("sampling_mode")] - [System.ComponentModel.DescriptionAttribute("Sampling mode of the blocks.")] - public BlockStructureSamplingMode SamplingMode + [Newtonsoft.Json.JsonPropertyAttribute("translation")] + [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] + public Vector3 Translation { get { - return _samplingMode; + return _translation; } set { - _samplingMode = value; + _translation = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BlockStructure(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayExtrinsics(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new BlockStructure(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayExtrinsics(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Blocks = " + _blocks + ", "); - stringBuilder.Append("SamplingMode = " + _samplingMode); + stringBuilder.Append("Rotation = " + _rotation + ", "); + stringBuilder.Append("Translation = " + _translation); return true; } @@ -3055,160 +2643,249 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Represents the intrinsic parameters of a display. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the intrinsic parameters of a display.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CameraControllerSpinnakerCamera + public partial class DisplayIntrinsics { - private string _deviceType; - - private string _deviceName; + private int _frameWidth; - private BaseModel _additionalSettings; + private int _frameHeight; - private BaseModel _calibration; + private double _displayWidth; - private System.Collections.Generic.Dictionary _cameras; + private double _displayHeight; - private int? _frameRate; + public DisplayIntrinsics() + { + _frameWidth = 1920; + _frameHeight = 1080; + _displayWidth = 20D; + _displayHeight = 15D; + } - public CameraControllerSpinnakerCamera() + protected DisplayIntrinsics(DisplayIntrinsics other) { - _deviceType = "CameraController"; - _cameras = new System.Collections.Generic.Dictionary(); + _frameWidth = other._frameWidth; + _frameHeight = other._frameHeight; + _displayWidth = other._displayWidth; + _displayHeight = other._displayHeight; } - protected CameraControllerSpinnakerCamera(CameraControllerSpinnakerCamera other) + /// + /// Frame width (px) + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_width")] + [System.ComponentModel.DescriptionAttribute("Frame width (px)")] + public int FrameWidth { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _cameras = other._cameras; - _frameRate = other._frameRate; + get + { + return _frameWidth; + } + set + { + _frameWidth = value; + } } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Frame height (px) + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_height")] + [System.ComponentModel.DescriptionAttribute("Frame height (px)")] + public int FrameHeight { get { - return _deviceType; + return _frameHeight; } set { - _deviceType = value; + _frameHeight = value; } } /// - /// Device name + /// Display width (cm) /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("display_width")] + [System.ComponentModel.DescriptionAttribute("Display width (cm)")] + public double DisplayWidth { get { - return _deviceName; + return _displayWidth; } set { - _deviceName = value; + _displayWidth = value; } } /// - /// Additional settings + /// Display width (cm) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("display_height")] + [System.ComponentModel.DescriptionAttribute("Display width (cm)")] + public double DisplayHeight { get { - return _additionalSettings; + return _displayHeight; } set { - _additionalSettings = value; + _displayHeight = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayIntrinsics(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new DisplayIntrinsics(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("FrameWidth = " + _frameWidth + ", "); + stringBuilder.Append("FrameHeight = " + _frameHeight + ", "); + stringBuilder.Append("DisplayWidth = " + _displayWidth + ", "); + stringBuilder.Append("DisplayHeight = " + _displayHeight); + 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(); + } + } + + + /// + /// Defines the statistical properties of the foraging environment. + /// + ///This class specifies the patches available in the environment, their transition + ///probabilities, and initial state occupancy. It forms the core specification + ///for the foraging environment structure. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines the statistical properties of the foraging environment. + + This class specifies the patches available in the environment, their transition + probabilities, and initial state occupancy. It forms the core specification + for the foraging environment structure.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class EnvironmentStatistics + { + + private System.Collections.Generic.List _patches; + + private System.Collections.Generic.List> _transitionMatrix; + + private System.Collections.Generic.List _firstStateOccupancy; + + public EnvironmentStatistics() + { + _patches = new System.Collections.Generic.List(); + _transitionMatrix = new System.Collections.Generic.List>(); + } + + protected EnvironmentStatistics(EnvironmentStatistics other) + { + _patches = other._patches; + _transitionMatrix = other._transitionMatrix; + _firstStateOccupancy = other._firstStateOccupancy; } /// - /// Calibration + /// List of patches /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("patches")] + [System.ComponentModel.DescriptionAttribute("List of patches")] + public System.Collections.Generic.List Patches { get { - return _calibration; + return _patches; } set { - _calibration = value; + _patches = value; } } /// - /// Cameras to be instantiated + /// Determines the transition probabilities between patches /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] - public System.Collections.Generic.Dictionary Cameras + [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix")] + [System.ComponentModel.DescriptionAttribute("Determines the transition probabilities between patches")] + public System.Collections.Generic.List> TransitionMatrix { get { - return _cameras; + return _transitionMatrix; } set { - _cameras = value; + _transitionMatrix = value; } } /// - /// Frame rate of the trigger to all cameras + /// Determines the first state the animal will be in. If null, it will be randomly drawn. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] - public int? FrameRate + [Newtonsoft.Json.JsonPropertyAttribute("first_state_occupancy")] + [System.ComponentModel.DescriptionAttribute("Determines the first state the animal will be in. If null, it will be randomly dr" + + "awn.")] + public System.Collections.Generic.List FirstStateOccupancy { get { - return _frameRate; + return _firstStateOccupancy; } set { - _frameRate = value; + _firstStateOccupancy = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerSpinnakerCamera(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new EnvironmentStatistics(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerSpinnakerCamera(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new EnvironmentStatistics(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Cameras = " + _cameras + ", "); - stringBuilder.Append("FrameRate = " + _frameRate); + stringBuilder.Append("Patches = " + _patches + ", "); + stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); + stringBuilder.Append("FirstStateOccupancy = " + _firstStateOccupancy); return true; } @@ -3227,38 +2904,35 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CameraControllerWebCamera + public partial class HarpAnalogInput { private string _deviceType; - private string _deviceName; - - private BaseModel _additionalSettings; - private BaseModel _calibration; - private System.Collections.Generic.Dictionary _cameras; + private int _whoAmI; - private int? _frameRate; + private string _serialNumber; - public CameraControllerWebCamera() + private string _portName; + + public HarpAnalogInput() { - _deviceType = "CameraController"; - _cameras = new System.Collections.Generic.Dictionary(); + _deviceType = "AnalogInput"; + _whoAmI = 1236; } - protected CameraControllerWebCamera(CameraControllerWebCamera other) + protected HarpAnalogInput(HarpAnalogInput other) { _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; _calibration = other._calibration; - _cameras = other._cameras; - _frameRate = other._frameRate; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } [Newtonsoft.Json.JsonPropertyAttribute("device_type")] @@ -3275,112 +2949,87 @@ public string DeviceType } /// - /// Device name + /// Calibration for the device. /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _deviceName; + return _calibration; } set { - _deviceName = value; + _calibration = value; } } - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _additionalSettings; + return _whoAmI; } set { - _additionalSettings = value; + _whoAmI = value; } } /// - /// Calibration + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _calibration; + return _serialNumber; } set { - _calibration = value; + _serialNumber = value; } } /// - /// Cameras to be instantiated + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("cameras", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Cameras to be instantiated")] - public System.Collections.Generic.Dictionary Cameras + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _cameras; + return _portName; } set { - _cameras = value; + _portName = value; } } - /// - /// Frame rate of the trigger to all cameras - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Frame rate of the trigger to all cameras")] - public int? FrameRate + public System.IObservable Generate() { - get - { - return _frameRate; - } - set - { - _frameRate = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CameraControllerWebCamera(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpAnalogInput(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new CameraControllerWebCamera(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpAnalogInput(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Cameras = " + _cameras + ", "); - stringBuilder.Append("FrameRate = " + _frameRate); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -3399,306 +3048,420 @@ public override string ToString() } - /// - /// A patch update function that applies multiplicative rate updates with bounds. - /// - ///Update in the form of x = clamp(x * rate ** tick_value). - ///This function multiplies the current value by the rate parameter, maintaining - ///the result within specified minimum and maximum bounds. Useful for percentage- - ///based changes and exponential decay/growth patterns. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies multiplicative rate updates with bounds. - - Update in the form of x = clamp(x * rate ** tick_value). - This function multiplies the current value by the rate parameter, maintaining - the result within specified minimum and maximum bounds. Useful for percentage- - based changes and exponential decay/growth patterns.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ClampedMultiplicativeRateFunction : PatchUpdateFunction + public partial class HarpBehavior { - private double? _minimum; + private string _deviceType; - private double? _maximum; + private BaseModel _calibration; + + private int _whoAmI; - private Distribution _rate; + private string _serialNumber; - public ClampedMultiplicativeRateFunction() + private string _portName; + + public HarpBehavior() { + _deviceType = "Behavior"; + _whoAmI = 1216; } - protected ClampedMultiplicativeRateFunction(ClampedMultiplicativeRateFunction other) : - base(other) + protected HarpBehavior(HarpBehavior other) { - _minimum = other._minimum; - _maximum = other._maximum; - _rate = other._rate; + _deviceType = other._deviceType; + _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; + } } /// - /// Minimum value of the rate + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] - public double? Minimum + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _minimum; + return _calibration; } set { - _minimum = value; + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI + { + get + { + return _whoAmI; + } + set + { + _whoAmI = value; } } /// - /// Maximum value of the rate + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] - public double? Maximum + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _maximum; + return _serialNumber; } set { - _maximum = value; + _serialNumber = value; } } /// - /// Rate of the replenishment, in value per rule unit. + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] - public Distribution Rate + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _rate; + return _portName; } set { - _rate = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ClampedMultiplicativeRateFunction(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpBehavior(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ClampedMultiplicativeRateFunction(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); + 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(" "); } - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - /// - /// A patch update function that applies a clamped rate-based update. - /// - ///Update in the form of x = clamp(x + rate * tick_value). - ///This function updates values at a specified rate while keeping results within - ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - ///time, distance, choices). - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. - - Update in the form of x = clamp(x + rate * tick_value). - This function updates values at a specified rate while keeping results within - defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - time, distance, choices).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ClampedRateFunction : PatchUpdateFunction + public partial class HarpEnvironmentSensor { - private double? _minimum; + private string _deviceType; - private double? _maximum; + private BaseModel _calibration; - private Distribution _rate; + private int _whoAmI; - public ClampedRateFunction() + private string _serialNumber; + + private string _portName; + + public HarpEnvironmentSensor() { + _deviceType = "EnvironmentSensor"; + _whoAmI = 1405; } - protected ClampedRateFunction(ClampedRateFunction other) : - base(other) + protected HarpEnvironmentSensor(HarpEnvironmentSensor other) { - _minimum = other._minimum; - _maximum = other._maximum; - _rate = other._rate; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; } - /// - /// Minimum value of the rate - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the rate")] - public double? Minimum + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _minimum; + return _deviceType; } set { - _minimum = value; + _deviceType = value; } } /// - /// Maximum value of the rate + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("maximum", Required=Newtonsoft.Json.Required.AllowNull)] - [System.ComponentModel.DescriptionAttribute("Maximum value of the rate")] - public double? Maximum + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _maximum; + return _calibration; } set { - _maximum = value; + _calibration = value; } } - /// - /// Rate of the replenishment, in value per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rate", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Rate of the replenishment, in value per rule unit.")] - public Distribution Rate + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _rate; + return _whoAmI; } set { - _rate = value; + _whoAmI = value; } } - public System.IObservable Generate() + /// + /// 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 ClampedRateFunction(this))); + get + { + return _serialNumber; + } + set + { + _serialNumber = value; + } } - public System.IObservable Generate(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 ClampedRateFunction(this)); + get + { + return _portName; + } + set + { + _portName = value; + } } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate() { - if (base.PrintMembers(stringBuilder)) + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpEnvironmentSensor(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new HarpEnvironmentSensor(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); + 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(" "); } - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ConnectedClockOutput + public partial class HarpLicketySplit { - private string _targetDevice; + private string _deviceType; - private int _outputChannel; + private BaseModel _calibration; - public ConnectedClockOutput() + private int _whoAmI; + + private string _serialNumber; + + private string _portName; + + public HarpLicketySplit() { + _deviceType = "LicketySplit"; + _whoAmI = 1400; } - protected ConnectedClockOutput(ConnectedClockOutput other) + protected HarpLicketySplit(HarpLicketySplit other) { - _targetDevice = other._targetDevice; - _outputChannel = other._outputChannel; + _deviceType = other._deviceType; + _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; + } } /// - /// Optional device name to provide user additional information + /// Calibration for the device. /// - [Newtonsoft.Json.JsonPropertyAttribute("target_device")] - [System.ComponentModel.DescriptionAttribute("Optional device name to provide user additional information")] - public string TargetDevice + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _targetDevice; + return _calibration; } set { - _targetDevice = value; + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI + { + get + { + return _whoAmI; + } + set + { + _whoAmI = value; } } /// - /// Output channel + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("output_channel", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Output channel")] - public int OutputChannel + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _outputChannel; + return _serialNumber; } set { - _outputChannel = value; + _serialNumber = value; } } - public System.IObservable Generate() + /// + /// 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.Defer(() => System.Reactive.Linq.Observable.Return(new ConnectedClockOutput(this))); + get + { + return _portName; + } + set + { + _portName = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new ConnectedClockOutput(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpLicketySplit(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new HarpLicketySplit(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("TargetDevice = " + _targetDevice + ", "); - stringBuilder.Append("OutputChannel = " + _outputChannel); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -3717,306 +3480,299 @@ public override string ToString() } - /// - /// A patch update function that uses a continuous-time Markov chain (CTMC) - ///to determine patch updates based on a transition probability matrix. - /// - ///It expects a transition matrix that takes the current value of the variable - ///of interest (e.g. Probability), and outputs a new value based on the defined - ///stochastic process in the transition matrix. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses a continuous-time Markov chain (CTMC) - to determine patch updates based on a transition probability matrix. - - It expects a transition matrix that takes the current value of the variable - of interest (e.g. Probability), and outputs a new value based on the defined - stochastic process in the transition matrix.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class CtcmFunction : PatchUpdateFunction + public partial class HarpSniffDetector { - private System.Collections.Generic.List> _transitionMatrix; + private string _deviceType; - private double _rho; + private BaseModel _calibration; - private double _minimum; + private int _whoAmI; - private double _maximum; + private string _serialNumber; - public CtcmFunction() + private string _portName; + + public HarpSniffDetector() { - _transitionMatrix = new System.Collections.Generic.List>(); - _minimum = 1D; - _maximum = 0D; + _deviceType = "SniffDetector"; + _whoAmI = 1401; } - protected CtcmFunction(CtcmFunction other) : - base(other) + protected HarpSniffDetector(HarpSniffDetector other) { - _transitionMatrix = other._transitionMatrix; - _rho = other._rho; - _minimum = other._minimum; - _maximum = other._maximum; + _deviceType = other._deviceType; + _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; + } } /// - /// Transition matrix between states + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Transition matrix between states")] - public System.Collections.Generic.List> TransitionMatrix + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _transitionMatrix; + return _calibration; } set { - _transitionMatrix = value; + _calibration = value; } } - /// - /// The underlying value goverining the stochastic process - /// - [Newtonsoft.Json.JsonPropertyAttribute("rho", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The underlying value goverining the stochastic process")] - public double Rho + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _rho; + return _whoAmI; } set { - _rho = value; + _whoAmI = value; } } /// - /// Maximum value after update + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Maximum value after update")] - public double Minimum + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _minimum; + return _serialNumber; } set { - _minimum = value; + _serialNumber = value; } } /// - /// Minimum value after update + /// Device port name /// - [Newtonsoft.Json.JsonPropertyAttribute("maximum")] - [System.ComponentModel.DescriptionAttribute("Minimum value after update")] - public double Maximum + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _maximum; + return _portName; } set { - _maximum = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CtcmFunction(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpSniffDetector(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new CtcmFunction(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpSniffDetector(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); + 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(" "); } - stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); - stringBuilder.Append("Rho = " + _rho + ", "); - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplayCalibration + public partial class HarpWhiteRabbit { - private DisplayIntrinsics _intrinsics; + private string _deviceType; - private DisplayExtrinsics _extrinsics; + private BaseModel _calibration; - public DisplayCalibration() + private int _whoAmI; + + private string _serialNumber; + + private string _portName; + + private System.Collections.Generic.List _connectedClockOutputs; + + public HarpWhiteRabbit() { - _intrinsics = new DisplayIntrinsics(); - _extrinsics = new DisplayExtrinsics(); + _deviceType = "WhiteRabbit"; + _whoAmI = 1404; + _connectedClockOutputs = new System.Collections.Generic.List(); } - protected DisplayCalibration(DisplayCalibration other) + protected HarpWhiteRabbit(HarpWhiteRabbit other) { - _intrinsics = other._intrinsics; - _extrinsics = other._extrinsics; + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + _connectedClockOutputs = other._connectedClockOutputs; } - /// - /// Intrinsics - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("intrinsics")] - [System.ComponentModel.DescriptionAttribute("Intrinsics")] - public DisplayIntrinsics Intrinsics + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _intrinsics; + return _deviceType; } set { - _intrinsics = value; + _deviceType = value; } } /// - /// Extrinsics + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("extrinsics")] - [System.ComponentModel.DescriptionAttribute("Extrinsics")] - public DisplayExtrinsics Extrinsics + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _extrinsics; + return _calibration; } set { - _extrinsics = value; + _calibration = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplayCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Intrinsics = " + _intrinsics + ", "); - stringBuilder.Append("Extrinsics = " + _extrinsics); - return true; - } - - public override string ToString() + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _whoAmI; + } + set + { + _whoAmI = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplayExtrinsics - { - - private AindBehaviorServicesRigVisualStimulationVector3 _rotation; - - private AindBehaviorServicesRigVisualStimulationVector3 _translation; - - public DisplayExtrinsics() - { - _rotation = new AindBehaviorServicesRigVisualStimulationVector3(); - _translation = new AindBehaviorServicesRigVisualStimulationVector3(); } - protected DisplayExtrinsics(DisplayExtrinsics other) + /// + /// Device serial number + /// + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { - _rotation = other._rotation; - _translation = other._translation; + get + { + return _serialNumber; + } + set + { + _serialNumber = value; + } } /// - /// Rotation vector (radians) + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rotation")] - [System.ComponentModel.DescriptionAttribute("Rotation vector (radians)")] - public AindBehaviorServicesRigVisualStimulationVector3 Rotation + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _rotation; + return _portName; } set { - _rotation = value; + _portName = value; } } /// - /// Translation (in cm) + /// Connected clock outputs /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("translation")] - [System.ComponentModel.DescriptionAttribute("Translation (in cm)")] - public AindBehaviorServicesRigVisualStimulationVector3 Translation + [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] + [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] + public System.Collections.Generic.List ConnectedClockOutputs { get { - return _translation; + return _connectedClockOutputs; } set { - _translation = value; + _connectedClockOutputs = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayExtrinsics(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpWhiteRabbit(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplayExtrinsics(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new HarpWhiteRabbit(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Rotation = " + _rotation + ", "); - stringBuilder.Append("Translation = " + _translation); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName + ", "); + stringBuilder.Append("ConnectedClockOutputs = " + _connectedClockOutputs); return true; } @@ -4035,120 +3791,218 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// A patch update function that uses lookup table interpolation. + /// + ///Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. + ///This function maps input values to output values using a lookup table with + ///linear interpolation between defined points. Useful for complex, non-linear + ///reward schedules or parameter updates. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses lookup table interpolation. + + Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. + This function maps input values to output values using a lookup table with + linear interpolation between defined points. Useful for complex, non-linear + reward schedules or parameter updates.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplayIntrinsics + public partial class LookupTableFunction : PatchUpdateFunction { - private int _frameWidth; - - private int _frameHeight; - - private double _displayWidth; + private System.Collections.Generic.List _lutKeys; - private double _displayHeight; + private System.Collections.Generic.List _lutValues; - public DisplayIntrinsics() + public LookupTableFunction() { - _frameWidth = 1920; - _frameHeight = 1080; - _displayWidth = 20D; - _displayHeight = 15D; + _lutKeys = new System.Collections.Generic.List(); + _lutValues = new System.Collections.Generic.List(); } - protected DisplayIntrinsics(DisplayIntrinsics other) + protected LookupTableFunction(LookupTableFunction other) : + base(other) { - _frameWidth = other._frameWidth; - _frameHeight = other._frameHeight; - _displayWidth = other._displayWidth; - _displayHeight = other._displayHeight; + _lutKeys = other._lutKeys; + _lutValues = other._lutValues; } /// - /// Frame width (px) + /// List of keys of the lookup table /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_width")] - [System.ComponentModel.DescriptionAttribute("Frame width (px)")] - public int FrameWidth + [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 _frameWidth; + return _lutKeys; } set { - _frameWidth = value; + _lutKeys = value; } } /// - /// Frame height (px) + /// List of values of the lookup table /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_height")] - [System.ComponentModel.DescriptionAttribute("Frame height (px)")] - public int FrameHeight + [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 _frameHeight; + return _lutValues; } set { - _frameHeight = value; + _lutValues = value; } } - /// - /// Display width (cm) - /// - [Newtonsoft.Json.JsonPropertyAttribute("display_width")] - [System.ComponentModel.DescriptionAttribute("Display width (cm)")] - public double DisplayWidth + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LookupTableFunction(this))); + } + + public System.IObservable Generate(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("LutKeys = " + _lutKeys + ", "); + stringBuilder.Append("LutValues = " + _lutValues); + return true; + } + } + + + /// + /// Input for water valve calibration class + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Input for water valve calibration class")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Measurement + { + + private double _valveOpenInterval; + + private double _valveOpenTime; + + private System.Collections.Generic.List _waterWeight; + + private int _repeatCount; + + public Measurement() + { + _waterWeight = new System.Collections.Generic.List(); + } + + protected Measurement(Measurement other) + { + _valveOpenInterval = other._valveOpenInterval; + _valveOpenTime = other._valveOpenTime; + _waterWeight = other._waterWeight; + _repeatCount = other._repeatCount; + } + + /// + /// 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 _displayWidth; + return _valveOpenInterval; } set { - _displayWidth = value; + _valveOpenInterval = value; } } /// - /// Display width (cm) + /// Valve open interval (s) /// - [Newtonsoft.Json.JsonPropertyAttribute("display_height")] - [System.ComponentModel.DescriptionAttribute("Display width (cm)")] - public double DisplayHeight + [Newtonsoft.Json.JsonPropertyAttribute("valve_open_time", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Valve open interval (s)")] + public double ValveOpenTime { get { - return _displayHeight; + return _valveOpenTime; } set { - _displayHeight = value; + _valveOpenTime = value; } } - public System.IObservable Generate() + /// + /// Weight of water delivered (g) + /// + [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 { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplayIntrinsics(this))); + get + { + return _waterWeight; + } + set + { + _waterWeight = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// 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.Select(source, _ => new DisplayIntrinsics(this)); + get + { + return _repeatCount; + } + set + { + _repeatCount = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Measurement(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Measurement(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("FrameWidth = " + _frameWidth + ", "); - stringBuilder.Append("FrameHeight = " + _frameHeight + ", "); - stringBuilder.Append("DisplayWidth = " + _displayWidth + ", "); - stringBuilder.Append("DisplayHeight = " + _displayHeight); + stringBuilder.Append("ValveOpenInterval = " + _valveOpenInterval + ", "); + stringBuilder.Append("ValveOpenTime = " + _valveOpenTime + ", "); + stringBuilder.Append("WaterWeight = " + _waterWeight + ", "); + stringBuilder.Append("RepeatCount = " + _repeatCount); return true; } @@ -4167,101 +4021,108 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Controls the movable water spout behavior for reward delivery. + /// + ///This class configures how the movable spout operates, including when it's + ///enabled, timing for reward collection, and retraction distance for operant + ///conditioning protocols. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Controls the movable water spout behavior for reward delivery.\n\nThis class config" + + "ures how the movable spout operates, including when it\'s\nenabled, timing for rew" + + "ard collection, and retraction distance for operant\nconditioning protocols.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class DisplaysCalibration + public partial class MovableSpoutControl { - private DisplayCalibration _left; + private bool _enabled; - private DisplayCalibration _center; + private double _timeToCollectAfterReward; - private DisplayCalibration _right; + private double _retractingDistance; - public DisplaysCalibration() + public MovableSpoutControl() { - _left = new DisplayCalibration(); - _center = new DisplayCalibration(); - _right = new DisplayCalibration(); + _enabled = false; + _timeToCollectAfterReward = 1D; + _retractingDistance = 0D; } - protected DisplaysCalibration(DisplaysCalibration other) + protected MovableSpoutControl(MovableSpoutControl other) { - _left = other._left; - _center = other._center; - _right = other._right; + _enabled = other._enabled; + _timeToCollectAfterReward = other._timeToCollectAfterReward; + _retractingDistance = other._retractingDistance; } /// - /// Left display calibration + /// Whether the movable spout is enabled /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("left")] - [System.ComponentModel.DescriptionAttribute("Left display calibration")] - public DisplayCalibration Left + [Newtonsoft.Json.JsonPropertyAttribute("enabled")] + [System.ComponentModel.DescriptionAttribute("Whether the movable spout is enabled")] + public bool Enabled { get { - return _left; + return _enabled; } set { - _left = value; + _enabled = value; } } /// - /// Center display calibration + /// Time (s) to collect after reward /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("center")] - [System.ComponentModel.DescriptionAttribute("Center display calibration")] - public DisplayCalibration Center + [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_after_reward")] + [System.ComponentModel.DescriptionAttribute("Time (s) to collect after reward")] + public double TimeToCollectAfterReward { get { - return _center; + return _timeToCollectAfterReward; } set { - _center = value; + _timeToCollectAfterReward = value; } } /// - /// Right display calibration + /// The distance, relative to the default position, the spout will be retracted by /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("right")] - [System.ComponentModel.DescriptionAttribute("Right display calibration")] - public DisplayCalibration Right + [Newtonsoft.Json.JsonPropertyAttribute("retracting_distance")] + [System.ComponentModel.DescriptionAttribute("The distance, relative to the default position, the spout will be retracted by")] + public double RetractingDistance { get { - return _right; + return _retractingDistance; } set { - _right = value; + _retractingDistance = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new DisplaysCalibration(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new MovableSpoutControl(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new DisplaysCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new MovableSpoutControl(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Left = " + _left + ", "); - stringBuilder.Append("Center = " + _center + ", "); - stringBuilder.Append("Right = " + _right); + stringBuilder.Append("Enabled = " + _enabled + ", "); + stringBuilder.Append("TimeToCollectAfterReward = " + _timeToCollectAfterReward + ", "); + stringBuilder.Append("RetractingDistance = " + _retractingDistance); return true; } @@ -4280,47 +4141,93 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [JsonInheritanceAttribute("Scalar", typeof(Scalar))] - [JsonInheritanceAttribute("Beta", typeof(BetaDistribution))] - [JsonInheritanceAttribute("Binomial", typeof(BinomialDistribution))] - [JsonInheritanceAttribute("Exponential", typeof(ExponentialDistribution))] - [JsonInheritanceAttribute("Gamma", typeof(GammaDistribution))] - [JsonInheritanceAttribute("LogNormal", typeof(LogNormalDistribution))] - [JsonInheritanceAttribute("Normal", typeof(NormalDistribution))] - [JsonInheritanceAttribute("Pdf", typeof(PdfDistribution))] - [JsonInheritanceAttribute("Poisson", typeof(PoissonDistribution))] - [JsonInheritanceAttribute("Uniform", typeof(UniformDistribution))] + /// + /// A numerical updater that modifies task parameters during execution. + /// + ///This class combines an operation type with parameters to define how values + ///should be updated dynamically during the task, enabling adaptive behavior + ///based on animal performance or other criteria. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A numerical updater that modifies task parameters during execution. + + This class combines an operation type with parameters to define how values + should be updated dynamically during the task, enabling adaptive behavior + based on animal performance or other criteria.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Distribution + public partial class NumericalUpdater { - public Distribution() - { - } + private NumericalUpdaterOperation _operation; - protected Distribution(Distribution other) - { - } + private NumericalUpdaterParameters _parameters; - public System.IObservable Generate() + public NumericalUpdater() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Distribution(this))); + _operation = NumericalUpdaterOperation.None; + _parameters = new NumericalUpdaterParameters(); } - public System.IObservable Generate(System.IObservable source) + protected NumericalUpdater(NumericalUpdater other) { - return System.Reactive.Linq.Observable.Select(source, _ => new Distribution(this)); + _operation = other._operation; + _parameters = other._parameters; } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Operation to perform on the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("operation")] + [System.ComponentModel.DescriptionAttribute("Operation to perform on the parameter")] + public NumericalUpdaterOperation Operation { - return false; + get + { + return _operation; + } + set + { + _operation = value; + } } - public override string ToString() + /// + /// Parameters of the updater + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("parameters")] + [System.ComponentModel.DescriptionAttribute("Parameters of the updater")] + public NumericalUpdaterParameters Parameters + { + get + { + return _parameters; + } + set + { + _parameters = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdater(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdater(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("Operation = " + _operation + ", "); + stringBuilder.Append("Parameters = " + _parameters); + return true; + } + + public override string ToString() { System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); stringBuilder.Append(GetType().Name); @@ -4336,112 +4243,219 @@ public override string ToString() /// - /// Defines the statistical properties of the foraging environment. + /// Enumeration of operations that can be performed by numerical updaters. /// - ///This class specifies the patches available in the environment, their transition - ///probabilities, and initial state occupancy. It forms the core specification - ///for the foraging environment structure. + ///These operations define how parameter values are modified during task execution, + ///allowing for dynamic adjustment of task parameters based on performance or other criteria. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines the statistical properties of the foraging environment. + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum NumericalUpdaterOperation + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="None")] + None = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Offset")] + Offset = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Gain")] + Gain = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Set")] + Set = 3, + } - This class specifies the patches available in the environment, their transition - probabilities, and initial state occupancy. It forms the core specification - for the foraging environment structure.")] + + /// + /// Parameters that control how numerical updates are applied to task values. + /// + ///These parameters define the bounds and increments for updating numerical values + ///during task execution, ensuring values stay within acceptable ranges. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Parameters that control how numerical updates are applied to task values.\n\nThese " + + "parameters define the bounds and increments for updating numerical values\nduring" + + " task execution, ensuring values stay within acceptable ranges.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class EnvironmentStatistics + public partial class NumericalUpdaterParameters { - private System.Collections.Generic.List _patches; + private double _initialValue; - private System.Collections.Generic.List> _transitionMatrix; + private double _onSuccess; - private System.Collections.Generic.List _firstStateOccupancy; + private double _onFailure; - public EnvironmentStatistics() + private double _increment; + + private double _decrement; + + private double _minimum; + + private double _maximum; + + public NumericalUpdaterParameters() { - _patches = new System.Collections.Generic.List(); - _transitionMatrix = new System.Collections.Generic.List>(); + _initialValue = 0D; + _onSuccess = 0D; + _onFailure = 0D; + _increment = 0D; + _decrement = 0D; + _minimum = 0D; + _maximum = 0D; } - protected EnvironmentStatistics(EnvironmentStatistics other) + protected NumericalUpdaterParameters(NumericalUpdaterParameters other) { - _patches = other._patches; - _transitionMatrix = other._transitionMatrix; - _firstStateOccupancy = other._firstStateOccupancy; + _initialValue = other._initialValue; + _onSuccess = other._onSuccess; + _onFailure = other._onFailure; + _increment = other._increment; + _decrement = other._decrement; + _minimum = other._minimum; + _maximum = other._maximum; } /// - /// List of patches + /// Initial value of the parameter /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("patches")] - [System.ComponentModel.DescriptionAttribute("List of patches")] - public System.Collections.Generic.List Patches + [Newtonsoft.Json.JsonPropertyAttribute("initial_value")] + [System.ComponentModel.DescriptionAttribute("Initial value of the parameter")] + public double InitialValue { get { - return _patches; + return _initialValue; } set { - _patches = value; + _initialValue = value; } } /// - /// Determines the transition probabilities between patches + /// Value used to update the parameter by on success /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("transition_matrix")] - [System.ComponentModel.DescriptionAttribute("Determines the transition probabilities between patches")] - public System.Collections.Generic.List> TransitionMatrix + [Newtonsoft.Json.JsonPropertyAttribute("on_success")] + [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on success")] + public double OnSuccess { get { - return _transitionMatrix; + return _onSuccess; } set { - _transitionMatrix = value; + _onSuccess = value; } } /// - /// Determines the first state the animal will be in. If null, it will be randomly drawn. + /// Value used to update the parameter by on failure /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("first_state_occupancy")] - [System.ComponentModel.DescriptionAttribute("Determines the first state the animal will be in. If null, it will be randomly dr" + - "awn.")] - public System.Collections.Generic.List FirstStateOccupancy + [Newtonsoft.Json.JsonPropertyAttribute("on_failure")] + [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on failure")] + public double OnFailure { get { - return _firstStateOccupancy; + return _onFailure; } set { - _firstStateOccupancy = value; + _onFailure = value; } } - public System.IObservable Generate() + /// + /// Value to increment the parameter by + /// + [Newtonsoft.Json.JsonPropertyAttribute("increment")] + [System.ComponentModel.DescriptionAttribute("Value to increment the parameter by")] + public double Increment { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new EnvironmentStatistics(this))); + get + { + return _increment; + } + set + { + _increment = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Value to decrement the parameter by + /// + [Newtonsoft.Json.JsonPropertyAttribute("decrement")] + [System.ComponentModel.DescriptionAttribute("Value to decrement the parameter by")] + public double Decrement { - return System.Reactive.Linq.Observable.Select(source, _ => new EnvironmentStatistics(this)); + get + { + return _decrement; + } + set + { + _decrement = value; + } + } + + /// + /// Minimum value of the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("minimum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] + public double Minimum + { + get + { + return _minimum; + } + set + { + _minimum = value; + } + } + + /// + /// Minimum value of the parameter + /// + [Newtonsoft.Json.JsonPropertyAttribute("maximum")] + [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] + public double Maximum + { + get + { + return _maximum; + } + set + { + _maximum = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdaterParameters(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdaterParameters(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Patches = " + _patches + ", "); - stringBuilder.Append("TransitionMatrix = " + _transitionMatrix + ", "); - stringBuilder.Append("FirstStateOccupancy = " + _firstStateOccupancy); + stringBuilder.Append("InitialValue = " + _initialValue + ", "); + stringBuilder.Append("OnSuccess = " + _onSuccess + ", "); + stringBuilder.Append("OnFailure = " + _onFailure + ", "); + stringBuilder.Append("Increment = " + _increment + ", "); + stringBuilder.Append("Decrement = " + _decrement + ", "); + stringBuilder.Append("Minimum = " + _minimum + ", "); + stringBuilder.Append("Maximum = " + _maximum); return true; } @@ -4461,189 +4475,231 @@ public override string ToString() /// - /// An exponential probability distribution. + /// Controls the odor delivery system parameters. /// - ///Models time between events in a Poisson process. Commonly used - ///for wait times and inter-event intervals. + ///This class manages the olfactory stimulus delivery system, including flow rates, + ///valve timing, and carrier gas configuration. It ensures proper odor concentration + ///and delivery timing for the behavioral task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("An exponential probability distribution.\n\nModels time between events in a Poisson" + - " process. Commonly used\nfor wait times and inter-event intervals.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Controls the odor delivery system parameters.\n\nThis class manages the olfactory s" + + "timulus delivery system, including flow rates,\nvalve timing, and carrier gas con" + + "figuration. It ensures proper odor concentration\nand delivery timing for the beh" + + "avioral task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ExponentialDistribution : Distribution + public partial class OdorControl { - private ExponentialDistributionParameters _distributionParameters; + private int _targetTotalFlow; - private TruncationParameters _truncationParameters; + private int _targetOdorFlow; - private ScalingParameters _scalingParameters; - - public ExponentialDistribution() + public OdorControl() { - _distributionParameters = new ExponentialDistributionParameters(); + _targetTotalFlow = 1000; + _targetOdorFlow = 100; } - protected ExponentialDistribution(ExponentialDistribution other) : - base(other) + protected OdorControl(OdorControl other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _targetTotalFlow = other._targetTotalFlow; + _targetOdorFlow = other._targetOdorFlow; } /// - /// Parameters of the distribution + /// Target total flow (ml/s) of the odor mixture /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public ExponentialDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("target_total_flow")] + [System.ComponentModel.DescriptionAttribute("Target total flow (ml/s) of the odor mixture")] + public int TargetTotalFlow { get { - return _distributionParameters; + return _targetTotalFlow; } set { - _distributionParameters = value; + _targetTotalFlow = value; } } /// - /// Truncation parameters of the distribution + /// Target odor flow (ml/s) in the odor mixture /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("target_odor_flow")] + [System.ComponentModel.DescriptionAttribute("Target odor flow (ml/s) in the odor mixture")] + public int TargetOdorFlow { get { - return _truncationParameters; + return _targetOdorFlow; } set { - _truncationParameters = value; + _targetOdorFlow = 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 + public System.IObservable Generate() { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorControl(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ExponentialDistribution(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new OdorControl(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new ExponentialDistribution(this)); + stringBuilder.Append("TargetTotalFlow = " + _targetTotalFlow + ", "); + stringBuilder.Append("TargetOdorFlow = " + _targetOdorFlow); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Parameters for an exponential distribution. - /// - ///Defined by the rate parameter (inverse of mean). + /// A calibrated olfactometer device /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for an exponential distribution.\n\nDefined by the rate parameter (inver" + - "se of mean).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A calibrated olfactometer device")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ExponentialDistributionParameters + public partial class Olfactometer { - private string _family; + private string _deviceType; + + private OlfactometerCalibration _calibration; + + private int _whoAmI; + + private string _serialNumber; - private double _rate; + private string _portName; - public ExponentialDistributionParameters() + public Olfactometer() { - _family = "Exponential"; - _rate = 0D; + _deviceType = "Olfactometer"; + _calibration = new OlfactometerCalibration(); + _whoAmI = 1140; } - protected ExponentialDistributionParameters(ExponentialDistributionParameters other) + protected Olfactometer(Olfactometer other) { - _family = other._family; - _rate = other._rate; + _deviceType = other._deviceType; + _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; + } } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + public OlfactometerCalibration Calibration + { + get + { + return _calibration; + } + set + { + _calibration = value; + } + } + + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { get { - return _family; + return _whoAmI; } set { - _family = value; + _whoAmI = value; } } /// - /// Rate parameter of the distribution + /// Device serial number /// - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate parameter of the distribution")] - public double Rate + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _rate; + return _serialNumber; } set { - _rate = value; + _serialNumber = value; + } + } + + /// + /// Device port name + /// + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName + { + get + { + return _portName; + } + set + { + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ExponentialDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Olfactometer(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ExponentialDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Olfactometer(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Rate = " + _rate); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -4663,218 +4719,261 @@ public override string ToString() /// - /// A gamma probability distribution. - /// - ///Generalizes the exponential distribution. Used for modeling - ///positive continuous variables with right-skewed distributions. + /// Olfactometer device configuration model /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A gamma probability distribution.\n\nGeneralizes the exponential distribution. Used" + - " for modeling\npositive continuous variables with right-skewed distributions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Olfactometer device configuration model")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class GammaDistribution : Distribution + public partial class OlfactometerCalibration { - private GammaDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; + private System.DateTimeOffset? _date; - private ScalingParameters _scalingParameters; + private System.Collections.Generic.Dictionary _channelConfig; - public GammaDistribution() + public OlfactometerCalibration() { - _distributionParameters = new GammaDistributionParameters(); + _channelConfig = new System.Collections.Generic.Dictionary(); } - protected GammaDistribution(GammaDistribution other) : - base(other) + protected OlfactometerCalibration(OlfactometerCalibration other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _date = other._date; + _channelConfig = other._channelConfig; } /// - /// Parameters of the distribution + /// Date of the calibration /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public GammaDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset? Date { get { - return _distributionParameters; + return _date; } set { - _distributionParameters = value; + _date = value; } } /// - /// Truncation parameters of the distribution + /// Configuration of olfactometer channels /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("channel_config")] + [System.ComponentModel.DescriptionAttribute("Configuration of olfactometer channels")] + public System.Collections.Generic.Dictionary ChannelConfig { get { - return _truncationParameters; + return _channelConfig; } set { - _truncationParameters = value; + _channelConfig = 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 + public System.IObservable Generate() { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibration(this))); } - public System.IObservable Generate() + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new GammaDistribution(this))); + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); } - public System.IObservable Generate(System.IObservable source) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return System.Reactive.Linq.Observable.Select(source, _ => new GammaDistribution(this)); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("ChannelConfig = " + _channelConfig); + return true; } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + public override string ToString() { - if (base.PrintMembers(stringBuilder)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - stringBuilder.Append(", "); + stringBuilder.Append(" "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Parameters for a gamma distribution. - /// - ///Defined by shape (k) and rate (θ⁻¹) parameters. + /// Harp Olfactometer available channel + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.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, + } + + + /// + /// Configuration for a single olfactometer channel /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a gamma distribution.\n\nDefined by shape (k) and rate (θ⁻¹) paramet" + - "ers.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Configuration for a single olfactometer channel")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class GammaDistributionParameters + public partial class OlfactometerChannelConfig { - private string _family; + private int _channelIndex; + + private OlfactometerChannelType _channelType; + + private OlfactometerChannelConfigFlowRateCapacity _flowRateCapacity; + + private double _flowRate; - private double _shape; + private string _odorant; - private double _rate; + private double? _odorantDilution; - public GammaDistributionParameters() + public OlfactometerChannelConfig() { - _family = "Gamma"; - _shape = 1D; - _rate = 1D; + _channelType = OlfactometerChannelType.Odor; + _flowRateCapacity = OlfactometerChannelConfigFlowRateCapacity._100; + _flowRate = 100D; } - protected GammaDistributionParameters(GammaDistributionParameters other) + protected OlfactometerChannelConfig(OlfactometerChannelConfig other) { - _family = other._family; - _shape = other._shape; - _rate = other._rate; + _channelIndex = other._channelIndex; + _channelType = other._channelType; + _flowRateCapacity = other._flowRateCapacity; + _flowRate = other._flowRate; + _odorant = other._odorant; + _odorantDilution = other._odorantDilution; } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + [Newtonsoft.Json.JsonPropertyAttribute("channel_index", Required=Newtonsoft.Json.Required.Always)] + public int ChannelIndex { get { - return _family; + return _channelIndex; } set { - _family = value; + _channelIndex = value; } } - /// - /// Shape parameter of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("shape")] - [System.ComponentModel.DescriptionAttribute("Shape parameter of the distribution")] - public double Shape + [Newtonsoft.Json.JsonPropertyAttribute("channel_type")] + public OlfactometerChannelType ChannelType { get { - return _shape; + return _channelType; } set { - _shape = value; + _channelType = value; } } - /// - /// Rate parameter of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate parameter of the distribution")] - public double Rate + [Newtonsoft.Json.JsonPropertyAttribute("flow_rate_capacity")] + public OlfactometerChannelConfigFlowRateCapacity FlowRateCapacity { get { - return _rate; + return _flowRateCapacity; } set { - _rate = value; + _flowRateCapacity = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new GammaDistributionParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) + [Newtonsoft.Json.JsonPropertyAttribute("flow_rate")] + public double FlowRate { - return System.Reactive.Linq.Observable.Select(source, _ => new GammaDistributionParameters(this)); + get + { + return _flowRate; + } + set + { + _flowRate = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + [Newtonsoft.Json.JsonPropertyAttribute("odorant")] + public string Odorant { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Shape = " + _shape + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; + get + { + return _odorant; + } + set + { + _odorant = value; + } } - public override string ToString() + [Newtonsoft.Json.JsonPropertyAttribute("odorant_dilution")] + public double? OdorantDilution { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); + get + { + return _odorantDilution; + } + set + { + _odorantDilution = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerChannelConfig(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerChannelConfig(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("ChannelIndex = " + _channelIndex + ", "); + stringBuilder.Append("ChannelType = " + _channelType + ", "); + stringBuilder.Append("FlowRateCapacity = " + _flowRateCapacity + ", "); + stringBuilder.Append("FlowRate = " + _flowRate + ", "); + stringBuilder.Append("Odorant = " + _odorant + ", "); + stringBuilder.Append("OdorantDilution = " + _odorantDilution); + return true; + } + + public override string ToString() + { + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) { @@ -4886,175 +4985,275 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpAnalogInput + /// + /// Olfactometer channel type + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum OlfactometerChannelType { - private string _deviceType; - - private string _deviceName; + [System.Runtime.Serialization.EnumMemberAttribute(Value="Odor")] + Odor = 0, - private BaseModel _additionalSettings; + [System.Runtime.Serialization.EnumMemberAttribute(Value="Carrier")] + Carrier = 1, + } + + + /// + /// A RewardFunction that is applied when the animal enters the patch. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal enters the patch.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class OnThisPatchEntryRewardFunction : RewardFunction + { - private BaseModel _calibration; + private PatchUpdateFunction _amount; - private int _whoAmI; + private PatchUpdateFunction _probability; - private string _serialNumber; + private PatchUpdateFunction _available; - private string _portName; + private string _rule; - public HarpAnalogInput() + public OnThisPatchEntryRewardFunction() { - _deviceType = "AnalogInput"; - _whoAmI = 1236; + _rule = "OnThisPatchEntry"; } - protected HarpAnalogInput(HarpAnalogInput other) + protected OnThisPatchEntryRewardFunction(OnThisPatchEntryRewardFunction other) : + base(other) { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Defines the amount of reward replenished per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _deviceType; + return _amount; } set { - _deviceType = value; + _amount = value; } } /// - /// Device name + /// Defines the probability of reward replenished per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _deviceName; + return _probability; } set { - _deviceName = value; + _probability = value; } } /// - /// Additional settings + /// Defines the amount of reward available replenished in the patch per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { get { - return _additionalSettings; + return _available; } set { - _additionalSettings = value; + _available = value; } } /// - /// Calibration + /// Rule to trigger reward function /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("rule")] + [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] + public string Rule { get { - return _calibration; + return _rule; } set { - _calibration = value; + _rule = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OnThisPatchEntryRewardFunction(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OnThisPatchEntryRewardFunction(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) + { + stringBuilder.Append(", "); + } + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule); + return true; + } + } + + + /// + /// Defines operant conditioning logic for reward delivery in the VR foraging task. + /// + ///This class controls when and how rewards are delivered based on animal behavior, + ///implementing stopping requirements, collection timeouts, and spatial constraints. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines operant conditioning logic for reward delivery in the VR foraging task.\n\n" + + "This class controls when and how rewards are delivered based on animal behavior," + + "\nimplementing stopping requirements, collection timeouts, and spatial constraint" + + "s.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class OperantLogic + { + + private bool _isOperant; + + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _stopDuration; + + private double _timeToCollectReward; + + private double _graceDistanceThreshold; + + public OperantLogic() + { + _isOperant = true; + _stopDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _timeToCollectReward = 100000D; + _graceDistanceThreshold = 10D; + } + + protected OperantLogic(OperantLogic other) + { + _isOperant = other._isOperant; + _stopDuration = other._stopDuration; + _timeToCollectReward = other._timeToCollectReward; + _graceDistanceThreshold = other._graceDistanceThreshold; + } + + /// + /// Will the trial implement operant logic + /// + [Newtonsoft.Json.JsonPropertyAttribute("is_operant")] + [System.ComponentModel.DescriptionAttribute("Will the trial implement operant logic")] + public bool IsOperant { get { - return _whoAmI; + return _isOperant; } set { - _whoAmI = value; + _isOperant = value; } } /// - /// Device serial number + /// Duration (s) the animal must stop for to lock its choice /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("stop_duration")] + [System.ComponentModel.DescriptionAttribute("Duration (s) the animal must stop for to lock its choice")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution StopDuration { get { - return _serialNumber; + return _stopDuration; } set { - _serialNumber = value; + _stopDuration = value; } } /// - /// Device port name + /// Time(s) the animal has to collect the reward /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_reward")] + [System.ComponentModel.DescriptionAttribute("Time(s) the animal has to collect the reward")] + public double TimeToCollectReward { get { - return _portName; + return _timeToCollectReward; } set { - _portName = value; + _timeToCollectReward = value; } } - public System.IObservable Generate() + /// + /// Virtual distance (cm) the animal must be within to not abort the current choice + /// + [Newtonsoft.Json.JsonPropertyAttribute("grace_distance_threshold")] + [System.ComponentModel.DescriptionAttribute("Virtual distance (cm) the animal must be within to not abort the current choice")] + public double GraceDistanceThreshold { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpAnalogInput(this))); + get + { + return _graceDistanceThreshold; + } + set + { + _graceDistanceThreshold = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpAnalogInput(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperantLogic(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new OperantLogic(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("IsOperant = " + _isOperant + ", "); + stringBuilder.Append("StopDuration = " + _stopDuration + ", "); + stringBuilder.Append("TimeToCollectReward = " + _timeToCollectReward + ", "); + stringBuilder.Append("GraceDistanceThreshold = " + _graceDistanceThreshold); return true; } @@ -5073,175 +5272,136 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpBehavior + /// + /// Master control class for all operational hardware systems. + /// + ///This class aggregates all the hardware control specifications including + ///movable spout, odor delivery, position tracking, and audio systems. + ///It provides a centralized configuration point for all task hardware. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Master control class for all operational hardware systems. + + This class aggregates all the hardware control specifications including + movable spout, odor delivery, position tracking, and audio systems. + It provides a centralized configuration point for all task hardware.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class OperationControl { - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private int _whoAmI; - - private string _serialNumber; + private MovableSpoutControl _movableSpoutControl; - private string _portName; + private OdorControl _odorControl; - public HarpBehavior() - { - _deviceType = "Behavior"; - _whoAmI = 1216; - } + private PositionControl _positionControl; - protected HarpBehavior(HarpBehavior other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - } + private AudioControl _audioControl; - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + public OperationControl() { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _movableSpoutControl = new MovableSpoutControl(); + _odorControl = new OdorControl(); + _positionControl = new PositionControl(); + _audioControl = new AudioControl(); } - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + protected OperationControl(OperationControl other) { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } + _movableSpoutControl = other._movableSpoutControl; + _odorControl = other._odorControl; + _positionControl = other._positionControl; + _audioControl = other._audioControl; } /// - /// Additional settings + /// Control of the movable spout /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("movable_spout_control")] + [System.ComponentModel.DescriptionAttribute("Control of the movable spout")] + public MovableSpoutControl MovableSpoutControl { get { - return _additionalSettings; + return _movableSpoutControl; } set { - _additionalSettings = value; + _movableSpoutControl = value; } } /// - /// Calibration + /// Control of the odor /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("odor_control")] + [System.ComponentModel.DescriptionAttribute("Control of the odor")] + public OdorControl OdorControl { get { - return _whoAmI; + return _odorControl; } set { - _whoAmI = value; + _odorControl = value; } } /// - /// Device serial number + /// Control of the position /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("position_control")] + [System.ComponentModel.DescriptionAttribute("Control of the position")] + public PositionControl PositionControl { get { - return _serialNumber; + return _positionControl; } set { - _serialNumber = value; + _positionControl = value; } } /// - /// Device port name + /// Control of the audio /// - [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("audio_control")] + [System.ComponentModel.DescriptionAttribute("Control of the audio")] + public AudioControl AudioControl { get { - return _portName; + return _audioControl; } set { - _portName = value; + _audioControl = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - 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 OperationControl(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpBehavior(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new OperationControl(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("MovableSpoutControl = " + _movableSpoutControl + ", "); + stringBuilder.Append("OdorControl = " + _odorControl + ", "); + stringBuilder.Append("PositionControl = " + _positionControl + ", "); + stringBuilder.Append("AudioControl = " + _audioControl); return true; } @@ -5260,362 +5420,323 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// A RewardFunction that is applied when the animal is outside of the patch. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is outside of the patch.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpEnvironmentSensor + public partial class OutsideRewardFunction : RewardFunction { - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; + private PatchUpdateFunction _amount; - private int _whoAmI; + private PatchUpdateFunction _probability; - private string _serialNumber; + private PatchUpdateFunction _available; - private string _portName; + private OutsideRewardFunctionRule _rule; - public HarpEnvironmentSensor() - { - _deviceType = "EnvironmentSensor"; - _whoAmI = 1405; - } + private double _delay; - protected HarpEnvironmentSensor(HarpEnvironmentSensor other) + public OutsideRewardFunction() { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _rule = OutsideRewardFunctionRule.OnTime; + _delay = 0D; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + protected OutsideRewardFunction(OutsideRewardFunction other) : + base(other) { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; + _delay = other._delay; } /// - /// Device name + /// Defines the amount of reward replenished per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _deviceName; + return _amount; } set { - _deviceName = value; + _amount = value; } } /// - /// Additional settings + /// Defines the probability of reward replenished per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _additionalSettings; + return _probability; } set { - _additionalSettings = value; + _probability = value; } } /// - /// Calibration + /// Defines the amount of reward available replenished in the patch per rule unit. /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { get { - return _whoAmI; + return _available; } set { - _whoAmI = value; + _available = value; } } /// - /// Device serial number + /// Rule to trigger reward function /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("rule")] + [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] + public OutsideRewardFunctionRule Rule { get { - return _serialNumber; + return _rule; } set { - _serialNumber = value; + _rule = value; } } /// - /// Device port name + /// Delay (s) before the replenishment starts after the rule is triggered. /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("Delay (s) before the replenishment starts after the rule is triggered.")] + public double Delay { get { - return _portName; + return _delay; } set { - _portName = value; + _delay = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpEnvironmentSensor(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OutsideRewardFunction(this))); } - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpEnvironmentSensor(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new OutsideRewardFunction(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule + ", "); + stringBuilder.Append("Delay = " + _delay); + return true; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Represents statistics for a patch in the VR foraging task. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents statistics for a patch in the VR foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpLicketySplit + public partial class Patch { - private string _deviceType; - - private string _deviceName; + private string _label; - private BaseModel _additionalSettings; + private int _stateIndex; - private BaseModel _calibration; + private System.Collections.Generic.List _odorSpecification; - private int _whoAmI; + private RewardSpecification _rewardSpecification; - private string _serialNumber; + private PatchVirtualSitesGenerator _patchVirtualSitesGenerator; - private string _portName; + private System.Collections.Generic.List _patchTerminators; - public HarpLicketySplit() + public Patch() { - _deviceType = "LicketySplit"; - _whoAmI = 1400; + _label = ""; + _stateIndex = 0; + _odorSpecification = new System.Collections.Generic.List(); + _rewardSpecification = new RewardSpecification(); + _patchVirtualSitesGenerator = new PatchVirtualSitesGenerator(); + _patchTerminators = new System.Collections.Generic.List(); } - protected HarpLicketySplit(HarpLicketySplit other) + protected Patch(Patch other) { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _label = other._label; + _stateIndex = other._stateIndex; + _odorSpecification = other._odorSpecification; + _rewardSpecification = other._rewardSpecification; + _patchVirtualSitesGenerator = other._patchVirtualSitesGenerator; + _patchTerminators = other._patchTerminators; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Label of the patch + /// + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the patch")] + public string Label { get { - return _deviceType; + return _label; } set { - _deviceType = value; + _label = value; } } /// - /// Device name + /// Index of the state /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("state_index")] + [System.ComponentModel.DescriptionAttribute("Index of the state")] + public int StateIndex { get { - return _deviceName; + return _stateIndex; } set { - _deviceName = value; + _stateIndex = value; } } /// - /// Additional settings + /// A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("odor_specification", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("A list of odor concentrations for the patch, where the index of the list correspo" + + "nds to the odor channel")] + public System.Collections.Generic.List OdorSpecification { get { - return _additionalSettings; + return _odorSpecification; } set { - _additionalSettings = value; + _odorSpecification = value; } } /// - /// Calibration + /// The optional reward specification of the patch /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] + [System.ComponentModel.DescriptionAttribute("The optional reward specification of the patch")] + public RewardSpecification RewardSpecification { get { - return _whoAmI; + return _rewardSpecification; } set { - _whoAmI = value; + _rewardSpecification = value; } } /// - /// Device serial number + /// Virtual site generation specification /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("patch_virtual_sites_generator")] + [System.ComponentModel.DescriptionAttribute("Virtual site generation specification")] + public PatchVirtualSitesGenerator PatchVirtualSitesGenerator { get { - return _serialNumber; + return _patchVirtualSitesGenerator; } set { - _serialNumber = value; + _patchVirtualSitesGenerator = value; } } /// - /// Device port name + /// The optional termination specification of the patch /// - [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("patch_terminators")] + [System.ComponentModel.DescriptionAttribute("The optional termination specification of the patch")] + public System.Collections.Generic.List PatchTerminators { get { - return _portName; + return _patchTerminators; } set { - _portName = value; + _patchTerminators = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpLicketySplit(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Patch(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpLicketySplit(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Patch(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("StateIndex = " + _stateIndex + ", "); + stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); + stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); + stringBuilder.Append("PatchVirtualSitesGenerator = " + _patchVirtualSitesGenerator + ", "); + stringBuilder.Append("PatchTerminators = " + _patchTerminators); return true; } @@ -5634,176 +5755,174 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// A RewardFunction that is applied when the animal is inside the patch. + ///For the purposes of this function post-patch and inter-patch are excluded. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is inside the patch.\nFor the pur" + + "poses of this function post-patch and inter-patch are excluded.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpSniffDetector + public partial class PatchRewardFunction : RewardFunction { - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; + private PatchUpdateFunction _amount; - private int _whoAmI; + private PatchUpdateFunction _probability; - private string _serialNumber; + private PatchUpdateFunction _available; - private string _portName; + private PatchRewardFunctionRule _rule; - public HarpSniffDetector() + public PatchRewardFunction() { - _deviceType = "SniffDetector"; - _whoAmI = 1401; + _rule = PatchRewardFunctionRule.OnReward; } - protected HarpSniffDetector(HarpSniffDetector other) + protected PatchRewardFunction(PatchRewardFunction other) : + base(other) { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + /// + /// Defines the amount of reward replenished per rule unit. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _deviceType; + return _amount; } set { - _deviceType = value; + _amount = value; } } /// - /// Device name + /// Defines the probability of reward replenished per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _deviceName; + return _probability; } set { - _deviceName = value; + _probability = value; } } /// - /// Additional settings + /// Defines the amount of reward available replenished in the patch per rule unit. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { get { - return _additionalSettings; + return _available; } set { - _additionalSettings = value; + _available = value; } } /// - /// Calibration + /// Rule to trigger reward function /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("rule")] + [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] + public PatchRewardFunctionRule Rule { get { - return _calibration; + return _rule; } set { - _calibration = value; + _rule = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + public System.IObservable Generate() { - get - { - return _whoAmI; - } - set - { - _whoAmI = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchRewardFunction(this))); } - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + public System.IObservable Generate(System.IObservable source) { - get + return System.Reactive.Linq.Observable.Select(source, _ => new PatchRewardFunction(this)); + } + + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + if (base.PrintMembers(stringBuilder)) { - return _serialNumber; - } - set - { - _serialNumber = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule); + return true; } + } + + + /// + /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "terminator_type")] + [JsonInheritanceAttribute("OnRejection", typeof(PatchTerminatorOnRejection))] + [JsonInheritanceAttribute("OnChoice", typeof(PatchTerminatorOnChoice))] + [JsonInheritanceAttribute("OnReward", typeof(PatchTerminatorOnReward))] + [JsonInheritanceAttribute("OnTime", typeof(PatchTerminatorOnTime))] + [JsonInheritanceAttribute("OnDistance", typeof(PatchTerminatorOnDistance))] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + + "\" reward sites.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class PatchTerminator + { - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + public PatchTerminator() { - get - { - return _portName; - } - set - { - _portName = value; - } } - public System.IObservable Generate() + protected PatchTerminator(PatchTerminator other) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpSniffDetector(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpSniffDetector(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminator(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); - return true; + return false; } public override string ToString() @@ -5821,312 +5940,181 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Terminates the patch after "count" choices. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" choices.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class HarpWhiteRabbit + public partial class PatchTerminatorOnChoice : PatchTerminator { - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private int _whoAmI; - - private string _serialNumber; - - private string _portName; - - private System.Collections.Generic.List _connectedClockOutputs; - - public HarpWhiteRabbit() - { - _deviceType = "WhiteRabbit"; - _whoAmI = 1404; - _connectedClockOutputs = new System.Collections.Generic.List(); - } + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - protected HarpWhiteRabbit(HarpWhiteRabbit other) + public PatchTerminatorOnChoice() { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - _connectedClockOutputs = other._connectedClockOutputs; + _count = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + protected PatchTerminatorOnChoice(PatchTerminatorOnChoice other) : + base(other) { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _count = other._count; } /// - /// Device name + /// Number of choices the animal must make to terminate the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count")] + [System.ComponentModel.DescriptionAttribute("Number of choices the animal must make to terminate the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _deviceName; + return _count; } set { - _deviceName = value; + _count = value; } } - /// - /// Additional settings - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + public System.IObservable Generate() { - get - { - return _additionalSettings; - } - set - { - _additionalSettings = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnChoice(this))); } - /// - /// Calibration - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + public System.IObservable Generate(System.IObservable source) { - get - { - return _calibration; - } - set - { - _calibration = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnChoice(this)); } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _whoAmI; - } - set + if (base.PrintMembers(stringBuilder)) { - _whoAmI = value; + stringBuilder.Append(", "); } + stringBuilder.Append("Count = " + _count); + return true; } + } + + + /// + /// Terminates the patch after a "count" distance. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" distance.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class PatchTerminatorOnDistance : PatchTerminator + { - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; + + public PatchTerminatorOnDistance() { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } } - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + protected PatchTerminatorOnDistance(PatchTerminatorOnDistance other) : + base(other) { - get - { - return _portName; - } - set - { - _portName = value; - } + _count = other._count; } /// - /// Connected clock outputs + /// Number of distance units to wait before terminating the patch /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("connected_clock_outputs")] - [System.ComponentModel.DescriptionAttribute("Connected clock outputs")] - public System.Collections.Generic.List ConnectedClockOutputs + [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of distance units to wait before terminating the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _connectedClockOutputs; + return _count; } set { - _connectedClockOutputs = value; + _count = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new HarpWhiteRabbit(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new HarpWhiteRabbit(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnDistance(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName + ", "); - stringBuilder.Append("ConnectedClockOutputs = " + _connectedClockOutputs); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnDistance(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Count = " + _count); + return true; } } /// - /// A log-normal probability distribution. - /// - ///Distribution where the logarithm of the variable is normally distributed. - ///Always produces positive values and is right-skewed. + /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A log-normal probability distribution.\n\nDistribution where the logarithm of the v" + - "ariable is normally distributed.\nAlways produces positive values and is right-sk" + - "ewed.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + + "\" reward sites.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LogNormalDistribution : Distribution + public partial class PatchTerminatorOnRejection : PatchTerminator { - private LogNormalDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - private ScalingParameters _scalingParameters; - - public LogNormalDistribution() + public PatchTerminatorOnRejection() { - _distributionParameters = new LogNormalDistributionParameters(); + _count = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - protected LogNormalDistribution(LogNormalDistribution other) : + protected PatchTerminatorOnRejection(PatchTerminatorOnRejection other) : base(other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _count = other._count; } /// - /// Parameters of the distribution + /// Number of reward sites the animal must not stop in to terminate the patch /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public LogNormalDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("count")] + [System.ComponentModel.DescriptionAttribute("Number of reward sites the animal must not stop in to terminate the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _distributionParameters; + return _count; } 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; + _count = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogNormalDistribution(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnRejection(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new LogNormalDistribution(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnRejection(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -6135,208 +6123,123 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); + stringBuilder.Append("Count = " + _count); return true; } } /// - /// Parameters for a log-normal distribution. - /// - ///Defined by the mean and standard deviation of the underlying normal distribution. + /// Terminates the patch after "count" rewards. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a log-normal distribution.\n\nDefined by the mean and standard devia" + - "tion of the underlying normal distribution.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" rewards.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LogNormalDistributionParameters + public partial class PatchTerminatorOnReward : PatchTerminator { - private string _family; - - private double _mean; - - private double _std; - - public LogNormalDistributionParameters() - { - _family = "LogNormal"; - _mean = 0D; - _std = 0D; - } - - protected LogNormalDistributionParameters(LogNormalDistributionParameters other) - { - _family = other._family; - _mean = other._mean; - _std = other._std; - } + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + public PatchTerminatorOnReward() { - get - { - return _family; - } - set - { - _family = value; - } + _count = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - /// - /// Mean of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("mean")] - [System.ComponentModel.DescriptionAttribute("Mean of the distribution")] - public double Mean + protected PatchTerminatorOnReward(PatchTerminatorOnReward other) : + base(other) { - get - { - return _mean; - } - set - { - _mean = value; - } + _count = other._count; } /// - /// Standard deviation of the distribution + /// Number of rewards the animal must collect to terminate the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("std")] - [System.ComponentModel.DescriptionAttribute("Standard deviation of the distribution")] - public double Std + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("count")] + [System.ComponentModel.DescriptionAttribute("Number of rewards the animal must collect to terminate the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _std; + return _count; } set { - _std = value; + _count = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LogNormalDistributionParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new LogNormalDistributionParameters(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnReward(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Mean = " + _mean + ", "); - stringBuilder.Append("Std = " + _std); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnReward(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Count = " + _count); + return true; } } /// - /// A patch update function that uses lookup table interpolation. - /// - ///Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. - ///This function maps input values to output values using a lookup table with - ///linear interpolation between defined points. Useful for complex, non-linear - ///reward schedules or parameter updates. + /// Terminates the patch after a "count" seconds. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that uses lookup table interpolation. - - Update in the form of x = lut_values[lerp(lut_keys, lut_values, tick_value)]. - This function maps input values to output values using a lookup table with - linear interpolation between defined points. Useful for complex, non-linear - reward schedules or parameter updates.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" seconds.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LookupTableFunction : PatchUpdateFunction + public partial class PatchTerminatorOnTime : PatchTerminator { - private System.Collections.Generic.List _lutKeys; - - private System.Collections.Generic.List _lutValues; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _count; - public LookupTableFunction() + public PatchTerminatorOnTime() { - _lutKeys = new System.Collections.Generic.List(); - _lutValues = new System.Collections.Generic.List(); } - protected LookupTableFunction(LookupTableFunction other) : + protected PatchTerminatorOnTime(PatchTerminatorOnTime 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; - } + _count = other._count; } /// - /// List of values of the lookup table + /// Number of seconds to wait before terminating the patch /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Number of seconds to wait before terminating the patch")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Count { get { - return _lutValues; + return _count; } set { - _lutValues = value; + _count = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LookupTableFunction(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnTime(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new LookupTableFunction(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnTime(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -6345,108 +6248,59 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("LutKeys = " + _lutKeys + ", "); - stringBuilder.Append("LutValues = " + _lutValues); + stringBuilder.Append("Count = " + _count); return true; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// A patch update function that applies a clamped rate-based update. + /// + ///Update in the form of x = clamp(x + rate * tick_value). + ///This function updates values at a specified rate while keeping results within + ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + ///time, distance, choices). + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] + [JsonInheritanceAttribute("ClampedRateFunction", typeof(ClampedRateFunction))] + [JsonInheritanceAttribute("ClampedMultiplicativeRateFunction", typeof(ClampedMultiplicativeRateFunction))] + [JsonInheritanceAttribute("SetValueFunction", typeof(SetValueFunction))] + [JsonInheritanceAttribute("LookupTableFunction", typeof(LookupTableFunction))] + [JsonInheritanceAttribute("CtcmFunction", typeof(CtcmFunction))] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. + + Update in the form of x = clamp(x + rate * tick_value). + This function updates values at a specified rate while keeping results within + defined minimum and maximum bounds. The rate is applied per rule unit (e.g., + time, distance, choices).")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ManipulatorPosition + public partial class PatchUpdateFunction { - private double _x; - - private double _y1; - - private double _y2; - - private double _z; - - public ManipulatorPosition() - { - } - - protected ManipulatorPosition(ManipulatorPosition other) - { - _x = other._x; - _y1 = other._y1; - _y2 = other._y2; - _z = other._z; - } - - [Newtonsoft.Json.JsonPropertyAttribute("x", Required=Newtonsoft.Json.Required.Always)] - public double X - { - get - { - return _x; - } - set - { - _x = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("y1", Required=Newtonsoft.Json.Required.Always)] - public double Y1 - { - get - { - return _y1; - } - set - { - _y1 = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("y2", Required=Newtonsoft.Json.Required.Always)] - public double Y2 + public PatchUpdateFunction() { - get - { - return _y2; - } - set - { - _y2 = value; - } } - [Newtonsoft.Json.JsonPropertyAttribute("z", Required=Newtonsoft.Json.Required.Always)] - public double Z + protected PatchUpdateFunction(PatchUpdateFunction other) { - get - { - return _z; - } - set - { - _z = value; - } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ManipulatorPosition(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchUpdateFunction(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ManipulatorPosition(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PatchUpdateFunction(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); - return true; + return false; } public override string ToString() @@ -6465,121 +6319,134 @@ public override string ToString() /// - /// Input for water valve calibration class + /// Defines the generation specifications for all virtual site types within a patch. + /// + ///This class contains generators for all the different types of virtual sites + ///that can appear within a patch environment. Each generator defines how sites + ///of that type should be created with their properties and distributions. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Input for water valve calibration class")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines the generation specifications for all virtual site types within a patch. + + This class contains generators for all the different types of virtual sites + that can appear within a patch environment. Each generator defines how sites + of that type should be created with their properties and distributions.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Measurement + public partial class PatchVirtualSitesGenerator { - private double _valveOpenInterval; + private VirtualSiteGenerator _interSite; - private double _valveOpenTime; + private VirtualSiteGenerator _interPatch; - private System.Collections.Generic.List _waterWeight; + private VirtualSiteGenerator _postPatch; - private int _repeatCount; + private VirtualSiteGenerator _rewardSite; - public Measurement() + public PatchVirtualSitesGenerator() { - _waterWeight = new System.Collections.Generic.List(); + _interSite = new VirtualSiteGenerator(); + _interPatch = new VirtualSiteGenerator(); + _rewardSite = new VirtualSiteGenerator(); } - protected Measurement(Measurement other) + protected PatchVirtualSitesGenerator(PatchVirtualSitesGenerator other) { - _valveOpenInterval = other._valveOpenInterval; - _valveOpenTime = other._valveOpenTime; - _waterWeight = other._waterWeight; - _repeatCount = other._repeatCount; + _interSite = other._interSite; + _interPatch = other._interPatch; + _postPatch = other._postPatch; + _rewardSite = other._rewardSite; } /// - /// Time between two consecutive valve openings (s) + /// Generator of the inter-site virtual sites /// - [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("inter_site")] + [System.ComponentModel.DescriptionAttribute("Generator of the inter-site virtual sites")] + public VirtualSiteGenerator InterSite { get { - return _valveOpenInterval; + return _interSite; } set { - _valveOpenInterval = value; + _interSite = value; } } /// - /// Valve open interval (s) + /// Generator of the inter-patch virtual sites /// - [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("inter_patch")] + [System.ComponentModel.DescriptionAttribute("Generator of the inter-patch virtual sites")] + public VirtualSiteGenerator InterPatch { get { - return _valveOpenTime; + return _interPatch; } set { - _valveOpenTime = value; + _interPatch = value; } } /// - /// Weight of water delivered (g) + /// Generator of the post-patch virtual sites /// [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("post_patch")] + [System.ComponentModel.DescriptionAttribute("Generator of the post-patch virtual sites")] + public VirtualSiteGenerator PostPatch { get { - return _waterWeight; + return _postPatch; } set { - _waterWeight = value; + _postPatch = value; } } /// - /// Number of times the valve opened. + /// Generator of the reward-site virtual sites /// - [Newtonsoft.Json.JsonPropertyAttribute("repeat_count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of times the valve opened.")] - public int RepeatCount + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_site")] + [System.ComponentModel.DescriptionAttribute("Generator of the reward-site virtual sites")] + public VirtualSiteGenerator RewardSite { get { - return _repeatCount; + return _rewardSite; } set { - _repeatCount = value; + _rewardSite = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - 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 PatchVirtualSitesGenerator(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Measurement(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PatchVirtualSitesGenerator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("ValveOpenInterval = " + _valveOpenInterval + ", "); - stringBuilder.Append("ValveOpenTime = " + _valveOpenTime + ", "); - stringBuilder.Append("WaterWeight = " + _waterWeight + ", "); - stringBuilder.Append("RepeatCount = " + _repeatCount); + stringBuilder.Append("InterSite = " + _interSite + ", "); + stringBuilder.Append("InterPatch = " + _interPatch + ", "); + stringBuilder.Append("PostPatch = " + _postPatch + ", "); + stringBuilder.Append("RewardSite = " + _rewardSite); return true; } @@ -6598,363 +6465,394 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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.6.1.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, - } - - /// - /// Controls the movable water spout behavior for reward delivery. - /// - ///This class configures how the movable spout operates, including when it's - ///enabled, timing for reward collection, and retraction distance for operant - ///conditioning protocols. + /// A RewardFunction that is always active. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Controls the movable water spout behavior for reward delivery.\n\nThis class config" + - "ures how the movable spout operates, including when it\'s\nenabled, timing for rew" + - "ard collection, and retraction distance for operant\nconditioning protocols.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A RewardFunction that is always active.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class MovableSpoutControl + public partial class PersistentRewardFunction : RewardFunction { - private bool _enabled; + private PatchUpdateFunction _amount; - private double _timeToCollectAfterReward; + private PatchUpdateFunction _probability; - private double _retractingDistance; + private PatchUpdateFunction _available; - public MovableSpoutControl() + private PersistentRewardFunctionRule _rule; + + public PersistentRewardFunction() { - _enabled = false; - _timeToCollectAfterReward = 1D; - _retractingDistance = 0D; } - protected MovableSpoutControl(MovableSpoutControl other) + protected PersistentRewardFunction(PersistentRewardFunction other) : + base(other) { - _enabled = other._enabled; - _timeToCollectAfterReward = other._timeToCollectAfterReward; - _retractingDistance = other._retractingDistance; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rule = other._rule; } /// - /// Whether the movable spout is enabled + /// Defines the amount of reward replenished per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("enabled")] - [System.ComponentModel.DescriptionAttribute("Whether the movable spout is enabled")] - public bool Enabled + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] + public PatchUpdateFunction Amount { get { - return _enabled; + return _amount; } set { - _enabled = value; + _amount = value; } } /// - /// Time (s) to collect after reward + /// Defines the probability of reward replenished per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_after_reward")] - [System.ComponentModel.DescriptionAttribute("Time (s) to collect after reward")] - public double TimeToCollectAfterReward + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] + public PatchUpdateFunction Probability { get { - return _timeToCollectAfterReward; + return _probability; } set { - _timeToCollectAfterReward = value; + _probability = value; } } /// - /// The distance, relative to the default position, the spout will be retracted by + /// Defines the amount of reward available replenished in the patch per rule unit. /// - [Newtonsoft.Json.JsonPropertyAttribute("retracting_distance")] - [System.ComponentModel.DescriptionAttribute("The distance, relative to the default position, the spout will be retracted by")] - public double RetractingDistance + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] + public PatchUpdateFunction Available { get { - return _retractingDistance; + return _available; } set { - _retractingDistance = value; + _available = value; } } - public System.IObservable Generate() + [Newtonsoft.Json.JsonPropertyAttribute("rule", Required=Newtonsoft.Json.Required.Always)] + public PersistentRewardFunctionRule Rule { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new MovableSpoutControl(this))); + get + { + return _rule; + } + set + { + _rule = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new MovableSpoutControl(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PersistentRewardFunction(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Enabled = " + _enabled + ", "); - stringBuilder.Append("TimeToCollectAfterReward = " + _timeToCollectAfterReward + ", "); - stringBuilder.Append("RetractingDistance = " + _retractingDistance); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new PersistentRewardFunction(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("Rule = " + _rule); + return true; } } /// - /// A normal (Gaussian) probability distribution. + /// Controls the position tracking and movement detection parameters. /// - ///Bell-shaped distribution symmetric around the mean, commonly used - ///for modeling naturally occurring random variables. + ///This class manages the position control system including coordinate transformations, + ///initial positioning, signal filtering, and movement detection thresholds for the + ///virtual reality foraging task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A normal (Gaussian) probability distribution.\n\nBell-shaped distribution symmetric" + - " around the mean, commonly used\nfor modeling naturally occurring random variable" + - "s.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Controls the position tracking and movement detection parameters. + + This class manages the position control system including coordinate transformations, + initial positioning, signal filtering, and movement detection thresholds for the + virtual reality foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NormalDistribution : Distribution + public partial class PositionControl { - private NormalDistributionParameters _distributionParameters; + private Vector3 _gain; - private TruncationParameters _truncationParameters; + private Vector3 _initialPosition; + + private double _frequencyFilterCutoff; - private ScalingParameters _scalingParameters; + private double _velocityThreshold; - public NormalDistribution() + public PositionControl() { - _distributionParameters = new NormalDistributionParameters(); + _gain = new Vector3(); + _initialPosition = new Vector3(); + _frequencyFilterCutoff = 0.5D; + _velocityThreshold = 1D; } - protected NormalDistribution(NormalDistribution other) : - base(other) + protected PositionControl(PositionControl other) { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; + _gain = other._gain; + _initialPosition = other._initialPosition; + _frequencyFilterCutoff = other._frequencyFilterCutoff; + _velocityThreshold = other._velocityThreshold; } /// - /// Parameters of the distribution + /// Gain of the position control. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public NormalDistributionParameters DistributionParameters + [Newtonsoft.Json.JsonPropertyAttribute("gain")] + [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] + public Vector3 Gain { get { - return _distributionParameters; + return _gain; } set { - _distributionParameters = value; + _gain = value; } } /// - /// Truncation parameters of the distribution + /// Initial position of the subject in the VR world. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - [System.ComponentModel.DescriptionAttribute("Truncation parameters of the distribution")] - public TruncationParameters TruncationParameters + [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] + [System.ComponentModel.DescriptionAttribute("Initial position of the subject in the VR world.")] + public Vector3 InitialPosition { get { - return _truncationParameters; + return _initialPosition; } set { - _truncationParameters = value; + _initialPosition = value; } } /// - /// Scaling parameters of the distribution + /// Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - [System.ComponentModel.DescriptionAttribute("Scaling parameters of the distribution")] - public ScalingParameters ScalingParameters + [Newtonsoft.Json.JsonPropertyAttribute("frequency_filter_cutoff")] + [System.ComponentModel.DescriptionAttribute("Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal.")] + public double FrequencyFilterCutoff { get { - return _scalingParameters; + return _frequencyFilterCutoff; } set { - _scalingParameters = value; + _frequencyFilterCutoff = value; + } + } + + /// + /// Threshold (cm/s) of the velocity signal used to detect when the animal is moving. + /// + [Newtonsoft.Json.JsonPropertyAttribute("velocity_threshold")] + [System.ComponentModel.DescriptionAttribute("Threshold (cm/s) of the velocity signal used to detect when the animal is moving." + + "")] + public double VelocityThreshold + { + get + { + return _velocityThreshold; + } + set + { + _velocityThreshold = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NormalDistribution(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PositionControl(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new NormalDistribution(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new PositionControl(this)); } - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - if (base.PrintMembers(stringBuilder)) + stringBuilder.Append("Gain = " + _gain + ", "); + stringBuilder.Append("InitialPosition = " + _initialPosition + ", "); + stringBuilder.Append("FrequencyFilterCutoff = " + _frequencyFilterCutoff + ", "); + stringBuilder.Append("VelocityThreshold = " + _velocityThreshold); + 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(" "); } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } /// - /// Parameters for a normal (Gaussian) distribution. - /// - ///Defined by mean (center) and standard deviation (spread). + /// Represents a rectangle defined by its top-left corner, width, and height. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a normal (Gaussian) distribution.\n\nDefined by mean (center) and st" + - "andard deviation (spread).")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a rectangle defined by its top-left corner, width, and height.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NormalDistributionParameters + public partial class Rect { - private string _family; + private int _x; + + private int _y; + + private int _width; - private double _mean; + private int _height; - private double _std; + public Rect() + { + _x = 0; + _y = 0; + _width = 0; + _height = 0; + } - public NormalDistributionParameters() + protected Rect(Rect other) { - _family = "Normal"; - _mean = 0D; - _std = 0D; + _x = other._x; + _y = other._y; + _width = other._width; + _height = other._height; } - protected NormalDistributionParameters(NormalDistributionParameters other) + /// + /// X coordinate of the top-left corner + /// + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the top-left corner")] + public int X { - _family = other._family; - _mean = other._mean; - _std = other._std; + get + { + return _x; + } + set + { + _x = value; + } } - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family + /// + /// 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 _family; + return _y; } set { - _family = value; + _y = value; } } /// - /// Mean of the distribution + /// Width of the rectangle /// - [Newtonsoft.Json.JsonPropertyAttribute("mean")] - [System.ComponentModel.DescriptionAttribute("Mean of the distribution")] - public double Mean + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the rectangle")] + public int Width { get { - return _mean; + return _width; } set { - _mean = value; + _width = value; } } /// - /// Standard deviation of the distribution + /// Height of the rectangle /// - [Newtonsoft.Json.JsonPropertyAttribute("std")] - [System.ComponentModel.DescriptionAttribute("Standard deviation of the distribution")] - public double Std + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the rectangle")] + public int Height { get { - return _std; + return _height; } set { - _std = value; + _height = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NormalDistributionParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new NormalDistributionParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Rect(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Mean = " + _mean + ", "); - stringBuilder.Append("Std = " + _std); + stringBuilder.Append("X = " + _x + ", "); + stringBuilder.Append("Y = " + _y + ", "); + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); return true; } @@ -6974,89 +6872,62 @@ public override string ToString() /// - /// A numerical updater that modifies task parameters during execution. + /// Defines visual rendering properties for virtual environment elements. /// - ///This class combines an operation type with parameters to define how values - ///should be updated dynamically during the task, enabling adaptive behavior - ///based on animal performance or other criteria. + ///This class controls the visual appearance of virtual sites, including + ///contrast and other visual parameters that affect how elements are rendered + ///in the VR environment. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A numerical updater that modifies task parameters during execution. - - This class combines an operation type with parameters to define how values - should be updated dynamically during the task, enabling adaptive behavior - based on animal performance or other criteria.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines visual rendering properties for virtual environment elements.\n\nThis class" + + " controls the visual appearance of virtual sites, including\ncontrast and other v" + + "isual parameters that affect how elements are rendered\nin the VR environment.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NumericalUpdater + public partial class RenderSpecification { - private NumericalUpdaterOperation _operation; - - private NumericalUpdaterParameters _parameters; - - public NumericalUpdater() - { - _operation = AindVrForagingDataSchema.NumericalUpdaterOperation.None; - _parameters = new NumericalUpdaterParameters(); - } + private double? _contrast; - protected NumericalUpdater(NumericalUpdater other) + public RenderSpecification() { - _operation = other._operation; - _parameters = other._parameters; } - /// - /// Operation to perform on the parameter - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operation")] - [System.ComponentModel.DescriptionAttribute("Operation to perform on the parameter")] - public NumericalUpdaterOperation Operation + protected RenderSpecification(RenderSpecification other) { - get - { - return _operation; - } - set - { - _operation = value; - } + _contrast = other._contrast; } /// - /// Parameters of the updater + /// Contrast of the texture /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the updater")] - public NumericalUpdaterParameters Parameters + [Newtonsoft.Json.JsonPropertyAttribute("contrast")] + [System.ComponentModel.DescriptionAttribute("Contrast of the texture")] + public double? Contrast { get { - return _parameters; + return _contrast; } set { - _parameters = value; + _contrast = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdater(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RenderSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdater(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new RenderSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Operation = " + _operation + ", "); - stringBuilder.Append("Parameters = " + _parameters); + stringBuilder.Append("Contrast = " + _contrast); return true; } @@ -7075,220 +6946,230 @@ public override string ToString() } - /// - /// Enumeration of operations that can be performed by numerical updaters. - /// - ///These operations define how parameter values are modified during task execution, - ///allowing for dynamic adjustment of task parameters based on performance or other criteria. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum NumericalUpdaterOperation + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] + [JsonInheritanceAttribute("PatchRewardFunction", typeof(PatchRewardFunction))] + [JsonInheritanceAttribute("OnThisPatchEntryRewardFunction", typeof(OnThisPatchEntryRewardFunction))] + [JsonInheritanceAttribute("OutsideRewardFunction", typeof(OutsideRewardFunction))] + [JsonInheritanceAttribute("PersistentRewardFunction", typeof(PersistentRewardFunction))] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class RewardFunction { - [System.Runtime.Serialization.EnumMemberAttribute(Value="None")] - None = 0, + public RewardFunction() + { + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="Offset")] - Offset = 1, + protected RewardFunction(RewardFunction other) + { + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="Gain")] - Gain = 2, + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardFunction(this))); + } - [System.Runtime.Serialization.EnumMemberAttribute(Value="Set")] - Set = 3, + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new RewardFunction(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(); + } } /// - /// Parameters that control how numerical updates are applied to task values. + /// Specifies reward parameters and behavior for a patch. /// - ///These parameters define the bounds and increments for updating numerical values - ///during task execution, ensuring values stay within acceptable ranges. + ///This class defines all aspects of reward delivery including amounts, probabilities, + ///delays, operant logic, and dynamic update functions. It serves as the complete + ///specification for how rewards are managed in a given Patch. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters that control how numerical updates are applied to task values.\n\nThese " + - "parameters define the bounds and increments for updating numerical values\nduring" + - " task execution, ensuring values stay within acceptable ranges.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Specifies reward parameters and behavior for a patch. + + This class defines all aspects of reward delivery including amounts, probabilities, + delays, operant logic, and dynamic update functions. It serves as the complete + specification for how rewards are managed in a given Patch.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class NumericalUpdaterParameters + public partial class RewardSpecification { - private double _initialValue; + private OperantLogic _operantLogic; - private double _onSuccess; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _delay; - private double _onFailure; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _amount; - private double _increment; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _probability; - private double _decrement; - - private double _minimum; - - private double _maximum; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _available; - public NumericalUpdaterParameters() - { - _initialValue = 0D; - _onSuccess = 0D; - _onFailure = 0D; - _increment = 0D; - _decrement = 0D; - _minimum = 0D; - _maximum = 0D; - } + private System.Collections.Generic.List _rewardFunction; - protected NumericalUpdaterParameters(NumericalUpdaterParameters other) + public RewardSpecification() { - _initialValue = other._initialValue; - _onSuccess = other._onSuccess; - _onFailure = other._onFailure; - _increment = other._increment; - _decrement = other._decrement; - _minimum = other._minimum; - _maximum = other._maximum; + _delay = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _amount = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _probability = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _available = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); + _rewardFunction = new System.Collections.Generic.List(); } - /// - /// Initial value of the parameter - /// - [Newtonsoft.Json.JsonPropertyAttribute("initial_value")] - [System.ComponentModel.DescriptionAttribute("Initial value of the parameter")] - public double InitialValue + protected RewardSpecification(RewardSpecification other) { - get - { - return _initialValue; - } - set - { - _initialValue = value; - } + _operantLogic = other._operantLogic; + _delay = other._delay; + _amount = other._amount; + _probability = other._probability; + _available = other._available; + _rewardFunction = other._rewardFunction; } /// - /// Value used to update the parameter by on success + /// The optional operant logic of the reward /// - [Newtonsoft.Json.JsonPropertyAttribute("on_success")] - [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on success")] - public double OnSuccess + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("operant_logic")] + [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] + public OperantLogic OperantLogic { get { - return _onSuccess; + return _operantLogic; } set { - _onSuccess = value; + _operantLogic = value; } } /// - /// Value used to update the parameter by on failure + /// The optional distribution where the delay to reward will be drawn from /// - [Newtonsoft.Json.JsonPropertyAttribute("on_failure")] - [System.ComponentModel.DescriptionAttribute("Value used to update the parameter by on failure")] - public double OnFailure + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Delay { get { - return _onFailure; + return _delay; } set { - _onFailure = value; + _delay = value; } } /// - /// Value to increment the parameter by + /// Initial amount of reward in microliters /// - [Newtonsoft.Json.JsonPropertyAttribute("increment")] - [System.ComponentModel.DescriptionAttribute("Value to increment the parameter by")] - public double Increment + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("amount")] + [System.ComponentModel.DescriptionAttribute("Initial amount of reward in microliters")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Amount { get { - return _increment; + return _amount; } set { - _increment = value; + _amount = value; } } /// - /// Value to decrement the parameter by + /// Initial probability of reward delivery /// - [Newtonsoft.Json.JsonPropertyAttribute("decrement")] - [System.ComponentModel.DescriptionAttribute("Value to decrement the parameter by")] - public double Decrement + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("probability")] + [System.ComponentModel.DescriptionAttribute("Initial probability of reward delivery")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Probability { get { - return _decrement; + return _probability; } set { - _decrement = value; + _probability = value; } } /// - /// Minimum value of the parameter + /// Initial amount of reward available in the patch in microliters /// - [Newtonsoft.Json.JsonPropertyAttribute("minimum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] - public double Minimum + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("available")] + [System.ComponentModel.DescriptionAttribute("Initial amount of reward available in the patch in microliters")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Available { get { - return _minimum; + return _available; } set { - _minimum = value; + _available = value; } } /// - /// Minimum value of the parameter + /// Reward function of the patch /// - [Newtonsoft.Json.JsonPropertyAttribute("maximum")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the parameter")] - public double Maximum + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_function")] + [System.ComponentModel.DescriptionAttribute("Reward function of the patch")] + public System.Collections.Generic.List RewardFunction { get { - return _maximum; + return _rewardFunction; } set { - _maximum = value; + _rewardFunction = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new NumericalUpdaterParameters(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new NumericalUpdaterParameters(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new RewardSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("InitialValue = " + _initialValue + ", "); - stringBuilder.Append("OnSuccess = " + _onSuccess + ", "); - stringBuilder.Append("OnFailure = " + _onFailure + ", "); - stringBuilder.Append("Increment = " + _increment + ", "); - stringBuilder.Append("Decrement = " + _decrement + ", "); - stringBuilder.Append("Minimum = " + _minimum + ", "); - stringBuilder.Append("Maximum = " + _maximum); + stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); + stringBuilder.Append("Delay = " + _delay + ", "); + stringBuilder.Append("Amount = " + _amount + ", "); + stringBuilder.Append("Probability = " + _probability + ", "); + stringBuilder.Append("Available = " + _available + ", "); + stringBuilder.Append("RewardFunction = " + _rewardFunction); return true; } @@ -7308,130 +7189,58 @@ public override string ToString() /// - /// Controls the odor delivery system parameters. - /// - ///This class manages the olfactory stimulus delivery system, including flow rates, - ///valve timing, and carrier gas configuration. It ensures proper odor concentration - ///and delivery timing for the behavioral task. + /// Container class for calibration models. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Controls the odor delivery system parameters.\n\nThis class manages the olfactory s" + - "timulus delivery system, including flow rates,\nvalve timing, and carrier gas con" + - "figuration. It ensures proper odor concentration\nand delivery timing for the beh" + - "avioral task.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Container class for calibration models.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OdorControl + public partial class RigCalibration { - private double _valveMaxOpenTime; - - private double _targetTotalFlow; - - private bool _useChannel3AsCarrier; - - private double _targetOdorFlow; - - public OdorControl() - { - _valveMaxOpenTime = 10D; - _targetTotalFlow = 1000D; - _useChannel3AsCarrier = true; - _targetOdorFlow = 100D; - } - - protected OdorControl(OdorControl other) - { - _valveMaxOpenTime = other._valveMaxOpenTime; - _targetTotalFlow = other._targetTotalFlow; - _useChannel3AsCarrier = other._useChannel3AsCarrier; - _targetOdorFlow = other._targetOdorFlow; - } - - /// - /// Maximum time (s) the valve can be open continuously - /// - [Newtonsoft.Json.JsonPropertyAttribute("valve_max_open_time")] - [System.ComponentModel.DescriptionAttribute("Maximum time (s) the valve can be open continuously")] - public double ValveMaxOpenTime - { - get - { - return _valveMaxOpenTime; - } - set - { - _valveMaxOpenTime = value; - } - } + private WaterValveCalibration _waterValve; - /// - /// Target total flow (ml/s) of the odor mixture - /// - [Newtonsoft.Json.JsonPropertyAttribute("target_total_flow")] - [System.ComponentModel.DescriptionAttribute("Target total flow (ml/s) of the odor mixture")] - public double TargetTotalFlow + public RigCalibration() { - get - { - return _targetTotalFlow; - } - set - { - _targetTotalFlow = value; - } + _waterValve = new WaterValveCalibration(); } - /// - /// Whether to use channel 3 as carrier - /// - [Newtonsoft.Json.JsonPropertyAttribute("use_channel_3_as_carrier")] - [System.ComponentModel.DescriptionAttribute("Whether to use channel 3 as carrier")] - public bool UseChannel3AsCarrier + protected RigCalibration(RigCalibration other) { - get - { - return _useChannel3AsCarrier; - } - set - { - _useChannel3AsCarrier = value; - } + _waterValve = other._waterValve; } /// - /// Target odor flow (ml/s) in the odor mixture + /// Water valve calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("target_odor_flow")] - [System.ComponentModel.DescriptionAttribute("Target odor flow (ml/s) in the odor mixture")] - public double TargetOdorFlow + [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 _targetOdorFlow; + return _waterValve; } set { - _targetOdorFlow = value; + _waterValve = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorControl(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OdorControl(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("ValveMaxOpenTime = " + _valveMaxOpenTime + ", "); - stringBuilder.Append("TargetTotalFlow = " + _targetTotalFlow + ", "); - stringBuilder.Append("UseChannel3AsCarrier = " + _useChannel3AsCarrier + ", "); - stringBuilder.Append("TargetOdorFlow = " + _targetOdorFlow); + stringBuilder.Append("WaterValve = " + _waterValve); return true; } @@ -7451,266 +7260,209 @@ public override string ToString() /// - /// Specifies odor delivery parameters for olfactory cues in the VR environment. - /// - ///Odors can be delivered at specific locations to provide additional sensory - ///information for navigation and foraging decisions. + /// Represents a screen assembly (left, center and right screens) and respective configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Specifies odor delivery parameters for olfactory cues in the VR environment.\n\nOdo" + - "rs can be delivered at specific locations to provide additional sensory\ninformat" + - "ion for navigation and foraging decisions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a screen assembly (left, center and right screens) and respective conf" + + "iguration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OdorSpecification + public partial class ScreenAssembly { - private int _index; + private string _deviceType; + + private ScreenAssemblyCalibration _calibration; + + private int _displayIndex; + + private double _targetRenderFrequency; + + private double _targetUpdateFrequency; + + private string _textureAssetsDirectory; + + private double _brightness; - private double _concentration; + private double _contrast; - public OdorSpecification() + public ScreenAssembly() { - _concentration = 1D; + _deviceType = "ScreenAssembly"; + _calibration = new ScreenAssemblyCalibration(); + _displayIndex = 1; + _targetRenderFrequency = 60D; + _targetUpdateFrequency = 120D; + _textureAssetsDirectory = "Textures"; + _brightness = 0D; + _contrast = 1D; } - protected OdorSpecification(OdorSpecification other) + protected ScreenAssembly(ScreenAssembly other) { - _index = other._index; - _concentration = other._concentration; + _deviceType = other._deviceType; + _calibration = other._calibration; + _displayIndex = other._displayIndex; + _targetRenderFrequency = other._targetRenderFrequency; + _targetUpdateFrequency = other._targetUpdateFrequency; + _textureAssetsDirectory = other._textureAssetsDirectory; + _brightness = other._brightness; + _contrast = other._contrast; } - /// - /// Index of the odor to be used - /// - [Newtonsoft.Json.JsonPropertyAttribute("index", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Index of the odor to be used")] - public int Index + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _index; + return _deviceType; } set { - _index = value; + _deviceType = value; } } /// - /// Concentration of the odor + /// Screen assembly calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("concentration")] - [System.ComponentModel.DescriptionAttribute("Concentration of the odor")] - public double Concentration - { - get - { - return _concentration; - } - set - { - _concentration = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OdorSpecification(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OdorSpecification(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Index = " + _index + ", "); - stringBuilder.Append("Concentration = " + _concentration); - 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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Olfactometer - { - - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private OlfactometerCalibration _calibration; - - private int _whoAmI; - - private string _serialNumber; - - private string _portName; - - public Olfactometer() - { - _deviceType = "Olfactometer"; - _whoAmI = 1140; - } - - protected Olfactometer(Olfactometer other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _whoAmI = other._whoAmI; - _serialNumber = other._serialNumber; - _portName = other._portName; - } - - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - public string DeviceType + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Screen assembly calibration")] + public ScreenAssemblyCalibration Calibration { get { - return _deviceType; + return _calibration; } set { - _deviceType = value; + _calibration = value; } } /// - /// Device name + /// Display index /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("display_index")] + [System.ComponentModel.DescriptionAttribute("Display index")] + public int DisplayIndex { get { - return _deviceName; + return _displayIndex; } set { - _deviceName = value; + _displayIndex = value; } } /// - /// Additional settings + /// Target render frequency /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("target_render_frequency")] + [System.ComponentModel.DescriptionAttribute("Target render frequency")] + public double TargetRenderFrequency { get { - return _additionalSettings; + return _targetRenderFrequency; } set { - _additionalSettings = value; + _targetRenderFrequency = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - public OlfactometerCalibration Calibration + /// + /// Target update frequency + /// + [Newtonsoft.Json.JsonPropertyAttribute("target_update_frequency")] + [System.ComponentModel.DescriptionAttribute("Target update frequency")] + public double TargetUpdateFrequency { get { - return _calibration; + return _targetUpdateFrequency; } set { - _calibration = value; + _targetUpdateFrequency = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI + /// + /// Calibration directory + /// + [Newtonsoft.Json.JsonPropertyAttribute("texture_assets_directory")] + [System.ComponentModel.DescriptionAttribute("Calibration directory")] + public string TextureAssetsDirectory { get { - return _whoAmI; + return _textureAssetsDirectory; } set { - _whoAmI = value; + _textureAssetsDirectory = value; } } /// - /// Device serial number + /// Brightness /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber + [Newtonsoft.Json.JsonPropertyAttribute("brightness")] + [System.ComponentModel.DescriptionAttribute("Brightness")] + public double Brightness { get { - return _serialNumber; + return _brightness; } set { - _serialNumber = value; + _brightness = value; } } /// - /// Device port name + /// Contrast /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName + [Newtonsoft.Json.JsonPropertyAttribute("contrast")] + [System.ComponentModel.DescriptionAttribute("Contrast")] + public double Contrast { get { - return _portName; + return _contrast; } set { - _portName = value; + _contrast = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Olfactometer(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScreenAssembly(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Olfactometer(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssembly(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); + stringBuilder.Append("DisplayIndex = " + _displayIndex + ", "); + stringBuilder.Append("TargetRenderFrequency = " + _targetRenderFrequency + ", "); + stringBuilder.Append("TargetUpdateFrequency = " + _targetUpdateFrequency + ", "); + stringBuilder.Append("TextureAssetsDirectory = " + _textureAssetsDirectory + ", "); + stringBuilder.Append("Brightness = " + _brightness + ", "); + stringBuilder.Append("Contrast = " + _contrast); return true; } @@ -7730,148 +7482,104 @@ public override string ToString() /// - /// Olfactometer calibration class + /// Represents the calibration parameters for a screen assembly with three displays. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Olfactometer calibration class")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents the calibration parameters for a screen assembly with three displays.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerCalibration + public partial class ScreenAssemblyCalibration { - private string _deviceName; - - private OlfactometerCalibrationInput _input; - - private OlfactometerCalibrationOutput _output; - - private System.DateTimeOffset? _date; + private DisplayCalibration _left; - private string _description; + private DisplayCalibration _center; - private string _notes; + private DisplayCalibration _right; - public OlfactometerCalibration() + public ScreenAssemblyCalibration() { - _deviceName = "Olfactometer"; - _input = new OlfactometerCalibrationInput(); - _output = new OlfactometerCalibrationOutput(); - _description = "Calibration of the harp olfactometer device"; + _left = new DisplayCalibration(); + _center = new DisplayCalibration(); + _right = new DisplayCalibration(); } - protected OlfactometerCalibration(OlfactometerCalibration other) + protected ScreenAssemblyCalibration(ScreenAssemblyCalibration other) { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; + _left = other._left; + _center = other._center; + _right = other._right; } /// - /// Name of the device being calibrated + /// Left display calibration /// - [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 + [Newtonsoft.Json.JsonPropertyAttribute("left")] + [System.ComponentModel.DescriptionAttribute("Left display calibration")] + public DisplayCalibration Left { get { - return _input; + return _left; } set { - _input = value; + _left = value; } } + /// + /// Center display calibration + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public OlfactometerCalibrationOutput Output + [Newtonsoft.Json.JsonPropertyAttribute("center")] + [System.ComponentModel.DescriptionAttribute("Center display calibration")] + public DisplayCalibration Center { get { - return _output; + return _center; } set { - _output = value; + _center = value; } } + /// + /// Right display calibration + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes + [Newtonsoft.Json.JsonPropertyAttribute("right")] + [System.ComponentModel.DescriptionAttribute("Right display calibration")] + public DisplayCalibration Right { get { - return _notes; + return _right; } set { - _notes = value; + _right = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - 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 ScreenAssemblyCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibration(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new ScreenAssemblyCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); + stringBuilder.Append("Left = " + _left + ", "); + stringBuilder.Append("Center = " + _center + ", "); + stringBuilder.Append("Right = " + _right); return true; } @@ -7890,272 +7598,279 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerCalibrationInput + public partial class Session { - private System.Collections.Generic.Dictionary _channelConfig; + private string _aindBehaviorServicesPkgVersion; - public OlfactometerCalibrationInput() - { - _channelConfig = new System.Collections.Generic.Dictionary(); - } + private string _version; - protected OlfactometerCalibrationInput(OlfactometerCalibrationInput other) - { - _channelConfig = other._channelConfig; - } + private string _experiment; - /// - /// Configuration of olfactometer channels - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("channel_config")] - [System.ComponentModel.DescriptionAttribute("Configuration of olfactometer channels")] - public System.Collections.Generic.Dictionary ChannelConfig - { - get - { - return _channelConfig; - } - set - { - _channelConfig = value; - } - } + private System.Collections.Generic.List _experimenter; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationInput(this))); - } + private System.DateTimeOffset _date; - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationInput(this)); - } + private string _sessionName; - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("ChannelConfig = " + _channelConfig); - return true; - } + private string _subject; - 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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerCalibrationOutput - { + private string _notes; - public OlfactometerCalibrationOutput() - { - } + private string _commitHash; - protected OlfactometerCalibrationOutput(OlfactometerCalibrationOutput other) - { - } + private bool _allowDirtyRepo; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerCalibrationOutput(this))); - } + private bool _skipHardwareValidation; - public System.IObservable Generate(System.IObservable source) + public Session() { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerCalibrationOutput(this)); + _aindBehaviorServicesPkgVersion = "0.13.6"; + _version = "0.13.6"; + _experimenter = new System.Collections.Generic.List(); + _allowDirtyRepo = false; + _skipHardwareValidation = false; } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected Session(Session other) { - return false; + _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; + _version = other._version; + _experiment = other._experiment; + _experimenter = other._experimenter; + _date = other._date; + _sessionName = other._sessionName; + _subject = other._subject; + _notes = other._notes; + _commitHash = other._commitHash; + _allowDirtyRepo = other._allowDirtyRepo; + _skipHardwareValidation = other._skipHardwareValidation; } - public override string ToString() + [Newtonsoft.Json.JsonPropertyAttribute("aind_behavior_services_pkg_version")] + public string AindBehaviorServicesPkgVersion { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _aindBehaviorServicesPkgVersion; + } + set + { + _aindBehaviorServicesPkgVersion = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Harp Olfactometer available channel - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OlfactometerChannelConfig - { - - private int _channelIndex; - - private OlfactometerChannelType _channelType; - - private OlfactometerChannelConfigFlowRateCapacity _flowRateCapacity; - - private double _flowRate; - - private string _odorant; - - private double? _odorantDilution; - - public OlfactometerChannelConfig() - { - _channelType = AindVrForagingDataSchema.OlfactometerChannelType.Odor; - _flowRateCapacity = AindVrForagingDataSchema.OlfactometerChannelConfigFlowRateCapacity._100; - _flowRate = 100D; } - protected OlfactometerChannelConfig(OlfactometerChannelConfig other) + [Newtonsoft.Json.JsonPropertyAttribute("version")] + public string Version { - _channelIndex = other._channelIndex; - _channelType = other._channelType; - _flowRateCapacity = other._flowRateCapacity; - _flowRate = other._flowRate; - _odorant = other._odorant; - _odorantDilution = other._odorantDilution; + get + { + return _version; + } + set + { + _version = value; + } } - [Newtonsoft.Json.JsonPropertyAttribute("channel_index", Required=Newtonsoft.Json.Required.Always)] - public int ChannelIndex + /// + /// Name of the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("experiment")] + [System.ComponentModel.DescriptionAttribute("Name of the experiment")] + public string Experiment { get { - return _channelIndex; + return _experiment; } set { - _channelIndex = value; + _experiment = value; } } + /// + /// Name of the experimenter + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("channel_type")] - public OlfactometerChannelType ChannelType + [Newtonsoft.Json.JsonPropertyAttribute("experimenter")] + [System.ComponentModel.DescriptionAttribute("Name of the experimenter")] + public System.Collections.Generic.List Experimenter { get { - return _channelType; + return _experimenter; } set { - _channelType = value; + _experimenter = value; } } + /// + /// Date of the experiment + /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("flow_rate_capacity")] - public OlfactometerChannelConfigFlowRateCapacity FlowRateCapacity + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the experiment")] + public System.DateTimeOffset Date { get { - return _flowRateCapacity; + return _date; } set { - _flowRateCapacity = value; + _date = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("flow_rate")] - public double FlowRate + [Newtonsoft.Json.JsonIgnoreAttribute()] + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Xml.Serialization.XmlElementAttribute("Date")] + public string DateXml { get { - return _flowRate; + return _date.ToString("o"); } set { - _flowRate = value; + _date = System.DateTimeOffset.Parse(value); } } - [Newtonsoft.Json.JsonPropertyAttribute("odorant")] - public string Odorant + /// + /// Name of the session. This will be used to create a folder in the root path. If not provided, it will be generated using subject and date. + /// + [Newtonsoft.Json.JsonPropertyAttribute("session_name")] + [System.ComponentModel.DescriptionAttribute("Name of the session. This will be used to create a folder in the root path. If no" + + "t provided, it will be generated using subject and date.")] + public string SessionName { get { - return _odorant; + return _sessionName; } set { - _odorant = value; + _sessionName = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odorant_dilution")] - public double? OdorantDilution + /// + /// Name of the subject + /// + [Newtonsoft.Json.JsonPropertyAttribute("subject", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Name of the subject")] + public string Subject { get { - return _odorantDilution; + return _subject; } set { - _odorantDilution = value; + _subject = value; } } - public System.IObservable Generate() + /// + /// Notes about the experiment + /// + [Newtonsoft.Json.JsonPropertyAttribute("notes")] + [System.ComponentModel.DescriptionAttribute("Notes about the experiment")] + public string Notes { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OlfactometerChannelConfig(this))); + get + { + return _notes; + } + set + { + _notes = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// Commit hash of the repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("commit_hash")] + [System.ComponentModel.DescriptionAttribute("Commit hash of the repository")] + public string CommitHash { - return System.Reactive.Linq.Observable.Select(source, _ => new OlfactometerChannelConfig(this)); + get + { + return _commitHash; + } + set + { + _commitHash = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("ChannelIndex = " + _channelIndex + ", "); - stringBuilder.Append("ChannelType = " + _channelType + ", "); - stringBuilder.Append("FlowRateCapacity = " + _flowRateCapacity + ", "); - stringBuilder.Append("FlowRate = " + _flowRate + ", "); - stringBuilder.Append("Odorant = " + _odorant + ", "); - stringBuilder.Append("OdorantDilution = " + _odorantDilution); + /// + /// Allow running from a dirty repository + /// + [Newtonsoft.Json.JsonPropertyAttribute("allow_dirty_repo")] + [System.ComponentModel.DescriptionAttribute("Allow running from a dirty repository")] + public bool AllowDirtyRepo + { + get + { + return _allowDirtyRepo; + } + set + { + _allowDirtyRepo = value; + } + } + + /// + /// Skip hardware validation + /// + [Newtonsoft.Json.JsonPropertyAttribute("skip_hardware_validation")] + [System.ComponentModel.DescriptionAttribute("Skip hardware validation")] + public bool SkipHardwareValidation + { + get + { + return _skipHardwareValidation; + } + set + { + _skipHardwareValidation = value; + } + } + + public System.IObservable Generate() + { + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Session(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new Session(this)); + } + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + { + stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); + stringBuilder.Append("Version = " + _version + ", "); + stringBuilder.Append("Experiment = " + _experiment + ", "); + stringBuilder.Append("Experimenter = " + _experimenter + ", "); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("SessionName = " + _sessionName + ", "); + stringBuilder.Append("Subject = " + _subject + ", "); + stringBuilder.Append("Notes = " + _notes + ", "); + stringBuilder.Append("CommitHash = " + _commitHash + ", "); + stringBuilder.Append("AllowDirtyRepo = " + _allowDirtyRepo + ", "); + stringBuilder.Append("SkipHardwareValidation = " + _skipHardwareValidation); return true; } @@ -8175,132 +7890,63 @@ public override string ToString() /// - /// Channel type + /// A patch update function that sets the target to a specific value. + /// + ///Update in the form of x = value. + ///This function directly sets the target parameter to a value drawn from the + ///specified distribution, ignoring the current value. Useful for resetting + ///parameters or applying discrete changes. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"A patch update function that sets the target to a specific value. - /// - /// A RewardFunction that is applied when the animal enters the patch. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal enters the patch.")] + Update in the form of x = value. + This function directly sets the target parameter to a value drawn from the + specified distribution, ignoring the current value. Useful for resetting + parameters or applying discrete changes.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OnThisPatchEntryRewardFunction : RewardFunction + public partial class SetValueFunction : PatchUpdateFunction { - private PatchUpdateFunction _amount; - - private PatchUpdateFunction _probability; - - private PatchUpdateFunction _available; - - private string _rule; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _value; - public OnThisPatchEntryRewardFunction() + public SetValueFunction() { - _rule = "OnThisPatchEntry"; } - protected OnThisPatchEntryRewardFunction(OnThisPatchEntryRewardFunction other) : + protected SetValueFunction(SetValueFunction other) : base(other) { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; - } - - /// - /// Defines the amount of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } - - /// - /// Defines the probability of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability - { - get - { - return _probability; - } - set - { - _probability = value; - } + _value = other._value; } /// - /// Defines the amount of reward available replenished in the patch per rule unit. + /// Sets the value of the target to this value. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available - { - get - { - return _available; - } - set - { - _available = value; - } - } - - /// - /// Rule to trigger reward function - /// - [Newtonsoft.Json.JsonPropertyAttribute("rule")] - [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] - public string Rule + [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Sets the value of the target to this value.")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Value { get { - return _rule; + return _value; } set { - _rule = value; + _value = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OnThisPatchEntryRewardFunction(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SetValueFunction(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OnThisPatchEntryRewardFunction(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new SetValueFunction(this)); } protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) @@ -8309,140 +7955,86 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule); + stringBuilder.Append("Value = " + _value); return true; } } /// - /// Defines operant conditioning logic for reward delivery in the VR foraging task. - /// - ///This class controls when and how rewards are delivered based on animal behavior, - ///implementing stopping requirements, collection timeouts, and spatial constraints. + /// Represents 2D dimensions with width and height. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines operant conditioning logic for reward delivery in the VR foraging task.\n\n" + - "This class controls when and how rewards are delivered based on animal behavior," + - "\nimplementing stopping requirements, collection timeouts, and spatial constraint" + - "s.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents 2D dimensions with width and height.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OperantLogic + public partial class Size { - private bool _isOperant; - - private Distribution _stopDuration; - - private double _timeToCollectReward; + private double _width; - private double _graceDistanceThreshold; + private double _height; - public OperantLogic() + public Size() { - _isOperant = true; - _stopDuration = new Distribution(); - _timeToCollectReward = 100000D; - _graceDistanceThreshold = 10D; + _width = 0D; + _height = 0D; } - protected OperantLogic(OperantLogic other) + protected Size(Size other) { - _isOperant = other._isOperant; - _stopDuration = other._stopDuration; - _timeToCollectReward = other._timeToCollectReward; - _graceDistanceThreshold = other._graceDistanceThreshold; + _width = other._width; + _height = other._height; } /// - /// Will the trial implement operant logic + /// Width of the texture /// - [Newtonsoft.Json.JsonPropertyAttribute("is_operant")] - [System.ComponentModel.DescriptionAttribute("Will the trial implement operant logic")] - public bool IsOperant + [Newtonsoft.Json.JsonPropertyAttribute("width")] + [System.ComponentModel.DescriptionAttribute("Width of the texture")] + public double Width { get { - return _isOperant; + return _width; } set { - _isOperant = value; + _width = value; } } /// - /// Duration (s) the animal must stop for to lock its choice + /// Height of the texture /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("stop_duration")] - [System.ComponentModel.DescriptionAttribute("Duration (s) the animal must stop for to lock its choice")] - public Distribution StopDuration + [Newtonsoft.Json.JsonPropertyAttribute("height")] + [System.ComponentModel.DescriptionAttribute("Height of the texture")] + public double Height { get { - return _stopDuration; + return _height; } set { - _stopDuration = value; + _height = value; } } - /// - /// Time(s) the animal has to collect the reward - /// - [Newtonsoft.Json.JsonPropertyAttribute("time_to_collect_reward")] - [System.ComponentModel.DescriptionAttribute("Time(s) the animal has to collect the reward")] - public double TimeToCollectReward + public System.IObservable Generate() { - get - { - return _timeToCollectReward; - } - set - { - _timeToCollectReward = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Size(this))); } - /// - /// Virtual distance (cm) the animal must be within to not abort the current choice - /// - [Newtonsoft.Json.JsonPropertyAttribute("grace_distance_threshold")] - [System.ComponentModel.DescriptionAttribute("Virtual distance (cm) the animal must be within to not abort the current choice")] - public double GraceDistanceThreshold - { - get - { - return _graceDistanceThreshold; - } - set - { - _graceDistanceThreshold = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperantLogic(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new OperantLogic(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Size(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("IsOperant = " + _isOperant + ", "); - stringBuilder.Append("StopDuration = " + _stopDuration + ", "); - stringBuilder.Append("TimeToCollectReward = " + _timeToCollectReward + ", "); - stringBuilder.Append("GraceDistanceThreshold = " + _graceDistanceThreshold); + stringBuilder.Append("Width = " + _width + ", "); + stringBuilder.Append("Height = " + _height); return true; } @@ -8462,469 +8054,294 @@ public override string ToString() /// - /// Master control class for all operational hardware systems. - /// - ///This class aggregates all the hardware control specifications including - ///movable spout, odor delivery, position tracking, and audio systems. - ///It provides a centralized configuration point for all task hardware. + /// Spinnaker camera device configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Master control class for all operational hardware systems. - - This class aggregates all the hardware control specifications including - movable spout, odor delivery, position tracking, and audio systems. - It provides a centralized configuration point for all task hardware.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Spinnaker camera device configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OperationControl + public partial class SpinnakerCamera { - private MovableSpoutControl _movableSpoutControl; + private string _deviceType; - private OdorControl _odorControl; + private BaseModel _calibration; - private PositionControl _positionControl; + private string _serialNumber; - private AudioControl _audioControl; + private int _binning; - public OperationControl() + private SpinnakerCameraColorProcessing _colorProcessing; + + private int _exposure; + + private double _gain; + + private double? _gamma; + + private SpinnakerCameraAdcBitDepth? _adcBitDepth; + + private SpinnakerCameraPixelFormat? _pixelFormat; + + private Rect _regionOfInterest; + + private VideoWriter _videoWriter; + + public SpinnakerCamera() { - _movableSpoutControl = new MovableSpoutControl(); - _odorControl = new OdorControl(); - _positionControl = new PositionControl(); - _audioControl = new AudioControl(); + _deviceType = "SpinnakerCamera"; + _binning = 1; + _colorProcessing = SpinnakerCameraColorProcessing.Default; + _exposure = 1000; + _gain = 0D; + _adcBitDepth = SpinnakerCameraAdcBitDepth.Adc8bit; + _pixelFormat = SpinnakerCameraPixelFormat.Mono8; + _regionOfInterest = new Rect(); } - protected OperationControl(OperationControl other) + protected SpinnakerCamera(SpinnakerCamera other) { - _movableSpoutControl = other._movableSpoutControl; - _odorControl = other._odorControl; - _positionControl = other._positionControl; - _audioControl = other._audioControl; + _deviceType = other._deviceType; + _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; } - /// - /// Control of the movable spout - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("movable_spout_control")] - [System.ComponentModel.DescriptionAttribute("Control of the movable spout")] - public MovableSpoutControl MovableSpoutControl + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { get { - return _movableSpoutControl; + return _deviceType; } set { - _movableSpoutControl = value; + _deviceType = value; } } /// - /// Control of the odor + /// Calibration for the device. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_control")] - [System.ComponentModel.DescriptionAttribute("Control of the odor")] - public OdorControl OdorControl + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { get { - return _odorControl; + return _calibration; } set { - _odorControl = value; + _calibration = value; } } /// - /// Control of the position + /// Camera serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("position_control")] - [System.ComponentModel.DescriptionAttribute("Control of the position")] - public PositionControl PositionControl + [Newtonsoft.Json.JsonPropertyAttribute("serial_number", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Camera serial number")] + public string SerialNumber { get { - return _positionControl; + return _serialNumber; } set { - _positionControl = value; + _serialNumber = value; } } /// - /// Control of the audio + /// Binning /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("audio_control")] - [System.ComponentModel.DescriptionAttribute("Control of the audio")] - public AudioControl AudioControl + [Newtonsoft.Json.JsonPropertyAttribute("binning")] + [System.ComponentModel.DescriptionAttribute("Binning")] + public int Binning { get { - return _audioControl; + return _binning; } set { - _audioControl = value; + _binning = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperationControl(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OperationControl(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("MovableSpoutControl = " + _movableSpoutControl + ", "); - stringBuilder.Append("OdorControl = " + _odorControl + ", "); - stringBuilder.Append("PositionControl = " + _positionControl + ", "); - stringBuilder.Append("AudioControl = " + _audioControl); - return true; - } - - public override string ToString() + /// + /// Color processing + /// + [Newtonsoft.Json.JsonPropertyAttribute("color_processing")] + [System.ComponentModel.DescriptionAttribute("Color processing")] + public SpinnakerCameraColorProcessing ColorProcessing { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _colorProcessing; + } + set + { + _colorProcessing = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// A RewardFunction that is applied when the animal is outside of the patch. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is outside of the patch.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class OutsideRewardFunction : RewardFunction - { - - private PatchUpdateFunction _amount; - - private PatchUpdateFunction _probability; - - private PatchUpdateFunction _available; - - private OutsideRewardFunctionRule _rule; - - private double _delay; - - public OutsideRewardFunction() - { - _rule = AindVrForagingDataSchema.OutsideRewardFunctionRule.OnTime; - _delay = 0D; - } - - protected OutsideRewardFunction(OutsideRewardFunction other) : - base(other) - { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; - _delay = other._delay; } /// - /// Defines the amount of reward replenished per rule unit. + /// Exposure time /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount + [Newtonsoft.Json.JsonPropertyAttribute("exposure")] + [System.ComponentModel.DescriptionAttribute("Exposure time")] + public int Exposure { get { - return _amount; + return _exposure; } set { - _amount = value; + _exposure = value; } } /// - /// Defines the probability of reward replenished per rule unit. + /// Gain /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability + [Newtonsoft.Json.JsonPropertyAttribute("gain")] + [System.ComponentModel.DescriptionAttribute("Gain")] + public double Gain { get { - return _probability; + return _gain; } set { - _probability = value; + _gain = value; } } /// - /// Defines the amount of reward available replenished in the patch per rule unit. + /// Gamma. If None, will disable gamma correction. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available + [Newtonsoft.Json.JsonPropertyAttribute("gamma")] + [System.ComponentModel.DescriptionAttribute("Gamma. If None, will disable gamma correction.")] + public double? Gamma { get { - return _available; + return _gamma; } set { - _available = value; + _gamma = value; } } /// - /// Rule to trigger reward function - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rule")] - [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] - public OutsideRewardFunctionRule Rule - { - get - { - return _rule; - } - set - { - _rule = value; - } - } - - /// - /// Delay (s) before the replenishment starts after the rule is triggered. - /// - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("Delay (s) before the replenishment starts after the rule is triggered.")] - public double Delay - { - get - { - return _delay; - } - set - { - _delay = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OutsideRewardFunction(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new OutsideRewardFunction(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule + ", "); - stringBuilder.Append("Delay = " + _delay); - return true; - } - } - - - /// - /// Represents statistics for a patch in the VR foraging task. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents statistics for a patch in the VR foraging task.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Patch - { - - private string _label; - - private int _stateIndex; - - private OdorSpecification _odorSpecification; - - private RewardSpecification _rewardSpecification; - - private PatchVirtualSitesGenerator _patchVirtualSitesGenerator; - - private System.Collections.Generic.List _patchTerminators; - - public Patch() - { - _label = ""; - _stateIndex = 0; - _rewardSpecification = new RewardSpecification(); - _patchVirtualSitesGenerator = new PatchVirtualSitesGenerator(); - _patchTerminators = new System.Collections.Generic.List(); - } - - protected Patch(Patch other) - { - _label = other._label; - _stateIndex = other._stateIndex; - _odorSpecification = other._odorSpecification; - _rewardSpecification = other._rewardSpecification; - _patchVirtualSitesGenerator = other._patchVirtualSitesGenerator; - _patchTerminators = other._patchTerminators; - } - - /// - /// Label of the patch - /// - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the patch")] - public string Label - { - get - { - return _label; - } - set - { - _label = value; - } - } - - /// - /// Index of the state - /// - [Newtonsoft.Json.JsonPropertyAttribute("state_index")] - [System.ComponentModel.DescriptionAttribute("Index of the state")] - public int StateIndex - { - get - { - return _stateIndex; - } - set - { - _stateIndex = value; - } - } - - /// - /// The optional odor specification of the patch + /// ADC bit depth. If None will be left as default. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] - [System.ComponentModel.DescriptionAttribute("The optional odor specification of the patch")] - public OdorSpecification OdorSpecification + [Newtonsoft.Json.JsonPropertyAttribute("adc_bit_depth")] + [System.ComponentModel.DescriptionAttribute("ADC bit depth. If None will be left as default.")] + public SpinnakerCameraAdcBitDepth? AdcBitDepth { get { - return _odorSpecification; + return _adcBitDepth; } set { - _odorSpecification = value; + _adcBitDepth = value; } } /// - /// The optional reward specification of the patch + /// Pixel format. If None will be left as default. /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] - [System.ComponentModel.DescriptionAttribute("The optional reward specification of the patch")] - public RewardSpecification RewardSpecification + [Newtonsoft.Json.JsonPropertyAttribute("pixel_format")] + [System.ComponentModel.DescriptionAttribute("Pixel format. If None will be left as default.")] + public SpinnakerCameraPixelFormat? PixelFormat { get { - return _rewardSpecification; + return _pixelFormat; } set { - _rewardSpecification = value; + _pixelFormat = value; } } /// - /// Virtual site generation specification + /// Region of interest /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("patch_virtual_sites_generator")] - [System.ComponentModel.DescriptionAttribute("Virtual site generation specification")] - public PatchVirtualSitesGenerator PatchVirtualSitesGenerator + [Newtonsoft.Json.JsonPropertyAttribute("region_of_interest")] + [System.ComponentModel.DescriptionAttribute("Region of interest")] + public Rect RegionOfInterest { get { - return _patchVirtualSitesGenerator; + return _regionOfInterest; } set { - _patchVirtualSitesGenerator = value; + _regionOfInterest = value; } } /// - /// The optional termination specification of the patch + /// Video writer. If not provided, no video will be saved. /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("patch_terminators")] - [System.ComponentModel.DescriptionAttribute("The optional termination specification of the patch")] - public System.Collections.Generic.List PatchTerminators + [Newtonsoft.Json.JsonPropertyAttribute("video_writer")] + [System.ComponentModel.DescriptionAttribute("Video writer. If not provided, no video will be saved.")] + public VideoWriter VideoWriter { get { - return _patchTerminators; + return _videoWriter; } set { - _patchTerminators = value; + _videoWriter = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Patch(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Patch(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("StateIndex = " + _stateIndex + ", "); - stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); - stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); - stringBuilder.Append("PatchVirtualSitesGenerator = " + _patchVirtualSitesGenerator + ", "); - stringBuilder.Append("PatchTerminators = " + _patchTerminators); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("Binning = " + _binning + ", "); + stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); + stringBuilder.Append("Exposure = " + _exposure + ", "); + stringBuilder.Append("Gain = " + _gain + ", "); + stringBuilder.Append("Gamma = " + _gamma + ", "); + stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); + stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); + stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); + stringBuilder.Append("VideoWriter = " + _videoWriter); return true; } @@ -8944,5192 +8361,549 @@ public override string ToString() /// - /// A RewardFunction that is applied when the animal is inside the patch. - ///For the purposes of this function post-patch and inter-patch are excluded. + /// ADC bit depth options for Spinnaker cameras. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is applied when the animal is inside the patch.\nFor the pur" + - "poses of this function post-patch and inter-patch are excluded.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchRewardFunction : RewardFunction + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraAdcBitDepth { - private PatchUpdateFunction _amount; + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Adc8bit = 0, - private PatchUpdateFunction _probability; + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Adc10bit = 1, - private PatchUpdateFunction _available; + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Adc12bit = 2, + } + + + /// + /// Pixel format options for Spinnaker cameras. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum SpinnakerCameraPixelFormat + { - private PatchRewardFunctionRule _rule; + [System.Runtime.Serialization.EnumMemberAttribute(Value="0")] + Mono8 = 0, - public PatchRewardFunction() - { - _rule = AindVrForagingDataSchema.PatchRewardFunctionRule.OnReward; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="1")] + Mono16 = 1, - protected PatchRewardFunction(PatchRewardFunction other) : - base(other) - { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="2")] + Rgb8packed = 2, - /// - /// Defines the amount of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="3")] + Bayergr8 = 3, - /// - /// Defines the probability of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability - { - get - { - return _probability; - } - set - { - _probability = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="4")] + Bayerrg8 = 4, - /// - /// Defines the amount of reward available replenished in the patch per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available - { - get - { - return _available; - } - set - { - _available = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="5")] + Bayergb8 = 5, - /// - /// Rule to trigger reward function - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rule")] - [System.ComponentModel.DescriptionAttribute("Rule to trigger reward function")] - public PatchRewardFunctionRule Rule - { - get - { - return _rule; - } - set - { - _rule = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="6")] + Bayerbg8 = 6, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchRewardFunction(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="7")] + Bayergr16 = 7, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchRewardFunction(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="8")] + Bayerrg16 = 8, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule); - return true; - } - } - - - /// - /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "terminator_type")] - [JsonInheritanceAttribute("OnRejection", typeof(PatchTerminatorOnRejection))] - [JsonInheritanceAttribute("OnChoice", typeof(PatchTerminatorOnChoice))] - [JsonInheritanceAttribute("OnReward", typeof(PatchTerminatorOnReward))] - [JsonInheritanceAttribute("OnTime", typeof(PatchTerminatorOnTime))] - [JsonInheritanceAttribute("OnDistance", typeof(PatchTerminatorOnDistance))] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + - "\" reward sites.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="9")] + Bayergb16 = 9, - public PatchTerminator() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="10")] + Bayerbg16 = 10, - protected PatchTerminator(PatchTerminator other) - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="11")] + Mono12packed = 11, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminator(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="12")] + Bayergr12packed = 12, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminator(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="13")] + Bayerrg12packed = 13, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="14")] + Bayergb12packed = 14, - 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(); - } - } - - - /// - /// Terminates the patch after "count" choices. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" choices.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnChoice : PatchTerminator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="15")] + Bayerbg12packed = 15, - private Distribution _count; + [System.Runtime.Serialization.EnumMemberAttribute(Value="16")] + Yuv411packed = 16, - public PatchTerminatorOnChoice() - { - _count = new Distribution(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="17")] + Yuv422packed = 17, - protected PatchTerminatorOnChoice(PatchTerminatorOnChoice other) : - base(other) - { - _count = other._count; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="18")] + Yuv444packed = 18, - /// - /// Number of choices the animal must make to terminate the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count")] - [System.ComponentModel.DescriptionAttribute("Number of choices the animal must make to terminate the patch")] - public Distribution Count - { - get - { - return _count; - } - set - { - _count = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="19")] + Mono12p = 19, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnChoice(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="20")] + Bayergr12p = 20, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnChoice(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="21")] + Bayerrg12p = 21, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// Terminates the patch after a "count" distance. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" distance.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnDistance : PatchTerminator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="22")] + Bayergb12p = 22, - private Distribution _count; + [System.Runtime.Serialization.EnumMemberAttribute(Value="23")] + Bayerbg12p = 23, - public PatchTerminatorOnDistance() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="24")] + Ycbcr8 = 24, - protected PatchTerminatorOnDistance(PatchTerminatorOnDistance other) : - base(other) - { - _count = other._count; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="25")] + Ycbcr4228 = 25, - /// - /// Number of distance units to wait before terminating the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of distance units to wait before terminating the patch")] - public Distribution Count - { - get - { - return _count; - } - set - { - _count = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="26")] + Ycbcr4118 = 26, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnDistance(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="27")] + Bgr8 = 27, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnDistance(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="28")] + Bgra8 = 28, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// Terminates the patch after a reward site where the animal does not stop in "count" reward sites. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a reward site where the animal does not stop in \"count" + - "\" reward sites.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnRejection : PatchTerminator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="29")] + Mono10packed = 29, - private Distribution _count; + [System.Runtime.Serialization.EnumMemberAttribute(Value="30")] + Bayergr10packed = 30, - public PatchTerminatorOnRejection() - { - _count = new Distribution(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="31")] + Bayerrg10packed = 31, - protected PatchTerminatorOnRejection(PatchTerminatorOnRejection other) : - base(other) - { - _count = other._count; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="32")] + Bayergb10packed = 32, - /// - /// Number of reward sites the animal must not stop in to terminate the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count")] - [System.ComponentModel.DescriptionAttribute("Number of reward sites the animal must not stop in to terminate the patch")] - public Distribution Count - { - get - { - return _count; - } - set - { - _count = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="33")] + Bayerbg10packed = 33, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnRejection(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="34")] + Mono10p = 34, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnRejection(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="35")] + Bayergr10p = 35, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// Terminates the patch after "count" rewards. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after \"count\" rewards.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnReward : PatchTerminator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="36")] + Bayerrg10p = 36, - private Distribution _count; + [System.Runtime.Serialization.EnumMemberAttribute(Value="37")] + Bayergb10p = 37, - public PatchTerminatorOnReward() - { - _count = new Distribution(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="38")] + Bayerbg10p = 38, - protected PatchTerminatorOnReward(PatchTerminatorOnReward other) : - base(other) - { - _count = other._count; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="39")] + Mono1p = 39, - /// - /// Number of rewards the animal must collect to terminate the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count")] - [System.ComponentModel.DescriptionAttribute("Number of rewards the animal must collect to terminate the patch")] - public Distribution Count - { - get - { - return _count; - } - set - { - _count = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="40")] + Mono2p = 40, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnReward(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="41")] + Mono4p = 41, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnReward(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="42")] + Mono8s = 42, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// Terminates the patch after a "count" seconds. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Terminates the patch after a \"count\" seconds.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchTerminatorOnTime : PatchTerminator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="43")] + Mono10 = 43, - private Distribution _count; + [System.Runtime.Serialization.EnumMemberAttribute(Value="44")] + Mono12 = 44, - public PatchTerminatorOnTime() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="45")] + Mono14 = 45, - protected PatchTerminatorOnTime(PatchTerminatorOnTime other) : - base(other) - { - _count = other._count; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="46")] + Mono16s = 46, - /// - /// Number of seconds to wait before terminating the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("count", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Number of seconds to wait before terminating the patch")] - public Distribution Count - { - get - { - return _count; - } - set - { - _count = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="47")] + Mono32f = 47, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchTerminatorOnTime(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="48")] + Bayerbg10 = 48, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchTerminatorOnTime(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="49")] + Bayerbg12 = 49, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Count = " + _count); - return true; - } - } - - - /// - /// A patch update function that applies a clamped rate-based update. - /// - ///Update in the form of x = clamp(x + rate * tick_value). - ///This function updates values at a specified rate while keeping results within - ///defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - ///time, distance, choices). - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] - [JsonInheritanceAttribute("ClampedRateFunction", typeof(ClampedRateFunction))] - [JsonInheritanceAttribute("ClampedMultiplicativeRateFunction", typeof(ClampedMultiplicativeRateFunction))] - [JsonInheritanceAttribute("SetValueFunction", typeof(SetValueFunction))] - [JsonInheritanceAttribute("LookupTableFunction", typeof(LookupTableFunction))] - [JsonInheritanceAttribute("CtcmFunction", typeof(CtcmFunction))] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that applies a clamped rate-based update. - - Update in the form of x = clamp(x + rate * tick_value). - This function updates values at a specified rate while keeping results within - defined minimum and maximum bounds. The rate is applied per rule unit (e.g., - time, distance, choices).")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchUpdateFunction - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="50")] + Bayergb10 = 50, - public PatchUpdateFunction() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="51")] + Bayergb12 = 51, - protected PatchUpdateFunction(PatchUpdateFunction other) - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="52")] + Bayergr10 = 52, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchUpdateFunction(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="53")] + Bayergr12 = 53, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchUpdateFunction(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="54")] + Bayerrg10 = 54, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="55")] + Bayerrg12 = 55, - 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(); - } - } - - - /// - /// Defines the generation specifications for all virtual site types within a patch. - /// - ///This class contains generators for all the different types of virtual sites - ///that can appear within a patch environment. Each generator defines how sites - ///of that type should be created with their properties and distributions. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines the generation specifications for all virtual site types within a patch. - - This class contains generators for all the different types of virtual sites - that can appear within a patch environment. Each generator defines how sites - of that type should be created with their properties and distributions.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PatchVirtualSitesGenerator - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="56")] + Rgba8 = 56, - private VirtualSiteGenerator _interSite; + [System.Runtime.Serialization.EnumMemberAttribute(Value="57")] + Rgba10 = 57, - private VirtualSiteGenerator _interPatch; + [System.Runtime.Serialization.EnumMemberAttribute(Value="58")] + Rgba10p = 58, - private VirtualSiteGenerator _postPatch; + [System.Runtime.Serialization.EnumMemberAttribute(Value="59")] + Rgba12 = 59, - private VirtualSiteGenerator _rewardSite; + [System.Runtime.Serialization.EnumMemberAttribute(Value="60")] + Rgba12p = 60, - public PatchVirtualSitesGenerator() - { - _interSite = new VirtualSiteGenerator(); - _interPatch = new VirtualSiteGenerator(); - _rewardSite = new VirtualSiteGenerator(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="61")] + Rgba14 = 61, - protected PatchVirtualSitesGenerator(PatchVirtualSitesGenerator other) - { - _interSite = other._interSite; - _interPatch = other._interPatch; - _postPatch = other._postPatch; - _rewardSite = other._rewardSite; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="62")] + Rgba16 = 62, - /// - /// Generator of the inter-site virtual sites - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("inter_site")] - [System.ComponentModel.DescriptionAttribute("Generator of the inter-site virtual sites")] - public VirtualSiteGenerator InterSite - { - get - { - return _interSite; - } - set - { - _interSite = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="63")] + Rgb8 = 63, - /// - /// Generator of the inter-patch virtual sites - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("inter_patch")] - [System.ComponentModel.DescriptionAttribute("Generator of the inter-patch virtual sites")] - public VirtualSiteGenerator InterPatch - { - get - { - return _interPatch; - } - set - { - _interPatch = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="64")] + Rgb8Planar = 64, - /// - /// Generator of the post-patch virtual sites - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("post_patch")] - [System.ComponentModel.DescriptionAttribute("Generator of the post-patch virtual sites")] - public VirtualSiteGenerator PostPatch - { - get - { - return _postPatch; - } - set - { - _postPatch = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="65")] + Rgb10 = 65, - /// - /// Generator of the reward-site virtual sites - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_site")] - [System.ComponentModel.DescriptionAttribute("Generator of the reward-site virtual sites")] - public VirtualSiteGenerator RewardSite - { - get - { - return _rewardSite; - } - set - { - _rewardSite = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="66")] + Rgb10Planar = 66, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PatchVirtualSitesGenerator(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="67")] + Rgb10p = 67, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PatchVirtualSitesGenerator(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="68")] + Rgb10p32 = 68, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("InterSite = " + _interSite + ", "); - stringBuilder.Append("InterPatch = " + _interPatch + ", "); - stringBuilder.Append("PostPatch = " + _postPatch + ", "); - stringBuilder.Append("RewardSite = " + _rewardSite); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="69")] + Rgb12 = 69, - 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(); - } - } - - - /// - /// A custom probability density function distribution. - /// - ///Allows defining arbitrary discrete distributions by specifying - ///probability values and their corresponding indices. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A custom probability density function distribution.\n\nAllows defining arbitrary di" + - "screte distributions by specifying\nprobability values and their corresponding in" + - "dices.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PdfDistribution : Distribution - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="70")] + Rgb12Planar = 70, - private PdfDistributionParameters _distributionParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="71")] + Rgb12p = 71, - private TruncationParameters _truncationParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="72")] + Rgb14 = 72, - private ScalingParameters _scalingParameters; + [System.Runtime.Serialization.EnumMemberAttribute(Value="73")] + Rgb16 = 73, - public PdfDistribution() - { - _distributionParameters = new PdfDistributionParameters(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="74")] + Rgb16s = 74, - protected PdfDistribution(PdfDistribution other) : - base(other) - { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="75")] + Rgb32f = 75, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="76")] + Rgb16Planar = 76, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="77")] + Rgb565p = 77, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="78")] + Bgra10 = 78, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PdfDistribution(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="79")] + Bgra10p = 79, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PdfDistribution(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="80")] + Bgra12 = 80, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a custom probability density function distribution. - /// - ///Defined by explicit probability values and their corresponding indices. - ///Probabilities are automatically normalized to sum to 1. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a custom probability density function distribution.\n\nDefined by ex" + - "plicit probability values and their corresponding indices.\nProbabilities are aut" + - "omatically normalized to sum to 1.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PdfDistributionParameters - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="81")] + Bgra12p = 81, - private string _family; + [System.Runtime.Serialization.EnumMemberAttribute(Value="82")] + Bgra14 = 82, - private System.Collections.Generic.List _pdf; + [System.Runtime.Serialization.EnumMemberAttribute(Value="83")] + Bgra16 = 83, - private System.Collections.Generic.List _index; + [System.Runtime.Serialization.EnumMemberAttribute(Value="84")] + Rgba32f = 84, - public PdfDistributionParameters() - { - _family = "Pdf"; - _pdf = new System.Collections.Generic.List(); - _index = new System.Collections.Generic.List(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="85")] + Bgr10 = 85, - protected PdfDistributionParameters(PdfDistributionParameters other) - { - _family = other._family; - _pdf = other._pdf; - _index = other._index; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="86")] + Bgr10p = 86, - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="87")] + Bgr12 = 87, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="88")] + Bgr12p = 88, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="89")] + Bgr14 = 89, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PdfDistributionParameters(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="90")] + Bgr16 = 90, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PdfDistributionParameters(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="91")] + Bgr565p = 91, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Pdf = " + _pdf + ", "); - stringBuilder.Append("Index = " + _index); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="92")] + R8 = 92, - 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(); - } - } - - - /// - /// A RewardFunction that is always active. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A RewardFunction that is always active.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PersistentRewardFunction : RewardFunction - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="93")] + R10 = 93, - private PatchUpdateFunction _amount; + [System.Runtime.Serialization.EnumMemberAttribute(Value="94")] + R12 = 94, - private PatchUpdateFunction _probability; + [System.Runtime.Serialization.EnumMemberAttribute(Value="95")] + R16 = 95, - private PatchUpdateFunction _available; + [System.Runtime.Serialization.EnumMemberAttribute(Value="96")] + G8 = 96, - private PersistentRewardFunctionRule _rule; + [System.Runtime.Serialization.EnumMemberAttribute(Value="97")] + G10 = 97, - public PersistentRewardFunction() - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="98")] + G12 = 98, - protected PersistentRewardFunction(PersistentRewardFunction other) : - base(other) - { - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rule = other._rule; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="99")] + G16 = 99, - /// - /// Defines the amount of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward replenished per rule unit.")] - public PatchUpdateFunction Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] + B8 = 100, - /// - /// Defines the probability of reward replenished per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Defines the probability of reward replenished per rule unit.")] - public PatchUpdateFunction Probability - { - get - { - return _probability; - } - set - { - _probability = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="101")] + B10 = 101, - /// - /// Defines the amount of reward available replenished in the patch per rule unit. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Defines the amount of reward available replenished in the patch per rule unit.")] - public PatchUpdateFunction Available - { - get - { - return _available; - } - set - { - _available = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="102")] + B12 = 102, - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("rule", Required=Newtonsoft.Json.Required.Always)] - public PersistentRewardFunctionRule Rule - { - get - { - return _rule; - } - set - { - _rule = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="103")] + B16 = 103, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PersistentRewardFunction(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="104")] + Coord3dAbc8 = 104, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PersistentRewardFunction(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="105")] + Coord3dAbc8Planar = 105, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("Rule = " + _rule); - return true; - } - } - - - /// - /// A Poisson probability distribution. - /// - ///Models the number of events occurring in a fixed interval of time or space - ///when events occur independently at a constant rate. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A Poisson probability distribution.\n\nModels the number of events occurring in a f" + - "ixed interval of time or space\nwhen events occur independently at a constant rat" + - "e.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PoissonDistribution : Distribution - { - - private PoissonDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; - - private ScalingParameters _scalingParameters; - - public PoissonDistribution() - { - _distributionParameters = new PoissonDistributionParameters(); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="106")] + Coord3dAbc10p = 106, - protected PoissonDistribution(PoissonDistribution other) : - base(other) - { - _distributionParameters = other._distributionParameters; - _truncationParameters = other._truncationParameters; - _scalingParameters = other._scalingParameters; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="107")] + Coord3dAbc10pPlanar = 107, - /// - /// Parameters of the distribution - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("distribution_parameters")] - [System.ComponentModel.DescriptionAttribute("Parameters of the distribution")] - public PoissonDistributionParameters DistributionParameters - { - get - { - return _distributionParameters; - } - set - { - _distributionParameters = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="108")] + Coord3dAbc12p = 108, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="109")] + Coord3dAbc12pPlanar = 109, - /// - /// 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; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="110")] + Coord3dAbc16 = 110, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PoissonDistribution(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="111")] + Coord3dAbc16Planar = 111, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PoissonDistribution(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="112")] + Coord3dAbc32f = 112, - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a Poisson distribution. - /// - ///Defined by the rate parameter (average number of events). - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a Poisson distribution.\n\nDefined by the rate parameter (average nu" + - "mber of events).")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PoissonDistributionParameters - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="113")] + Coord3dAbc32fPlanar = 113, - private string _family; + [System.Runtime.Serialization.EnumMemberAttribute(Value="114")] + Coord3dAc8 = 114, - private double _rate; + [System.Runtime.Serialization.EnumMemberAttribute(Value="115")] + Coord3dAc8Planar = 115, - public PoissonDistributionParameters() - { - _family = "Poisson"; - _rate = 1D; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="116")] + Coord3dAc10p = 116, - protected PoissonDistributionParameters(PoissonDistributionParameters other) - { - _family = other._family; - _rate = other._rate; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="117")] + Coord3dAc10pPlanar = 117, - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="118")] + Coord3dAc12p = 118, - /// - /// Rate parameter of the Poisson process that generates the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("rate")] - [System.ComponentModel.DescriptionAttribute("Rate parameter of the Poisson process that generates the distribution")] - public double Rate - { - get - { - return _rate; - } - set - { - _rate = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="119")] + Coord3dAc12pPlanar = 119, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PoissonDistributionParameters(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="120")] + Coord3dAc16 = 120, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PoissonDistributionParameters(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="121")] + Coord3dAc16Planar = 121, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Rate = " + _rate); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="122")] + Coord3dAc32f = 122, - 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(); - } - } - - - /// - /// Controls the position tracking and movement detection parameters. - /// - ///This class manages the position control system including coordinate transformations, - ///initial positioning, signal filtering, and movement detection thresholds for the - ///virtual reality foraging task. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Controls the position tracking and movement detection parameters. - - This class manages the position control system including coordinate transformations, - initial positioning, signal filtering, and movement detection thresholds for the - virtual reality foraging task.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class PositionControl - { + [System.Runtime.Serialization.EnumMemberAttribute(Value="123")] + Coord3dAc32fPlanar = 123, - private AindBehaviorVrForagingTaskLogicVector3 _gain; + [System.Runtime.Serialization.EnumMemberAttribute(Value="124")] + Coord3dA8 = 124, - private AindBehaviorVrForagingTaskLogicVector3 _initialPosition; + [System.Runtime.Serialization.EnumMemberAttribute(Value="125")] + Coord3dA10p = 125, - private double _frequencyFilterCutoff; + [System.Runtime.Serialization.EnumMemberAttribute(Value="126")] + Coord3dA12p = 126, - private double _velocityThreshold; + [System.Runtime.Serialization.EnumMemberAttribute(Value="127")] + Coord3dA16 = 127, - public PositionControl() - { - _gain = new AindBehaviorVrForagingTaskLogicVector3(); - _initialPosition = new AindBehaviorVrForagingTaskLogicVector3(); - _frequencyFilterCutoff = 0.5D; - _velocityThreshold = 1D; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="128")] + Coord3dA32f = 128, - protected PositionControl(PositionControl other) - { - _gain = other._gain; - _initialPosition = other._initialPosition; - _frequencyFilterCutoff = other._frequencyFilterCutoff; - _velocityThreshold = other._velocityThreshold; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="129")] + Coord3dB8 = 129, - /// - /// Gain of the position control. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("gain")] - [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] - public AindBehaviorVrForagingTaskLogicVector3 Gain - { - get - { - return _gain; - } - set - { - _gain = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="130")] + Coord3dB10p = 130, - /// - /// Gain of the position control. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("initial_position")] - [System.ComponentModel.DescriptionAttribute("Gain of the position control.")] - public AindBehaviorVrForagingTaskLogicVector3 InitialPosition - { - get - { - return _initialPosition; - } - set - { - _initialPosition = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="131")] + Coord3dB12p = 131, - /// - /// Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal. - /// - [Newtonsoft.Json.JsonPropertyAttribute("frequency_filter_cutoff")] - [System.ComponentModel.DescriptionAttribute("Cutoff frequency (Hz) of the low-pass filter used to filter the velocity signal.")] - public double FrequencyFilterCutoff - { - get - { - return _frequencyFilterCutoff; - } - set - { - _frequencyFilterCutoff = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="132")] + Coord3dB16 = 132, - /// - /// Threshold (cm/s) of the velocity signal used to detect when the animal is moving. - /// - [Newtonsoft.Json.JsonPropertyAttribute("velocity_threshold")] - [System.ComponentModel.DescriptionAttribute("Threshold (cm/s) of the velocity signal used to detect when the animal is moving." + - "")] - public double VelocityThreshold - { - get - { - return _velocityThreshold; - } - set - { - _velocityThreshold = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new PositionControl(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new PositionControl(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Gain = " + _gain + ", "); - stringBuilder.Append("InitialPosition = " + _initialPosition + ", "); - stringBuilder.Append("FrequencyFilterCutoff = " + _frequencyFilterCutoff + ", "); - stringBuilder.Append("VelocityThreshold = " + _velocityThreshold); - 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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Rect - { - - private int _x; - - private int _y; - - private int _width; - - private int _height; - - public Rect() - { - _x = 0; - _y = 0; - _width = 0; - _height = 0; - } - - 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 Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rect(this))); - } - - public System.IObservable Generate(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(); - } - } - - - /// - /// Defines visual rendering properties for virtual environment elements. - /// - ///This class controls the visual appearance of virtual sites, including - ///contrast and other visual parameters that affect how elements are rendered - ///in the VR environment. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines visual rendering properties for virtual environment elements.\n\nThis class" + - " controls the visual appearance of virtual sites, including\ncontrast and other v" + - "isual parameters that affect how elements are rendered\nin the VR environment.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RenderSpecification - { - - private double? _contrast; - - public RenderSpecification() - { - } - - protected RenderSpecification(RenderSpecification other) - { - _contrast = other._contrast; - } - - /// - /// Contrast of the texture - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("contrast")] - [System.ComponentModel.DescriptionAttribute("Contrast of the texture")] - public double? Contrast - { - get - { - return _contrast; - } - set - { - _contrast = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RenderSpecification(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RenderSpecification(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - 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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "function_type")] - [JsonInheritanceAttribute("PatchRewardFunction", typeof(PatchRewardFunction))] - [JsonInheritanceAttribute("OnThisPatchEntryRewardFunction", typeof(OnThisPatchEntryRewardFunction))] - [JsonInheritanceAttribute("OutsideRewardFunction", typeof(OutsideRewardFunction))] - [JsonInheritanceAttribute("PersistentRewardFunction", typeof(PersistentRewardFunction))] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RewardFunction - { - - public RewardFunction() - { - } - - protected RewardFunction(RewardFunction other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardFunction(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RewardFunction(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(); - } - } - - - /// - /// Specifies reward parameters and behavior for a patch. - /// - ///This class defines all aspects of reward delivery including amounts, probabilities, - ///delays, operant logic, and dynamic update functions. It serves as the complete - ///specification for how rewards are managed in a given Patch. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Specifies reward parameters and behavior for a patch. - - This class defines all aspects of reward delivery including amounts, probabilities, - delays, operant logic, and dynamic update functions. It serves as the complete - specification for how rewards are managed in a given Patch.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RewardSpecification - { - - private OperantLogic _operantLogic; - - private Distribution _delay; - - private Distribution _amount; - - private Distribution _probability; - - private Distribution _available; - - private System.Collections.Generic.List _rewardFunction; - - public RewardSpecification() - { - _delay = new Distribution(); - _amount = new Distribution(); - _probability = new Distribution(); - _available = new Distribution(); - _rewardFunction = new System.Collections.Generic.List(); - } - - protected RewardSpecification(RewardSpecification other) - { - _operantLogic = other._operantLogic; - _delay = other._delay; - _amount = other._amount; - _probability = other._probability; - _available = other._available; - _rewardFunction = other._rewardFunction; - } - - /// - /// The optional operant logic of the reward - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operant_logic")] - [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] - public OperantLogic OperantLogic - { - get - { - return _operantLogic; - } - set - { - _operantLogic = value; - } - } - - /// - /// The optional distribution where the delay to reward will be drawn from - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] - public Distribution Delay - { - get - { - return _delay; - } - set - { - _delay = value; - } - } - - /// - /// Initial amount of reward in microliters - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("amount")] - [System.ComponentModel.DescriptionAttribute("Initial amount of reward in microliters")] - public Distribution Amount - { - get - { - return _amount; - } - set - { - _amount = value; - } - } - - /// - /// Initial probability of reward delivery - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("probability")] - [System.ComponentModel.DescriptionAttribute("Initial probability of reward delivery")] - public Distribution Probability - { - get - { - return _probability; - } - set - { - _probability = value; - } - } - - /// - /// Initial amount of reward available in the patch in microliters - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("available")] - [System.ComponentModel.DescriptionAttribute("Initial amount of reward available in the patch in microliters")] - public Distribution Available - { - get - { - return _available; - } - set - { - _available = value; - } - } - - /// - /// Reward function of the patch - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_function")] - [System.ComponentModel.DescriptionAttribute("Reward function of the patch")] - public System.Collections.Generic.List RewardFunction - { - get - { - return _rewardFunction; - } - set - { - _rewardFunction = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RewardSpecification(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RewardSpecification(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); - stringBuilder.Append("Delay = " + _delay + ", "); - stringBuilder.Append("Amount = " + _amount + ", "); - stringBuilder.Append("Probability = " + _probability + ", "); - stringBuilder.Append("Available = " + _available + ", "); - stringBuilder.Append("RewardFunction = " + _rewardFunction); - 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.6.1.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.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class RigCalibration - { - - private WaterValveCalibration _waterValve; - - public RigCalibration() - { - _waterValve = new WaterValveCalibration(); - } - - 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 Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new RigCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new RigCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("WaterValve = " + _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(); - } - } - - - /// - /// A scalar distribution that returns a constant value. - /// - ///Useful for fixed parameters that don't vary across trials or samples. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A scalar distribution that returns a constant value.\n\nUseful for fixed parameters" + - " that don\'t vary across trials or samples.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Scalar : Distribution - { - - private ScalarDistributionParameter _distributionParameters; - - private TruncationParameters2 _truncationParameters; - - private ScalingParameters2 _scalingParameters; - - public Scalar() - { - _distributionParameters = new ScalarDistributionParameter(); - } - - protected Scalar(Scalar 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 ScalarDistributionParameter DistributionParameters - { - get - { - return _distributionParameters; - } - set - { - _distributionParameters = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_parameters")] - public TruncationParameters2 TruncationParameters - { - get - { - return _truncationParameters; - } - set - { - _truncationParameters = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("scaling_parameters")] - public ScalingParameters2 ScalingParameters - { - get - { - return _scalingParameters; - } - set - { - _scalingParameters = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Scalar(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Scalar(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a scalar (constant) distribution. - /// - ///Represents a deterministic value that always returns the same number. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a scalar (constant) distribution.\n\nRepresents a deterministic valu" + - "e that always returns the same number.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalarDistributionParameter - { - - private string _family; - - private double _value; - - public ScalarDistributionParameter() - { - _family = "Scalar"; - _value = 0D; - } - - protected ScalarDistributionParameter(ScalarDistributionParameter other) - { - _family = other._family; - _value = other._value; - } - - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } - - /// - /// The static value of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("value")] - [System.ComponentModel.DescriptionAttribute("The static value of the distribution")] - public double Value - { - get - { - return _value; - } - set - { - _value = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalarDistributionParameter(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalarDistributionParameter(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Value = " + _value); - 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(); - } - } - - - /// - /// Parameters for scaling and offsetting sampled distribution values. - ///Scaling is applied as (value * scale + offset). - /// - ///Applies linear transformation: result = (value * scale) + offset. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for scaling and offsetting sampled distribution values.\nScaling is app" + - "lied as (value * scale + offset).\n\nApplies linear transformation: result = (valu" + - "e * scale) + offset.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalingParameters - { - - private double _scale; - - private double _offset; - - public ScalingParameters() - { - _scale = 1D; - _offset = 0D; - } - - protected ScalingParameters(ScalingParameters other) - { - _scale = other._scale; - _offset = other._offset; - } - - /// - /// Scaling factor to apply on the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("scale")] - [System.ComponentModel.DescriptionAttribute("Scaling factor to apply on the sampled distribution")] - public double Scale - { - get - { - return _scale; - } - set - { - _scale = value; - } - } - - /// - /// Offset factor to apply on the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("offset")] - [System.ComponentModel.DescriptionAttribute("Offset factor to apply on the sampled distribution")] - public double Offset - { - get - { - return _offset; - } - set - { - _offset = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalingParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalingParameters(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Scale = " + _scale + ", "); - stringBuilder.Append("Offset = " + _offset); - 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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Screen - { - - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private DisplaysCalibration _calibration; - - private int _displayIndex; - - private double _targetRenderFrequency; - - private double _targetUpdateFrequency; - - private string _textureAssetsDirectory; - - private double _brightness; - - private double _contrast; - - public Screen() - { - _deviceType = "Screen"; - _calibration = new DisplaysCalibration(); - _displayIndex = 1; - _targetRenderFrequency = 60D; - _targetUpdateFrequency = 120D; - _textureAssetsDirectory = "Textures"; - _brightness = 0D; - _contrast = 1D; - } - - protected Screen(Screen other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _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; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = 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 Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Screen(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Screen(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("DisplayIndex = " + _displayIndex + ", "); - stringBuilder.Append("TargetRenderFrequency = " + _targetRenderFrequency + ", "); - stringBuilder.Append("TargetUpdateFrequency = " + _targetUpdateFrequency + ", "); - stringBuilder.Append("TextureAssetsDirectory = " + _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(); - } - } - - - /// - /// A patch update function that sets the target to a specific value. - /// - ///Update in the form of x = value. - ///This function directly sets the target parameter to a value drawn from the - ///specified distribution, ignoring the current value. Useful for resetting - ///parameters or applying discrete changes. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"A patch update function that sets the target to a specific value. - - Update in the form of x = value. - This function directly sets the target parameter to a value drawn from the - specified distribution, ignoring the current value. Useful for resetting - parameters or applying discrete changes.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SetValueFunction : PatchUpdateFunction - { - - private Distribution _value; - - public SetValueFunction() - { - } - - protected SetValueFunction(SetValueFunction other) : - base(other) - { - _value = other._value; - } - - /// - /// Sets the value of the target to this value. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("value", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Sets the value of the target to this value.")] - public Distribution Value - { - get - { - return _value; - } - set - { - _value = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SetValueFunction(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SetValueFunction(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("Value = " + _value); - return true; - } - } - - - /// - /// Represents 2D dimensions with width and height. - /// - ///Used for defining texture sizes, corridor dimensions, and other 2D measurements - ///in the VR foraging environment. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents 2D dimensions with width and height.\n\nUsed for defining texture sizes," + - " corridor dimensions, and other 2D measurements\nin the VR foraging environment.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Size - { - - private double _width; - - private double _height; - - public Size() - { - _width = 0D; - _height = 0D; - } - - protected Size(Size other) - { - _width = other._width; - _height = other._height; - } - - /// - /// Width of the texture - /// - [Newtonsoft.Json.JsonPropertyAttribute("width")] - [System.ComponentModel.DescriptionAttribute("Width of the texture")] - public double Width - { - get - { - return _width; - } - set - { - _width = value; - } - } - - /// - /// Height of the texture - /// - [Newtonsoft.Json.JsonPropertyAttribute("height")] - [System.ComponentModel.DescriptionAttribute("Height of the texture")] - public double Height - { - get - { - return _height; - } - set - { - _height = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Size(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Size(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - 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(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class SpinnakerCamera - { - - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private BaseModel _calibration; - - private string _serialNumber; - - private int _binning; - - private SpinnakerCameraColorProcessing _colorProcessing; - - private int _exposure; - - private double _gain; - - private double? _gamma; - - private SpinnakerCameraAdcBitDepth? _adcBitDepth; - - private SpinnakerCameraPixelFormat? _pixelFormat; - - private Rect _regionOfInterest; - - private VideoWriter _videoWriter; - - public SpinnakerCamera() - { - _deviceType = "SpinnakerCamera"; - _binning = 1; - _colorProcessing = AindVrForagingDataSchema.SpinnakerCameraColorProcessing.Default; - _exposure = 1000; - _gain = 0D; - _adcBitDepth = AindVrForagingDataSchema.SpinnakerCameraAdcBitDepth.Adc8bit; - _pixelFormat = AindVrForagingDataSchema.SpinnakerCameraPixelFormat.Mono8; - _regionOfInterest = new Rect(); - } - - protected SpinnakerCamera(SpinnakerCamera other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _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; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = 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 Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new SpinnakerCamera(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new SpinnakerCamera(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("Binning = " + _binning + ", "); - stringBuilder.Append("ColorProcessing = " + _colorProcessing + ", "); - stringBuilder.Append("Exposure = " + _exposure + ", "); - stringBuilder.Append("Gain = " + _gain + ", "); - stringBuilder.Append("Gamma = " + _gamma + ", "); - stringBuilder.Append("AdcBitDepth = " + _adcBitDepth + ", "); - stringBuilder.Append("PixelFormat = " + _pixelFormat + ", "); - stringBuilder.Append("RegionOfInterest = " + _regionOfInterest + ", "); - stringBuilder.Append("VideoWriter = " + _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.6.1.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.6.1.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, - } - - - /// - /// Defines visual texture properties for VR environment surfaces. - /// - ///Textures are applied to walls, floors, and other surfaces in the virtual - ///environment to provide visual cues and context for the foraging task. - /// - ///Texture name must correspond to a valid texture asset loaded in the workflow. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines visual texture properties for VR environment surfaces. - - Textures are applied to walls, floors, and other surfaces in the virtual - environment to provide visual cues and context for the foraging task. - - Texture name must correspond to a valid texture asset loaded in the workflow.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Texture - { - - private string _name; - - private Size _size; - - public Texture() - { - _name = "default"; - _size = new Size(); - } - - protected Texture(Texture other) - { - _name = other._name; - _size = other._size; - } - - /// - /// Name of the texture - /// - [Newtonsoft.Json.JsonPropertyAttribute("name")] - [System.ComponentModel.DescriptionAttribute("Name of the texture")] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - /// - /// Size of the texture - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("size")] - [System.ComponentModel.DescriptionAttribute("Size of the texture")] - public Size Size - { - get - { - return _size; - } - set - { - _size = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Texture(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Texture(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Name = " + _name + ", "); - stringBuilder.Append("Size = " + _size); - 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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Treadmill - { - - private string _deviceType; - - private string _deviceName; - - private BaseModel _additionalSettings; - - private TreadmillCalibration _calibration; - - private int _whoAmI; - - private string _serialNumber; - - private string _portName; - - public Treadmill() - { - _deviceType = "Treadmill"; - _whoAmI = 1402; - } - - protected Treadmill(Treadmill other) - { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _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; - } - } - - /// - /// Device name - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = 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; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - public TreadmillCalibration Calibration - { - get - { - return _calibration; - } - set - { - _calibration = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] - public int WhoAmI - { - get - { - return _whoAmI; - } - set - { - _whoAmI = value; - } - } - - /// - /// Device serial number - /// - [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] - [System.ComponentModel.DescriptionAttribute("Device serial number")] - public string SerialNumber - { - get - { - return _serialNumber; - } - set - { - _serialNumber = value; - } - } - - /// - /// Device port name - /// - [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Device port name")] - public string PortName - { - get - { - return _portName; - } - set - { - _portName = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); - stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); - stringBuilder.Append("PortName = " + _portName); - 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(); - } - } - - - /// - /// Treadmill calibration class - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibration - { - - private string _deviceName; - - private TreadmillCalibrationInput _input; - - private TreadmillCalibrationOutput _output; - - private System.DateTimeOffset? _date; - - private string _description; - - private string _notes; - - public TreadmillCalibration() - { - _deviceName = "Treadmill"; - _input = new TreadmillCalibrationInput(); - _output = new TreadmillCalibrationOutput(); - _description = "Calibration of the treadmill system"; - } - - protected TreadmillCalibration(TreadmillCalibration other) - { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; - } - - /// - /// Must match a device name in rig/instrument - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Must match a device name in rig/instrument")] - public string DeviceName - { - get - { - return _deviceName; - } - set - { - _deviceName = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public TreadmillCalibrationInput Input - { - get - { - return _input; - } - set - { - _input = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public TreadmillCalibrationOutput Output - { - get - { - return _output; - } - set - { - _output = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description - { - get - { - return _description; - } - set - { - _description = value; - } - } - - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes - { - get - { - return _notes; - } - set - { - _notes = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceName = " + _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)) - { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibrationInput - { - - public TreadmillCalibrationInput() - { - } - - protected TreadmillCalibrationInput(TreadmillCalibrationInput other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibrationInput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibrationInput(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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillCalibrationOutput - { - - private double _wheelDiameter; - - private int _pulsesPerRevolution; - - private bool _invertDirection; - - private System.Collections.Generic.List> _brakeLookupCalibration; - - public TreadmillCalibrationOutput() - { - _wheelDiameter = 15D; - _pulsesPerRevolution = 28800; - _invertDirection = false; - _brakeLookupCalibration = new System.Collections.Generic.List>(); - } - - protected TreadmillCalibrationOutput(TreadmillCalibrationOutput other) - { - _wheelDiameter = other._wheelDiameter; - _pulsesPerRevolution = other._pulsesPerRevolution; - _invertDirection = other._invertDirection; - _brakeLookupCalibration = other._brakeLookupCalibration; - } - - /// - /// Wheel diameter - /// - [Newtonsoft.Json.JsonPropertyAttribute("wheel_diameter")] - [System.ComponentModel.DescriptionAttribute("Wheel diameter")] - public double WheelDiameter - { - get - { - return _wheelDiameter; - } - set - { - _wheelDiameter = value; - } - } - - /// - /// Pulses per revolution - /// - [Newtonsoft.Json.JsonPropertyAttribute("pulses_per_revolution")] - [System.ComponentModel.DescriptionAttribute("Pulses per revolution")] - public int PulsesPerRevolution - { - get - { - return _pulsesPerRevolution; - } - set - { - _pulsesPerRevolution = value; - } - } - - /// - /// Invert direction - /// - [Newtonsoft.Json.JsonPropertyAttribute("invert_direction")] - [System.ComponentModel.DescriptionAttribute("Invert direction")] - public bool InvertDirection - { - get - { - return _invertDirection; - } - set - { - _invertDirection = value; - } - } - - /// - /// 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", 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 - { - return _brakeLookupCalibration; - } - set - { - _brakeLookupCalibration = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibrationOutput(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibrationOutput(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("WheelDiameter = " + _wheelDiameter + ", "); - stringBuilder.Append("PulsesPerRevolution = " + _pulsesPerRevolution + ", "); - stringBuilder.Append("InvertDirection = " + _invertDirection + ", "); - stringBuilder.Append("BrakeLookupCalibration = " + _brakeLookupCalibration); - 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(); - } - } - - - /// - /// Defines treadmill friction properties for virtual sites. - /// - ///This class controls the friction experienced by the animal when moving - ///through different virtual sites, allowing for varied locomotion dynamics - ///across different regions of the environment. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines treadmill friction properties for virtual sites.\n\nThis class controls the" + - " friction experienced by the animal when moving\nthrough different virtual sites," + - " allowing for varied locomotion dynamics\nacross different regions of the environ" + - "ment.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TreadmillSpecification - { - - private Distribution _friction; - - public TreadmillSpecification() - { - } - - protected TreadmillSpecification(TreadmillSpecification other) - { - _friction = other._friction; - } - - /// - /// Friction of the treadmill (0-1). The drawn value must be between 0 and 1 - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("friction")] - [System.ComponentModel.DescriptionAttribute("Friction of the treadmill (0-1). The drawn value must be between 0 and 1")] - public Distribution Friction - { - get - { - return _friction; - } - set - { - _friction = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillSpecification(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillSpecification(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Friction = " + _friction); - 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(); - } - } - - - /// - /// Parameters for truncating a distribution to a specified range. Truncation should - ///be applied after sampling and scaling. - /// - ///The truncation_mode determines how out-of-bounds values are handled: - ///- "exclude": Resample until a value within [min, max] is obtained. - ///If after a certain number of attempts no valid value is found, it - ///will use the average of sampled values and pick the closest bound. - ///- "clamp": Clamp values to the nearest bound within [min, max]. - ///Used to constrain sampled values within minimum and maximum bounds. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Parameters for truncating a distribution to a specified range. Truncation should - be applied after sampling and scaling. - - The truncation_mode determines how out-of-bounds values are handled: - - ""exclude"": Resample until a value within [min, max] is obtained. - If after a certain number of attempts no valid value is found, it - will use the average of sampled values and pick the closest bound. - - ""clamp"": Clamp values to the nearest bound within [min, max]. - Used to constrain sampled values within minimum and maximum bounds.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TruncationParameters - { - - private TruncationParametersTruncationMode _truncationMode; - - private double _min; - - private double _max; - - public TruncationParameters() - { - _truncationMode = AindVrForagingDataSchema.TruncationParametersTruncationMode.Exclude; - _min = 0D; - _max = 0D; - } - - protected TruncationParameters(TruncationParameters other) - { - _truncationMode = other._truncationMode; - _min = other._min; - _max = other._max; - } - - /// - /// Mode of truncation to apply - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("truncation_mode")] - [System.ComponentModel.DescriptionAttribute("Mode of truncation to apply")] - public TruncationParametersTruncationMode TruncationMode - { - get - { - return _truncationMode; - } - set - { - _truncationMode = value; - } - } - - /// - /// Minimum value of the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("min")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the sampled distribution")] - public double Min - { - get - { - return _min; - } - set - { - _min = value; - } - } - - /// - /// Maximum value of the sampled distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("max")] - [System.ComponentModel.DescriptionAttribute("Maximum value of the sampled distribution")] - public double Max - { - get - { - return _max; - } - set - { - _max = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TruncationParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new TruncationParameters(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("TruncationMode = " + _truncationMode + ", "); - stringBuilder.Append("Min = " + _min + ", "); - stringBuilder.Append("Max = " + _max); - 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(); - } - } - - - /// - /// A uniform probability distribution. - /// - ///All values between min and max have equal probability of being sampled. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("A uniform probability distribution.\n\nAll values between min and max have equal pr" + - "obability of being sampled.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class UniformDistribution : Distribution - { - - private UniformDistributionParameters _distributionParameters; - - private TruncationParameters _truncationParameters; - - private ScalingParameters _scalingParameters; - - public UniformDistribution() - { - _distributionParameters = new UniformDistributionParameters(); - } - - protected UniformDistribution(UniformDistribution 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 UniformDistributionParameters 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 Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new UniformDistribution(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new UniformDistribution(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("DistributionParameters = " + _distributionParameters + ", "); - stringBuilder.Append("TruncationParameters = " + _truncationParameters + ", "); - stringBuilder.Append("ScalingParameters = " + _scalingParameters); - return true; - } - } - - - /// - /// Parameters for a uniform distribution. - /// - ///Defined by minimum and maximum bounds of the distribution. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Parameters for a uniform distribution.\n\nDefined by minimum and maximum bounds of " + - "the distribution.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class UniformDistributionParameters - { - - private string _family; - - private double _min; - - private double _max; - - public UniformDistributionParameters() - { - _family = "Uniform"; - _min = 0D; - _max = 0D; - } - - protected UniformDistributionParameters(UniformDistributionParameters other) - { - _family = other._family; - _min = other._min; - _max = other._max; - } - - [Newtonsoft.Json.JsonPropertyAttribute("family")] - public string Family - { - get - { - return _family; - } - set - { - _family = value; - } - } - - /// - /// Minimum value of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("min")] - [System.ComponentModel.DescriptionAttribute("Minimum value of the distribution")] - public double Min - { - get - { - return _min; - } - set - { - _min = value; - } - } - - /// - /// Maximum value of the distribution - /// - [Newtonsoft.Json.JsonPropertyAttribute("max")] - [System.ComponentModel.DescriptionAttribute("Maximum value of the distribution")] - public double Max - { - get - { - return _max; - } - set - { - _max = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new UniformDistributionParameters(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new UniformDistributionParameters(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Family = " + _family + ", "); - stringBuilder.Append("Min = " + _min + ", "); - stringBuilder.Append("Max = " + _max); - 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(); - } - } - - - /// - /// Enumeration of parameters that can be targeted by numerical updaters. - /// - ///These targets define which task parameters can be dynamically modified - ///during task execution to adapt to animal performance or experimental needs. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum UpdaterTarget - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="StopDurationOffset")] - StopDurationOffset = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="StopVelocityThreshold")] - StopVelocityThreshold = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardDelayOffset")] - RewardDelayOffset = 2, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] - [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] - [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriter - { - - public VideoWriter() - { - } - - protected VideoWriter(VideoWriter other) - { - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriterFfmpeg : VideoWriter - { - - private int _frameRate; - - private string _containerExtension; - - private string _outputArguments; - - private string _inputArguments; - - public VideoWriterFfmpeg() - { - _frameRate = 30; - _containerExtension = "mp4"; - _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"; - _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; - } - - protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : - base(other) - { - _frameRate = other._frameRate; - _containerExtension = other._containerExtension; - _outputArguments = other._outputArguments; - _inputArguments = other._inputArguments; - } - - /// - /// Encoding frame rate - /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] - public int FrameRate - { - get - { - return _frameRate; - } - set - { - _frameRate = value; - } - } - - /// - /// Container extension - /// - [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] - [System.ComponentModel.DescriptionAttribute("Container extension")] - public string ContainerExtension - { - get - { - return _containerExtension; - } - set - { - _containerExtension = value; - } - } - - /// - /// Output arguments - /// - [Newtonsoft.Json.JsonPropertyAttribute("output_arguments")] - [System.ComponentModel.DescriptionAttribute("Output arguments")] - public string OutputArguments - { - get - { - return _outputArguments; - } - set - { - _outputArguments = value; - } - } - - /// - /// Input arguments - /// - [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] - [System.ComponentModel.DescriptionAttribute("Input arguments")] - public string InputArguments - { - get - { - return _inputArguments; - } - set - { - _inputArguments = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("FrameRate = " + _frameRate + ", "); - stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); - stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); - stringBuilder.Append("InputArguments = " + _inputArguments); - return true; - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VideoWriterOpenCv : VideoWriter - { - - private int _frameRate; - - private string _containerExtension; - - private string _fourCc; - - public VideoWriterOpenCv() - { - _frameRate = 30; - _containerExtension = "avi"; - _fourCc = "FMP4"; - } - - protected VideoWriterOpenCv(VideoWriterOpenCv other) : - base(other) - { - _frameRate = other._frameRate; - _containerExtension = other._containerExtension; - _fourCc = other._fourCc; - } - - /// - /// Encoding frame rate - /// - [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] - [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] - public int FrameRate - { - get - { - return _frameRate; - } - set - { - _frameRate = value; - } - } - - /// - /// Container extension - /// - [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] - [System.ComponentModel.DescriptionAttribute("Container extension")] - public string ContainerExtension - { - get - { - return _containerExtension; - } - set - { - _containerExtension = value; - } - } - - /// - /// Four character code - /// - [Newtonsoft.Json.JsonPropertyAttribute("four_cc")] - [System.ComponentModel.DescriptionAttribute("Four character code")] - public string FourCc - { - get - { - return _fourCc; - } - set - { - _fourCc = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); - } - - protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - if (base.PrintMembers(stringBuilder)) - { - stringBuilder.Append(", "); - } - stringBuilder.Append("FrameRate = " + _frameRate + ", "); - stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); - stringBuilder.Append("FourCc = " + _fourCc); - return true; - } - } - - - /// - /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - ///Represents a specific virtual site instance in the VR environment. - /// - ///This class defines a concrete virtual site with specific properties like position, - ///length, and associated specifications. It is typically generated from VirtualSiteGenerator - ///templates rather than being directly instantiated in the DSL. - /// - ///Note: This class is primarily used internally for runtime site generation - ///and is not meant to be directly instantiated in task configuration DSL. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - Represents a specific virtual site instance in the VR environment. - - This class defines a concrete virtual site with specific properties like position, - length, and associated specifications. It is typically generated from VirtualSiteGenerator - templates rather than being directly instantiated in the DSL. - - Note: This class is primarily used internally for runtime site generation - and is not meant to be directly instantiated in task configuration DSL.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSite - { - - private int _id; - - private VirtualSiteLabels _label; - - private double _length; - - private double _startPosition; - - private OdorSpecification _odorSpecification; - - private VirtualSiteRewardSpecification _rewardSpecification; - - private RenderSpecification _renderSpecification; - - private TreadmillSpecification _treadmillSpecification; - - public VirtualSite() - { - _id = 0; - _label = AindVrForagingDataSchema.VirtualSiteLabels.Unspecified; - _length = 20D; - _startPosition = 0D; - _renderSpecification = new RenderSpecification(); - } - - protected VirtualSite(VirtualSite other) - { - _id = other._id; - _label = other._label; - _length = other._length; - _startPosition = other._startPosition; - _odorSpecification = other._odorSpecification; - _rewardSpecification = other._rewardSpecification; - _renderSpecification = other._renderSpecification; - _treadmillSpecification = other._treadmillSpecification; - } - - /// - /// Id of the virtual site - /// - [Newtonsoft.Json.JsonPropertyAttribute("id")] - [System.ComponentModel.DescriptionAttribute("Id of the virtual site")] - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } - - /// - /// Label of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] - public VirtualSiteLabels Label - { - get - { - return _label; - } - set - { - _label = value; - } - } - - /// - /// Length of the virtual site (cm) - /// - [Newtonsoft.Json.JsonPropertyAttribute("length")] - [System.ComponentModel.DescriptionAttribute("Length of the virtual site (cm)")] - public double Length - { - get - { - return _length; - } - set - { - _length = value; - } - } - - /// - /// Start position of the virtual site (cm) - /// - [Newtonsoft.Json.JsonPropertyAttribute("start_position")] - [System.ComponentModel.DescriptionAttribute("Start position of the virtual site (cm)")] - public double StartPosition - { - get - { - return _startPosition; - } - set - { - _startPosition = value; - } - } - - /// - /// The optional odor specification of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] - [System.ComponentModel.DescriptionAttribute("The optional odor specification of the virtual site")] - public OdorSpecification OdorSpecification - { - get - { - return _odorSpecification; - } - set - { - _odorSpecification = value; - } - } - - /// - /// The optional reward specification of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] - [System.ComponentModel.DescriptionAttribute("The optional reward specification of the virtual site")] - public VirtualSiteRewardSpecification RewardSpecification - { - get - { - return _rewardSpecification; - } - set - { - _rewardSpecification = value; - } - } - - /// - /// The optional render specification of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] - [System.ComponentModel.DescriptionAttribute("The optional render specification of the virtual site")] - public RenderSpecification RenderSpecification - { - get - { - return _renderSpecification; - } - set - { - _renderSpecification = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="133")] + Coord3dB32f = 133, - /// - /// Treadmill specification - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] - [System.ComponentModel.DescriptionAttribute("Treadmill specification")] - public TreadmillSpecification TreadmillSpecification - { - get - { - return _treadmillSpecification; - } - set - { - _treadmillSpecification = value; - } - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="134")] + Coord3dC8 = 134, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSite(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="135")] + Coord3dC10p = 135, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSite(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="136")] + Coord3dC12p = 136, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("Id = " + _id + ", "); - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("Length = " + _length + ", "); - stringBuilder.Append("StartPosition = " + _startPosition + ", "); - stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); - stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); - stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); - stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); - return true; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="137")] + Coord3dC16 = 137, - 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="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, } /// - /// Generates virtual site specifications with randomized properties. + /// Defines visual texture properties for VR environment surfaces. /// - ///This class defines templates for creating virtual sites with variable properties - ///like length and rendering specifications. It's used to generate diverse virtual - ///environments for the foraging task. + ///Textures are applied to walls, floors, and other surfaces in the virtual + ///environment to provide visual cues and context for the foraging task. + /// + ///Texture name must correspond to a valid texture asset loaded in the workflow. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Generates virtual site specifications with randomized properties. + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines visual texture properties for VR environment surfaces. - This class defines templates for creating virtual sites with variable properties - like length and rendering specifications. It's used to generate diverse virtual - environments for the foraging task.")] + Textures are applied to walls, floors, and other surfaces in the virtual + environment to provide visual cues and context for the foraging task. + + Texture name must correspond to a valid texture asset loaded in the workflow.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSiteGenerator + public partial class Texture { - private RenderSpecification _renderSpecification; - - private VirtualSiteLabels _label; - - private Distribution _lengthDistribution; - - private TreadmillSpecification _treadmillSpecification; - - public VirtualSiteGenerator() - { - _renderSpecification = new RenderSpecification(); - _label = AindVrForagingDataSchema.VirtualSiteLabels.Unspecified; - _lengthDistribution = new Distribution(); - } + private string _name; - protected VirtualSiteGenerator(VirtualSiteGenerator other) - { - _renderSpecification = other._renderSpecification; - _label = other._label; - _lengthDistribution = other._lengthDistribution; - _treadmillSpecification = other._treadmillSpecification; - } + private Size _size; - /// - /// Contrast of the environment - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] - [System.ComponentModel.DescriptionAttribute("Contrast of the environment")] - public RenderSpecification RenderSpecification + public Texture() { - get - { - return _renderSpecification; - } - set - { - _renderSpecification = value; - } + _name = "default"; + _size = new Size(); } - /// - /// Label of the virtual site - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("label")] - [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] - public VirtualSiteLabels Label + protected Texture(Texture other) { - get - { - return _label; - } - set - { - _label = value; - } + _name = other._name; + _size = other._size; } /// - /// Distribution of the length of the virtual site + /// Name of the texture /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("length_distribution")] - [System.ComponentModel.DescriptionAttribute("Distribution of the length of the virtual site")] - public Distribution LengthDistribution + [Newtonsoft.Json.JsonPropertyAttribute("name")] + [System.ComponentModel.DescriptionAttribute("Name of the texture")] + public string Name { get { - return _lengthDistribution; + return _name; } set { - _lengthDistribution = value; + _name = value; } } /// - /// Treadmill specification + /// Size of the texture /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] - [System.ComponentModel.DescriptionAttribute("Treadmill specification")] - public TreadmillSpecification TreadmillSpecification + [Newtonsoft.Json.JsonPropertyAttribute("size")] + [System.ComponentModel.DescriptionAttribute("Size of the texture")] + public Size Size { get { - return _treadmillSpecification; + return _size; } set { - _treadmillSpecification = value; + _size = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteGenerator(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Texture(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteGenerator(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Texture(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); - stringBuilder.Append("Label = " + _label + ", "); - stringBuilder.Append("LengthDistribution = " + _lengthDistribution + ", "); - stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); + stringBuilder.Append("Name = " + _name + ", "); + stringBuilder.Append("Size = " + _size); return true; } @@ -14149,117 +8923,132 @@ public override string ToString() /// - /// Enumeration of virtual site types in the VR foraging environment. - /// - ///These labels categorize different regions of the virtual environment, - ///each serving different functional roles in the foraging task. + /// A calibrated treadmill device /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum VirtualSiteLabels + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("A calibrated treadmill device")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Treadmill { - [System.Runtime.Serialization.EnumMemberAttribute(Value="Unspecified")] - Unspecified = 0, + private string _deviceType; - [System.Runtime.Serialization.EnumMemberAttribute(Value="InterPatch")] - InterPatch = 1, + private TreadmillCalibration _calibration; - [System.Runtime.Serialization.EnumMemberAttribute(Value="PostPatch")] - PostPatch = 2, + private int _whoAmI; - [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardSite")] - RewardSite = 3, + private string _serialNumber; - [System.Runtime.Serialization.EnumMemberAttribute(Value="InterSite")] - InterSite = 4, - } - - - /// - /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - ///Specifies reward parameters and behavior for a virtual site. - /// - ///Note: This class is primarily used internally for runtime site generation - ///and is not meant to be directly instantiated in task configuration DSL. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. - Specifies reward parameters and behavior for a virtual site. - - Note: This class is primarily used internally for runtime site generation - and is not meant to be directly instantiated in task configuration DSL.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VirtualSiteRewardSpecification - { + private string _portName; - private OperantLogic _operantLogic; + public Treadmill() + { + _deviceType = "Treadmill"; + _calibration = new TreadmillCalibration(); + _whoAmI = 1402; + } + + protected Treadmill(Treadmill other) + { + _deviceType = other._deviceType; + _calibration = other._calibration; + _whoAmI = other._whoAmI; + _serialNumber = other._serialNumber; + _portName = other._portName; + } - private Distribution _delay; + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType + { + get + { + return _deviceType; + } + set + { + _deviceType = value; + } + } - public VirtualSiteRewardSpecification() + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + public TreadmillCalibration Calibration { - _operantLogic = new OperantLogic(); - _delay = new Distribution(); + get + { + return _calibration; + } + set + { + _calibration = value; + } } - protected VirtualSiteRewardSpecification(VirtualSiteRewardSpecification other) + [Newtonsoft.Json.JsonPropertyAttribute("who_am_i")] + public int WhoAmI { - _operantLogic = other._operantLogic; - _delay = other._delay; + get + { + return _whoAmI; + } + set + { + _whoAmI = value; + } } /// - /// The optional operant logic of the reward + /// Device serial number /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("operant_logic", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] - public OperantLogic OperantLogic + [Newtonsoft.Json.JsonPropertyAttribute("serial_number")] + [System.ComponentModel.DescriptionAttribute("Device serial number")] + public string SerialNumber { get { - return _operantLogic; + return _serialNumber; } set { - _operantLogic = value; + _serialNumber = value; } } /// - /// The optional distribution where the delay to reward will be drawn from + /// Device port name /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("delay")] - [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] - public Distribution Delay + [Newtonsoft.Json.JsonPropertyAttribute("port_name", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Device port name")] + public string PortName { get { - return _delay; + return _portName; } set { - _delay = value; + _portName = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteRewardSpecification(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Treadmill(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteRewardSpecification(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new Treadmill(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); - stringBuilder.Append("Delay = " + _delay); + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("WhoAmI = " + _whoAmI + ", "); + stringBuilder.Append("SerialNumber = " + _serialNumber + ", "); + stringBuilder.Append("PortName = " + _portName); return true; } @@ -14279,152 +9068,147 @@ public override string ToString() /// - /// Defines a visual corridor segment in the VR environment. - /// - ///Visual corridors are the basic building blocks of the VR environment, - ///defining spatial regions with specific textures, dimensions, and positions. + /// Treadmill calibration class /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Defines a visual corridor segment in the VR environment.\n\nVisual corridors are th" + - "e basic building blocks of the VR environment,\ndefining spatial regions with spe" + - "cific textures, dimensions, and positions.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Treadmill calibration class")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class VisualCorridor + public partial class TreadmillCalibration { - private int _id; + private System.DateTimeOffset? _date; - private Size _size; + private double _wheelDiameter; - private double _startPosition; + private int _pulsesPerRevolution; - private double _length; + private bool _invertDirection; - private WallTextures _textures; + private System.Collections.Generic.List> _brakeLookupCalibration; - public VisualCorridor() + public TreadmillCalibration() { - _id = 0; - _size = new Size(); - _startPosition = 0D; - _length = 120D; - _textures = new WallTextures(); + _wheelDiameter = 15D; + _pulsesPerRevolution = 28800; + _invertDirection = false; + _brakeLookupCalibration = new System.Collections.Generic.List>(); } - protected VisualCorridor(VisualCorridor other) + protected TreadmillCalibration(TreadmillCalibration other) { - _id = other._id; - _size = other._size; - _startPosition = other._startPosition; - _length = other._length; - _textures = other._textures; + _date = other._date; + _wheelDiameter = other._wheelDiameter; + _pulsesPerRevolution = other._pulsesPerRevolution; + _invertDirection = other._invertDirection; + _brakeLookupCalibration = other._brakeLookupCalibration; } /// - /// Id of the visual corridor object + /// Date of the calibration /// - [Newtonsoft.Json.JsonPropertyAttribute("id")] - [System.ComponentModel.DescriptionAttribute("Id of the visual corridor object")] - public int Id + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset? Date { get { - return _id; + return _date; } set { - _id = value; + _date = value; } } /// - /// Size of the corridor (cm) + /// Wheel diameter /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("size")] - [System.ComponentModel.DescriptionAttribute("Size of the corridor (cm)")] - public Size Size + [Newtonsoft.Json.JsonPropertyAttribute("wheel_diameter")] + [System.ComponentModel.DescriptionAttribute("Wheel diameter")] + public double WheelDiameter { get { - return _size; + return _wheelDiameter; } set { - _size = value; + _wheelDiameter = value; } } /// - /// Start position of the corridor (cm) + /// Pulses per revolution /// - [Newtonsoft.Json.JsonPropertyAttribute("start_position")] - [System.ComponentModel.DescriptionAttribute("Start position of the corridor (cm)")] - public double StartPosition + [Newtonsoft.Json.JsonPropertyAttribute("pulses_per_revolution")] + [System.ComponentModel.DescriptionAttribute("Pulses per revolution")] + public int PulsesPerRevolution { get { - return _startPosition; + return _pulsesPerRevolution; } set { - _startPosition = value; + _pulsesPerRevolution = value; } } /// - /// Length of the corridor site (cm) + /// Invert direction /// - [Newtonsoft.Json.JsonPropertyAttribute("length")] - [System.ComponentModel.DescriptionAttribute("Length of the corridor site (cm)")] - public double Length + [Newtonsoft.Json.JsonPropertyAttribute("invert_direction")] + [System.ComponentModel.DescriptionAttribute("Invert direction")] + public bool InvertDirection { get { - return _length; + return _invertDirection; } set { - _length = value; + _invertDirection = value; } } /// - /// The textures of the corridor + /// Brake lookup calibration. Each pair of values define (input [torque], output [brake set-point U16]) /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("textures", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The textures of the corridor")] - public WallTextures Textures + [Newtonsoft.Json.JsonPropertyAttribute("brake_lookup_calibration")] + [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 { - return _textures; + return _brakeLookupCalibration; } set { - _textures = value; + _brakeLookupCalibration = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VisualCorridor(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new VisualCorridor(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Id = " + _id + ", "); - stringBuilder.Append("Size = " + _size + ", "); - stringBuilder.Append("StartPosition = " + _startPosition + ", "); - stringBuilder.Append("Length = " + _length + ", "); - stringBuilder.Append("Textures = " + _textures); + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("WheelDiameter = " + _wheelDiameter + ", "); + stringBuilder.Append("PulsesPerRevolution = " + _pulsesPerRevolution + ", "); + stringBuilder.Append("InvertDirection = " + _invertDirection + ", "); + stringBuilder.Append("BrakeLookupCalibration = " + _brakeLookupCalibration); return true; } @@ -14435,144 +9219,73 @@ public override string ToString() stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - /// - /// Defines textures for all walls of a visual corridor in the VR environment. - /// - ///This class specifies the visual appearance of corridor surfaces including - ///floor, ceiling, and side walls, allowing for complex visual environments - ///with different textures on each surface. - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute(@"Defines textures for all walls of a visual corridor in the VR environment. - - This class specifies the visual appearance of corridor surfaces including - floor, ceiling, and side walls, allowing for complex visual environments - with different textures on each surface.")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WallTextures - { - - private Texture _floor; - - private Texture _ceiling; - - private Texture _left; - - private Texture _right; - - public WallTextures() - { - _floor = new Texture(); - _ceiling = new Texture(); - _left = new Texture(); - _right = new Texture(); - } - - protected WallTextures(WallTextures other) - { - _floor = other._floor; - _ceiling = other._ceiling; - _left = other._left; - _right = other._right; - } - - /// - /// The texture of the floor - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("floor", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the floor")] - public Texture Floor - { - get - { - return _floor; - } - set - { - _floor = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); } + } + + + /// + /// Defines treadmill friction properties for virtual sites. + /// + ///This class controls the friction experienced by the animal when moving + ///through different virtual sites, allowing for varied locomotion dynamics + ///across different regions of the environment. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines treadmill friction properties for virtual sites.\n\nThis class controls the" + + " friction experienced by the animal when moving\nthrough different virtual sites," + + " allowing for varied locomotion dynamics\nacross different regions of the environ" + + "ment.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class TreadmillSpecification + { - /// - /// The texture of the ceiling - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("ceiling", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the ceiling")] - public Texture Ceiling + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _friction; + + public TreadmillSpecification() { - get - { - return _ceiling; - } - set - { - _ceiling = value; - } } - /// - /// The texture of the left - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the left")] - public Texture Left + protected TreadmillSpecification(TreadmillSpecification other) { - get - { - return _left; - } - set - { - _left = value; - } + _friction = other._friction; } /// - /// The texture of the right + /// Friction of the treadmill (0-1). The drawn value must be between 0 and 1 /// [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("The texture of the right")] - public Texture Right + [Newtonsoft.Json.JsonPropertyAttribute("friction")] + [System.ComponentModel.DescriptionAttribute("Friction of the treadmill (0-1). The drawn value must be between 0 and 1")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Friction { get { - return _right; + return _friction; } set { - _right = value; + _friction = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WallTextures(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TreadmillSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new WallTextures(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new TreadmillSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("Floor = " + _floor + ", "); - stringBuilder.Append("Ceiling = " + _ceiling + ", "); - stringBuilder.Append("Left = " + _left + ", "); - stringBuilder.Append("Right = " + _right); + stringBuilder.Append("Friction = " + _friction); return true; } @@ -14592,149 +9305,175 @@ public override string ToString() /// - /// Water valve calibration class + /// Enumeration of parameters that can be targeted by numerical updaters. + /// + ///These targets define which task parameters can be dynamically modified + ///during task execution to adapt to animal performance or experimental needs. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Water valve calibration class")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibration + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum UpdaterTarget { - private string _deviceName; + [System.Runtime.Serialization.EnumMemberAttribute(Value="StopDurationOffset")] + StopDurationOffset = 0, - private WaterValveCalibrationInput _input; + [System.Runtime.Serialization.EnumMemberAttribute(Value="StopVelocityThreshold")] + StopVelocityThreshold = 1, - private WaterValveCalibrationOutput _output; + [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardDelayOffset")] + RewardDelayOffset = 2, + } + + + /// + /// Represents a 3D vector with float coordinates. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a 3D vector with float coordinates.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class Vector3 + { - private System.DateTimeOffset? _date; + private double _x; - private string _description; + private double _y; - private string _notes; + private double _z; - public WaterValveCalibration() + public Vector3() { - _deviceName = "WaterValve"; - _input = new WaterValveCalibrationInput(); - _output = new WaterValveCalibrationOutput(); - _description = "Calibration of the water valve delivery system"; + _x = 0D; + _y = 0D; + _z = 0D; } - protected WaterValveCalibration(WaterValveCalibration other) + protected Vector3(Vector3 other) { - _deviceName = other._deviceName; - _input = other._input; - _output = other._output; - _date = other._date; - _description = other._description; - _notes = other._notes; + _x = other._x; + _y = other._y; + _z = other._z; } /// - /// Name of the device being calibrated + /// X coordinate of the vector /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Name of the device being calibrated")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("x")] + [System.ComponentModel.DescriptionAttribute("X coordinate of the vector")] + public double X { get { - return _deviceName; + return _x; } set { - _deviceName = value; + _x = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("input", Required=Newtonsoft.Json.Required.Always)] - public WaterValveCalibrationInput Input + /// + /// Y coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("y")] + [System.ComponentModel.DescriptionAttribute("Y coordinate of the vector")] + public double Y { get { - return _input; + return _y; } set { - _input = value; + _y = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("output", Required=Newtonsoft.Json.Required.Always)] - public WaterValveCalibrationOutput Output + /// + /// Z coordinate of the vector + /// + [Newtonsoft.Json.JsonPropertyAttribute("z")] + [System.ComponentModel.DescriptionAttribute("Z coordinate of the vector")] + public double Z { get { - return _output; + return _z; } set { - _output = value; + _z = value; } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("date")] - public System.DateTimeOffset? Date + public System.IObservable Generate() { - get - { - return _date; - } - set - { - _date = value; - } + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Vector3(this))); } - [Newtonsoft.Json.JsonPropertyAttribute("description")] - public string Description + public System.IObservable Generate(System.IObservable source) { - get - { - return _description; - } - set - { - _description = value; - } + return System.Reactive.Linq.Observable.Select(source, _ => new Vector3(this)); } - [Newtonsoft.Json.JsonPropertyAttribute("notes")] - public string Notes + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - get - { - return _notes; - } - set + 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)) { - _notes = value; + stringBuilder.Append(" "); } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } + } + + + /// + /// FFMPEG video writer configuration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "video_writer_type")] + [JsonInheritanceAttribute("FFMPEG", typeof(VideoWriterFfmpeg))] + [JsonInheritanceAttribute("OPENCV", typeof(VideoWriterOpenCv))] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class VideoWriter + { + + public VideoWriter() + { } - public System.IObservable Generate() + protected VideoWriter(VideoWriter other) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibration(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriter(this))); + } + + public System.IObservable Generate(System.IObservable source) + { + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriter(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("Input = " + _input + ", "); - stringBuilder.Append("Output = " + _output + ", "); - stringBuilder.Append("Date = " + _date + ", "); - stringBuilder.Append("Description = " + _description + ", "); - stringBuilder.Append("Notes = " + _notes); - return true; + return false; } public override string ToString() @@ -14752,497 +9491,463 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// FFMPEG video writer configuration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("FFMPEG video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibrationInput + public partial class VideoWriterFfmpeg : VideoWriter { - private System.Collections.Generic.List _measurements; + private int _frameRate; + + private string _containerExtension; + + private string _outputArguments; + + private string _inputArguments; - public WaterValveCalibrationInput() + public VideoWriterFfmpeg() { - _measurements = new System.Collections.Generic.List(); + _frameRate = 30; + _containerExtension = "mkv"; + _outputArguments = "-vf \"scale=out_range=full,setparams=range=full:colorspace=bt709:color_primaries=bt709:color_trc=linear\" -c:v h264_nvenc -pix_fmt yuv420p -color_range full -colorspace bt709 -color_trc linear -tune hq -preset p3 -rc vbr -cq 18 -b:v 0M -metadata author=\"Allen Institute for Neural Dynamics\" -maxrate 700M -bufsize 350M -f matroska -write_crc32 0"; + _inputArguments = "-colorspace bt709 -color_primaries bt709 -color_range full -color_trc linear"; + } + + protected VideoWriterFfmpeg(VideoWriterFfmpeg other) : + base(other) + { + _frameRate = other._frameRate; + _containerExtension = other._containerExtension; + _outputArguments = other._outputArguments; + _inputArguments = other._inputArguments; + } + + /// + /// Encoding frame rate + /// + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] + public int FrameRate + { + get + { + return _frameRate; + } + set + { + _frameRate = value; + } } - protected WaterValveCalibrationInput(WaterValveCalibrationInput other) + /// + /// Container extension + /// + [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] + [System.ComponentModel.DescriptionAttribute("Container extension")] + public string ContainerExtension { - _measurements = other._measurements; + get + { + return _containerExtension; + } + set + { + _containerExtension = value; + } } /// - /// List of measurements + /// Output arguments /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("measurements")] - [System.ComponentModel.DescriptionAttribute("List of measurements")] - public System.Collections.Generic.List Measurements + [Newtonsoft.Json.JsonPropertyAttribute("output_arguments")] + [System.ComponentModel.DescriptionAttribute("Output arguments")] + public string OutputArguments { get { - return _measurements; + return _outputArguments; } set { - _measurements = value; + _outputArguments = value; } } - public System.IObservable Generate() + /// + /// Input arguments + /// + [Newtonsoft.Json.JsonPropertyAttribute("input_arguments")] + [System.ComponentModel.DescriptionAttribute("Input arguments")] + public string InputArguments { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibrationInput(this))); + get + { + return _inputArguments; + } + set + { + _inputArguments = value; + } } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibrationInput(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterFfmpeg(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("Measurements = " + _measurements); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterFfmpeg(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("OutputArguments = " + _outputArguments + ", "); + stringBuilder.Append("InputArguments = " + _inputArguments); + return true; } } /// - /// Output for water valve calibration class + /// OpenCV video writer configuration. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Output for water valve calibration class")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("OpenCV video writer configuration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WaterValveCalibrationOutput + public partial class VideoWriterOpenCv : VideoWriter { - private System.Collections.Generic.Dictionary _intervalAverage; - - private double _slope; - - private double _offset; - - private double? _r2; - - private System.Collections.Generic.List _validDomain; + private int _frameRate; - public WaterValveCalibrationOutput() - { - } + private string _containerExtension; - protected WaterValveCalibrationOutput(WaterValveCalibrationOutput other) - { - _intervalAverage = other._intervalAverage; - _slope = other._slope; - _offset = other._offset; - _r2 = other._r2; - _validDomain = other._validDomain; - } + private string _fourCc; - /// - /// Dictionary keyed by measured valve interval and corresponding average single event volume. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("interval_average")] - [System.ComponentModel.DescriptionAttribute("Dictionary keyed by measured valve interval and corresponding average single even" + - "t volume.")] - public System.Collections.Generic.Dictionary IntervalAverage + public VideoWriterOpenCv() { - get - { - return _intervalAverage; - } - set - { - _intervalAverage = value; - } + _frameRate = 30; + _containerExtension = "avi"; + _fourCc = "FMP4"; } - /// - /// Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) - /// - [Newtonsoft.Json.JsonPropertyAttribute("slope", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] - public double Slope + protected VideoWriterOpenCv(VideoWriterOpenCv other) : + base(other) { - get - { - return _slope; - } - set - { - _slope = value; - } + _frameRate = other._frameRate; + _containerExtension = other._containerExtension; + _fourCc = other._fourCc; } /// - /// Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) + /// Encoding frame rate /// - [Newtonsoft.Json.JsonPropertyAttribute("offset", Required=Newtonsoft.Json.Required.Always)] - [System.ComponentModel.DescriptionAttribute("Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] - public double Offset + [Newtonsoft.Json.JsonPropertyAttribute("frame_rate")] + [System.ComponentModel.DescriptionAttribute("Encoding frame rate")] + public int FrameRate { get { - return _offset; + return _frameRate; } set { - _offset = value; + _frameRate = value; } } /// - /// R2 metric from the linear model. + /// Container extension /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("r2")] - [System.ComponentModel.DescriptionAttribute("R2 metric from the linear model.")] - public double? R2 + [Newtonsoft.Json.JsonPropertyAttribute("container_extension")] + [System.ComponentModel.DescriptionAttribute("Container extension")] + public string ContainerExtension { get { - return _r2; + return _containerExtension; } set { - _r2 = value; + _containerExtension = value; } } /// - /// The optional time-intervals the calibration curve was calculated on. + /// Four character code /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("valid_domain")] - [System.ComponentModel.DescriptionAttribute("The optional time-intervals the calibration curve was calculated on.")] - public System.Collections.Generic.List ValidDomain + [Newtonsoft.Json.JsonPropertyAttribute("four_cc")] + [System.ComponentModel.DescriptionAttribute("Four character code")] + public string FourCc { get { - return _validDomain; + return _fourCc; } set { - _validDomain = value; + _fourCc = value; } } - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibrationOutput(this))); - } - - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibrationOutput(this)); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VideoWriterOpenCv(this))); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + public System.IObservable Generate(System.IObservable source) { - stringBuilder.Append("IntervalAverage = " + _intervalAverage + ", "); - stringBuilder.Append("Slope = " + _slope + ", "); - stringBuilder.Append("Offset = " + _offset + ", "); - stringBuilder.Append("R2 = " + _r2 + ", "); - stringBuilder.Append("ValidDomain = " + _validDomain); - return true; + return System.Reactive.Linq.Observable.Select(source, _ => new VideoWriterOpenCv(this)); } - public override string ToString() + protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + if (base.PrintMembers(stringBuilder)) { - stringBuilder.Append(" "); + stringBuilder.Append(", "); } - stringBuilder.Append("}"); - return stringBuilder.ToString(); + stringBuilder.Append("FrameRate = " + _frameRate + ", "); + stringBuilder.Append("ContainerExtension = " + _containerExtension + ", "); + stringBuilder.Append("FourCc = " + _fourCc); + return true; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + ///Represents a specific virtual site instance in the VR environment. + /// + ///This class defines a concrete virtual site with specific properties like position, + ///length, and associated specifications. It is typically generated from VirtualSiteGenerator + ///templates rather than being directly instantiated in the DSL. + /// + ///Note: This class is primarily used internally for runtime site generation + ///and is not meant to be directly instantiated in task configuration DSL. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + Represents a specific virtual site instance in the VR environment. + + This class defines a concrete virtual site with specific properties like position, + length, and associated specifications. It is typically generated from VirtualSiteGenerator + templates rather than being directly instantiated in the DSL. + + Note: This class is primarily used internally for runtime site generation + and is not meant to be directly instantiated in task configuration DSL.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class WebCamera + public partial class VirtualSite { - private string _deviceType; + private int _id; - private string _deviceName; + private VirtualSiteLabels _label; - private BaseModel _additionalSettings; + private double _length; - private BaseModel _calibration; + private double _startPosition; - private int _index; + private System.Collections.Generic.List _odorSpecification; - private VideoWriter _videoWriter; + private VirtualSiteRewardSpecification _rewardSpecification; - public WebCamera() - { - _deviceType = "WebCamera"; - _index = 0; - } + private RenderSpecification _renderSpecification; - protected WebCamera(WebCamera other) + private TreadmillSpecification _treadmillSpecification; + + public VirtualSite() { - _deviceType = other._deviceType; - _deviceName = other._deviceName; - _additionalSettings = other._additionalSettings; - _calibration = other._calibration; - _index = other._index; - _videoWriter = other._videoWriter; + _id = 0; + _label = VirtualSiteLabels.Unspecified; + _length = 20D; + _startPosition = 0D; + _renderSpecification = new RenderSpecification(); } - /// - /// Device type - /// - [Newtonsoft.Json.JsonPropertyAttribute("device_type")] - [System.ComponentModel.DescriptionAttribute("Device type")] - public string DeviceType + protected VirtualSite(VirtualSite other) { - get - { - return _deviceType; - } - set - { - _deviceType = value; - } + _id = other._id; + _label = other._label; + _length = other._length; + _startPosition = other._startPosition; + _odorSpecification = other._odorSpecification; + _rewardSpecification = other._rewardSpecification; + _renderSpecification = other._renderSpecification; + _treadmillSpecification = other._treadmillSpecification; } /// - /// Device name + /// Id of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("device_name")] - [System.ComponentModel.DescriptionAttribute("Device name")] - public string DeviceName + [Newtonsoft.Json.JsonPropertyAttribute("id")] + [System.ComponentModel.DescriptionAttribute("Id of the virtual site")] + public int Id { get { - return _deviceName; + return _id; } set { - _deviceName = value; + _id = value; } } /// - /// Additional settings + /// Label of the virtual site /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("additional_settings")] - [System.ComponentModel.DescriptionAttribute("Additional settings")] - public BaseModel AdditionalSettings + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] + public VirtualSiteLabels Label { get { - return _additionalSettings; + return _label; } set { - _additionalSettings = value; + _label = value; } } /// - /// Calibration + /// Length of the virtual site (cm) /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("calibration")] - [System.ComponentModel.DescriptionAttribute("Calibration")] - public BaseModel Calibration + [Newtonsoft.Json.JsonPropertyAttribute("length")] + [System.ComponentModel.DescriptionAttribute("Length of the virtual site (cm)")] + public double Length { get { - return _calibration; + return _length; } set { - _calibration = value; + _length = value; } } /// - /// Camera index + /// Start position of the virtual site (cm) /// - [Newtonsoft.Json.JsonPropertyAttribute("index")] - [System.ComponentModel.DescriptionAttribute("Camera index")] - public int Index + [Newtonsoft.Json.JsonPropertyAttribute("start_position")] + [System.ComponentModel.DescriptionAttribute("Start position of the virtual site (cm)")] + public double StartPosition { get { - return _index; + return _startPosition; } set { - _index = value; + _startPosition = value; } } /// - /// Video writer. If not provided, no video will be saved. + /// The optional odor specification of the virtual site /// [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 + [Newtonsoft.Json.JsonPropertyAttribute("odor_specification")] + [System.ComponentModel.DescriptionAttribute("The optional odor specification of the virtual site")] + public System.Collections.Generic.List OdorSpecification { get { - return _videoWriter; + return _odorSpecification; } set { - _videoWriter = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WebCamera(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new WebCamera(this)); - } - - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - stringBuilder.Append("DeviceType = " + _deviceType + ", "); - stringBuilder.Append("DeviceName = " + _deviceName + ", "); - stringBuilder.Append("AdditionalSettings = " + _additionalSettings + ", "); - stringBuilder.Append("Calibration = " + _calibration + ", "); - stringBuilder.Append("Index = " + _index + ", "); - stringBuilder.Append("VideoWriter = " + _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(" "); + _odorSpecification = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorServicesRigVisualStimulationVector3 - { - - private double _x; - - private double _y; - - private double _z; - - public AindBehaviorServicesRigVisualStimulationVector3() - { - _x = 0D; - _y = 0D; - _z = 0D; - } - - protected AindBehaviorServicesRigVisualStimulationVector3(AindBehaviorServicesRigVisualStimulationVector3 other) - { - _x = other._x; - _y = other._y; - _z = other._z; } /// - /// X coordinate of the point + /// The optional reward specification of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] - public double X + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_specification")] + [System.ComponentModel.DescriptionAttribute("The optional reward specification of the virtual site")] + public VirtualSiteRewardSpecification RewardSpecification { get { - return _x; + return _rewardSpecification; } set { - _x = value; + _rewardSpecification = value; } } /// - /// Y coordinate of the point + /// The optional render specification of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] - public double Y + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] + [System.ComponentModel.DescriptionAttribute("The optional render specification of the virtual site")] + public RenderSpecification RenderSpecification { get { - return _y; + return _renderSpecification; } set { - _y = value; + _renderSpecification = value; } } /// - /// Z coordinate of the point + /// Treadmill specification /// - [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] - public double Z + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] + [System.ComponentModel.DescriptionAttribute("Treadmill specification")] + public TreadmillSpecification TreadmillSpecification { get { - return _z; + return _treadmillSpecification; } set { - _z = value; + _treadmillSpecification = value; } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorServicesRigVisualStimulationVector3(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSite(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorServicesRigVisualStimulationVector3(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSite(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - stringBuilder.Append("X = " + _x + ", "); - stringBuilder.Append("Y = " + _y + ", "); - stringBuilder.Append("Z = " + _z); + stringBuilder.Append("Id = " + _id + ", "); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("Length = " + _length + ", "); + stringBuilder.Append("StartPosition = " + _startPosition + ", "); + stringBuilder.Append("OdorSpecification = " + _odorSpecification + ", "); + stringBuilder.Append("RewardSpecification = " + _rewardSpecification + ", "); + stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); + stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); return true; } @@ -15262,152 +9967,134 @@ public override string ToString() /// - /// Represents a 3D point or vector with x, y, and z coordinates. + /// Generates virtual site specifications with randomized properties. /// - ///Used for 3D positioning and movement in the virtual reality environment, - ///including camera positions, object locations, and 3D transformations. + ///This class defines templates for creating virtual sites with variable properties + ///like length and rendering specifications. It's used to generate diverse virtual + ///environments for the foraging task. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DescriptionAttribute("Represents a 3D point or vector with x, y, and z coordinates.\n\nUsed for 3D positi" + - "oning and movement in the virtual reality environment,\nincluding camera position" + - "s, object locations, and 3D transformations.")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Generates virtual site specifications with randomized properties. + + This class defines templates for creating virtual sites with variable properties + like length and rendering specifications. It's used to generate diverse virtual + environments for the foraging task.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class AindBehaviorVrForagingTaskLogicVector3 + public partial class VirtualSiteGenerator { - private double _x; + private RenderSpecification _renderSpecification; - private double _y; + private VirtualSiteLabels _label; - private double _z; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _lengthDistribution; + + private TreadmillSpecification _treadmillSpecification; - public AindBehaviorVrForagingTaskLogicVector3() + public VirtualSiteGenerator() { - _x = 0D; - _y = 0D; - _z = 0D; + _renderSpecification = new RenderSpecification(); + _label = VirtualSiteLabels.Unspecified; + _lengthDistribution = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - protected AindBehaviorVrForagingTaskLogicVector3(AindBehaviorVrForagingTaskLogicVector3 other) + protected VirtualSiteGenerator(VirtualSiteGenerator other) { - _x = other._x; - _y = other._y; - _z = other._z; + _renderSpecification = other._renderSpecification; + _label = other._label; + _lengthDistribution = other._lengthDistribution; + _treadmillSpecification = other._treadmillSpecification; } /// - /// X coordinate of the point + /// Contrast of the environment /// - [Newtonsoft.Json.JsonPropertyAttribute("x")] - [System.ComponentModel.DescriptionAttribute("X coordinate of the point")] - public double X + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("render_specification")] + [System.ComponentModel.DescriptionAttribute("Contrast of the environment")] + public RenderSpecification RenderSpecification { get { - return _x; + return _renderSpecification; } set { - _x = value; + _renderSpecification = value; } } /// - /// Y coordinate of the point + /// Label of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("y")] - [System.ComponentModel.DescriptionAttribute("Y coordinate of the point")] - public double Y + [Newtonsoft.Json.JsonPropertyAttribute("label")] + [System.ComponentModel.DescriptionAttribute("Label of the virtual site")] + public VirtualSiteLabels Label { get { - return _y; + return _label; } set { - _y = value; + _label = value; } } /// - /// Z coordinate of the point + /// Distribution of the length of the virtual site /// - [Newtonsoft.Json.JsonPropertyAttribute("z")] - [System.ComponentModel.DescriptionAttribute("Z coordinate of the point")] - public double Z + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("length_distribution")] + [System.ComponentModel.DescriptionAttribute("Distribution of the length of the virtual site")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution LengthDistribution { get - { - return _z; - } - set - { - _z = value; - } - } - - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new AindBehaviorVrForagingTaskLogicVector3(this))); - } - - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new AindBehaviorVrForagingTaskLogicVector3(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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Delay - { - - public Delay() - { + { + return _lengthDistribution; + } + set + { + _lengthDistribution = value; + } } - protected Delay(Delay other) + /// + /// Treadmill specification + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("treadmill_specification")] + [System.ComponentModel.DescriptionAttribute("Treadmill specification")] + public TreadmillSpecification TreadmillSpecification { + get + { + return _treadmillSpecification; + } + set + { + _treadmillSpecification = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Delay(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteGenerator(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Delay(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteGenerator(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("RenderSpecification = " + _renderSpecification + ", "); + stringBuilder.Append("Label = " + _label + ", "); + stringBuilder.Append("LengthDistribution = " + _lengthDistribution + ", "); + stringBuilder.Append("TreadmillSpecification = " + _treadmillSpecification); + return true; } public override string ToString() @@ -15425,124 +10112,119 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Amount + /// + /// Enumeration of virtual site types in the VR foraging environment. + /// + ///These labels categorize different regions of the virtual environment, + ///each serving different functional roles in the foraging task. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum VirtualSiteLabels { - public Amount() - { - } - - protected Amount(Amount other) - { - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="Unspecified")] + Unspecified = 0, - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Amount(this))); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="InterPatch")] + InterPatch = 1, - public System.IObservable Generate(System.IObservable source) - { - return System.Reactive.Linq.Observable.Select(source, _ => new Amount(this)); - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="PostPatch")] + PostPatch = 2, - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) - { - return false; - } + [System.Runtime.Serialization.EnumMemberAttribute(Value="RewardSite")] + RewardSite = 3, - 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="InterSite")] + InterSite = 4, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] + /// + /// THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + ///Specifies reward parameters and behavior for a virtual site. + /// + ///Note: This class is primarily used internally for runtime site generation + ///and is not meant to be directly instantiated in task configuration DSL. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. + Specifies reward parameters and behavior for a virtual site. + + Note: This class is primarily used internally for runtime site generation + and is not meant to be directly instantiated in task configuration DSL.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Probability + public partial class VirtualSiteRewardSpecification { - public Probability() - { - } - - protected Probability(Probability other) - { - } + private OperantLogic _operantLogic; - public System.IObservable Generate() - { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Probability(this))); - } + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _delay; - public System.IObservable Generate(System.IObservable source) + public VirtualSiteRewardSpecification() { - return System.Reactive.Linq.Observable.Select(source, _ => new Probability(this)); + _operantLogic = new OperantLogic(); + _delay = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + protected VirtualSiteRewardSpecification(VirtualSiteRewardSpecification other) { - return false; + _operantLogic = other._operantLogic; + _delay = other._delay; } - public override string ToString() + /// + /// The optional operant logic of the reward + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("operant_logic", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The optional operant logic of the reward")] + public OperantLogic OperantLogic { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _operantLogic; + } + set + { + _operantLogic = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Available - { - - public Available() - { } - protected Available(Available other) + /// + /// The optional distribution where the delay to reward will be drawn from + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("delay")] + [System.ComponentModel.DescriptionAttribute("The optional distribution where the delay to reward will be drawn from")] + public AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution Delay { + get + { + return _delay; + } + set + { + _delay = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Available(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VirtualSiteRewardSpecification(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Available(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VirtualSiteRewardSpecification(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("OperantLogic = " + _operantLogic + ", "); + stringBuilder.Append("Delay = " + _delay); + return true; } public override string ToString() @@ -15560,79 +10242,154 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] + /// + /// Defines a visual corridor segment in the VR environment. + /// + ///Visual corridors are the basic building blocks of the VR environment, + ///defining spatial regions with specific textures, dimensions, and positions. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Defines a visual corridor segment in the VR environment.\n\nVisual corridors are th" + + "e basic building blocks of the VR environment,\ndefining spatial regions with spe" + + "cific textures, dimensions, and positions.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Rate + public partial class VisualCorridor { - public Rate() - { - } + private int _id; + + private Size _size; + + private double _startPosition; + + private double _length; - protected Rate(Rate other) + private WallTextures _textures; + + public VisualCorridor() { + _id = 0; + _size = new Size(); + _startPosition = 0D; + _length = 120D; + _textures = new WallTextures(); } - public System.IObservable Generate() + protected VisualCorridor(VisualCorridor other) { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Rate(this))); + _id = other._id; + _size = other._size; + _startPosition = other._startPosition; + _length = other._length; + _textures = other._textures; } - public System.IObservable Generate(System.IObservable source) + /// + /// Id of the visual corridor object + /// + [Newtonsoft.Json.JsonPropertyAttribute("id")] + [System.ComponentModel.DescriptionAttribute("Id of the visual corridor object")] + public int Id { - return System.Reactive.Linq.Observable.Select(source, _ => new Rate(this)); + get + { + return _id; + } + set + { + _id = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Size of the corridor (cm) + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("size")] + [System.ComponentModel.DescriptionAttribute("Size of the corridor (cm)")] + public Size Size { - return false; + get + { + return _size; + } + set + { + _size = value; + } } - public override string ToString() + /// + /// Start position of the corridor (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("start_position")] + [System.ComponentModel.DescriptionAttribute("Start position of the corridor (cm)")] + public double StartPosition { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _startPosition; + } + set + { + _startPosition = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Value - { - public Value() + /// + /// Length of the corridor site (cm) + /// + [Newtonsoft.Json.JsonPropertyAttribute("length")] + [System.ComponentModel.DescriptionAttribute("Length of the corridor site (cm)")] + public double Length { + get + { + return _length; + } + set + { + _length = value; + } } - protected Value(Value other) + /// + /// The textures of the corridor + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("textures", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The textures of the corridor")] + public WallTextures Textures { + get + { + return _textures; + } + set + { + _textures = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Value(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new VisualCorridor(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Value(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new VisualCorridor(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Id = " + _id + ", "); + stringBuilder.Append("Size = " + _size + ", "); + stringBuilder.Append("StartPosition = " + _startPosition + ", "); + stringBuilder.Append("Length = " + _length + ", "); + stringBuilder.Append("Textures = " + _textures); + return true; } public override string ToString() @@ -15650,79 +10407,137 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] + /// + /// Defines textures for all walls of a visual corridor in the VR environment. + /// + ///This class specifies the visual appearance of corridor surfaces including + ///floor, ceiling, and side walls, allowing for complex visual environments + ///with different textures on each surface. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute(@"Defines textures for all walls of a visual corridor in the VR environment. + + This class specifies the visual appearance of corridor surfaces including + floor, ceiling, and side walls, allowing for complex visual environments + with different textures on each surface.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class LengthDistribution + public partial class WallTextures { - public LengthDistribution() - { - } + private Texture _floor; - protected LengthDistribution(LengthDistribution other) - { - } + private Texture _ceiling; + + private Texture _left; - public System.IObservable Generate() + private Texture _right; + + public WallTextures() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new LengthDistribution(this))); + _floor = new Texture(); + _ceiling = new Texture(); + _left = new Texture(); + _right = new Texture(); } - public System.IObservable Generate(System.IObservable source) + protected WallTextures(WallTextures other) { - return System.Reactive.Linq.Observable.Select(source, _ => new LengthDistribution(this)); + _floor = other._floor; + _ceiling = other._ceiling; + _left = other._left; + _right = other._right; } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// The texture of the floor + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("floor", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the floor")] + public Texture Floor { - return false; + get + { + return _floor; + } + set + { + _floor = value; + } } - public override string ToString() + /// + /// The texture of the ceiling + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("ceiling", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the ceiling")] + public Texture Ceiling { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _ceiling; + } + set + { + _ceiling = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "family")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class Count - { - public Count() + /// + /// The texture of the left + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the left")] + public Texture Left { + get + { + return _left; + } + set + { + _left = value; + } } - protected Count(Count other) + /// + /// The texture of the right + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("The texture of the right")] + public Texture Right { + get + { + return _right; + } + set + { + _right = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new Count(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WallTextures(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new Count(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WallTextures(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Floor = " + _floor + ", "); + stringBuilder.Append("Ceiling = " + _ceiling + ", "); + stringBuilder.Append("Left = " + _left + ", "); + stringBuilder.Append("Right = " + _right); + return true; } public override string ToString() @@ -15733,193 +10548,197 @@ public override string ToString() if (PrintMembers(stringBuilder)) { stringBuilder.Append(" "); - } - stringBuilder.Append("}"); - return stringBuilder.ToString(); - } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - public enum OlfactometerChannelConfigFlowRateCapacity - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="100")] - _100 = 100, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="1000")] - _1000 = 1000, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum OutsideRewardFunctionRule - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] - OnTime = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] - OnDistance = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] - OnTimeAccumulated = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] - OnDistanceAccumulated = 3, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum PatchRewardFunctionRule - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] - OnReward = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] - OnChoice = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] - OnTime = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] - OnDistance = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] - OnChoiceAccumulated = 4, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] - OnRewardAccumulated = 5, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] - OnTimeAccumulated = 6, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] - OnDistanceAccumulated = 7, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum PersistentRewardFunctionRule - { - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] - OnReward = 0, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] - OnChoice = 1, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] - OnTime = 2, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] - OnDistance = 3, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] - OnChoiceAccumulated = 4, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] - OnRewardAccumulated = 5, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] - OnTimeAccumulated = 6, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] - OnDistanceAccumulated = 7, - - [System.Runtime.Serialization.EnumMemberAttribute(Value="OnPatchEntry")] - OnPatchEntry = 8, + } + stringBuilder.Append("}"); + return stringBuilder.ToString(); + } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + /// + /// Represents a water valve calibration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Represents a water valve calibration.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class TruncationParameters2 + public partial class WaterValveCalibration { - public TruncationParameters2() + private System.DateTimeOffset? _date; + + private System.Collections.Generic.List _measurements; + + private System.Collections.Generic.Dictionary _intervalAverage; + + private double _slope; + + private double _offset; + + private double? _r2; + + private System.Collections.Generic.List _validDomain; + + public WaterValveCalibration() { + _measurements = new System.Collections.Generic.List(); } - protected TruncationParameters2(TruncationParameters2 other) + protected WaterValveCalibration(WaterValveCalibration other) { + _date = other._date; + _measurements = other._measurements; + _intervalAverage = other._intervalAverage; + _slope = other._slope; + _offset = other._offset; + _r2 = other._r2; + _validDomain = other._validDomain; } - public System.IObservable Generate() + /// + /// Date of the calibration + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("date")] + [System.ComponentModel.DescriptionAttribute("Date of the calibration")] + public System.DateTimeOffset? Date { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new TruncationParameters2(this))); + get + { + return _date; + } + set + { + _date = value; + } } - public System.IObservable Generate(System.IObservable source) + /// + /// List of measurements + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("measurements")] + [System.ComponentModel.DescriptionAttribute("List of measurements")] + public System.Collections.Generic.List Measurements { - return System.Reactive.Linq.Observable.Select(source, _ => new TruncationParameters2(this)); + get + { + return _measurements; + } + set + { + _measurements = value; + } } - protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) + /// + /// Dictionary keyed by measured valve interval and corresponding average single event volume. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("interval_average")] + [System.ComponentModel.DescriptionAttribute("Dictionary keyed by measured valve interval and corresponding average single even" + + "t volume.")] + public System.Collections.Generic.Dictionary IntervalAverage { - return false; + get + { + return _intervalAverage; + } + set + { + _intervalAverage = value; + } } - public override string ToString() + /// + /// Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) + /// + [Newtonsoft.Json.JsonPropertyAttribute("slope", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Slope of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] + public double Slope { - System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); - stringBuilder.Append(GetType().Name); - stringBuilder.Append(" { "); - if (PrintMembers(stringBuilder)) + get { - stringBuilder.Append(" "); + return _slope; + } + set + { + _slope = value; + } + } + + /// + /// Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g) + /// + [Newtonsoft.Json.JsonPropertyAttribute("offset", Required=Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DescriptionAttribute("Offset of the linear regression : Volume(g) = Slope(g/s) * time(s) + offset(g)")] + public double Offset + { + get + { + return _offset; + } + set + { + _offset = value; } - stringBuilder.Append("}"); - return stringBuilder.ToString(); } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] - [Bonsai.CombinatorAttribute(MethodName="Generate")] - public partial class ScalingParameters2 - { - public ScalingParameters2() + /// + /// R2 metric from the linear model. + /// + [Newtonsoft.Json.JsonPropertyAttribute("r2")] + [System.ComponentModel.DescriptionAttribute("R2 metric from the linear model.")] + public double? R2 { + get + { + return _r2; + } + set + { + _r2 = value; + } } - protected ScalingParameters2(ScalingParameters2 other) + /// + /// The optional time-intervals the calibration curve was calculated on. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("valid_domain")] + [System.ComponentModel.DescriptionAttribute("The optional time-intervals the calibration curve was calculated on.")] + public System.Collections.Generic.List ValidDomain { + get + { + return _validDomain; + } + set + { + _validDomain = value; + } } - public System.IObservable Generate() + public System.IObservable Generate() { - return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new ScalingParameters2(this))); + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WaterValveCalibration(this))); } - public System.IObservable Generate(System.IObservable source) + public System.IObservable Generate(System.IObservable source) { - return System.Reactive.Linq.Observable.Select(source, _ => new ScalingParameters2(this)); + return System.Reactive.Linq.Observable.Select(source, _ => new WaterValveCalibration(this)); } protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - return false; + stringBuilder.Append("Date = " + _date + ", "); + stringBuilder.Append("Measurements = " + _measurements + ", "); + stringBuilder.Append("IntervalAverage = " + _intervalAverage + ", "); + stringBuilder.Append("Slope = " + _slope + ", "); + stringBuilder.Append("Offset = " + _offset + ", "); + stringBuilder.Append("R2 = " + _r2 + ", "); + stringBuilder.Append("ValidDomain = " + _validDomain); + return true; } public override string ToString() @@ -15937,555 +10756,406 @@ public override string ToString() } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum SpinnakerCameraColorProcessing + /// + /// Web camera device configuration. + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.ComponentModel.DescriptionAttribute("Web camera device configuration.")] + [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Source)] + [Bonsai.CombinatorAttribute(MethodName="Generate")] + public partial class WebCamera { - [System.Runtime.Serialization.EnumMemberAttribute(Value="Default")] - Default = 0, + private string _deviceType; - [System.Runtime.Serialization.EnumMemberAttribute(Value="NoColorProcessing")] - NoColorProcessing = 1, - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] - public enum TruncationParametersTruncationMode - { + private BaseModel _calibration; - [System.Runtime.Serialization.EnumMemberAttribute(Value="exclude")] - Exclude = 0, + private int _index; - [System.Runtime.Serialization.EnumMemberAttribute(Value="clamp")] - Clamp = 1, - } - - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] - internal class JsonInheritanceAttribute : System.Attribute - { - public JsonInheritanceAttribute(string key, System.Type type) + private VideoWriter _videoWriter; + + public WebCamera() { - Key = key; - Type = type; + _deviceType = "WebCamera"; + _index = 0; } - - public string Key { get; private set; } - - public System.Type Type { get; private set; } - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] - public class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter - { - internal static readonly string DefaultDiscriminatorName = "discriminator"; - - private readonly string _discriminatorName; - - [System.ThreadStatic] - private static bool _isReading; - - [System.ThreadStatic] - private static bool _isWriting; - - public JsonInheritanceConverter() + + protected WebCamera(WebCamera other) { - _discriminatorName = DefaultDiscriminatorName; + _deviceType = other._deviceType; + _calibration = other._calibration; + _index = other._index; + _videoWriter = other._videoWriter; } - - public JsonInheritanceConverter(string discriminatorName) + + [Newtonsoft.Json.JsonPropertyAttribute("device_type")] + public string DeviceType { - _discriminatorName = discriminatorName; + get + { + return _deviceType; + } + set + { + _deviceType = value; + } } - - public string DiscriminatorName { get { return _discriminatorName; } } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) + + /// + /// Calibration for the device. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("calibration")] + [System.ComponentModel.DescriptionAttribute("Calibration for the device.")] + public BaseModel Calibration { - try + get { - _isWriting = true; - - var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); - jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminatorName, GetSubtypeDiscriminator(value.GetType()))); - writer.WriteToken(jObject.CreateReader()); + return _calibration; } - finally + set { - _isWriting = false; + _calibration = value; } } - - public override bool CanWrite + + /// + /// Camera index + /// + [Newtonsoft.Json.JsonPropertyAttribute("index")] + [System.ComponentModel.DescriptionAttribute("Camera index")] + public int Index { get { - if (_isWriting) - { - _isWriting = false; - return false; - } - return true; + return _index; + } + set + { + _index = value; } } - - public override bool CanRead + + /// + /// 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 { - if (_isReading) - { - _isReading = false; - return false; - } - return true; + return _videoWriter; + } + set + { + _videoWriter = value; } } - - public override bool CanConvert(System.Type objectType) + + public System.IObservable Generate() { - return true; + return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new WebCamera(this))); } - - public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) + + public System.IObservable Generate(System.IObservable source) { - var jObject = serializer.Deserialize(reader); - if (jObject == null) - return null; - - var discriminatorValue = jObject.GetValue(_discriminatorName); - var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; - var subtype = GetObjectSubtype(objectType, discriminator); - - var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; - if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminatorName)) - { - jObject.Remove(_discriminatorName); - } - - try - { - _isReading = true; - return serializer.Deserialize(jObject.CreateReader(), subtype); - } - finally - { - _isReading = false; - } + return System.Reactive.Linq.Observable.Select(source, _ => new WebCamera(this)); } - - private System.Type GetObjectSubtype(System.Type objectType, string discriminator) + + protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { - foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) - { - if (attribute.Key == discriminator) - return attribute.Type; - } - - return objectType; + stringBuilder.Append("DeviceType = " + _deviceType + ", "); + stringBuilder.Append("Calibration = " + _calibration + ", "); + stringBuilder.Append("Index = " + _index + ", "); + stringBuilder.Append("VideoWriter = " + _videoWriter); + return true; } - - private string GetSubtypeDiscriminator(System.Type objectType) + + public override string ToString() { - foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) + System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); + stringBuilder.Append(GetType().Name); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) { - if (attribute.Type == objectType) - return attribute.Key; + stringBuilder.Append(" "); } - - return objectType.Name; + stringBuilder.Append("}"); + return stringBuilder.ToString(); } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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 + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum BlockStructureSamplingMode { - public Bonsai.Expressions.TypeMapping Type { get; set; } + [System.Runtime.Serialization.EnumMemberAttribute(Value="Random")] + Random = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="Sequential")] + Sequential = 1, + } - 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)); - } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public enum OlfactometerChannelConfigFlowRateCapacity + { - 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.Runtime.Serialization.EnumMemberAttribute(Value="100")] + _100 = 100, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="1000")] + _1000 = 1000, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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))] - [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 MatchDistribution : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum OutsideRewardFunctionRule { - public Bonsai.Expressions.TypeMapping Type { get; set; } + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] + OnTime = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] + OnDistance = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] + OnTimeAccumulated = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] + OnDistanceAccumulated = 3, + } - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) - { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Distribution); - return System.Linq.Expressions.Expression.Call( - typeof(MatchDistribution), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum PatchRewardFunctionRule + { - private static System.IObservable Process(System.IObservable source) - where TResult : Distribution - { - 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.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] + OnReward = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] + OnChoice = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] + OnTime = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] + OnDistance = 3, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] + OnChoiceAccumulated = 4, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] + OnRewardAccumulated = 5, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] + OnTimeAccumulated = 6, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] + OnDistanceAccumulated = 7, + } + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum PersistentRewardFunctionRule + { + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnReward")] + OnReward = 0, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoice")] + OnChoice = 1, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTime")] + OnTime = 2, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistance")] + OnDistance = 3, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnChoiceAccumulated")] + OnChoiceAccumulated = 4, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnRewardAccumulated")] + OnRewardAccumulated = 5, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnTimeAccumulated")] + OnTimeAccumulated = 6, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnDistanceAccumulated")] + OnDistanceAccumulated = 7, + + [System.Runtime.Serialization.EnumMemberAttribute(Value="OnPatchEntry")] + OnPatchEntry = 8, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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 MatchPatchTerminator : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum SpinnakerCameraColorProcessing { - 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(PatchTerminator); - return System.Linq.Expressions.Expression.Call( - typeof(MatchPatchTerminator), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } - + [System.Runtime.Serialization.EnumMemberAttribute(Value="Default")] + Default = 0, - private static System.IObservable Process(System.IObservable source) - where TResult : PatchTerminator - { - 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.Runtime.Serialization.EnumMemberAttribute(Value="NoColorProcessing")] + NoColorProcessing = 1, } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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 MatchPatchUpdateFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] + internal class JsonInheritanceAttribute : System.Attribute { - - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public JsonInheritanceAttribute(string key, System.Type type) { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchUpdateFunction); - return System.Linq.Expressions.Expression.Call( - typeof(MatchPatchUpdateFunction), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + Key = key; + Type = type; } - - private static System.IObservable Process(System.IObservable source) - where TResult : PatchUpdateFunction - { - 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); - }); - } - } + public string Key { get; private set; } + public System.Type Type { get; private set; } + } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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))] - public partial class MatchRewardFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.9.0.0 (Newtonsoft.Json v13.0.0.0)")] + public class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter { - - 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(RewardFunction); - return System.Linq.Expressions.Expression.Call( - typeof(MatchRewardFunction), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); - } + internal static readonly string DefaultDiscriminatorName = "discriminator"; - - private static System.IObservable Process(System.IObservable source) - where TResult : RewardFunction - { - 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); - }); - } - } + private readonly string _discriminatorName; + [System.ThreadStatic] + private static bool _isReading; - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.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))] - public partial class MatchVideoWriter : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } + [System.ThreadStatic] + private static bool _isWriting; - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public JsonInheritanceConverter() { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(VideoWriter); - return System.Linq.Expressions.Expression.Call( - typeof(MatchVideoWriter), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + _discriminatorName = DefaultDiscriminatorName; } - - private static System.IObservable Process(System.IObservable source) - where TResult : VideoWriter + public JsonInheritanceConverter(string discriminatorName) { - 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); - }); + _discriminatorName = discriminatorName; } - } + public string DiscriminatorName { get { return _discriminatorName; } } - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchDelay : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } - - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Delay); - return System.Linq.Expressions.Expression.Call( - typeof(MatchDelay), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + try + { + _isWriting = true; + + var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); + jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminatorName, GetSubtypeDiscriminator(value.GetType()))); + writer.WriteToken(jObject.CreateReader()); + } + finally + { + _isWriting = false; + } } - - private static System.IObservable Process(System.IObservable source) - where TResult : Delay + public override bool CanWrite { - return System.Reactive.Linq.Observable.Create(observer => + get { - 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); - }); + if (_isWriting) + { + _isWriting = false; + return false; + } + return true; + } } - } - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchAmount : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + public override bool CanRead { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Amount); - return System.Linq.Expressions.Expression.Call( - typeof(MatchAmount), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + get + { + if (_isReading) + { + _isReading = false; + return false; + } + return true; + } } - - private static System.IObservable Process(System.IObservable source) - where TResult : Amount + public override bool CanConvert(System.Type objectType) { - 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); - }); + return true; } - } + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) + { + var jObject = serializer.Deserialize(reader); + if (jObject == null) + return null; - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] - [System.ComponentModel.DefaultPropertyAttribute("Type")] - [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchProbability : Bonsai.Expressions.SingleArgumentExpressionBuilder - { - - public Bonsai.Expressions.TypeMapping Type { get; set; } + var discriminatorValue = jObject.GetValue(_discriminatorName); + var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; + var subtype = GetObjectSubtype(objectType, discriminator); - public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) + var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; + if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminatorName)) + { + jObject.Remove(_discriminatorName); + } + + try + { + _isReading = true; + return serializer.Deserialize(jObject.CreateReader(), subtype); + } + finally + { + _isReading = false; + } + } + + private System.Type GetObjectSubtype(System.Type objectType, string discriminator) { - var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Probability); - return System.Linq.Expressions.Expression.Call( - typeof(MatchProbability), - "Process", - new System.Type[] { returnType }, - System.Linq.Enumerable.Single(arguments)); + foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) + { + if (attribute.Key == discriminator) + return attribute.Type; + } + + return objectType; } - - private static System.IObservable Process(System.IObservable source) - where TResult : Probability + private string GetSubtypeDiscriminator(System.Type objectType) { - return System.Reactive.Linq.Observable.Create(observer => + foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) { - 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); - }); + if (attribute.Type == objectType) + return attribute.Key; + } + + return objectType.Name; } } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Combinator)] - public partial class MatchAvailable : Bonsai.Expressions.SingleArgumentExpressionBuilder + [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; } @@ -16493,21 +11163,21 @@ public partial class MatchAvailable : Bonsai.Expressions.SingleArgumentExpressio public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Available); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(BlockEndCondition); return System.Linq.Expressions.Expression.Call( - typeof(MatchAvailable), + typeof(MatchBlockEndCondition), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Available + private static System.IObservable Process(System.IObservable source) + where TResult : BlockEndCondition { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -16521,10 +11191,15 @@ 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))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchPatchTerminator : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -16532,21 +11207,21 @@ public partial class MatchRate : Bonsai.Expressions.SingleArgumentExpressionBuil public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Rate); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchTerminator); return System.Linq.Expressions.Expression.Call( - typeof(MatchRate), + typeof(MatchPatchTerminator), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Rate + private static System.IObservable Process(System.IObservable source) + where TResult : PatchTerminator { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -16560,10 +11235,15 @@ 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))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchPatchUpdateFunction : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -16571,21 +11251,21 @@ public partial class MatchValue : Bonsai.Expressions.SingleArgumentExpressionBui public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Value); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(PatchUpdateFunction); return System.Linq.Expressions.Expression.Call( - typeof(MatchValue), + typeof(MatchPatchUpdateFunction), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Value + private static System.IObservable Process(System.IObservable source) + where TResult : PatchUpdateFunction { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -16599,10 +11279,14 @@ 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 { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -16610,21 +11294,21 @@ public partial class MatchLengthDistribution : Bonsai.Expressions.SingleArgument public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(LengthDistribution); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(RewardFunction); return System.Linq.Expressions.Expression.Call( - typeof(MatchLengthDistribution), + typeof(MatchRewardFunction), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : LengthDistribution + private static System.IObservable Process(System.IObservable source) + where TResult : RewardFunction { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -16638,10 +11322,12 @@ private static System.IObservable Process(System.IObservable))] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] + public partial class MatchVideoWriter : Bonsai.Expressions.SingleArgumentExpressionBuilder { public Bonsai.Expressions.TypeMapping Type { get; set; } @@ -16649,21 +11335,21 @@ public partial class MatchCount : Bonsai.Expressions.SingleArgumentExpressionBui public override System.Linq.Expressions.Expression Build(System.Collections.Generic.IEnumerable arguments) { var typeMapping = Type; - var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(Count); + var returnType = typeMapping != null ? typeMapping.GetType().GetGenericArguments()[0] : typeof(VideoWriter); return System.Linq.Expressions.Expression.Call( - typeof(MatchCount), + typeof(MatchVideoWriter), "Process", new System.Type[] { returnType }, System.Linq.Enumerable.Single(arguments)); } - private static System.IObservable Process(System.IObservable source) - where TResult : Count + private static System.IObservable Process(System.IObservable source) + where TResult : VideoWriter { return System.Reactive.Linq.Observable.Create(observer => { - var sourceObserver = System.Reactive.Observer.Create( + var sourceObserver = System.Reactive.Observer.Create( value => { var match = value as TResult; @@ -16680,7 +11366,7 @@ private static System.IObservable Process(System.IObservable /// Serializes a sequence of data model objects into JSON strings. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Serializes a sequence of data model objects into JSON strings.")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] [Bonsai.CombinatorAttribute()] @@ -16695,31 +11381,6 @@ private System.IObservable Process(System.IObservable source) return System.Reactive.Linq.Observable.Select(source, value => Newtonsoft.Json.JsonConvert.SerializeObject(value, formatting)); } - 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); @@ -16745,36 +11406,11 @@ public System.IObservable Process(System.IObservable sourc 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); @@ -16860,41 +11496,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); - } - 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); @@ -16925,26 +11531,11 @@ 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); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - public System.IObservable Process(System.IObservable source) { return Process(source); @@ -16955,16 +11546,6 @@ 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); @@ -16980,11 +11561,6 @@ 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); @@ -16995,16 +11571,6 @@ 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); @@ -17080,31 +11646,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); - } - 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); @@ -17135,24 +11681,19 @@ public System.IObservable Process(System.IObservable sou return Process(source); } - public System.IObservable Process(System.IObservable source) - { - return Process(source); - } - - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } - public System.IObservable Process(System.IObservable source) + public System.IObservable Process(System.IObservable source) { - return Process(source); + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -17185,34 +11726,14 @@ 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) + 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); + return Process(source); } public System.IObservable Process(System.IObservable source) @@ -17260,106 +11781,26 @@ 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); - } - - 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); - } } /// /// Deserializes a sequence of JSON strings into data model objects. /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.6.1.0 (Newtonsoft.Json v13.0.0.0)")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("Bonsai.Sgen", "0.9.0.0 (Newtonsoft.Json v13.0.0.0)")] [System.ComponentModel.DescriptionAttribute("Deserializes a sequence of JSON strings into data model objects.")] [System.ComponentModel.DefaultPropertyAttribute("Type")] [Bonsai.WorkflowElementCategoryAttribute(Bonsai.ElementCategory.Transform)] - [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))] @@ -17377,35 +11818,21 @@ 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))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17421,33 +11848,24 @@ 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))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(Bonsai.Expressions.TypeMapping))] @@ -17457,27 +11875,13 @@ 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))] public partial class DeserializeFromJson : Bonsai.Expressions.SingleArgumentExpressionBuilder { public DeserializeFromJson() { - Type = new Bonsai.Expressions.TypeMapping(); + Type = new Bonsai.Expressions.TypeMapping(); } public Bonsai.Expressions.TypeMapping Type { get; set; } diff --git a/src/Extensions/AindBehaviorVrForaging.cs b/src/Extensions/AindBehaviorVrForaging.cs index b7ad141b..e093488b 100644 --- a/src/Extensions/AindBehaviorVrForaging.cs +++ b/src/Extensions/AindBehaviorVrForaging.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using MathNet.Numerics.Interpolation; @@ -103,307 +103,4 @@ public override double Invoke(double value, double tickValue, Random random = nu return Math.Max(Math.Min(updatedValue, Maximum), Minimum); } } - - partial class Distribution - { - private const uint SampleSize = 1000; - - public virtual double SampleDistribution(Random random) - { - throw new NotImplementedException(); - } - - public virtual IDistribution GetDistribution(Random random) - { - throw new NotImplementedException(); - } - - private static double ApplyScaleAndOffset(double value, ScalingParameters scalingParameters) - { - return scalingParameters == null ? value : value * scalingParameters.Scale + scalingParameters.Offset; - } - - public double DrawSample(IDistribution distribution, ScalingParameters scalingParameters, TruncationParameters truncationParameters) - { - if (truncationParameters == null) - { - return ApplyScaleAndOffset(distribution.Sample(), scalingParameters); - } - - ValidateTruncationParameters(truncationParameters); - - switch (truncationParameters.TruncationMode) - { - case TruncationParametersTruncationMode.Clamp: - var sample = ApplyScaleAndOffset(distribution.Sample(), scalingParameters); - return Math.Min(Math.Max(sample, truncationParameters.Min), truncationParameters.Max); - case TruncationParametersTruncationMode.Exclude: - double[] samples = new double[SampleSize]; - distribution.Samples(samples); - var scaledSamples = samples.Select(x => ApplyScaleAndOffset(x, scalingParameters)).ToArray(); - return ValidateTruncationExcludeMode(scaledSamples, truncationParameters); - default: - throw new ArgumentException("Invalid truncation mode."); - } - } - - private static double ValidateTruncationExcludeMode(double[] drawnSamples, TruncationParameters truncationParameters) - { - double outValue; - var average = drawnSamples.Average(); - var truncatedSamples = drawnSamples.Where(x => x >= truncationParameters.Min && x <= truncationParameters.Max); - - if (truncatedSamples.Count() <= 0) - { - if (average <= truncationParameters.Min) - { - outValue = truncationParameters.Min; - } - else if (average >= truncationParameters.Max) - { - outValue = truncationParameters.Max; - } - else - { - throw new ArgumentException("Truncation heuristic has failed. Please check your truncation parameters."); - } - } - else - { - outValue = truncatedSamples.First(); - } - return outValue; - } - - private static void ValidateTruncationParameters(TruncationParameters truncationParameters) - { - if (truncationParameters == null) { return; } - if (truncationParameters.Min > truncationParameters.Max) - { - throw new ArgumentException("Invalid truncation parameters. Min must be lower than Max"); - } - } - } - - 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) - { - return DistributionParameters.Value; - } - } - - partial class NormalDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Normal(DistributionParameters.Mean, DistributionParameters.Std, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class ExponentialDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Exponential(DistributionParameters.Rate, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class LogNormalDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new LogNormal(DistributionParameters.Mean, DistributionParameters.Std, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class GammaDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Gamma(DistributionParameters.Shape, DistributionParameters.Rate, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class BetaDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new Beta(DistributionParameters.Alpha, DistributionParameters.Beta, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class UniformDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new ContinuousDistributionWrapper(new ContinuousUniform(DistributionParameters.Min, DistributionParameters.Max, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class BinomialDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new DiscreteDistributionWrapper(new Binomial(DistributionParameters.P, DistributionParameters.N, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - partial class PoissonDistribution - { - - public override IDistribution GetDistribution(Random random) - { - return new DiscreteDistributionWrapper(new Poisson(DistributionParameters.Rate, random)); - } - - public override double SampleDistribution(Random random) - { - return DrawSample(GetDistribution(random), ScalingParameters, TruncationParameters); - } - } - - [Combinator] - [Description("Samples a value for a known distribution.")] - [WorkflowElementCategory(ElementCategory.Transform)] - - public class SampleDistribution - { - - private Random randomSource; - public Random RandomSource - { - get { return randomSource; } - set { randomSource = value; } - } - - public IObservable Process(IObservable source) - { - return source.Select(value => value.SampleDistribution(RandomSource)); - } - } - - - - public interface IDistribution - { - double Sample(); - - double[] Samples(double[] arr); - } - - public class ContinuousDistributionWrapper : IDistribution - { - private readonly IContinuousDistribution _distribution; - - public ContinuousDistributionWrapper(IContinuousDistribution distribution) - { - _distribution = distribution; - } - - public double Sample() - { - return _distribution.Sample(); - } - - public double[] Samples(double[] arr) - { - _distribution.Samples(arr); - return arr; - } - } - - public class DiscreteDistributionWrapper : IDistribution - { - private readonly IDiscreteDistribution _distribution; - - public DiscreteDistributionWrapper(IDiscreteDistribution distribution) - { - _distribution = distribution; - } - - public double Sample() - { - return (double)_distribution.Sample(); - } - - public double[] Samples(double[] arr) - { - int[] intSamples = new int[arr.Length]; - _distribution.Samples(intSamples); - for (int i = 0; i < arr.Length; i++) - { - arr[i] = (double)intSamples[i]; - } - return arr; - } - } - } diff --git a/src/Extensions/CreateHubOdorMixture.cs b/src/Extensions/CreateHubOdorMixture.cs new file mode 100644 index 00000000..f8296da0 --- /dev/null +++ b/src/Extensions/CreateHubOdorMixture.cs @@ -0,0 +1,105 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using Harp.Olfactometer; +using Bonsai.Harp; +using System.Collections.Generic; + + +[Description("Returns a list of pairs of Harp messages necessary to configure all olfactometers in a hub to deliver a given odor mixture.")] +public class CreateHubOdorMixture : Transform, IList> +{ + private int totalOdorFlow = 100; + [Range(0, 900)] + [Editor(DesignTypes.SliderEditor, DesignTypes.UITypeEditor)] + [Description("The total desired flow of the odor mixture. This value will be used to automatically calculate the carrier(s) flow based on the total flow.")] + public int TotalOdorFlow + { + get { return totalOdorFlow; } + set { totalOdorFlow = value; } + } + + + private int totalFlow = 1000; + [Range(100, 1000)] + [Editor(DesignTypes.SliderEditor, DesignTypes.UITypeEditor)] + [Description("The total desired flow at the end of the manifold. This value will be used to automatically calculate the carrier(s) flow.")] + public int TotalFlow + { + get { return totalFlow; } + set { totalFlow = value; } + } + + private int olfactometerChannelCount = 3; + public int OlfactometerChannelCount + { + get { return olfactometerChannelCount; } + set { olfactometerChannelCount = value; } + } + + private const int _MINIMUM_CARRIER_FLOW = 100; + + private IList ConstructMessage(IList channelConcentrations) + { + int nChannels = OlfactometerChannelCount; + if (channelConcentrations.Count > nChannels) + { + throw new ArgumentException("The number of channel concentrations provided " + channelConcentrations.Count + " does not match the expected number based on the olfactometer count " + nChannels + "."); + } + // We make sure all odors sum to 1 and then calculate the "real" flow for each channel based on the target odor flow + var adjustedFlow = channelConcentrations.Select(c => c / channelConcentrations.Sum()).Select(c => (int)(TotalOdorFlow * c)) + .Concat(Enumerable.Repeat(0, nChannels - channelConcentrations.Count)); // We pad with zeros if there are fewer concentrations than channels + var carrierFlow = totalFlow - totalOdorFlow; + if (carrierFlow < _MINIMUM_CARRIER_FLOW) + { + throw new InvalidOperationException("The total odor flow exceeds the total flow minus the minimum carrier flow. Reduce the total target odor flow or the concentrations."); + } + var indexedConcentrations = Enumerable.Range(0, nChannels).Select(i => i < 3 ? 0 : ((i - 3) / 4) + 1).Zip(adjustedFlow, (index, flow) => Tuple.Create(index, flow)).ToList(); + + List messages = new List(); + foreach (var group in indexedConcentrations.GroupBy(x => x.Item1)) // Group by olfactometer index + { + var concentrationList = group.Select(x => x.Item2); + var olfactometerIndex = group.Key; + var channel3Flow = olfactometerIndex > 0 ? concentrationList.ElementAtOrDefault(3) : totalFlow; // for the first olfactometer we use it as a carrier for the blank, + var flows = Enumerable.Range(0, 4).Select(i => i < 3 ? concentrationList.ElementAtOrDefault(i) : channel3Flow).ToList(); + + var channelsTargetFlow = ChannelsTargetFlow.FromPayload(MessageType.Write, new ChannelsTargetFlowPayload( + flows[0], + flows[1], + flows[2], + flows[3], + carrierFlow)); + + OdorValves valves = OdorValves.None; + for (int i = 0; i < flows.Count; i++) + { + if (flows[i] > 0) + valves |= (OdorValves)(1 << i); + } + var odorValveState = OdorValveState.FromPayload(MessageType.Write, valves); + messages.Add(new OdorMixMessages() + { + ChannelsTargetFlow = channelsTargetFlow, + OdorValveState = odorValveState, + OlfactometerIndex = olfactometerIndex + }); + } + return messages; + } + + public override IObservable> Process(IObservable> source) + { + return source.Select(value => ConstructMessage(value)); + } +} + +public class OdorMixMessages +{ + public HarpMessage ChannelsTargetFlow { get; set; } + public HarpMessage OdorValveState { get; set; } + + public int OlfactometerIndex { get; set; } +} diff --git a/src/Extensions/Hardware.bonsai b/src/Extensions/Hardware.bonsai new file mode 100644 index 00000000..ea62712d --- /dev/null +++ b/src/Extensions/Hardware.bonsai @@ -0,0 +1,1320 @@ + + + + + + ScreenConfiguration + + + + RigSchema + + + Screen + + + + + + + + + + + 1000 + 1000 + VrForaging + Off + false + Black + DepthBufferBit ColorBufferBit + false + + Resizable + Fullscreen + Second + 60 + 120 + + + + 8 + 8 + 8 + 8 + + 16 + 0 + 0 + + 0 + 0 + 0 + 0 + + 2 + false + + + + + + + + + + RigSchema + + + Screen.Calibration + + + LoadDisplayCalibration + + + + Source1 + + + calibration + + + calibration + + + Left + + + + calibration + + + Center + + + + calibration + + + Right + + + + + + + new( +Item1 as Left, +Item2 as Center, +Item3 as Right) + + + + + + + + + + + + + + + + + + + + + + 1 + + + + DisplayCalibration + + + RenderLoop + + + + FarClipHorizon + + + + + + + + + 0 + 0 + 0 + + 1E-05 + 1000 + + 0 + 0 + 0 + + + + 2 + 6 + + + + 1 + + + + + 1 + + + + WorldContrast + + + RigSchema + + + Screen + + + Contrast + + + WorldContrast + + + + + + + DisplayContrast + + + RigSchema + + + Screen + + + Brightness + + + DisplayBrightness + + + + + + + + + + + + + + + + + + + + + RigSchema + + + Screen.TextureAssetsDirectory + + + + + + + + Textures + *.jpg + + + + + + + + + + + + + + + + + + + + + + PT2S + + + + HarpDevices + + + + HarpWhiteRabbitEvents + + + + Include + Event + + + + + + + Seconds + + + HarpTimestampSource + + + HarpWhiteRabbitEvents + + + + + + HarpWhiteRabbitHeartbeat + + + RigSchema + + + HarpOlfactometer + + + RigSchema + + + HarpOlfactometerExtension + + + + + + + + + HarpOlfactometerExtensionManager + + + + Source1 + + + + + + InstantiateOlfactometer + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + OlfactometerHubCommandsGroupedBy + + + thisOlfactometer + + + Index + + + + + + isThisOlfactometer? + it.Item1.Key == it.Item2 + + + + 1 + + + + Item1 + + + + + + Item2 + + + thisHarpOlfactometerCommands + + + thisHarpOlfactometerEvents + + + thisOlfactometer + + + Index + + + + + + Item2,Item1 + + + OlfactometerHubEvents + + + thisHarpOlfactometerCommands + + + thisOlfactometer + + + Value.PortName + + + + + + + + + Active + On + true + On + Enabled + false + COM6 + + + + thisHarpOlfactometerEvents + + + + + + TriggerHarpReadDump + + + Write + + Active + true + false + On + On + Enabled + + + + thisHarpOlfactometerCommands + + + thisHarpOlfactometerEvents + + + + 1 + + + + thisOlfactometer + + + Index + + + Channel3Range + FlowRate100 + + + Channel3Range + FlowRate1000 + + + + + + it.Item1 == 0 ? it.Item2 : it.Item3 + + + + + + + + Write + + FlowRate1000 + + + + thisHarpOlfactometerCommands + + + Write + + Flowmeter DI0Trigger ChannelActualFlow + + + + thisHarpOlfactometerCommands + + + Write + + Enabled + + + + thisHarpOlfactometerCommands + + + Write + + None + + + + thisHarpOlfactometerCommands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MultiplexIO + + + + OlfactometerHubCommands + + + Item1 + + + OlfactometerHubCommandsGroupedBy + + + + OlfactometerHubEvents + + + Item1 + + + OlfactometerHubEventsGroupedBy + + + + + + + + + + + + + + + + + + TriggerHarpReadDump + + + RigSchema + + + HarpClockGenerator.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpLickometer.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpTreadmill + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + Manipulator + + + Calibration + + + RigSchema + + + Manipulator + + + PortName + + + + + + + + COMx + + + RigSchema + + + HarpSniffDetector.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpSniffDetector + + + + + + + RigSchema + + + HarpAnalogInput.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpAnalogInput + + + + + + + RigSchema + + + HarpEnvironmentSensor.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpEnvironmentSensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cameras + + + + TriggeredCameras + + + + RigSchema + + + + 1 + + + + TriggeredCameraController + + + TriggeredCameraController + + + FrameRate.Value + + + CameraFrameRate + + + TriggeredCameraController + + + Cameras + + + CameraFrameRate + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + Include + Event + + + + + + + Value + + + + FrameAcquired + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + + + Item2.Seconds + + + FrameEvent + + + TriggeredCameraController + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + + true + + + + TriggeredCamerasInitialized + + + + 1 + + + + ThisCamera + + + Value + + + + + + + + + + + + + + + ThisCamera + + + Value + + + RegionOfInterest + + + + + + + + RegionOfInterest + + 0 + 0 + 0 + 0 + + + + + + + + + + + Default + 19000 + 0 + 1 + + Mono8 + + 0 + 0 + 0 + 0 + + + + + + FrameEvent + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SpinnakerApiNote + + + + + PT0S + PT0.1S + + + + + + + Item1 + + + + + + Item2 + Item1 + + + TriggeredCamerasStream + + + + TriggeredCamerasInitialized + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + + TriggeredCameraController + + + Cameras + + + Count + + + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + 1 + + + + + PT0.1S + + + + TriggeredCamerasReady + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MonitoringCameras + + + + RigSchema + + + MonitoringCameraController + + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + ThisCamera + + + Value + + + Index + + + + + + + + + 0 + + + + + HarpTimestampSource + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + Item2 + Item1 + + + MonitoringCamerasStream + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HardwareChecks.bonsai b/src/Extensions/HardwareChecks.bonsai new file mode 100644 index 00000000..cca80e77 --- /dev/null +++ b/src/Extensions/HardwareChecks.bonsai @@ -0,0 +1,758 @@ + + + + + + HardwareChecks + + + + ProtocolValidation + + + + Repository + + + + false + + + + + SubjectSchema + + + AllowDirtyRepo + + + + + + AllowDirty? + Item2 ? False : Item1 + + + + + + Source1 + + + + + + + + + + + Repository is not clean! Please discard all local changes. + + + + Olfactometer + + + + SampleFlow + + + + StartExperiment + + + + 1 + + + + OlfactometerHubEventsGroupedBy + + + it.Key == 0 + + + + + + Item2 + + + + + + Value + + + + + + + 950 + + + + + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + Source1 + + + Item1 + + + + + + + + + + + Item2 + + + Flow on Channel3 is lower than expected. Reading {0}. + it + + + + + + it + + + + Flow on Channel3 of main Olfactometer is lower than expected. + + + + TaskLogicSchema + + + RigSchema + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + CameraChecks + + + + TriggeredCamerasStream + + + CheckDroppedFrames + + + + Source1 + + + + 1 + + + + InputSequence + + + InputSequence + + + + + + Value.ChunkData + + + FrameID + + + + 1 + + + + + 1 + + + + + 0 + + + + + + + Source1 + + + + + + + + + + InputSequence + + + Key + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + Camera {0} dropped frame detected during pre-session! + it + + + + + + it + + + + Dropped frame detected during pre-session! + + + + StartExperiment + + + + + + TriggeredCameraController + + + Cameras + + + + + + CheckCameraSettings + + + + Source1 + + + + 1 + + + + ThisCamera + + + ThisCamera + + + Value.Exposure + + + TriggeredCameraController + + + FrameRate + + + Value + + + + + + ((1.0 / Item2) * 1000000) < double(Item1) + 1000 + + + + + + Source1 + + + + + + + + + + + 1 + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Camera {0} exposure setting not compatible with requested frame rate! + it + + + + + + it + + + + + + + + TriggeredCameraController + + + FrameRate.HasValue + + + + + + + Source1 + + + + + + + + + + + TriggeredCameraControl must specify a valid FrameRate property! + + + + TriggeredCamerasStream + + + OnlineQC + + + + Source1 + + + + 1 + + + + InputSequence + + + InputSequence + + + + + + Value.ChunkData + + + Timestamp + + + + 1 + + + + + 1E-09 + + + + Seconds + + + + 1 + + + + + + + + + + + + + + + 0.0005 + + + + + + + Source1 + + + + + + + + + + + TaskPoolScheduler + + + + + + + + PT0S + PT10S + + + + + + + MakeUI + + + + InputSequence + + + Key + + + Camera {0} out-of-alignment qc was triggered. + it + + + + + + + + + + Warning + Exclamation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Treadmill + + + + HarpTreadmillEvents + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + The treadmill current limit has been triggered. If this is a problem, please restart the session. + Treadmill limit trigger + Exclamation + + + + + + + + + + + + + StartExperiment + + + + + + + + + + + + + + + + + + + + + + SubjectSchema + + + SkipHardwareValidation + + + + + + + Source1 + + + + + + + + + + + + + + PT2S + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/HarpBehaviorGetMetadata.bonsai b/src/Extensions/HarpBehaviorGetMetadata.bonsai deleted file mode 100644 index 108ca1fc..00000000 --- a/src/Extensions/HarpBehaviorGetMetadata.bonsai +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - %YAML 1.1 ---- -# yaml-language-server: $schema=https://harp-tech.org/draft-02/schema/device.json -device: Behavior -whoAmI: 1216 -firmwareVersion: "3.2" -hardwareTargets: "1.1" -registers: - DigitalInputState: - address: 32 - access: Event - type: U8 - maskType: DigitalInputs - description: Reflects the state of DI digital lines of each Port - Reserved0: &reserved - address: 33 - type: U8 - access: Read - description: Reserved for future use - visibility: private - OutputSet: &output - address: 34 - type: U16 - access: Write - maskType: DigitalOutputs - description: Set the specified digital output lines. - OutputClear: - <<: *output - address: 35 - description: Clear the specified digital output lines - OutputToggle: - <<: *output - address: 36 - description: Toggle the specified digital output lines - OutputState: - <<: *output - address: 37 - description: Write the state of all digital output lines - PortDIOSet: &portDIO - address: 38 - type: U8 - access: Write - maskType: PortDigitalIOS - description: Set the specified port DIO lines - PortDIOClear: - <<: *portDIO - address: 39 - description: Clear the specified port DIO lines - PortDIOToggle: - <<: *portDIO - address: 40 - description: Toggle the specified port DIO lines - PortDIOState: - <<: *portDIO - address: 41 - description: Write the state of all port DIO lines - PortDIODirection: - <<: *portDIO - address: 42 - description: Specifies which of the port DIO lines are outputs - PortDIOStateEvent: - <<: *portDIO - address: 43 - access: Event - description: Specifies the state of the port DIO lines on a line change - AnalogData: - address: 44 - type: S16 - length: 3 - access: Event - description: Voltage at the ADC input and encoder value on Port 2 - payloadSpec: - AnalogInput0: - offset: 0 - description: The voltage at the output of the ADC channel 0. - Encoder: - offset: 1 - description: The quadrature counter value on Port 2 - AnalogInput1: - offset: 2 - description: The voltage at the output of the ADC channel 1. - OutputPulseEnable: - <<: *output - address: 45 - description: Enables the pulse function for the specified output lines - PulseDOPort0: &pulseDO - address: 46 - type: U16 - access: Write - minValue: 1 - description: Specifies the duration of the output pulse in milliseconds. - PulseDOPort1: - <<: *pulseDO - address: 47 - PulseDOPort2: - <<: *pulseDO - address: 48 - PulseSupplyPort0: - <<: *pulseDO - address: 49 - PulseSupplyPort1: - <<: *pulseDO - address: 50 - PulseSupplyPort2: - <<: *pulseDO - address: 51 - PulseLed0: - <<: *pulseDO - address: 52 - PulseLed1: - <<: *pulseDO - address: 53 - PulseRgb0: - <<: *pulseDO - address: 54 - PulseRgb1: - <<: *pulseDO - address: 55 - PulseDO0: - <<: *pulseDO - address: 56 - PulseDO1: - <<: *pulseDO - address: 57 - PulseDO2: - <<: *pulseDO - address: 58 - PulseDO3: - <<: *pulseDO - address: 59 - PwmFrequencyDO0: &pwmFreq - address: 60 - type: U16 - access: Write - minValue: 1 - description: Specifies the frequency of the PWM at DO0. - PwmFrequencyDO1: - <<: *pwmFreq - address: 61 - description: Specifies the frequency of the PWM at DO1. - PwmFrequencyDO2: - <<: *pwmFreq - address: 62 - description: Specifies the frequency of the PWM at DO2. - PwmFrequencyDO3: - <<: *pwmFreq - address: 63 - description: Specifies the frequency of the PWM at DO3. - PwmDutyCycleDO0: &pwmDutyCycle - address: 64 - type: U8 - access: Write - minValue: 1 - maxValue: 99 - description: Specifies the duty cycle of the PWM at DO0. - PwmDutyCycleDO1: - <<: *pwmDutyCycle - address: 65 - description: Specifies the duty cycle of the PWM at DO1. - PwmDutyCycleDO2: - <<: *pwmDutyCycle - address: 66 - description: Specifies the duty cycle of the PWM at DO2. - PwmDutyCycleDO3: - <<: *pwmDutyCycle - address: 67 - description: Specifies the duty cycle of the PWM at DO3. - PwmStart: &pwmStartStop - address: 68 - type: U8 - access: Write - maskType: PwmOutputs - description: Starts the PWM on the selected output lines. - PwmStop: - <<: *pwmStartStop - address: 69 - description: Stops the PWM on the selected output lines. - RgbAll: - address: 70 - type: &rgbType U8 - length: 6 - access: &rgbAccess Write - description: Specifies the state of all RGB LED channels. - payloadSpec: - Green0: - offset: 0 - description: The intensity of the green channel in the RGB0 LED. - Red0: - offset: 1 - description: The intensity of the red channel in the RGB0 LED. - Blue0: - offset: 2 - description: The intensity of the blue channel in the RGB0 LED. - Green1: - offset: 3 - description: The intensity of the green channel in the RGB1 LED. - Red1: - offset: 4 - description: The intensity of the red channel in the RGB1 LED. - Blue1: - offset: 5 - description: The intensity of the blue channel in the RGB1 LED. - Rgb0: &rgbRegister - address: 71 - type: *rgbType - length: 3 - access: *rgbAccess - description: Specifies the state of the RGB0 LED channels. - interfaceType: RgbPayload - payloadSpec: - Green: - offset: 0 - description: The intensity of the green channel in the RGB LED. - Red: - offset: 1 - description: The intensity of the red channel in the RGB LED. - Blue: - offset: 2 - description: The intensity of the blue channel in the RGB LED. - Rgb1: - <<: *rgbRegister - address: 72 - description: Specifies the state of the RGB1 LED channels. - Led0Current: &ledCurrent - address: 73 - type: U8 - access: Write - minValue: 2 - maxValue: 100 - description: Specifies the configuration of current to drive LED 0. - Led1Current: - <<: *ledCurrent - address: 74 - description: Specifies the configuration of current to drive LED 1. - Led0MaxCurrent: &ledMaxCurrent - address: 75 - type: U8 - access: Write - minValue: 5 - maxValue: 100 - description: Specifies the configuration of current to drive LED 0. - Led1MaxCurrent: - <<: *ledMaxCurrent - address: 76 - description: Specifies the configuration of current to drive LED 1. - EventEnable: - address: 77 - type: U8 - access: Write - maskType: Events - description: Specifies the active events in the device. - StartCameras: &cameraControl - address: 78 - type: U8 - access: Write - maskType: CameraOutputs - description: Specifies the camera outputs to enable in the device. - StopCameras: - <<: *cameraControl - access: [Write, Event] - address: 79 - description: Specifies the camera outputs to disable in the device. An event will be issued when the trigger signal is actually stopped being generated. - EnableServos: &servoControl - address: 80 - type: U8 - access: Write - maskType: ServoOutputs - description: Specifies the servo outputs to enable in the device. - DisableServos: - <<: *servoControl - address: 81 - description: Specifies the servo outputs to disable in the device. - EnableEncoders: - address: 82 - type: U8 - access: Write - maskType: EncoderInputs - description: Specifies the port quadrature counters to enable in the device. - EncoderMode: - address: 83 - type: U8 - access: Write - maskType: EncoderModeConfig - description: Configures the operation mode of the quadrature encoders. - Reserved2: - <<: *reserved - address: 84 - Reserved3: - <<: *reserved - address: 85 - Reserved4: - <<: *reserved - address: 86 - Reserved5: - <<: *reserved - address: 87 - Reserved6: - <<: *reserved - address: 88 - Reserved7: - <<: *reserved - address: 89 - Reserved8: - <<: *reserved - address: 90 - Reserved9: - <<: *reserved - address: 91 - Camera0Frame: &frameAcquired - address: 92 - type: U8 - access: Event - maskType: FrameAcquired - description: Specifies that a frame was acquired on camera 0. - Camera0Frequency: &cameraFreq - address: 93 - type: U16 - access: Write - minValue: 1 - maxValue: 600 - description: Specifies the trigger frequency for camera 0. - Camera1Frame: - <<: *frameAcquired - address: 94 - description: Specifies that a frame was acquired on camera 1. - Camera1Frequency: - <<: *cameraFreq - address: 95 - description: Specifies the trigger frequency for camera 1. - Reserved10: - <<: *reserved - address: 96 - Reserved11: - <<: *reserved - address: 97 - Reserved12: - <<: *reserved - address: 98 - Reserved13: - <<: *reserved - address: 99 - ServoMotor2Period: &servoPeriod - address: 100 - type: U16 - access: Write - minValue: 2 - maxValue: 65534 - description: Specifies the period of the servo motor in DO2, in microseconds. - ServoMotor2Pulse: &servoPulse - address: 101 - type: U16 - access: Write - minValue: 6 - maxValue: 65530 - description: Specifies the pulse of the servo motor in DO2, in microseconds. - ServoMotor3Period: - <<: *servoPeriod - address: 102 - description: Specifies the period of the servo motor in DO3, in microseconds. - ServoMotor3Pulse: - <<: *servoPulse - address: 103 - description: Specifies the pulse of the servo motor in DO3, in microseconds. - Reserved14: - <<: *reserved - address: 104 - Reserved15: - <<: *reserved - address: 105 - Reserved16: - <<: *reserved - address: 106 - Reserved17: - <<: *reserved - address: 107 - EncoderReset: - address: 108 - type: U8 - access: Write - maskType: EncoderInputs - description: Reset the counter of the specified encoders to zero. - Reserved18: - <<: *reserved - address: 109 - EnableSerialTimestamp: - address: 110 - type: U8 - access: Write - description: Enables the timestamp for serial TX. - MimicPort0IR: &mimic - address: 111 - type: U8 - access: Write - maskType: MimicOutput - description: Specifies the digital output to mimic the Port 0 IR state. - MimicPort1IR: - <<: *mimic - address: 112 - description: Specifies the digital output to mimic the Port 1 IR state. - MimicPort2IR: - <<: *mimic - address: 113 - description: Specifies the digital output to mimic the Port 2 IR state. - Reserved20: - <<: *reserved - address: 114 - Reserved21: - <<: *reserved - address: 115 - Reserved22: - <<: *reserved - address: 116 - MimicPort0Valve: - <<: *mimic - address: 117 - description: Specifies the digital output to mimic the Port 0 valve state. - MimicPort1Valve: - <<: *mimic - address: 118 - description: Specifies the digital output to mimic the Port 1 valve state. - MimicPort2Valve: - <<: *mimic - address: 119 - description: Specifies the digital output to mimic the Port 2 valve state. - Reserved23: - <<: *reserved - address: 120 - Reserved24: - <<: *reserved - address: 121 - PokeInputFilter: - address: 122 - type: U8 - access: Write - description: Specifies the low pass filter time value for poke inputs, in ms. -bitMasks: - DigitalInputs: - description: Specifies the state of port digital input lines. - bits: - DIPort0: 0x1 - DIPort1: 0x2 - DIPort2: 0x4 - DI3: 0x8 - DigitalOutputs: - description: Specifies the state of port digital output lines. - bits: - DOPort0: 0x1 - DOPort1: 0x2 - DOPort2: 0x4 - SupplyPort0: 0x8 - SupplyPort1: 0x10 - SupplyPort2: 0x20 - Led0: 0x40 - Led1: 0x80 - Rgb0: 0x100 - Rgb1: 0x200 - DO0: 0x400 - DO1: 0x800 - DO2: 0x1000 - DO3: 0x2000 - PortDigitalIOS: - description: Specifies the state of the port DIO lines. - bits: - DIO0: 0x1 - DIO1: 0x2 - DIO2: 0x4 - PwmOutputs: - description: Specifies the state of PWM output lines. - bits: - PwmDO0: 0x1 - PwmDO1: 0x2 - PwmDO2: 0x4 - PwmDO3: 0x8 - Events: - description: Specifies the active events in the device. - bits: - PortDI: 0x1 - PortDIO: 0x2 - AnalogData: 0x4 - Camera0: 0x8 - Camera1: 0x10 - CameraOutputs: - description: Specifies camera output enable bits. - bits: - CameraOutput0: 0x1 - CameraOutput1: 0x2 - ServoOutputs: - description: Specifies servo output enable bits. - bits: - ServoOutput2: 0x4 - ServoOutput3: 0x8 - EncoderInputs: - description: Specifies quadrature counter enable bits. - bits: - EncoderPort2: 0x4 - FrameAcquired: - description: Specifies that camera frame was acquired. - bits: - FrameAcquired: 0x1 -groupMasks: - MimicOutput: - description: Specifies the target IO on which to mimic the specified register. - values: - None: 0 - DIO0: 1 - DIO1: 2 - DIO2: 3 - DO0: 4 - DO1: 5 - DO2: 6 - DO3: 7 - EncoderModeConfig: - description: Specifies the type of reading made from the quadrature encoder. - values: - Position: 0 - Displacement: 1 - - - - - 1 - - - - - - - - - - \ No newline at end of file diff --git a/src/Extensions/InstantiateSite.bonsai b/src/Extensions/InstantiateSite.bonsai index e76d82d1..c14e9152 100644 --- a/src/Extensions/InstantiateSite.bonsai +++ b/src/Extensions/InstantiateSite.bonsai @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" + xmlns:p1="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:p2="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" xmlns:dsp="clr-namespace:Bonsai.Dsp;assembly=Bonsai.Dsp" @@ -1198,9 +1198,7 @@ it.Item2 as EntryPosition) - - - + TreadmillFriction diff --git a/src/Extensions/Logging.bonsai b/src/Extensions/Logging.bonsai index a57d5923..99f30bb5 100644 --- a/src/Extensions/Logging.bonsai +++ b/src/Extensions/Logging.bonsai @@ -4,7 +4,9 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns:sys="clr-namespace:System;assembly=mscorlib" + xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" xmlns:p2="clr-namespace:Harp.Olfactometer;assembly=Harp.Olfactometer" + xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p3="clr-namespace:AllenNeuralDynamics.LicketySplit;assembly=AllenNeuralDynamics.LicketySplit" xmlns:p4="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" xmlns:p5="clr-namespace:AllenNeuralDynamics.SniffDetector;assembly=AllenNeuralDynamics.SniffDetector" @@ -13,7 +15,6 @@ xmlns:p8="clr-namespace:AllenNeuralDynamics.EnvironmentSensor;assembly=AllenNeuralDynamics.EnvironmentSensor" xmlns:p9="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" xmlns:p10="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" xmlns:p11="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:p12="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" @@ -58,7 +59,9 @@ - + + + @@ -92,28 +95,88 @@ StepperDriver - HarpOlfactometerEvents - - - Modality + OlfactometerHubEventsGroupedBy - - - - + + LogOlfactometerHub + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + + thisOlfactometer + + + + + + Item2 + + + Modality + + + + + + + + + + + + + + + + thisOlfactometer + + + Key + + + it > 0 ? "OlfactometerExtension" + it.ToString() : "Olfactometer" + + + + + + + + + Behavior + Olfactometer + + + + + + + + + + + + + + + + + + - - - - - - - - - - Behavior - Olfactometer + HarpLickometerEvents @@ -301,53 +364,50 @@ - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - + + @@ -378,7 +438,9 @@ - + + + @@ -424,40 +486,108 @@ HarpCommands/StepperDriver - HarpOlfactometerCommands + OlfactometerHubCommandsGroupedBy - - HarpTimestampSource - - - - - - - - - - - - Modality - - - - - + + LogOlfactometerHub + + + + Source1 + + + + 1 + + + + thisOlfactometer + + + + thisOlfactometer + + + + + + Item2 + + + HarpTimestampSource + + + + + + + + + + + + Modality + + + + + + + + + + + + + + + + thisOlfactometer + + + Key + + + it > 0 ? "OlfactometerExtension" + it.ToString() : "Olfactometer" + + + HarpCommands/{0} + it + + + + + + + + + Behavior + Olfactometer + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - Behavior - HarpCommands/Olfactometer + HarpLickometerCommands @@ -723,74 +853,68 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - - - + + + + + + + - - - - + + + - - - - - - + + + + + + + - - - - - - - + diff --git a/src/Extensions/NullDistribution.cs b/src/Extensions/NullDistribution.cs index d6cacc3f..2b20ec1a 100644 --- a/src/Extensions/NullDistribution.cs +++ b/src/Extensions/NullDistribution.cs @@ -1,4 +1,4 @@ -using Bonsai; +using Bonsai; using System; using System.ComponentModel; using System.Reactive.Linq; @@ -8,8 +8,8 @@ [WorkflowElementCategory(ElementCategory.Source)] public class NullDistribution { - public IObservable Process() + public IObservable Process() { - return Observable.Return(null); + return Observable.Return(null); } } diff --git a/src/Extensions/OperationControl.bonsai b/src/Extensions/OperationControl.bonsai new file mode 100644 index 00000000..d3ecfe67 --- /dev/null +++ b/src/Extensions/OperationControl.bonsai @@ -0,0 +1,2364 @@ + + + + + + OdorControl + + + + RigSchema + + + HarpOlfactometerExtension + + + 3 + 4*it.Count() + + + olfactometerChannelsCount + + + SetOdorMix + + + + + + BroadcastToOlfactometerHub + + + + Source1 + + + + 1 + + + + thisBundle + + + SetChannelsTargetFlow + + + + thisBundle + + + OlfactometerIndex,ChannelsTargetFlow + + + OlfactometerHubCommands + + + OlfactometerHubEventsGroupedBy + + + thisBundle + + + OlfactometerIndex + + + + + + it.Item1.Key == it.Item2 + + + Item1 + + + + + + Item2 + + + + Include + Write + + + + thisBundle + + + ChannelsTargetFlow + + + Address + + + + + + + + Include + + + + + + + + PT0.01S + + + + + + + + + 1 + + + + thisBundle + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SetOdorValveState + + + + thisBundle + + + OlfactometerIndex,OdorValveState + + + OlfactometerHubCommands + + + OlfactometerHubEventsGroupedBy + + + thisBundle + + + OlfactometerIndex + + + + + + it.Item1.Key == it.Item2 + + + Item1 + + + + + + Item2 + + + + Include + Write + + + + thisBundle + + + OdorValveState + + + Address + + + + + + + + Include + + + + + + + + PT0.01S + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OlfactometerInitialConfiguration + + + + OlfactometerHubEvents + + + RigSchema + + + HarpOlfactometerExtension + + + Count + + + + 1 + + + + + + + + + + 1 + + + + olfactometerChannelsCount + + + + + + + + + 0 + 0 + + + + + 0 + + + + + + + + + + Item2 + + + olfactometerChannelsCount + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + + + + 100 + 1000 + 3 + + + + SetOdorMix + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ArmOdor + + + + ArmOdor + + + ArmOdor + + + + ArmOdor + + + + SoftwareEvent + + + ArmOdor + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + + + olfactometerChannelsCount + + + + + + + + + 100 + 1000 + 3 + + + + SetOdorMix + + + + + + + + + + + + + + + + + + + + EndValveControl + + + + OlfactometerHubEvents + + + RigSchema + + + HarpOlfactometerExtension + + + Count + + + + 1 + + + + + + + + + + 1 + + + + + false + + + + OdorEndValveState + + + OdorEndValveState + + + OdorPath + + + + Source1 + + + + + + + + + + EndValvesState + EndValve0 + + + + CarrierPath + + + + Source1 + + + + + + + + + + EndValvesState + None + + + + + + Write + + + + + 0 + + + + + + + OlfactometerHubCommands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RewardControl + + + + WaterValve + + + + ValveOpenTimeMs + + + SetValue + + + + Source1 + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + + + + + + + 0 + + + + + PT0.01S + + + + + 0 + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + TriggerValve + + + TriggerValve + + + Write + + SupplyPort0 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + + + 0 + true + + + + + 1 + + + + GiveReward + + + ForceGiveReward + + + GiveReward + + + HotGiveReward + + + GiveReward + + + ManualReward + + + + ForceGiveReward + + + + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + Value + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + RigSchema + + + Calibration.WaterValve + + + + + + RewardToTime + ((Item1 * 0.001) - Item2.Offset) / Item2.Slope + + + ToMilliseconds + + + + + 1000 + + + + + + + + + + 0 + + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + ValveOpenTimeMs + + + GiveReward + + + + GiveReward + + + + SoftwareEvent + + + ForceGiveReward + + + + ForceGiveReward + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MovableSpoutControl + + + + Start with the spout at max distance + + + + + true + + + + + 1 + + + + SpoutAvailable + + + SpoutAvailable + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + + + IsEnabled + + + + Source1 + + + Item2 + + + + + + + + + + + Item1 + + + SpoutParkingPositions + + + + + + GetPosition + it.Item1 ? it.Item2.ResetPosition : it.Item2.RetractedPosition + + + MoveTo + + + InitialState + + + + ManipulatorPosition + + + + 1 + + + + RigSchema + + + Manipulator + + + 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) + + + SpoutParkingPositions + + + SpoutParkingPositions + + + + SpoutParkingPositions + + + + SoftwareEvent + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + SpoutAvailable + + + GiveReward + + + + false + + + + SpoutAvailable + + + Condition + + + + Source1 + + + + + + + + + + + true + + + + + + + DelayWithdraw + + + + Source1 + + + + 1 + + + + State + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + TimeToCollectAfterReward + + + FromSeconds + TimeSpan.FromSeconds(it) + + + + + + + + + PT0S + + + + State + + + + + + Item2 + + + + + + + + + + + + + + + + + + + + + + + IsWithdraw? + + + + Source1 + + + + + + + + + + + + SpoutAvailable + + + TaskLogicParameters + + + OperationControl.MovableSpoutControl + + + Enabled + + + + + + Source1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + StartExperiment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FeedbackControl + + + + ChoiceFeedback + + + ChoiceFeedback + + + HotChoiceFeedback + + + ChoiceFeedback + + + + AudioTrigger + + + + ChoiceFeedback + + + + ChoiceFeedback + + + + SoftwareEvent + + + HarpBehaviorEvents + + + + 1 + + + + + true + + + + SpoutAvailable + + + + + + + + + + + + + + + + + Lickometer + + + + HarpLickometerEvents + + + + + + Value + + + + Channel0 + + + + + 0 + + + + + + + + + + IsLickOnset + + + + Source1 + + + Item1 + + + + + + + + + + + Item2.Seconds + + + LickEvent + + + HarpLickometerEvents + + + Write + + Active + true + false + Off + Off + Enabled + + + + + 1 + + + + HarpLickometerCommands + + + + + + + + + + + + + + + + + + + + + CameraControl + + + + HarpBehaviorEvents + + + + 1 + + + + TextureBank + + + TriggeredCamerasReady + + + + + + + 1 + + + + + PT2S + + + + + true + + + + CameraState + + + CameraState + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + HarpBehaviorCommands + + + StartLogging + + + + 1 + + + + + false + + + + CameraState + + + StartExperiment + + + + 1 + + + + + true + + + + CameraState + + + EndExperiment + + + + 1 + + + + + false + + + + CameraState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Thermistor/Pressure + + + + HarpSniffDetectorEvents + + + + + + RigSchema + + + HarpSniffDetector + + + + + + + ThermistorData + + + + + + + + + + + + + + Treadmill + + + + StartLogging + + + ClearCurrentLimit + + + + + PT0S + PT0.05S + + + + + + + + 5 + + + + + + + ThrowOnRetryCount + + + + Source1 + + + + + + + Number of attempts ot clear the current limit state register has been exceeded. + + + + + + + + + + + + + Write + + 0 + + + + HarpTreadmillCommands + + + HarpTreadmillEvents + + + + Include + Write + + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 0 + + + + + 1 + + + + TreadmillFriction + + + HarpTreadmillEvents + + + + + + TreadmillSamplingRate + + + DetermineTreadmillScaling + + + + RigSchema + + + HarpTreadmill.Calibration + + + WheelDiameter + + + Perimeter + it * Math.Pi + + + PulsesPerRevolution + + + + + + CentimetersPerTick + Item1 / Item2 + + + InvertDirection + + + + + + 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 + + + BrakeLookupCalibration + + + + + + + 0 + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Write + + + + SendMessage + + + + Source1 + + + + 1 + + + + HarpMessage + + + HarpTreadmillEvents + + + + + + HarpMessage + + + + + + + PT0.1S + PT0.1S + + + + HarpMessage + + + + + + Item2 + + + + + + HarpTreadmillCommands + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + EncoderSample + + + Value + + + InstantVelocity + + + TaskLogicParameters + + + OperationControl + + + PositionControl.FrequencyFilterCutoff + + + + + + + + TreadmillSamplingRate + + + + + + + + + 250 + 5 + 0 + 60 + LowPass + + + + Seconds + + + + + + FilteredCurrentVelocity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AudioControl + + + + AudioDuration + + + + 1000 + + + + Write + + + + HarpBehaviorCommands + + + AudioFrequency + + + Write + + + + HarpBehaviorCommands + + + AudioTrigger + + + Write + + PwmDO2 + + + + HarpBehaviorCommands + + + InitialSettings + + + + HarpBehaviorEvents + + + Write + + 50 + + + + + 1 + + + + HarpBehaviorCommands + + + TaskLogicParameters + + + OperationControl.AudioControl + + + Duration + + + AudioDuration + + + TaskLogicParameters + + + OperationControl.AudioControl + + + Frequency + + + AudioFrequency + + + + + + + + + + + + + + + + + HarpBehaviorEvents + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/PatchState.cs b/src/Extensions/PatchState.cs index 9e6d6ac5..c13ac41d 100644 --- a/src/Extensions/PatchState.cs +++ b/src/Extensions/PatchState.cs @@ -1,4 +1,4 @@ -using System; +using System; using AindVrForagingDataSchema; public class PatchState diff --git a/src/Extensions/SolveBlockTransitions.bonsai b/src/Extensions/SolveBlockTransitions.bonsai index c069e019..bb92ab59 100644 --- a/src/Extensions/SolveBlockTransitions.bonsai +++ b/src/Extensions/SolveBlockTransitions.bonsai @@ -4,8 +4,9 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" + xmlns:p2="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p2="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:p3="clr-namespace:System.Reactive;assembly=System.Reactive.Core" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -248,7 +249,7 @@ - + @@ -361,7 +362,7 @@ - + @@ -446,7 +447,7 @@ - + @@ -524,7 +525,7 @@ - + @@ -602,7 +603,7 @@ - + @@ -731,7 +732,7 @@ - + EvaluateBlockEndConditions diff --git a/src/Extensions/SpinnakerCameraControllerVisualizer.bonsai b/src/Extensions/SpinnakerCameraControllerVisualizer.bonsai new file mode 100644 index 00000000..92720dae --- /dev/null +++ b/src/Extensions/SpinnakerCameraControllerVisualizer.bonsai @@ -0,0 +1,231 @@ + + + + + + Source1 + + + + + + + + + + + Source1 + + + CamerasStream + + + + CamerasStream + + + Key + + + + + + true + true + + + + SelectedControllerCamera + + + + + + SelectedControllerCamera + + + + + + GetStream + + + + Source1 + + + + 1 + + + + Camera + + + + + + CamerasStream + + + Camera + + + + + + + + + + + Source1 + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Value.Image + + + + + + + + 0 + 255 + 1 + + + + + + + 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/Extensions/UpdateVariable.bonsai b/src/Extensions/UpdateVariable.bonsai index c581bfb5..e2dccd19 100644 --- a/src/Extensions/UpdateVariable.bonsai +++ b/src/Extensions/UpdateVariable.bonsai @@ -4,7 +4,6 @@ xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:p2="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -30,10 +29,6 @@ Value StopDurationOffset - - ToString - it.ToString() - 1 @@ -48,45 +43,16 @@ Key - - - - - - - HasKey? - - - - Source1 - - - - - - - - - - - - - - - - - - Key + + - - - - + + HasKey? + it.Item1.ContainsKey(it.Item2) - - - StopVelocityThreshold - + + GetValue + it.Item1[it.Item2] @@ -94,6 +60,8 @@ 0 + 0 + 0 0 0 0 @@ -106,7 +74,9 @@ - + + None + @@ -143,36 +113,44 @@ Source1 - - VariableUpdaters - - - - - - Item2 - - - Key - - - - - - - - + + ContainsKey? + + + + VariableUpdaters + + + Key + + + + + + ContainsKey? + it.Item1.ContainsKey(it.Item2) + + + + 1 + + + + + + + + + + + + - - - - - - - + + @@ -218,7 +196,9 @@ false - + + None + @@ -246,25 +226,22 @@ - - + + - - + + - - + + - + - - - diff --git a/src/Extensions/ValidateOlfactometerDefinition.cs b/src/Extensions/ValidateOlfactometerDefinition.cs new file mode 100644 index 00000000..4db80a79 --- /dev/null +++ b/src/Extensions/ValidateOlfactometerDefinition.cs @@ -0,0 +1,40 @@ +using Bonsai; +using System; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Linq; +using AindVrForagingDataSchema; + +[Combinator] +[Description("Validates that the olfactometer definition in the task logic is compatible with the number of olfactometers defined in the rig. Throws an exception if the definition is invalid.")] +[WorkflowElementCategory(ElementCategory.Combinator)] +public class ValidateOlfactometerDefinition +{ + public IObservable Process(IObservable> source) + { + return source.Select(value => + { + var taskLogic = value.Item1; + var rig = value.Item2; + var nChannels = 3 + 4 * rig.HarpOlfactometerExtension.Count; // 3 for the main olfactometer, 4 for each additional olfactometer + var patches = taskLogic.TaskParameters.Environment.Blocks.SelectMany(block => block.EnvironmentStatistics.Patches); + int maxIdx = 0; + foreach (var patch in patches) + { + for (int i = patch.OdorSpecification.Count - 1; i >= 0; i--) + { + if (patch.OdorSpecification[i] > 0) + { + maxIdx = Math.Max(maxIdx, i); + break; + } + } + } + if (maxIdx >= nChannels) + { + throw new InvalidOperationException("The olfactometer definition in the task logic requires at least " + (maxIdx + 1) + " channels, but the rig only supports " + nChannels + " channels."); + } + return maxIdx < nChannels; + }); + } +} diff --git a/src/Extensions/VariableUpdaters.bonsai b/src/Extensions/VariableUpdaters.bonsai new file mode 100644 index 00000000..2d328980 --- /dev/null +++ b/src/Extensions/VariableUpdaters.bonsai @@ -0,0 +1,128 @@ + + + + + + TaskLogicParameters + + + Updaters + + + + 1 + + + + VariableUpdaters + + + GiveReward + + + + true + + + + StopDurationOffset + 0 + + + StopDurationOffset + + + + UpdaterStopDurationOffset + + + + UpdaterEvents + + + GiveReward + + + + true + + + + TaskLogicParameters + + + OperationControl.PositionControl.VelocityThreshold + + + + + + + + StopVelocityThreshold + 0 + + + StopVelocityThreshold + + + + UpdaterStopVelocityThreshold + + + + UpdaterEvents + + + GiveReward + + + + true + + + + RewardDelayOffset + 0 + + + RewardDelayOffset + + + + UpdaterRewardDelayOffset + + + + UpdaterEvents + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Extensions/Visualizers.bonsai b/src/Extensions/Visualizers.bonsai index 629a3fae..ada97d84 100644 --- a/src/Extensions/Visualizers.bonsai +++ b/src/Extensions/Visualizers.bonsai @@ -55,14 +55,22 @@ TriggeredCamerasStream - + + 1 + 254 + 1 + TriggeredCamerasStream - + + 1 + 254 + 1 + diff --git a/src/aind_behavior_vr_foraging/cli.py b/src/aind_behavior_vr_foraging/cli.py index 5aac0b35..c4487cdd 100644 --- a/src/aind_behavior_vr_foraging/cli.py +++ b/src/aind_behavior_vr_foraging/cli.py @@ -6,7 +6,6 @@ from aind_behavior_vr_foraging import __semver__, regenerate from aind_behavior_vr_foraging.data_mappers import DataMapperCli from aind_behavior_vr_foraging.data_qc import DataQcCli -from aind_behavior_vr_foraging.launcher import ClabeCli class VersionCli(RootModel): @@ -32,9 +31,6 @@ class VrForagingCli(BaseSettings, cli_prog_name="vr-foraging", cli_kebab_case=Tr regenerate: CliSubCommand[DslRegenerateCli] = Field( description="Regenerate the vr-foraging dsl dependencies.", ) - clabe: CliSubCommand[ClabeCli] = Field( - description="Run the Clabe CLI.", - ) def cli_cmd(self): return CliApp().run_subcommand(self) diff --git a/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py b/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py index 4a3c1af5..cdb8a8d0 100644 --- a/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py +++ b/src/aind_behavior_vr_foraging/data_contract/v0_5_0.py @@ -1,6 +1,5 @@ from pathlib import Path -from aind_behavior_services.session import AindBehaviorSessionModel from contraqctor.contract import Dataset, DataStreamCollection from contraqctor.contract.camera import Camera from contraqctor.contract.csv import Csv @@ -8,13 +7,10 @@ DeviceYmlByFile, HarpDevice, ) -from contraqctor.contract.json import PydanticModel, SoftwareEvents +from contraqctor.contract.json import Json, SoftwareEvents from contraqctor.contract.mux import MapFromPaths from contraqctor.contract.text import Text -from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic - def dataset( root_path: Path, @@ -378,24 +374,21 @@ def dataset( name="InputSchemas", description="Configuration files for the behavior rig, task_logic and session.", data_streams=[ - PydanticModel( + Json( name="Rig", - reader_params=PydanticModel.make_params( - model=AindVrForagingRig, + reader_params=Json.make_params( path=root_path / "behavior/Logs/rig_input.json", ), ), - PydanticModel( + Json( name="TaskLogic", - reader_params=PydanticModel.make_params( - model=AindVrForagingTaskLogic, + reader_params=Json.make_params( path=root_path / "behavior/Logs/tasklogic_input.json", ), ), - PydanticModel( + Json( name="Session", - reader_params=PydanticModel.make_params( - model=AindBehaviorSessionModel, + reader_params=Json.make_params( path=root_path / "behavior/Logs/session_input.json", ), ), diff --git a/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py b/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py index 35e7087f..a6da7fb2 100644 --- a/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py +++ b/src/aind_behavior_vr_foraging/data_contract/v0_6_0.py @@ -1,6 +1,6 @@ from pathlib import Path -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.session import Session from contraqctor.contract import Dataset, DataStreamCollection from contraqctor.contract.camera import Camera from contraqctor.contract.csv import Csv @@ -344,6 +344,13 @@ def dataset( root_path / "behavior/SoftwareEvents/PatchStateAtReward.json" ), ), + SoftwareEvents( + name="Annotations", + description="An event emitted whenever an annotation is made during the session.", + reader_params=SoftwareEvents.make_params( + root_path / "behavior/Annotations/Annotations.json" + ), + ), ], ), DataStreamCollection( @@ -423,7 +430,7 @@ def dataset( PydanticModel( name="Session", reader_params=PydanticModel.make_params( - model=AindBehaviorSessionModel, + model=Session, path=root_path / "behavior/Logs/session_output.json", ), ), diff --git a/src/aind_behavior_vr_foraging/data_mappers/_rig.py b/src/aind_behavior_vr_foraging/data_mappers/_rig.py index 39567466..3d98a073 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_rig.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_rig.py @@ -6,8 +6,8 @@ from pathlib import Path from typing import Optional, cast -import aind_behavior_services.rig as AbsRig -from aind_behavior_services import calibration as AbsCalibration +from aind_behavior_services.common import Vector3 +from aind_behavior_services.rig import cameras, olfactometer, visual_stimulation from aind_behavior_services.utils import model_from_json_file from aind_data_schema.base import GenericModel from aind_data_schema.components import connections, coordinates, devices, measurements @@ -328,18 +328,18 @@ def _get_harp_clock_generate_node(rig: AindVrForagingRig, components: list[devic def _get_wheel( rig: AindVrForagingRig, encoder: devices.Device, magnetic_brake: devices.Device, torque_sensor: devices.Device ) -> devices.Wheel: - if rig.harp_treadmill.calibration is None or rig.harp_treadmill.calibration.output is None: + if rig.harp_treadmill.calibration is None: raise ValueError("Treadmill calibration is not set.") return devices.Wheel( name=TrackedDevices.WHEEL, manufacturer=devices.Organization.AIND, - radius=Decimal(str(rig.harp_treadmill.calibration.output.wheel_diameter)) / 2, + radius=Decimal(str(rig.harp_treadmill.calibration.wheel_diameter)) / 2, width=Decimal("3.5"), size_unit=units.SizeUnit.CM, encoder=encoder, magnetic_brake=magnetic_brake, torque_sensor=torque_sensor, - pulse_per_revolution=rig.harp_treadmill.calibration.output.pulses_per_revolution, + pulse_per_revolution=rig.harp_treadmill.calibration.pulses_per_revolution, notes="https://tinyurl.com/AI-RunningWheel", ) @@ -447,11 +447,11 @@ def _get_monitors(rig: AindVrForagingRig) -> list[devices.Monitor]: ], } - def distance_from_vector(vector: AbsRig.visual_stimulation.Vector3): + def distance_from_vector(vector: Vector3): return (vector.x**2 + vector.y**2 + vector.z**2) ** 0.5 def _get_monitors(display_name: str): - display = cast(AbsRig.visual_stimulation.DisplayCalibration, getattr(rig.screen.calibration, display_name)) + display = cast(visual_stimulation.DisplayCalibration, getattr(rig.screen.calibration, display_name)) return devices.Monitor( name=f"{str(TrackedDevices.SCREEN)}_{display_name}", manufacturer=devices.Organization.LG, @@ -524,15 +524,15 @@ def _get_lickspout_assembly( @staticmethod def _get_olfactometer(rig: AindVrForagingRig) -> devices.Olfactometer: olf_calibration = rig.harp_olfactometer.calibration - if olf_calibration is None or (calibration := olf_calibration.input) is None: + if olf_calibration is None: raise ValueError("Olfactometer calibration is not set.") return devices.Olfactometer( - name="harp_olfactometer", + name=TrackedDevices.OLFACTOMETER, harp_device_type=devices.HarpDeviceType.OLFACTOMETER, manufacturer=devices.Organization.CHAMPALIMAUD, is_clock_generator=False, - channels=list(map(_get_olfactometer_channel, calibration.channel_config.values())), + channels=list(map(_get_olfactometer_channel, olf_calibration.channel_config.values())), ) @staticmethod @@ -628,8 +628,8 @@ class _PartialCameraAssembly: ], lens=devices.Lens( name="face_camera_lens", - manufacturer=devices.Organization.TAMRON, - model="M112FM16", + manufacturer=devices.Organization.FUJINON, + model="CF50ZA-1S", ), ), "SideCamera": _PartialCameraAssembly( @@ -637,7 +637,9 @@ class _PartialCameraAssembly: target=devices.CameraTarget.BODY, relative_position=[aind_schema_model_coordinates.AnatomicalRelative.LATERAL], lens=devices.Lens( - name="side_camera_lens", manufacturer=devices.Organization.OTHER, model="LM5JCM", notes="manufacturer=Kowa" + name="side_camera_lens", + manufacturer=devices.Organization.KOWA, + model="LM5JCM", ), ), "FrontCamera": _PartialCameraAssembly( @@ -648,13 +650,15 @@ class _PartialCameraAssembly: aind_schema_model_coordinates.AnatomicalRelative.SUPERIOR, ], lens=devices.Lens( - name="front_camera_lens", manufacturer=devices.Organization.OTHER, model="LM5JCM", notes="manufacturer=Kowa" + name="front_camera_lens", + manufacturer=devices.Organization.KOWA, + model="LM25HC", ), ), } -def _get_camera(name: str, camera: AbsRig.cameras.SpinnakerCamera, fps: float) -> devices.Camera: +def _get_camera(name: str, camera: cameras.SpinnakerCamera, fps: float) -> devices.Camera: return devices.Camera( name=name, manufacturer=devices.Organization.FLIR, @@ -694,11 +698,11 @@ def _get_camera_assembly(camera: devices.Camera) -> devices.CameraAssembly: def _get_olfactometer_channel( - ch: AbsCalibration.olfactometer.OlfactometerChannelConfig, + ch: olfactometer.OlfactometerChannelConfig, ) -> devices.OlfactometerChannel: ch_type_to_ch_type = { - AbsCalibration.olfactometer.OlfactometerChannelType.CARRIER: devices.OlfactometerChannelType.CARRIER, - AbsCalibration.olfactometer.OlfactometerChannelType.ODOR: devices.OlfactometerChannelType.ODOR, + olfactometer.OlfactometerChannelType.CARRIER: devices.OlfactometerChannelType.CARRIER, + olfactometer.OlfactometerChannelType.ODOR: devices.OlfactometerChannelType.ODOR, } return devices.OlfactometerChannel( channel_index=ch.channel_index, diff --git a/src/aind_behavior_vr_foraging/data_mappers/_session.py b/src/aind_behavior_vr_foraging/data_mappers/_session.py index 6e45f01d..b84457b3 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_session.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_session.py @@ -8,7 +8,9 @@ import aind_behavior_services.rig as AbsRig import git import pydantic -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_curriculum import TrainerState +from aind_behavior_services.rig import cameras, visual_stimulation +from aind_behavior_services.session import Session from aind_behavior_services.utils import get_fields_of_type, model_from_json_file, utcnow from aind_data_schema.components import configs from aind_data_schema.core import acquisition @@ -41,9 +43,17 @@ def __init__( self._session_end_time = session_end_time abs_schemas_path = Path(self._data_path) / "Behavior" / "Logs" - self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", AindBehaviorSessionModel) + self.session_model = model_from_json_file(abs_schemas_path / "session_input.json", Session) self.rig_model = model_from_json_file(abs_schemas_path / "rig_input.json", AindVrForagingRig) - self.task_logic_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) + self.task_model = model_from_json_file(abs_schemas_path / "tasklogic_input.json", AindVrForagingTaskLogic) + + self.trainer_state: TrainerState | None = None + trainer_state_path = Path(self._data_path) / "Behavior" / "trainer_state.json" + if trainer_state_path.exists(): + self.trainer_state = model_from_json_file( + trainer_state_path, + TrainerState, + ) if curriculum_suggestion is not None: if isinstance(curriculum_suggestion, CurriculumSuggestion): @@ -59,7 +69,7 @@ def __init__( except FileNotFoundError: logger.warning("Curriculum suggestion file not found. Proceeding without it.") curriculum_suggestion = None - self.curriculum = curriculum_suggestion + self.curriculum_suggestion = curriculum_suggestion self.repository = git.Repo(self._repo_path) assert self.repository.working_tree_dir is not None self.bonsai_app = BonsaiApp( @@ -116,7 +126,7 @@ def _map(self) -> acquisition.Acquisition: acquisition_end_time=utcnow(), acquisition_start_time=self.session_model.date, experimenters=self.session_model.experimenter, - acquisition_type=self.session_model.experiment or self.task_logic_model.name, + acquisition_type=self.session_model.experiment or self.task_model.name, coordinate_system=None, data_streams=self._get_data_streams(), calibrations=self._get_calibrations(), @@ -138,12 +148,12 @@ def _get_calibrations(self) -> List[acquisition.CALIBRATIONS]: @staticmethod def _include_device(device: AbsRig.Device) -> bool: - if isinstance(device, AbsRig.visual_stimulation.Screen): + if isinstance(device, visual_stimulation.ScreenAssembly): return False - if isinstance(device, AbsRig.cameras.CameraController): + if isinstance(device, cameras.CameraController): return False - if isinstance(device, get_args(AbsRig.cameras.CameraTypes)): - return cast(AbsRig.cameras.CameraTypes, device).video_writer is not None + if isinstance(device, get_args(cameras.CameraTypes)): + return cast(cameras.CameraTypes, device).video_writer is not None return True def _get_data_streams(self) -> List[acquisition.DataStream]: @@ -214,39 +224,51 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: ) # Olfactory Stimulation - # TODO needs aind-data-schema to be updated - # stimulus_modalities.append(acquisition.StimulusModality.OLFACTORY) - # olfactory_stimulus_channel_config: List[aind_data_schema.components.stimulus.OlfactometerChannelConfig] = [] - # olf_calibration = rig_model.harp_olfactometer.calibration - # if olf_calibration is None: - # raise ValueError("Olfactometer calibration is not set in the rig model.") - # for _, channel in olf_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 = get_fields_of_type(rig_model, AbsRig.harp.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.") - - if self.curriculum is not None: + import aind_data_schema.components.configs + from aind_behavior_services.rig.olfactometer import OlfactometerChannelType + + stimulus_modalities.append(acquisition.StimulusModality.OLFACTORY) + olfactory_stimulus_channel_info: List[aind_data_schema.components.configs.OlfactometerChannelInfo] = [] + olf_calibration = self.rig_model.harp_olfactometer.calibration + if olf_calibration is None: + raise ValueError("Olfactometer calibration is not set in the rig model.") + for _, channel in olf_calibration.channel_config.items(): + if channel.channel_type == OlfactometerChannelType.ODOR: + # These fields are required, so... + if not (channel.odorant is None and channel.odorant_dilution is None): + olfactory_stimulus_channel_info.append( + aind_data_schema.components.configs.OlfactometerChannelInfo( + channel_index=channel.channel_index, + odorant=channel.odorant, + dilution=channel.odorant_dilution, + ) + ) + else: + logger.warning( + "Olfactometer channel %d is configured as ODOR but odorant or dilution is not set. Skipping this channel.", + channel.channel_index, + ) + + stimulus_epoch_configurations.append( + aind_data_schema.components.configs.OlfactometerConfig( + device_name=TrackedDevices.OLFACTOMETER, channel_configs=olfactory_stimulus_channel_info + ) + ) + + # Animal performance, curriculum, and metrics + performance_metrics: Optional[acquisition.PerformanceMetrics] = None + curriculum_status: str = "false" + + if self.curriculum_suggestion is not None: + logger.debug("Curriculum suggestion found. Setting performance metrics based on curriculum suggestion.") performance_metrics = acquisition.PerformanceMetrics( - output_parameters=acquisition.GenericModel.model_validate(self.curriculum.metrics.model_dump()) + output_parameters=acquisition.GenericModel.model_validate( + self.curriculum_suggestion.metrics.model_dump() + ) ) - curriculum_status = str(self.curriculum.trainer_state.is_on_curriculum) - else: - curriculum_status = "false" - performance_metrics = None + if self.trainer_state is not None: + logger.debug("Trainer state found. Setting curriculum status based on trainer state.") + curriculum_status = str(self.trainer_state.is_on_curriculum) stimulus_epochs: list[acquisition.StimulusEpoch] = [ acquisition.StimulusEpoch( @@ -255,7 +277,7 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: stimulus_start_time=self.session_model.date, stimulus_end_time=self.session_end_time, configurations=stimulus_epoch_configurations, - stimulus_name=self.session_model.experiment or self.task_logic_model.name, + stimulus_name=self.session_model.experiment or self.task_model.name, stimulus_modalities=stimulus_modalities, performance_metrics=performance_metrics, curriculum_status=curriculum_status, @@ -264,7 +286,7 @@ def _get_stimulus_epochs(self) -> List[acquisition.StimulusEpoch]: return stimulus_epochs def _get_cameras_config(self) -> List[acquisition.DetectorConfig]: - def _map_camera(name: str, camera: AbsRig.cameras.CameraTypes) -> acquisition.DetectorConfig: + def _map_camera(name: str, camera: cameras.CameraTypes) -> acquisition.DetectorConfig: assert camera.video_writer is not None, "Camera does not have a video writer configured." return acquisition.DetectorConfig( device_name=name, @@ -274,25 +296,25 @@ def _map_camera(name: str, camera: AbsRig.cameras.CameraTypes) -> acquisition.De compression=_map_compression(camera.video_writer), ) - def _map_compression(compression: AbsRig.cameras.VideoWriter) -> acquisition.Code: + def _map_compression(compression: cameras.VideoWriter) -> acquisition.Code: if compression is None: raise ValueError("Camera does not have a video writer configured.") - if isinstance(compression, AbsRig.cameras.VideoWriterFfmpeg): + if isinstance(compression, cameras.VideoWriterFfmpeg): return acquisition.Code( url="https://ffmpeg.org/", name="FFMPEG", parameters=acquisition.GenericModel.model_validate(compression.model_dump()), ) - elif isinstance(compression, AbsRig.cameras.VideoWriterOpenCv): + elif isinstance(compression, cameras.VideoWriterOpenCv): bonsai = self._get_bonsai_as_code() bonsai.parameters = acquisition.GenericModel.model_validate(compression.model_dump()) return bonsai else: raise ValueError("Camera does not have a valid video writer configured.") - cameras = data_mapper_helpers.get_cameras(self.rig_model, exclude_without_video_writer=True) + _cameras = data_mapper_helpers.get_cameras(self.rig_model, exclude_without_video_writer=True) - return list(map(_map_camera, cameras.keys(), cameras.values())) + return list(map(_map_camera, _cameras.keys(), _cameras.values())) def _get_bonsai_as_code(self) -> acquisition.Code: bonsai_folder = Path(self.bonsai_app.executable).parent diff --git a/src/aind_behavior_vr_foraging/data_mappers/_utils.py b/src/aind_behavior_vr_foraging/data_mappers/_utils.py index 60a713aa..0810fd5e 100644 --- a/src/aind_behavior_vr_foraging/data_mappers/_utils.py +++ b/src/aind_behavior_vr_foraging/data_mappers/_utils.py @@ -1,8 +1,8 @@ import enum import logging -from typing import List, Optional, Type, TypeVar, Union +from typing import List, Type, TypeVar, Union -import aind_behavior_services.calibration as AbsCalibration +import aind_behavior_services.rig.water_valve as water_valve import pydantic from aind_behavior_services.utils import get_fields_of_type, utcnow from aind_data_schema.components import coordinates, measurements @@ -32,31 +32,26 @@ def coerce_to_aind_data_schema(value: Union[pydantic.BaseModel, dict], target_ty def _get_water_calibration(rig_model: AindVrForagingRig) -> List[measurements.VolumeCalibration]: def _mapper( - device_name: Optional[str], water_calibration: AbsCalibration.water_valve.WaterValveCalibration + device_name: str, water_calibration: water_valve.WaterValveCalibration ) -> measurements.VolumeCalibration: - device_name = device_name or water_calibration.device_name if device_name is None: raise ValueError("Device name is not set.") - c = water_calibration.output - if c is None: - c = water_calibration.input.calibrate_output() - c.interval_average = c.interval_average or {} + interval_average = water_calibration.interval_average if water_calibration.interval_average else {} return measurements.VolumeCalibration( device_name=device_name, calibration_date=water_calibration.date if water_calibration.date else utcnow(), - notes=water_calibration.notes, - input=list(c.interval_average.keys()), - output=list(c.interval_average.values()), + input=list(interval_average.keys()), + output=list(interval_average.values()), input_unit=units.TimeUnit.S, output_unit=units.VolumeUnit.ML, fit=measurements.CalibrationFit( fit_type=measurements.FitType.LINEAR, - fit_parameters=acquisition.GenericModel.model_validate(c.model_dump()), + fit_parameters=acquisition.GenericModel.model_validate(water_calibration.model_dump()), ), ) - water_calibration = get_fields_of_type(rig_model, AbsCalibration.water_valve.WaterValveCalibration) + water_calibration = get_fields_of_type(rig_model, water_valve.WaterValveCalibration) return ( list(map(lambda tup: _mapper(TrackedDevices.WATER_VALVE_SOLENOID, tup[1]), water_calibration)) if len(water_calibration) > 0 @@ -68,11 +63,11 @@ def _get_treadmill_brake_calibration(rig_model: AindVrForagingRig) -> List[measu treadmill = rig_model.harp_treadmill if treadmill.calibration is None: raise ValueError("Treadmill calibration is not set.") - calibration = treadmill.calibration.output.brake_lookup_calibration + calibration = treadmill.calibration.brake_lookup_calibration calibration_ads = measurements.Calibration( device_name=TrackedDevices.MAGNETIC_BRAKE, calibration_date=treadmill.calibration.date if treadmill.calibration.date else utcnow(), - description=type(treadmill.calibration.output).model_fields["brake_lookup_calibration"].description + description=type(treadmill.calibration).model_fields["brake_lookup_calibration"].description or "brake calibration", input=[pair[0] for pair in calibration], input_unit=units.MassUnit.G, # torque in gram-force cm @@ -111,3 +106,4 @@ class TrackedDevices(enum.StrEnum): SCREEN = "screen" COMPUTER = "computer" WATER_VALVE_SOLENOID = "water_valve_solenoid" + OLFACTOMETER = "harp_olfactometer" diff --git a/src/aind_behavior_vr_foraging/data_qc/data_qc.py b/src/aind_behavior_vr_foraging/data_qc/data_qc.py index 8a58d716..7edeb456 100644 --- a/src/aind_behavior_vr_foraging/data_qc/data_qc.py +++ b/src/aind_behavior_vr_foraging/data_qc/data_qc.py @@ -28,6 +28,23 @@ def test_end_session_exists(self): else: return self.pass_test(None, "EndSession event exists with data.") + def test_has_annotations(self): + """Check that the session has annotations and surfaces them in the context if they exist.""" + annotations = self.dataset["Behavior"]["Logs"]["Annotations"] + if not annotations.has_data: + return self.pass_test( + None, "No annotations found. This may be expected if no manual annotations were made." + ) + + annotations_made = t.cast(pd.DataFrame, annotations.data) + if annotations_made.empty: + return self.pass_test( + None, "No annotations found. This may be expected if no manual annotations were made." + ) + + data = annotations_made["data"].to_dict() # this will be a series of strings + return self.warn_test(None, "Annotations found", context=data) + class Rendering(qc.Suite): def __init__(self, render_sync_state: contract.csv.Csv, photodiode_events: pd.Series, expected_fps: float): @@ -94,8 +111,8 @@ def test_render_latency(self, max_latency: t.Optional[float] = None): ts_photodiode = ts_photodiode[1:] ts_gpu = ts_gpu[1:] # Zero both arrays to make it easier to manipulate - ts_gpu -= ts_gpu[0] - ts_photodiode -= ts_photodiode[0] + ts_gpu = ts_gpu - ts_gpu[0] + ts_photodiode = ts_photodiode - ts_photodiode[0] aligned_gpu_photodiode = np.empty((len(ts_gpu), 2)) aligned_gpu_photodiode[:] = np.nan diff --git a/src/aind_behavior_vr_foraging/launcher.py b/src/aind_behavior_vr_foraging/launcher.py deleted file mode 100644 index d56f80c2..00000000 --- a/src/aind_behavior_vr_foraging/launcher.py +++ /dev/null @@ -1,185 +0,0 @@ -import logging -from pathlib import Path -from typing import Any, cast - -from aind_behavior_services.calibration.aind_manipulator import ManipulatorPosition -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_services.utils import utcnow -from clabe import resource_monitor -from clabe.apps import ( - AindBehaviorServicesBonsaiApp, - CurriculumApp, - CurriculumSettings, - CurriculumSuggestion, -) -from clabe.data_transfer.aind_watchdog import WatchdogDataTransferService, WatchdogSettings -from clabe.launcher import Launcher, LauncherCliArgs -from clabe.pickers import ByAnimalModifier, DefaultBehaviorPickerSettings -from clabe.pickers.dataverse import DataversePicker -from contraqctor.contract.json import SoftwareEvents -from pydantic_settings import CliApp - -from aind_behavior_vr_foraging import data_contract -from aind_behavior_vr_foraging.data_mappers import DataMapperCli -from aind_behavior_vr_foraging.rig import AindVrForagingRig -from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic - -logger = logging.getLogger(__name__) - - -async def experiment(launcher: Launcher) -> None: - monitor = resource_monitor.ResourceMonitor( - constrains=[ - resource_monitor.available_storage_constraint_factory(launcher.settings.data_dir, 2e11), - ] - ) - - # Validate resources - monitor.run() - - # Start experiment setup - picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) - - # Pick and register session - session = picker.pick_session(AindBehaviorSessionModel) - launcher.register_session(session) - - # Fetch the task settings - trainer_state, task_logic = picker.pick_trainer_state(AindVrForagingTaskLogic) - input_trainer_state_path = launcher.save_temp_model(trainer_state) - - # Fetch rig settings - rig = picker.pick_rig(AindVrForagingRig) - - # Post-fetching modifications - manipulator_modifier = ByAnimalManipulatorModifier( - subject_db_path=picker.subject_dir / picker.session.subject, - model_path="manipulator.calibration.input.initial_position", - model_name="manipulator_init.json", - launcher=launcher, - ) - manipulator_modifier.inject(rig) - - # Run the task via Bonsai - bonsai_app = AindBehaviorServicesBonsaiApp( - workflow=Path(r"./src/main.bonsai"), - temp_directory=launcher.temp_dir, - rig=rig, - session=session, - task_logic=task_logic, - ) - await bonsai_app.run_async() - - # Update manipulator initial position for next session - try: - manipulator_modifier.dump() - except Exception as e: - logger.error(f"Failed to update manipulator initial position: {e}") - - # Curriculum - suggestion: CurriculumSuggestion | None = None - suggestion_path: Path | None = None - if not ( - (picker.trainer_state is None) - or (picker.trainer_state.is_on_curriculum is False) - or (picker.trainer_state.stage is None) - ): - trainer = CurriculumApp( - settings=CurriculumSettings( - input_trainer_state=input_trainer_state_path.resolve(), data_directory=launcher.session_directory - ) - ) - # Run the curriculum - await trainer.run_async() - suggestion = trainer.process_suggestion() - # Dump suggestion for debugging (for now, but we will prob remove this later) - suggestion_path = _dump_suggestion(suggestion, launcher.session_directory) - # Push updated trainer state back to the database - picker.push_new_suggestion(suggestion.trainer_state) - - # Mappers - assert launcher.repository.working_tree_dir is not None - - DataMapperCli( - data_path=launcher.session_directory, - repo_path=launcher.repository.working_tree_dir, # type: ignore[arg-type] - curriculum_suggestion=suggestion_path, - session_end_time=utcnow(), - ).cli_cmd() - - # Run data qc - if picker.ui_helper.prompt_yes_no_question("Would you like to generate a qc report?"): - try: - import webbrowser - - from contraqctor.qc.reporters import HtmlReporter - - from .data_qc.data_qc import make_qc_runner - - vr_dataset = data_contract.dataset(launcher.session_directory) - runner = make_qc_runner(vr_dataset) - qc_path = launcher.session_directory / "Behavior" / "Logs" / "qc_report.html" - reporter = HtmlReporter(output_path=qc_path) - runner.run_all_with_progress(reporter=reporter) - webbrowser.open(qc_path.as_uri(), new=2) - except Exception as e: - logger.error(f"Failed to run data QC: {e}") - - # Watchdog - is_transfer = picker.ui_helper.prompt_yes_no_question("Would you like to transfer data?") - if not is_transfer: - logger.info("Data transfer skipped by user.") - return - - launcher.copy_logs() - watchdog_settings = WatchdogSettings() - watchdog_settings.destination = Path(watchdog_settings.destination) / launcher.session.subject - WatchdogDataTransferService( - source=launcher.session_directory, - settings=watchdog_settings, - session=session, - ).transfer() - - return - - -def _dump_suggestion(suggestion: CurriculumSuggestion, session_directory: Path) -> Path: - logger.info(f"Dumping curriculum suggestion to: {session_directory / 'Behavior' / 'Logs' / 'suggestion.json'}") - suggestion_path = session_directory / "Behavior" / "Logs" / "suggestion.json" - with open(suggestion_path, "w", encoding="utf-8") as f: - f.write(suggestion.model_dump_json(indent=2)) - return suggestion_path - - -class ByAnimalManipulatorModifier(ByAnimalModifier[AindVrForagingRig]): - """Modifier to set and update manipulator initial position based on animal-specific data.""" - - def __init__( - self, subject_db_path: Path, model_path: str, model_name: str, *, launcher: Launcher, **kwargs - ) -> None: - super().__init__(subject_db_path, model_path, model_name, **kwargs) - self._launcher = launcher - - def _process_before_dump(self) -> ManipulatorPosition: - _dataset = data_contract.dataset(self._launcher.session_directory) - manipulator_parking_position: SoftwareEvents = cast( - SoftwareEvents, _dataset["Behavior"]["SoftwareEvents"]["SpoutParkingPositions"].load() - ) - data: dict[str, Any] = manipulator_parking_position.data.iloc[0]["data"]["ResetPosition"] - position = ManipulatorPosition.model_validate(data) - return position - - -class ClabeCli(LauncherCliArgs): - def cli_cmd(self): - launcher = Launcher(settings=self) - launcher.run_experiment(experiment) - return None - - -def main() -> None: - CliApp().run(ClabeCli) - - -if __name__ == "__main__": - main() diff --git a/src/aind_behavior_vr_foraging/regenerate.py b/src/aind_behavior_vr_foraging/regenerate.py index e3ee8cb2..5fd3ef44 100644 --- a/src/aind_behavior_vr_foraging/regenerate.py +++ b/src/aind_behavior_vr_foraging/regenerate.py @@ -2,8 +2,8 @@ from typing import Union import pydantic -from aind_behavior_services.session import AindBehaviorSessionModel -from aind_behavior_services.utils import BonsaiSgenSerializers, convert_pydantic_to_bonsai +from aind_behavior_services.schema import BonsaiSgenSerializers, convert_pydantic_to_bonsai +from aind_behavior_services.session import Session import aind_behavior_vr_foraging.rig import aind_behavior_vr_foraging.task_logic @@ -17,7 +17,7 @@ def main(): models = [ aind_behavior_vr_foraging.task_logic.AindVrForagingTaskLogic, aind_behavior_vr_foraging.rig.AindVrForagingRig, - AindBehaviorSessionModel, + Session, aind_behavior_vr_foraging.task_logic.VirtualSite, aind_behavior_vr_foraging.task_logic.VisualCorridor, ] diff --git a/src/aind_behavior_vr_foraging/rig.py b/src/aind_behavior_vr_foraging/rig.py index 92e53498..dcae8434 100644 --- a/src/aind_behavior_vr_foraging/rig.py +++ b/src/aind_behavior_vr_foraging/rig.py @@ -1,61 +1,56 @@ -# Import core types -from __future__ import annotations - -# Import core types from typing import Literal, Optional -import aind_behavior_services.calibration.aind_manipulator as man -import aind_behavior_services.calibration.olfactometer as oc -import aind_behavior_services.calibration.treadmill as treadmill -import aind_behavior_services.calibration.water_valve as wvc import aind_behavior_services.rig as rig +import aind_behavior_services.rig.cameras as cameras +import aind_behavior_services.rig.harp as harp +import aind_behavior_services.rig.olfactometer as oc +import aind_behavior_services.rig.treadmill as treadmill +import aind_behavior_services.rig.visual_stimulation as visual_stimulation +import aind_behavior_services.rig.water_valve as wvc +from aind_behavior_services.rig import aind_manipulator as man from pydantic import BaseModel, Field from aind_behavior_vr_foraging import __semver__ -class AindManipulatorAdditionalSettings(BaseModel): - """Additional settings for the manipulator device""" +class AindManipulatorDevice(man.AindManipulator): + """Appends a task specific configuration to the base manipulator model.""" spout_axis: man.Axis = Field(default=man.Axis.Y1, description="Spout axis") -class AindManipulatorDevice(man.AindManipulatorDevice): - """Overrides the default settings for the manipulator device by spec'ing additional_settings field""" - - additional_settings: AindManipulatorAdditionalSettings = Field( - default=AindManipulatorAdditionalSettings(), description="Additional settings" - ) - - class RigCalibration(BaseModel): - """Container class for calibration models. In a future release these will be moved to the respective devices""" + """Container class for calibration models.""" + + water_valve: wvc.WaterValveCalibration = Field(description="Water valve calibration") - water_valve: wvc.WaterValveCalibration = Field(..., description="Water valve calibration") +class AindVrForagingRig(rig.Rig): + """Represents the schema, and concrete instantiation, of a rig configuration to run the VrForaging behavior task.""" -class AindVrForagingRig(rig.AindBehaviorRigModel): version: Literal[__semver__] = __semver__ - triggered_camera_controller: rig.cameras.CameraController[rig.cameras.SpinnakerCamera] = Field( - ..., description="Required camera controller to triggered cameras." + triggered_camera_controller: cameras.CameraController[cameras.SpinnakerCamera] = Field( + description="Required camera controller to triggered cameras." ) - monitoring_camera_controller: Optional[rig.cameras.CameraController[rig.cameras.WebCamera]] = Field( + monitoring_camera_controller: Optional[cameras.CameraController[cameras.WebCamera]] = Field( default=None, description="Optional camera controller for monitoring cameras." ) - harp_behavior: rig.harp.HarpBehavior = Field(..., description="Harp behavior") - harp_olfactometer: oc.Olfactometer = Field(..., description="Harp olfactometer") - harp_lickometer: rig.harp.HarpLicketySplit = Field(..., description="Harp lickometer") - harp_clock_generator: rig.harp.HarpWhiteRabbit = Field(..., description="Harp clock generator") - harp_analog_input: Optional[rig.harp.HarpAnalogInput] = Field(default=None, description="Harp analog input") - harp_treadmill: treadmill.Treadmill = Field(..., description="Harp treadmill") - harp_sniff_detector: Optional[rig.harp.HarpSniffDetector] = Field( - default=None, description="Sniff detector settings" + harp_behavior: harp.HarpBehavior = Field(description="Harp behavior") + harp_olfactometer: oc.Olfactometer = Field(description="Harp olfactometer") + harp_olfactometer_extension: list[oc.Olfactometer] = Field( + default_factory=list, + description="A collection of subordinate olfactometers that can be added to increase the number of independently delivered odors. The order of the list determines the order by which odors are numbered", ) - harp_environment_sensor: Optional[rig.harp.HarpEnvironmentSensor] = Field( + harp_lickometer: harp.HarpLicketySplit = Field(description="Harp lickometer") + harp_clock_generator: harp.HarpWhiteRabbit = Field(description="Harp clock generator") + harp_analog_input: Optional[harp.HarpAnalogInput] = Field(default=None, description="Harp analog input") + harp_treadmill: treadmill.Treadmill = Field(description="Harp treadmill") + harp_sniff_detector: Optional[harp.HarpSniffDetector] = Field(default=None, description="Sniff detector settings") + harp_environment_sensor: Optional[harp.HarpEnvironmentSensor] = Field( default=None, description="Environment sensor" ) - manipulator: AindManipulatorDevice = Field(..., description="Manipulator") - screen: rig.visual_stimulation.Screen = Field( - default=rig.visual_stimulation.Screen(), description="Screen settings" + manipulator: AindManipulatorDevice = Field(description="Manipulator") + screen: visual_stimulation.ScreenAssembly = Field( + default=visual_stimulation.ScreenAssembly(), description="Screen settings", validate_default=True ) - calibration: RigCalibration = Field(..., description="Calibration models") + calibration: RigCalibration = Field(description="Calibration models") diff --git a/src/aind_behavior_vr_foraging/task_logic.py b/src/aind_behavior_vr_foraging/task_logic.py index 89a652af..f4853bc6 100644 --- a/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/aind_behavior_vr_foraging/task_logic.py @@ -1,11 +1,12 @@ import logging from enum import Enum -from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, Union +from typing import TYPE_CHECKING, Annotated, Any, Dict, List, Literal, Optional, Self, TypeAlias, Union, cast -import aind_behavior_services.task_logic.distributions as distributions -from aind_behavior_services.task_logic import AindBehaviorTaskLogicModel, TaskParameters -from pydantic import BaseModel, Field, NonNegativeFloat, field_validator, model_validator -from typing_extensions import TypeAliasType +import aind_behavior_services.task.distributions as distributions +from aind_behavior_services.common import Size, Vector3 +from aind_behavior_services.task import Task, TaskParameters +from pydantic import BaseModel, BeforeValidator, Field, NonNegativeFloat, field_validator, model_validator +from typing_extensions import TypeAliasType, deprecated from aind_behavior_vr_foraging import ( __semver__, @@ -27,46 +28,6 @@ def scalar_value(value: float) -> distributions.Scalar: return distributions.Scalar(distribution_parameters=distributions.ScalarDistributionParameter(value=value)) -# ==================== BASIC DATA STRUCTURES ==================== - - -class Size(BaseModel): - """ - Represents 2D dimensions with width and height. - - Used for defining texture sizes, corridor dimensions, and other 2D measurements - in the VR foraging environment. - """ - - width: float = Field(default=0, description="Width of the texture") - height: float = Field(default=0, description="Height of the texture") - - -class Vector2(BaseModel): - """ - Represents a 2D point or vector with x and y coordinates. - - Used for positioning elements in 2D space within the VR environment, - such as texture coordinates or 2D movement vectors. - """ - - x: float = Field(default=0, description="X coordinate of the point") - y: float = Field(default=0, description="Y coordinate of the point") - - -class Vector3(BaseModel): - """ - Represents a 3D point or vector with x, y, and z coordinates. - - Used for 3D positioning and movement in the virtual reality environment, - including camera positions, object locations, and 3D transformations. - """ - - x: float = Field(default=0, description="X coordinate of the point") - y: float = Field(default=0, description="Y coordinate of the point") - z: float = Field(default=0, description="Z coordinate of the point") - - # ==================== NUMERICAL UPDATERS ==================== class NumericalUpdaterOperation(str, Enum): """ @@ -204,18 +165,6 @@ class VisualCorridor(BaseModel): textures: WallTextures = Field(description="The textures of the corridor") -class OdorSpecification(BaseModel): - """ - Specifies odor delivery parameters for olfactory cues in the VR environment. - - Odors can be delivered at specific locations to provide additional sensory - information for navigation and foraging decisions. - """ - - index: int = Field(ge=0, le=3, description="Index of the odor to be used") - concentration: float = Field(default=1, ge=0, le=1, description="Concentration of the odor") - - # ==================== PATCH REWARD LOGIC ==================== @@ -331,7 +280,12 @@ class CtcmFunction(_PatchUpdateFunction): function_type: Literal["CtcmFunction"] = "CtcmFunction" transition_matrix: List[List[NonNegativeFloat]] = Field(description="Transition matrix between states") - rho: float = Field(description="The underlying value goverining the stochastic process") + rho: float = Field(description="The underlying value governing the stochastic process") + dt: Literal[0.1] = Field(default=0.1, description="Sampling time step (s)") + rate: Optional[float] = Field( + default=None, + description="Rate of the replenishment used to generate the matrix. This value is used for metadata keep sake only", + ) minimum: float = Field(default=1, description="Maximum value after update") maximum: float = Field(default=0, description="Minimum value after update") @@ -349,6 +303,49 @@ def validate_transition_matrix(cls, value): col /= row_sum return value + @classmethod + def from_replenishment_rate( + cls, n_states: int, replenishment_rate: float, rho: float, dt: Optional[float] = 0.1 + ) -> "CtcmFunction": + """ + Computes the replenishment transition probability matrix for each patch + Parameters + ----------- + n_states: int + number reward states per patch. + replenishment_rate: float + replenishment rate. + rho: float + The underlying value governing the stochastic process + dt: float + experiment time step + + + Returns + ------- + CtcmFunction + Instance of CtcmFunction with computed transition matrix. + """ + import numpy as np + from scipy.linalg import expm + + if dt is None: + dt = cls.model_fields["dt"].default + q = np.zeros((n_states, n_states)) + np.fill_diagonal(q, -replenishment_rate) + np.fill_diagonal(q[:, 1:], replenishment_rate) + q[-1, -1] = 0 + + p_t = expm(q * dt) + assert p_t.ndim == 2 + transition_matrix = cast(list[list[float]], p_t.tolist()) + return cls( + transition_matrix=transition_matrix, + rho=rho, + dt=dt, + rate=replenishment_rate, + ) + if TYPE_CHECKING: PatchUpdateFunction = Union[ @@ -639,6 +636,38 @@ class VirtualSiteRewardSpecification(BaseModel): ) +def _odor_mixture_from_odor_specification(value: Any): + if isinstance(value, list): + return value + else: + try: + odor_spec = OdorSpecification.model_validate(value) + return [odor_spec.concentration if i == odor_spec.index else 0 for i in range(3)] + except ValueError: + pass + return value + + +OdorMixture: TypeAlias = Annotated[ + List[NonNegativeFloat], + Field(description="The optional odor specification of the virtual site"), + BeforeValidator(_odor_mixture_from_odor_specification), +] + + +@deprecated("OdorSpecification is deprecated, use OdorMixture instead") +class OdorSpecification(BaseModel): + """ + Specifies odor delivery parameters for olfactory cues in the VR environment. + + Odors can be delivered at specific locations to provide additional sensory + information for navigation and foraging decisions. + """ + + index: int = Field(ge=0, le=3, description="Index of the odor to be used") + concentration: float = Field(default=1, ge=0, le=1, description="Concentration of the odor") + + class VirtualSite(BaseModel): """ THIS CLASS IS NOT MEANT TO BE DIRECTLY INSTANTIATED. @@ -656,7 +685,7 @@ class VirtualSite(BaseModel): label: VirtualSiteLabels = Field(default=VirtualSiteLabels.UNSPECIFIED, description="Label of the virtual site") length: float = Field(default=20, description="Length of the virtual site (cm)") start_position: float = Field(default=0, ge=0, description="Start position of the virtual site (cm)") - odor_specification: Optional[OdorSpecification] = Field( + odor_specification: Optional[OdorMixture] = Field( default=None, description="The optional odor specification of the virtual site" ) reward_specification: Optional[VirtualSiteRewardSpecification] = Field( @@ -754,8 +783,8 @@ class Patch(BaseModel): label: str = Field(default="", description="Label of the patch") state_index: int = Field(default=0, ge=0, description="Index of the state") - odor_specification: Optional[OdorSpecification] = Field( - default=None, description="The optional odor specification of the patch" + odor_specification: OdorMixture = Field( + description="A list of odor concentrations for the patch, where the index of the list corresponds to the odor channel" ) reward_specification: RewardSpecification = Field( default=RewardSpecification(), @@ -822,27 +851,6 @@ class MovableSpoutControl(BaseModel): ) -class OdorControl(BaseModel): - """ - Controls the odor delivery system parameters. - - This class manages the olfactory stimulus delivery system, including flow rates, - valve timing, and carrier gas configuration. It ensures proper odor concentration - and delivery timing for the behavioral task. - """ - - valve_max_open_time: float = Field( - default=10, ge=0, description="Maximum time (s) the valve can be open continuously" - ) - target_total_flow: float = Field( - default=1000, ge=100, le=1000, description="Target total flow (ml/s) of the odor mixture" - ) - use_channel_3_as_carrier: bool = Field(default=True, description="Whether to use channel 3 as carrier") - target_odor_flow: float = Field( - default=100, ge=0, le=100, description="Target odor flow (ml/s) in the odor mixture" - ) - - class PositionControl(BaseModel): """ Controls the position tracking and movement detection parameters. @@ -853,7 +861,9 @@ class PositionControl(BaseModel): """ gain: Vector3 = Field(default=Vector3(x=1, y=1, z=1), description="Gain of the position control.") - initial_position: Vector3 = Field(default=Vector3(x=0, y=2.56, z=0), description="Gain of the position control.") + initial_position: Vector3 = Field( + default=Vector3(x=0, y=2.56, z=0), description="Initial position of the subject in the VR world." + ) frequency_filter_cutoff: float = Field( default=0.5, ge=0, @@ -877,6 +887,23 @@ class AudioControl(BaseModel): frequency: float = Field(default=1000, ge=100, le=9999, description="Frequency (Hz) of the audio cue") +class OdorControl(BaseModel): + """ + Controls the odor delivery system parameters. + + This class manages the olfactory stimulus delivery system, including flow rates, + valve timing, and carrier gas configuration. It ensures proper odor concentration + and delivery timing for the behavioral task. + """ + + target_total_flow: Literal[1000] = Field( + default=1000, ge=100, le=1000, description="Target total flow (ml/s) of the odor mixture" + ) + target_odor_flow: Literal[100] = Field( + default=100, ge=0, le=100, description="Target odor flow (ml/s) in the odor mixture" + ) + + class OperationControl(BaseModel): """ Master control class for all operational hardware systems. @@ -889,7 +916,11 @@ class OperationControl(BaseModel): movable_spout_control: MovableSpoutControl = Field( default=MovableSpoutControl(), description="Control of the movable spout" ) - odor_control: OdorControl = Field(default=OdorControl(), description="Control of the odor", validate_default=True) + odor_control: OdorControl = Field( + default=OdorControl(target_odor_flow=100, target_total_flow=1000), + description="Control of the odor", + validate_default=True, + ) position_control: PositionControl = Field( default=PositionControl(), description="Control of the position", validate_default=True ) @@ -1005,7 +1036,7 @@ 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." + default=[], description="List of end conditions that must be true for the block to end." ) @@ -1042,7 +1073,7 @@ class AindVrForagingTaskParameters(TaskParameters): operation_control: OperationControl = Field(description="Control of the operation") -class AindVrForagingTaskLogic(AindBehaviorTaskLogicModel): +class AindVrForagingTaskLogic(Task): """ Main task logic model for the AIND VR Foraging task. diff --git a/src/calibration.bonsai b/src/calibration.bonsai new file mode 100644 index 00000000..3ce518b9 --- /dev/null +++ b/src/calibration.bonsai @@ -0,0 +1,3109 @@ + + + + + + + + + ReadSchemas + + + + + + + + + + + + RawTaskLogicSchema + + + + + + + + + + + RawRigSchema + + + + + + + + + + + RawSessionSchema + + + + + + + + + + + + + + + + + + + + + + LoadSchemas + + + + RawRigSchema + + + + + + + 1 + + + + RigSchema + + + + + + + + + + + + + + Hardware + + + + ScreenConfiguration + + + + RigSchema + + + Screen + + + + + + + + + + + 1000 + 1000 + VrForaging + Off + false + Black + DepthBufferBit ColorBufferBit + false + + Resizable + Fullscreen + Second + 60 + 120 + + + + 8 + 8 + 8 + 8 + + 16 + 0 + 0 + + 0 + 0 + 0 + 0 + + 2 + false + + + + + + + + + + + + + + + + PT2S + + + + HarpDevices + + + + HarpWhiteRabbitEvents + + + + Include + Event + + + + + + + Seconds + + + HarpTimestampSource + + + HarpWhiteRabbitEvents + + + + + + HarpWhiteRabbitHeartbeat + + + TriggerHarpReadDump + + + RigSchema + + + HarpClockGenerator.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpOlfactometer.PortName + + + + + + + + COM6 + TriggerHarpReadDump + true + + + RigSchema + + + HarpLickometer.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpTreadmill + + + PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + Manipulator + + + Calibration + + + + None + + + + + + + RigSchema + + + Manipulator + + + PortName + + + + + + + + COMx + + + RigSchema + + + HarpSniffDetector.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpSniffDetector + + + + + + + RigSchema + + + HarpAnalogInput.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpAnalogInput + + + + + + + RigSchema + + + HarpEnvironmentSensor.PortName + + + + + + + + COMx + TriggerHarpReadDump + + + RigSchema + + + HarpEnvironmentSensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cameras + + + + TriggeredCameras + + + + RigSchema + + + + 1 + + + + TriggeredCameraController + + + TriggeredCameraController + + + FrameRate.Value + + + CameraFrameRate + + + TriggeredCameraController + + + Cameras + + + CameraFrameRate + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + Include + Event + + + + + + + Value + + + + FrameAcquired + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + + + Item2.Seconds + + + FrameEvent + + + TriggeredCameraController + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + + true + + + + TriggeredCamerasInitialized + + + + 1 + + + + ThisCamera + + + Value + + + + + + + + + + + + + + + ThisCamera + + + Value + + + RegionOfInterest + + + + + + + + RegionOfInterest + + 0 + 0 + 0 + 0 + + + + + + + + + + + Default + 19000 + 0 + 1 + + Mono8 + + 0 + 0 + 0 + 0 + + + + + + FrameEvent + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SpinnakerApiNote + + + + + PT0S + PT0.1S + + + + + + + Item1 + + + + + + Item2 + Item1 + + + TriggeredCamerasStream + + + + TriggeredCamerasInitialized + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + + TriggeredCameraController + + + Cameras + + + Count + + + + + + + + + 0 + + + + + + + Source1 + + + + + + + + + + + 1 + + + + + PT0.1S + + + + TriggeredCamerasReady + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MonitoringCameras + + + + RigSchema + + + MonitoringCameraController + + + + Cameras + + + + + + InstantiateCamera + + + + Source1 + + + + 1 + + + + ThisCamera + + + ThisCamera + + + Value + + + Index + + + + + + + + + 0 + + + + + HarpTimestampSource + + + + + + + + + ThisCamera + + + Key + + + + + + + + + + + + + + + + + + + + + + + + + + + + Item2 + Item1 + + + MonitoringCamerasStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SessionSettings + + + + + + + Initialization + + + + StartExperiment + + + GlobalActivePatch + + + GlobalActiveSite + + + UpdaterEvents + + + SoftwareEvent + + + RuntimeLogging + + + EndExperiment + + + StartLogging + + + Annotations + + + GlobalPatchState + + + + GlobalPatchState + + + + SoftwareEvent + + + Position + + + + CurrentPosition + + + IsStopped + + + MaxPosition + + + StopVelocityThreshold + + + FilteredCurrentVelocity + + + + + + + + false + + + + + 1 + + + + StartExperiment + + + + 1 + + + + + true + + + + EndExperiment + + + + 1 + + + + + false + + + + + + + ExperimentState + + + StartExperiment + + + + TriggerHarpReadDump + + + + + + + + + + + + + + + + + + + + + + + + OperationControl + + + + RewardControl + + + + WaterValve + + + + ValveOpenTimeMs + + + SetValue + + + + Source1 + + + Write + + + + HarpBehaviorCommands + + + HarpBehaviorEvents + + + + + + + + + + 0 + + + + + PT0.01S + + + + + 0 + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + TriggerValve + + + TriggerValve + + + Write + + SupplyPort0 + + + + HarpBehaviorCommands + + + + + + + + + + + + + + + + 0 + true + + + + + 1 + + + + GiveReward + + + ForceGiveReward + + + GiveReward + + + HotGiveReward + + + GiveReward + + + ManualReward + + + + ForceGiveReward + + + + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + Value + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + RigSchema + + + Calibration.WaterValve + + + + + + RewardToTime + ((Item1 * 0.001) - Item2.Offset) / Item2.Slope + + + ToMilliseconds + + + + + 1000 + + + + + + + + + + 0 + + + + GreaterThan0 + + + + Source1 + + + + 0 + + + + + + + + + + + + ValveOpenTimeMs + + + GiveReward + + + + GiveReward + + + + SoftwareEvent + + + ForceGiveReward + + + + ForceGiveReward + + + + SoftwareEvent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FeedbackControl + + + + ChoiceFeedback + + + ChoiceFeedback + + + HotChoiceFeedback + + + ChoiceFeedback + + + + AudioTrigger + + + + ChoiceFeedback + + + + ChoiceFeedback + + + + SoftwareEvent + + + + + + + + + + + + + + Lickometer + + + + HarpLickometerEvents + + + + + + Value + + + + Channel0 + + + + + 0 + + + + + + + + + + IsLickOnset + + + + Source1 + + + Item1 + + + + + + + + + + + Item2.Seconds + + + LickEvent + + + HarpLickometerEvents + + + Write + + Active + true + false + Off + Off + Enabled + + + + + 1 + + + + HarpLickometerCommands + + + + + + + + + + + + + + + + + + + + + CameraControl + + + + HarpBehaviorEvents + + + + 1 + + + + TriggeredCamerasReady + + + + + + + 1 + + + + + PT2S + + + + + true + + + + CameraState + + + CameraState + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + + Source1 + + + + + + + + + + Write + + CameraOutput0 + + + + + + + HarpBehaviorCommands + + + StartLogging + + + + 1 + + + + + false + + + + CameraState + + + StartExperiment + + + + 1 + + + + + true + + + + CameraState + + + EndExperiment + + + + 1 + + + + + false + + + + CameraState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Thermistor/Pressure + + + + HarpSniffDetectorEvents + + + + + + RigSchema + + + HarpSniffDetector + + + + + + + ThermistorData + + + + + + + + + + + + + + AudioControl + + + + AudioDuration + + + + 1000 + + + + Write + + + + HarpBehaviorCommands + + + AudioFrequency + + + Write + + + + HarpBehaviorCommands + + + AudioTrigger + + + Write + + PwmDO2 + + + + HarpBehaviorCommands + + + InitialSettings + + + + HarpBehaviorEvents + + + Write + + 50 + + + + + 1 + + + + HarpBehaviorCommands + + + + 200 + + + + AudioDuration + + + + 9999 + + + + AudioFrequency + + + + + + + + + + + + + HarpBehaviorEvents + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + Visualizers + + + + + + + + true + + + + + 1 + + + + EnableExperimentUI + + + StartExperiment + + + + false + + + + EnableExperimentUI + + + CameraVisualizer + + + + TriggeredCamerasStream + + + + + + + TriggeredCamerasStream + + + + + + + MonitoringCamerasStream + + + + + + + CameraVisualizer + true + true + 3 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + TaskVisualizer + + + + OnlineLabels + + + + QCDiagnosis + + + Heartbeat + + + Harp: {0} + it + + + + + + + + false + true + + true + + + + + + QCDiagnosis + + + TotalReward + + + WaterConsumed: {0} + it + + + + + + + + false + true + + true + + + + + + QCDiagnosis + + + SecondsSinceChoice + + + TSinceChoice: {0:mm\:ss} + it + + + + + + + + false + true + + true + + + + + + Labels + true + true + 1 + 3 + + + + + + + + + + + + TimeStep.ElapsedRealTime + + + + TimeSpan.FromSeconds(it) + + + StartExperiment + + + + + + it.ToString("hh\:mm\:ss") + + + + + + + + ElapsedTime + false + true + + + + + + + TextLabels + true + true + Consolas, 16pt + 2 + 1 + + + + + + + QC + + + + HarpWhiteRabbitHeartbeat + + + SessionAccumulatedReward + + + + HotChoiceFeedback + + + + + + AccumulateTime + + + + + + + TimeStep.ElapsedRealTime + + + + + + + + + + + + + + + + + + + + + + + + + Item1.Seconds,Item2 + + + new( +Item1 as Heartbeat, +Item2.Item1 as TotalReward, +Item2.Item2 as SecondsSinceChoice) + + + + + 0 + + + + GiveReward + + + ForceGiveReward + + + + + + HasValue + + + + Source1 + + + HasValue + + + + + + + + + + + Value + + + + + + + SessionAccumulatedReward + + + + + + + + + + + + + + + + + + + + + + + + + + + + QCDiagnosis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Velocity + + + + FilteredCurrentVelocity + + + + + + StopVelocityThreshold + + + + + + Item1.Item1,Item2 + None + 2 + + 2000 + + + + + + + + + + + + + + + + + + + Thermistor + + + + ThermistorData + + + Seconds + Value + None + 2 + + 2000 + + + + + + + + + + + + + + + + true + true + 2 + 1 + + + + + + + + + Ethogram + + + + GlobalActiveSite + + + GlobalActivePatch + + + StateIndex + + + + + + + ##PatchVirtualSite + + + + SoftwareEvent + + + GiveReward + + + + Source1 + + + Name + + + + + + + GiveReward + + + + + + + + + + + + + + Gt0 + + + + Source1 + + + Data + + + + + + it.HasValue and it.Value>0 + + + + + + + + + + + + + SoftwareEvent + + + ChoiceFeedback + + + + Source1 + + + Name + + + + + + + ChoiceFeedback + + + + + + + + + + + + + + LickEvent + + + + ##Lick + + + + + PT0S + PT0.1S + + + + + ##UpdateTick + + + + + + + HarpTimestampSource + + + + + + + + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GlobalPatchState + + + + + + + SoftwareEvent + + + + + + true + true + 2 + 1 + + + + + + + + + DataVisualization + true + true + 1 + 4 + + + + + + + + + SubjectLabel + + + + + CALIBRATION + + + + + + + + + true + true + Microsoft Sans Serif, 20.25pt + + + + + + + + + + + + + + DataVisualization + true + true + 1 + 2 + + + + Percent + 0.94 + + + Percent + 0.06 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ValveGui + + + + true + true + true + true + false + + + + + + RunCalibration + true + true + RunCalibration + + + RunCalibration + + + + + + + false + + + + + 1 + + + + ValveFlushState + + + + + + + + + Source1 + + + + + + + + + + + Close Valves + + + + + + + + Source1 + + + + + + + + + + + Open Valves + + + + + + + + + + + + FlushValves + true + true + Open Valves + false + + + ValveFlushState + + + + + + EnableExperimentUI + + + + + + + + ValveCalibration + true + true + 2 + 2 + + + + + + + + + + + RunCalibration + + + + 1 + + + + + + + + + LoopValve + + + + + + + + PT0.5S + + + + + + + + 100 + + + + ValveOpenTimeMs + + + + TriggerValve + + + + + + + 200 + + + + + Q + Shift + + + + + + + + + + Index + + + + + + + + + + + + + + + + + + + + + + + + + ValveFlushState + + + Flush + + + + Source1 + + + + + + Source1 + + + + + + + + + + + 200 + + + + ValveOpenTimeMs + + + + TriggerValve + + + + PT0.2S + + + + + 300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HwShortcuts + + + + EnableExperimentUI + + + + + + + + TriggerAudio + true + true + TriggerAudio + + + + + + Source1 + + + + AudioTrigger + + + + + + + + + + + + + + + ForceReward + true + true + ForceReward + + + + + + Source1 + + + + 3 + + + + + 1 + + + + + + + Item2 + + + ForceGiveReward + + + + + + + + + + + + + + + + + + HwShortcuts + true + true + Microsoft Sans Serif, 20pt + 5 + 5 + + + + + + + + + + + + + + + + + + + + + + + + VrForaging + true + true + Microsoft Sans Serif, 12pt + + + + VrForaging + true + true + 1 + 2 + + + + Percent + 0.4 + + + Percent + 0.6 + + + + + + VrForaging + true + + + 640 + 480 + + Maximized + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main.bonsai b/src/main.bonsai index 61bc7f8d..2027f3ac 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -3,35 +3,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="clr-namespace:AindVrForagingDataSchema;assembly=Extensions" xmlns:rx="clr-namespace:Bonsai.Reactive;assembly=Bonsai.Core" - xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" - xmlns:res="clr-namespace:Bonsai.Resources;assembly=Bonsai.System" + xmlns:num="clr-namespace:Bonsai.Numerics;assembly=Bonsai.Numerics" + xmlns:p2="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" xmlns:scr="clr-namespace:Bonsai.Scripting.Expressions;assembly=Bonsai.Scripting.Expressions" - xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" - xmlns:p2="clr-namespace:AllenNeuralDynamics.WhiteRabbit;assembly=AllenNeuralDynamics.WhiteRabbit" - xmlns:p3="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" - xmlns:beh="clr-namespace:Harp.Behavior;assembly=Harp.Behavior" + xmlns:p3="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" + xmlns:p4="clr-namespace:System.Reactive;assembly=System.Reactive.Core" + xmlns:p5="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:cv="clr-namespace:Bonsai.Vision;assembly=Bonsai.Vision" - xmlns:p4="clr-namespace:OpenCV.Net;assembly=OpenCV.Net" - xmlns:p5="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:p6="clr-namespace:Bonsai.Numerics.Distributions;assembly=Bonsai.Numerics" - xmlns:p7="clr-namespace:AllenNeuralDynamics.VersionControl;assembly=AllenNeuralDynamics.VersionControl" - xmlns:p8="clr-namespace:System.Reactive;assembly=System.Reactive.Core" - xmlns:p9="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.DataTypes;assembly=AllenNeuralDynamics.AindBehaviorServices" - xmlns:p10="clr-namespace:;assembly=Extensions" - xmlns:p11="clr-namespace:OpenTK;assembly=OpenTK" - 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.Treadmill;assembly=AllenNeuralDynamics.Treadmill" - xmlns:p15="clr-namespace:AllenNeuralDynamics.HarpUtils;assembly=AllenNeuralDynamics.HarpUtils" - 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:p6="clr-namespace:;assembly=Extensions" + xmlns:p7="clr-namespace:AllenNeuralDynamics.Core;assembly=AllenNeuralDynamics.Core" + xmlns:harp="clr-namespace:Bonsai.Harp;assembly=Bonsai.Harp" + xmlns:p8="clr-namespace:OpenTK;assembly=OpenTK" + xmlns:gl="clr-namespace:Bonsai.Shaders;assembly=Bonsai.Shaders" + xmlns:p9="clr-namespace:AllenNeuralDynamics.AindBehaviorServices.Distributions;assembly=AllenNeuralDynamics.AindBehaviorServices.Distributions" + xmlns:p10="clr-namespace:AllenNeuralDynamics.Treadmill;assembly=AllenNeuralDynamics.Treadmill" + xmlns:p11="clr-namespace:AllenNeuralDynamics.AindManipulator;assembly=AllenNeuralDynamics.AindManipulator" xmlns="https://bonsai-rx.org/2018/workflow"> @@ -53,7 +39,7 @@ RawSessionSchema - + @@ -116,4495 +102,356 @@ + - Hardware + SessionSettings - - ScreenConfiguration - - - - RigSchema - - - Screen - - - - - - - - - - - 1000 - 1000 - VrForaging - Off - false - Black - DepthBufferBit ColorBufferBit - false - - Resizable - Fullscreen - Second - 60 - 120 - - - - 8 - 8 - 8 - 8 - - 16 - 0 - 0 - - 0 - 0 - 0 - 0 - - 2 - false - - - - - - - - - - RigSchema - - - Screen.Calibration - - - LoadDisplayCalibration - - - - Source1 - - - calibration - - - calibration - - - Left - - - - calibration - - - Center - - - - calibration - - - Right - - - - - - - new( -Item1 as Left, -Item2 as Center, -Item3 as Right) - - - - - - - - - - - - - - - - - - - - - - 1 - - - - DisplayCalibration - - - RenderLoop - - - - FarClipHorizon - - - - - - - - - 0 - 0 - 0 - - 1E-05 - 1000 - - 0 - 0 - 0 - - - - 2 - 6 - - - - 1 - - - - - 1 - - - - WorldContrast - - - RigSchema - - - Screen - - - Contrast - - - WorldContrast - - - - - - - DisplayContrast - - - RigSchema - - - Screen - - - Brightness - - - DisplayBrightness - - - - - - - - - - - - - - - - - - - - - RigSchema - - - Screen.TextureAssetsDirectory - - - - - - - - Textures - *.jpg - - - - - - - - - - - - - - - - - - + + TaskLogicParameters + + + RngSeed - - PT2S + + - - HarpDevices - - - - HarpWhiteRabbitEvents - - - - Include - Event - - - - - - - Seconds - - - HarpTimestampSource - - - HarpWhiteRabbitEvents - - - - - - HarpWhiteRabbitHeartbeat - - - TriggerHarpReadDump - - - RigSchema - - - HarpClockGenerator.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpOlfactometer.PortName - - - - - - - - COM6 - TriggerHarpReadDump - true - - - RigSchema - - - HarpLickometer.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpTreadmill - - - PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - Manipulator - - - Calibration - - - Input - - - - None - - - - - - - RigSchema - - - Manipulator - - - PortName - - - - - - - - COMx - - - RigSchema - - - HarpSniffDetector.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpSniffDetector - - - - - - - RigSchema - - - HarpAnalogInput.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpAnalogInput - - - - - - - RigSchema - - - HarpEnvironmentSensor.PortName - - - - - - - - COMx - TriggerHarpReadDump - - - RigSchema - - - HarpEnvironmentSensor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cameras - - - - TriggeredCameras - - - - RigSchema - - - - 1 - - - - TriggeredCameraController - - - TriggeredCameraController - - - FrameRate.Value - - - CameraFrameRate - - - TriggeredCameraController - - - Cameras - - - CameraFrameRate - - - Write - - - - HarpBehaviorCommands - - - HarpBehaviorEvents - - - - Include - Event - - - - - - - Value - - - - FrameAcquired - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - - - Item2.Seconds - - - FrameEvent - - - TriggeredCameraController - - - Cameras - - - - - - InstantiateCamera - - - - Source1 - - - - 1 - - - - ThisCamera - - - - true - - - - TriggeredCamerasInitialized - - - - 1 - - - - ThisCamera - - - Value - - - - - - - - - - - - - - - ThisCamera - - - Value - - - RegionOfInterest - - - - - - - - RegionOfInterest - - 0 - 0 - 0 - 0 - - - - - - - - - - - Default - 19000 - 0 - 1 - - Mono8 - - 0 - 0 - 0 - 0 - - - - - - FrameEvent - - - - - - - - - ThisCamera - - - Key - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpinnakerApiNote - - - - - PT0S - PT0.1S - - - - - - - Item1 - - - - - - Item2 - Item1 - - - TriggeredCamerasStream - - - - TriggeredCamerasInitialized - - - - 1 - - - - - 0 - - - - - 1 - - - - - - - - TriggeredCameraController - - - Cameras - - - Count - - - - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - 1 - - - - - PT0.1S - - - - TriggeredCamerasReady - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MonitoringCameras - - - - RigSchema - - - MonitoringCameraController - - - - Cameras - - - - - - InstantiateCamera - - - - Source1 - - - - 1 - - - - ThisCamera - - - ThisCamera - - - Value - - - Index - - - - - - - - - 0 - - - - - HarpTimestampSource - - - - - - - - - ThisCamera - - - Key - - - - - - - - - - - - - - - - - - - - - - - - - - - - Item2 - Item1 - - - MonitoringCamerasStream - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SessionSettings - - - - TaskLogicParameters - - - RngSeed - - - - - - - - - 0 - 10 - - - - - - - - - - CheckNull - Item1.HasValue ? Item1.Value : Item2 - - - - 1 - - - - RngSeedValue - - - - - - - - - - - - - - 1 - - - - RngSeed - - - - ../. - - - - Repository - - - - - - - 0 - - - - - 1 - - - - SigmaZ - - - - - - - 1000 - - - - - 1 - - - - FarClipHorizon - - - - - - - - - - 20 - - - - - 1 - - - - DisposingTreshold - - - - - - - - PT0.1S - - - - - 1 - - - - RefreshEnvironmentRate - - - SubjectSchema - - - - - - - - - - - LoggingRootPath - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialization - - - - StartExperiment - - - GlobalActivePatch - - - GlobalActiveSite - - - UpdaterEvents - - - SoftwareEvent - - - RuntimeLogging - - - EndExperiment - - - StartLogging - - - Annotations - - - GlobalPatchState - - - - GlobalPatchState - - - - SoftwareEvent - - - Position - - - - CurrentPosition - - - IsStopped - - - MaxPosition - - - StopVelocityThreshold - - - FilteredCurrentVelocity - - - - - - - - false - - - - - 1 - - - - StartExperiment - - - - 1 - - - - - true - - - - EndExperiment - - - - 1 - - - - - false - - - - - - - ExperimentState - - - StartExperiment - - - - TriggerHarpReadDump - - - - - - - - - - - - - - - - - - - - - HardwareChecks - - - - ProtocolValidation - - - - Repository - - - - false - - - - - SubjectSchema - - - AllowDirtyRepo - - - - - - AllowDirty? - Item2 ? False : Item1 - - - - - - Source1 - - - - - - - - - - - Repository is not clean! Please discard all local changes. - - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - Source1 - - - - - - - - - - SampleFlow - - - - StartExperiment - - - - 1 - - - - HarpOlfactometerEvents - - - - - - Value - - - - - - - 950 - - - - - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - Source1 - - - Item1 - - - - - - - - - - - Item2 - - - Flow on Channel3 is lower than expected. Reading {0}. - it - - - - - - it - - - - Flow on Channel3 is lower than expected. - - - - CameraChecks - - - - TriggeredCamerasStream - - - CheckDroppedFrames - - - - Source1 - - - - 1 - - - - InputSequence - - - InputSequence - - - - - - Value.ChunkData - - - FrameID - - - - 1 - - - - - 1 - - - - - 0 - - - - - - - Source1 - - - - - - - - - - InputSequence - - - Key - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - Camera {0} dropped frame detected during pre-session! - it - - - - - - it - - - - Dropped frame detected during pre-session! - - - - StartExperiment - - - - - - TriggeredCameraController - - - Cameras - - - - - - CheckCameraSettings - - - - Source1 - - - - 1 - - - - ThisCamera - - - ThisCamera - - - Value.Exposure - - - TriggeredCameraController - - - FrameRate - - - Value - - - - - - ((1.0 / Item2) * 1000000) < double(Item1) + 1000 - - - - - - Source1 - - - - - - - - - - - 1 - - - - ThisCamera - - - Key - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Camera {0} exposure setting not compatible with requested frame rate! - it - - - - - - it - - - - - - - - TriggeredCameraController - - - FrameRate.HasValue - - - - - - - Source1 - - - - - - - - - - - TriggeredCameraControl must specify a valid FrameRate property! - - - - TriggeredCamerasStream - - - OnlineQC - - - - Source1 - - - - 1 - - - - InputSequence - - - InputSequence - - - - - - Value.ChunkData - - - Timestamp - - - - 1 - - - - - 1E-09 - - - - Seconds - - - - 1 - - - - - - - - - - - - - - - 0.0005 - - - - - - - Source1 - - - - - - - - - - - TaskPoolScheduler - - - - - - - - PT0S - PT10S - - - - - - - MakeUI - - - - InputSequence - - - Key - - - Camera {0} out-of-alignment qc was triggered. - it - - - - - - - - - - Warning - Exclamation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Treadmill - - - - HarpTreadmillEvents - - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - The treadmill current limit has been triggered. If this is a problem, please restart the session. - Treadmill limit trigger - Exclamation - - - - - - - - - - - - - StartExperiment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SubjectSchema - - - SkipHardwareValidation - - - - - - - Source1 - - - - - - - - - - - - - - PT2S - - - - - - - - - - - - - - - - - - EndExperiment - - - - PT1S - - - - - - - StartLogging - - - - - - - - - OperationControl - - - - OdorControl - - - - OlfactometerInitialConfiguration - - - - HarpOlfactometerEvents - - - - 1 - - - - Channel3Setting - - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate100 - - - - - - - - - - - - - - - - - - - - - - - - - - Write - - FlowRate1000 - - - - HarpOlfactometerCommands - - - Write - - Flowmeter DI0Trigger ChannelActualFlow - - - - HarpOlfactometerCommands - - - Write - - Enabled - - - - HarpOlfactometerCommands - - - - Channel3Setting - - - - TaskLogicParameters - - - OperationControl.OdorControl.UseChannel3AsCarrier - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - Channel3Range - FlowRate100 - - - - - - - - - - - - - - - - - - - - - - FlowRate1000 - - - - - - - Source1 - - - - - - - - - - HarpOlfactometerEvents - - - - 1 - - - - - - - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 - - - - SetOdorMix - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - SetOdorMix - - - - - - - - - - - - - - - - - - - - - - EndValveControl - - - - HarpOlfactometerEvents - - - - 1 - - - - - false - - - - OdorEndValveState - - - OdorEndValveState - - - OdorPath - - - - Source1 - - - - - - - - - - EndValvesState - EndValve0 - - - - CarrierPath - - - - Source1 - - - - - - - - - - EndValvesState - None - - - - - - Write - - - - HarpOlfactometerCommands - - - - - - - - - - - - - - - - - - - - WaitForMaxOpenTime - - - - OdorEndValveState - - - TaskLogicParameters - - - OperationControl.OdorControl.ValveMaxOpenTime - - - ToSeconds - TimeSpan.FromSeconds(it) - - - - - - - - PT5S - - - OdorEndValveState - - - - - - - - - - - - - - - - SetOdorMix - - - SetChannelsTargetFlow - - - - Source1 - - - Mix - - - Mix - - - ChannelsTargetFlow - - - HarpOlfactometerCommands - - - HarpOlfactometerEvents - - - - Include - Write - - - - Mix - - - ChannelsTargetFlow - - - Address - - - - - - - - Include - - - - - - - - PT0.01S - - - - - - - - - 1 - - - - Mix - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - - SetOdorValveState - - - - Source1 - - - Mix - - - Mix - - - OdorValveState - - - HarpOlfactometerCommands - - - HarpOlfactometerEvents - - - - Include - Write - - - - Mix - - - OdorValveState - - - Address - - - - - - - - Include - - - - - - - - PT0.01S - - - - - - - - - 1 - - - - Mix - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RewardControl - - - - WaterValve - - - - ValveOpenTimeMs - - - SetValue - - - - Source1 - - - Write - - - - HarpBehaviorCommands - - - HarpBehaviorEvents - - - - - - - - - - 0 - - - - - PT0.01S - - - - - 0 - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - TriggerValve - - - TriggerValve - - - Write - - SupplyPort0 - - - - HarpBehaviorCommands - - - - - - - - - - - - - - - - 0 - true - - - - - 1 - - - - GiveReward - - - ForceGiveReward - - - GiveReward - - - HotGiveReward - - - GiveReward - - - ManualReward - - - - ForceGiveReward - - - - - - HasValue - - - - Source1 - - - HasValue - - - - - - - - - - - Value - - - GreaterThan0 - - - - Source1 - - - - 0 - - - - - - - - - - - - RigSchema - - - Calibration.WaterValve - - - Output - - - - - - RewardToTime - ((Item1 * 0.001) - Item2.Offset) / Item2.Slope - - - ToMilliseconds - - - - - 1000 - - - - - - - - - - 0 - - - - GreaterThan0 - - - - Source1 - - - - 0 - - - - - - - - - - - - ValveOpenTimeMs - - - GiveReward - - - - GiveReward - - - - SoftwareEvent - - - ForceGiveReward - - - - ForceGiveReward - - - - SoftwareEvent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MovableSpoutControl - - - - Start with the spout at max distance - - - - - true - - - - - 1 - - - - SpoutAvailable - - - SpoutAvailable - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - - - IsEnabled - - - - Source1 - - - Item2 - - - - - - - - - - - Item1 - - - SpoutParkingPositions - - - - - - GetPosition - it.Item1 ? it.Item2.ResetPosition : it.Item2.RetractedPosition - - - MoveTo - - - InitialState - - - - 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) - - - SpoutParkingPositions - - - SpoutParkingPositions - - - - SpoutParkingPositions - - - - SoftwareEvent - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - SpoutAvailable - - - GiveReward - - - - false - - - - SpoutAvailable - - - Condition - - - - Source1 - - - - - - - - - - - true - - - - - - - DelayWithdraw - - - - Source1 - - - - 1 - - - - State - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - TimeToCollectAfterReward - - - FromSeconds - TimeSpan.FromSeconds(it) - - - - - - - - - PT0S - - - - State - - - - - - Item2 - - - - - - - - - - - - - - - - - - - - - - - IsWithdraw? - - - - Source1 - - - - - - - - - - - - SpoutAvailable - - - TaskLogicParameters - - - OperationControl.MovableSpoutControl - - - Enabled - - - - - - Source1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StartExperiment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FeedbackControl - - - - ChoiceFeedback - - - ChoiceFeedback - - - HotChoiceFeedback - - - ChoiceFeedback - - - - AudioTrigger - - - - ChoiceFeedback - - - - ChoiceFeedback - - - - SoftwareEvent - - - HarpBehaviorEvents - - - - 1 - - - - - true - - - - SpoutAvailable - - - - - - - - - - - - - - - - - Lickometer - - - - HarpLickometerEvents - - - - - - Value - - - - Channel0 - - - - - 0 - - - - - - - - - - IsLickOnset - - - - Source1 - - - Item1 - - - - - - - - - - - Item2.Seconds - - - LickEvent - - - HarpLickometerEvents - - - Write - - Active - true - false - Off - Off - Enabled - - - - - 1 - - - - HarpLickometerCommands - - - - - - - - - - - - - - - - - - - - - CameraControl - - - - HarpBehaviorEvents - - - - 1 - - - - TextureBank - - - TriggeredCamerasReady - - - - - - - 1 - - - - - PT2S - - - - - true - - - - CameraState - - - CameraState - - - - - - Source1 - - - - - - - - - - Write - - CameraOutput0 - - - - - - - - Source1 - - - - - - - - - - Write - - CameraOutput0 - - - - - - - HarpBehaviorCommands - - - StartLogging - - - - 1 - - - - - false - - - - CameraState - - - StartExperiment - - - - 1 - - - - - true - - - - CameraState - - - EndExperiment - - - - 1 - - - - - false - - - - CameraState - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Thermistor/Pressure - - - - HarpSniffDetectorEvents - - - - - - RigSchema - - - HarpSniffDetector - - - - - - - ThermistorData - - - - - - - - - - - - - - Treadmill - - - - StartLogging - - - ClearCurrentLimit - - - - - PT0S - PT0.05S - - - - - - - - 5 - - - - - - - ThrowOnRetryCount - - - - Source1 - - - - - - - Number of attempts ot clear the current limit state register has been exceeded. - - - - - - - - - - - - - Write - - 0 - - - - HarpTreadmillCommands - - - HarpTreadmillEvents - - - - Include - Write - - - - - - - - 0 - - - - - - - Source1 - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - 0 - - - - - 1 - - - - TreadmillFriction - - - HarpTreadmillEvents - - - - - - TreadmillSamplingRate - - - DetermineTreadmillScaling - - - - RigSchema - - - HarpTreadmill.Calibration - - - Output - - - WheelDiameter - - - Perimeter - it * Math.Pi - - - PulsesPerRevolution - - - - - - CentimetersPerTick - Item1 / Item2 - - - InvertDirection - - - - - - 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 - - - - - - - 0 - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Write - - - - SendMessage - - - - Source1 - - - - 1 - - - - HarpMessage - - - HarpTreadmillEvents - - - - - - HarpMessage - - - - - - - PT0.1S - PT0.1S - - - - HarpMessage - - - - - - Item2 - - - - - - HarpTreadmillCommands - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - EncoderSample - - - Value - - - InstantVelocity - - - TaskLogicParameters - - - OperationControl - - - PositionControl.FrequencyFilterCutoff - - - - - - - - TreadmillSamplingRate - - - - - - - - - 250 - 5 - 0 - 60 - LowPass - - - - Seconds - - - - - - FilteredCurrentVelocity - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 0 + 10 + - - AudioControl - - - - AudioDuration - - - - 1000 - - - - Write - - - - HarpBehaviorCommands - - - AudioFrequency - - - Write - - - - HarpBehaviorCommands - - - AudioTrigger - - - Write - - PwmDO2 - - - - HarpBehaviorCommands - - - InitialSettings - - - - HarpBehaviorEvents - - - Write - - 50 - - - - - 1 - - - - HarpBehaviorCommands - - - TaskLogicParameters - - - OperationControl.AudioControl - - - Duration - - - AudioDuration - - - TaskLogicParameters - - - OperationControl.AudioControl - - - Frequency - - - AudioFrequency - - - - - - - - - - - - - - + + + + + + + + CheckNull + Item1.HasValue ? Item1.Value : Item2 + + + + 1 + + + + RngSeedValue + + + + + + + + + + + + + + 1 + + + + RngSeed + + + + ../. + + + + Repository + + + + + + + 0 + + + + + 1 + + + + SigmaZ + + + + + + + 1000 + + + + + 1 + + + + FarClipHorizon + + + + + + + + + + 20 + + + + + 1 + + + + DisposingTreshold + + + + + + + + PT0.1S + + + + + 1 + + + + RefreshEnvironmentRate + + + SubjectSchema + + + + + + + + RigSchema + + + DataDirectory + + + + + + + + + + LoggingRootPath + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Initialization + + + + StartExperiment + + + GlobalActivePatch + + + GlobalActiveSite + + + UpdaterEvents + + + SoftwareEvent + + + RuntimeLogging + + + EndExperiment + + + StartLogging + + + Annotations + + + GlobalPatchState + + + + GlobalPatchState + + + + SoftwareEvent + + + Position + + + + CurrentPosition - - HarpBehaviorEvents + + IsStopped - - - 1 - + + MaxPosition - - + + StopVelocityThreshold + + + FilteredCurrentVelocity - - - - - - - - - - - - + + + + false + + + + + 1 + + + + StartExperiment + + + + 1 + + + + + true + + + + EndExperiment + + + + 1 + + + + + false + + + + + + + ExperimentState + + + StartExperiment + + + + TriggerHarpReadDump + - + + + + + + + + + + + + + + + + + + + EndExperiment + + + + PT1S + + + + + + + StartLogging + + + + + + + + TaskLogic @@ -4618,130 +465,7 @@ Item1 as Displacement, - - VariableUpdaters - - - - TaskLogicParameters - - - Updaters - - - - 1 - - - - VariableUpdaters - - - GiveReward - - - - true - - - - StopDurationOffset - 0 - - - StopDurationOffset - - - - UpdaterStopDurationOffset - - - - UpdaterEvents - - - GiveReward - - - - true - - - - TaskLogicParameters - - - OperationControl.PositionControl.VelocityThreshold - - - - - - - - StopVelocityThreshold - 0 - - - StopVelocityThreshold - - - - UpdaterStopVelocityThreshold - - - - UpdaterEvents - - - GiveReward - - - - true - - - - RewardDelayOffset - 0 - - - RewardDelayOffset - - - - UpdaterRewardDelayOffset - - - - UpdaterEvents - - - - - - - - - - - - - - - - - - - - - - - - - - - + PatchStateMachine @@ -4779,8 +503,8 @@ Item1 as Displacement, CurrentBlock - - Block + + Block @@ -4793,8 +517,8 @@ Item1 as Displacement, EnvironmentStatistics.TransitionMatrix - - true + + true @@ -4828,7 +552,7 @@ Item1 as Displacement, - + @@ -4907,8 +631,8 @@ Item1 as Displacement, ActivePatch - - ActivePatch + + ActivePatch @@ -4945,7 +669,10 @@ Item1 as Displacement, - + + + + Patch @@ -4983,7 +710,10 @@ Item1 as Displacement, - + + + + FirstPatchSite @@ -5067,7 +797,7 @@ Item1 as Displacement, - + @@ -5159,7 +889,7 @@ Item1 as Displacement, - + @@ -5249,7 +979,7 @@ Item1 as Displacement, - + @@ -5337,7 +1067,7 @@ Item1 as Displacement, - + @@ -5497,7 +1227,10 @@ Item1 as Displacement, - + + + + ActivePatch @@ -5512,7 +1245,10 @@ Item1 as Displacement, - + + + + WaitForSiteOutcome @@ -5779,7 +1515,10 @@ it.Item3 as SiteHasChoice) - + + + + WaitForSiteOutcome @@ -5939,7 +1678,7 @@ it.Item3 as SiteHasChoice) - + ActiveStateIndex @@ -6044,7 +1783,7 @@ it.Item3 as SiteHasChoice) StartCondition - + StartExperimentShortcut @@ -6111,16 +1850,63 @@ it.Item3 as SiteHasChoice) EndRoutine + + olfactometerChannelsCount + + + + + + + + + 0 + 0 + + + + + 0 + + + + + + + olfactometerChannelsCount + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetOdorFlow + + + + + + + + TaskLogicParameters + + + OperationControl.OdorControl.TargetTotalFlow + + + + + + - - true - 0 - 0 - 0 - NaN - true - 100 - 1000 + + 100 + 1000 + 3 @@ -6134,10 +1920,10 @@ it.Item3 as SiteHasChoice) OdorEndValveState - + Write - - 0 + + 0 @@ -6161,17 +1947,6 @@ it.Item3 as SiteHasChoice) Calibration - - Input - - - - None - - - - - AxisConfiguration @@ -6188,12 +1963,12 @@ it.Item3 as SiteHasChoice) Axis - + Y1 - + Y2 @@ -6302,9 +2077,6 @@ it.Item3 as SiteHasChoice) - - - @@ -6316,10 +2088,10 @@ it.Item3 as SiteHasChoice) 1 - + Write - - 0 + + 0 @@ -6339,17 +2111,30 @@ it.Item3 as SiteHasChoice) - - + + - - + + - + - + + + + + + + + + + + + + + diff --git a/src/test_deserialization.bonsai b/src/test_deserialization.bonsai index 228f1c1b..771d5e70 100644 --- a/src/test_deserialization.bonsai +++ b/src/test_deserialization.bonsai @@ -1,10 +1,8 @@  - @@ -27,7 +25,7 @@ RawSessionSchema - + @@ -40,8 +38,8 @@ RawRigSchema - - + + @@ -54,8 +52,8 @@ RawTaskLogicSchema - - + + @@ -91,19 +89,25 @@ SubjectSchema - + + None + TaskLogicSchema - + + None + RigSchema - + + None + diff --git a/tests/test_bonsai.py b/tests/test_bonsai.py index 7c743d35..502cd0c3 100644 --- a/tests/test_bonsai.py +++ b/tests/test_bonsai.py @@ -4,9 +4,9 @@ import unittest import warnings from pathlib import Path -from typing import Generic, List, Optional, TypeVar, Union +from typing import Generic, List, Optional, Type, TypeVar, Union -from aind_behavior_services.session import AindBehaviorSessionModel +from aind_behavior_services.session import Session from aind_behavior_services.utils import run_bonsai_process from pydantic import ValidationError @@ -17,7 +17,7 @@ from examples import rig, session, task_patch_foraging # 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]) +TModel = TypeVar("TModel", bound=Union[AindVrForagingRig, AindVrForagingTaskLogic, Session]) @unittest.skipUnless(platform.system() == "Windows", "Bonsai tests only run on Windows") @@ -28,7 +28,7 @@ def test_deserialization(self): task_patch_foraging.main("./local/{schema}.json") models_to_test = [ - TestModel(bonsai_property="SessionPath", json_root=JSON_ROOT, model=AindBehaviorSessionModel), + TestModel(bonsai_property="SessionPath", json_root=JSON_ROOT, model=Session), TestModel(bonsai_property="RigPath", json_root=JSON_ROOT, model=AindVrForagingRig), TestModel(bonsai_property="TaskLogicPath", json_root=JSON_ROOT, model=AindVrForagingTaskLogic), ] @@ -59,7 +59,7 @@ def test_deserialization(self): class TestModel(Generic[TModel]): - def __init__(self, bonsai_property: str, json_root: Path, model: TModel): + def __init__(self, bonsai_property: str, json_root: Path, model: Type[TModel]): self.bonsai_property: str = bonsai_property self.json_path: Path = json_root / f"{model.__name__}.json" if not os.path.exists(self.json_path): diff --git a/tests/test_task_logic.py b/tests/test_task_logic.py new file mode 100644 index 00000000..b03422da --- /dev/null +++ b/tests/test_task_logic.py @@ -0,0 +1,117 @@ +"""Tests for task_logic validation helpers.""" + +import unittest + +from pydantic import ValidationError + +from aind_behavior_vr_foraging.task_logic import ( + OdorSpecification, + VirtualSite, + _odor_mixture_from_odor_specification, +) + + +class TestOdorMixtureFromOdorSpecification(unittest.TestCase): + """Tests for _odor_mixture_from_odor_specification backwards-compatible validator.""" + + # --- New format: list passthrough --- + + def test_list_is_returned_as_is(self): + value = [0.5, 0.0, 0.0] + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0.5, 0.0, 0.0]) + + def test_empty_list_is_returned_as_is(self): + value = [] + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, []) + + def test_list_with_multiple_values_is_returned_as_is(self): + value = [0.1, 0.2, 0.7] + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0.1, 0.2, 0.7]) + + # --- Old format: OdorSpecification dict --- + + def test_odor_spec_dict_index_0(self): + value = {"index": 0, "concentration": 0.5} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0.5, 0, 0]) + + def test_odor_spec_dict_index_1(self): + value = {"index": 1, "concentration": 0.75} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0, 0.75, 0]) + + def test_odor_spec_dict_index_2(self): + value = {"index": 2, "concentration": 0.3} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0, 0, 0.3]) + + def test_odor_spec_dict_default_concentration(self): + """OdorSpecification.concentration defaults to 1.""" + value = {"index": 1} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, [0, 1, 0]) + + # --- Old format: OdorSpecification model instance --- + + def test_odor_spec_instance_index_0(self): + spec = OdorSpecification(index=0, concentration=0.6) + result = _odor_mixture_from_odor_specification(spec) + self.assertEqual(result, [0.6, 0, 0]) + + def test_odor_spec_instance_index_2(self): + spec = OdorSpecification(index=2, concentration=1.0) + result = _odor_mixture_from_odor_specification(spec) + self.assertEqual(result, [0, 0, 1.0]) + + # --- Invalid input passes through (downstream validation will reject it) --- + + def test_invalid_value_passes_through(self): + """Non-list, non-OdorSpecification values pass through for downstream validation.""" + value = "not_valid" + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, "not_valid") + + def test_invalid_dict_passes_through(self): + """Dicts that fail OdorSpecification validation pass through unchanged.""" + value = {"unknown_field": 99} + result = _odor_mixture_from_odor_specification(value) + self.assertEqual(result, value) + + +class TestOdorMixtureBackwardsCompatibilityViaModel(unittest.TestCase): + """Integration tests: validates backwards-compat through VirtualSite.odor_specification.""" + + def test_virtual_site_accepts_new_format_list(self): + site = VirtualSite(odor_specification=[0.5, 0.0, 0.0]) + self.assertEqual(site.odor_specification, [0.5, 0.0, 0.0]) + + def test_virtual_site_accepts_old_format_odor_spec_dict(self): + site = VirtualSite(odor_specification={"index": 0, "concentration": 0.5}) + self.assertEqual(site.odor_specification, [0.5, 0, 0]) + + def test_virtual_site_accepts_old_format_odor_spec_instance(self): + spec = OdorSpecification(index=1, concentration=0.8) + site = VirtualSite(odor_specification=spec) + self.assertEqual(site.odor_specification, [0, 0.8, 0]) + + def test_virtual_site_round_trip_from_json(self): + """Old-schema JSON with OdorSpecification fields deserializes correctly.""" + json_data = '{"odor_specification": {"index": 2, "concentration": 0.4}}' + site = VirtualSite.model_validate_json(json_data) + self.assertEqual(site.odor_specification, [0, 0, 0.4]) + + def test_virtual_site_rejects_invalid_odor_mixture(self): + """A list with negative values violates NonNegativeFloat constraint.""" + with self.assertRaises(ValidationError): + VirtualSite(odor_specification=[-0.1, 0.0, 0.0]) + + def test_virtual_site_none_odor_specification(self): + site = VirtualSite(odor_specification=None) + self.assertIsNone(site.odor_specification) + + +if __name__ == "__main__": + unittest.main() diff --git a/uv.lock b/uv.lock index 7f54b476..6f92fe2b 100644 --- a/uv.lock +++ b/uv.lock @@ -2,15 +2,15 @@ version = 1 revision = 3 requires-python = ">=3.11" resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'darwin'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'darwin'", - "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux')", - "(python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version < '3.12' and sys_platform == 'darwin'", - "python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.12' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] [[package]] @@ -27,21 +27,21 @@ wheels = [ [[package]] name = "aind-behavior-curriculum" -version = "0.0.37" +version = "0.0.38" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/ac/cb5073f94c6b41b88c6e91d8bf41f7c140d659a0eb1191bc0a91cace60db/aind_behavior_curriculum-0.0.37.tar.gz", hash = "sha256:a6d8fd58b4d172655bc445eefefe8ba6a7966f2b4303afe138dce3c07ec45a13", size = 139105, upload-time = "2025-12-05T22:51:07.253Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/ad/812f8cd33857366d7b1da81443ed60777992e591438c7104ad9fe0d4ac9f/aind_behavior_curriculum-0.0.38.tar.gz", hash = "sha256:11cce6a455ee3a2c0464e5f0ff170c44f1f9caf50cd3f1bf9bd9df7a41248e0d", size = 139193, upload-time = "2026-03-09T10:56:32.906Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/83/c51f680b86136dca811816746568de0feadbbe03d27a3213500a744ff047/aind_behavior_curriculum-0.0.37-py3-none-any.whl", hash = "sha256:349e973d52a450523b03a4b73b8371f72c80e9d43702eb62005f250e51663ca7", size = 48014, upload-time = "2025-12-05T22:51:06.351Z" }, + { url = "https://files.pythonhosted.org/packages/74/36/53daf76d7a3a27245fdee89e7900bbb13b9db0327af22d5f3e10c3273720/aind_behavior_curriculum-0.0.38-py3-none-any.whl", hash = "sha256:ec77803fc0cad1c9f430bad3f1d2404dd324ce24ee7970b8d8337de2d6ad2d3c", size = 48048, upload-time = "2026-03-09T10:56:31.299Z" }, ] [[package]] name = "aind-behavior-services" -version = "0.12.5" +version = "0.13.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-curriculum" }, @@ -50,14 +50,14 @@ dependencies = [ { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/01/6c71f219f5078d7ec3b0507724c2b63ec0af3c8571024053daa469d32e77/aind_behavior_services-0.12.5.tar.gz", hash = "sha256:ebcb1f56852265b988a777b22eeb1a9e4952c4cc7328b0e8c749844593372ccd", size = 27423, upload-time = "2025-11-06T19:06:26.875Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/ed/ccf529e8e53a3a22f956cb30a36e53c127b3aeb9ff31f63438d458696d4e/aind_behavior_services-0.13.6.tar.gz", hash = "sha256:aa37ae991e07c454a0c4fbc8b977f22ae81dd04f2a8acabeb13d587b187b6494", size = 29469, upload-time = "2026-03-31T15:46:30.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/3c/3d28d25645df3502f1a708483623e3a225c1f195adf2cef5e1727a7cf8b9/aind_behavior_services-0.12.5-py3-none-any.whl", hash = "sha256:fd6d3b60d07fd5bc31ecade227c68f97122e9591e78919098e06fe72b6e1d679", size = 38243, upload-time = "2025-11-06T19:06:25.67Z" }, + { url = "https://files.pythonhosted.org/packages/71/26/5645935312184f8d1bf3982f2d114247c43c461577caa49a16099f3679ee/aind_behavior_services-0.13.6-py3-none-any.whl", hash = "sha256:c0d28959a39c152d9ddbf290b3b3c87b8ad6fa1d5044d81d3507c6a167e45e26", size = 39516, upload-time = "2026-03-31T15:46:29.809Z" }, ] [[package]] name = "aind-behavior-vr-foraging" -version = "0.6.5" +version = "0.7.0rc0" source = { editable = "." } dependencies = [ { name = "aind-behavior-services" }, @@ -71,13 +71,14 @@ data = [ launcher = [ { name = "aind-clabe", extra = ["aind-services"] }, { name = "aind-data-schema" }, - { name = "aind-watchdog-service" }, { name = "contraqctor" }, ] [package.dev-dependencies] dev = [ { name = "aind-behavior-vr-foraging", extra = ["data", "launcher"] }, + { name = "aind-data-schema" }, + { name = "aind-data-schema-models" }, { name = "codespell" }, { name = "ruff" }, ] @@ -86,18 +87,18 @@ docs = [ { name = "autodoc-pydantic", extra = ["erdantic"] }, { name = "furo" }, { name = "myst-parser" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-jinja" }, { name = "sphinx-jsonschema" }, ] [package.metadata] requires-dist = [ - { name = "aind-behavior-services", specifier = ">=0.12,<0.13" }, + { name = "aind-behavior-services", specifier = ">=0.13.6" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.9.1" }, - { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.2" }, - { name = "aind-watchdog-service", marker = "extra == 'launcher'", specifier = "==0.1.6.dev8" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.10" }, + { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2.6" }, { name = "contraqctor", marker = "extra == 'data'", specifier = ">=0.5.3,<0.6.0" }, { name = "pydantic-settings" }, ] @@ -107,6 +108,8 @@ provides-extras = ["data", "launcher"] dev = [ { name = "aind-behavior-vr-foraging", extras = ["data"] }, { name = "aind-behavior-vr-foraging", extras = ["launcher"] }, + { name = "aind-data-schema" }, + { name = "aind-data-schema-models" }, { name = "codespell" }, { name = "ruff" }, ] @@ -122,7 +125,7 @@ docs = [ [[package]] name = "aind-clabe" -version = "0.9.1" +version = "0.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, @@ -134,9 +137,9 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/ab/7f27c98f4f2bf7062548b4d076ae2ec9d00f7e77640a1573f7a896c44835/aind_clabe-0.9.1.tar.gz", hash = "sha256:c6ae4fb781e5b27af044ffcbd413d7c5532e3a272595b74266ab280d86a90217", size = 66521, upload-time = "2025-12-11T23:04:33.544Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/e1/adad7bfdaa645adedcc675b42e21bb79d91bf04a41fe8ca5f639f10bc05a/aind_clabe-0.10.0.tar.gz", hash = "sha256:0d4331c25c1842b07fbabbb9a9724e393ff2eb7f3ee91ca30fab7af12993fc0b", size = 70824, upload-time = "2026-01-29T17:41:10.852Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/87/95a2e9d73c7421bdf37c4d67aa0ebd66d455a6d81cb63acc70053334b162/aind_clabe-0.9.1-py3-none-any.whl", hash = "sha256:d7197635c842acafaf83ad4a6eb686a387a85c9ee51d96e2c200857dc635f95d", size = 88869, upload-time = "2025-12-11T23:04:32.451Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8a/4389a0ef7e8958a5a8001ef5f7f00ea121ad0feda92571c0947e85a99d58/aind_clabe-0.10.0-py3-none-any.whl", hash = "sha256:dabe20924c236303613a31c4166579f838441060958029e8dca530aa2d3056ad", size = 94256, upload-time = "2026-01-29T17:41:12.205Z" }, ] [package.optional-dependencies] @@ -156,35 +159,35 @@ aind-services = [ [[package]] name = "aind-data-schema" -version = "2.2.0" +version = "2.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, - { name = "semver" }, + { name = "pydantic-extra-types" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/1e/9e17fb42209ce92a95c4b3e5cafc399fc742255261fc21ddcc3195083d66/aind_data_schema-2.2.0.tar.gz", hash = "sha256:26e749d9b227378cd001dc4b1eff0f1cd0c626147484ddf89cdf18ed7c0c110c", size = 865576, upload-time = "2025-11-25T22:34:47.543Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/04/fb661b20352d9768f1a777f5a26a4948ebeb40b49c6d0ddbe2004351aa97/aind_data_schema-2.6.0.tar.gz", hash = "sha256:921bf9e45a4d9671f883a79219119841de3d907928568c0f6f610d029ab2babf", size = 901339, upload-time = "2026-03-09T18:25:36.958Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/e5/904b07d0d0dbac1900026d7cc53d63f280abe495f856c2d5251706c0ff21/aind_data_schema-2.2.0-py3-none-any.whl", hash = "sha256:1416a3c527651078a93251160cfe7d6a0b5cc6f52dbbdc799b19b378f1243138", size = 87890, upload-time = "2025-11-25T22:34:46.171Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/905924fa2483bb4bcc08218cc43119a790a859e695a1c28253711b11ec0d/aind_data_schema-2.6.0-py3-none-any.whl", hash = "sha256:dfc868930c9e2ee2fe8ca40ef3dc2d0502db59e44bd76c577fdecde77d73ac48", size = 92081, upload-time = "2026-03-09T18:25:35.332Z" }, ] [[package]] name = "aind-data-schema-models" -version = "4.6.2" +version = "5.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-resources" }, { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b6/c2/7c18782963b33c22e4e05c17e143c38d6d3c8d44fd56c0395141b453ea17/aind_data_schema_models-4.6.2.tar.gz", hash = "sha256:8b3b6bfbfe985b0d1d329f04a57c6d2db9fe18acb5b43e162a3db24dc6df0d7c", size = 338337, upload-time = "2025-12-05T18:45:03.06Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/6e/f98fde74e466b736c46e5f71bf28e4dad130798d6048902acb8ac44fae60/aind_data_schema_models-5.4.2.tar.gz", hash = "sha256:e8a1a3fca2a13fb909f7c7915d2f03faf83b2c5e6567ac7721fe1f8f29482571", size = 341115, upload-time = "2026-03-26T01:29:56.322Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/b2/c904fc2a5a27d7320eeffbdd6b1371cff46fb7cf9d531634d363863bc209/aind_data_schema_models-4.6.2-py3-none-any.whl", hash = "sha256:13d0f60dba66adb5aa296dca3baea0ee9cbb38df00b77412f5c7d924c76efa95", size = 307108, upload-time = "2025-12-05T18:45:01.729Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/0ec99d2b17bc128908524bcf37c2df6b39134717d3c18fa65ad656bcb91e/aind_data_schema_models-5.4.2-py3-none-any.whl", hash = "sha256:4c11c390d993e48ba6308f5dfc7a426344f8436cf7d80f1c08641b040ad69b1e", size = 309923, upload-time = "2026-03-26T01:29:55.064Z" }, ] [[package]] name = "aind-data-transfer-service" -version = "1.23.0" +version = "2.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, @@ -192,22 +195,22 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/8e/903f431572c7fe7c98c170fd928110a2212f496274050daa01815bd01fc1/aind_data_transfer_service-1.23.0.tar.gz", hash = "sha256:eb462c642ac9a05576f9f8057a010012afd252e040feef688559a3646982f603", size = 38579, upload-time = "2025-12-09T00:25:50.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/51/e183dd1167b58fadf4f439b1147593176ba3d155da89ecfa83e609d39f1b/aind_data_transfer_service-2.0.3.tar.gz", hash = "sha256:fee976aea5dc68943b8815398190eb9f7cc3a6fb208feadd047bd933a5014b6d", size = 37198, upload-time = "2026-03-23T23:51:33.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/9d/1d242e2d1fb2ecc198ab8000fc22ddf7ce29927a9b6b6ccdf02baf4a1bd3/aind_data_transfer_service-1.23.0-py3-none-any.whl", hash = "sha256:a77abb077970c26f196b8eeb4b70e984163679095a4c412889d25917791ed60e", size = 24009, upload-time = "2025-12-09T00:25:49.263Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bc/c180bff4ab1ac67aeec5206afe75cc0a785980d3f38ba7482daae36231c5/aind_data_transfer_service-2.0.3-py3-none-any.whl", hash = "sha256:4429048c1896dba2fb4688f6fc2ca6bbae5e4e1d645417417e9ad45fd3736bc6", size = 23147, upload-time = "2026-03-23T23:51:32.237Z" }, ] [[package]] name = "aind-watchdog-service" -version = "0.1.6.dev8" +version = "0.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-transfer-service" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/7a/133583e96793c98b46ed06e7e591b7364bdb96a557b5a647dee4294961c3/aind_watchdog_service-0.1.6.dev8.tar.gz", hash = "sha256:5636372fba8504ab3679678319183a39361c655593d3f6d5c919ca41ace7f8ab", size = 392177, upload-time = "2025-11-25T17:20:21.887Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/4a/d42d8bc518260b195c5702146af3c5cf4e391ddd61abfe85dc7d48c90eaf/aind_watchdog_service-0.1.6.tar.gz", hash = "sha256:1b1679e37696bf269e646cf943f2a8255f7aaaacc779de0cce61abc3570dc169", size = 390289, upload-time = "2026-01-22T01:54:30.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/cd/3607a1b5bfa8af2cc33f5b44a56c16337a09571d6ee29fbb61fef75d3cd7/aind_watchdog_service-0.1.6.dev8-py3-none-any.whl", hash = "sha256:8f15baf43a2ced64384075d7d3eb88a2a8f96460db020dbd38353a1ee4a2fb4c", size = 48580, upload-time = "2025-11-25T17:20:20.575Z" }, + { url = "https://files.pythonhosted.org/packages/29/1a/8bcc17159e4eef205f4463d2422a66ad685b31717b6416a2b40d60ec0177/aind_watchdog_service-0.1.6-py3-none-any.whl", hash = "sha256:69571b4e50719c6cec38d7d901cdffdcdca296039ebebce8971ef4aef849dee9", size = 47801, upload-time = "2026-01-22T01:54:28.827Z" }, ] [[package]] @@ -219,6 +222,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -278,7 +290,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001, upload-time = "2024-04-27T10:57:00.542Z" }, @@ -291,11 +304,11 @@ erdantic = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] @@ -313,11 +326,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.2.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] [[package]] @@ -392,75 +405,91 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, - { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, - { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, - { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, - { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, - { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, - { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, - { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, - { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, - { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, - { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, - { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, - { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, - { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, - { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, - { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, - { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, - { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, - { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, - { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, - { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, - { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, - { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, - { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, - { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, - { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, - { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, - { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, - { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, - { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, - { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, - { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, - { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, + { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, + { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, + { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, + { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, + { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, + { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, + { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, ] [[package]] @@ -477,11 +506,11 @@ wheels = [ [[package]] name = "codespell" -version = "2.4.1" +version = "2.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740, upload-time = "2025-01-28T18:52:39.411Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/9d/1d0903dff693160f893ca6abcabad545088e7a2ee0a6deae7c24e958be69/codespell-2.4.2.tar.gz", hash = "sha256:3c33be9ae34543807f088aeb4832dfad8cb2dae38da61cac0a7045dd376cfdf3", size = 352058, upload-time = "2026-03-05T18:10:42.936Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501, upload-time = "2025-01-28T18:52:37.057Z" }, + { url = "https://files.pythonhosted.org/packages/42/a1/52fa05533e95fe45bcc09bcf8a503874b1c08f221a4e35608017e0938f55/codespell-2.4.2-py3-none-any.whl", hash = "sha256:97e0c1060cf46bd1d5db89a936c98db8c2b804e1fdd4b5c645e82a1ec6b1f886", size = 353715, upload-time = "2026-03-05T18:10:41.398Z" }, ] [[package]] @@ -610,64 +639,61 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, - { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, - { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, - { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a4/ba/04b1bd4218cbc58dc90ce967106d51582371b898690f3ae0402876cc4f34/cryptography-46.0.6.tar.gz", hash = "sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759", size = 750542, upload-time = "2026-03-25T23:34:53.396Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/23/9285e15e3bc57325b0a72e592921983a701efc1ee8f91c06c5f0235d86d9/cryptography-46.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8", size = 7176401, upload-time = "2026-03-25T23:33:22.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/e61f8f13950ab6195b31913b42d39f0f9afc7d93f76710f299b5ec286ae6/cryptography-46.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30", size = 4275275, upload-time = "2026-03-25T23:33:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/19/69/732a736d12c2631e140be2348b4ad3d226302df63ef64d30dfdb8db7ad1c/cryptography-46.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a", size = 4425320, upload-time = "2026-03-25T23:33:25.703Z" }, + { url = "https://files.pythonhosted.org/packages/d4/12/123be7292674abf76b21ac1fc0e1af50661f0e5b8f0ec8285faac18eb99e/cryptography-46.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175", size = 4278082, upload-time = "2026-03-25T23:33:27.423Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ba/d5e27f8d68c24951b0a484924a84c7cdaed7502bac9f18601cd357f8b1d2/cryptography-46.0.6-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463", size = 4926514, upload-time = "2026-03-25T23:33:29.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/71/1ea5a7352ae516d5512d17babe7e1b87d9db5150b21f794b1377eac1edc0/cryptography-46.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97", size = 4457766, upload-time = "2026-03-25T23:33:30.834Z" }, + { url = "https://files.pythonhosted.org/packages/01/59/562be1e653accee4fdad92c7a2e88fced26b3fdfce144047519bbebc299e/cryptography-46.0.6-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c", size = 3986535, upload-time = "2026-03-25T23:33:33.02Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8b/b1ebfeb788bf4624d36e45ed2662b8bd43a05ff62157093c1539c1288a18/cryptography-46.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507", size = 4277618, upload-time = "2026-03-25T23:33:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/dd/52/a005f8eabdb28df57c20f84c44d397a755782d6ff6d455f05baa2785bd91/cryptography-46.0.6-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19", size = 4890802, upload-time = "2026-03-25T23:33:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4d/8e7d7245c79c617d08724e2efa397737715ca0ec830ecb3c91e547302555/cryptography-46.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738", size = 4457425, upload-time = "2026-03-25T23:33:38.904Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5c/f6c3596a1430cec6f949085f0e1a970638d76f81c3ea56d93d564d04c340/cryptography-46.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c", size = 4405530, upload-time = "2026-03-25T23:33:40.842Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c9/9f9cea13ee2dbde070424e0c4f621c091a91ffcc504ffea5e74f0e1daeff/cryptography-46.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f", size = 4667896, upload-time = "2026-03-25T23:33:42.781Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b5/1895bc0821226f129bc74d00eccfc6a5969e2028f8617c09790bf89c185e/cryptography-46.0.6-cp311-abi3-win32.whl", hash = "sha256:bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2", size = 3026348, upload-time = "2026-03-25T23:33:45.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f8/c9bcbf0d3e6ad288b9d9aa0b1dee04b063d19e8c4f871855a03ab3a297ab/cryptography-46.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124", size = 3483896, upload-time = "2026-03-25T23:33:46.649Z" }, + { url = "https://files.pythonhosted.org/packages/01/41/3a578f7fd5c70611c0aacba52cd13cb364a5dee895a5c1d467208a9380b0/cryptography-46.0.6-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275", size = 7117147, upload-time = "2026-03-25T23:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/887f35a6fca9dde90cad08e0de0c89263a8e59b2d2ff904fd9fcd8025b6f/cryptography-46.0.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4", size = 4266221, upload-time = "2026-03-25T23:33:49.874Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a8/0a90c4f0b0871e0e3d1ed126aed101328a8a57fd9fd17f00fb67e82a51ca/cryptography-46.0.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b", size = 4408952, upload-time = "2026-03-25T23:33:52.128Z" }, + { url = "https://files.pythonhosted.org/packages/16/0b/b239701eb946523e4e9f329336e4ff32b1247e109cbab32d1a7b61da8ed7/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707", size = 4270141, upload-time = "2026-03-25T23:33:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/976acdd4f0f30df7b25605f4b9d3d89295351665c2091d18224f7ad5cdbf/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361", size = 4904178, upload-time = "2026-03-25T23:33:55.725Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1b/bf0e01a88efd0e59679b69f42d4afd5bced8700bb5e80617b2d63a3741af/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b", size = 4441812, upload-time = "2026-03-25T23:33:57.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8b/11df86de2ea389c65aa1806f331cae145f2ed18011f30234cc10ca253de8/cryptography-46.0.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca", size = 3963923, upload-time = "2026-03-25T23:33:59.361Z" }, + { url = "https://files.pythonhosted.org/packages/91/e0/207fb177c3a9ef6a8108f234208c3e9e76a6aa8cf20d51932916bd43bda0/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013", size = 4269695, upload-time = "2026-03-25T23:34:00.909Z" }, + { url = "https://files.pythonhosted.org/packages/21/5e/19f3260ed1e95bced52ace7501fabcd266df67077eeb382b79c81729d2d3/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4", size = 4869785, upload-time = "2026-03-25T23:34:02.796Z" }, + { url = "https://files.pythonhosted.org/packages/10/38/cd7864d79aa1d92ef6f1a584281433419b955ad5a5ba8d1eb6c872165bcb/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a", size = 4441404, upload-time = "2026-03-25T23:34:04.35Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/4fe7a8d25fed74419f91835cf5829ade6408fd1963c9eae9c4bce390ecbb/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d", size = 4397549, upload-time = "2026-03-25T23:34:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a0/7d738944eac6513cd60a8da98b65951f4a3b279b93479a7e8926d9cd730b/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736", size = 4651874, upload-time = "2026-03-25T23:34:07.916Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f1/c2326781ca05208845efca38bf714f76939ae446cd492d7613808badedf1/cryptography-46.0.6-cp314-cp314t-win32.whl", hash = "sha256:97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed", size = 3001511, upload-time = "2026-03-25T23:34:09.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/57/fe4a23eb549ac9d903bd4698ffda13383808ef0876cc912bcb2838799ece/cryptography-46.0.6-cp314-cp314t-win_amd64.whl", hash = "sha256:c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4", size = 3471692, upload-time = "2026-03-25T23:34:11.613Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cc/f330e982852403da79008552de9906804568ae9230da8432f7496ce02b71/cryptography-46.0.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a", size = 7162776, upload-time = "2026-03-25T23:34:13.308Z" }, + { url = "https://files.pythonhosted.org/packages/49/b3/dc27efd8dcc4bff583b3f01d4a3943cd8b5821777a58b3a6a5f054d61b79/cryptography-46.0.6-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8", size = 4270529, upload-time = "2026-03-25T23:34:15.019Z" }, + { url = "https://files.pythonhosted.org/packages/e6/05/e8d0e6eb4f0d83365b3cb0e00eb3c484f7348db0266652ccd84632a3d58d/cryptography-46.0.6-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77", size = 4414827, upload-time = "2026-03-25T23:34:16.604Z" }, + { url = "https://files.pythonhosted.org/packages/2f/97/daba0f5d2dc6d855e2dcb70733c812558a7977a55dd4a6722756628c44d1/cryptography-46.0.6-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290", size = 4271265, upload-time = "2026-03-25T23:34:18.586Z" }, + { url = "https://files.pythonhosted.org/packages/89/06/fe1fce39a37ac452e58d04b43b0855261dac320a2ebf8f5260dd55b201a9/cryptography-46.0.6-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410", size = 4916800, upload-time = "2026-03-25T23:34:20.561Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8a/b14f3101fe9c3592603339eb5d94046c3ce5f7fc76d6512a2d40efd9724e/cryptography-46.0.6-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d", size = 4448771, upload-time = "2026-03-25T23:34:22.406Z" }, + { url = "https://files.pythonhosted.org/packages/01/b3/0796998056a66d1973fd52ee89dc1bb3b6581960a91ad4ac705f182d398f/cryptography-46.0.6-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70", size = 3978333, upload-time = "2026-03-25T23:34:24.281Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3d/db200af5a4ffd08918cd55c08399dc6c9c50b0bc72c00a3246e099d3a849/cryptography-46.0.6-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d", size = 4271069, upload-time = "2026-03-25T23:34:25.895Z" }, + { url = "https://files.pythonhosted.org/packages/d7/18/61acfd5b414309d74ee838be321c636fe71815436f53c9f0334bf19064fa/cryptography-46.0.6-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa", size = 4878358, upload-time = "2026-03-25T23:34:27.67Z" }, + { url = "https://files.pythonhosted.org/packages/8b/65/5bf43286d566f8171917cae23ac6add941654ccf085d739195a4eacf1674/cryptography-46.0.6-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58", size = 4448061, upload-time = "2026-03-25T23:34:29.375Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/7e49c0fa7205cf3597e525d156a6bce5b5c9de1fd7e8cb01120e459f205a/cryptography-46.0.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb", size = 4399103, upload-time = "2026-03-25T23:34:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/44/46/466269e833f1c4718d6cd496ffe20c56c9c8d013486ff66b4f69c302a68d/cryptography-46.0.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72", size = 4659255, upload-time = "2026-03-25T23:34:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/0a/09/ddc5f630cc32287d2c953fc5d32705e63ec73e37308e5120955316f53827/cryptography-46.0.6-cp38-abi3-win32.whl", hash = "sha256:7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c", size = 3010660, upload-time = "2026-03-25T23:34:35.418Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/ca4893968aeb2709aacfb57a30dec6fa2ab25b10fa9f064b8882ce33f599/cryptography-46.0.6-cp38-abi3-win_amd64.whl", hash = "sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f", size = 3471160, upload-time = "2026-03-25T23:34:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/2e/84/7ccff00ced5bac74b775ce0beb7d1be4e8637536b522b5df9b73ada42da2/cryptography-46.0.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead", size = 3475444, upload-time = "2026-03-25T23:34:38.944Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/4c926f50df7749f000f20eede0c896769509895e2648db5da0ed55db711d/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8", size = 4218227, upload-time = "2026-03-25T23:34:40.871Z" }, + { url = "https://files.pythonhosted.org/packages/c6/65/707be3ffbd5f786028665c3223e86e11c4cda86023adbc56bd72b1b6bab5/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0", size = 4381399, upload-time = "2026-03-25T23:34:42.609Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6d/73557ed0ef7d73d04d9aba745d2c8e95218213687ee5e76b7d236a5030fc/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b", size = 4217595, upload-time = "2026-03-25T23:34:44.205Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c5/e1594c4eec66a567c3ac4400008108a415808be2ce13dcb9a9045c92f1a0/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a", size = 4380912, upload-time = "2026-03-25T23:34:46.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/89/843b53614b47f97fe1abc13f9a86efa5ec9e275292c457af1d4a60dc80e0/cryptography-46.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6728c49e3b2c180ef26f8e9f0a883a2c585638db64cf265b49c9ba10652d430e", size = 3409955, upload-time = "2026-03-25T23:34:48.465Z" }, ] [[package]] @@ -690,11 +716,11 @@ wheels = [ [[package]] name = "docutils" -version = "0.21.2" +version = "0.22.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, ] [[package]] @@ -712,7 +738,7 @@ wheels = [ [[package]] name = "erdantic" -version = "1.2.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, @@ -723,74 +749,75 @@ dependencies = [ { name = "typer" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/17/5c9709349221b1a972b4470e735570eee3dd2e2ee0ed71f28fb0e8c0d79a/erdantic-1.2.0.tar.gz", hash = "sha256:165979caf26984055e476d0201b24cdf1c5f38b60a6f141e82f9352a40d12b65", size = 920914, upload-time = "2025-09-15T18:07:11.351Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/b3/d814074dc6076a97682dc8a62a3da672fd982a533cc1f29854b6a4433ef2/erdantic-1.2.1.tar.gz", hash = "sha256:9105fc51260ee58b531690d1ef87db81f849257e73e106cd8f2a7f8a26d8d9b0", size = 1152018, upload-time = "2026-02-15T23:56:00.294Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/ee/dc88399e2a872fd7ce5a192cfbcf8bd996574bb6c7470912c8c2fca20527/erdantic-1.2.0-py3-none-any.whl", hash = "sha256:7c67adcf22150b77a24609734c7efc676f71824f8f5662fd21450ec1cdbe0a0c", size = 34428, upload-time = "2025-09-15T18:07:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/84/39/c8982be2f72454ef135f247fd9c0fd800444d8e28767c9c6cb25e2df7c2e/erdantic-1.2.1-py3-none-any.whl", hash = "sha256:f548da3e9933e298f862eb33469ab375a372097ae289a4ca47a06ff69a1a6210", size = 34855, upload-time = "2026-02-15T23:55:58.536Z" }, ] [[package]] name = "fonttools" -version = "4.61.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" }, - { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" }, - { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" }, - { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" }, - { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, - { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, - { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, - { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, - { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, - { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, - { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, - { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, - { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, - { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, - { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, - { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, - { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, - { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, - { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, - { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, - { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, - { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, - { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7", size = 2871039, upload-time = "2026-03-13T13:52:33.127Z" }, + { url = "https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14", size = 2416346, upload-time = "2026-03-13T13:52:35.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/53/5276ceba7bff95da7793a07c5284e1da901cf00341ce5e2f3273056c0cca/fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7", size = 5100897, upload-time = "2026-03-13T13:52:38.102Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b", size = 5071078, upload-time = "2026-03-13T13:52:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/d378fca4c65ea1956fee6d90ace6e861776809cbbc5af22388a090c3c092/fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1", size = 5076908, upload-time = "2026-03-13T13:52:44.122Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d9/ae6a1d0693a4185a84605679c8a1f719a55df87b9c6e8e817bfdd9ef5936/fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416", size = 5202275, upload-time = "2026-03-13T13:52:46.591Z" }, + { url = "https://files.pythonhosted.org/packages/54/6c/af95d9c4efb15cabff22642b608342f2bd67137eea6107202d91b5b03184/fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53", size = 2293075, upload-time = "2026-03-13T13:52:48.711Z" }, + { url = "https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2", size = 2344593, upload-time = "2026-03-13T13:52:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, + { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, + { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, + { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, + { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, + { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, + { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, + { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, + { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, ] [[package]] name = "furo" -version = "2025.9.25" +version = "2025.12.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, { name = "beautifulsoup4" }, { name = "pygments" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/29/ff3b83a1ffce74676043ab3e7540d398e0b1ce7660917a00d7c4958b93da/furo-2025.9.25.tar.gz", hash = "sha256:3eac05582768fdbbc2bdfa1cdbcdd5d33cfc8b4bd2051729ff4e026a1d7e0a98", size = 1662007, upload-time = "2025-09-25T21:37:19.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/20/5f5ad4da6a5a27c80f2ed2ee9aee3f9e36c66e56e21c00fde467b2f8f88f/furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7", size = 1661473, upload-time = "2025-12-19T17:34:40.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/69/964b55f389c289e16ba2a5dfe587c3c462aac09e24123f09ddf703889584/furo-2025.9.25-py3-none-any.whl", hash = "sha256:2937f68e823b8e37b410c972c371bc2b1d88026709534927158e0cb3fac95afe", size = 340409, upload-time = "2025-09-25T21:37:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b2/50e9b292b5cac13e9e81272c7171301abc753a60460d21505b606e15cf21/furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f", size = 339262, upload-time = "2025-12-19T17:34:38.905Z" }, ] [[package]] @@ -807,14 +834,14 @@ wheels = [ [[package]] name = "gitpython" -version = "3.1.45" +version = "3.1.46" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/b5/59d16470a1f0dfe8c793f9ef56fd3826093fc52b3bd96d6b9d6c26c7e27b/gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f", size = 215371, upload-time = "2026-01-01T15:37:32.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, + { url = "https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058", size = 208620, upload-time = "2026-01-01T15:37:30.574Z" }, ] [[package]] @@ -841,11 +868,11 @@ wheels = [ [[package]] name = "imagesize" -version = "1.4.1" +version = "2.0.0" 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, upload-time = "2022-07-01T12:21:05.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, ] [[package]] @@ -871,101 +898,117 @@ wheels = [ [[package]] name = "jsonpointer" -version = "3.0.0" +version = "3.1.1" 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, upload-time = "2024-06-10T19:24:42.462Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, ] [[package]] name = "kiwisolver" -version = "1.4.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, - { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, - { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, - { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, - { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, - { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, - { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, - { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, - { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, - { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, - { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, - { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, - { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, - { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, - { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, - { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, - { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, - { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, - { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, - { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, - { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, - { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, - { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, - { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, - { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, - { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, - { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, - { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, - { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, - { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, - { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, - { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, - { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, - { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, - { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, - { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, - { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, - { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, - { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, - { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, - { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, - { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, ] [[package]] @@ -1084,14 +1127,14 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.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, upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } 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, upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] @@ -1269,21 +1312,21 @@ sdist = { url = "https://files.pythonhosted.org/packages/d0/a0/da7aaa5c87d155f2a [[package]] name = "msal" -version = "1.34.0" +version = "1.35.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "pyjwt", extra = ["crypto"], marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "requests", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/aa/5a646093ac218e4a329391d5a31e5092a89db7d2ef1637a90b82cd0b6f94/msal-1.35.1.tar.gz", hash = "sha256:70cac18ab80a053bff86219ba64cfe3da1f307c74b009e2da57ef040eb1b5656", size = 165658, upload-time = "2026-03-04T23:38:51.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/dc/18d48843499e278538890dc709e9ee3dea8375f8be8e82682851df1b48b5/msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1", size = 116987, upload-time = "2025-09-22T23:05:47.294Z" }, + { url = "https://files.pythonhosted.org/packages/96/86/16815fddf056ca998853c6dc525397edf0b43559bb4073a80d2bc7fe8009/msal-1.35.1-py3-none-any.whl", hash = "sha256:8f4e82f34b10c19e326ec69f44dc6b30171f2f7098f3720ea8a9f0c11832caa3", size = 119909, upload-time = "2026-03-04T23:38:50.452Z" }, ] [[package]] name = "myst-parser" -version = "4.0.1" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1291,259 +1334,265 @@ dependencies = [ { name = "markdown-it-py" }, { name = "mdit-py-plugins" }, { name = "pyyaml" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, ] [[package]] name = "numpy" -version = "2.3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, + { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, + { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, + { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, + { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, + { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, ] [[package]] name = "opencv-python" -version = "4.11.0.86" +version = "4.13.0.92" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322, upload-time = "2025-01-16T13:52:25.887Z" }, - { url = "https://files.pythonhosted.org/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197, upload-time = "2025-01-16T13:55:21.222Z" }, - { url = "https://files.pythonhosted.org/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439, upload-time = "2025-01-16T13:51:35.822Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597, upload-time = "2025-01-16T13:52:08.836Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337, upload-time = "2025-01-16T13:52:13.549Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044, upload-time = "2025-01-16T13:52:21.928Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6f/5a28fef4c4a382be06afe3938c64cc168223016fa520c5abaf37e8862aa5/opencv_python-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:caf60c071ec391ba51ed00a4a920f996d0b64e3e46068aac1f646b5de0326a19", size = 46247052, upload-time = "2026-02-05T07:01:25.046Z" }, + { url = "https://files.pythonhosted.org/packages/08/ac/6c98c44c650b8114a0fb901691351cfb3956d502e8e9b5cd27f4ee7fbf2f/opencv_python-4.13.0.92-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:5868a8c028a0b37561579bfb8ac1875babdc69546d236249fff296a8c010ccf9", size = 32568781, upload-time = "2026-02-05T07:01:41.379Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/82fed528b45173bf629fa44effb76dff8bc9f4eeaee759038362dfa60237/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bc2596e68f972ca452d80f444bc404e08807d021fbba40df26b61b18e01838a", size = 47685527, upload-time = "2026-02-05T06:59:11.24Z" }, + { url = "https://files.pythonhosted.org/packages/db/07/90b34a8e2cf9c50fe8ed25cac9011cde0676b4d9d9c973751ac7616223a2/opencv_python-4.13.0.92-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:402033cddf9d294693094de5ef532339f14ce821da3ad7df7c9f6e8316da32cf", size = 70460872, upload-time = "2026-02-05T06:59:19.162Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/7a9cc719b3eaf4377b9c2e3edeb7ed3a81de41f96421510c0a169ca3cfd4/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bccaabf9eb7f897ca61880ce2869dcd9b25b72129c28478e7f2a5e8dee945616", size = 46708208, upload-time = "2026-02-05T06:59:15.419Z" }, + { url = "https://files.pythonhosted.org/packages/fd/55/b3b49a1b97aabcfbbd6c7326df9cb0b6fa0c0aefa8e89d500939e04aa229/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:620d602b8f7d8b8dab5f4b99c6eb353e78d3fb8b0f53db1bd258bb1aa001c1d5", size = 72927042, upload-time = "2026-02-05T06:59:23.389Z" }, + { url = "https://files.pythonhosted.org/packages/fb/17/de5458312bcb07ddf434d7bfcb24bb52c59635ad58c6e7c751b48949b009/opencv_python-4.13.0.92-cp37-abi3-win32.whl", hash = "sha256:372fe164a3148ac1ca51e5f3ad0541a4a276452273f503441d718fab9c5e5f59", size = 30932638, upload-time = "2026-02-05T07:02:14.98Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a5/1be1516390333ff9be3a9cb648c9f33df79d5096e5884b5df71a588af463/opencv_python-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:423d934c9fafb91aad38edf26efb46da91ffbc05f3f59c4b0c72e699720706f5", size = 40212062, upload-time = "2026-02-05T07:02:12.724Z" }, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "pandas" -version = "2.3.3" +version = "3.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0", size = 10326926, upload-time = "2026-03-31T06:46:08.29Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c", size = 9926987, upload-time = "2026-03-31T06:46:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/52/77/9b1c2d6070b5dbe239a7bc889e21bfa58720793fb902d1e070695d87c6d0/pandas-3.0.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:339dda302bd8369dedeae979cb750e484d549b563c3f54f3922cb8ff4978c5eb", size = 10757067, upload-time = "2026-03-31T06:46:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76", size = 11258787, upload-time = "2026-03-31T06:46:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/90/e3/3f1126d43d3702ca8773871a81c9f15122a1f412342cc56284ffda5b1f70/pandas-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c934008c733b8bbea273ea308b73b3156f0181e5b72960790b09c18a2794fe1e", size = 11771616, upload-time = "2026-03-31T06:46:20.532Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cf/0f4e268e1f5062e44a6bda9f925806721cd4c95c2b808a4c82ebe914f96b/pandas-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:60a80bb4feacbef5e1447a3f82c33209c8b7e07f28d805cfd1fb951e5cb443aa", size = 12337623, upload-time = "2026-03-31T06:46:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df", size = 9897372, upload-time = "2026-03-31T06:46:26.703Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/781516b808a99ddf288143cec46b342b3016c3414d137da1fdc3290d8860/pandas-3.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f12b1a9e332c01e09510586f8ca9b108fd631fd656af82e452d7315ef6df5f9f", size = 9154922, upload-time = "2026-03-31T06:46:30.284Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921, upload-time = "2026-03-31T06:46:33.36Z" }, + { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127, upload-time = "2026-03-31T06:46:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577, upload-time = "2026-03-31T06:46:39.224Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030, upload-time = "2026-03-31T06:46:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468, upload-time = "2026-03-31T06:46:45.2Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381, upload-time = "2026-03-31T06:46:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993, upload-time = "2026-03-31T06:46:51.488Z" }, + { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118, upload-time = "2026-03-31T06:46:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, + { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, + { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, + { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, + { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, + { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, + { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, + { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, + { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, + { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, + { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, + { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, + { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, + { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, + { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, + { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" }, ] [[package]] name = "pillow" -version = "12.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, - { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, - { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, - { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, - { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, - { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, - { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, - { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, - { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, - { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, - { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, - { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, - { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, - { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, - { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, - { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, - { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, - { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, - { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, - { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, - { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, - { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, - { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, - { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, - { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, - { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, - { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, - { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, - { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, - { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, - { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, - { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, - { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, - { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, - { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, - { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, - { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, - { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, - { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, - { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, - { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, - { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, - { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, - { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, - { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, ] [[package]] @@ -1560,20 +1609,20 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.1" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, ] [[package]] name = "pycparser" -version = "2.23" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] @@ -1716,18 +1765,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] +[[package]] +name = "pydantic-extra-types" +version = "2.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/71/dba38ee2651f84f7842206adbd2233d8bbdb59fb85e9fa14232486a8c471/pydantic_extra_types-2.11.1.tar.gz", hash = "sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049", size = 172002, upload-time = "2026-03-16T08:08:03.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/c1/3226e6d7f5a4f736f38ac11a6fbb262d701889802595cdb0f53a885ac2e0/pydantic_extra_types-2.11.1-py3-none-any.whl", hash = "sha256:1722ea2bddae5628ace25f2aa685b69978ef533123e5638cfbddb999e0100ec1", size = 79526, upload-time = "2026-03-16T08:08:02.533Z" }, +] + [[package]] name = "pydantic-settings" -version = "2.12.0" +version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, + { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, ] [[package]] @@ -1746,11 +1808,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] @@ -1761,16 +1823,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/66/ca/823d5c74a73d6b8b0 [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] [package.optional-dependencies] crypto = [ - { name = "cryptography", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "cryptography" }, ] [[package]] @@ -1800,11 +1862,11 @@ wheels = [ [[package]] name = "pyparsing" -version = "3.2.5" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] @@ -1821,20 +1883,20 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.2.1" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] [[package]] name = "pytz" -version = "2025.2" +version = "2026.1.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, ] [[package]] @@ -1906,7 +1968,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.5" +version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1914,43 +1976,43 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, ] [[package]] name = "rich" -version = "14.2.0" +version = "14.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] [[package]] -name = "roman-numerals-py" -version = "3.1.0" +name = "roman-numerals" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, ] [[package]] name = "ruamel-yaml" -version = "0.18.16" +version = "0.18.17" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/c7/ee630b29e04a672ecfc9b63227c87fd7a37eb67c1bf30fe95376437f897c/ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a", size = 147269, upload-time = "2025-10-22T17:54:02.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/73/bb1bc2529f852e7bf64a2dec885e89ff9f5cc7bbf6c9340eed30ff2c69c5/ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba", size = 119858, upload-time = "2025-10-22T17:53:59.012Z" }, + { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, ] [[package]] @@ -2003,99 +2065,98 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/1b/ab712a9d5044435be8e9a2beb17cbfa4c241aa9b5e4413febac2a8b79ef2/ruff-0.14.9.tar.gz", hash = "sha256:35f85b25dd586381c0cc053f48826109384c81c00ad7ef1bd977bfcc28119d5b", size = 5809165, upload-time = "2025-12-11T21:39:47.381Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/1c/d1b1bba22cffec02351c78ab9ed4f7d7391876e12720298448b29b7229c1/ruff-0.14.9-py3-none-linux_armv6l.whl", hash = "sha256:f1ec5de1ce150ca6e43691f4a9ef5c04574ad9ca35c8b3b0e18877314aba7e75", size = 13576541, upload-time = "2025-12-11T21:39:14.806Z" }, - { url = "https://files.pythonhosted.org/packages/94/ab/ffe580e6ea1fca67f6337b0af59fc7e683344a43642d2d55d251ff83ceae/ruff-0.14.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ed9d7417a299fc6030b4f26333bf1117ed82a61ea91238558c0268c14e00d0c2", size = 13779363, upload-time = "2025-12-11T21:39:20.29Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f8/2be49047f929d6965401855461e697ab185e1a6a683d914c5c19c7962d9e/ruff-0.14.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d5dc3473c3f0e4a1008d0ef1d75cee24a48e254c8bed3a7afdd2b4392657ed2c", size = 12925292, upload-time = "2025-12-11T21:39:38.757Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e9/08840ff5127916bb989c86f18924fd568938b06f58b60e206176f327c0fe/ruff-0.14.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84bf7c698fc8f3cb8278830fb6b5a47f9bcc1ed8cb4f689b9dd02698fa840697", size = 13362894, upload-time = "2025-12-11T21:39:02.524Z" }, - { url = "https://files.pythonhosted.org/packages/31/1c/5b4e8e7750613ef43390bb58658eaf1d862c0cc3352d139cd718a2cea164/ruff-0.14.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa733093d1f9d88a5d98988d8834ef5d6f9828d03743bf5e338bf980a19fce27", size = 13311482, upload-time = "2025-12-11T21:39:17.51Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3a/459dce7a8cb35ba1ea3e9c88f19077667a7977234f3b5ab197fad240b404/ruff-0.14.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a1cfb04eda979b20c8c19550c8b5f498df64ff8da151283311ce3199e8b3648", size = 14016100, upload-time = "2025-12-11T21:39:41.948Z" }, - { url = "https://files.pythonhosted.org/packages/a6/31/f064f4ec32524f9956a0890fc6a944e5cf06c63c554e39957d208c0ffc45/ruff-0.14.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1e5cb521e5ccf0008bd74d5595a4580313844a42b9103b7388eca5a12c970743", size = 15477729, upload-time = "2025-12-11T21:39:23.279Z" }, - { url = "https://files.pythonhosted.org/packages/7a/6d/f364252aad36ccd443494bc5f02e41bf677f964b58902a17c0b16c53d890/ruff-0.14.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd429a8926be6bba4befa8cdcf3f4dd2591c413ea5066b1e99155ed245ae42bb", size = 15122386, upload-time = "2025-12-11T21:39:33.125Z" }, - { url = "https://files.pythonhosted.org/packages/20/02/e848787912d16209aba2799a4d5a1775660b6a3d0ab3944a4ccc13e64a02/ruff-0.14.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab208c1b7a492e37caeaf290b1378148f75e13c2225af5d44628b95fd7834273", size = 14497124, upload-time = "2025-12-11T21:38:59.33Z" }, - { url = "https://files.pythonhosted.org/packages/f3/51/0489a6a5595b7760b5dbac0dd82852b510326e7d88d51dbffcd2e07e3ff3/ruff-0.14.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72034534e5b11e8a593f517b2f2f2b273eb68a30978c6a2d40473ad0aaa4cb4a", size = 14195343, upload-time = "2025-12-11T21:39:44.866Z" }, - { url = "https://files.pythonhosted.org/packages/f6/53/3bb8d2fa73e4c2f80acc65213ee0830fa0c49c6479313f7a68a00f39e208/ruff-0.14.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:712ff04f44663f1b90a1195f51525836e3413c8a773574a7b7775554269c30ed", size = 14346425, upload-time = "2025-12-11T21:39:05.927Z" }, - { url = "https://files.pythonhosted.org/packages/ad/04/bdb1d0ab876372da3e983896481760867fc84f969c5c09d428e8f01b557f/ruff-0.14.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a111fee1db6f1d5d5810245295527cda1d367c5aa8f42e0fca9a78ede9b4498b", size = 13258768, upload-time = "2025-12-11T21:39:08.691Z" }, - { url = "https://files.pythonhosted.org/packages/40/d9/8bf8e1e41a311afd2abc8ad12be1b6c6c8b925506d9069b67bb5e9a04af3/ruff-0.14.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8769efc71558fecc25eb295ddec7d1030d41a51e9dcf127cbd63ec517f22d567", size = 13326939, upload-time = "2025-12-11T21:39:53.842Z" }, - { url = "https://files.pythonhosted.org/packages/f4/56/a213fa9edb6dd849f1cfbc236206ead10913693c72a67fb7ddc1833bf95d/ruff-0.14.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:347e3bf16197e8a2de17940cd75fd6491e25c0aa7edf7d61aa03f146a1aa885a", size = 13578888, upload-time = "2025-12-11T21:39:35.988Z" }, - { url = "https://files.pythonhosted.org/packages/33/09/6a4a67ffa4abae6bf44c972a4521337ffce9cbc7808faadede754ef7a79c/ruff-0.14.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7715d14e5bccf5b660f54516558aa94781d3eb0838f8e706fb60e3ff6eff03a8", size = 14314473, upload-time = "2025-12-11T21:39:50.78Z" }, - { url = "https://files.pythonhosted.org/packages/12/0d/15cc82da5d83f27a3c6b04f3a232d61bc8c50d38a6cd8da79228e5f8b8d6/ruff-0.14.9-py3-none-win32.whl", hash = "sha256:df0937f30aaabe83da172adaf8937003ff28172f59ca9f17883b4213783df197", size = 13202651, upload-time = "2025-12-11T21:39:26.628Z" }, - { url = "https://files.pythonhosted.org/packages/32/f7/c78b060388eefe0304d9d42e68fab8cffd049128ec466456cef9b8d4f06f/ruff-0.14.9-py3-none-win_amd64.whl", hash = "sha256:c0b53a10e61df15a42ed711ec0bda0c582039cf6c754c49c020084c55b5b0bc2", size = 14702079, upload-time = "2025-12-11T21:39:11.954Z" }, - { url = "https://files.pythonhosted.org/packages/26/09/7a9520315decd2334afa65ed258fed438f070e31f05a2e43dd480a5e5911/ruff-0.14.9-py3-none-win_arm64.whl", hash = "sha256:8e821c366517a074046d92f0e9213ed1c13dbc5b37a7fc20b07f79b64d62cc84", size = 13744730, upload-time = "2025-12-11T21:39:29.659Z" }, +version = "0.15.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" }, + { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" }, + { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" }, + { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" }, + { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" }, + { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" }, + { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" }, + { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" }, + { url = "https://files.pythonhosted.org/packages/37/e6/90b2b33419f59d0f2c4c8a48a4b74b460709a557e8e0064cf33ad894f983/ruff-0.15.8-py3-none-win32.whl", hash = "sha256:bc1f0a51254ba21767bfa9a8b5013ca8149dcf38092e6a9eb704d876de94dc34", size = 10571959, upload-time = "2026-03-26T18:39:36.117Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a2/ef467cb77099062317154c63f234b8a7baf7cb690b99af760c5b68b9ee7f/ruff-0.15.8-py3-none-win_amd64.whl", hash = "sha256:04f79eff02a72db209d47d665ba7ebcad609d8918a134f86cb13dd132159fc89", size = 11743893, upload-time = "2026-03-26T18:39:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/77be4fff062fa78d9b2a4dea85d14785dac5f1d0c1fb58ed52331f0ebe28/ruff-0.15.8-py3-none-win_arm64.whl", hash = "sha256:cf891fa8e3bb430c0e7fac93851a5978fc99c8fa2c053b57b118972866f8e5f2", size = 11048175, upload-time = "2026-03-26T18:40:01.06Z" }, ] [[package]] name = "scipy" -version = "1.16.3" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, - { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, - { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, - { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, - { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, - { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, - { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, - { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, - { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, - { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, - { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, - { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, - { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, - { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, - { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, - { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, - { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, - { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, - { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, - { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, - { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, - { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, - { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, - { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, - { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, - { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, - { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, - { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, - { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, - { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, - { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, - { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, - { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, - { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, - { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, - { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, - { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, - { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, - { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, - { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, - { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, - { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, - { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, ] [[package]] @@ -2127,11 +2188,11 @@ wheels = [ [[package]] name = "smmap" -version = "5.0.2" +version = "5.0.3" 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, upload-time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, ] [[package]] @@ -2168,39 +2229,80 @@ wheels = [ [[package]] name = "soupsieve" -version = "2.8" +version = "2.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] [[package]] name = "sphinx" -version = "8.2.3" +version = "9.0.4" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils" }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "roman-numerals-py" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, + { name = "alabaster", marker = "python_full_version < '3.12'" }, + { name = "babel", marker = "python_full_version < '3.12'" }, + { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, + { name = "docutils", marker = "python_full_version < '3.12'" }, + { name = "imagesize", marker = "python_full_version < '3.12'" }, + { name = "jinja2", marker = "python_full_version < '3.12'" }, + { name = "packaging", marker = "python_full_version < '3.12'" }, + { name = "pygments", marker = "python_full_version < '3.12'" }, + { name = "requests", marker = "python_full_version < '3.12'" }, + { name = "roman-numerals", marker = "python_full_version < '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "alabaster", marker = "python_full_version >= '3.12'" }, + { name = "babel", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", marker = "python_full_version >= '3.12'" }, + { name = "imagesize", marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "requests", marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, ] [[package]] @@ -2208,7 +2310,8 @@ name = "sphinx-basic-ng" version = "1.0.0b2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload-time = "2023-07-08T18:40:54.166Z" } wheels = [ @@ -2222,7 +2325,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "jinja2" }, - { name = "sphinx" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ea/90/7cf0e91aadcb5b3ff4796acbaf2c7887a55434df360914af9fc067c753c1/sphinx-jinja-2.0.2.tar.gz", hash = "sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718", size = 4587, upload-time = "2022-07-05T11:57:49.579Z" } wheels = [ @@ -2306,17 +2410,17 @@ wheels = [ [[package]] name = "typer" -version = "0.20.0" +version = "0.24.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "click" }, { name = "rich" }, { name = "shellingham" }, - { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/28/7c85c8032b91dbe79725b6f17d2fffc595dff06a35c7a30a37bef73a1ab4/typer-0.20.0.tar.gz", hash = "sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37", size = 106492, upload-time = "2025-10-20T17:03:49.445Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/64/7713ffe4b5983314e9d436a90d5bd4f63b6054e2aca783a3cfc44cb95bbf/typer-0.20.0-py3-none-any.whl", hash = "sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a", size = 47028, upload-time = "2025-10-20T17:03:47.617Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, ] [[package]] @@ -2342,29 +2446,29 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] name = "urllib3" -version = "2.6.2" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, ] [[package]]