diff options
| author | YurenHao0426 <Blackhao0426@gmail.com> | 2026-07-22 20:46:07 -0500 |
|---|---|---|
| committer | YurenHao0426 <Blackhao0426@gmail.com> | 2026-07-22 20:46:07 -0500 |
| commit | cb64d220efeea919c3aec676cf79715fd2a6390f (patch) | |
| tree | 974b591cc3488c6373ba8f4a7cd1011e5f68a626 /experiments/analyze_bci_td_confirmation.py | |
| parent | 1d0d538144e754cf5d39badb0fe14d2ec3d9e431 (diff) | |
test: falsify oral B protocol boundaries
Diffstat (limited to 'experiments/analyze_bci_td_confirmation.py')
| -rwxr-xr-x | experiments/analyze_bci_td_confirmation.py | 147 |
1 files changed, 76 insertions, 71 deletions
diff --git a/experiments/analyze_bci_td_confirmation.py b/experiments/analyze_bci_td_confirmation.py index 8697e38..689f3a7 100755 --- a/experiments/analyze_bci_td_confirmation.py +++ b/experiments/analyze_bci_td_confirmation.py @@ -70,6 +70,81 @@ def summarize(values): } +def r2_checks(metrics, clustered, all_role_cosines, all_signs): + """Apply the frozen R2 gate to task-clustered summary statistics.""" + learning_checks = { + "mean_intact_final_at_least_0p70": + metrics["intact_final"]["mean"] >= 0.70, + "every_task_mean_final_at_least_0p60": + min(clustered["intact_final"]) >= 0.60, + "intact_final_lower_bound_at_least_0p60": + metrics["intact_final"]["one_sided_95pct_lower"] >= 0.60, + "mean_learning_gain_at_least_0p10": + metrics["intact_gain"]["mean"] >= 0.10, + "learning_gain_lower_bound_at_least_0p05": + metrics["intact_gain"]["one_sided_95pct_lower"] >= 0.05, + "mean_fixed_gap_at_least_0p20": + metrics["fixed_final_gap"]["mean"] >= 0.20, + "fixed_gap_lower_bound_at_least_0p10": + metrics["fixed_final_gap"]["one_sided_95pct_lower"] >= 0.10, + "mean_oracle_deficit_at_most_0p10": + metrics["oracle_final_deficit"]["mean"] <= 0.10, + "oracle_deficit_upper_bound_at_most_0p20": + metrics["oracle_final_deficit"]["one_sided_95pct_upper"] <= 0.20, + "plasticity_lesion_half_margin_lower_bound_nonnegative": + metrics["plasticity_half_margin"]["one_sided_95pct_lower"] >= 0.0, + "mean_role_cosine_at_least_0p80": + metrics["role_cosine"]["mean"] >= 0.80, + "every_role_cosine_at_least_0p70": min(all_role_cosines) >= 0.70, + } + innovation_checks = { + "mean_residual_soma_corr_at_most_0p10": + metrics["residual_soma_corr"]["mean"] <= 0.10, + "residual_soma_corr_upper_bound_at_most_0p12": + metrics["residual_soma_corr"]["one_sided_95pct_upper"] <= 0.12, + "mean_raw_residual_corr_gap_at_least_0p20": + metrics["raw_residual_corr_gap"]["mean"] >= 0.20, + "raw_residual_corr_gap_lower_bound_at_least_0p15": + metrics["raw_residual_corr_gap"]["one_sided_95pct_lower"] >= 0.15, + "mean_surrounding_event_accuracy_at_least_0p55": + metrics["surrounding_event_accuracy"]["mean"] >= 0.55, + "surrounding_event_accuracy_lower_bound_at_least_0p52": + metrics["surrounding_event_accuracy"]["one_sided_95pct_lower"] >= 0.52, + "mean_decoder_distance_corr_at_least_0p10": + metrics["decoder_distance_corr"]["mean"] >= 0.10, + "decoder_distance_corr_lower_bound_at_least_0p02": + metrics["decoder_distance_corr"]["one_sided_95pct_lower"] >= 0.02, + } + vectorization_checks = { + "mean_residual_outcome_accuracy_at_least_0p57": + metrics["residual_outcome_accuracy"]["mean"] >= 0.57, + "residual_outcome_accuracy_lower_bound_at_least_0p53": + metrics["residual_outcome_accuracy"]["one_sided_95pct_lower"] >= 0.53, + "mean_residual_soma_outcome_gap_at_least_0p03": + metrics["residual_soma_outcome_gap"]["mean"] >= 0.03, + "residual_soma_outcome_gap_lower_bound_nonnegative": + metrics["residual_soma_outcome_gap"]["one_sided_95pct_lower"] >= 0.0, + "positive_sign_inversion_in_at_least_25_of_30": + sum(value > 0 for value in all_signs) >= 25, + "positive_sign_inversion_in_every_task_cluster": + min(clustered["sign_inversion"]) > 0.0, + "mean_velocity_advantage_at_least_0p05": + metrics["velocity_advantage"]["mean"] >= 0.05, + "velocity_advantage_lower_bound_nonnegative": + metrics["velocity_advantage"]["one_sided_95pct_lower"] >= 0.0, + "mean_longitudinal_prediction_at_least_0p30": + metrics["longitudinal_prediction"]["mean"] >= 0.30, + "longitudinal_prediction_lower_bound_at_least_0p10": + metrics["longitudinal_prediction"]["one_sided_95pct_lower"] >= 0.10, + } + return { + "all_records_finite_paired_and_cost_audited": True, + "learning_and_plasticity": learning_checks, + "innovation_identification_and_network_prediction": innovation_checks, + "outcome_and_causal_role_vectorization": vectorization_checks, + } + + def validate(row, path, eta, digests): require(row.get("schema_version") == 1, f"{path}: schema") args = row.get("args", {}) @@ -260,77 +335,7 @@ def main(): for row in records.values()] all_signs = [getters["sign_inversion"](row) for row in records.values()] - learning_checks = { - "mean_intact_final_at_least_0p70": - metrics["intact_final"]["mean"] >= 0.70, - "every_task_mean_final_at_least_0p60": - min(clustered["intact_final"]) >= 0.60, - "intact_final_lower_bound_at_least_0p60": - metrics["intact_final"]["one_sided_95pct_lower"] >= 0.60, - "mean_learning_gain_at_least_0p10": - metrics["intact_gain"]["mean"] >= 0.10, - "learning_gain_lower_bound_at_least_0p05": - metrics["intact_gain"]["one_sided_95pct_lower"] >= 0.05, - "mean_fixed_gap_at_least_0p20": - metrics["fixed_final_gap"]["mean"] >= 0.20, - "fixed_gap_lower_bound_at_least_0p10": - metrics["fixed_final_gap"]["one_sided_95pct_lower"] >= 0.10, - "mean_oracle_deficit_at_most_0p10": - metrics["oracle_final_deficit"]["mean"] <= 0.10, - "oracle_deficit_upper_bound_at_most_0p20": - metrics["oracle_final_deficit"]["one_sided_95pct_upper"] <= 0.20, - "plasticity_lesion_half_margin_lower_bound_nonnegative": - metrics["plasticity_half_margin"]["one_sided_95pct_lower"] >= 0.0, - "mean_role_cosine_at_least_0p80": - metrics["role_cosine"]["mean"] >= 0.80, - "every_role_cosine_at_least_0p70": min(all_role_cosines) >= 0.70, - } - innovation_checks = { - "mean_residual_soma_corr_at_most_0p10": - metrics["residual_soma_corr"]["mean"] <= 0.10, - "residual_soma_corr_upper_bound_at_most_0p12": - metrics["residual_soma_corr"]["one_sided_95pct_upper"] <= 0.12, - "mean_raw_residual_corr_gap_at_least_0p20": - metrics["raw_residual_corr_gap"]["mean"] >= 0.20, - "raw_residual_corr_gap_lower_bound_at_least_0p15": - metrics["raw_residual_corr_gap"]["one_sided_95pct_lower"] >= 0.15, - "mean_surrounding_event_accuracy_at_least_0p55": - metrics["surrounding_event_accuracy"]["mean"] >= 0.55, - "surrounding_event_accuracy_lower_bound_at_least_0p52": - metrics["surrounding_event_accuracy"]["one_sided_95pct_lower"] >= 0.52, - "mean_decoder_distance_corr_at_least_0p10": - metrics["decoder_distance_corr"]["mean"] >= 0.10, - "decoder_distance_corr_lower_bound_at_least_0p02": - metrics["decoder_distance_corr"]["one_sided_95pct_lower"] >= 0.02, - } - vectorization_checks = { - "mean_residual_outcome_accuracy_at_least_0p57": - metrics["residual_outcome_accuracy"]["mean"] >= 0.57, - "residual_outcome_accuracy_lower_bound_at_least_0p53": - metrics["residual_outcome_accuracy"]["one_sided_95pct_lower"] >= 0.53, - "mean_residual_soma_outcome_gap_at_least_0p03": - metrics["residual_soma_outcome_gap"]["mean"] >= 0.03, - "residual_soma_outcome_gap_lower_bound_nonnegative": - metrics["residual_soma_outcome_gap"]["one_sided_95pct_lower"] >= 0.0, - "positive_sign_inversion_in_at_least_25_of_30": - sum(value > 0 for value in all_signs) >= 25, - "positive_sign_inversion_in_every_task_cluster": - min(clustered["sign_inversion"]) > 0.0, - "mean_velocity_advantage_at_least_0p05": - metrics["velocity_advantage"]["mean"] >= 0.05, - "velocity_advantage_lower_bound_nonnegative": - metrics["velocity_advantage"]["one_sided_95pct_lower"] >= 0.0, - "mean_longitudinal_prediction_at_least_0p30": - metrics["longitudinal_prediction"]["mean"] >= 0.30, - "longitudinal_prediction_lower_bound_at_least_0p10": - metrics["longitudinal_prediction"]["one_sided_95pct_lower"] >= 0.10, - } - checks = { - "all_records_finite_paired_and_cost_audited": True, - "learning_and_plasticity": learning_checks, - "innovation_identification_and_network_prediction": innovation_checks, - "outcome_and_causal_role_vectorization": vectorization_checks, - } + checks = r2_checks(metrics, clustered, all_role_cosines, all_signs) passed = all( value for category, values in checks.items() |
