diff --git a/examples/task_logic.py b/examples/task_logic.py index dc16f9d8..c298bfa8 100644 --- a/examples/task_logic.py +++ b/examples/task_logic.py @@ -2,13 +2,11 @@ from aind_behavior_curriculum import Stage, TrainerState -import aind_behavior_dynamic_foraging.task_logic as df_task_logic from aind_behavior_dynamic_foraging.task_logic import AindDynamicForagingTaskLogic, AindDynamicForagingTaskParameters task_logic = AindDynamicForagingTaskLogic( task_parameters=AindDynamicForagingTaskParameters( rng_seed=42, - reward_size=df_task_logic.RewardSize(right_value_volume=4.0, left_value_volume=4.0), ) ) diff --git a/schema/aind_behavior_dynamic_foraging.json b/schema/aind_behavior_dynamic_foraging.json index 044e9697..5a1258ea 100644 --- a/schema/aind_behavior_dynamic_foraging.json +++ b/schema/aind_behavior_dynamic_foraging.json @@ -199,14 +199,6 @@ "title": "aind_behavior_services package version", "type": "string" }, - "reward_size": { - "$ref": "#/$defs/RewardSize", - "default": { - "right_value_volume": 3.0, - "left_value_volume": 3.0 - }, - "description": "Parameters describing reward size." - }, "trial_generator": { "$ref": "#/$defs/TrialGeneratorSpec", "default": { @@ -440,6 +432,14 @@ "title": "Type", "type": "string" }, + "reward_size": { + "$ref": "#/$defs/RewardSize", + "default": { + "right": 2.0, + "left": 2.0 + }, + "description": "Parameters describing reward size." + }, "quiescent_duration": { "$ref": "#/$defs/Distribution", "default": { @@ -530,7 +530,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "description": "Antibias settings. If set, trial generator will give water and move lickspouts to combat bias.", "oneOf": [ @@ -714,6 +715,14 @@ "minimum": 0, "title": "Lickspout Offset Delta", "type": "number" + }, + "reward_fraction": { + "default": 0.8, + "description": "Fraction of full reward volume delivered for water intervention (0=none, 1=full).", + "maximum": 1, + "minimum": 0, + "title": "Reward Fraction", + "type": "number" } }, "title": "BiasInterventionParameters", @@ -825,6 +834,14 @@ "title": "Type", "type": "string" }, + "reward_size": { + "$ref": "#/$defs/RewardSize", + "default": { + "right": 2.0, + "left": 2.0 + }, + "description": "Parameters describing reward size." + }, "quiescent_duration": { "$ref": "#/$defs/Distribution", "default": { @@ -915,7 +932,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "description": "Antibias settings. If set, trial generator will give water and move lickspouts to combat bias.", "oneOf": [ @@ -1112,6 +1130,14 @@ "title": "Type", "type": "string" }, + "reward_size": { + "$ref": "#/$defs/RewardSize", + "default": { + "right": 2.0, + "left": 2.0 + }, + "description": "Parameters describing reward size." + }, "quiescent_duration": { "$ref": "#/$defs/Distribution", "default": { @@ -1202,7 +1228,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "description": "Antibias settings. If set, trial generator will give water and move lickspouts to combat bias.", "oneOf": [ @@ -1320,6 +1347,14 @@ "title": "Type", "type": "string" }, + "reward_size": { + "$ref": "#/$defs/RewardSize", + "default": { + "right": 2.0, + "left": 2.0 + }, + "description": "Parameters describing reward size." + }, "quiescent_duration": { "$ref": "#/$defs/Distribution", "default": { @@ -1406,7 +1441,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "description": "Antibias settings. If set, trial generator will give water and move lickspouts to combat bias.", "oneOf": [ @@ -2663,18 +2699,20 @@ }, "RewardSize": { "properties": { - "right_value_volume": { + "right": { + "exclusiveMinimum": 0, "title": "Right reward size (uL)", "type": "number" }, - "left_value_volume": { + "left": { + "exclusiveMinimum": 0, "title": "Left reward size (uL)", "type": "number" } }, "required": [ - "right_value_volume", - "left_value_volume" + "right", + "left" ], "title": "RewardSize", "type": "object" @@ -3379,6 +3417,14 @@ "Trial": { "description": "Represents a single trial that can be instantiated by the Bonsai state machine.", "properties": { + "reward_size": { + "$ref": "#/$defs/RewardSize", + "default": { + "right": 2.0, + "left": 2.0 + }, + "description": "Parameters describing reward size." + }, "p_reward_left": { "default": 1.0, "description": "The probability of reward on the left side if response is made.", @@ -3686,6 +3732,14 @@ "title": "Type", "type": "string" }, + "reward_size": { + "$ref": "#/$defs/RewardSize", + "default": { + "right": 2.0, + "left": 2.0 + }, + "description": "Parameters describing reward size." + }, "quiescent_duration": { "$ref": "#/$defs/Distribution", "default": { @@ -3773,7 +3827,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "description": "Antibias settings. If set, trial generator will give water and move lickspouts to combat bias.", "oneOf": [ diff --git a/schema/coupled_baiting.json b/schema/coupled_baiting.json index 23da0d55..f2f33120 100644 --- a/schema/coupled_baiting.json +++ b/schema/coupled_baiting.json @@ -12,15 +12,15 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 4.0, - "left_value_volume": 4.0 - }, "trial_generator": { "type": "TrialGeneratorComposite", "generators": [ { "type": "CoupledWarmupTrialGenerator", + "reward_size": { + "right": 4.0, + "left": 4.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -67,7 +67,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -89,6 +90,10 @@ }, { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 4.0, + "left": 4.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -139,7 +144,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -187,12 +193,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -243,7 +249,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -289,12 +296,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -345,7 +352,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -391,12 +399,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -447,7 +455,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -493,12 +502,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -545,7 +554,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -599,12 +609,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -651,7 +661,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { diff --git a/schema/uncoupled.json b/schema/uncoupled.json index ffb996b0..9c92ec6b 100644 --- a/schema/uncoupled.json +++ b/schema/uncoupled.json @@ -12,15 +12,15 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 4.0, - "left_value_volume": 4.0 - }, "trial_generator": { "type": "TrialGeneratorComposite", "generators": [ { "type": "CoupledWarmupTrialGenerator", + "reward_size": { + "right": 4.0, + "left": 4.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -67,7 +67,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -89,6 +90,10 @@ }, { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 4.0, + "left": 4.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -139,7 +144,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -187,12 +193,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -243,7 +249,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -289,12 +296,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -345,7 +352,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": false, "reward_probability_parameters": { @@ -391,12 +399,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "UncoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -444,7 +452,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": false, "trial_generation_end_parameters": { @@ -480,12 +489,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "UncoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -529,7 +538,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": false, "trial_generation_end_parameters": { @@ -565,12 +575,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "UncoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -614,7 +624,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": false, "trial_generation_end_parameters": { diff --git a/schema/uncoupled_baiting.json b/schema/uncoupled_baiting.json index a5f37530..f3a47c26 100644 --- a/schema/uncoupled_baiting.json +++ b/schema/uncoupled_baiting.json @@ -12,15 +12,15 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 4.0, - "left_value_volume": 4.0 - }, "trial_generator": { "type": "TrialGeneratorComposite", "generators": [ { "type": "CoupledWarmupTrialGenerator", + "reward_size": { + "right": 4.0, + "left": 4.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -67,7 +67,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -89,6 +90,10 @@ }, { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 4.0, + "left": 4.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -139,7 +144,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -187,12 +193,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -243,7 +249,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -289,12 +296,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "CoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -345,7 +352,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "reward_probability_parameters": { @@ -391,12 +399,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "UncoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -444,7 +452,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "trial_generation_end_parameters": { @@ -480,12 +489,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "UncoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -529,7 +538,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "trial_generation_end_parameters": { @@ -565,12 +575,12 @@ "task_parameters": { "rng_seed": null, "aind_behavior_services_pkg_version": "0.13.5", - "reward_size": { - "right_value_volume": 2.0, - "left_value_volume": 2.0 - }, "trial_generator": { "type": "UncoupledTrialGenerator", + "reward_size": { + "right": 2.0, + "left": 2.0 + }, "quiescent_duration": { "family": "Scalar", "distribution_parameters": { @@ -614,7 +624,8 @@ "intervention_interval": 10, "maximum_water_corrections": 5, "bias_window_length": 200, - "lickspout_offset_delta": 0.05 + "lickspout_offset_delta": 0.05, + "reward_fraction": 0.8 }, "is_baiting": true, "trial_generation_end_parameters": { diff --git a/src/Extensions/AindBehaviorDynamicForaging.Generated.cs b/src/Extensions/AindBehaviorDynamicForaging.Generated.cs index 6ade01cd..b83443d3 100644 --- a/src/Extensions/AindBehaviorDynamicForaging.Generated.cs +++ b/src/Extensions/AindBehaviorDynamicForaging.Generated.cs @@ -584,14 +584,11 @@ public partial class AindDynamicForagingTaskParameters private string _aindBehaviorServicesPkgVersion; - private RewardSize _rewardSize; - private TrialGeneratorSpec _trialGenerator; public AindDynamicForagingTaskParameters() { _aindBehaviorServicesPkgVersion = "0.13.5"; - _rewardSize = new RewardSize(); _trialGenerator = new TrialGeneratorSpec(); } @@ -599,7 +596,6 @@ protected AindDynamicForagingTaskParameters(AindDynamicForagingTaskParameters ot { _rngSeed = other._rngSeed; _aindBehaviorServicesPkgVersion = other._aindBehaviorServicesPkgVersion; - _rewardSize = other._rewardSize; _trialGenerator = other._trialGenerator; } @@ -633,24 +629,6 @@ public string AindBehaviorServicesPkgVersion } } - /// - /// Parameters describing reward size. - /// - [System.Xml.Serialization.XmlIgnoreAttribute()] - [Newtonsoft.Json.JsonPropertyAttribute("reward_size")] - [System.ComponentModel.DescriptionAttribute("Parameters describing reward size.")] - public RewardSize RewardSize - { - get - { - return _rewardSize; - } - set - { - _rewardSize = value; - } - } - /// /// Trial generator model for generating trials in the task. /// @@ -683,7 +661,6 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("RngSeed = " + _rngSeed + ", "); stringBuilder.Append("AindBehaviorServicesPkgVersion = " + _aindBehaviorServicesPkgVersion + ", "); - stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("TrialGenerator = " + _trialGenerator); return true; } @@ -885,6 +862,8 @@ public override string ToString() public partial class BaseCoupledTrialGeneratorSpec : TrialGeneratorSpec { + private RewardSize _rewardSize; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _quiescentDuration; private double _responseDuration; @@ -905,6 +884,7 @@ public partial class BaseCoupledTrialGeneratorSpec : TrialGeneratorSpec public BaseCoupledTrialGeneratorSpec() { + _rewardSize = new RewardSize(); _quiescentDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); _responseDuration = 1D; _rewardConsumptionDuration = 3D; @@ -919,6 +899,7 @@ public BaseCoupledTrialGeneratorSpec() protected BaseCoupledTrialGeneratorSpec(BaseCoupledTrialGeneratorSpec other) : base(other) { + _rewardSize = other._rewardSize; _quiescentDuration = other._quiescentDuration; _responseDuration = other._responseDuration; _rewardConsumptionDuration = other._rewardConsumptionDuration; @@ -930,6 +911,24 @@ protected BaseCoupledTrialGeneratorSpec(BaseCoupledTrialGeneratorSpec other) : _rewardProbabilityParameters = other._rewardProbabilityParameters; } + /// + /// Parameters describing reward size. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_size")] + [System.ComponentModel.DescriptionAttribute("Parameters describing reward size.")] + public RewardSize RewardSize + { + get + { + return _rewardSize; + } + set + { + _rewardSize = value; + } + } + /// /// Distribution describing the quiescence period before trial starts (in seconds). Each lick resets the timer. /// @@ -1109,6 +1108,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } + stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("QuiescentDuration = " + _quiescentDuration + ", "); stringBuilder.Append("ResponseDuration = " + _responseDuration + ", "); stringBuilder.Append("RewardConsumptionDuration = " + _rewardConsumptionDuration + ", "); @@ -1300,6 +1300,8 @@ public partial class BiasInterventionParameters private double _lickspoutOffsetDelta; + private double _rewardFraction; + public BiasInterventionParameters() { _threshold = new BiasThreshold(); @@ -1307,6 +1309,7 @@ public BiasInterventionParameters() _maximumWaterCorrections = 5; _biasWindowLength = 200; _lickspoutOffsetDelta = 0.05D; + _rewardFraction = 0.8D; } protected BiasInterventionParameters(BiasInterventionParameters other) @@ -1316,6 +1319,7 @@ protected BiasInterventionParameters(BiasInterventionParameters other) _maximumWaterCorrections = other._maximumWaterCorrections; _biasWindowLength = other._biasWindowLength; _lickspoutOffsetDelta = other._lickspoutOffsetDelta; + _rewardFraction = other._rewardFraction; } /// @@ -1405,6 +1409,24 @@ public double LickspoutOffsetDelta } } + /// + /// Fraction of full reward volume delivered for water intervention (0=none, 1=full). + /// + [Newtonsoft.Json.JsonPropertyAttribute("reward_fraction")] + [System.ComponentModel.DescriptionAttribute("Fraction of full reward volume delivered for water intervention (0=none, 1=full)." + + "")] + public double RewardFraction + { + get + { + return _rewardFraction; + } + set + { + _rewardFraction = value; + } + } + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new BiasInterventionParameters(this))); @@ -1421,7 +1443,8 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("InterventionInterval = " + _interventionInterval + ", "); stringBuilder.Append("MaximumWaterCorrections = " + _maximumWaterCorrections + ", "); stringBuilder.Append("BiasWindowLength = " + _biasWindowLength + ", "); - stringBuilder.Append("LickspoutOffsetDelta = " + _lickspoutOffsetDelta); + stringBuilder.Append("LickspoutOffsetDelta = " + _lickspoutOffsetDelta + ", "); + stringBuilder.Append("RewardFraction = " + _rewardFraction); return true; } @@ -1534,6 +1557,8 @@ public override string ToString() public partial class BlockBasedTrialGeneratorSpec : TrialGeneratorSpec { + private RewardSize _rewardSize; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _quiescentDuration; private double _responseDuration; @@ -1552,6 +1577,7 @@ public partial class BlockBasedTrialGeneratorSpec : TrialGeneratorSpec public BlockBasedTrialGeneratorSpec() { + _rewardSize = new RewardSize(); _quiescentDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); _responseDuration = 1D; _rewardConsumptionDuration = 3D; @@ -1565,6 +1591,7 @@ public BlockBasedTrialGeneratorSpec() protected BlockBasedTrialGeneratorSpec(BlockBasedTrialGeneratorSpec other) : base(other) { + _rewardSize = other._rewardSize; _quiescentDuration = other._quiescentDuration; _responseDuration = other._responseDuration; _rewardConsumptionDuration = other._rewardConsumptionDuration; @@ -1575,6 +1602,24 @@ protected BlockBasedTrialGeneratorSpec(BlockBasedTrialGeneratorSpec other) : _isBaiting = other._isBaiting; } + /// + /// Parameters describing reward size. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_size")] + [System.ComponentModel.DescriptionAttribute("Parameters describing reward size.")] + public RewardSize RewardSize + { + get + { + return _rewardSize; + } + set + { + _rewardSize = value; + } + } + /// /// Distribution describing the quiescence period before trial starts (in seconds). Each lick resets the timer. /// @@ -1736,6 +1781,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } + stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("QuiescentDuration = " + _quiescentDuration + ", "); stringBuilder.Append("ResponseDuration = " + _responseDuration + ", "); stringBuilder.Append("RewardConsumptionDuration = " + _rewardConsumptionDuration + ", "); @@ -2258,6 +2304,8 @@ public override string ToString() public partial class CoupledTrialGeneratorSpec : TrialGeneratorSpec { + private RewardSize _rewardSize; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _quiescentDuration; private double _responseDuration; @@ -2286,6 +2334,7 @@ public partial class CoupledTrialGeneratorSpec : TrialGeneratorSpec public CoupledTrialGeneratorSpec() { + _rewardSize = new RewardSize(); _quiescentDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); _responseDuration = 1D; _rewardConsumptionDuration = 3D; @@ -2304,6 +2353,7 @@ public CoupledTrialGeneratorSpec() protected CoupledTrialGeneratorSpec(CoupledTrialGeneratorSpec other) : base(other) { + _rewardSize = other._rewardSize; _quiescentDuration = other._quiescentDuration; _responseDuration = other._responseDuration; _rewardConsumptionDuration = other._rewardConsumptionDuration; @@ -2319,6 +2369,24 @@ protected CoupledTrialGeneratorSpec(CoupledTrialGeneratorSpec other) : _kernelSize = other._kernelSize; } + /// + /// Parameters describing reward size. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_size")] + [System.ComponentModel.DescriptionAttribute("Parameters describing reward size.")] + public RewardSize RewardSize + { + get + { + return _rewardSize; + } + set + { + _rewardSize = value; + } + } + /// /// Distribution describing the quiescence period before trial starts (in seconds). Each lick resets the timer. /// @@ -2570,6 +2638,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } + stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("QuiescentDuration = " + _quiescentDuration + ", "); stringBuilder.Append("ResponseDuration = " + _responseDuration + ", "); stringBuilder.Append("RewardConsumptionDuration = " + _rewardConsumptionDuration + ", "); @@ -2726,6 +2795,8 @@ public override string ToString() public partial class CoupledWarmupTrialGeneratorSpec : TrialGeneratorSpec { + private RewardSize _rewardSize; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _quiescentDuration; private double _responseDuration; @@ -2750,6 +2821,7 @@ public partial class CoupledWarmupTrialGeneratorSpec : TrialGeneratorSpec public CoupledWarmupTrialGeneratorSpec() { + _rewardSize = new RewardSize(); _quiescentDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); _responseDuration = 1D; _rewardConsumptionDuration = 3D; @@ -2766,6 +2838,7 @@ public CoupledWarmupTrialGeneratorSpec() protected CoupledWarmupTrialGeneratorSpec(CoupledWarmupTrialGeneratorSpec other) : base(other) { + _rewardSize = other._rewardSize; _quiescentDuration = other._quiescentDuration; _responseDuration = other._responseDuration; _rewardConsumptionDuration = other._rewardConsumptionDuration; @@ -2779,6 +2852,24 @@ protected CoupledWarmupTrialGeneratorSpec(CoupledWarmupTrialGeneratorSpec other) _minBlockReward = other._minBlockReward; } + /// + /// Parameters describing reward size. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_size")] + [System.ComponentModel.DescriptionAttribute("Parameters describing reward size.")] + public RewardSize RewardSize + { + get + { + return _rewardSize; + } + set + { + _rewardSize = value; + } + } + /// /// Distribution describing the quiescence period before trial starts (in seconds). Each lick resets the timer. /// @@ -2988,6 +3079,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } + stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("QuiescentDuration = " + _quiescentDuration + ", "); stringBuilder.Append("ResponseDuration = " + _responseDuration + ", "); stringBuilder.Append("RewardConsumptionDuration = " + _rewardConsumptionDuration + ", "); @@ -4721,9 +4813,9 @@ public override string ToString() public partial class RewardSize { - private double _rightValueVolume; + private double _right; - private double _leftValueVolume; + private double _left; public RewardSize() { @@ -4731,33 +4823,33 @@ public RewardSize() protected RewardSize(RewardSize other) { - _rightValueVolume = other._rightValueVolume; - _leftValueVolume = other._leftValueVolume; + _right = other._right; + _left = other._left; } - [Newtonsoft.Json.JsonPropertyAttribute("right_value_volume", Required=Newtonsoft.Json.Required.Always)] - public double RightValueVolume + [Newtonsoft.Json.JsonPropertyAttribute("right", Required=Newtonsoft.Json.Required.Always)] + public double Right { get { - return _rightValueVolume; + return _right; } set { - _rightValueVolume = value; + _right = value; } } - [Newtonsoft.Json.JsonPropertyAttribute("left_value_volume", Required=Newtonsoft.Json.Required.Always)] - public double LeftValueVolume + [Newtonsoft.Json.JsonPropertyAttribute("left", Required=Newtonsoft.Json.Required.Always)] + public double Left { get { - return _leftValueVolume; + return _left; } set { - _leftValueVolume = value; + _left = value; } } @@ -4773,8 +4865,8 @@ public System.IObservable Generate(System.IObservable /// The probability of reward on the left side if response is made. /// @@ -6348,6 +6462,7 @@ public System.IObservable Generate(System.IObservable s protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) { + stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("PRewardLeft = " + _pRewardLeft + ", "); stringBuilder.Append("PRewardRight = " + _pRewardRight + ", "); stringBuilder.Append("RewardConsumptionDuration = " + _rewardConsumptionDuration + ", "); @@ -6878,6 +6993,8 @@ a higher reward probability than the other. public partial class UncoupledTrialGeneratorSpec : TrialGeneratorSpec { + private RewardSize _rewardSize; + private AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution _quiescentDuration; private double _responseDuration; @@ -6902,6 +7019,7 @@ public partial class UncoupledTrialGeneratorSpec : TrialGeneratorSpec public UncoupledTrialGeneratorSpec() { + _rewardSize = new RewardSize(); _quiescentDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); _responseDuration = 1D; _rewardConsumptionDuration = 3D; @@ -6918,6 +7036,7 @@ public UncoupledTrialGeneratorSpec() protected UncoupledTrialGeneratorSpec(UncoupledTrialGeneratorSpec other) : base(other) { + _rewardSize = other._rewardSize; _quiescentDuration = other._quiescentDuration; _responseDuration = other._responseDuration; _rewardConsumptionDuration = other._rewardConsumptionDuration; @@ -6931,6 +7050,24 @@ protected UncoupledTrialGeneratorSpec(UncoupledTrialGeneratorSpec other) : _maximumDominanceStreak = other._maximumDominanceStreak; } + /// + /// Parameters describing reward size. + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + [Newtonsoft.Json.JsonPropertyAttribute("reward_size")] + [System.ComponentModel.DescriptionAttribute("Parameters describing reward size.")] + public RewardSize RewardSize + { + get + { + return _rewardSize; + } + set + { + _rewardSize = value; + } + } + /// /// Distribution describing the quiescence period before trial starts (in seconds). Each lick resets the timer. /// @@ -7145,6 +7282,7 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) { stringBuilder.Append(", "); } + stringBuilder.Append("RewardSize = " + _rewardSize + ", "); stringBuilder.Append("QuiescentDuration = " + _quiescentDuration + ", "); stringBuilder.Append("ResponseDuration = " + _responseDuration + ", "); stringBuilder.Append("RewardConsumptionDuration = " + _rewardConsumptionDuration + ", "); diff --git a/src/Extensions/OperationControl.bonsai b/src/Extensions/OperationControl.bonsai index b05e227b..6e1c5628 100644 --- a/src/Extensions/OperationControl.bonsai +++ b/src/Extensions/OperationControl.bonsai @@ -545,6 +545,9 @@ + + + HarpBehaviorCommands @@ -584,6 +587,7 @@ + diff --git a/src/Extensions/TaskEngine.bonsai b/src/Extensions/TaskEngine.bonsai index 7cb5dde1..be8d4dba 100644 --- a/src/Extensions/TaskEngine.bonsai +++ b/src/Extensions/TaskEngine.bonsai @@ -162,6 +162,91 @@ 1 + + PreTrial + Configure necessary parameters before trial is run + + + + SetRightRewardSize + + + + + true + + + + ThisTrial + + + RewardSize.Right + + + + + + SetIsRightRewardAmount + + + + + + + + + + + + + + SetLeftRewardSize + + + + + false + + + + ThisTrial + + + RewardSize.Left + + + + + + SetIsRightRewardAmount + + + + + + + + + + + + + + Source1 + + + + 1 + + + + + + + + + + RunTrial @@ -1544,6 +1629,7 @@ + diff --git a/src/Extensions/ValveUi.bonsai b/src/Extensions/ValveUi.bonsai index f2541c94..213f6f68 100644 --- a/src/Extensions/ValveUi.bonsai +++ b/src/Extensions/ValveUi.bonsai @@ -363,35 +363,21 @@ Source1 - TaskLogicParameters - - - RewardSize + DefaultRewardSize - - ValveVolume - it.Item1 ? it.Item2.RightValueVolume : it.Item2.LeftValueVolume - - - - SetIsRightRewardAmount - - - - + + + - - - @@ -896,13 +882,7 @@ - TaskLogicParameters - - - RewardSize - - - LeftValueVolume + DefaultRewardSize @@ -914,12 +894,10 @@ - - + + - - - + @@ -1111,13 +1089,7 @@ - TaskLogicParameters - - - RewardSize - - - RightValueVolume + DefaultRewardSize @@ -1129,12 +1101,10 @@ - - + + - - - + diff --git a/src/aind_behavior_dynamic_foraging/task_logic/__init__.py b/src/aind_behavior_dynamic_foraging/task_logic/__init__.py index 2820d1f9..9ca5f68e 100644 --- a/src/aind_behavior_dynamic_foraging/task_logic/__init__.py +++ b/src/aind_behavior_dynamic_foraging/task_logic/__init__.py @@ -1,7 +1,7 @@ from typing import Literal from aind_behavior_services.task import Task, TaskParameters -from pydantic import BaseModel, Field +from pydantic import Field from aind_behavior_dynamic_foraging import ( __semver__, @@ -10,12 +10,6 @@ from . import trial_models as trial_models from .trial_generators import IntegrationTestTrialGeneratorSpec, TrialGeneratorSpec - -class RewardSize(BaseModel): - right_value_volume: float = Field(title="Right reward size (uL)") - left_value_volume: float = Field(title="Left reward size (uL)") - - # ==================== MAIN TASK LOGIC CLASSES ==================== @@ -28,9 +22,6 @@ class AindDynamicForagingTaskParameters(TaskParameters): and numerical updaters for dynamic parameter modification. """ - reward_size: RewardSize = Field( - default=RewardSize(left_value_volume=3, right_value_volume=3), description="Parameters describing reward size." - ) trial_generator: TrialGeneratorSpec = Field( default=IntegrationTestTrialGeneratorSpec(), description="Trial generator model for generating trials in the task.", diff --git a/src/aind_behavior_dynamic_foraging/task_logic/interventions/bias_intervention.py b/src/aind_behavior_dynamic_foraging/task_logic/interventions/bias_intervention.py index 35670182..2b570bf2 100644 --- a/src/aind_behavior_dynamic_foraging/task_logic/interventions/bias_intervention.py +++ b/src/aind_behavior_dynamic_foraging/task_logic/interventions/bias_intervention.py @@ -23,6 +23,12 @@ class BiasInterventionParameters(BaseModel): ge=0, description="Distance (mm) to move the stage spouts by. This is a relative distance to the current value, not absolute.", ) + reward_fraction: float = Field( + default=0.8, + ge=0, + le=1, + description="Fraction of full reward volume delivered for water intervention (0=none, 1=full).", + ) class BiasIntervention: diff --git a/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/block_based_trial_generator.py b/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/block_based_trial_generator.py index f601aec8..e00e993f 100644 --- a/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/block_based_trial_generator.py +++ b/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/block_based_trial_generator.py @@ -18,7 +18,7 @@ ) from aind_behavior_dynamic_foraging.task_logic.utils.calculate_bias import calculate_bias -from ..trial_models import Metadata, Trial, TrialMetrics +from ..trial_models import Metadata, RewardSize, Trial, TrialMetrics from ._base import BaseTrialGeneratorSpecModel, ITrialGenerator, TrialOutcome logger = logging.getLogger(__name__) @@ -48,7 +48,7 @@ class AutoWaterParameters(BaseModel): ge=0, le=1, description="Fraction of full reward volume delivered during auto water (0=none, 1=full).", - ) # TODO: Not implemented yet + ) class Block(BaseModel): @@ -61,6 +61,10 @@ class Block(BaseModel): class BlockBasedTrialGeneratorSpec(BaseTrialGeneratorSpecModel): type: Literal["BlockBasedTrialGenerator"] = "BlockBasedTrialGenerator" + reward_size: RewardSize = Field( + default=RewardSize(left=2, right=2), description="Parameters describing reward size." + ) + quiescent_duration: Distribution = Field( default=ExponentialDistribution( distribution_parameters=ExponentialDistributionParameters(rate=1), @@ -201,10 +205,12 @@ def next(self) -> Trial | None: logger.debug("Right baited: %s" % self.is_right_baited) is_auto_reward_right = None + reward_fraction = 1 # determine autowater if is_autowater := self._are_autowater_conditions_met(): is_auto_reward_right = True if self.block.p_right_reward > self.block.p_left_reward else False + reward_fraction = self.spec.autowater_parameters.reward_fraction logger.debug("Delivering autowater: is_auto_reward_right = %s" % is_auto_reward_right) # determine bias correction. Overrides autowater @@ -213,6 +219,9 @@ def next(self) -> Trial | None: is_auto_reward_right, lickspout_offset_delta = self.bias_intervention.determine_antibias_intervention( self.bias ) + reward_fraction = ( + 1 if is_auto_reward_right is None else self.spec.bias_intervention_parameters.reward_fraction + ) logger.debug( "Performing bias intervention: is_auto_reward_right = %s, lickspout_offset_delta = %s." % (is_auto_reward_right, lickspout_offset_delta) @@ -227,6 +236,9 @@ def next(self) -> Trial | None: inter_trial_interval_duration=iti, lickspout_offset_delta=lickspout_offset_delta, is_auto_reward_right=is_auto_reward_right, + reward_size=RewardSize( + left=self.spec.reward_size.left * reward_fraction, right=self.spec.reward_size.right * reward_fraction + ), metadata=Metadata( p_reward_left=self.block.p_left_reward, p_reward_right=self.block.p_right_reward, diff --git a/src/aind_behavior_dynamic_foraging/task_logic/trial_models.py b/src/aind_behavior_dynamic_foraging/task_logic/trial_models.py index f1b93237..b595e202 100644 --- a/src/aind_behavior_dynamic_foraging/task_logic/trial_models.py +++ b/src/aind_behavior_dynamic_foraging/task_logic/trial_models.py @@ -64,9 +64,18 @@ class Metadata(BaseModel): ) +class RewardSize(BaseModel): + right: float = Field(gt=0, title="Right reward size (uL)") + left: float = Field(gt=0, title="Left reward size (uL)") + + class Trial(BaseModel): """Represents a single trial that can be instantiated by the Bonsai state machine.""" + reward_size: RewardSize = Field( + default=RewardSize(left=2.0, right=2.0), description="Parameters describing reward size." + ) + p_reward_left: float = Field( default=1.0, ge=0, le=1, description="The probability of reward on the left side if response is made." ) diff --git a/src/main.bonsai b/src/main.bonsai index e5825026..eab4eaaa 100644 --- a/src/main.bonsai +++ b/src/main.bonsai @@ -208,6 +208,18 @@ ExperimentState + + Default size + + + + + 2 + + + + DefaultRewardSize + SetIsRightRewardAmount @@ -222,13 +234,7 @@ - TaskLogicParameters - - - RewardSize - - - RightValueVolume + DefaultRewardSize @@ -247,13 +253,7 @@ - TaskLogicParameters - - - RewardSize - - - LeftValueVolume + DefaultRewardSize @@ -300,20 +300,18 @@ - - - + + - - - - - - + + + + + + - diff --git a/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/coupled_baiting/stages.py b/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/coupled_baiting/stages.py index 9e5a62eb..4f9ed226 100644 --- a/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/coupled_baiting/stages.py +++ b/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/coupled_baiting/stages.py @@ -2,7 +2,6 @@ from aind_behavior_dynamic_foraging.task_logic import ( AindDynamicForagingTaskLogic, AindDynamicForagingTaskParameters, - RewardSize, ) from aind_behavior_dynamic_foraging.task_logic.trial_generators import ( CoupledTrialGeneratorSpec, @@ -11,6 +10,7 @@ ) from aind_behavior_dynamic_foraging.task_logic.trial_generators.block_based_trial_generator import ( AutoWaterParameters, + RewardSize, ) from aind_behavior_dynamic_foraging.task_logic.trial_generators.coupled_trial_generators.base_coupled_trial_generator import ( RewardProbabilityParameters, @@ -39,11 +39,11 @@ def make_s_stage_1_warmup(): task=AindDynamicForagingTaskLogic( stage_name="stage_1_warmup", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=4.0, left_value_volume=4.0), trial_generator=TrialGeneratorCompositeSpec( generators=[ CoupledWarmupTrialGeneratorSpec( min_block_reward=1, + reward_size=RewardSize(right=4.0, left=4.0), reward_probability_parameters=RewardProbabilityParameters( base_reward_sum=1, reward_pairs=[[1.0, 0.0]] ), @@ -61,6 +61,7 @@ def make_s_stage_1_warmup(): ), ), CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=4.0, left=4.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -108,8 +109,8 @@ def make_s_stage_1(): task=AindDynamicForagingTaskLogic( stage_name="stage_1", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -155,8 +156,8 @@ def make_s_stage_2(): task=AindDynamicForagingTaskLogic( stage_name="stage_2", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -202,8 +203,8 @@ def make_s_stage_3(): task=AindDynamicForagingTaskLogic( stage_name="stage_3", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -249,8 +250,8 @@ def make_s_stage_final(): task=AindDynamicForagingTaskLogic( stage_name="final", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -290,8 +291,8 @@ def make_s_stage_graduated(): task=AindDynamicForagingTaskLogic( stage_name="graduated", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, diff --git a/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled/stages.py b/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled/stages.py index da75b4b5..3205e69b 100644 --- a/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled/stages.py +++ b/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled/stages.py @@ -2,7 +2,6 @@ from aind_behavior_dynamic_foraging.task_logic import ( AindDynamicForagingTaskLogic, AindDynamicForagingTaskParameters, - RewardSize, ) from aind_behavior_dynamic_foraging.task_logic.trial_generators import ( CoupledTrialGeneratorSpec, @@ -11,6 +10,7 @@ ) from aind_behavior_dynamic_foraging.task_logic.trial_generators.block_based_trial_generator import ( AutoWaterParameters, + RewardSize, ) from aind_behavior_dynamic_foraging.task_logic.trial_generators.coupled_trial_generators.base_coupled_trial_generator import ( RewardProbabilityParameters, @@ -48,11 +48,11 @@ def make_s_stage_1_warmup(): task=AindDynamicForagingTaskLogic( stage_name="stage_1_warmup", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=4.0, left_value_volume=4.0), trial_generator=TrialGeneratorCompositeSpec( generators=[ CoupledWarmupTrialGeneratorSpec( min_block_reward=1, + reward_size=RewardSize(right=4.0, left=4.0), autowater_parameters=AutoWaterParameters( reward_fraction=0.8, min_ignored_trials=0, min_unrewarded_trials=0 ), @@ -76,6 +76,7 @@ def make_s_stage_1_warmup(): reward_consumption_duration=1.0, ), CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=4.0, left=4.0), autowater_parameters=AutoWaterParameters( reward_fraction=0.5, min_ignored_trials=3, min_unrewarded_trials=3 ), @@ -123,8 +124,8 @@ def make_s_stage_1(): task=AindDynamicForagingTaskLogic( stage_name="stage_1", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), autowater_parameters=AutoWaterParameters( reward_fraction=0.5, min_ignored_trials=5, min_unrewarded_trials=5 ), @@ -170,8 +171,8 @@ def make_s_stage_2(): task=AindDynamicForagingTaskLogic( stage_name="stage_2", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), autowater_parameters=AutoWaterParameters( reward_fraction=0.5, min_ignored_trials=7, min_unrewarded_trials=7 ), @@ -217,8 +218,8 @@ def make_s_stage_3(): task=AindDynamicForagingTaskLogic( stage_name="stage_3", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=UncoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), autowater_parameters=AutoWaterParameters( reward_fraction=0.5, min_ignored_trials=10, min_unrewarded_trials=10 ), @@ -254,8 +255,8 @@ def make_s_stage_final(): task=AindDynamicForagingTaskLogic( stage_name="final", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=UncoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=UncoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -289,8 +290,8 @@ def make_s_stage_graduated(): task=AindDynamicForagingTaskLogic( stage_name="graduated", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=UncoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), autowater_parameters=None, trial_generation_end_parameters=UncoupledTrialGenerationEndConditions( max_trial=1000, diff --git a/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled_baiting/stages.py b/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled_baiting/stages.py index db819cf1..e2528bcd 100644 --- a/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled_baiting/stages.py +++ b/workspace/aind_behavior_dynamic_foraging_curricula/src/aind_behavior_dynamic_foraging_curricula/uncoupled_baiting/stages.py @@ -2,7 +2,6 @@ from aind_behavior_dynamic_foraging.task_logic import ( AindDynamicForagingTaskLogic, AindDynamicForagingTaskParameters, - RewardSize, ) from aind_behavior_dynamic_foraging.task_logic.trial_generators import ( CoupledTrialGeneratorSpec, @@ -11,6 +10,7 @@ ) from aind_behavior_dynamic_foraging.task_logic.trial_generators.block_based_trial_generator import ( AutoWaterParameters, + RewardSize, ) from aind_behavior_dynamic_foraging.task_logic.trial_generators.coupled_trial_generators.base_coupled_trial_generator import ( RewardProbabilityParameters, @@ -48,11 +48,11 @@ def make_s_stage_1_warmup(): task=AindDynamicForagingTaskLogic( stage_name="stage_1_warmup", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=4.0, left_value_volume=4.0), trial_generator=TrialGeneratorCompositeSpec( generators=[ CoupledWarmupTrialGeneratorSpec( min_block_reward=1, + reward_size=RewardSize(right=4.0, left=4.0), trial_generation_end_parameters=CoupledWarmupTrialGenerationEndConditions( min_trial=50, max_choice_bias=0.1, @@ -76,6 +76,7 @@ def make_s_stage_1_warmup(): ), ), CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=4.0, left=4.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -123,8 +124,8 @@ def make_s_stage_1(): task=AindDynamicForagingTaskLogic( stage_name="stage_1", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -170,8 +171,8 @@ def make_s_stage_2(): task=AindDynamicForagingTaskLogic( stage_name="stage_2", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=CoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=CoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -217,8 +218,8 @@ def make_s_stage_3(): task=AindDynamicForagingTaskLogic( stage_name="stage_3", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=UncoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=UncoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -254,8 +255,8 @@ def make_s_stage_final(): task=AindDynamicForagingTaskLogic( stage_name="final", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=UncoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=UncoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500, @@ -289,8 +290,8 @@ def make_s_stage_graduated(): task=AindDynamicForagingTaskLogic( stage_name="graduated", task_parameters=AindDynamicForagingTaskParameters( - reward_size=RewardSize(right_value_volume=2.0, left_value_volume=2.0), trial_generator=UncoupledTrialGeneratorSpec( + reward_size=RewardSize(right=2.0, left=2.0), trial_generation_end_parameters=UncoupledTrialGenerationEndConditions( max_trial=1000, max_time=4500,