diff --git a/schema/learning_sets.json b/schema/learning_sets.json new file mode 100644 index 00000000..342d231d --- /dev/null +++ b/schema/learning_sets.json @@ -0,0 +1,24065 @@ +{ + "pkg_location": "aind_behavior_vr_foraging_curricula.learning_sets", + "name": "LearningSets", + "version": "1.1.1-rc1", + "graph": { + "nodes": { + "0": { + "name": "shaping", + "task": { + "name": "AindVrForaging", + "description": "", + "task_parameters": { + "rng_seed": null, + "aind_behavior_services_pkg_version": "0.13.7", + "updaters": { + "StopVelocityThreshold": { + "operation": "Gain", + "parameters": { + "initial_value": 60.0, + "on_success": 0.93, + "on_failure": 0.0, + "increment": 0.93, + "decrement": 0.0, + "minimum": 8.0, + "maximum": 60.0 + } + }, + "StopDurationOffset": { + "operation": "Offset", + "parameters": { + "initial_value": 0.0, + "on_success": 0.01, + "on_failure": 0.0, + "increment": 0.01, + "decrement": 0.0, + "minimum": 0.0, + "maximum": 2.9 + } + } + }, + "environment": { + "blocks": [ + { + "environment": { + "environment_type": "Sequence", + "patches": [ + { + "label": "0_NonRewarded", + "state_index": 0, + "odor_specification": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "1_NonRewarded", + "state_index": 1, + "odor_specification": [ + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "2_NonRewarded", + "state_index": 2, + "odor_specification": [ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "3_NonRewarded", + "state_index": 3, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "4_NonRewarded", + "state_index": 4, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "5_NonRewarded", + "state_index": 5, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "6_NonRewarded", + "state_index": 6, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "0_Rewarded", + "state_index": 7, + "odor_specification": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "1_Rewarded", + "state_index": 8, + "odor_specification": [ + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "2_Rewarded", + "state_index": 9, + "odor_specification": [ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "3_Rewarded", + "state_index": 10, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "4_Rewarded", + "state_index": 11, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "5_Rewarded", + "state_index": 12, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "6_Rewarded", + "state_index": 13, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.1 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.025 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 70.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 25.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + } + ], + "patch_indices": [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10 + ], + "sampling_mode": "Ordered" + }, + "end_conditions": [] + } + ], + "sampling_mode": "Sequential" + }, + "operation_control": { + "movable_spout_control": { + "enabled": false, + "time_to_collect_after_reward": 1.0, + "retracting_distance": 0.0 + }, + "odor_control": { + "target_total_flow": 1000, + "target_odor_flow": 100 + }, + "position_control": { + "gain": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "initial_position": { + "x": 0.0, + "y": 2.56, + "z": 0.0 + }, + "frequency_filter_cutoff": 5.0, + "velocity_threshold": 60.0 + }, + "audio_control": { + "duration": 0.2, + "frequency": 9999.0 + }, + "wait_to_start_duration": 0.0, + "wait_to_finish_duration": 0.0 + } + }, + "version": "1.1.1-rc1", + "stage_name": "shaping" + }, + "graph": { + "nodes": { + "0": "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_introduce_negative_sites", + "1": "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_seed_stop_velocity", + "2": "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_seed_stop_duration", + "3": "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_ease_geometry" + }, + "graph": { + "0": [], + "1": [], + "2": [], + "3": [] + } + }, + "start_policies": [ + "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_introduce_negative_sites", + "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_seed_stop_velocity", + "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_seed_stop_duration", + "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_ease_geometry" + ], + "metrics_provider": "aind_behavior_vr_foraging_curricula.learning_sets.metrics.metrics_from_dataset" + }, + "1": { + "name": "graduated", + "task": { + "name": "AindVrForaging", + "description": "", + "task_parameters": { + "rng_seed": null, + "aind_behavior_services_pkg_version": "0.13.7", + "updaters": {}, + "environment": { + "blocks": [ + { + "environment": { + "environment_type": "Sequence", + "patches": [ + { + "label": "0_NonRewarded", + "state_index": 0, + "odor_specification": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "1_NonRewarded", + "state_index": 1, + "odor_specification": [ + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "2_NonRewarded", + "state_index": 2, + "odor_specification": [ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "3_NonRewarded", + "state_index": 3, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "4_NonRewarded", + "state_index": 4, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "5_NonRewarded", + "state_index": 5, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "6_NonRewarded", + "state_index": 6, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "0_Rewarded", + "state_index": 7, + "odor_specification": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "1_Rewarded", + "state_index": 8, + "odor_specification": [ + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "2_Rewarded", + "state_index": 9, + "odor_specification": [ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "3_Rewarded", + "state_index": 10, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "4_Rewarded", + "state_index": 11, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "5_Rewarded", + "state_index": 12, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + }, + { + "label": "6_Rewarded", + "state_index": 13, + "odor_specification": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "reward_specification": { + "operant_logic": { + "is_operant": false, + "stop_duration": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 3.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "time_to_collect_reward": 100000.0, + "grace_distance_threshold": 10.0 + }, + "delay": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 0.5 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "amount": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 6.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "probability": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "available": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 10.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "reward_function": [] + }, + "patch_virtual_sites_generator": { + "inter_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "InterSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 15.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + }, + "inter_patch": { + "render_specification": { + "contrast": 1.0 + }, + "label": "InterPatch", + "length_distribution": { + "family": "Exponential", + "distribution_parameters": { + "family": "Exponential", + "rate": 0.016666666666666666 + }, + "truncation_parameters": { + "truncation_mode": "exclude", + "min": 30.0, + "max": 190.0 + }, + "scaling_parameters": { + "scale": 1.0, + "offset": 30.0 + } + }, + "treadmill_specification": null + }, + "post_patch": null, + "reward_site": { + "render_specification": { + "contrast": 0.5 + }, + "label": "RewardSite", + "length_distribution": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 40.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + }, + "treadmill_specification": null + } + }, + "patch_terminators": [ + { + "terminator_type": "OnRewardSite", + "count": { + "family": "Scalar", + "distribution_parameters": { + "family": "Scalar", + "value": 1.0 + }, + "truncation_parameters": null, + "scaling_parameters": null + } + } + ] + } + ], + "patch_indices": [ + 5, + 5, + 9, + 5, + 9, + 9, + 5, + 9, + 5, + 9, + 6, + 6, + 7, + 7, + 6, + 7, + 7, + 6, + 7, + 6, + 11, + 3, + 3, + 3, + 11, + 11, + 11, + 3, + 3, + 11, + 12, + 12, + 1, + 12, + 1, + 12, + 1, + 12, + 1, + 1, + 0, + 0, + 9, + 0, + 9, + 9, + 9, + 0, + 0, + 9, + 3, + 13, + 3, + 13, + 3, + 13, + 3, + 13, + 3, + 13, + 11, + 2, + 2, + 2, + 11, + 2, + 11, + 11, + 2, + 11, + 7, + 7, + 6, + 6, + 6, + 7, + 6, + 7, + 7, + 6, + 10, + 10, + 1, + 10, + 10, + 1, + 1, + 1, + 1, + 10, + 11, + 11, + 11, + 11, + 5, + 11, + 5, + 5, + 5, + 5, + 13, + 13, + 3, + 3, + 3, + 13, + 13, + 13, + 3, + 3, + 11, + 11, + 0, + 0, + 0, + 11, + 0, + 0, + 11, + 11, + 5, + 10, + 5, + 10, + 10, + 5, + 10, + 5, + 10, + 5, + 4, + 7, + 7, + 4, + 7, + 4, + 7, + 7, + 4, + 4, + 12, + 12, + 3, + 12, + 3, + 3, + 12, + 12, + 3, + 3, + 6, + 9, + 9, + 9, + 6, + 9, + 6, + 9, + 6, + 6, + 1, + 1, + 1, + 12, + 1, + 12, + 12, + 12, + 1, + 12, + 9, + 9, + 0, + 9, + 0, + 0, + 9, + 9, + 0, + 0, + 12, + 12, + 3, + 3, + 3, + 12, + 12, + 12, + 3, + 3, + 7, + 6, + 7, + 7, + 6, + 7, + 6, + 6, + 7, + 6, + 3, + 3, + 9, + 9, + 9, + 9, + 9, + 3, + 3, + 3, + 13, + 0, + 13, + 13, + 0, + 13, + 13, + 0, + 0, + 0, + 4, + 8, + 4, + 4, + 8, + 4, + 4, + 8, + 8, + 8, + 5, + 13, + 5, + 13, + 5, + 13, + 5, + 13, + 5, + 13, + 2, + 2, + 8, + 2, + 8, + 8, + 8, + 2, + 2, + 8, + 0, + 11, + 11, + 0, + 0, + 0, + 11, + 11, + 0, + 11, + 2, + 2, + 2, + 13, + 13, + 13, + 2, + 13, + 2, + 13, + 5, + 11, + 11, + 11, + 5, + 11, + 5, + 5, + 11, + 5, + 8, + 2, + 8, + 2, + 8, + 2, + 8, + 8, + 2, + 2, + 6, + 10, + 6, + 10, + 6, + 10, + 6, + 10, + 6, + 10, + 1, + 9, + 1, + 1, + 1, + 9, + 9, + 9, + 9, + 1, + 4, + 4, + 10, + 4, + 10, + 10, + 4, + 4, + 10, + 10, + 9, + 9, + 0, + 0, + 9, + 9, + 0, + 0, + 0, + 9, + 11, + 6, + 11, + 11, + 6, + 6, + 11, + 6, + 6, + 11, + 0, + 0, + 0, + 9, + 9, + 9, + 0, + 9, + 0, + 9, + 13, + 13, + 3, + 3, + 13, + 13, + 3, + 13, + 3, + 3, + 9, + 5, + 9, + 5, + 9, + 9, + 5, + 9, + 5, + 5, + 0, + 13, + 13, + 13, + 0, + 0, + 0, + 13, + 13, + 0, + 3, + 3, + 3, + 3, + 11, + 11, + 11, + 3, + 11, + 11, + 0, + 13, + 13, + 0, + 13, + 0, + 0, + 13, + 0, + 13, + 3, + 12, + 3, + 3, + 12, + 12, + 12, + 3, + 3, + 12, + 2, + 11, + 11, + 2, + 2, + 2, + 11, + 11, + 2, + 11, + 1, + 1, + 10, + 10, + 10, + 10, + 1, + 10, + 1, + 1, + 0, + 0, + 0, + 13, + 13, + 13, + 13, + 0, + 13, + 0, + 5, + 5, + 10, + 5, + 5, + 10, + 10, + 10, + 10, + 5, + 2, + 11, + 11, + 2, + 2, + 2, + 11, + 2, + 11, + 11, + 12, + 12, + 12, + 3, + 12, + 3, + 3, + 12, + 3, + 3, + 0, + 8, + 0, + 8, + 8, + 0, + 0, + 8, + 0, + 8, + 3, + 13, + 13, + 13, + 3, + 3, + 13, + 3, + 3, + 13, + 8, + 0, + 8, + 0, + 8, + 0, + 8, + 0, + 8, + 0, + 12, + 3, + 12, + 12, + 12, + 12, + 3, + 3, + 3, + 3, + 8, + 6, + 8, + 6, + 8, + 8, + 6, + 6, + 8, + 6, + 4, + 10, + 10, + 4, + 10, + 4, + 4, + 10, + 10, + 4, + 2, + 2, + 2, + 2, + 13, + 2, + 13, + 13, + 13, + 13, + 0, + 0, + 0, + 12, + 0, + 12, + 12, + 12, + 0, + 12, + 3, + 3, + 11, + 3, + 3, + 11, + 3, + 11, + 11, + 11, + 0, + 9, + 9, + 9, + 0, + 0, + 0, + 0, + 9, + 9, + 11, + 6, + 11, + 6, + 6, + 11, + 11, + 6, + 6, + 11, + 12, + 12, + 3, + 12, + 12, + 3, + 3, + 3, + 12, + 3, + 4, + 7, + 7, + 4, + 7, + 7, + 4, + 4, + 7, + 4, + 1, + 10, + 10, + 10, + 10, + 1, + 10, + 1, + 1, + 1, + 12, + 12, + 4, + 4, + 12, + 4, + 4, + 4, + 12, + 12, + 10, + 10, + 1, + 10, + 1, + 10, + 1, + 1, + 10, + 1, + 12, + 12, + 12, + 2, + 2, + 2, + 12, + 12, + 2, + 2, + 7, + 1, + 7, + 1, + 1, + 1, + 1, + 7, + 7, + 7, + 3, + 3, + 3, + 13, + 3, + 13, + 13, + 13, + 13, + 3, + 0, + 0, + 0, + 12, + 12, + 12, + 12, + 12, + 0, + 0, + 2, + 11, + 2, + 11, + 11, + 11, + 2, + 2, + 2, + 11, + 6, + 6, + 6, + 6, + 7, + 7, + 7, + 6, + 7, + 7, + 9, + 3, + 9, + 9, + 9, + 9, + 3, + 3, + 3, + 3, + 6, + 12, + 6, + 12, + 12, + 12, + 6, + 6, + 12, + 6, + 3, + 3, + 3, + 9, + 9, + 9, + 3, + 9, + 9, + 3, + 12, + 4, + 4, + 12, + 12, + 12, + 12, + 4, + 4, + 4, + 8, + 8, + 6, + 8, + 6, + 6, + 6, + 8, + 6, + 8, + 11, + 11, + 3, + 11, + 3, + 11, + 3, + 11, + 3, + 3, + 13, + 1, + 13, + 13, + 13, + 13, + 1, + 1, + 1, + 1, + 11, + 2, + 2, + 2, + 11, + 11, + 11, + 11, + 2, + 2, + 1, + 1, + 1, + 12, + 1, + 12, + 12, + 12, + 12, + 1, + 2, + 10, + 2, + 10, + 2, + 2, + 10, + 10, + 2, + 10, + 13, + 0, + 13, + 0, + 13, + 0, + 0, + 13, + 13, + 0, + 3, + 3, + 3, + 9, + 9, + 3, + 9, + 9, + 3, + 9, + 13, + 1, + 1, + 13, + 13, + 1, + 13, + 1, + 13, + 1, + 9, + 3, + 3, + 9, + 9, + 3, + 3, + 9, + 9, + 3, + 8, + 6, + 8, + 8, + 6, + 8, + 6, + 6, + 8, + 6, + 10, + 4, + 10, + 4, + 4, + 4, + 10, + 10, + 10, + 4, + 0, + 0, + 0, + 12, + 12, + 0, + 12, + 12, + 12, + 0, + 8, + 8, + 4, + 4, + 8, + 8, + 4, + 8, + 4, + 4, + 3, + 3, + 9, + 9, + 3, + 9, + 9, + 9, + 3, + 3, + 8, + 0, + 0, + 0, + 8, + 8, + 8, + 0, + 0, + 8, + 11, + 11, + 2, + 2, + 2, + 11, + 11, + 11, + 2, + 2, + 10, + 10, + 0, + 0, + 10, + 10, + 0, + 10, + 0, + 0, + 11, + 11, + 1, + 1, + 11, + 11, + 1, + 1, + 1, + 11, + 10, + 10, + 0, + 10, + 0, + 0, + 0, + 10, + 0, + 10, + 5, + 5, + 11, + 5, + 5, + 11, + 11, + 11, + 11, + 5, + 0, + 0, + 9, + 0, + 0, + 9, + 9, + 0, + 9, + 9, + 1, + 10, + 10, + 1, + 10, + 10, + 10, + 1, + 1, + 1, + 12, + 2, + 12, + 2, + 12, + 2, + 12, + 2, + 12, + 2, + 10, + 10, + 10, + 10, + 0, + 10, + 0, + 0, + 0, + 0, + 12, + 1, + 12, + 12, + 1, + 12, + 1, + 1, + 12, + 1, + 2, + 13, + 13, + 13, + 2, + 2, + 13, + 2, + 13, + 2, + 8, + 4, + 4, + 4, + 4, + 8, + 8, + 8, + 8, + 4, + 7, + 6, + 7, + 7, + 6, + 7, + 6, + 6, + 6, + 7, + 10, + 10, + 2, + 2, + 2, + 10, + 10, + 2, + 10, + 2, + 7, + 7, + 5, + 5, + 5, + 5, + 7, + 7, + 7, + 5, + 11, + 11, + 6, + 11, + 6, + 6, + 11, + 6, + 11, + 6, + 1, + 7, + 1, + 7, + 7, + 7, + 1, + 1, + 7, + 1, + 4, + 13, + 13, + 4, + 4, + 13, + 13, + 4, + 13, + 4, + 2, + 2, + 10, + 2, + 10, + 10, + 10, + 10, + 2, + 2, + 0, + 8, + 0, + 0, + 8, + 0, + 8, + 8, + 0, + 8, + 5, + 13, + 5, + 5, + 5, + 5, + 13, + 13, + 13, + 13, + 3, + 8, + 3, + 8, + 3, + 3, + 8, + 8, + 3, + 8, + 4, + 13, + 4, + 13, + 4, + 13, + 4, + 13, + 13, + 4, + 8, + 8, + 2, + 8, + 2, + 2, + 8, + 8, + 2, + 2, + 6, + 12, + 12, + 12, + 12, + 6, + 6, + 6, + 6, + 12, + 9, + 9, + 1, + 9, + 9, + 1, + 1, + 1, + 9, + 1, + 0, + 0, + 12, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 8, + 4, + 8, + 4, + 4, + 8, + 4, + 8, + 4, + 8, + 0, + 0, + 13, + 0, + 13, + 13, + 0, + 13, + 13, + 0, + 1, + 1, + 1, + 10, + 10, + 10, + 1, + 1, + 10, + 10, + 12, + 6, + 6, + 12, + 12, + 6, + 12, + 6, + 6, + 12, + 8, + 8, + 8, + 8, + 8, + 3, + 3, + 3, + 3, + 3, + 13, + 5, + 5, + 5, + 13, + 5, + 13, + 13, + 13, + 5, + 8, + 8, + 4, + 4, + 8, + 8, + 4, + 4, + 4, + 8, + 10, + 10, + 2, + 2, + 2, + 10, + 10, + 10, + 2, + 2, + 11, + 11, + 6, + 6, + 6, + 6, + 11, + 11, + 6, + 11, + 0, + 12, + 0, + 0, + 12, + 12, + 0, + 12, + 0, + 12, + 10, + 10, + 1, + 10, + 1, + 1, + 10, + 1, + 10, + 1, + 12, + 0, + 0, + 12, + 12, + 0, + 0, + 0, + 12, + 12, + 3, + 3, + 3, + 3, + 3, + 13, + 13, + 13, + 13, + 13, + 5, + 9, + 5, + 9, + 5, + 5, + 9, + 5, + 9, + 9, + 0, + 0, + 0, + 13, + 0, + 13, + 13, + 0, + 13, + 13, + 12, + 3, + 12, + 3, + 12, + 12, + 3, + 12, + 3, + 3, + 9, + 6, + 6, + 9, + 6, + 6, + 6, + 9, + 9, + 9, + 8, + 4, + 4, + 8, + 4, + 8, + 8, + 4, + 4, + 8, + 2, + 2, + 2, + 10, + 10, + 10, + 2, + 2, + 10, + 10, + 11, + 5, + 5, + 11, + 11, + 11, + 11, + 5, + 5, + 5, + 0, + 8, + 0, + 8, + 0, + 0, + 8, + 8, + 8, + 0, + 6, + 6, + 9, + 9, + 6, + 6, + 6, + 9, + 9, + 9, + 7, + 7, + 1, + 7, + 1, + 1, + 7, + 1, + 7, + 1, + 2, + 2, + 12, + 12, + 12, + 12, + 2, + 12, + 2, + 2, + 7, + 7, + 3, + 3, + 3, + 3, + 3, + 7, + 7, + 7, + 12, + 4, + 12, + 4, + 4, + 12, + 12, + 4, + 4, + 12, + 1, + 13, + 13, + 13, + 13, + 13, + 1, + 1, + 1, + 1, + 0, + 9, + 9, + 0, + 0, + 0, + 9, + 0, + 9, + 9, + 5, + 5, + 10, + 10, + 5, + 5, + 10, + 5, + 10, + 10, + 13, + 13, + 0, + 0, + 13, + 13, + 0, + 0, + 13, + 0, + 11, + 2, + 2, + 2, + 11, + 11, + 11, + 11, + 2, + 2, + 8, + 3, + 8, + 3, + 3, + 8, + 3, + 8, + 8, + 3, + 5, + 5, + 7, + 7, + 5, + 7, + 5, + 5, + 7, + 7, + 4, + 13, + 4, + 13, + 13, + 13, + 4, + 13, + 4, + 4, + 12, + 12, + 12, + 3, + 3, + 3, + 3, + 3, + 12, + 12, + 2, + 2, + 2, + 11, + 2, + 11, + 11, + 11, + 2, + 11, + 13, + 0, + 0, + 0, + 13, + 0, + 13, + 0, + 13, + 13, + 1, + 9, + 9, + 1, + 9, + 1, + 1, + 9, + 9, + 1, + 4, + 4, + 4, + 4, + 12, + 12, + 12, + 12, + 4, + 12, + 10, + 0, + 10, + 10, + 0, + 0, + 10, + 0, + 0, + 10, + 12, + 12, + 12, + 12, + 4, + 12, + 4, + 4, + 4, + 4, + 9, + 9, + 1, + 9, + 1, + 9, + 1, + 9, + 1, + 1, + 11, + 11, + 5, + 11, + 11, + 11, + 5, + 5, + 5, + 5, + 3, + 13, + 13, + 13, + 3, + 13, + 3, + 13, + 3, + 3, + 12, + 12, + 0, + 0, + 0, + 12, + 12, + 12, + 0, + 0, + 1, + 1, + 11, + 1, + 11, + 11, + 1, + 1, + 11, + 11, + 9, + 9, + 9, + 9, + 0, + 0, + 0, + 0, + 9, + 0, + 8, + 5, + 5, + 8, + 8, + 5, + 5, + 8, + 5, + 8, + 10, + 10, + 6, + 6, + 6, + 10, + 6, + 10, + 10, + 6, + 12, + 12, + 1, + 1, + 1, + 1, + 12, + 12, + 12, + 1, + 0, + 0, + 10, + 10, + 10, + 10, + 10, + 0, + 0, + 0, + 2, + 13, + 13, + 13, + 2, + 13, + 2, + 2, + 13, + 2, + 12, + 3, + 3, + 12, + 3, + 3, + 12, + 12, + 12, + 3, + 2, + 2, + 2, + 11, + 11, + 2, + 11, + 11, + 2, + 11, + 0, + 0, + 0, + 8, + 8, + 0, + 8, + 0, + 8, + 8, + 11, + 11, + 2, + 11, + 2, + 11, + 2, + 11, + 2, + 2, + 12, + 3, + 12, + 12, + 12, + 3, + 3, + 3, + 12, + 3, + 13, + 1, + 1, + 13, + 13, + 1, + 13, + 1, + 1, + 13, + 9, + 0, + 0, + 9, + 0, + 9, + 0, + 0, + 9, + 9, + 3, + 12, + 3, + 3, + 12, + 3, + 12, + 12, + 12, + 3, + 7, + 2, + 7, + 7, + 2, + 2, + 2, + 7, + 2, + 7, + 10, + 10, + 1, + 10, + 1, + 10, + 1, + 1, + 10, + 1, + 7, + 7, + 7, + 4, + 4, + 7, + 4, + 4, + 7, + 4, + 1, + 1, + 1, + 10, + 10, + 10, + 10, + 10, + 1, + 1, + 7, + 2, + 7, + 2, + 2, + 7, + 7, + 2, + 2, + 7, + 3, + 3, + 8, + 3, + 8, + 8, + 8, + 3, + 3, + 8, + 9, + 6, + 6, + 6, + 6, + 9, + 6, + 9, + 9, + 9, + 12, + 12, + 1, + 12, + 1, + 1, + 1, + 1, + 12, + 12, + 13, + 2, + 13, + 13, + 13, + 2, + 2, + 2, + 13, + 2, + 0, + 0, + 0, + 12, + 0, + 0, + 12, + 12, + 12, + 12, + 4, + 10, + 10, + 10, + 4, + 4, + 4, + 4, + 10, + 10, + 12, + 12, + 1, + 1, + 1, + 1, + 12, + 1, + 12, + 12, + 7, + 3, + 3, + 7, + 3, + 7, + 7, + 3, + 3, + 7, + 5, + 8, + 8, + 5, + 8, + 5, + 8, + 5, + 5, + 8, + 10, + 10, + 2, + 2, + 2, + 10, + 10, + 2, + 2, + 10, + 6, + 6, + 7, + 7, + 6, + 7, + 7, + 7, + 6, + 6, + 5, + 8, + 5, + 5, + 5, + 5, + 8, + 8, + 8, + 8, + 2, + 2, + 7, + 7, + 7, + 2, + 2, + 2, + 7, + 7, + 3, + 3, + 12, + 3, + 3, + 12, + 12, + 12, + 3, + 12, + 2, + 2, + 2, + 2, + 2, + 13, + 13, + 13, + 13, + 13, + 12, + 12, + 3, + 3, + 3, + 12, + 12, + 3, + 12, + 3, + 8, + 6, + 8, + 6, + 6, + 8, + 8, + 6, + 6, + 8, + 11, + 2, + 2, + 2, + 11, + 11, + 11, + 2, + 11, + 2, + 6, + 7, + 7, + 6, + 6, + 6, + 7, + 7, + 6, + 7, + 11, + 11, + 1, + 1, + 1, + 11, + 1, + 11, + 11, + 1, + 10, + 10, + 10, + 10, + 0, + 0, + 10, + 0, + 0, + 0, + 13, + 13, + 13, + 13, + 1, + 1, + 1, + 13, + 1, + 1, + 4, + 7, + 4, + 4, + 7, + 7, + 7, + 7, + 4, + 4, + 8, + 3, + 8, + 8, + 3, + 3, + 8, + 8, + 3, + 3, + 5, + 5, + 11, + 11, + 11, + 5, + 11, + 5, + 5, + 11, + 9, + 9, + 1, + 9, + 1, + 1, + 9, + 9, + 1, + 1, + 7, + 7, + 5, + 5, + 7, + 7, + 5, + 5, + 5, + 7, + 6, + 6, + 9, + 6, + 9, + 9, + 6, + 9, + 6, + 9, + 8, + 3, + 8, + 3, + 3, + 8, + 3, + 3, + 8, + 8, + 13, + 5, + 5, + 13, + 5, + 13, + 13, + 5, + 5, + 13, + 0, + 9, + 0, + 0, + 0, + 9, + 0, + 9, + 9, + 9, + 6, + 6, + 6, + 12, + 12, + 12, + 6, + 12, + 6, + 12, + 1, + 1, + 7, + 7, + 1, + 1, + 7, + 7, + 7, + 1, + 5, + 5, + 5, + 9, + 9, + 5, + 9, + 9, + 9, + 5, + 1, + 1, + 10, + 10, + 1, + 1, + 10, + 1, + 10, + 10, + 6, + 9, + 9, + 6, + 6, + 9, + 6, + 9, + 9, + 6, + 4, + 10, + 4, + 10, + 4, + 10, + 4, + 10, + 10, + 4, + 12, + 2, + 2, + 12, + 12, + 12, + 12, + 2, + 2, + 2, + 11, + 11, + 11, + 3, + 11, + 3, + 3, + 11, + 3, + 3, + 7, + 7, + 5, + 5, + 7, + 7, + 5, + 5, + 7, + 5, + 13, + 13, + 13, + 4, + 4, + 4, + 4, + 13, + 4, + 13, + 0, + 0, + 9, + 0, + 0, + 9, + 9, + 9, + 9, + 0, + 13, + 13, + 13, + 4, + 4, + 13, + 4, + 4, + 13, + 4, + 10, + 2, + 10, + 2, + 10, + 2, + 10, + 2, + 10, + 2, + 6, + 11, + 11, + 6, + 6, + 6, + 11, + 6, + 11, + 11, + 7, + 7, + 7, + 2, + 2, + 7, + 2, + 2, + 7, + 2, + 5, + 5, + 10, + 5, + 10, + 10, + 5, + 10, + 5, + 10, + 4, + 4, + 13, + 13, + 4, + 13, + 13, + 13, + 4, + 4, + 1, + 9, + 1, + 1, + 9, + 9, + 1, + 9, + 1, + 9, + 11, + 3, + 3, + 3, + 11, + 11, + 3, + 11, + 11, + 3, + 8, + 2, + 2, + 8, + 8, + 2, + 2, + 2, + 8, + 8, + 13, + 3, + 3, + 3, + 3, + 13, + 13, + 13, + 3, + 13, + 9, + 0, + 9, + 0, + 9, + 0, + 0, + 0, + 9, + 9, + 13, + 13, + 1, + 1, + 1, + 13, + 13, + 1, + 13, + 1, + 10, + 4, + 10, + 10, + 4, + 4, + 10, + 4, + 10, + 4, + 7, + 7, + 7, + 2, + 2, + 2, + 2, + 2, + 7, + 7, + 12, + 12, + 3, + 3, + 12, + 3, + 3, + 12, + 3, + 12, + 9, + 6, + 6, + 9, + 9, + 6, + 9, + 6, + 9, + 6, + 0, + 11, + 0, + 11, + 0, + 11, + 11, + 0, + 0, + 11, + 10, + 10, + 1, + 10, + 1, + 10, + 10, + 1, + 1, + 1, + 6, + 9, + 9, + 9, + 6, + 9, + 6, + 9, + 6, + 6, + 0, + 0, + 0, + 0, + 11, + 11, + 11, + 11, + 11, + 0, + 12, + 12, + 3, + 3, + 3, + 12, + 12, + 3, + 3, + 12, + 11, + 11, + 11, + 11, + 6, + 6, + 6, + 6, + 6, + 11, + 8, + 8, + 3, + 3, + 3, + 8, + 8, + 3, + 8, + 3, + 4, + 13, + 13, + 4, + 4, + 4, + 13, + 13, + 13, + 4, + 8, + 2, + 8, + 8, + 2, + 2, + 2, + 2, + 8, + 8, + 11, + 11, + 5, + 5, + 5, + 5, + 11, + 11, + 11, + 5, + 9, + 6, + 6, + 6, + 9, + 9, + 9, + 6, + 9, + 6, + 10, + 5, + 5, + 5, + 10, + 5, + 5, + 10, + 10, + 10, + 11, + 1, + 11, + 1, + 11, + 11, + 1, + 11, + 1, + 1, + 12, + 12, + 12, + 2, + 2, + 2, + 12, + 12, + 2, + 2, + 0, + 11, + 0, + 11, + 0, + 11, + 11, + 0, + 0, + 11, + 6, + 6, + 8, + 8, + 8, + 6, + 6, + 8, + 8, + 6, + 9, + 3, + 3, + 3, + 3, + 9, + 3, + 9, + 9, + 9, + 1, + 1, + 13, + 13, + 1, + 1, + 13, + 1, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 4, + 4, + 4, + 4, + 4, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 8, + 6, + 9, + 9, + 9, + 6, + 6, + 9, + 6, + 6, + 9, + 11, + 11, + 11, + 11, + 0, + 0, + 11, + 0, + 0, + 0, + 2, + 10, + 2, + 10, + 2, + 10, + 2, + 10, + 2, + 10, + 13, + 4, + 13, + 13, + 4, + 13, + 4, + 4, + 13, + 4, + 5, + 9, + 5, + 9, + 5, + 9, + 5, + 9, + 9, + 5, + 1, + 13, + 1, + 13, + 1, + 1, + 13, + 1, + 13, + 13, + 4, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 4, + 9, + 1, + 10, + 1, + 10, + 10, + 1, + 10, + 10, + 1, + 1, + 2, + 12, + 2, + 12, + 12, + 2, + 2, + 12, + 12, + 2, + 8, + 8, + 6, + 6, + 6, + 8, + 6, + 8, + 8, + 6, + 2, + 10, + 2, + 10, + 2, + 2, + 10, + 10, + 10, + 2, + 13, + 5, + 5, + 5, + 5, + 13, + 13, + 5, + 13, + 13, + 0, + 11, + 0, + 11, + 11, + 0, + 0, + 11, + 0, + 11, + 2, + 2, + 2, + 13, + 2, + 13, + 2, + 13, + 13, + 13, + 4, + 8, + 4, + 4, + 8, + 8, + 4, + 8, + 8, + 4, + 10, + 5, + 5, + 10, + 10, + 10, + 5, + 5, + 5, + 10, + 0, + 0, + 0, + 9, + 0, + 9, + 9, + 9, + 0, + 9, + 12, + 12, + 1, + 12, + 1, + 1, + 12, + 1, + 1, + 12, + 6, + 11, + 6, + 11, + 11, + 6, + 11, + 6, + 11, + 6, + 1, + 9, + 1, + 1, + 1, + 9, + 1, + 9, + 9, + 9, + 10, + 6, + 6, + 10, + 6, + 6, + 10, + 10, + 10, + 6, + 4, + 4, + 9, + 9, + 4, + 4, + 9, + 4, + 9, + 9, + 3, + 8, + 3, + 8, + 8, + 3, + 8, + 8, + 3, + 3, + 2, + 2, + 7, + 2, + 2, + 2, + 7, + 7, + 7, + 7, + 6, + 11, + 6, + 6, + 11, + 6, + 6, + 11, + 11, + 11, + 12, + 0, + 0, + 0, + 12, + 12, + 0, + 12, + 0, + 12, + 11, + 11, + 11, + 3, + 3, + 3, + 11, + 3, + 11, + 3, + 8, + 8, + 0, + 8, + 0, + 0, + 8, + 0, + 8, + 0, + 2, + 12, + 2, + 2, + 2, + 12, + 12, + 12, + 2, + 12, + 1, + 1, + 10, + 10, + 10, + 10, + 1, + 10, + 1, + 1, + 13, + 0, + 0, + 13, + 0, + 0, + 13, + 13, + 0, + 13, + 8, + 2, + 2, + 8, + 8, + 8, + 2, + 8, + 2, + 2, + 6, + 12, + 6, + 6, + 6, + 12, + 6, + 12, + 12, + 12, + 2, + 10, + 10, + 10, + 2, + 10, + 2, + 2, + 2, + 10, + 11, + 0, + 0, + 0, + 11, + 11, + 11, + 0, + 0, + 11, + 12, + 1, + 12, + 12, + 12, + 12, + 1, + 1, + 1, + 1, + 9, + 9, + 9, + 4, + 4, + 4, + 4, + 4, + 9, + 9, + 12, + 1, + 12, + 12, + 1, + 1, + 1, + 12, + 12, + 1, + 2, + 2, + 2, + 10, + 2, + 10, + 10, + 10, + 10, + 2, + 6, + 6, + 11, + 11, + 6, + 6, + 11, + 11, + 6, + 11, + 0, + 10, + 10, + 0, + 0, + 10, + 10, + 0, + 10, + 0, + 13, + 2, + 13, + 13, + 13, + 2, + 2, + 2, + 13, + 2, + 4, + 4, + 12, + 4, + 12, + 4, + 12, + 12, + 4, + 12, + 1, + 1, + 7, + 1, + 7, + 7, + 1, + 1, + 7, + 7, + 3, + 13, + 13, + 13, + 3, + 13, + 3, + 13, + 3, + 3, + 12, + 0, + 12, + 12, + 0, + 12, + 12, + 0, + 0, + 0, + 11, + 6, + 11, + 6, + 11, + 11, + 6, + 6, + 6, + 11, + 3, + 3, + 7, + 3, + 7, + 7, + 7, + 3, + 7, + 3, + 12, + 1, + 12, + 1, + 12, + 1, + 1, + 12, + 12, + 1, + 10, + 10, + 6, + 6, + 6, + 10, + 10, + 10, + 6, + 6, + 12, + 4, + 4, + 12, + 4, + 12, + 4, + 12, + 12, + 4, + 1, + 9, + 1, + 1, + 1, + 9, + 9, + 9, + 9, + 1, + 0, + 12, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 12, + 4, + 9, + 4, + 4, + 9, + 4, + 9, + 4, + 9, + 9, + 8, + 8, + 6, + 6, + 8, + 8, + 6, + 6, + 8, + 6, + 2, + 2, + 10, + 2, + 10, + 2, + 2, + 10, + 10, + 10, + 6, + 6, + 6, + 7, + 6, + 7, + 6, + 7, + 7, + 7, + 10, + 1, + 1, + 10, + 1, + 10, + 10, + 1, + 10, + 1, + 6, + 9, + 6, + 9, + 9, + 9, + 6, + 6, + 6, + 9, + 5, + 5, + 5, + 11, + 5, + 11, + 5, + 11, + 11, + 11, + 8, + 8, + 0, + 0, + 0, + 8, + 8, + 8, + 0, + 0, + 3, + 11, + 11, + 3, + 11, + 3, + 3, + 11, + 11, + 3, + 7, + 5, + 5, + 7, + 5, + 5, + 7, + 5, + 7, + 7, + 11, + 11, + 1, + 1, + 1, + 11, + 11, + 1, + 11, + 1, + 0, + 0, + 9, + 0, + 0, + 9, + 9, + 9, + 9, + 0, + 10, + 10, + 10, + 5, + 5, + 5, + 10, + 5, + 10, + 5, + 2, + 2, + 2, + 2, + 11, + 11, + 11, + 11, + 11, + 2, + 1, + 10, + 1, + 1, + 10, + 1, + 10, + 10, + 10, + 1, + 4, + 4, + 7, + 4, + 7, + 4, + 7, + 7, + 4, + 7, + 9, + 6, + 6, + 9, + 6, + 6, + 9, + 6, + 9, + 9, + 1, + 7, + 1, + 7, + 7, + 1, + 7, + 7, + 1, + 1, + 6, + 9, + 6, + 9, + 6, + 9, + 6, + 9, + 6, + 9, + 1, + 11, + 1, + 11, + 1, + 11, + 1, + 11, + 1, + 11, + 7, + 7, + 2, + 2, + 7, + 7, + 2, + 7, + 2, + 2, + 11, + 5, + 11, + 5, + 11, + 5, + 5, + 5, + 11, + 11, + 7, + 7, + 7, + 7, + 6, + 6, + 7, + 6, + 6, + 6, + 8, + 4, + 8, + 4, + 8, + 4, + 4, + 8, + 8, + 4, + 13, + 3, + 13, + 3, + 13, + 3, + 13, + 3, + 13, + 3, + 7, + 7, + 1, + 7, + 1, + 7, + 7, + 1, + 1, + 1, + 9, + 9, + 6, + 6, + 6, + 9, + 6, + 9, + 6, + 9, + 5, + 10, + 5, + 5, + 10, + 5, + 10, + 10, + 10, + 5, + 8, + 0, + 0, + 8, + 8, + 0, + 0, + 8, + 0, + 8, + 11, + 2, + 2, + 2, + 2, + 11, + 2, + 11, + 11, + 11, + 7, + 7, + 1, + 1, + 7, + 1, + 1, + 7, + 7, + 1, + 6, + 9, + 9, + 6, + 6, + 6, + 9, + 9, + 6, + 9, + 12, + 12, + 12, + 12, + 4, + 4, + 4, + 12, + 4, + 4, + 10, + 10, + 1, + 10, + 1, + 1, + 10, + 1, + 1, + 10, + 13, + 0, + 0, + 13, + 0, + 0, + 13, + 13, + 0, + 13, + 5, + 8, + 5, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 13, + 13, + 4, + 4, + 4, + 4, + 4, + 13, + 13, + 13, + 0, + 0, + 10, + 10, + 10, + 0, + 10, + 10, + 0, + 0, + 6, + 11, + 6, + 11, + 11, + 11, + 11, + 6, + 6, + 6, + 0, + 8, + 0, + 8, + 0, + 0, + 8, + 8, + 0, + 8, + 9, + 9, + 4, + 9, + 4, + 4, + 9, + 4, + 4, + 9, + 6, + 10, + 10, + 10, + 6, + 10, + 10, + 6, + 6, + 6, + 1, + 1, + 1, + 7, + 1, + 7, + 7, + 1, + 7, + 7, + 13, + 13, + 4, + 4, + 13, + 4, + 4, + 13, + 4, + 13, + 8, + 0, + 8, + 0, + 0, + 8, + 8, + 0, + 8, + 0, + 3, + 9, + 9, + 3, + 3, + 3, + 3, + 9, + 9, + 9, + 8, + 8, + 8, + 0, + 0, + 8, + 8, + 0, + 0, + 0, + 12, + 12, + 12, + 12, + 2, + 2, + 2, + 2, + 2, + 12, + 10, + 0, + 0, + 10, + 0, + 10, + 10, + 0, + 0, + 10, + 8, + 8, + 4, + 8, + 8, + 8, + 4, + 4, + 4, + 4, + 7, + 2, + 7, + 2, + 2, + 2, + 7, + 7, + 7, + 2, + 1, + 10, + 1, + 10, + 10, + 10, + 10, + 1, + 1, + 1, + 5, + 5, + 9, + 9, + 9, + 9, + 9, + 5, + 5, + 5, + 7, + 7, + 6, + 6, + 6, + 7, + 7, + 7, + 6, + 6, + 10, + 1, + 10, + 1, + 10, + 10, + 1, + 1, + 1, + 10, + 11, + 11, + 0, + 0, + 0, + 0, + 11, + 11, + 11, + 0, + 5, + 5, + 5, + 9, + 5, + 9, + 9, + 9, + 9, + 5, + 7, + 7, + 1, + 1, + 1, + 7, + 1, + 7, + 7, + 1, + 4, + 13, + 4, + 13, + 13, + 13, + 4, + 4, + 4, + 13, + 7, + 5, + 7, + 5, + 5, + 7, + 5, + 7, + 7, + 5, + 2, + 11, + 11, + 2, + 2, + 11, + 11, + 11, + 2, + 2, + 1, + 1, + 12, + 1, + 1, + 12, + 12, + 12, + 12, + 1, + 7, + 2, + 7, + 7, + 7, + 2, + 7, + 2, + 2, + 2, + 5, + 11, + 5, + 11, + 11, + 5, + 5, + 11, + 11, + 5, + 9, + 1, + 1, + 1, + 9, + 9, + 1, + 9, + 1, + 9, + 12, + 12, + 3, + 3, + 3, + 12, + 3, + 12, + 3, + 12, + 6, + 6, + 6, + 7, + 6, + 6, + 7, + 7, + 7, + 7, + 9, + 9, + 9, + 3, + 3, + 9, + 3, + 3, + 3, + 9, + 12, + 12, + 12, + 0, + 12, + 0, + 0, + 12, + 0, + 0, + 4, + 10, + 10, + 4, + 4, + 4, + 4, + 10, + 10, + 10, + 8, + 8, + 5, + 5, + 8, + 5, + 8, + 5, + 8, + 5, + 3, + 3, + 9, + 9, + 3, + 3, + 3, + 9, + 9, + 9, + 13, + 1, + 1, + 13, + 1, + 13, + 13, + 1, + 13, + 1, + 4, + 12, + 4, + 12, + 12, + 4, + 12, + 4, + 4, + 12, + 10, + 2, + 2, + 2, + 10, + 10, + 10, + 2, + 2, + 10, + 11, + 5, + 5, + 11, + 11, + 5, + 5, + 5, + 11, + 11, + 7, + 7, + 7, + 7, + 6, + 6, + 7, + 6, + 6, + 6, + 5, + 11, + 11, + 5, + 5, + 11, + 5, + 11, + 5, + 11, + 0, + 0, + 0, + 13, + 0, + 13, + 13, + 13, + 13, + 0, + 8, + 8, + 2, + 8, + 2, + 2, + 8, + 8, + 2, + 2, + 7, + 6, + 7, + 7, + 6, + 7, + 6, + 6, + 6, + 7, + 3, + 3, + 12, + 3, + 12, + 12, + 12, + 3, + 12, + 3, + 9, + 6, + 6, + 6, + 9, + 9, + 9, + 6, + 9, + 6, + 4, + 4, + 10, + 4, + 4, + 4, + 10, + 10, + 10, + 10, + 1, + 9, + 9, + 1, + 9, + 9, + 1, + 1, + 9, + 1, + 12, + 0, + 0, + 12, + 12, + 12, + 0, + 12, + 0, + 0, + 1, + 10, + 10, + 10, + 1, + 1, + 10, + 1, + 1, + 10, + 5, + 7, + 5, + 7, + 7, + 5, + 7, + 5, + 5, + 7, + 6, + 6, + 10, + 10, + 10, + 10, + 6, + 10, + 6, + 6, + 0, + 12, + 0, + 0, + 0, + 12, + 12, + 12, + 0, + 12, + 3, + 3, + 3, + 13, + 3, + 13, + 13, + 13, + 13, + 3, + 9, + 1, + 1, + 1, + 9, + 9, + 9, + 1, + 9, + 1, + 12, + 0, + 0, + 12, + 12, + 12, + 12, + 0, + 0, + 0, + 1, + 1, + 13, + 1, + 13, + 13, + 13, + 1, + 13, + 1, + 9, + 9, + 9, + 5, + 5, + 9, + 5, + 5, + 5, + 9, + 4, + 4, + 4, + 8, + 4, + 8, + 4, + 8, + 8, + 8, + 2, + 2, + 7, + 2, + 7, + 7, + 7, + 2, + 7, + 2, + 10, + 10, + 5, + 10, + 10, + 5, + 5, + 10, + 5, + 5, + 11, + 2, + 11, + 11, + 11, + 2, + 11, + 2, + 2, + 2, + 7, + 6, + 6, + 7, + 6, + 7, + 6, + 7, + 7, + 6, + 2, + 11, + 2, + 11, + 2, + 11, + 2, + 11, + 2, + 11, + 3, + 13, + 3, + 13, + 3, + 13, + 13, + 13, + 3, + 3, + 4, + 4, + 4, + 12, + 4, + 12, + 4, + 12, + 12, + 12, + 10, + 10, + 10, + 10, + 1, + 1, + 1, + 1, + 1, + 10, + 5, + 7, + 7, + 7, + 5, + 7, + 5, + 5, + 7, + 5, + 13, + 13, + 13, + 1, + 1, + 13, + 1, + 1, + 1, + 13, + 3, + 9, + 9, + 3, + 9, + 9, + 3, + 9, + 3, + 3, + 13, + 4, + 4, + 4, + 13, + 13, + 4, + 13, + 13, + 4, + 5, + 7, + 7, + 7, + 5, + 5, + 7, + 5, + 5, + 7, + 2, + 2, + 11, + 2, + 2, + 11, + 11, + 11, + 11, + 2, + 3, + 3, + 13, + 13, + 13, + 13, + 3, + 3, + 3, + 13, + 11, + 0, + 0, + 11, + 0, + 11, + 0, + 11, + 0, + 11, + 12, + 1, + 12, + 12, + 12, + 1, + 12, + 1, + 1, + 1, + 3, + 7, + 7, + 7, + 7, + 7, + 3, + 3, + 3, + 3, + 1, + 1, + 9, + 1, + 1, + 9, + 9, + 9, + 9, + 1, + 4, + 4, + 13, + 13, + 13, + 13, + 4, + 4, + 4, + 13, + 3, + 3, + 3, + 12, + 12, + 12, + 12, + 3, + 12, + 3, + 2, + 2, + 2, + 11, + 2, + 11, + 11, + 2, + 11, + 11, + 12, + 1, + 1, + 12, + 1, + 1, + 1, + 12, + 12, + 12, + 3, + 11, + 3, + 3, + 11, + 11, + 3, + 3, + 11, + 11, + 6, + 6, + 12, + 12, + 12, + 12, + 6, + 6, + 12, + 6, + 7, + 7, + 7, + 2, + 2, + 2, + 7, + 2, + 7, + 2, + 12, + 3, + 3, + 12, + 3, + 12, + 12, + 3, + 12, + 3, + 7, + 7, + 7, + 7, + 6, + 7, + 6, + 6, + 6, + 6, + 11, + 3, + 3, + 3, + 11, + 3, + 3, + 11, + 11, + 11, + 0, + 12, + 12, + 12, + 0, + 12, + 0, + 0, + 12, + 0, + 4, + 9, + 9, + 4, + 9, + 4, + 4, + 9, + 4, + 9, + 12, + 0, + 0, + 0, + 12, + 12, + 12, + 0, + 0, + 12, + 10, + 10, + 6, + 6, + 6, + 6, + 10, + 10, + 10, + 6, + 2, + 12, + 2, + 12, + 2, + 2, + 2, + 12, + 12, + 12, + 0, + 0, + 0, + 8, + 8, + 0, + 8, + 8, + 8, + 0, + 13, + 2, + 13, + 2, + 13, + 2, + 2, + 13, + 2, + 13, + 4, + 4, + 7, + 7, + 7, + 4, + 7, + 4, + 7, + 4, + 2, + 12, + 12, + 12, + 2, + 12, + 12, + 2, + 2, + 2, + 3, + 11, + 11, + 3, + 3, + 11, + 3, + 11, + 3, + 11, + 7, + 1, + 7, + 1, + 7, + 1, + 7, + 7, + 1, + 1, + 4, + 12, + 4, + 4, + 4, + 12, + 4, + 12, + 12, + 12, + 8, + 3, + 8, + 3, + 8, + 3, + 8, + 3, + 8, + 3, + 2, + 2, + 11, + 11, + 2, + 11, + 2, + 2, + 11, + 11, + 3, + 3, + 8, + 8, + 8, + 8, + 3, + 3, + 3, + 8, + 6, + 6, + 7, + 6, + 7, + 7, + 6, + 7, + 6, + 7, + 1, + 1, + 11, + 11, + 1, + 11, + 1, + 11, + 1, + 11, + 10, + 10, + 2, + 2, + 10, + 2, + 2, + 10, + 2, + 10, + 4, + 4, + 12, + 4, + 12, + 4, + 12, + 4, + 12, + 12, + 8, + 8, + 8, + 2, + 2, + 8, + 2, + 2, + 2, + 8, + 0, + 11, + 0, + 11, + 11, + 0, + 11, + 0, + 11, + 0, + 13, + 5, + 5, + 5, + 13, + 13, + 13, + 13, + 5, + 5, + 8, + 8, + 8, + 2, + 2, + 2, + 8, + 2, + 8, + 2, + 6, + 6, + 10, + 10, + 6, + 10, + 6, + 10, + 6, + 10, + 5, + 9, + 5, + 9, + 5, + 9, + 5, + 5, + 9, + 9, + 13, + 0, + 13, + 0, + 13, + 13, + 0, + 0, + 13, + 0, + 11, + 11, + 3, + 11, + 11, + 3, + 3, + 3, + 3, + 11, + 7, + 7, + 2, + 7, + 7, + 2, + 2, + 7, + 2, + 2, + 1, + 1, + 12, + 1, + 12, + 1, + 1, + 12, + 12, + 12, + 3, + 3, + 9, + 9, + 3, + 3, + 3, + 9, + 9, + 9, + 12, + 6, + 6, + 12, + 12, + 6, + 12, + 12, + 6, + 6, + 9, + 4, + 9, + 4, + 4, + 9, + 9, + 4, + 9, + 4, + 13, + 13, + 13, + 13, + 13, + 3, + 3, + 3, + 3, + 3, + 5, + 9, + 5, + 5, + 5, + 9, + 9, + 9, + 5, + 9, + 11, + 0, + 0, + 11, + 11, + 0, + 0, + 11, + 11, + 0, + 6, + 10, + 10, + 6, + 10, + 6, + 6, + 10, + 10, + 6, + 11, + 2, + 11, + 11, + 2, + 2, + 11, + 11, + 2, + 2, + 0, + 0, + 10, + 0, + 0, + 10, + 10, + 10, + 0, + 10, + 11, + 5, + 11, + 11, + 5, + 11, + 5, + 11, + 5, + 5, + 0, + 10, + 0, + 0, + 10, + 0, + 10, + 10, + 10, + 0, + 12, + 12, + 6, + 6, + 12, + 12, + 6, + 6, + 6, + 12, + 0, + 0, + 9, + 9, + 0, + 9, + 9, + 9, + 0, + 0, + 4, + 8, + 4, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 9, + 5, + 9, + 5, + 9, + 9, + 5, + 9, + 5, + 5, + 6, + 8, + 6, + 6, + 8, + 8, + 8, + 6, + 8, + 6, + 5, + 5, + 10, + 5, + 5, + 10, + 10, + 5, + 10, + 10, + 4, + 4, + 4, + 7, + 4, + 7, + 7, + 4, + 7, + 7, + 8, + 8, + 5, + 8, + 8, + 5, + 5, + 5, + 5, + 8, + 11, + 6, + 6, + 11, + 6, + 11, + 11, + 6, + 6, + 11, + 2, + 2, + 12, + 2, + 12, + 12, + 12, + 2, + 2, + 12, + 4, + 8, + 8, + 8, + 4, + 8, + 8, + 4, + 4, + 4, + 12, + 3, + 3, + 3, + 12, + 3, + 12, + 12, + 3, + 12, + 8, + 8, + 8, + 6, + 6, + 6, + 6, + 8, + 6, + 8, + 0, + 0, + 12, + 12, + 0, + 12, + 0, + 0, + 12, + 12, + 6, + 10, + 10, + 6, + 10, + 10, + 6, + 10, + 6, + 6, + 8, + 8, + 4, + 8, + 8, + 8, + 4, + 4, + 4, + 4, + 13, + 2, + 13, + 2, + 13, + 13, + 2, + 2, + 13, + 2, + 0, + 0, + 8, + 8, + 0, + 8, + 8, + 0, + 8, + 0, + 9, + 4, + 9, + 4, + 9, + 9, + 9, + 4, + 4, + 4, + 0, + 12, + 12, + 0, + 0, + 12, + 0, + 12, + 12, + 0, + 11, + 11, + 11, + 11, + 2, + 2, + 2, + 2, + 2, + 11, + 1, + 1, + 1, + 13, + 13, + 1, + 13, + 13, + 1, + 13, + 9, + 9, + 0, + 9, + 9, + 0, + 0, + 0, + 9, + 0, + 8, + 3, + 8, + 3, + 8, + 3, + 8, + 8, + 3, + 3, + 9, + 4, + 9, + 4, + 4, + 9, + 4, + 4, + 9, + 9, + 5, + 5, + 5, + 13, + 13, + 5, + 13, + 13, + 5, + 13, + 1, + 1, + 1, + 11, + 11, + 11, + 11, + 1, + 11, + 1, + 0, + 10, + 10, + 0, + 0, + 0, + 10, + 10, + 10, + 0, + 9, + 6, + 6, + 6, + 9, + 9, + 6, + 9, + 6, + 9, + 12, + 12, + 12, + 12, + 1, + 12, + 1, + 1, + 1, + 1, + 10, + 10, + 0, + 10, + 0, + 0, + 10, + 10, + 0, + 0, + 13, + 5, + 5, + 5, + 5, + 13, + 5, + 13, + 13, + 13, + 2, + 2, + 7, + 7, + 7, + 7, + 2, + 7, + 2, + 2, + 4, + 13, + 13, + 13, + 4, + 13, + 4, + 4, + 4, + 13, + 1, + 1, + 1, + 12, + 12, + 1, + 12, + 1, + 12, + 12, + 3, + 3, + 13, + 3, + 3, + 13, + 13, + 3, + 13, + 13, + 11, + 1, + 11, + 1, + 1, + 11, + 11, + 11, + 1, + 1, + 6, + 6, + 6, + 6, + 9, + 9, + 6, + 9, + 9, + 9, + 0, + 10, + 10, + 10, + 10, + 0, + 0, + 10, + 0, + 0, + 13, + 13, + 2, + 2, + 13, + 13, + 2, + 2, + 13, + 2, + 0, + 0, + 12, + 12, + 0, + 12, + 0, + 0, + 12, + 12, + 13, + 13, + 3, + 13, + 3, + 3, + 13, + 3, + 13, + 3, + 7, + 7, + 7, + 5, + 7, + 7, + 5, + 5, + 5, + 5, + 11, + 3, + 11, + 11, + 11, + 3, + 11, + 3, + 3, + 3, + 12, + 6, + 12, + 6, + 6, + 6, + 6, + 12, + 12, + 12, + 2, + 7, + 2, + 7, + 2, + 7, + 2, + 7, + 2, + 7, + 13, + 4, + 13, + 4, + 13, + 4, + 4, + 4, + 13, + 13, + 7, + 3, + 7, + 7, + 3, + 7, + 3, + 3, + 3, + 7, + 11, + 11, + 6, + 11, + 11, + 6, + 6, + 6, + 11, + 6, + 0, + 9, + 9, + 0, + 0, + 9, + 9, + 0, + 0, + 9, + 4, + 10, + 4, + 10, + 4, + 10, + 4, + 10, + 4, + 10, + 13, + 13, + 1, + 13, + 1, + 13, + 1, + 13, + 1, + 1, + 0, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 12, + 12, + 10, + 6, + 10, + 6, + 10, + 6, + 10, + 10, + 6, + 6, + 2, + 12, + 2, + 2, + 2, + 12, + 12, + 2, + 12, + 12, + 7, + 1, + 7, + 1, + 1, + 1, + 1, + 7, + 7, + 7, + 12, + 12, + 4, + 4, + 4, + 12, + 4, + 12, + 12, + 4, + 10, + 0, + 0, + 0, + 0, + 10, + 0, + 10, + 10, + 10, + 1, + 1, + 1, + 11, + 1, + 11, + 1, + 11, + 11, + 11, + 9, + 9, + 9, + 6, + 9, + 6, + 9, + 6, + 6, + 6, + 1, + 1, + 7, + 7, + 1, + 1, + 7, + 7, + 7, + 1, + 3, + 11, + 3, + 11, + 3, + 3, + 11, + 11, + 11, + 3, + 6, + 6, + 6, + 6, + 12, + 6, + 12, + 12, + 12, + 12, + 9, + 1, + 1, + 9, + 9, + 1, + 1, + 9, + 1, + 9, + 7, + 4, + 7, + 7, + 7, + 4, + 4, + 7, + 4, + 4, + 8, + 8, + 3, + 8, + 3, + 3, + 3, + 8, + 3, + 8, + 13, + 13, + 2, + 13, + 13, + 2, + 2, + 2, + 2, + 13, + 7, + 7, + 7, + 3, + 7, + 3, + 3, + 7, + 3, + 3, + 8, + 8, + 8, + 5, + 5, + 8, + 8, + 5, + 5, + 5, + 4, + 7, + 7, + 7, + 4, + 4, + 4, + 4, + 7, + 7, + 12, + 12, + 2, + 12, + 2, + 2, + 12, + 12, + 2, + 2, + 1, + 11, + 1, + 1, + 11, + 11, + 1, + 1, + 11, + 11, + 13, + 3, + 13, + 13, + 13, + 3, + 13, + 3, + 3, + 3, + 8, + 8, + 0, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 3, + 3, + 12, + 12, + 3, + 12, + 12, + 12, + 3, + 3, + 7, + 7, + 7, + 1, + 7, + 1, + 1, + 7, + 1, + 1, + 9, + 6, + 6, + 6, + 6, + 6, + 9, + 9, + 9, + 9, + 10, + 4, + 10, + 4, + 4, + 10, + 10, + 4, + 10, + 4, + 0, + 0, + 0, + 13, + 0, + 13, + 13, + 13, + 0, + 13, + 8, + 5, + 8, + 8, + 5, + 5, + 5, + 8, + 5, + 8, + 7, + 7, + 2, + 2, + 2, + 7, + 2, + 2, + 7, + 7, + 4, + 8, + 8, + 4, + 8, + 4, + 8, + 4, + 8, + 4, + 0, + 0, + 0, + 13, + 13, + 13, + 13, + 13, + 0, + 0, + 9, + 5, + 9, + 9, + 9, + 9, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 8, + 8, + 6, + 8, + 8, + 6, + 8, + 12, + 4, + 12, + 4, + 12, + 4, + 12, + 4, + 4, + 12, + 10, + 10, + 10, + 2, + 2, + 10, + 10, + 2, + 2, + 2, + 12, + 1, + 1, + 12, + 1, + 1, + 12, + 12, + 1, + 12, + 3, + 13, + 3, + 13, + 3, + 13, + 3, + 13, + 3, + 13, + 1, + 11, + 11, + 1, + 1, + 11, + 11, + 1, + 1, + 11, + 0, + 0, + 10, + 10, + 0, + 0, + 10, + 10, + 0, + 10, + 6, + 9, + 6, + 9, + 9, + 6, + 9, + 6, + 9, + 6, + 4, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 7, + 6, + 6, + 6, + 6, + 10, + 10, + 2, + 2, + 2, + 10, + 2, + 2, + 10, + 10, + 7, + 7, + 6, + 6, + 6, + 6, + 7, + 6, + 7, + 7, + 2, + 11, + 2, + 2, + 11, + 2, + 11, + 2, + 11, + 11, + 8, + 3, + 8, + 8, + 3, + 8, + 8, + 3, + 3, + 3, + 7, + 2, + 2, + 2, + 7, + 7, + 7, + 2, + 2, + 7, + 1, + 10, + 1, + 10, + 10, + 10, + 10, + 1, + 1, + 1, + 2, + 2, + 11, + 11, + 2, + 11, + 11, + 11, + 2, + 2, + 13, + 1, + 13, + 1, + 13, + 13, + 1, + 13, + 1, + 1, + 7, + 3, + 3, + 7, + 7, + 3, + 3, + 7, + 3, + 7, + 11, + 2, + 11, + 11, + 2, + 11, + 2, + 2, + 11, + 2, + 13, + 3, + 3, + 13, + 3, + 3, + 13, + 3, + 13, + 13, + 4, + 4, + 4, + 4, + 12, + 12, + 12, + 12, + 4, + 12, + 3, + 3, + 8, + 3, + 8, + 8, + 8, + 3, + 8, + 3, + 5, + 5, + 9, + 9, + 5, + 5, + 9, + 5, + 9, + 9, + 8, + 8, + 8, + 6, + 8, + 6, + 8, + 6, + 6, + 6, + 10, + 0, + 10, + 10, + 0, + 0, + 10, + 0, + 0, + 10, + 2, + 13, + 2, + 2, + 13, + 2, + 2, + 13, + 13, + 13, + 7, + 7, + 7, + 7, + 7, + 3, + 3, + 3, + 3, + 3, + 4, + 4, + 13, + 13, + 13, + 4, + 4, + 13, + 4, + 13, + 0, + 9, + 0, + 0, + 9, + 9, + 0, + 0, + 9, + 9, + 13, + 4, + 13, + 13, + 4, + 13, + 4, + 4, + 4, + 13, + 3, + 12, + 12, + 12, + 3, + 3, + 3, + 12, + 3, + 12, + 7, + 1, + 7, + 7, + 1, + 7, + 1, + 7, + 1, + 1, + 3, + 12, + 12, + 12, + 12, + 3, + 3, + 12, + 3, + 3, + 7, + 1, + 7, + 7, + 7, + 1, + 1, + 1, + 1, + 7, + 11, + 11, + 11, + 6, + 6, + 6, + 11, + 6, + 6, + 11, + 9, + 9, + 3, + 9, + 3, + 3, + 9, + 3, + 3, + 9, + 6, + 7, + 7, + 7, + 6, + 7, + 6, + 6, + 7, + 6, + 12, + 4, + 12, + 12, + 4, + 12, + 12, + 4, + 4, + 4, + 10, + 10, + 0, + 0, + 0, + 0, + 10, + 10, + 0, + 10, + 5, + 5, + 5, + 9, + 5, + 5, + 9, + 9, + 9, + 9, + 10, + 1, + 1, + 1, + 10, + 1, + 10, + 1, + 10, + 10, + 12, + 4, + 12, + 4, + 12, + 4, + 4, + 12, + 4, + 12, + 6, + 7, + 7, + 6, + 6, + 6, + 7, + 7, + 6, + 7, + 4, + 4, + 4, + 9, + 9, + 4, + 9, + 9, + 4, + 9, + 13, + 13, + 0, + 13, + 0, + 13, + 13, + 0, + 0, + 0, + 12, + 12, + 2, + 2, + 2, + 2, + 12, + 2, + 12, + 12, + 1, + 1, + 11, + 1, + 1, + 11, + 11, + 11, + 11, + 1, + 9, + 9, + 9, + 6, + 9, + 6, + 6, + 6, + 6, + 9, + 12, + 3, + 3, + 3, + 3, + 12, + 12, + 12, + 12, + 3, + 8, + 8, + 4, + 4, + 4, + 4, + 8, + 8, + 4, + 8, + 13, + 0, + 13, + 0, + 0, + 0, + 13, + 13, + 0, + 13, + 5, + 5, + 10, + 10, + 10, + 10, + 5, + 5, + 10, + 5, + 6, + 8, + 8, + 6, + 6, + 8, + 6, + 8, + 8, + 6, + 7, + 7, + 4, + 7, + 4, + 7, + 7, + 4, + 4, + 4, + 10, + 10, + 10, + 6, + 10, + 6, + 6, + 10, + 6, + 6, + 5, + 5, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 7, + 11, + 6, + 6, + 11, + 6, + 11, + 11, + 11, + 6, + 6, + 5, + 9, + 5, + 5, + 5, + 9, + 9, + 9, + 5, + 9, + 11, + 3, + 3, + 11, + 3, + 3, + 3, + 11, + 11, + 11, + 9, + 1, + 9, + 1, + 9, + 9, + 1, + 1, + 9, + 1, + 6, + 6, + 6, + 10, + 6, + 6, + 10, + 10, + 10, + 10, + 12, + 1, + 12, + 12, + 1, + 12, + 1, + 1, + 1, + 12, + 10, + 10, + 6, + 10, + 6, + 10, + 6, + 10, + 6, + 6, + 5, + 8, + 8, + 5, + 8, + 8, + 5, + 5, + 5, + 8, + 0, + 0, + 9, + 9, + 9, + 0, + 0, + 9, + 0, + 9, + 13, + 13, + 4, + 13, + 4, + 13, + 4, + 13, + 4, + 4, + 12, + 2, + 2, + 12, + 2, + 2, + 12, + 2, + 12, + 12, + 7, + 3, + 7, + 7, + 7, + 3, + 3, + 3, + 7, + 3, + 5, + 5, + 8, + 8, + 5, + 8, + 8, + 5, + 8, + 5, + 13, + 13, + 13, + 3, + 13, + 3, + 3, + 13, + 3, + 3, + 9, + 9, + 1, + 1, + 1, + 1, + 9, + 1, + 9, + 9, + 6, + 10, + 10, + 6, + 10, + 10, + 10, + 6, + 6, + 6, + 5, + 5, + 5, + 11, + 5, + 5, + 11, + 11, + 11, + 11, + 10, + 1, + 10, + 10, + 1, + 1, + 1, + 10, + 10, + 1, + 13, + 13, + 4, + 13, + 4, + 4, + 13, + 13, + 4, + 4, + 2, + 2, + 7, + 2, + 2, + 2, + 7, + 7, + 7, + 7, + 10, + 10, + 5, + 5, + 5, + 10, + 5, + 10, + 5, + 10, + 1, + 7, + 7, + 7, + 1, + 1, + 1, + 7, + 7, + 1, + 13, + 13, + 5, + 5, + 13, + 13, + 13, + 5, + 5, + 5, + 11, + 1, + 1, + 1, + 11, + 1, + 1, + 11, + 11, + 11, + 10, + 6, + 6, + 10, + 6, + 10, + 10, + 6, + 10, + 6, + 2, + 11, + 11, + 11, + 2, + 2, + 11, + 11, + 2, + 2, + 7, + 6, + 6, + 6, + 6, + 7, + 6, + 7, + 7, + 7, + 4, + 4, + 9, + 9, + 9, + 4, + 4, + 4, + 9, + 9, + 7, + 3, + 7, + 3, + 7, + 7, + 3, + 7, + 3, + 3, + 1, + 1, + 1, + 1, + 12, + 12, + 12, + 1, + 12, + 12, + 9, + 3, + 3, + 9, + 9, + 3, + 9, + 3, + 9, + 3, + 0, + 12, + 12, + 0, + 0, + 0, + 0, + 12, + 12, + 12, + 3, + 8, + 8, + 3, + 3, + 8, + 8, + 3, + 3, + 8, + 12, + 12, + 0, + 0, + 12, + 0, + 0, + 0, + 12, + 12, + 8, + 8, + 8, + 8, + 8, + 6, + 6, + 6, + 6, + 6, + 0, + 0, + 9, + 9, + 9, + 0, + 9, + 9, + 0, + 0, + 12, + 4, + 12, + 4, + 12, + 4, + 4, + 12, + 12, + 4, + 9, + 9, + 1, + 1, + 9, + 9, + 1, + 9, + 1, + 1, + 4, + 4, + 4, + 4, + 13, + 13, + 13, + 4, + 13, + 13, + 0, + 9, + 0, + 9, + 0, + 9, + 9, + 0, + 0, + 9, + 3, + 8, + 8, + 8, + 3, + 3, + 3, + 3, + 8, + 8, + 2, + 11, + 2, + 2, + 2, + 11, + 11, + 11, + 11, + 2, + 8, + 6, + 6, + 6, + 8, + 8, + 8, + 8, + 6, + 6, + 9, + 4, + 4, + 9, + 9, + 9, + 9, + 4, + 4, + 4, + 8, + 5, + 5, + 8, + 8, + 8, + 5, + 5, + 5, + 8, + 2, + 2, + 11, + 11, + 11, + 11, + 2, + 11, + 2, + 2, + 1, + 10, + 10, + 1, + 1, + 10, + 1, + 10, + 1, + 10, + 2, + 2, + 13, + 13, + 2, + 13, + 13, + 2, + 2, + 13, + 5, + 11, + 5, + 5, + 11, + 11, + 11, + 5, + 11, + 5, + 3, + 13, + 13, + 3, + 3, + 3, + 13, + 13, + 13, + 3, + 0, + 12, + 12, + 0, + 0, + 12, + 0, + 0, + 12, + 12, + 8, + 8, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 4, + 3, + 12, + 12, + 3, + 12, + 12, + 12, + 3, + 3, + 3, + 11, + 6, + 11, + 6, + 6, + 6, + 11, + 11, + 6, + 11, + 5, + 9, + 9, + 9, + 5, + 5, + 9, + 5, + 9, + 5, + 13, + 4, + 13, + 4, + 13, + 13, + 4, + 4, + 13, + 4, + 9, + 9, + 9, + 1, + 1, + 1, + 9, + 9, + 1, + 1, + 10, + 4, + 10, + 10, + 4, + 10, + 4, + 4, + 10, + 4, + 8, + 8, + 6, + 6, + 8, + 6, + 6, + 8, + 6, + 8, + 9, + 9, + 0, + 0, + 9, + 0, + 0, + 9, + 0, + 9, + 11, + 11, + 11, + 11, + 11, + 6, + 6, + 6, + 6, + 6, + 1, + 7, + 7, + 7, + 1, + 1, + 7, + 7, + 1, + 1, + 9, + 9, + 9, + 6, + 9, + 9, + 6, + 6, + 6, + 6, + 7, + 4, + 7, + 4, + 4, + 4, + 7, + 7, + 7, + 4, + 12, + 12, + 6, + 6, + 6, + 6, + 12, + 12, + 6, + 12, + 4, + 4, + 10, + 10, + 4, + 10, + 4, + 4, + 10, + 10, + 12, + 0, + 0, + 0, + 12, + 12, + 12, + 0, + 0, + 12, + 13, + 13, + 13, + 4, + 4, + 4, + 13, + 4, + 4, + 13, + 12, + 12, + 2, + 12, + 2, + 12, + 12, + 2, + 2, + 2, + 6, + 6, + 6, + 10, + 10, + 6, + 10, + 10, + 6, + 10, + 9, + 9, + 0, + 0, + 9, + 0, + 0, + 9, + 9, + 0, + 1, + 12, + 12, + 12, + 1, + 1, + 1, + 12, + 12, + 1, + 11, + 3, + 11, + 3, + 3, + 11, + 3, + 11, + 11, + 3, + 6, + 6, + 9, + 9, + 6, + 6, + 6, + 9, + 9, + 9, + 4, + 4, + 10, + 10, + 4, + 4, + 4, + 10, + 10, + 10, + 12, + 12, + 12, + 2, + 2, + 12, + 12, + 2, + 2, + 2, + 11, + 3, + 3, + 3, + 11, + 11, + 11, + 11, + 3, + 3, + 0, + 8, + 8, + 0, + 8, + 8, + 0, + 0, + 0, + 8, + 11, + 3, + 3, + 11, + 11, + 3, + 3, + 3, + 11, + 11, + 9, + 9, + 1, + 9, + 9, + 1, + 1, + 1, + 9, + 1, + 10, + 6, + 6, + 10, + 6, + 10, + 6, + 10, + 6, + 10, + 7, + 1, + 1, + 1, + 7, + 1, + 7, + 7, + 1, + 7, + 13, + 3, + 3, + 3, + 13, + 13, + 13, + 13, + 3, + 3, + 1, + 12, + 1, + 1, + 12, + 12, + 12, + 1, + 12, + 1, + 4, + 4, + 4, + 10, + 4, + 10, + 10, + 4, + 10, + 10, + 9, + 9, + 9, + 9, + 0, + 9, + 0, + 0, + 0, + 0, + 12, + 12, + 12, + 6, + 6, + 12, + 12, + 6, + 6, + 6, + 0, + 0, + 0, + 0, + 0, + 10, + 10, + 10, + 10, + 10, + 11, + 1, + 1, + 1, + 1, + 11, + 11, + 1, + 11, + 11, + 12, + 2, + 2, + 2, + 12, + 12, + 2, + 12, + 2, + 12, + 0, + 13, + 0, + 13, + 13, + 0, + 13, + 13, + 0, + 0, + 8, + 8, + 5, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 9, + 9, + 9, + 9, + 3, + 3, + 9, + 3, + 3, + 3, + 12, + 12, + 0, + 0, + 12, + 0, + 12, + 0, + 12, + 0, + 11, + 11, + 11, + 6, + 11, + 6, + 6, + 6, + 11, + 6, + 5, + 7, + 7, + 7, + 5, + 7, + 5, + 7, + 5, + 5, + 4, + 4, + 4, + 9, + 9, + 9, + 4, + 9, + 4, + 9, + 10, + 0, + 0, + 10, + 0, + 0, + 10, + 10, + 0, + 10, + 4, + 4, + 4, + 9, + 9, + 4, + 4, + 9, + 9, + 9, + 10, + 5, + 10, + 5, + 10, + 5, + 5, + 5, + 10, + 10, + 11, + 11, + 1, + 11, + 11, + 1, + 1, + 1, + 11, + 1, + 7, + 2, + 7, + 2, + 7, + 2, + 7, + 7, + 2, + 2, + 12, + 1, + 12, + 12, + 1, + 1, + 1, + 1, + 12, + 12, + 10, + 4, + 4, + 4, + 10, + 10, + 4, + 4, + 10, + 10, + 13, + 13, + 13, + 0, + 0, + 0, + 13, + 0, + 13, + 0, + 2, + 2, + 2, + 2, + 10, + 10, + 2, + 10, + 10, + 10, + 11, + 5, + 5, + 5, + 11, + 5, + 11, + 5, + 11, + 11, + 1, + 1, + 13, + 13, + 1, + 1, + 13, + 13, + 1, + 13, + 9, + 9, + 0, + 0, + 0, + 9, + 0, + 9, + 9, + 0, + 5, + 8, + 8, + 8, + 5, + 8, + 5, + 5, + 5, + 8, + 4, + 7, + 7, + 7, + 4, + 4, + 4, + 7, + 4, + 7, + 1, + 13, + 13, + 13, + 1, + 1, + 13, + 1, + 13, + 1, + 7, + 7, + 7, + 7, + 7, + 3, + 3, + 3, + 3, + 3, + 5, + 5, + 5, + 13, + 13, + 13, + 13, + 5, + 13, + 5, + 0, + 8, + 0, + 8, + 8, + 0, + 8, + 0, + 8, + 0, + 5, + 5, + 13, + 5, + 13, + 5, + 13, + 13, + 5, + 13, + 10, + 2, + 2, + 10, + 10, + 10, + 2, + 2, + 2, + 10, + 13, + 1, + 1, + 13, + 1, + 1, + 1, + 13, + 13, + 13, + 10, + 0, + 0, + 10, + 0, + 10, + 10, + 10, + 0, + 0, + 2, + 8, + 2, + 8, + 8, + 2, + 2, + 2, + 8, + 8, + 13, + 13, + 13, + 13, + 5, + 5, + 13, + 5, + 5, + 5, + 3, + 7, + 7, + 7, + 3, + 3, + 3, + 7, + 3, + 7, + 5, + 5, + 5, + 5, + 11, + 11, + 11, + 5, + 11, + 11, + 3, + 8, + 3, + 8, + 8, + 3, + 8, + 8, + 3, + 3, + 13, + 2, + 13, + 2, + 2, + 2, + 13, + 13, + 13, + 2, + 0, + 0, + 0, + 10, + 10, + 0, + 10, + 0, + 10, + 10, + 8, + 2, + 2, + 8, + 8, + 2, + 2, + 2, + 8, + 8, + 6, + 10, + 10, + 6, + 10, + 10, + 6, + 6, + 10, + 6, + 2, + 2, + 8, + 8, + 2, + 2, + 8, + 8, + 8, + 2, + 4, + 7, + 4, + 7, + 7, + 4, + 7, + 4, + 7, + 4, + 8, + 8, + 3, + 8, + 8, + 3, + 8, + 3, + 3, + 3, + 4, + 4, + 12, + 4, + 12, + 4, + 12, + 12, + 4, + 12, + 13, + 0, + 13, + 13, + 0, + 0, + 13, + 0, + 0, + 13, + 10, + 10, + 1, + 1, + 10, + 1, + 1, + 1, + 10, + 10, + 13, + 0, + 13, + 13, + 0, + 0, + 13, + 0, + 0, + 13, + 2, + 10, + 10, + 2, + 2, + 10, + 10, + 10, + 2, + 2, + 11, + 6, + 6, + 6, + 11, + 11, + 6, + 11, + 11, + 6, + 2, + 2, + 7, + 2, + 7, + 7, + 7, + 2, + 2, + 7, + 1, + 13, + 1, + 1, + 13, + 13, + 13, + 13, + 1, + 1, + 7, + 2, + 2, + 2, + 7, + 2, + 7, + 7, + 7, + 2, + 6, + 10, + 10, + 10, + 6, + 6, + 10, + 10, + 6, + 6, + 5, + 11, + 5, + 11, + 11, + 5, + 11, + 5, + 5, + 11, + 13, + 2, + 13, + 13, + 2, + 13, + 2, + 13, + 2, + 2, + 4, + 12, + 4, + 4, + 12, + 12, + 4, + 12, + 4, + 12, + 8, + 2, + 2, + 8, + 8, + 8, + 8, + 2, + 2, + 2, + 6, + 6, + 11, + 11, + 11, + 6, + 11, + 6, + 6, + 11, + 5, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 5, + 1, + 9, + 1, + 1, + 9, + 9, + 1, + 9, + 9, + 1, + 4, + 13, + 13, + 13, + 13, + 4, + 4, + 13, + 4, + 4, + 1, + 1, + 12, + 12, + 12, + 1, + 12, + 1, + 12, + 1, + 10, + 10, + 10, + 0, + 10, + 0, + 0, + 0, + 0, + 10, + 13, + 13, + 13, + 5, + 5, + 5, + 13, + 13, + 5, + 5, + 2, + 2, + 7, + 7, + 2, + 7, + 2, + 7, + 7, + 2, + 4, + 8, + 8, + 4, + 8, + 4, + 8, + 8, + 4, + 4, + 3, + 3, + 9, + 3, + 9, + 9, + 3, + 9, + 9, + 3, + 13, + 0, + 0, + 13, + 0, + 13, + 0, + 0, + 13, + 13, + 1, + 10, + 1, + 10, + 10, + 1, + 10, + 10, + 1, + 1, + 6, + 6, + 11, + 11, + 11, + 6, + 11, + 6, + 11, + 6, + 0, + 9, + 9, + 0, + 0, + 9, + 0, + 9, + 0, + 9, + 10, + 10, + 6, + 6, + 10, + 6, + 6, + 6, + 10, + 10, + 8, + 5, + 5, + 8, + 8, + 5, + 5, + 5, + 8, + 8, + 10, + 0, + 0, + 0, + 0, + 10, + 10, + 10, + 0, + 10, + 8, + 4, + 4, + 4, + 8, + 8, + 4, + 4, + 8, + 8, + 5, + 5, + 13, + 5, + 13, + 5, + 13, + 5, + 13, + 13, + 1, + 7, + 7, + 7, + 1, + 1, + 7, + 7, + 1, + 1, + 10, + 5, + 10, + 5, + 5, + 5, + 10, + 5, + 10, + 10, + 13, + 13, + 13, + 13, + 2, + 2, + 2, + 2, + 2, + 13, + 4, + 10, + 4, + 10, + 10, + 10, + 4, + 4, + 4, + 10, + 13, + 2, + 2, + 13, + 2, + 2, + 13, + 13, + 13, + 2, + 4, + 4, + 8, + 8, + 4, + 4, + 8, + 8, + 4, + 8, + 5, + 7, + 5, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 8, + 2, + 2, + 8, + 8, + 8, + 8, + 2, + 2, + 2, + 13, + 0, + 13, + 13, + 13, + 0, + 0, + 0, + 13, + 0, + 3, + 3, + 11, + 3, + 11, + 3, + 11, + 3, + 11, + 11, + 0, + 0, + 0, + 12, + 0, + 12, + 12, + 12, + 12, + 0, + 10, + 4, + 10, + 4, + 10, + 10, + 4, + 4, + 4, + 10, + 9, + 9, + 9, + 0, + 9, + 0, + 0, + 9, + 0, + 0, + 12, + 12, + 12, + 1, + 1, + 1, + 1, + 12, + 1, + 12, + 13, + 13, + 13, + 4, + 4, + 4, + 13, + 13, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 7, + 7, + 7, + 7, + 7, + 4, + 4, + 12, + 12, + 4, + 12, + 4, + 12, + 12, + 4, + 2, + 7, + 2, + 2, + 7, + 7, + 7, + 2, + 2, + 7, + 11, + 1, + 11, + 1, + 1, + 11, + 11, + 11, + 1, + 1, + 6, + 6, + 6, + 6, + 10, + 10, + 10, + 6, + 10, + 10, + 11, + 11, + 5, + 5, + 5, + 5, + 11, + 11, + 11, + 5, + 7, + 2, + 2, + 7, + 7, + 2, + 2, + 2, + 7, + 7, + 3, + 13, + 13, + 3, + 3, + 3, + 3, + 13, + 13, + 13, + 12, + 1, + 1, + 1, + 1, + 12, + 1, + 12, + 12, + 12, + 7, + 4, + 7, + 4, + 7, + 7, + 7, + 4, + 4, + 4, + 9, + 1, + 9, + 1, + 1, + 9, + 1, + 9, + 9, + 1, + 4, + 12, + 12, + 12, + 4, + 4, + 4, + 12, + 4, + 12, + 2, + 8, + 2, + 8, + 2, + 8, + 2, + 8, + 2, + 8, + 10, + 10, + 10, + 6, + 6, + 10, + 6, + 6, + 6, + 10, + 4, + 4, + 12, + 12, + 4, + 12, + 12, + 4, + 12, + 4, + 2, + 7, + 2, + 7, + 7, + 2, + 2, + 7, + 2, + 7, + 3, + 11, + 3, + 3, + 11, + 11, + 11, + 3, + 3, + 11, + 0, + 0, + 0, + 8, + 8, + 8, + 0, + 8, + 8, + 0, + 13, + 13, + 2, + 13, + 2, + 13, + 2, + 2, + 13, + 2, + 8, + 8, + 0, + 0, + 8, + 0, + 0, + 8, + 8, + 0, + 10, + 4, + 4, + 4, + 4, + 10, + 10, + 4, + 10, + 10, + 8, + 2, + 2, + 2, + 8, + 2, + 8, + 8, + 2, + 8, + 5, + 5, + 5, + 7, + 5, + 7, + 7, + 7, + 5, + 7, + 6, + 9, + 9, + 6, + 6, + 6, + 9, + 9, + 6, + 9, + 1, + 11, + 11, + 1, + 1, + 1, + 1, + 11, + 11, + 11, + 12, + 0, + 12, + 12, + 0, + 0, + 12, + 0, + 12, + 0, + 13, + 13, + 13, + 13, + 1, + 13, + 1, + 1, + 1, + 1, + 3, + 12, + 12, + 12, + 3, + 3, + 12, + 12, + 3, + 3, + 7, + 6, + 6, + 6, + 6, + 7, + 7, + 7, + 7, + 6, + 2, + 8, + 8, + 2, + 8, + 8, + 8, + 2, + 2, + 2, + 0, + 0, + 12, + 12, + 12, + 12, + 0, + 0, + 0, + 12, + 10, + 2, + 2, + 10, + 10, + 2, + 2, + 10, + 2, + 10, + 7, + 7, + 7, + 7, + 4, + 7, + 4, + 4, + 4, + 4, + 8, + 2, + 2, + 2, + 8, + 2, + 8, + 8, + 8, + 2, + 7, + 7, + 3, + 3, + 3, + 7, + 7, + 3, + 3, + 7, + 13, + 13, + 13, + 1, + 1, + 13, + 13, + 1, + 1, + 1, + 11, + 11, + 3, + 3, + 3, + 11, + 11, + 3, + 3, + 11, + 2, + 8, + 2, + 2, + 8, + 8, + 8, + 8, + 2, + 2, + 13, + 13, + 3, + 3, + 13, + 13, + 3, + 13, + 3, + 3, + 4, + 12, + 12, + 12, + 4, + 12, + 4, + 12, + 4, + 4, + 3, + 3, + 7, + 7, + 3, + 3, + 7, + 7, + 7, + 3, + 1, + 1, + 1, + 1, + 13, + 13, + 13, + 13, + 1, + 13, + 10, + 10, + 4, + 4, + 10, + 10, + 10, + 4, + 4, + 4, + 6, + 6, + 6, + 8, + 8, + 6, + 6, + 8, + 8, + 8, + 5, + 11, + 5, + 11, + 5, + 5, + 11, + 5, + 11, + 11, + 0, + 9, + 0, + 0, + 9, + 0, + 9, + 0, + 9, + 9, + 4, + 10, + 10, + 4, + 4, + 10, + 4, + 4, + 10, + 10, + 0, + 0, + 0, + 0, + 8, + 8, + 8, + 8, + 0, + 8, + 6, + 11, + 6, + 11, + 6, + 6, + 6, + 11, + 11, + 11, + 3, + 3, + 9, + 3, + 9, + 3, + 9, + 9, + 9, + 3, + 12, + 12, + 4, + 12, + 4, + 4, + 12, + 4, + 4, + 12, + 9, + 3, + 9, + 9, + 9, + 9, + 3, + 3, + 3, + 3, + 1, + 1, + 1, + 1, + 7, + 7, + 1, + 7, + 7, + 7, + 6, + 6, + 11, + 6, + 11, + 6, + 11, + 11, + 11, + 6, + 9, + 0, + 9, + 9, + 0, + 9, + 0, + 0, + 9, + 0, + 3, + 3, + 3, + 8, + 8, + 8, + 3, + 8, + 8, + 3, + 0, + 0, + 9, + 0, + 9, + 9, + 9, + 9, + 0, + 0, + 4, + 8, + 4, + 4, + 8, + 8, + 4, + 8, + 8, + 4, + 10, + 10, + 2, + 2, + 2, + 10, + 10, + 2, + 10, + 2, + 8, + 4, + 8, + 8, + 4, + 8, + 4, + 4, + 4, + 8, + 13, + 13, + 13, + 0, + 13, + 0, + 0, + 0, + 0, + 13, + 11, + 2, + 11, + 2, + 2, + 11, + 2, + 11, + 2, + 11, + 13, + 5, + 13, + 5, + 5, + 5, + 13, + 13, + 13, + 5, + 7, + 4, + 7, + 4, + 7, + 7, + 7, + 4, + 4, + 4, + 6, + 6, + 9, + 6, + 6, + 6, + 9, + 9, + 9, + 9, + 10, + 4, + 10, + 4, + 4, + 10, + 4, + 4, + 10, + 10, + 0, + 0, + 0, + 13, + 0, + 13, + 13, + 13, + 13, + 0, + 3, + 9, + 3, + 3, + 3, + 9, + 3, + 9, + 9, + 9, + 6, + 11, + 11, + 6, + 6, + 6, + 11, + 11, + 11, + 6, + 0, + 9, + 0, + 9, + 0, + 9, + 9, + 9, + 0, + 0, + 8, + 8, + 5, + 8, + 5, + 5, + 8, + 5, + 5, + 8, + 13, + 13, + 13, + 13, + 3, + 3, + 3, + 13, + 3, + 3, + 11, + 11, + 11, + 1, + 1, + 1, + 1, + 11, + 1, + 11, + 10, + 0, + 10, + 0, + 10, + 10, + 10, + 0, + 0, + 0, + 11, + 11, + 11, + 5, + 5, + 5, + 11, + 5, + 11, + 5, + 6, + 7, + 6, + 7, + 7, + 7, + 6, + 7, + 6, + 6, + 5, + 8, + 8, + 5, + 5, + 8, + 8, + 5, + 8, + 5, + 2, + 2, + 13, + 2, + 2, + 13, + 13, + 13, + 2, + 13, + 0, + 0, + 11, + 0, + 11, + 0, + 11, + 11, + 0, + 11, + 9, + 6, + 6, + 6, + 9, + 6, + 9, + 6, + 9, + 9, + 1, + 1, + 12, + 12, + 1, + 12, + 12, + 1, + 1, + 12, + 11, + 11, + 6, + 6, + 6, + 11, + 11, + 6, + 6, + 11, + 12, + 2, + 2, + 2, + 2, + 12, + 12, + 2, + 12, + 12, + 1, + 11, + 1, + 11, + 11, + 11, + 1, + 1, + 11, + 1, + 6, + 6, + 9, + 6, + 9, + 6, + 9, + 6, + 9, + 9, + 3, + 3, + 8, + 3, + 3, + 8, + 8, + 8, + 3, + 8, + 9, + 9, + 4, + 4, + 4, + 4, + 9, + 4, + 9, + 9, + 8, + 6, + 6, + 8, + 8, + 6, + 8, + 6, + 6, + 8, + 2, + 2, + 2, + 11, + 11, + 11, + 2, + 2, + 11, + 11, + 7, + 7, + 5, + 5, + 5, + 5, + 7, + 7, + 5, + 7, + 9, + 4, + 9, + 9, + 4, + 4, + 9, + 9, + 4, + 4, + 3, + 7, + 3, + 7, + 7, + 3, + 7, + 7, + 3, + 3, + 8, + 6, + 6, + 6, + 8, + 8, + 8, + 8, + 6, + 6, + 11, + 5, + 5, + 5, + 11, + 5, + 11, + 11, + 5, + 11, + 13, + 13, + 0, + 0, + 13, + 13, + 0, + 13, + 0, + 0, + 3, + 3, + 9, + 9, + 9, + 9, + 9, + 3, + 3, + 3, + 8, + 5, + 8, + 8, + 5, + 8, + 5, + 5, + 8, + 5, + 0, + 13, + 13, + 0, + 13, + 0, + 13, + 0, + 0, + 13, + 3, + 11, + 3, + 11, + 3, + 11, + 3, + 11, + 11, + 3, + 12, + 2, + 2, + 12, + 2, + 12, + 12, + 2, + 2, + 12, + 0, + 11, + 11, + 11, + 0, + 11, + 0, + 0, + 0, + 11, + 13, + 5, + 13, + 13, + 5, + 5, + 5, + 13, + 13, + 5, + 11, + 1, + 11, + 1, + 1, + 11, + 11, + 1, + 1, + 11, + 3, + 12, + 3, + 3, + 12, + 3, + 12, + 3, + 12, + 12, + 9, + 9, + 9, + 1, + 1, + 9, + 9, + 1, + 1, + 1, + 4, + 12, + 12, + 12, + 4, + 4, + 4, + 4, + 12, + 12, + 3, + 13, + 13, + 3, + 13, + 3, + 13, + 13, + 3, + 3, + 5, + 7, + 5, + 7, + 7, + 5, + 5, + 7, + 7, + 5, + 3, + 11, + 11, + 11, + 3, + 3, + 3, + 11, + 11, + 3, + 6, + 12, + 6, + 12, + 12, + 6, + 12, + 12, + 6, + 6, + 8, + 3, + 8, + 3, + 3, + 3, + 8, + 8, + 3, + 8, + 6, + 6, + 7, + 7, + 7, + 7, + 6, + 6, + 7, + 6, + 5, + 5, + 11, + 11, + 5, + 5, + 11, + 5, + 11, + 11, + 6, + 7, + 7, + 6, + 6, + 6, + 6, + 7, + 7, + 7, + 9, + 5, + 9, + 5, + 5, + 5, + 9, + 9, + 5, + 9, + 10, + 10, + 0, + 10, + 0, + 0, + 0, + 10, + 0, + 10, + 2, + 2, + 12, + 2, + 12, + 12, + 2, + 12, + 2, + 12, + 4, + 4, + 7, + 4, + 7, + 4, + 4, + 7, + 7, + 7, + 8, + 8, + 2, + 8, + 8, + 8, + 2, + 2, + 2, + 2, + 5, + 13, + 5, + 5, + 13, + 5, + 13, + 13, + 13, + 5, + 7, + 1, + 7, + 1, + 7, + 1, + 1, + 1, + 7, + 7, + 11, + 2, + 11, + 2, + 11, + 2, + 11, + 2, + 2, + 11, + 5, + 13, + 5, + 5, + 5, + 13, + 13, + 13, + 13, + 5, + 10, + 4, + 10, + 10, + 4, + 4, + 10, + 10, + 4, + 4, + 0, + 0, + 12, + 12, + 12, + 0, + 0, + 12, + 0, + 12, + 11, + 2, + 2, + 2, + 11, + 11, + 2, + 11, + 2, + 11, + 6, + 7, + 7, + 6, + 6, + 7, + 6, + 7, + 7, + 6, + 3, + 9, + 3, + 9, + 9, + 3, + 9, + 3, + 3, + 9, + 4, + 4, + 4, + 4, + 8, + 4, + 8, + 8, + 8, + 8, + 12, + 3, + 12, + 3, + 12, + 12, + 3, + 3, + 3, + 12, + 4, + 4, + 4, + 13, + 13, + 13, + 13, + 13, + 4, + 4, + 7, + 7, + 1, + 1, + 1, + 7, + 7, + 1, + 1, + 7, + 6, + 6, + 6, + 6, + 11, + 11, + 6, + 11, + 11, + 11, + 9, + 0, + 9, + 0, + 0, + 9, + 9, + 0, + 9, + 0, + 3, + 3, + 8, + 3, + 8, + 8, + 8, + 3, + 3, + 8, + 6, + 9, + 6, + 6, + 9, + 9, + 6, + 9, + 9, + 6, + 5, + 5, + 5, + 5, + 11, + 11, + 11, + 11, + 5, + 11, + 10, + 10, + 2, + 10, + 2, + 10, + 2, + 2, + 10, + 2, + 1, + 1, + 13, + 13, + 13, + 1, + 13, + 1, + 1, + 13, + 3, + 7, + 7, + 3, + 7, + 3, + 7, + 7, + 3, + 3, + 8, + 5, + 5, + 8, + 5, + 8, + 5, + 5, + 8, + 8, + 11, + 11, + 11, + 11, + 11, + 6, + 6, + 6, + 6, + 6, + 7, + 1, + 7, + 1, + 1, + 1, + 7, + 1, + 7, + 7, + 9, + 6, + 6, + 6, + 6, + 9, + 9, + 6, + 9, + 9, + 3, + 3, + 8, + 8, + 8, + 3, + 8, + 8, + 3, + 3, + 0, + 11, + 0, + 0, + 0, + 11, + 11, + 11, + 11, + 0, + 5, + 13, + 13, + 13, + 13, + 5, + 13, + 5, + 5, + 5, + 11, + 1, + 11, + 1, + 1, + 11, + 11, + 1, + 11, + 1, + 12, + 12, + 3, + 12, + 3, + 12, + 3, + 3, + 3, + 12, + 9, + 1, + 9, + 1, + 1, + 9, + 9, + 1, + 1, + 9, + 0, + 10, + 10, + 0, + 10, + 10, + 0, + 0, + 0, + 10, + 4, + 4, + 8, + 8, + 8, + 8, + 8, + 4, + 4, + 4, + 10, + 10, + 5, + 5, + 5, + 10, + 10, + 10, + 5, + 5, + 7, + 7, + 6, + 6, + 7, + 7, + 6, + 6, + 6, + 7, + 1, + 10, + 10, + 1, + 1, + 10, + 1, + 10, + 10, + 1, + 7, + 7, + 6, + 6, + 7, + 7, + 7, + 6, + 6, + 6, + 3, + 12, + 12, + 12, + 3, + 12, + 12, + 3, + 3, + 3, + 1, + 13, + 13, + 13, + 1, + 1, + 13, + 1, + 1, + 13, + 5, + 5, + 9, + 5, + 9, + 5, + 9, + 5, + 9, + 9, + 10, + 6, + 10, + 6, + 6, + 10, + 10, + 6, + 10, + 6, + 0, + 9, + 9, + 9, + 0, + 0, + 9, + 0, + 0, + 9, + 8, + 6, + 8, + 6, + 6, + 6, + 8, + 6, + 8, + 8, + 10, + 10, + 5, + 5, + 10, + 5, + 5, + 5, + 10, + 10, + 6, + 6, + 6, + 6, + 11, + 11, + 11, + 11, + 6, + 11, + 9, + 0, + 9, + 0, + 9, + 0, + 9, + 9, + 0, + 0, + 5, + 8, + 8, + 5, + 8, + 8, + 5, + 5, + 8, + 5, + 6, + 9, + 9, + 6, + 9, + 6, + 9, + 6, + 6, + 9, + 4, + 12, + 12, + 4, + 4, + 12, + 4, + 12, + 4, + 12, + 6, + 10, + 10, + 6, + 6, + 6, + 10, + 10, + 6, + 10, + 12, + 1, + 1, + 12, + 1, + 1, + 12, + 1, + 12, + 12, + 10, + 10, + 10, + 6, + 6, + 10, + 10, + 6, + 6, + 6, + 0, + 9, + 9, + 0, + 0, + 9, + 0, + 9, + 9, + 0, + 10, + 6, + 10, + 10, + 10, + 10, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 9, + 9, + 5, + 9, + 9, + 9, + 5, + 0, + 8, + 8, + 0, + 8, + 0, + 8, + 0, + 8, + 0, + 3, + 3, + 9, + 3, + 3, + 3, + 9, + 9, + 9, + 9, + 4, + 13, + 4, + 4, + 4, + 4, + 13, + 13, + 13, + 13, + 10, + 0, + 10, + 0, + 10, + 0, + 0, + 10, + 0, + 10, + 4, + 4, + 4, + 12, + 12, + 4, + 4, + 12, + 12, + 12, + 2, + 8, + 2, + 2, + 2, + 8, + 2, + 8, + 8, + 8, + 5, + 10, + 5, + 10, + 10, + 5, + 10, + 5, + 5, + 10, + 13, + 2, + 2, + 2, + 13, + 13, + 13, + 2, + 13, + 2, + 8, + 3, + 8, + 3, + 8, + 8, + 3, + 8, + 3, + 3, + 5, + 5, + 5, + 13, + 13, + 13, + 13, + 5, + 5, + 13, + 8, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 8, + 0, + 11, + 11, + 3, + 3, + 11, + 11, + 3, + 3, + 3, + 11, + 9, + 9, + 9, + 0, + 9, + 0, + 0, + 0, + 0, + 9, + 5, + 13, + 5, + 5, + 5, + 13, + 5, + 13, + 13, + 13, + 10, + 10, + 10, + 0, + 10, + 0, + 0, + 10, + 0, + 0, + 2, + 2, + 2, + 2, + 13, + 13, + 2, + 13, + 13, + 13, + 7, + 7, + 5, + 5, + 7, + 5, + 7, + 7, + 5, + 5, + 13, + 13, + 2, + 13, + 2, + 2, + 2, + 2, + 13, + 13, + 5, + 10, + 5, + 5, + 10, + 5, + 5, + 10, + 10, + 10, + 2, + 2, + 2, + 11, + 11, + 2, + 2, + 11, + 11, + 11, + 8, + 8, + 6, + 8, + 8, + 8, + 6, + 6, + 6, + 6, + 10, + 2, + 2, + 2, + 10, + 2, + 10, + 2, + 10, + 10, + 13, + 4, + 13, + 4, + 13, + 4, + 4, + 13, + 4, + 13, + 8, + 0, + 0, + 0, + 0, + 8, + 8, + 0, + 8, + 8, + 6, + 12, + 12, + 12, + 12, + 6, + 6, + 6, + 6, + 12, + 8, + 4, + 4, + 8, + 4, + 4, + 8, + 4, + 8, + 8, + 5, + 5, + 13, + 5, + 13, + 13, + 13, + 5, + 5, + 13, + 2, + 10, + 2, + 2, + 10, + 10, + 2, + 10, + 2, + 10, + 7, + 7, + 4, + 7, + 7, + 4, + 4, + 7, + 4, + 4 + ], + "sampling_mode": "Ordered" + }, + "end_conditions": [] + } + ], + "sampling_mode": "Sequential" + }, + "operation_control": { + "movable_spout_control": { + "enabled": false, + "time_to_collect_after_reward": 1.0, + "retracting_distance": 0.0 + }, + "odor_control": { + "target_total_flow": 1000, + "target_odor_flow": 100 + }, + "position_control": { + "gain": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "initial_position": { + "x": 0.0, + "y": 2.56, + "z": 0.0 + }, + "frequency_filter_cutoff": 5.0, + "velocity_threshold": 8.0 + }, + "audio_control": { + "duration": 0.2, + "frequency": 9999.0 + }, + "wait_to_start_duration": 0.0, + "wait_to_finish_duration": 0.0 + } + }, + "version": "1.1.1-rc1", + "stage_name": "graduated" + }, + "graph": { + "nodes": { + "0": "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_introduce_negative_sites", + "1": "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_water_cap" + }, + "graph": { + "0": [], + "1": [] + } + }, + "start_policies": [ + "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_introduce_negative_sites", + "aind_behavior_vr_foraging_curricula.learning_sets.policies.p_water_cap" + ], + "metrics_provider": "aind_behavior_vr_foraging_curricula.learning_sets.metrics.metrics_from_dataset" + } + }, + "graph": { + "0": [ + [ + "aind_behavior_vr_foraging_curricula.learning_sets.curriculum.st_shaping_to_graduated", + 1 + ] + ], + "1": [] + } + } +} \ No newline at end of file diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/README.md b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/README.md new file mode 100644 index 00000000..21b94526 --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/README.md @@ -0,0 +1,83 @@ +# LearningSets + +A two-stage curriculum for the **learning-set** task: every session is a single block of +single-reward-site patches drawn from 7 odors. The odor ordering is regenerated each day +under the same pairing rules as +[`examples/task_learning_sets.py`](../../../../../../examples/task_learning_sets.py) +(each trial is a `(negative, positive)` pair; no odor that appeared in the last pair may +reappear). Each odor has a *positive* variant (always rewarded, p=1) and a *negative* +variant (always unrewarded, p=0). The curriculum shapes difficulty by gradually +**increasing the proportion of negative sites** rather than stepping reward probability. + +## Background: Harlow's learning sets + +The paradigm is inspired by Harry Harlow's classic *learning set* ("learning to learn") +experiments from the late 1940s–50s (Harlow, *The Formation of Learning Sets*, +Psychological Review, 1949). Harlow gave rhesus monkeys a long series of two-choice +object-discrimination problems: in each problem one object was consistently rewarded +and the other was not, but the rewarded object changed from problem to problem. Early +problems were solved slowly and trial-by-trial, but across hundreds of problems the +animals learned the *rule* itself — that one object is always correct — and eventually +solved each new problem in essentially a single trial ("win-stay, lose-shift"). The key +finding was that they were not just learning individual discriminations but acquiring a +transferable strategy: a learning set. + +This curriculum recreates that structure in the VR foraging task. Each day presents +fresh `(negative, positive)` odor pairs drawn under the same rules, so the specific +rewarded odor keeps changing while the underlying rule stays constant — letting us ask +whether the animal forms a learning set and discriminates new pairs faster over time. + +## Stages + +| Stage | Neg sites / pair | Stop duration | Velocity threshold | Geometry | Reward µL | +|-------|-----------------|---------------|--------------------|----------|-----------| +| `shaping` | 0 → 1 → 3 → 5 (ramped across sessions) | ramps 0.1 → 3 s (within session) | shaped 60 → 8 cm/s | eased compressed → full | 6 default, trimmed in `graduated` | +| `graduated` | 5 (fixed, full 5+5 ratio) | 3 s (fixed) | 8 cm/s (fixed) | full (fixed) | trimmed toward water budget | + +Within the `shaping` stage the difficulty knobs evolve concurrently: + +- **Negative-site proportion** — session 1: all 10 sites per pair are positive (n_neg = 0, + every stop is rewarded). Subsequent sessions walk `0 → 1 → 3 → 5` neg sites per pair via + `N_NEG_RAMP`, while positive sites fill the remainder to keep the total fixed at 10. This + means the animal first just learns to stop (session 1), then is progressively challenged + to discriminate which odor is worth stopping for. +- **Speed** — the stop-velocity threshold (cm/s below which a stop counts) starts lenient + (60 cm/s) and a GAIN updater drives it down to the final floor (8 cm/s) across sessions. +- **Geometry** — inter-patch spacing (mean/max `40/70 → 60/190`) and reward-site length + (`25 → 40` cm) ease from compressed (easy, day-1) toward full, scaled by how many sites + the subject travelled in the prior session (`n_patches_seen`). Inter-site spacing is + fixed at 15 cm. +- **Stop duration** — a tiny operant base (0.1 s) plus a within-session offset that ramps + to 3 s, so on the first days a brief dip below the velocity threshold earns reward by + chance. + +## Cross-session policies (`start_policies`) + +- **`p_introduce_negative_sites`** (both stages) — reads `last_n_neg_sites_per_pair` from + prior metrics, advances to the next step in `N_NEG_RAMP = (1, 3, 5)`, and regenerates + `patch_indices` with the new neg/pos split. None → 0 (first session, all positive); + saturates at 5. In the `graduated` stage the ramp is already at 5 and stays there. +- **`p_seed_stop_velocity`** (`shaping`) — starts the stop-velocity threshold a little + above where the prior session floored (`× 1.2`, clamped to bounds). Dropped from + `graduated`, which runs fixed at the floor. +- **`p_seed_stop_duration`** (`shaping`) — starts the stop-duration offset a little below + where the prior session ended (`× 0.85`), so the subject re-ramps rather than being + dropped at the longest stop. +- **`p_ease_geometry`** (`shaping`) — eases the geometry from compressed toward full, + scaled by sites travelled in the prior session. +- **`p_water_cap`** (`graduated`) — if the prior session delivered more than 1.0 mL the + per-reward amount is trimmed by 0.5 µL; if it fell below 0.7 mL the amount is raised by + 0.5 µL (both clamped to `[4, 8]` µL), steering total water toward the target window. + +## Graduation + +`shaping → graduated`: negative sites per pair have reached the full ratio (5) **and** +the stop-velocity threshold has been shaped to its final floor (8 cm/s) **and** the +subject is discriminating (visit ratio ≤ 0.7, i.e. skipping a meaningful fraction of +negative-odor patches). + +## Metrics + +`LearningSetsMetrics`: `total_water_consumed`, `n_patches_seen`, `n_patches_visited`, +`last_stop_duration_offset_updater`, `last_stop_velocity_threshold_updater`, +`last_n_neg_sites_per_pair`, `last_reward_amount`. diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/__init__.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/__init__.py new file mode 100644 index 00000000..cdab0921 --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/__init__.py @@ -0,0 +1,9 @@ +from .curriculum import CURRICULUM, CURRICULUM_NAME, PKG_LOCATION, TRAINER, run_curriculum + +__all__ = [ + "CURRICULUM_NAME", + "CURRICULUM", + "TRAINER", + "run_curriculum", + "PKG_LOCATION", +] diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/curriculum.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/curriculum.py new file mode 100644 index 00000000..a60c82ee --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/curriculum.py @@ -0,0 +1,72 @@ +from typing import Any, Type, TypeVar + +import aind_behavior_curriculum +import pydantic +from aind_behavior_curriculum import StageTransition, Trainer, TrainerState, create_curriculum +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic + +from .. import __semver__ +from ..cli import CurriculumCliArgs, CurriculumSuggestion +from ..utils import metrics_from_dataset_path, trainer_state_from_file +from .helpers import N_SITES_EACH, VELOCITY_THRESHOLD_FLOOR +from .metrics import LearningSetsMetrics +from .stages import make_s_graduated, make_s_shaping + +CURRICULUM_NAME = "LearningSets" +PKG_LOCATION = ".".join(__name__.split(".")[:-1]) + +TModel = TypeVar("TModel", bound=pydantic.BaseModel) + + +# ============================================================ +# Stage transitions +# ============================================================ + + +def st_shaping_to_graduated(metrics: LearningSetsMetrics) -> bool: + """Graduate the shaping stage once the negative-site proportion has reached the full + 5+5 ratio, the stop-velocity threshold has been shaped down to its final floor, and + the subject is discriminating (skipping a meaningful fraction of patches).""" + if ( + metrics.last_n_neg_sites_per_pair is None + or metrics.last_stop_velocity_threshold_updater is None + or metrics.n_patches_seen == 0 + ): + return False + visit_ratio = metrics.n_patches_visited / metrics.n_patches_seen + return ( + (metrics.last_n_neg_sites_per_pair >= N_SITES_EACH) + and (metrics.last_stop_velocity_threshold_updater <= VELOCITY_THRESHOLD_FLOOR) + and (metrics.n_patches_seen >= 200) + and (visit_ratio <= 0.7) + ) + + +# ============================================================ +# Curriculum definition +# ============================================================ + +curriculum_class: Type[aind_behavior_curriculum.Curriculum[AindVrForagingTaskLogic]] = create_curriculum( + CURRICULUM_NAME, __semver__, (AindVrForagingTaskLogic,), pkg_location=PKG_LOCATION +) +CURRICULUM = curriculum_class() + +CURRICULUM.add_stage_transition( + make_s_shaping(), + make_s_graduated(), + StageTransition(st_shaping_to_graduated), +) + +# ============================================================================== +# Trainer +# ============================================================================== + +TRAINER = Trainer(CURRICULUM) + + +def run_curriculum(args: CurriculumCliArgs) -> CurriculumSuggestion[TrainerState[Any], Any]: + metrics: aind_behavior_curriculum.Metrics + trainer_state = trainer_state_from_file(args.input_trainer_state, TRAINER) + metrics = metrics_from_dataset_path(args.data_directory, trainer_state) + trainer_state = TRAINER.evaluate(trainer_state, metrics) + return CurriculumSuggestion(trainer_state=trainer_state, metrics=metrics, version=__semver__) diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/helpers.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/helpers.py new file mode 100644 index 00000000..d9b99497 --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/helpers.py @@ -0,0 +1,298 @@ +import random +from collections import deque +from dataclasses import dataclass +from typing import Optional + +from aind_behavior_services.task import distributions +from aind_behavior_vr_foraging import task_logic + + +@dataclass +class CorridorGeometry: + inter_patch_min_length: float + inter_patch_mean_length: float + inter_patch_max_length: float + reward_site_length: float + + +#: Number of distinct odors available to the learning-set generator. +ODOR_COUNT: int = 7 + +#: Reward volume (µL) range and starting default. Sessions begin at ``DEFAULT``; the +#: graduated-stage water policy steers it within ``[MIN, MAX]``. +REWARD_AMOUNT_UL_MAX: float = 8.0 +REWARD_AMOUNT_UL_MIN: float = 4.0 +REWARD_AMOUNT_UL_DEFAULT: float = 6.0 + +#: Stop-duration shaping. The operant ``stop_duration`` is held at ``STOP_DURATION_BASE`` +#: and a ``STOP_DURATION_OFFSET`` updater ramps on top of it, so the effective stop +#: grows ``STOP_DURATION_BASE -> STOP_DURATION_BASE + STOP_DURATION_OFFSET_MAX`` (= 3.0 s). +#: The base is deliberately tiny so that on the first few days (before the offset has +#: accumulated / seeded) a brief dip below the velocity threshold counts as a stop and +#: the subject can earn reward by chance. +STOP_DURATION_BASE: float = 0.1 +STOP_DURATION_OFFSET_MAX: float = 2.9 +STOP_DURATION_GRADUATED: float = 3.0 # fixed stop in the graduated stage (no updater) + +#: Corridor geometry. Single reward site per patch; inter-site spacing is fixed. The +#: inter-patch spacing and reward-site length are *shaped* across sessions by +#: ``p_ease_geometry`` -- from the compressed (easy, day-1) values toward full spacing, +#: scaled by how many sites the subject traveled in the prior session. Full spacing is +#: reached at ``GEOMETRY_EASE_SITES`` traveled sites (``n_patches_seen``). +INTERSITE_LENGTH: float = 15.0 +GEOMETRY_EASE_SITES: float = 150.0 +GEOMETRY_COMPRESSED: CorridorGeometry = CorridorGeometry( + inter_patch_min_length=30.0, + inter_patch_mean_length=40.0, + inter_patch_max_length=70.0, + reward_site_length=25.0, +) +GEOMETRY_FULL: CorridorGeometry = CorridorGeometry( + inter_patch_min_length=30.0, + inter_patch_mean_length=60.0, + inter_patch_max_length=190.0, + reward_site_length=40.0, +) + +#: Stop-velocity-threshold shaping (cm/s). One GAIN updater drives the threshold from +#: lenient (``VELOCITY_THRESHOLD_START``, so almost any deceleration registers as a stop) +#: down to the final ``VELOCITY_THRESHOLD_FLOOR`` across sessions. +#: ``STOP_VELOCITY_LEARNING_FACTOR`` eases each session's start a little above where the +#: prior session floored. +VELOCITY_THRESHOLD_START: float = 60.0 +VELOCITY_THRESHOLD_FLOOR: float = 8.0 +STOP_VELOCITY_LEARNING_FACTOR: float = 1.2 + +#: Reward delay (s) between a qualifying stop and reward delivery. Kept fixed/simple. +REWARD_DELAY_S: float = 0.5 + +#: Daily sequence size: ``N_PAIRS`` (neg, pos) pairs, each repeated ``N_SITES_EACH`` +#: times for both variants -> ``N_PAIRS * N_SITES_EACH * 2`` reward sites per session. +N_PAIRS: int = 1000 +N_SITES_EACH: int = 5 + +#: Proportion-based discrimination ramp. Negative sites per pair are introduced +#: progressively across sessions: session 1 → 0 neg (all positive), then 1, 3, 5. +#: Once the ramp is exhausted the ratio stays at 5+5. +N_NEG_RAMP: tuple[int, ...] = (1, 3, 5) + +#: Cross-session seeding: start the stop-duration offset a little below where the +#: prior session ended, so the subject is not dropped at the longest stop on day N+1. +STOP_DURATION_LEARNING_FACTOR: float = 0.85 + +#: Graduated-stage water budget. If the prior session's water exceeds ``WATER_CAP_ML`` the +#: reward amount is trimmed by ``REWARD_AMOUNT_STEP_UL``; if it falls below ``WATER_FLOOR_ML`` +#: the amount is raised by the same step (both clamped to the allowed range). +WATER_CAP_ML: float = 1.0 +WATER_FLOOR_ML: float = 0.7 +REWARD_AMOUNT_STEP_UL: float = 0.5 + + +def clamp(value: float, minimum: float, maximum: float) -> float: + return max(minimum, min(value, maximum)) + + +def lerp(start: float, end: float, fraction: float) -> float: + return start + (end - start) * fraction + + +def odor_concentration_from_index(odor_index: int, concentration: float = 1.0) -> list[float]: + """One-hot odor mixture vector for ``odor_index`` at ``concentration``.""" + arr = [0.0 for _ in range(ODOR_COUNT)] + arr[odor_index] = concentration + return arr + + +def get_odor_sequence(total_trials: int, n: int = 1) -> list[tuple[int, int]]: + """Generate ``total_trials`` (negative, positive) odor-index pairs. + + Same rules as ``examples/task_learning_sets.py``: no odor that appeared in the + last ``n`` pairs may reappear, so consecutive pairs share no odor. + """ + odors = list(range(ODOR_COUNT)) + if len(odors) < 2 * n + 2: + raise ValueError("Not enough odors to satisfy the constraints with the given n.") + + pairs: list[tuple[int, int]] = [] + history: deque[tuple[int, int]] = deque(maxlen=n) + for _ in range(total_trials): + forbidden: set[int] = set() + for pair in history: + forbidden.update(pair) + available = [o for o in odors if o not in forbidden] + pos = random.choice(available) + available.remove(pos) + neg = random.choice(available) + pairs.append((neg, pos)) + history.append((neg, pos)) + return pairs + + +def make_sequence(n_pos_each: int = N_SITES_EACH, n_neg_each: int = N_SITES_EACH, n_pairs: int = N_PAIRS) -> list[int]: + """Build the ``patch_indices`` ordering for one session's block. + + For each (neg, pos) pair, emit ``n_neg_each`` negative-variant sites + (``state_index == neg``) and ``n_pos_each`` positive-variant sites + (``state_index == pos + ODOR_COUNT``), shuffled together. + """ + trial_sequence: list[int] = [] + for neg, pos in get_odor_sequence(total_trials=n_pairs, n=1): + block = [neg] * n_neg_each + [pos + ODOR_COUNT] * n_pos_each + random.shuffle(block) + trial_sequence.extend(block) + return trial_sequence + + +def make_operation_control(velocity_threshold: float = VELOCITY_THRESHOLD_FLOOR) -> task_logic.OperationControl: + return task_logic.OperationControl( + position_control=task_logic.PositionControl( + frequency_filter_cutoff=5, + velocity_threshold=velocity_threshold, + ), + ) + + +def make_patch( + is_rewarded: bool, + odor_index: int, + p_reward: float, + reward_amount: float = REWARD_AMOUNT_UL_DEFAULT, + stop_duration: float = STOP_DURATION_BASE, + geometry: Optional[CorridorGeometry] = None, + inter_site_length: float = INTERSITE_LENGTH, +) -> task_logic.Patch: + """A single odor-marked reward site (one reward site per patch). + + ``is_rewarded`` selects the positive (``state_index = odor_index + ODOR_COUNT``) + or negative (``state_index = odor_index``) variant; ``p_reward`` sets its reward + probability (the curriculum shapes the negative variant's probability). The + inter-patch / reward-site lengths are the shaped geometry (see ``p_ease_geometry``). + """ + if geometry is None: + geometry = GEOMETRY_FULL + return task_logic.Patch( + label=f"{odor_index}_{'Rewarded' if is_rewarded else 'NonRewarded'}", + state_index=odor_index + ODOR_COUNT * int(is_rewarded), + odor_specification=odor_concentration_from_index(odor_index, 1.0), + patch_terminators=[ + task_logic.PatchTerminatorOnRewardSite(count=task_logic.scalar_value(1)), + ], + reward_specification=task_logic.RewardSpecification( + amount=task_logic.scalar_value(reward_amount), + probability=task_logic.scalar_value(p_reward), + delay=task_logic.scalar_value(REWARD_DELAY_S), + operant_logic=task_logic.OperantLogic( + is_operant=False, + stop_duration=stop_duration, + ), + ), + patch_virtual_sites_generator=task_logic.PatchVirtualSitesGenerator( + inter_patch=task_logic.VirtualSiteGenerator( + render_specification=task_logic.RenderSpecification(contrast=1), + label=task_logic.VirtualSiteLabels.INTERPATCH, + length_distribution=distributions.ExponentialDistribution( + distribution_parameters=distributions.ExponentialDistributionParameters( + rate=1 / geometry.inter_patch_mean_length + ), + scaling_parameters=distributions.ScalingParameters(offset=geometry.inter_patch_min_length), + truncation_parameters=distributions.TruncationParameters( + min=geometry.inter_patch_min_length, + max=geometry.inter_patch_max_length, + ), + ), + ), + inter_site=task_logic.VirtualSiteGenerator( + render_specification=task_logic.RenderSpecification(contrast=0.5), + label=task_logic.VirtualSiteLabels.INTERSITE, + length_distribution=task_logic.scalar_value(inter_site_length), + ), + reward_site=task_logic.VirtualSiteGenerator( + render_specification=task_logic.RenderSpecification(contrast=0.5), + label=task_logic.VirtualSiteLabels.REWARDSITE, + length_distribution=task_logic.scalar_value(geometry.reward_site_length), + ), + ), + ) + + +def make_block( + negative_probability: float, + positive_probability: float = 1.0, + reward_amount: float = REWARD_AMOUNT_UL_DEFAULT, + stop_duration: float = STOP_DURATION_BASE, + geometry: Optional[CorridorGeometry] = None, + n_pairs: int = N_PAIRS, + n_neg_each: int = 0, +) -> task_logic.Block: + """One session's block: ``ODOR_COUNT`` negative + ``ODOR_COUNT`` positive odor patches + played in a freshly generated ``Ordered`` sequence. + + ``n_neg_each`` controls how many negative-variant sites appear per pair (0 on day 1, + ramping via ``N_NEG_RAMP``); positive sites fill the remainder up to + ``N_SITES_EACH * 2`` total per pair. ``negative_probability`` sets the reward + probability for negative patches (fixed at 0 in the proportion-based design). + ``geometry`` defaults to the compressed day-1 values; ``p_ease_geometry`` eases them + toward full across sessions. + """ + geometry = geometry if geometry is not None else GEOMETRY_COMPRESSED + n_pos_each = N_SITES_EACH * 2 - n_neg_each + patches = [ + make_patch( + is_rewarded=False, + odor_index=i, + p_reward=negative_probability, + reward_amount=reward_amount, + stop_duration=stop_duration, + geometry=geometry, + ) + for i in range(ODOR_COUNT) + ] + [ + make_patch( + is_rewarded=True, + odor_index=i, + p_reward=positive_probability, + reward_amount=reward_amount, + stop_duration=stop_duration, + geometry=geometry, + ) + for i in range(ODOR_COUNT) + ] + return task_logic.Block( + environment=task_logic.SequenceEnvironment( + patches=patches, + sampling_mode="Ordered", + patch_indices=make_sequence(n_pos_each=n_pos_each, n_neg_each=n_neg_each, n_pairs=n_pairs), + ), + ) + + +def make_stop_duration_updater(initial_value: float = 0.0) -> task_logic.NumericalUpdater: + """Within-session ramp of the stop-duration offset (0 -> ``STOP_DURATION_OFFSET_MAX``).""" + return task_logic.NumericalUpdater( + operation=task_logic.NumericalUpdaterOperation.OFFSET, + parameters=task_logic.NumericalUpdaterParameters( + initial_value=initial_value, + on_success=0.01, + minimum=0.0, + maximum=STOP_DURATION_OFFSET_MAX, + ), + ) + + +def make_stop_velocity_updater( + initial_value: float = VELOCITY_THRESHOLD_START, + minimum: float = VELOCITY_THRESHOLD_FLOOR, + maximum: float = VELOCITY_THRESHOLD_START, +) -> task_logic.NumericalUpdater: + """Within-session shaping of the stop-velocity threshold: GAIN multiplies it by 0.93 + on each rewarded stop, drawing it from ``initial_value`` down toward ``minimum`` so + the velocity slack closes as the subject practices real stops.""" + return task_logic.NumericalUpdater( + operation=task_logic.NumericalUpdaterOperation.GAIN, + parameters=task_logic.NumericalUpdaterParameters( + initial_value=initial_value, + on_success=0.93, + minimum=minimum, + maximum=maximum, + ), + ) diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/metrics.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/metrics.py new file mode 100644 index 00000000..91446843 --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/metrics.py @@ -0,0 +1,88 @@ +import logging +import os +from typing import Optional + +import pandas as pd +from aind_behavior_curriculum import Metrics +from aind_behavior_vr_foraging.data_contract import dataset as vr_foraging_dataset +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic +from contraqctor.contract.json import SoftwareEvents +from pydantic import Field, NonNegativeFloat, NonNegativeInt + +from .helpers import N_PAIRS, ODOR_COUNT + +logger = logging.getLogger(__name__) + + +class LearningSetsMetrics(Metrics): + total_water_consumed: NonNegativeFloat = Field(description="Total water (mL) consumed in the session.") + n_patches_visited: NonNegativeInt = Field(description="Number of harvest attempts (choices) made.") + n_patches_seen: NonNegativeInt = Field(description="Number of patches encountered during the session.") + last_stop_duration_offset_updater: Optional[NonNegativeFloat] = Field( + default=None, description="Stop-duration offset at the end of the session." + ) + last_stop_velocity_threshold_updater: Optional[NonNegativeFloat] = Field( + default=None, description="Stop-velocity threshold at the end of the session." + ) + last_n_neg_sites_per_pair: Optional[int] = Field( + default=None, description="Number of negative-variant sites per odor pair in the prior session's sequence." + ) + last_reward_amount: Optional[NonNegativeFloat] = Field( + default=None, description="Reward amount (uL) in the prior session's task logic." + ) + + +def _try_get_datastream_as_dataframe(datastream: SoftwareEvents) -> pd.DataFrame | None: + try: + datastream.load() + return datastream.data + except FileNotFoundError: + return None + + +def _scalar(value) -> Optional[float]: + """Best-effort extraction of a scalar from a (possibly ``Scalar``-distribution) field.""" + try: + return float(value.distribution_parameters.value) + except AttributeError: + return None + + +def metrics_from_dataset(data_directory: os.PathLike) -> LearningSetsMetrics: + dataset = vr_foraging_dataset(data_directory) + + task_logic = dataset["Behavior"]["InputSchemas"]["TaskLogic"].load().data + if isinstance(task_logic, dict): + task_logic = AindVrForagingTaskLogic.model_validate(task_logic) + + patches = task_logic.task_parameters.environment.blocks[0].environment.patches + patch_indices = task_logic.task_parameters.environment.blocks[0].environment.patch_indices + # Negative-odor variants have state_index < ODOR_COUNT. + n_neg_total = sum(1 for idx in patch_indices if idx < ODOR_COUNT) + last_n_neg_sites_per_pair = n_neg_total // N_PAIRS if patch_indices else None + last_reward_amount = _scalar(patches[0].reward_specification.amount) if patches else None + + total_water_consumed = _try_get_datastream_as_dataframe(dataset["Behavior"]["SoftwareEvents"]["GiveReward"]) + choices = _try_get_datastream_as_dataframe(dataset["Behavior"]["SoftwareEvents"]["ChoiceFeedback"]) + visited_patches = _try_get_datastream_as_dataframe(dataset["Behavior"]["SoftwareEvents"]["ActivePatch"]) + stop_duration_offset = _try_get_datastream_as_dataframe( + dataset["Behavior"]["SoftwareEvents"]["UpdaterStopDurationOffset"] + ) + stop_velocity_threshold = _try_get_datastream_as_dataframe( + dataset["Behavior"]["SoftwareEvents"]["UpdaterStopVelocityThreshold"] + ) + + return LearningSetsMetrics( + total_water_consumed=(total_water_consumed["data"].sum() if total_water_consumed is not None else 0.0) + * 1e-3, # uL -> mL + n_patches_visited=len(choices) if choices is not None else 0, + n_patches_seen=len(visited_patches) if visited_patches is not None else 0, + last_stop_duration_offset_updater=stop_duration_offset["data"].iloc[-1] + if stop_duration_offset is not None + else None, + last_stop_velocity_threshold_updater=stop_velocity_threshold["data"].iloc[-1] + if stop_velocity_threshold is not None + else None, + last_n_neg_sites_per_pair=last_n_neg_sites_per_pair, + last_reward_amount=last_reward_amount, + ) diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/policies.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/policies.py new file mode 100644 index 00000000..7206635b --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/policies.py @@ -0,0 +1,121 @@ +from typing import Callable + +from aind_behavior_services.task import distributions +from aind_behavior_vr_foraging import task_logic +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic + +from . import helpers +from .metrics import LearningSetsMetrics + +PolicyType = Callable[[LearningSetsMetrics, AindVrForagingTaskLogic], AindVrForagingTaskLogic] + + +def _iter_patches(task: AindVrForagingTaskLogic): + for block in task.task_parameters.environment.blocks: + for patch in block.environment.patches: + yield patch + + +def p_introduce_negative_sites(metrics: LearningSetsMetrics, task: AindVrForagingTaskLogic) -> AindVrForagingTaskLogic: + """Progress the negative-site proportion according to ``N_NEG_RAMP`` and regenerate + the session sequence. + + Session 1 (no prior metrics): n_neg_each = 0 — all sites are rewarded. + Subsequent sessions: walk 0 → 1 → 3 → 5 using ``N_NEG_RAMP``, then stay at 5. + Total sites per pair is always ``N_SITES_EACH * 2``; positive sites fill the + remainder. The ramp is read from ``last_n_neg_sites_per_pair``; None means + session 1 (pre-ramp). + """ + prior = metrics.last_n_neg_sites_per_pair + if prior is None: + n_neg_each = 0 + else: + ramp = helpers.N_NEG_RAMP + # Advance to the next step in the ramp, or stay at the last step + idx = next((i for i, v in enumerate(ramp) if v > prior), len(ramp) - 1) + n_neg_each = ramp[idx] + + n_pos_each = helpers.N_SITES_EACH * 2 - n_neg_each + for block in task.task_parameters.environment.blocks: + environment = block.environment + if isinstance(environment, task_logic.SequenceEnvironment): + environment.patch_indices = helpers.make_sequence(n_pos_each=n_pos_each, n_neg_each=n_neg_each) + else: + raise ValueError(f"Unexpected environment type {type(environment)}") + return task + + +def p_seed_stop_duration(metrics: LearningSetsMetrics, task: AindVrForagingTaskLogic) -> AindVrForagingTaskLogic: + """Seed this session's stop-duration offset from the prior session's end value, + eased down (``STOP_DURATION_LEARNING_FACTOR``) so the subject re-ramps from a little + below the longest stop it reached rather than starting at the top.""" + if metrics.last_stop_duration_offset_updater is None: + return task + updater = task.task_parameters.updaters.get(task_logic.UpdaterTarget.STOP_DURATION_OFFSET, None) + if updater is None: + return task + updater.parameters.initial_value = helpers.clamp( + metrics.last_stop_duration_offset_updater * helpers.STOP_DURATION_LEARNING_FACTOR, + minimum=updater.parameters.minimum, + maximum=updater.parameters.maximum, + ) + return task + + +def p_seed_stop_velocity(metrics: LearningSetsMetrics, task: AindVrForagingTaskLogic) -> AindVrForagingTaskLogic: + """Seed this session's stop-velocity threshold from the prior session's floored + value, eased up slightly (``STOP_VELOCITY_LEARNING_FACTOR``) so the subject does not + start straight at the floor. Once the threshold has asymptoted at the floor this is + effectively a no-op, so the policy can simply be dropped from later stages.""" + if metrics.last_stop_velocity_threshold_updater is None: + return task + updater = task.task_parameters.updaters.get(task_logic.UpdaterTarget.STOP_VELOCITY_THRESHOLD, None) + if updater is None: + return task + updater.parameters.initial_value = helpers.clamp( + metrics.last_stop_velocity_threshold_updater * helpers.STOP_VELOCITY_LEARNING_FACTOR, + minimum=updater.parameters.minimum, + maximum=updater.parameters.maximum, + ) + return task + + +def p_ease_geometry(metrics: LearningSetsMetrics, task: AindVrForagingTaskLogic) -> AindVrForagingTaskLogic: + """Ease the corridor geometry from the compressed (day-1, easy) values toward full + spacing, scaled by how many sites the subject travelled in the prior session + (``n_patches_seen / GEOMETRY_EASE_SITES``, clamped to 1). On the first session (no + prior metrics) the geometry stays compressed. Inter-site spacing is left fixed.""" + fraction = helpers.clamp(metrics.n_patches_seen / helpers.GEOMETRY_EASE_SITES, 0.0, 1.0) + compressed, full = helpers.GEOMETRY_COMPRESSED, helpers.GEOMETRY_FULL + inter_patch_min = helpers.lerp(compressed.inter_patch_min_length, full.inter_patch_min_length, fraction) + inter_patch_mean = helpers.lerp(compressed.inter_patch_mean_length, full.inter_patch_mean_length, fraction) + inter_patch_max = helpers.lerp(compressed.inter_patch_max_length, full.inter_patch_max_length, fraction) + reward_site_length = helpers.lerp(compressed.reward_site_length, full.reward_site_length, fraction) + for patch in _iter_patches(task): + generator = patch.patch_virtual_sites_generator + inter_patch_distribution = generator.inter_patch.length_distribution + if isinstance(inter_patch_distribution, distributions.ExponentialDistribution): + inter_patch_distribution.distribution_parameters.rate = 1.0 / inter_patch_mean + if inter_patch_distribution.scaling_parameters is not None: + inter_patch_distribution.scaling_parameters.offset = inter_patch_min + if inter_patch_distribution.truncation_parameters is not None: + inter_patch_distribution.truncation_parameters.min = inter_patch_min + inter_patch_distribution.truncation_parameters.max = inter_patch_max + generator.reward_site.length_distribution.distribution_parameters.value = reward_site_length + return task + + +def p_water_cap(metrics: LearningSetsMetrics, task: AindVrForagingTaskLogic) -> AindVrForagingTaskLogic: + """Steer reward volume toward the target water window ``[WATER_FLOOR_ML, WATER_CAP_ML]``. + Trims by ``REWARD_AMOUNT_STEP_UL`` when the prior session exceeded the cap; raises by + the same step when it fell below the floor. Both directions are clamped to + ``[REWARD_AMOUNT_UL_MIN, REWARD_AMOUNT_UL_MAX]``.""" + amount = metrics.last_reward_amount if metrics.last_reward_amount is not None else helpers.REWARD_AMOUNT_UL_DEFAULT + if metrics.total_water_consumed > helpers.WATER_CAP_ML: + amount = amount - helpers.REWARD_AMOUNT_STEP_UL + elif metrics.total_water_consumed < helpers.WATER_FLOOR_ML: + amount = amount + helpers.REWARD_AMOUNT_STEP_UL + amount = helpers.clamp(amount, helpers.REWARD_AMOUNT_UL_MIN, helpers.REWARD_AMOUNT_UL_MAX) + for patch in _iter_patches(task): + patch.reward_specification.amount = task_logic.scalar_value(amount) + return task diff --git a/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/stages.py b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/stages.py new file mode 100644 index 00000000..e40efa83 --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/src/aind_behavior_vr_foraging_curricula/learning_sets/stages.py @@ -0,0 +1,81 @@ +from aind_behavior_curriculum import MetricsProvider, Policy, Stage +from aind_behavior_vr_foraging import task_logic +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic, AindVrForagingTaskParameters + +from . import helpers +from .metrics import metrics_from_dataset +from .policies import ( + p_ease_geometry, + p_introduce_negative_sites, + p_seed_stop_duration, + p_seed_stop_velocity, + p_water_cap, +) + + +def make_s_shaping() -> Stage: + """The single shaping stage. Everything is shaped here by cross-session policies: + + * speed -- the stop-velocity threshold ramps ``60 -> 8`` cm/s within session, seeded + across days; + * geometry -- ``p_ease_geometry`` eases inter-patch / reward-site lengths from the + compressed (easy) values toward full, scaled by sites travelled; + * negative proportion -- starts at 0 neg sites (all positive), then ramps 1 → 3 → 5 + per pair via ``p_introduce_negative_sites``; negative patches are always p=0; + * stop duration -- ramps from a tiny base toward 3 s, seeded across days. + """ + return Stage( + name="shaping", + task=AindVrForagingTaskLogic( + stage_name="shaping", + task_parameters=AindVrForagingTaskParameters( + rng_seed=None, + updaters={ + task_logic.UpdaterTarget.STOP_VELOCITY_THRESHOLD: helpers.make_stop_velocity_updater(), + task_logic.UpdaterTarget.STOP_DURATION_OFFSET: helpers.make_stop_duration_updater(), + }, + environment=task_logic.BlockStructure( + blocks=[helpers.make_block(negative_probability=0.0, positive_probability=1.0, n_neg_each=0)], + sampling_mode="Sequential", + ), + operation_control=helpers.make_operation_control(velocity_threshold=helpers.VELOCITY_THRESHOLD_START), + ), + ), + start_policies=[ + Policy(p_introduce_negative_sites), + Policy(p_seed_stop_velocity), + Policy(p_seed_stop_duration), + Policy(p_ease_geometry), + ], + metrics_provider=MetricsProvider(metrics_from_dataset), + ) + + +def make_s_graduated() -> Stage: + """Negative odor fixed at 0%, stop duration fixed at 3 s, velocity fixed at the floor, + geometry at full spacing, full 5+5 site ratio (no updaters). The water-cap policy + trims reward volume across days if the prior session over-delivered water.""" + return Stage( + name="graduated", + task=AindVrForagingTaskLogic( + stage_name="graduated", + task_parameters=AindVrForagingTaskParameters( + rng_seed=None, + environment=task_logic.BlockStructure( + blocks=[ + helpers.make_block( + negative_probability=0.0, + positive_probability=1.0, + stop_duration=helpers.STOP_DURATION_GRADUATED, + geometry=helpers.GEOMETRY_FULL, + n_neg_each=helpers.N_SITES_EACH, + ) + ], + sampling_mode="Sequential", + ), + operation_control=helpers.make_operation_control(velocity_threshold=helpers.VELOCITY_THRESHOLD_FLOOR), + ), + ), + start_policies=[Policy(p_introduce_negative_sites), Policy(p_water_cap)], + metrics_provider=MetricsProvider(metrics_from_dataset), + ) diff --git a/src/packages/aind_behavior_vr_foraging_curricula/tests/learning_sets/__init__.py b/src/packages/aind_behavior_vr_foraging_curricula/tests/learning_sets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/packages/aind_behavior_vr_foraging_curricula/tests/learning_sets/test_curriculum.py b/src/packages/aind_behavior_vr_foraging_curricula/tests/learning_sets/test_curriculum.py new file mode 100644 index 00000000..39d3c886 --- /dev/null +++ b/src/packages/aind_behavior_vr_foraging_curricula/tests/learning_sets/test_curriculum.py @@ -0,0 +1,356 @@ +from typing import Any, cast + +import pytest +from aind_behavior_curriculum import Curriculum, Trainer, TrainerState +from aind_behavior_services.task import distributions +from aind_behavior_vr_foraging.task_logic import AindVrForagingTaskLogic + +from aind_behavior_vr_foraging_curricula.learning_sets import CURRICULUM, TRAINER +from aind_behavior_vr_foraging_curricula.learning_sets.curriculum import st_shaping_to_graduated +from aind_behavior_vr_foraging_curricula.learning_sets.helpers import ( + GEOMETRY_COMPRESSED, + GEOMETRY_FULL, + N_NEG_RAMP, + N_SITES_EACH, + ODOR_COUNT, + REWARD_AMOUNT_UL_DEFAULT, + REWARD_AMOUNT_UL_MAX, + REWARD_AMOUNT_UL_MIN, + STOP_DURATION_LEARNING_FACTOR, + STOP_VELOCITY_LEARNING_FACTOR, + VELOCITY_THRESHOLD_FLOOR, + VELOCITY_THRESHOLD_START, +) +from aind_behavior_vr_foraging_curricula.learning_sets.metrics import LearningSetsMetrics +from aind_behavior_vr_foraging_curricula.learning_sets.policies import ( + p_ease_geometry, + p_introduce_negative_sites, + p_seed_stop_duration, + p_seed_stop_velocity, + p_water_cap, +) +from aind_behavior_vr_foraging_curricula.learning_sets.stages import make_s_graduated, make_s_shaping + + +@pytest.fixture +def trainer() -> Trainer[Any]: + return TRAINER + + +@pytest.fixture +def curriculum() -> Curriculum[AindVrForagingTaskLogic]: + return CURRICULUM + + +@pytest.fixture +def init_state() -> TrainerState[Any]: + return TRAINER.create_enrollment() + + +def _make_metrics(**overrides: Any) -> LearningSetsMetrics: + defaults: dict[str, Any] = dict( + total_water_consumed=0.0, + n_patches_visited=0, + n_patches_seen=0, + last_stop_duration_offset_updater=None, + last_stop_velocity_threshold_updater=None, + last_n_neg_sites_per_pair=None, + last_reward_amount=None, + ) + defaults.update(overrides) + return LearningSetsMetrics(**defaults) + + +def _task(stage_factory) -> AindVrForagingTaskLogic: + return cast(AindVrForagingTaskLogic, stage_factory().task).model_copy(deep=True) + + +def _unique(values: list[float]) -> float: + assert len(set(values)) == 1, f"expected a single distinct value, got {set(values)}" + return values[0] + + +def _negative_probability(task: AindVrForagingTaskLogic) -> float: + return _unique( + [ + p.reward_specification.probability.distribution_parameters.value + for p in task.task_parameters.environment.blocks[0].environment.patches + if p.state_index < ODOR_COUNT + ] + ) + + +def _positive_probability(task: AindVrForagingTaskLogic) -> float: + return _unique( + [ + p.reward_specification.probability.distribution_parameters.value + for p in task.task_parameters.environment.blocks[0].environment.patches + if p.state_index >= ODOR_COUNT + ] + ) + + +def _reward_amount(task: AindVrForagingTaskLogic) -> float: + return _unique( + [ + p.reward_specification.amount.distribution_parameters.value + for p in task.task_parameters.environment.blocks[0].environment.patches + ] + ) + + +def _reward_site_length(task: AindVrForagingTaskLogic) -> float: + return _unique( + [ + p.patch_virtual_sites_generator.reward_site.length_distribution.distribution_parameters.value + for p in task.task_parameters.environment.blocks[0].environment.patches + ] + ) + + +def _inter_patch_max(task: AindVrForagingTaskLogic) -> float: + return _unique( + [ + p.patch_virtual_sites_generator.inter_patch.length_distribution.truncation_parameters.max + for p in task.task_parameters.environment.blocks[0].environment.patches + ] + ) + + +def _n_neg_per_pair(task: AindVrForagingTaskLogic) -> int: + from aind_behavior_vr_foraging_curricula.learning_sets.helpers import N_PAIRS + + patch_indices = task.task_parameters.environment.blocks[0].environment.patch_indices + n_neg = sum(1 for idx in patch_indices if idx < ODOR_COUNT) + return n_neg // N_PAIRS + + +# ============================================================ +# Stage-transition predicate +# ============================================================ + + +class TestShapingToGraduated: + def _passing(self) -> LearningSetsMetrics: + return _make_metrics( + last_n_neg_sites_per_pair=N_SITES_EACH, + last_stop_velocity_threshold_updater=VELOCITY_THRESHOLD_FLOOR, + n_patches_seen=300, + n_patches_visited=150, + ) + + def test_pass(self): + assert st_shaping_to_graduated(self._passing()) is True + + def test_fail_when_neg_ratio_not_full(self): + assert st_shaping_to_graduated(self._passing().model_copy(update=dict(last_n_neg_sites_per_pair=3))) is False + + def test_fail_when_velocity_not_at_final_floor(self): + assert ( + st_shaping_to_graduated(self._passing().model_copy(update=dict(last_stop_velocity_threshold_updater=30.0))) + is False + ) + + def test_fail_when_not_discriminating(self): + # 290/300 ~ 0.97 > 0.7 -> harvesting everything + assert st_shaping_to_graduated(self._passing().model_copy(update=dict(n_patches_visited=290))) is False + + def test_fail_when_metric_none(self): + assert st_shaping_to_graduated(self._passing().model_copy(update=dict(last_n_neg_sites_per_pair=None))) is False + + +# ============================================================ +# Policies +# ============================================================ + + +class TestPIntroduceNegativeSites: + def test_first_session_no_negatives(self): + task = _task(make_s_shaping) + p_introduce_negative_sites(_make_metrics(), task) + assert _n_neg_per_pair(task) == 0 + + def test_ramp_step_0_to_1(self): + task = _task(make_s_shaping) + p_introduce_negative_sites(_make_metrics(last_n_neg_sites_per_pair=0), task) + assert _n_neg_per_pair(task) == N_NEG_RAMP[0] + + def test_ramp_step_1_to_3(self): + task = _task(make_s_shaping) + p_introduce_negative_sites(_make_metrics(last_n_neg_sites_per_pair=1), task) + assert _n_neg_per_pair(task) == N_NEG_RAMP[1] + + def test_ramp_step_3_to_5(self): + task = _task(make_s_shaping) + p_introduce_negative_sites(_make_metrics(last_n_neg_sites_per_pair=3), task) + assert _n_neg_per_pair(task) == N_NEG_RAMP[2] + + def test_ramp_saturates_at_5(self): + task = _task(make_s_shaping) + p_introduce_negative_sites(_make_metrics(last_n_neg_sites_per_pair=5), task) + assert _n_neg_per_pair(task) == N_SITES_EACH + + def test_indices_within_valid_range(self): + task = _task(make_s_shaping) + p_introduce_negative_sites(_make_metrics(last_n_neg_sites_per_pair=3), task) + indices = task.task_parameters.environment.blocks[0].environment.patch_indices + assert all(0 <= idx < 2 * ODOR_COUNT for idx in indices) + + +class TestPSeedStopDuration: + def test_seeds_eased_lower(self): + task = _task(make_s_shaping) + p_seed_stop_duration(_make_metrics(last_stop_duration_offset_updater=2.0), task) + iv = task.task_parameters.updaters["StopDurationOffset"].parameters.initial_value + assert iv == pytest.approx(2.0 * STOP_DURATION_LEARNING_FACTOR) + + def test_clamps_to_max(self): + task = _task(make_s_shaping) + p_seed_stop_duration(_make_metrics(last_stop_duration_offset_updater=1000.0), task) + params = task.task_parameters.updaters["StopDurationOffset"].parameters + assert params.initial_value == params.maximum + + def test_no_op_when_metric_none(self): + task = _task(make_s_shaping) + original = task.task_parameters.updaters["StopDurationOffset"].parameters.initial_value + p_seed_stop_duration(_make_metrics(), task) + assert task.task_parameters.updaters["StopDurationOffset"].parameters.initial_value == original + + +class TestPSeedStopVelocity: + def test_shaping_stage_runs_full_velocity_ramp(self): + task = _task(make_s_shaping) + params = task.task_parameters.updaters["StopVelocityThreshold"].parameters + assert params.initial_value == pytest.approx(VELOCITY_THRESHOLD_START) + assert params.minimum == pytest.approx(VELOCITY_THRESHOLD_FLOOR) + assert params.maximum == pytest.approx(VELOCITY_THRESHOLD_START) + assert task.task_parameters.operation_control.position_control.velocity_threshold == pytest.approx( + VELOCITY_THRESHOLD_START + ) + + def test_seeds_eased_above_floor(self): + task = _task(make_s_shaping) + p_seed_stop_velocity(_make_metrics(last_stop_velocity_threshold_updater=25.0), task) + iv = task.task_parameters.updaters["StopVelocityThreshold"].parameters.initial_value + assert iv == pytest.approx(25.0 * STOP_VELOCITY_LEARNING_FACTOR) + + def test_clamps_to_max(self): + task = _task(make_s_shaping) + p_seed_stop_velocity(_make_metrics(last_stop_velocity_threshold_updater=1000.0), task) + params = task.task_parameters.updaters["StopVelocityThreshold"].parameters + assert params.initial_value == params.maximum + + def test_no_op_when_metric_none(self): + task = _task(make_s_shaping) + original = task.task_parameters.updaters["StopVelocityThreshold"].parameters.initial_value + p_seed_stop_velocity(_make_metrics(), task) + assert task.task_parameters.updaters["StopVelocityThreshold"].parameters.initial_value == original + + def test_no_velocity_updater_in_graduated_stage(self): + task = _task(make_s_graduated) + assert "StopVelocityThreshold" not in task.task_parameters.updaters + assert task.task_parameters.operation_control.position_control.velocity_threshold == pytest.approx( + VELOCITY_THRESHOLD_FLOOR + ) + + +class TestPLearnToRun: + def test_first_session_stays_compressed(self): + task = _task(make_s_shaping) + p_ease_geometry(_make_metrics(n_patches_seen=0), task) + assert _reward_site_length(task) == pytest.approx(GEOMETRY_COMPRESSED.reward_site_length) + assert _inter_patch_max(task) == pytest.approx(GEOMETRY_COMPRESSED.inter_patch_max_length) + + def test_eases_to_full_after_enough_travel(self): + task = _task(make_s_shaping) + p_ease_geometry(_make_metrics(n_patches_seen=10_000), task) + assert _reward_site_length(task) == pytest.approx(GEOMETRY_FULL.reward_site_length) + assert _inter_patch_max(task) == pytest.approx(GEOMETRY_FULL.inter_patch_max_length) + + def test_partial_easing_is_between(self): + task = _task(make_s_shaping) + from aind_behavior_vr_foraging_curricula.learning_sets.helpers import GEOMETRY_EASE_SITES + + p_ease_geometry(_make_metrics(n_patches_seen=int(GEOMETRY_EASE_SITES // 2)), task) + midpoint = 0.5 * (GEOMETRY_COMPRESSED.reward_site_length + GEOMETRY_FULL.reward_site_length) + assert _reward_site_length(task) == pytest.approx(midpoint) + + def test_inter_patch_distribution_stays_exponential(self): + task = _task(make_s_shaping) + p_ease_geometry(_make_metrics(n_patches_seen=10_000), task) + for patch in task.task_parameters.environment.blocks[0].environment.patches: + dist = patch.patch_virtual_sites_generator.inter_patch.length_distribution + assert isinstance(dist, distributions.ExponentialDistribution) + + +class TestPWaterCap: + def test_trims_when_over_budget(self): + task = _task(make_s_graduated) + p_water_cap(_make_metrics(total_water_consumed=1.2, last_reward_amount=8.0), task) + assert _reward_amount(task) == pytest.approx(7.5) + + def test_raises_when_under_floor(self): + task = _task(make_s_graduated) + p_water_cap(_make_metrics(total_water_consumed=0.5, last_reward_amount=5.0), task) + assert _reward_amount(task) == pytest.approx(5.5) + + def test_holds_within_window(self): + task = _task(make_s_graduated) + p_water_cap(_make_metrics(total_water_consumed=0.7, last_reward_amount=6.0), task) + assert _reward_amount(task) == pytest.approx(6.0) + + def test_never_below_min(self): + task = _task(make_s_graduated) + p_water_cap(_make_metrics(total_water_consumed=0.9, last_reward_amount=REWARD_AMOUNT_UL_MIN), task) + assert _reward_amount(task) == pytest.approx(REWARD_AMOUNT_UL_MIN) + + def test_never_above_max(self): + task = _task(make_s_graduated) + p_water_cap(_make_metrics(total_water_consumed=0.5, last_reward_amount=REWARD_AMOUNT_UL_MAX), task) + assert _reward_amount(task) == pytest.approx(REWARD_AMOUNT_UL_MAX) + + def test_defaults_to_default_when_metric_none(self): + task = _task(make_s_graduated) + p_water_cap(_make_metrics(total_water_consumed=0.7), task) + assert _reward_amount(task) == pytest.approx(REWARD_AMOUNT_UL_DEFAULT) + + +# ============================================================ +# Full progression +# ============================================================ + + +class TestProgression: + def test_stage_set(self, trainer: Trainer): + assert {s.name for s in trainer.curriculum.see_stages()} == {"shaping", "graduated"} + + def test_advance_to_graduated(self, trainer: Trainer, init_state: TrainerState): + state = init_state + assert state.stage is not None and state.stage.name == "shaping" + + state = trainer.evaluate( + state, + _make_metrics( + last_n_neg_sites_per_pair=N_SITES_EACH, + last_stop_velocity_threshold_updater=VELOCITY_THRESHOLD_FLOOR, + n_patches_seen=300, + n_patches_visited=150, + ), + ) + assert state.stage is not None and state.stage.name == "graduated" + + def test_stays_on_shaping_until_full_ratio(self, trainer: Trainer, init_state: TrainerState): + state = trainer.evaluate( + init_state, + _make_metrics( + last_n_neg_sites_per_pair=3, + last_stop_velocity_threshold_updater=VELOCITY_THRESHOLD_FLOOR, + n_patches_seen=300, + n_patches_visited=200, + ), + ) + assert state.stage is not None and state.stage.name == "shaping" + + def test_no_advance_on_insufficient_metrics(self, trainer: Trainer, init_state: TrainerState): + state = trainer.evaluate(init_state, _make_metrics()) + assert state.stage is not None and state.stage.name == "shaping"