File size: 5,975 Bytes
bb2363d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
114
115
116
117
118
119
120
121
#!/usr/bin/env python3
"""59_suite_v060.py — Suíte de verificação consolidada v0.6.0.

Agrega: verificador NCM (55), treino conjunto fase C (56), MoE
redirecionável + acoplador (57), loop iterativo de autoajuste (58), suíte
V legada (41 — bloqueadoras) e os testes cargo (54/54). Produz o veredito
final com TODOS os gates. Saída: resultados/suite_v060_final.json
"""
import json, os, subprocess, sys

def carrega(pasta, nome):
    c = os.path.join(pasta, "resultados", nome)
    return json.load(open(c)) if os.path.exists(c) else None

def main():
    pasta = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    res = {"versao": "0.6.0", "fontes": {}, "gates": {}, "contagens": {}}

    # 1) suítes v0.6.0 já executadas
    for arq, nome in [("verificador_ncm_v060.json", "verificador"),
                      ("treino_conjunto_v060.json", "fase_c"),
                      ("moe_redirecionavel_v060.json", "moe"),
                      ("autoajuste_iterativo_v060.json", "iterativo")]:
        d = carrega(pasta, arq)
        if d is None:
            print(f"AVISO: {arq} ausente — rode o script correspondente antes")
            continue
        res["fontes"][nome] = arq
        if nome == "verificador":
            for n, s in d["demos"].items():
                if isinstance(s, dict):
                    res["gates"].update({f"{n}.{g[5:]}": v for g, v in s.items() if g.startswith("gate_")})
                    if isinstance(s.get("gates"), dict):
                        res["gates"].update({f"{n}.{g[5:]}": v for g, v in s["gates"].items() if g.startswith("gate_")})
            res["contagens"][nome] = d["resumo"]
        elif nome == "fase_c":
            res["gates"].update({f"fase_c.{k}": v for k, v in d["gates"].items()})
            rc = d["fases"]["c"]
            res["contagens"][nome] = {
                "ce_global": [rc["ce_inicial"], rc["ce_final"]],
                "ce_gatilhada_sem_com": [rc["ce_gatilhada_sem_correcao"], rc["ce_gatilhada_com_correcao"]],
                "confianca": [rc["confianca_media_inicial"], rc["confianca_media_final"]],
                "ece": [rc["ece_antes"], rc["ece_depois"]],
                "rodadas_acoplador": rc["rodadas_acoplador"],
                "taxa_gatilho": rc["taxa_gatilho"],
            }
        elif nome == "moe":
            for n, s in d["demos"].items():
                if isinstance(s, dict):
                    res["gates"].update({f"{n}.{g[5:]}": v for g, v in s.items() if g.startswith("gate_")})
                    if isinstance(s.get("gates"), dict):
                        res["gates"].update({f"{n}.{g[5:]}": v for g, v in s["gates"].items() if g.startswith("gate_")})
            res["contagens"][nome] = d["resumo"]
            c = d["demos"]["som_moe"]
            res["contagens"]["som_qe"] = [c["qe_antes"], c["qe_depois_water_filling"]]
            j = d["demos"]["jepa_moe"]["bracos"]
            res["contagens"]["jepa_final"] = {k: v["perda_pred_final"] for k, v in j.items()}
        elif nome == "iterativo":
            res["gates"].update({f"iter.{k}": v for k, v in d["gates"].items()})
            res["contagens"][nome] = {
                "vencedor": d["consolidacao"]["vencedor"],
                "gap_vs_baseline_pct": d["consolidacao"]["gap_vs_baseline_pct"],
                "arrependimento": d["consolidacao"]["arrependimento_medio"],
                "rodadas": len(d["rodadas"]),
            }

    # 2) suíte V legada (bloqueadoras — 41)
    d = carrega(pasta, "suite_v.json")
    if d:
        res["fontes"]["suite_v_legada"] = "suite_v.json"
        bloqueadoras = {k: v for k, v in d.items()
                        if k.startswith("V") and k != "VEREDITO" and isinstance(v, dict) and v.get("ok") is True}
        total_v = sum(1 for k in d if k.startswith("V") and k != "VEREDITO")
        res["contagens"]["suite_v_legada"] = f"{len(bloqueadoras)}/{total_v}"
        res["gates"]["legada_suite_v"] = len(bloqueadoras) >= 7

    # 3) testes cargo (contagem)
    try:
        out = subprocess.run(["cargo", "test", "--release"], cwd=pasta,
                             capture_output=True, text=True, timeout=600,
                             env={**os.environ, "PATH": os.environ["PATH"] + ":/home/z/.cargo/bin"})
        m = [l for l in out.stdout.splitlines() if "test result: ok" in l]
        n = int(m[0].split()[3]) if m else 0
        res["contagens"]["cargo"] = f"{n}/{n}" if n else "FALHOU"
        res["gates"]["cargo_54"] = n >= 54
    except Exception as e:
        res["contagens"]["cargo"] = f"erro: {e}"
        res["gates"]["cargo_54"] = False

    # 4) veredito
    ok = sum(1 for v in res["gates"].values() if v)
    total = len(res["gates"])
    res["veredito"] = {
        "gates_totais": total, "gates_ok": ok,
        "aprovado": ok == total,
        "declaracao": (
            f"v0.6.0 APROVADA: {ok}/{total} gates verdes — verificador NCM calibrado "
            "(sem oráculo, soundness V-2), treino conjunto Pensamento↔backbone com "
            "acoplador duplex, MoEs redirecionáveis c/ atenção própria (JEPA e SOM), "
            "autoajuste por telemetria (A-1..A-5) e seleção de arquitetura UCB1 — "
            "tudo com dados reais da Wikipédia PT-BR."
        ) if ok == total else f"v0.6.0 REPROVADA: {total - ok} gates falharam",
    }
    print("=== SUÍTE CONSOLIDADA v0.6.0 ===")
    for k, v in sorted(res["contagens"].items()):
        print(f"  {k}: {v}")
    print(f"\n=== VEREDITO: {ok}/{total} gates verdes — "
          f"{'APROVADA' if ok == total else 'REPROVADA'} ===")
    for g, v in res["gates"].items():
        if not v:
            print(f"  FALHOU {g}")

    with open(os.path.join(pasta, "resultados", "suite_v060_final.json"), "w") as f:
        json.dump(res, f, indent=1, ensure_ascii=False)
    print("salvo: resultados/suite_v060_final.json")
    if not res["veredito"]["aprovado"]:
        sys.exit(1)

if __name__ == "__main__":
    main()