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),
)