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
+ /// 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;
+ }
+ }
+
///
/// 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,