File size: 5,408 Bytes
32f5a65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from __future__ import annotations

import json
from pathlib import Path

import pandas as pd


def test_run_multigroup_ablation_analysis_writes_expected_outputs(tmp_path: Path) -> None:
    from sepsis_mcp.appendix_multigroup_ablation import (
        build_multigroup_summary,
        write_multigroup_outputs,
    )

    overall = pd.DataFrame(
        [
            {
                "run_id": "seed0-bin",
                "grouping_variant": "binary_selected",
                "group_count": 2,
                "method": "missingness_aware",
                "empirical_coverage": 0.90,
                "max_group_coverage_gap": 0.02,
                "average_set_size": 0.95,
            },
            {
                "run_id": "seed0-k4",
                "grouping_variant": "mask_cluster_k4",
                "group_count": 4,
                "method": "missingness_aware",
                "empirical_coverage": 0.89,
                "max_group_coverage_gap": 0.04,
                "average_set_size": 0.96,
            },
        ]
    )
    subgroup = pd.DataFrame(
        [
            {"run_id": "seed0-bin", "grouping_variant": "binary_selected", "method": "missingness_aware", "group": 0, "count": 120},
            {"run_id": "seed0-bin", "grouping_variant": "binary_selected", "method": "missingness_aware", "group": 1, "count": 130},
            {"run_id": "seed0-k4", "grouping_variant": "mask_cluster_k4", "method": "missingness_aware", "group": 0, "count": 40},
            {"run_id": "seed0-k4", "grouping_variant": "mask_cluster_k4", "method": "missingness_aware", "group": 1, "count": 50},
            {"run_id": "seed0-k4", "grouping_variant": "mask_cluster_k4", "method": "missingness_aware", "group": 2, "count": 55},
            {"run_id": "seed0-k4", "grouping_variant": "mask_cluster_k4", "method": "missingness_aware", "group": 3, "count": 60},
        ]
    )

    summary = build_multigroup_summary(overall_summary=overall, subgroup_summary=subgroup)
    paths = write_multigroup_outputs(summary=summary, output_dir=tmp_path / "multigroup")
    manifest = json.loads(paths["manifest"].read_text(encoding="utf-8"))
    written = pd.read_csv(paths["summary"])

    assert "smallest_group_size_mean" in written.columns
    assert written.loc[written["grouping_variant"] == "binary_selected", "smallest_group_size_mean"].iloc[0] == 120
    assert Path(manifest["summary"]).exists()


def test_build_negative_case_summary_flags_neutral_or_worse_mcar_rows() -> None:
    from sepsis_mcp.appendix_negative_case_analysis import build_negative_case_summary

    combined = pd.DataFrame(
        [
            {"delta_m": 0.0, "mechanism": "mcar", "method": "standard", "max_group_coverage_gap_mean": 0.010, "empirical_coverage_mean": 0.902, "average_set_size_mean": 1.01},
            {"delta_m": 0.0, "mechanism": "mcar", "method": "mondrian_tilted", "max_group_coverage_gap_mean": 0.012, "empirical_coverage_mean": 0.901, "average_set_size_mean": 1.02},
            {"delta_m": 0.1, "mechanism": "mcar", "method": "standard", "max_group_coverage_gap_mean": 0.020, "empirical_coverage_mean": 0.903, "average_set_size_mean": 1.03},
            {"delta_m": 0.1, "mechanism": "mcar", "method": "mondrian_tilted", "max_group_coverage_gap_mean": 0.019, "empirical_coverage_mean": 0.902, "average_set_size_mean": 1.04},
        ]
    )

    summary = build_negative_case_summary(combined)

    assert set(summary["mechanism"]) == {"mcar"}
    assert "gap_advantage_vs_standard" in summary.columns
    assert bool(summary.loc[summary["delta_m"] == 0.0, "is_neutral_or_worse"].iloc[0]) is True


def test_summarize_runtime_records_computes_relative_overhead() -> None:
    from sepsis_mcp.appendix_runtime_analysis import summarize_runtime_records

    records = pd.DataFrame(
        [
            {"method": "standard", "stage": "calibration", "seconds": 0.50},
            {"method": "standard", "stage": "test", "seconds": 0.10},
            {"method": "missingness_aware", "stage": "calibration", "seconds": 0.55},
            {"method": "missingness_aware", "stage": "test", "seconds": 0.12},
            {"method": "cp_mda_exact", "stage": "calibration", "seconds": 1.50},
            {"method": "cp_mda_exact", "stage": "test", "seconds": 0.30},
        ]
    )

    summary = summarize_runtime_records(records)

    assert "relative_to_standard" in summary.columns
    assert summary.loc[(summary["method"] == "missingness_aware") & (summary["stage"] == "calibration"), "relative_to_standard"].iloc[0] == 1.10
    assert summary.loc[(summary["method"] == "cp_mda_exact") & (summary["stage"] == "test"), "relative_to_standard"].iloc[0] == 3.00


def test_write_implementation_details_emits_expected_sections(tmp_path: Path) -> None:
    from sepsis_mcp.appendix_implementation_details import write_implementation_details

    output_path = tmp_path / "IMPLEMENTATION_DETAILS.md"
    manifest_path = tmp_path / "manifest.json"
    write_implementation_details(output_path=output_path, manifest_path=manifest_path)

    text = output_path.read_text(encoding="utf-8")
    manifest = json.loads(manifest_path.read_text(encoding="utf-8"))

    assert "Implementation Details" in text
    assert "GOSSIS Classification Defaults" in text
    assert "MIMIC-IV Validation Defaults" in text
    assert "Conformity Scores" in text
    assert Path(manifest["implementation_details"]).exists()