diff --git a/schema/aind_behavior_dynamic_foraging.json b/schema/aind_behavior_dynamic_foraging.json index 07b258f..044e969 100644 --- a/schema/aind_behavior_dynamic_foraging.json +++ b/schema/aind_behavior_dynamic_foraging.json @@ -1266,12 +1266,6 @@ "title": "Extend Block On No Response", "type": "boolean" }, - "min_block_reward": { - "default": 1, - "minimum": 0, - "title": "Minimal rewards in a block to switch", - "type": "integer" - }, "kernel_size": { "default": 2, "description": "Kernel to evaluate choice fraction.", @@ -1453,6 +1447,12 @@ "evaluation_window": 20 }, "description": "Conditions to end trial generation." + }, + "min_block_reward": { + "default": 1, + "minimum": 0, + "title": "Minimal rewards in a block to switch", + "type": "integer" } }, "title": "CoupledWarmupTrialGeneratorSpec", diff --git a/schema/coupled_baiting.json b/schema/coupled_baiting.json index 80179c4..23da0d5 100644 --- a/schema/coupled_baiting.json +++ b/schema/coupled_baiting.json @@ -55,8 +55,8 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, + "min_ignored_trials": 0, + "min_unrewarded_trials": 0, "reward_fraction": 0.8 }, "bias_intervention_parameters": { @@ -84,7 +84,8 @@ "max_choice_bias": 0.1, "min_response_rate": 0.8, "evaluation_window": 20 - } + }, + "min_block_reward": 1 }, { "type": "CoupledTrialGenerator", @@ -128,7 +129,7 @@ "autowater_parameters": { "min_ignored_trials": 3, "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -163,14 +164,13 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } ] } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_1_warmup" }, "graph": { "nodes": {}, @@ -231,9 +231,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "min_ignored_trials": 5, + "min_unrewarded_trials": 5, + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -268,12 +268,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_1" }, "graph": { "nodes": {}, @@ -334,9 +333,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "min_ignored_trials": 7, + "min_unrewarded_trials": 7, + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -371,12 +370,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_2" }, "graph": { "nodes": {}, @@ -437,9 +435,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "min_ignored_trials": 10, + "min_unrewarded_trials": 10, + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -474,12 +472,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_3" }, "graph": { "nodes": {}, @@ -539,11 +536,7 @@ }, "scaling_parameters": null }, - "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 - }, + "autowater_parameters": null, "bias_intervention_parameters": { "threshold": { "upper": 0.7, @@ -585,12 +578,11 @@ }, "behavior_stability_parameters": null, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "final" }, "graph": { "nodes": {}, @@ -650,11 +642,7 @@ }, "scaling_parameters": null }, - "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 - }, + "autowater_parameters": null, "bias_intervention_parameters": { "threshold": { "upper": 0.7, @@ -696,12 +684,11 @@ }, "behavior_stability_parameters": null, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "graduated" }, "graph": { "nodes": {}, diff --git a/schema/uncoupled.json b/schema/uncoupled.json index 9b5caf9..ffb996b 100644 --- a/schema/uncoupled.json +++ b/schema/uncoupled.json @@ -55,9 +55,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.5 + "min_ignored_trials": 0, + "min_unrewarded_trials": 0, + "reward_fraction": 0.8 }, "bias_intervention_parameters": { "threshold": { @@ -84,7 +84,8 @@ "max_choice_bias": 0.1, "min_response_rate": 0.8, "evaluation_window": 20 - } + }, + "min_block_reward": 1 }, { "type": "CoupledTrialGenerator", @@ -163,14 +164,13 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } ] } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_1_warmup" }, "graph": { "nodes": {}, @@ -268,12 +268,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_1" }, "graph": { "nodes": {}, @@ -371,12 +370,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_2" }, "graph": { "nodes": {}, @@ -465,7 +463,7 @@ } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_3" }, "graph": { "nodes": {}, @@ -550,7 +548,7 @@ } }, "version": "0.0.2", - "stage_name": null + "stage_name": "final" }, "graph": { "nodes": {}, @@ -635,7 +633,7 @@ } }, "version": "0.0.2", - "stage_name": null + "stage_name": "graduated" }, "graph": { "nodes": {}, diff --git a/schema/uncoupled_baiting.json b/schema/uncoupled_baiting.json index 1ceddb1..a5f3753 100644 --- a/schema/uncoupled_baiting.json +++ b/schema/uncoupled_baiting.json @@ -55,8 +55,8 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, + "min_ignored_trials": 0, + "min_unrewarded_trials": 0, "reward_fraction": 0.8 }, "bias_intervention_parameters": { @@ -84,7 +84,8 @@ "max_choice_bias": 0.1, "min_response_rate": 0.8, "evaluation_window": 20 - } + }, + "min_block_reward": 1 }, { "type": "CoupledTrialGenerator", @@ -128,7 +129,7 @@ "autowater_parameters": { "min_ignored_trials": 3, "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -163,14 +164,13 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } ] } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_1_warmup" }, "graph": { "nodes": {}, @@ -231,9 +231,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "min_ignored_trials": 5, + "min_unrewarded_trials": 5, + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -268,12 +268,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_1" }, "graph": { "nodes": {}, @@ -334,9 +333,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "min_ignored_trials": 7, + "min_unrewarded_trials": 7, + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -371,12 +370,11 @@ "min_consecutive_stable_trials": 5 }, "extend_block_on_no_response": true, - "min_block_reward": 0, "kernel_size": 2 } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_2" }, "graph": { "nodes": {}, @@ -434,9 +432,9 @@ "scaling_parameters": null }, "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 + "min_ignored_trials": 10, + "min_unrewarded_trials": 10, + "reward_fraction": 0.5 }, "bias_intervention_parameters": { "threshold": { @@ -465,7 +463,7 @@ } }, "version": "0.0.2", - "stage_name": null + "stage_name": "stage_3" }, "graph": { "nodes": {}, @@ -522,11 +520,7 @@ "truncation_parameters": null, "scaling_parameters": null }, - "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 - }, + "autowater_parameters": null, "bias_intervention_parameters": { "threshold": { "upper": 0.7, @@ -554,7 +548,7 @@ } }, "version": "0.0.2", - "stage_name": null + "stage_name": "final" }, "graph": { "nodes": {}, @@ -611,11 +605,7 @@ "truncation_parameters": null, "scaling_parameters": null }, - "autowater_parameters": { - "min_ignored_trials": 3, - "min_unrewarded_trials": 3, - "reward_fraction": 0.8 - }, + "autowater_parameters": null, "bias_intervention_parameters": { "threshold": { "upper": 0.7, @@ -643,7 +633,7 @@ } }, "version": "0.0.2", - "stage_name": null + "stage_name": "graduated" }, "graph": { "nodes": {}, diff --git a/src/Extensions/AindBehaviorDynamicForaging.Generated.cs b/src/Extensions/AindBehaviorDynamicForaging.Generated.cs index cebc501..6ade01c 100644 --- a/src/Extensions/AindBehaviorDynamicForaging.Generated.cs +++ b/src/Extensions/AindBehaviorDynamicForaging.Generated.cs @@ -2282,8 +2282,6 @@ public partial class CoupledTrialGeneratorSpec : TrialGeneratorSpec private bool _extendBlockOnNoResponse; - private int _minBlockReward; - private int _kernelSize; public CoupledTrialGeneratorSpec() @@ -2300,7 +2298,6 @@ public CoupledTrialGeneratorSpec() _trialGenerationEndParameters = new CoupledTrialGenerationEndConditions(); _behaviorStabilityParameters = new BehaviorStabilityParameters(); _extendBlockOnNoResponse = true; - _minBlockReward = 1; _kernelSize = 2; } @@ -2319,7 +2316,6 @@ protected CoupledTrialGeneratorSpec(CoupledTrialGeneratorSpec other) : _trialGenerationEndParameters = other._trialGenerationEndParameters; _behaviorStabilityParameters = other._behaviorStabilityParameters; _extendBlockOnNoResponse = other._extendBlockOnNoResponse; - _minBlockReward = other._minBlockReward; _kernelSize = other._kernelSize; } @@ -2541,19 +2537,6 @@ public bool ExtendBlockOnNoResponse } } - [Newtonsoft.Json.JsonPropertyAttribute("min_block_reward")] - public int MinBlockReward - { - get - { - return _minBlockReward; - } - set - { - _minBlockReward = value; - } - } - /// /// Kernel to evaluate choice fraction. /// @@ -2599,7 +2582,6 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("TrialGenerationEndParameters = " + _trialGenerationEndParameters + ", "); stringBuilder.Append("BehaviorStabilityParameters = " + _behaviorStabilityParameters + ", "); stringBuilder.Append("ExtendBlockOnNoResponse = " + _extendBlockOnNoResponse + ", "); - stringBuilder.Append("MinBlockReward = " + _minBlockReward + ", "); stringBuilder.Append("KernelSize = " + _kernelSize); return true; } @@ -2764,6 +2746,8 @@ public partial class CoupledWarmupTrialGeneratorSpec : TrialGeneratorSpec private CoupledWarmupTrialGenerationEndConditions _trialGenerationEndParameters; + private int _minBlockReward; + public CoupledWarmupTrialGeneratorSpec() { _quiescentDuration = new AllenNeuralDynamics.AindBehaviorServices.Distributions.Distribution(); @@ -2776,6 +2760,7 @@ public CoupledWarmupTrialGeneratorSpec() _isBaiting = true; _rewardProbabilityParameters = new RewardProbabilityParameters(); _trialGenerationEndParameters = new CoupledWarmupTrialGenerationEndConditions(); + _minBlockReward = 1; } protected CoupledWarmupTrialGeneratorSpec(CoupledWarmupTrialGeneratorSpec other) : @@ -2791,6 +2776,7 @@ protected CoupledWarmupTrialGeneratorSpec(CoupledWarmupTrialGeneratorSpec other) _isBaiting = other._isBaiting; _rewardProbabilityParameters = other._rewardProbabilityParameters; _trialGenerationEndParameters = other._trialGenerationEndParameters; + _minBlockReward = other._minBlockReward; } /// @@ -2973,6 +2959,19 @@ public CoupledWarmupTrialGenerationEndConditions TrialGenerationEndParameters } } + [Newtonsoft.Json.JsonPropertyAttribute("min_block_reward")] + public int MinBlockReward + { + get + { + return _minBlockReward; + } + set + { + _minBlockReward = value; + } + } + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new CoupledWarmupTrialGeneratorSpec(this))); @@ -2998,7 +2997,8 @@ protected override bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("BiasInterventionParameters = " + _biasInterventionParameters + ", "); stringBuilder.Append("IsBaiting = " + _isBaiting + ", "); stringBuilder.Append("RewardProbabilityParameters = " + _rewardProbabilityParameters + ", "); - stringBuilder.Append("TrialGenerationEndParameters = " + _trialGenerationEndParameters); + stringBuilder.Append("TrialGenerationEndParameters = " + _trialGenerationEndParameters + ", "); + stringBuilder.Append("MinBlockReward = " + _minBlockReward); return true; } } diff --git a/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_trial_generator.py b/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_trial_generator.py index ec0f555..897e5d2 100644 --- a/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_trial_generator.py +++ b/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_trial_generator.py @@ -74,8 +74,6 @@ class CoupledTrialGeneratorSpec(BaseCoupledTrialGeneratorSpec): description="Whether to extend the minimum block length by one trial when the animal does not respond.", ) - min_block_reward: int = Field(default=1, ge=0, title="Minimal rewards in a block to switch") - kernel_size: int = Field(default=2, description="Kernel to evaluate choice fraction.") def create_generator(self) -> "CoupledTrialGenerator": @@ -290,13 +288,8 @@ def _is_block_switch_allowed(self) -> bool: ) logger.debug("Behavior meets stability criteria: %s" % behavior_ok) - # has reward criteria been met? - reward_ok = self.reward_history.count(False) + self.reward_history.count(True) >= self.spec.min_block_reward - logger.debug("Reward criterion satisfied: %s" % reward_ok) - # conditions to switch: # - planned block length reached - # - minimum reward requirement is reached # - behavior is stable - return block_length_ok and reward_ok and behavior_ok + return block_length_ok and behavior_ok diff --git a/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_warmup_trial_generator.py b/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_warmup_trial_generator.py index eba1cb5..f041c43 100644 --- a/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_warmup_trial_generator.py +++ b/src/aind_behavior_dynamic_foraging/task_logic/trial_generators/coupled_trial_generators/coupled_warmup_trial_generator.py @@ -46,6 +46,8 @@ class CoupledWarmupTrialGeneratorSpec(BaseCoupledTrialGeneratorSpec): default=True, description="Whether uncollected rewards carry over to the next trial." ) + min_block_reward: int = Field(default=1, ge=0, title="Minimal rewards in a block to switch") + def create_generator(self) -> "CoupledWarmupTrialGenerator": return CoupledWarmupTrialGenerator(self) @@ -90,12 +92,13 @@ def _are_end_conditions_met(self) -> bool: ) return False - def _is_block_switch_allowed(self) -> True: + def _is_block_switch_allowed(self) -> bool: """ - Warmup switches block every update + Warmup switches when minimum reward. Returns: - True + bool indicating whether block can switch """ - return True + reward_count = sum([outcome.is_rewarded for outcome in self.outcome_history]) + return reward_count >= self.spec.min_block_reward diff --git a/tests/trial_generators/test_coupled_trial_generator.py b/tests/trial_generators/test_coupled_trial_generator.py index cae55c8..dca8efd 100644 --- a/tests/trial_generators/test_coupled_trial_generator.py +++ b/tests/trial_generators/test_coupled_trial_generator.py @@ -173,7 +173,6 @@ def test_block_switch_all_conditions_met_switches(self): self.generator.trials_in_block = 20 self.generator.reward_history = [True] * 5 self.generator.is_right_choice_history = [True] * 20 - self.generator.spec.min_block_reward = 1 result = self.generator._is_block_switch_allowed() self.assertTrue(result) @@ -185,19 +184,6 @@ def test_block_switch_block_length_not_reached(self): self.generator.reward_history = [True] * 5 self.generator.is_right_choice_history = [True] * 10 self.generator.trials_in_block = 10 - self.generator.spec.min_block_reward = 1 - - result = self.generator._is_block_switch_allowed() - self.assertFalse(result) - - def test_block_switch_reward_not_met(self): - self.generator.block.p_right_reward = 0.8 - self.generator.block.p_left_reward = 0.2 - self.generator.block.right_length = 20 - self.generator.reward_history = [] # no rewards - self.generator.is_right_choice_history = [True] * 20 - self.generator.trials_in_block = 20 - self.generator.spec.min_block_reward = 5 result = self.generator._is_block_switch_allowed() self.assertFalse(result) @@ -209,7 +195,6 @@ def test_block_switch_behavior_not_stable(self): self.generator.reward_history = [True] * 5 self.generator.is_right_choice_history = [False] * 20 self.generator.trials_in_block = 20 - self.generator.spec.min_block_reward = 1 result = self.generator._is_block_switch_allowed() self.assertFalse(result) diff --git a/tests/trial_generators/test_warmup_trial_generator.py b/tests/trial_generators/test_warmup_trial_generator.py index 92a89eb..80b4fc5 100644 --- a/tests/trial_generators/test_warmup_trial_generator.py +++ b/tests/trial_generators/test_warmup_trial_generator.py @@ -41,17 +41,17 @@ def test_session(self): return def test_end_conditions_not_met_too_few_trials(self): - self.generator.is_right_choice_history.append([True] * 5) + self.generator.is_right_choice_history += [True] * 5 self.assertFalse(self.generator._are_end_conditions_met()) def test_end_conditions_not_met_high_bias(self): # all right choices = biased - self.generator.is_right_choice_history.append([True] * 10) + self.generator.is_right_choice_history += [True] * 10 self.assertFalse(self.generator._are_end_conditions_met()) def test_end_conditions_not_met_low_response_rate(self): # ignored - self.generator.is_right_choice_history.append([None] * 10) + self.generator.is_right_choice_history += [None] * 10 self.assertFalse(self.generator._are_end_conditions_met()) def test_end_conditions_met(self): @@ -62,15 +62,15 @@ def test_end_conditions_met(self): ### block switches ### - def test_block_switches_every_update(self): + def test_block_switches_on_reward_minimum(self): initial_block = self.generator.block self.generator.update(make_outcome(is_right_choice=True, is_rewarded=True)) self.assertIsNot(self.generator.block, initial_block) - def test_block_switches_on_ignored_trial(self): + def test_no_block_switch_on_reward_minimum_not_met(self): initial_block = self.generator.block - self.generator.update(make_outcome(is_right_choice=None, is_rewarded=False)) - self.assertIsNot(self.generator.block, initial_block) + self.generator.update(make_outcome(is_right_choice=True, is_rewarded=False)) + self.assertIs(self.generator.block, initial_block) def test_trials_in_block_resets_on_update(self): self.generator.trials_in_block = 5 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 a92acb1..9e5a62e 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 @@ -9,6 +9,9 @@ CoupledWarmupTrialGeneratorSpec, TrialGeneratorCompositeSpec, ) +from aind_behavior_dynamic_foraging.task_logic.trial_generators.block_based_trial_generator import ( + AutoWaterParameters, +) from aind_behavior_dynamic_foraging.task_logic.trial_generators.coupled_trial_generators.base_coupled_trial_generator import ( RewardProbabilityParameters, ) @@ -34,11 +37,13 @@ def make_s_stage_1_warmup(): return Stage( name="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_probability_parameters=RewardProbabilityParameters( base_reward_sum=1, reward_pairs=[[1.0, 0.0]] ), @@ -51,6 +56,9 @@ def make_s_stage_1_warmup(): is_baiting=True, response_duration=5.0, reward_consumption_duration=1.0, + autowater_parameters=AutoWaterParameters( + min_ignored_trials=0, min_unrewarded_trials=0, reward_fraction=0.8 + ), ), CoupledTrialGeneratorSpec( trial_generation_end_parameters=CoupledTrialGenerationEndConditions( @@ -77,16 +85,18 @@ def make_s_stage_1_warmup(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=7), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=5.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + min_ignored_trials=3, min_unrewarded_trials=3, reward_fraction=0.5 + ), ), ] ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -96,6 +106,7 @@ def make_s_stage_1(): return Stage( name="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( @@ -123,14 +134,16 @@ def make_s_stage_1(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=7), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=5.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + min_ignored_trials=5, min_unrewarded_trials=5, reward_fraction=0.5 + ), ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -140,6 +153,7 @@ def make_s_stage_2(): return Stage( name="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( @@ -167,14 +181,16 @@ def make_s_stage_2(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=10), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.3)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=3.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + min_ignored_trials=7, min_unrewarded_trials=7, reward_fraction=0.5 + ), ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -184,6 +200,7 @@ def make_s_stage_3(): return Stage( name="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( @@ -211,14 +228,16 @@ def make_s_stage_3(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=15), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.5)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=2.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + min_ignored_trials=10, min_unrewarded_trials=10, reward_fraction=0.5 + ), ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -228,6 +247,7 @@ def make_s_stage_final(): return Stage( name="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( @@ -251,14 +271,14 @@ def make_s_stage_final(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=30), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=1.0, reward_consumption_duration=3.0, kernel_size=2, + autowater_parameters=None, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -268,6 +288,7 @@ def make_s_stage_graduated(): return Stage( name="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( @@ -291,14 +312,14 @@ def make_s_stage_graduated(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=30), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=1.0, reward_consumption_duration=3.0, kernel_size=2, + autowater_parameters=None, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) 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 ae4917d..da75b4b 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 @@ -46,13 +46,15 @@ def make_s_stage_1_warmup(): return Stage( name="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, autowater_parameters=AutoWaterParameters( - reward_fraction=0.5, min_ignored_trials=3, min_unrewarded_trials=3 + reward_fraction=0.8, min_ignored_trials=0, min_unrewarded_trials=0 ), trial_generation_end_parameters=CoupledWarmupTrialGenerationEndConditions( min_trial=50, @@ -101,7 +103,6 @@ def make_s_stage_1_warmup(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=7), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=5.0, @@ -110,7 +111,7 @@ def make_s_stage_1_warmup(): ), ] ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -120,6 +121,7 @@ def make_s_stage_1(): return Stage( name="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( @@ -150,14 +152,13 @@ def make_s_stage_1(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=7), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=5.0, reward_consumption_duration=1.0, kernel_size=2, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -167,6 +168,7 @@ def make_s_stage_2(): return Stage( name="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( @@ -197,14 +199,13 @@ def make_s_stage_2(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=10), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.3)), - min_block_reward=0, is_baiting=False, extend_block_on_no_response=True, response_duration=3.0, reward_consumption_duration=1.0, kernel_size=2, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -214,6 +215,7 @@ def make_s_stage_3(): return Stage( name="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( @@ -240,7 +242,7 @@ def make_s_stage_3(): response_duration=2.0, reward_consumption_duration=1.0, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -250,6 +252,7 @@ def make_s_stage_final(): return Stage( name="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( @@ -274,7 +277,7 @@ def make_s_stage_final(): response_duration=1.0, reward_consumption_duration=3.0, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -284,6 +287,7 @@ def make_s_stage_graduated(): return Stage( name="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( @@ -308,7 +312,7 @@ def make_s_stage_graduated(): response_duration=1.0, reward_consumption_duration=3.0, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) 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 a3098ab..db819cf 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 @@ -9,6 +9,9 @@ CoupledWarmupTrialGeneratorSpec, TrialGeneratorCompositeSpec, ) +from aind_behavior_dynamic_foraging.task_logic.trial_generators.block_based_trial_generator import ( + AutoWaterParameters, +) from aind_behavior_dynamic_foraging.task_logic.trial_generators.coupled_trial_generators.base_coupled_trial_generator import ( RewardProbabilityParameters, ) @@ -43,11 +46,13 @@ def make_s_stage_1_warmup(): return Stage( name="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, trial_generation_end_parameters=CoupledWarmupTrialGenerationEndConditions( min_trial=50, max_choice_bias=0.1, @@ -66,6 +71,9 @@ def make_s_stage_1_warmup(): is_baiting=True, response_duration=5.0, reward_consumption_duration=1.0, + autowater_parameters=AutoWaterParameters( + reward_fraction=0.8, min_ignored_trials=0, min_unrewarded_trials=0 + ), ), CoupledTrialGeneratorSpec( trial_generation_end_parameters=CoupledTrialGenerationEndConditions( @@ -92,16 +100,18 @@ def make_s_stage_1_warmup(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=7), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=5.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + reward_fraction=0.5, min_ignored_trials=3, min_unrewarded_trials=3 + ), ), ] ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -111,6 +121,7 @@ def make_s_stage_1(): return Stage( name="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( @@ -138,14 +149,16 @@ def make_s_stage_1(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=7), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.1)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=5.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + reward_fraction=0.5, min_ignored_trials=5, min_unrewarded_trials=5 + ), ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -155,6 +168,7 @@ def make_s_stage_2(): return Stage( name="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( @@ -182,14 +196,16 @@ def make_s_stage_2(): truncation_parameters=TruncationParameters(truncation_mode="clamp", min=1, max=10), ), quiescent_duration=Scalar(distribution_parameters=ScalarDistributionParameter(value=0.3)), - min_block_reward=0, is_baiting=True, extend_block_on_no_response=True, response_duration=3.0, reward_consumption_duration=1.0, kernel_size=2, + autowater_parameters=AutoWaterParameters( + reward_fraction=0.5, min_ignored_trials=7, min_unrewarded_trials=7 + ), ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -199,6 +215,7 @@ def make_s_stage_3(): return Stage( name="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( @@ -221,8 +238,11 @@ def make_s_stage_3(): is_baiting=True, response_duration=2.0, reward_consumption_duration=1.0, + autowater_parameters=AutoWaterParameters( + reward_fraction=0.5, min_ignored_trials=10, min_unrewarded_trials=10 + ), ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -232,6 +252,7 @@ def make_s_stage_final(): return Stage( name="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( @@ -254,8 +275,9 @@ def make_s_stage_final(): is_baiting=True, response_duration=1.0, reward_consumption_duration=3.0, + autowater_parameters=None, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), ) @@ -265,6 +287,7 @@ def make_s_stage_graduated(): return Stage( name="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( @@ -287,8 +310,9 @@ def make_s_stage_graduated(): is_baiting=True, response_duration=1.0, reward_consumption_duration=3.0, + autowater_parameters=None, ), - ) + ), ), metrics_provider=MetricsProvider(metrics_from_dataset), )