diff --git a/schema/aind_behavior_vr_foraging.json b/schema/aind_behavior_vr_foraging.json index 26908dd0..23e9398c 100644 --- a/schema/aind_behavior_vr_foraging.json +++ b/schema/aind_behavior_vr_foraging.json @@ -3280,6 +3280,20 @@ "minimum": 0, "title": "Grace Distance Threshold", "type": "number" + }, + "abort_velocity_threshold": { + "default": null, + "description": "Velocity (cm/s) above which an in-progress operant choice is aborted. This is an ADDITIONAL abort source: the choice aborts if velocity exceeds this OR displacement exceeds grace_distance_threshold OR the animal leaves the reward site. None disables only the velocity source (grace + leave-site still apply). Interaction with the stop threshold: this is evaluated on the SAME filtered velocity signal as stop detection, which locks a choice when velocity falls BELOW StopVelocityThreshold (UpdaterTarget.STOP_VELOCITY_THRESHOLD, seeded from the position-control velocity_threshold and shaped within/across sessions). The two gates partition the same velocity axis in opposite directions, so this value must be >= the operative StopVelocityThreshold: if it is lower, the band (abort_velocity_threshold, StopVelocityThreshold) lets the animal lock a stop while already too fast to hold it, forfeiting every such choice. Because StopVelocityThreshold is dynamic (e.g. shaped 60 -> 8 cm/s by a GAIN updater) whereas this is a fixed absolute, only enable the velocity abort on stages where the stop threshold is already floored below it (e.g. a static stop threshold of 8 with this set to 15); never pair a low fixed abort with an actively-shaped, still-high stop threshold.", + "oneOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Abort Velocity Threshold" } }, "title": "OperantLogic", diff --git a/schema/depletion.json b/schema/depletion.json index bd511d17..e8a27837 100644 --- a/schema/depletion.json +++ b/schema/depletion.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -402,7 +403,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -745,7 +747,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1051,7 +1054,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1263,7 +1267,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1553,7 +1558,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1765,7 +1771,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1977,7 +1984,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", diff --git a/schema/depletion_stops_offset.json b/schema/depletion_stops_offset.json index 8d032efd..00dd0228 100644 --- a/schema/depletion_stops_offset.json +++ b/schema/depletion_stops_offset.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -402,7 +403,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -745,7 +747,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1051,7 +1054,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1263,7 +1267,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1553,7 +1558,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1765,7 +1771,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1977,7 +1984,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", diff --git a/schema/depletion_stops_rate.json b/schema/depletion_stops_rate.json index b9ac5dc6..060675fe 100644 --- a/schema/depletion_stops_rate.json +++ b/schema/depletion_stops_rate.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -402,7 +403,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -745,7 +747,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1051,7 +1054,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1263,7 +1267,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1553,7 +1558,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1765,7 +1771,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1977,7 +1984,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", diff --git a/schema/deterministic_reversals.json b/schema/deterministic_reversals.json index 85bf6632..499dcaf0 100644 --- a/schema/deterministic_reversals.json +++ b/schema/deterministic_reversals.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -402,7 +403,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -745,7 +747,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1051,7 +1054,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -1267,7 +1271,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -1567,7 +1572,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -1784,7 +1790,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -2006,7 +2013,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", diff --git a/schema/deterministic_reversals_reward_capped.json b/schema/deterministic_reversals_reward_capped.json index a84302e2..dc5224c1 100644 --- a/schema/deterministic_reversals_reward_capped.json +++ b/schema/deterministic_reversals_reward_capped.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -402,7 +403,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -745,7 +747,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1051,7 +1054,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -1267,7 +1271,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -1587,7 +1592,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -1804,7 +1810,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -2046,7 +2053,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", diff --git a/schema/replenishment_depletion_offset.json b/schema/replenishment_depletion_offset.json index 130a79c0..258b4d5c 100644 --- a/schema/replenishment_depletion_offset.json +++ b/schema/replenishment_depletion_offset.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -402,7 +403,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -745,7 +747,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Normal", @@ -1051,7 +1054,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -1508,7 +1512,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -1845,7 +1850,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", diff --git a/schema/single_site.json b/schema/single_site.json index f26b56dc..8b3ab3e7 100644 --- a/schema/single_site.json +++ b/schema/single_site.json @@ -53,7 +53,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -199,7 +200,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -468,7 +470,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -614,7 +617,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -802,7 +806,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -948,7 +953,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Scalar", @@ -1200,7 +1206,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -1211,7 +1217,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -1353,7 +1360,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -1364,7 +1371,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -1506,7 +1514,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -1517,7 +1525,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -1709,7 +1718,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -1720,7 +1729,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -1862,7 +1872,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -1873,7 +1883,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -2015,7 +2026,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -2026,7 +2037,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -2218,7 +2230,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -2229,7 +2241,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -2371,7 +2384,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -2382,7 +2395,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -2524,7 +2538,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -2535,7 +2549,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -2727,7 +2742,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -2738,7 +2753,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -2880,7 +2896,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -2891,7 +2907,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -3033,7 +3050,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -3044,7 +3061,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -3236,7 +3254,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -3247,7 +3265,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -3389,7 +3408,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -3400,7 +3419,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -3542,7 +3562,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -3553,7 +3573,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -3745,7 +3766,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -3756,7 +3777,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -3898,7 +3920,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -3909,7 +3931,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -4051,7 +4074,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -4062,7 +4085,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -4254,7 +4278,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -4265,7 +4289,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -4407,7 +4432,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -4418,7 +4443,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -4560,7 +4586,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -4571,7 +4597,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -4763,7 +4790,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -4774,7 +4801,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -4916,7 +4944,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -4927,7 +4955,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -5069,7 +5098,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -5080,7 +5109,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -5272,7 +5302,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -5283,7 +5313,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -5425,7 +5456,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -5436,7 +5467,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -5578,7 +5610,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -5589,7 +5621,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -5781,7 +5814,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -5792,7 +5825,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -5934,7 +5968,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -5945,7 +5979,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -6087,7 +6122,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -6098,7 +6133,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -6290,7 +6326,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -6301,7 +6337,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -6443,7 +6480,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -6454,7 +6491,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -6596,7 +6634,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -6607,7 +6645,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -6799,7 +6838,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -6810,7 +6849,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -6952,7 +6992,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -6963,7 +7003,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -7105,7 +7146,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -7116,7 +7157,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -7308,7 +7350,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -7319,7 +7361,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -7461,7 +7504,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -7472,7 +7515,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -7614,7 +7658,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -7625,7 +7669,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -7879,7 +7924,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -7890,7 +7935,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -8032,7 +8078,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -8043,7 +8089,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -8185,7 +8232,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -8196,7 +8243,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -8388,7 +8436,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -8399,7 +8447,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -8541,7 +8590,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -8552,7 +8601,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -8694,7 +8744,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -8705,7 +8755,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -8897,7 +8948,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -8908,7 +8959,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -9050,7 +9102,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -9061,7 +9113,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -9203,7 +9256,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -9214,7 +9267,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -9406,7 +9460,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -9417,7 +9471,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -9559,7 +9614,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -9570,7 +9625,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -9712,7 +9768,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -9723,7 +9779,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -9915,7 +9972,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -9926,7 +9983,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -10068,7 +10126,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -10079,7 +10137,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -10221,7 +10280,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -10232,7 +10291,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -10424,7 +10484,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -10435,7 +10495,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -10577,7 +10638,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -10588,7 +10649,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -10730,7 +10792,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -10741,7 +10803,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -10933,7 +10996,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -10944,7 +11007,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -11086,7 +11150,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -11097,7 +11161,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -11239,7 +11304,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -11250,7 +11315,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -11442,7 +11508,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -11453,7 +11519,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -11595,7 +11662,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -11606,7 +11673,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -11748,7 +11816,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -11759,7 +11827,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -11951,7 +12020,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -11962,7 +12031,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -12104,7 +12174,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -12115,7 +12185,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -12257,7 +12328,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -12268,7 +12339,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -12460,7 +12532,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -12471,7 +12543,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -12613,7 +12686,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -12624,7 +12697,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -12766,7 +12840,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -12777,7 +12851,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -12969,7 +13044,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -12980,7 +13055,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -13122,7 +13198,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -13133,7 +13209,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -13275,7 +13352,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -13286,7 +13363,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -13478,7 +13556,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -13489,7 +13567,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -13631,7 +13710,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -13642,7 +13721,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -13784,7 +13864,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -13795,7 +13875,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -13987,7 +14068,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -13998,7 +14079,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -14140,7 +14222,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -14151,7 +14233,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", @@ -14293,7 +14376,7 @@ ], "reward_specification": { "operant_logic": { - "is_operant": false, + "is_operant": true, "stop_duration": { "family": "Scalar", "distribution_parameters": { @@ -14304,7 +14387,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 100000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 50.0, + "abort_velocity_threshold": 15.0 }, "delay": { "family": "Exponential", diff --git a/schema/template.json b/schema/template.json index 2a8a214a..182ebd9c 100644 --- a/schema/template.json +++ b/schema/template.json @@ -77,7 +77,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 1000000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -333,7 +334,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 1000000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -681,7 +683,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 1000000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", @@ -937,7 +940,8 @@ "scaling_parameters": null }, "time_to_collect_reward": 1000000.0, - "grace_distance_threshold": 10.0 + "grace_distance_threshold": 10.0, + "abort_velocity_threshold": null }, "delay": { "family": "Exponential", diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 4f90fd56..36efb119 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -5190,6 +5190,8 @@ public partial class OperantLogic private double _graceDistanceThreshold; + private double? _abortVelocityThreshold; + public OperantLogic() { _isOperant = true; @@ -5204,6 +5206,7 @@ protected OperantLogic(OperantLogic other) _stopDuration = other._stopDuration; _timeToCollectReward = other._timeToCollectReward; _graceDistanceThreshold = other._graceDistanceThreshold; + _abortVelocityThreshold = other._abortVelocityThreshold; } /// @@ -5275,6 +5278,23 @@ public double GraceDistanceThreshold } } + /// + /// Velocity (cm/s) above which an in-progress operant choice is aborted. This is an ADDITIONAL abort source: the choice aborts if velocity exceeds this OR displacement exceeds grace_distance_threshold OR the animal leaves the reward site. None disables only the velocity source (grace + leave-site still apply). Interaction with the stop threshold: this is evaluated on the SAME filtered velocity signal as stop detection, which locks a choice when velocity falls BELOW StopVelocityThreshold (UpdaterTarget.STOP_VELOCITY_THRESHOLD, seeded from the position-control velocity_threshold and shaped within/across sessions). The two gates partition the same velocity axis in opposite directions, so this value must be >= the operative StopVelocityThreshold: if it is lower, the band (abort_velocity_threshold, StopVelocityThreshold) lets the animal lock a stop while already too fast to hold it, forfeiting every such choice. Because StopVelocityThreshold is dynamic (e.g. shaped 60 -> 8 cm/s by a GAIN updater) whereas this is a fixed absolute, only enable the velocity abort on stages where the stop threshold is already floored below it (e.g. a static stop threshold of 8 with this set to 15); never pair a low fixed abort with an actively-shaped, still-high stop threshold. + /// + [Newtonsoft.Json.JsonPropertyAttribute("abort_velocity_threshold")] + [System.ComponentModel.DescriptionAttribute(@"Velocity (cm/s) above which an in-progress operant choice is aborted. This is an ADDITIONAL abort source: the choice aborts if velocity exceeds this OR displacement exceeds grace_distance_threshold OR the animal leaves the reward site. None disables only the velocity source (grace + leave-site still apply). Interaction with the stop threshold: this is evaluated on the SAME filtered velocity signal as stop detection, which locks a choice when velocity falls BELOW StopVelocityThreshold (UpdaterTarget.STOP_VELOCITY_THRESHOLD, seeded from the position-control velocity_threshold and shaped within/across sessions). The two gates partition the same velocity axis in opposite directions, so this value must be >= the operative StopVelocityThreshold: if it is lower, the band (abort_velocity_threshold, StopVelocityThreshold) lets the animal lock a stop while already too fast to hold it, forfeiting every such choice. Because StopVelocityThreshold is dynamic (e.g. shaped 60 -> 8 cm/s by a GAIN updater) whereas this is a fixed absolute, only enable the velocity abort on stages where the stop threshold is already floored below it (e.g. a static stop threshold of 8 with this set to 15); never pair a low fixed abort with an actively-shaped, still-high stop threshold.")] + public double? AbortVelocityThreshold + { + get + { + return _abortVelocityThreshold; + } + set + { + _abortVelocityThreshold = value; + } + } + public System.IObservable Generate() { return System.Reactive.Linq.Observable.Defer(() => System.Reactive.Linq.Observable.Return(new OperantLogic(this))); @@ -5290,7 +5310,8 @@ protected virtual bool PrintMembers(System.Text.StringBuilder stringBuilder) stringBuilder.Append("IsOperant = " + _isOperant + ", "); stringBuilder.Append("StopDuration = " + _stopDuration + ", "); stringBuilder.Append("TimeToCollectReward = " + _timeToCollectReward + ", "); - stringBuilder.Append("GraceDistanceThreshold = " + _graceDistanceThreshold); + stringBuilder.Append("GraceDistanceThreshold = " + _graceDistanceThreshold + ", "); + stringBuilder.Append("AbortVelocityThreshold = " + _abortVelocityThreshold); return true; } diff --git a/src/Extensions/InstantiateSite.bonsai b/src/Extensions/InstantiateSite.bonsai index c14e9152..e694e8c7 100644 --- a/src/Extensions/InstantiateSite.bonsai +++ b/src/Extensions/InstantiateSite.bonsai @@ -401,6 +401,31 @@ true + + FilteredCurrentVelocity + + + Item1 + + + ThisRewardControl + + + + 1 + + + + OperantLogic.AbortVelocityThreshold + + + + Value + + + + + @@ -419,12 +444,21 @@ - + - + + + + + + + + + + @@ -673,6 +707,31 @@ it.Item2 as EntryPosition) true + + FilteredCurrentVelocity + + + Item1 + + + ThisRewardControl + + + + 1 + + + + OperantLogic.AbortVelocityThreshold + + + + Value + + + + + @@ -690,12 +749,21 @@ it.Item2 as EntryPosition) - + - + + + + + + + + + + diff --git a/src/packages/aind_behavior_vr_foraging/src/aind_behavior_vr_foraging/task_logic.py b/src/packages/aind_behavior_vr_foraging/src/aind_behavior_vr_foraging/task_logic.py index 2a096dbb..5565d2dd 100644 --- a/src/packages/aind_behavior_vr_foraging/src/aind_behavior_vr_foraging/task_logic.py +++ b/src/packages/aind_behavior_vr_foraging/src/aind_behavior_vr_foraging/task_logic.py @@ -200,6 +200,23 @@ class OperantLogic(BaseModel): grace_distance_threshold: float = Field( default=10, ge=0, description="Virtual distance (cm) the animal must be within to not abort the current choice" ) + abort_velocity_threshold: Optional[float] = Field( + default=None, + ge=0, + description="Velocity (cm/s) above which an in-progress operant choice is aborted. This is an ADDITIONAL " + "abort source: the choice aborts if velocity exceeds this OR displacement exceeds grace_distance_threshold " + "OR the animal leaves the reward site. None disables only the velocity source (grace + leave-site still apply). " + "Interaction with the stop threshold: this is evaluated on the SAME filtered velocity signal as stop " + "detection, which locks a choice when velocity falls BELOW StopVelocityThreshold " + "(UpdaterTarget.STOP_VELOCITY_THRESHOLD, seeded from the position-control velocity_threshold and shaped " + "within/across sessions). The two gates partition the same velocity axis in opposite directions, so this " + "value must be >= the operative StopVelocityThreshold: if it is lower, the band " + "(abort_velocity_threshold, StopVelocityThreshold) lets the animal lock a stop while already too fast to " + "hold it, forfeiting every such choice. Because StopVelocityThreshold is dynamic (e.g. shaped 60 -> 8 cm/s " + "by a GAIN updater) whereas this is a fixed absolute, only enable the velocity abort on stages where the " + "stop threshold is already floored below it (e.g. a static stop threshold of 8 with this set to 15); never " + "pair a low fixed abort with an actively-shaped, still-high stop threshold.", + ) class _PatchUpdateFunction(BaseModel): diff --git a/src/packages/aind_behavior_vr_foraging/tests/test_task_logic.py b/src/packages/aind_behavior_vr_foraging/tests/test_task_logic.py index acb95b33..8273e071 100644 --- a/src/packages/aind_behavior_vr_foraging/tests/test_task_logic.py +++ b/src/packages/aind_behavior_vr_foraging/tests/test_task_logic.py @@ -8,6 +8,7 @@ from aind_behavior_vr_foraging.task_logic import ( AindVrForagingTaskLogic, + OperantLogic, VirtualSite, _odor_mixture_from_odor_specification, _OdorSpecification, @@ -150,5 +151,31 @@ def test_tasklogic_output_deserializes(self): self.assertIsInstance(logic, AindVrForagingTaskLogic) +class TestOperantAbortVelocityThreshold(unittest.TestCase): + """The optional velocity-based operant abort field added alongside grace distance.""" + + def test_default_is_none(self): + """Defaults to None so existing (grace-distance) behavior is preserved.""" + self.assertIsNone(OperantLogic().abort_velocity_threshold) + + def test_accepts_value(self): + self.assertEqual(OperantLogic(abort_velocity_threshold=15).abort_velocity_threshold, 15.0) + + def test_rejects_negative(self): + with self.assertRaises(ValidationError): + OperantLogic(abort_velocity_threshold=-1) + + def test_backwards_compatible_deserialization(self): + """OperantLogic JSON written before this field (no key) still loads, as None.""" + legacy = { + "is_operant": True, + "stop_duration": {"family": "Scalar", "distribution_parameters": {"family": "Scalar", "value": 1.0}}, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0, + } + loaded = OperantLogic.model_validate(legacy) + self.assertIsNone(loaded.abort_velocity_threshold) + + if __name__ == "__main__": unittest.main() diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/helpers.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/helpers.py index a9a50bc0..42831560 100644 --- a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/helpers.py +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/helpers.py @@ -55,9 +55,25 @@ def make_patch( inter_patch_mean_length: float = 150, inter_patch_max_length: float = 500, delay: Optional[distributions.Distribution] = None, + is_operant: bool = False, + abort_velocity_threshold: Optional[float] = None, + grace_distance_threshold: float = 10, ) -> task_logic.Patch: """A single odor-marked reward site. One accept/reject decision per patch - (``OnChoice``/``OnRejection`` count 1); reward is non-baited.""" + (``OnChoice``/``OnRejection`` count 1); reward is non-baited. + + ``is_operant`` gates collection: when False (shaping stages) the reward is + dispensed on the delay schedule regardless of where the animal is; when True + (probability-grid stages) the animal must stay engaged and collect, so abandoning + mid-delay forfeits the reward. + + ``abort_velocity_threshold`` (cm/s) adds a velocity-based abort *alongside* the + spatial ``grace_distance_threshold`` and leaving-the-site: an operant choice aborts + if velocity exceeds it OR displacement exceeds grace OR the animal leaves the site. + It catches slow-creepers who lick while drifting forward (their velocity stays low + but they cover distance); None leaves only grace + leave-site active. When velocity + is the intended gate, raise ``grace_distance_threshold`` so the spatial source does + not also clip the creeper (leave-the-site stays as the spatial backstop).""" if delay is None: delay = task_logic.scalar_value(0.5) return task_logic.Patch( @@ -74,10 +90,11 @@ def make_patch( available=task_logic.scalar_value(999999), delay=delay, operant_logic=task_logic.OperantLogic( - is_operant=False, + is_operant=is_operant, stop_duration=stop_duration, time_to_collect_reward=100000, - grace_distance_threshold=10, + grace_distance_threshold=grace_distance_threshold, + abort_velocity_threshold=abort_velocity_threshold, ), ), patch_virtual_sites_generator=task_logic.PatchVirtualSitesGenerator( diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/stages.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/stages.py index d8887ffa..ee67bc95 100644 --- a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/stages.py +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/single_site/stages.py @@ -143,7 +143,16 @@ def _probability_grid_blocks( ) -> list[task_logic.Block]: """The 13-block band: every grid (p_A, p_B) whose sum is allowed, plus the 5% no-reward distractor odor C (occupancy 0.475 / 0.475 / 0.05).""" - make_patch_kwargs = {**_POST_STOP_PATCH_KWARGS, "delay": delay} + # Grid stages are operant with a 15 cm/s velocity abort and grace raised to 50 cm (see + # make_patch). 15 stays above this stage's static stop threshold of 8 (no + # STOP_VELOCITY_THRESHOLD updater here) as OperantLogic.abort_velocity_threshold requires. + make_patch_kwargs = { + **_POST_STOP_PATCH_KWARGS, + "delay": delay, + "is_operant": True, + "abort_velocity_threshold": 15, + "grace_distance_threshold": 50, + } return [ helpers.make_block( p_rewards=(p_a, p_b, 0.0),