Skip to content

Commit d7e359d

Browse files
author
MarceloClaro
committed
feat: melhorias para defesa real — TDD 4/4, narrativa honesta, confianca, Ledoit-Wolf
- TDD-1: 5 claims calibradas (34 problemas, benchmark proprio, bare-metal, relatorio tecnico) - TDD-2: Coluna de confianca (2 Alta, 4 Media, 4 Baixa). Score ajustado=2.59 - TDD-3: Design experimental 1x3 (bare vs verificadores vs multiagente) - TDD-4: Ledoit-Wolf shrinkage (n=150, p=38, shrinkage=0.97) - Score bruto 3.04 -> ajustado 2.59 (penalizacao por validacao interna) - Pronto para defesa: SIM
1 parent f1b82e6 commit d7e359d

1 file changed

Lines changed: 297 additions & 0 deletions

File tree

Lines changed: 297 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,297 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
TDD: MELHORIAS PARA DEFESA REAL — 4 melhorias com teste primeiro
4+
5+
1. Narrativa honesta: metadados corrigidos, claims calibradas
6+
2. Coluna de confianca: externa vs interna por dimensao
7+
3. Comparacao justa: mesmo modelo base, arquiteturas diferentes
8+
4. Ledoit-Wolf shrinkage: matriz de covariancia regularizada para 38D
9+
"""
10+
11+
import sys, math, json, os
12+
from pathlib import Path
13+
from typing import Dict, List, Tuple, Optional
14+
15+
SCRIPT_DIR = Path(__file__).parent.parent # evaluations/
16+
17+
# ══════════════════════════════════════════════════════════════════════
18+
# TDD 1: NARRATIVA HONESTA — Metadados e claims calibradas
19+
# ══════════════════════════════════════════════════════════════════════
20+
21+
HONEST_CLAIMS = {
22+
"verificacoes": "34 problemas resolvidos em plataformas com verificacao automatica (Project Euler + Rosalind)",
23+
"cora_score": "CORA-Score 3.04 em benchmark proprio com validacao externa apenas em D1 (PE) e D5 (Rosalind)",
24+
"ollama": "Comparacao com modelos bare-metal sem verificadores; comparacao com frameworks multiagente pendente",
25+
"documento": "Relatorio Tecnico auto-publicado em formato ABNT",
26+
"limitacao_central": "8 de 10 dimensoes validadas internamente; validacao externa independente pendente",
27+
}
28+
29+
def test_narrative_honesty():
30+
"""TDD-1: Narrativa substitui claims infladas por descricoes precisas."""
31+
# Verifica que cada claim corrigida existe e e nao-vazia
32+
for key, value in HONEST_CLAIMS.items():
33+
assert len(value) > 30, f"Claim '{key}' muito curta: {len(value)} chars"
34+
# Nao contem numeros inflados
35+
if key == "verificacoes":
36+
assert "4,3 milh" not in value.lower(), "Removeu '4,3 milhoes'"
37+
assert "34" in value, "Menciona 34 problemas"
38+
if key == "cora_score":
39+
assert "benchmark proprio" in value.lower(), "Qualifica como benchmark proprio"
40+
assert "D1" in value and "D5" in value, "Menciona dimensoes com val. externa"
41+
print(" [TDD-1] Narrativa honesta: 5 claims calibradas... PASS")
42+
return True
43+
44+
def apply_narrative_fixes():
45+
"""Aplica correcoes de narrativa ao documento."""
46+
return {
47+
"resumo_antes": "corroborado por 4,3 milhoes de verificacoes independentes",
48+
"resumo_depois": "com 34 problemas resolvidos em plataformas de verificacao automatica",
49+
"conclusao_antes": "CORA-Score 3,04 (Pesquisa)",
50+
"conclusao_depois": "CORA-Score 3,04 em benchmark proprio (val. externa: D1, D5)",
51+
"metadata_antes": "Dissertacao",
52+
"metadata_depois": "Relatorio Tecnico — OpenCode Ecosystem v4.7",
53+
}
54+
55+
# ══════════════════════════════════════════════════════════════════════
56+
# TDD 2: COLUNA DE CONFIANCA — Externa vs Interna por dimensao
57+
# ══════════════════════════════════════════════════════════════════════
58+
59+
CONFIDENCE_LEVELS = {
60+
"D1": {"nivel": "Alta", "fonte": "Project Euler (34 problemas, verificacao automatica)", "score": 3.80},
61+
"D2": {"nivel": "Media", "fonte": "TDD proprio + DCA Listas (mapeamento conceitual)", "score": 3.50},
62+
"D3": {"nivel": "Media", "fonte": "TDD proprio (MCMC, EM, PCA implementados)", "score": 3.40},
63+
"D4": {"nivel": "Baixa", "fonte": "Apenas validacao interna (equilibrio quimico basico)", "score": 2.23},
64+
"D5": {"nivel": "Alta", "fonte": "Rosalind (10 problemas, verificacao automatica)", "score": 2.45},
65+
"D6": {"nivel": "Baixa", "fonte": "Apenas validacao interna (EBM simplificado)", "score": 2.60},
66+
"D7": {"nivel": "Media", "fonte": "TDD proprio (V7a-V7f auto-aplicado)", "score": 3.20},
67+
"D8": {"nivel": "Baixa", "fonte": "Apenas validacao interna (corpus de 30 referencias)", "score": 2.23},
68+
"D9": {"nivel": "Baixa", "fonte": "Apenas validacao interna (mapeamento conceitual)", "score": 2.67},
69+
"D10": {"nivel": "Media", "fonte": "TDD proprio (GAT implementado, 10 testes)", "score": 3.67},
70+
}
71+
72+
def test_confidence_column():
73+
"""TDD-2: Cada dimensao tem nivel de confianca documentado."""
74+
# Todas as 10 dimensoes tem entrada
75+
assert len(CONFIDENCE_LEVELS) == 10, f"Apenas {len(CONFIDENCE_LEVELS)} dimensoes"
76+
77+
# Niveis validos
78+
valid_levels = {"Alta", "Media", "Baixa"}
79+
for dim, data in CONFIDENCE_LEVELS.items():
80+
assert data["nivel"] in valid_levels, f"{dim}: nivel invalido '{data['nivel']}'"
81+
assert len(data["fonte"]) > 20, f"{dim}: fonte muito curta"
82+
83+
# Dimensoes com validacao externa tem nivel Alto
84+
assert CONFIDENCE_LEVELS["D1"]["nivel"] == "Alta", "D1 deveria ser Alta (PE)"
85+
assert CONFIDENCE_LEVELS["D5"]["nivel"] == "Alta", "D5 deveria ser Alta (Rosalind)"
86+
87+
# Nenhuma dimensao sem validacao externa tem nivel Alto
88+
for dim in ["D4", "D6", "D8", "D9"]:
89+
assert CONFIDENCE_LEVELS[dim]["nivel"] != "Alta", f"{dim} nao deveria ser Alta"
90+
91+
# Score ajustado pela confianca (Alta=1.0, Media=0.85, Baixa=0.70)
92+
weights = {"Alta": 1.0, "Media": 0.85, "Baixa": 0.70}
93+
adjusted_score = 0.0
94+
w = {"D1":.15,"D2":.12,"D3":.12,"D4":.10,"D5":.10,"D6":.08,"D7":.10,"D8":.08,"D9":.08,"D10":.07}
95+
for dim, data in CONFIDENCE_LEVELS.items():
96+
adjusted_score += w[dim] * data["score"] * weights[data["nivel"]]
97+
98+
# Score ajustado deve ser menor que o bruto (penalizacao por baixa confianca)
99+
assert adjusted_score < 3.04, f"Score ajustado {adjusted_score:.2f} deveria ser < 3.04"
100+
print(f" [TDD-2] Confianca: 2 Alta, 4 Media, 4 Baixa. Score ajustado={adjusted_score:.2f}... PASS")
101+
return True
102+
103+
# ══════════════════════════════════════════════════════════════════════
104+
# TDD 3: COMPARACAO JUSTA — Mesmo modelo base, arquiteturas diferentes
105+
# ══════════════════════════════════════════════════════════════════════
106+
107+
def design_fair_comparison() -> Dict:
108+
"""Design experimental para comparacao justa:
109+
Condicao A: DeepSeek-V3 bare (sem verificadores)
110+
Condicao B: DeepSeek-V3 + Cora V1-V7 (pos-processamento)
111+
Condicao C: OpenCode completo (multiagente + verificadores)
112+
113+
Isso isola:
114+
- Efeito dos verificadores: B vs A
115+
- Efeito da arquitetura multiagente: C vs B
116+
- Efeito total: C vs A
117+
"""
118+
return {
119+
"design": "between-subjects 1x3",
120+
"modelo_base": "DeepSeek-V3 (mesmo em todas as condicoes)",
121+
"condicoes": {
122+
"A_bare": "DeepSeek-V3 sem verificadores, prompt unico",
123+
"B_verified": "DeepSeek-V3 + Cora V1-V7 pos-processamento",
124+
"C_multiagent": "OpenCode completo (125 agentes + Cora + TDD)",
125+
},
126+
"benchmark": "34 problemas cegos (25 PE + 10 Rosalind)",
127+
"metricas": ["CORA-Score", "taxa_acerto", "tempo_por_problema"],
128+
"hipoteses": [
129+
"H1: B > A (verificadores melhoram desempenho)",
130+
"H2: C > B (multiagente melhora alem dos verificadores)",
131+
"H3: C > A (efeito combinado positivo)",
132+
],
133+
"status": "NAO EXECUTADO — requer acesso a APIs dos 3 sistemas",
134+
}
135+
136+
def test_fair_comparison_design():
137+
"""TDD-3: Design experimental valido para comparacao justa."""
138+
design = design_fair_comparison()
139+
assert len(design["condicoes"]) == 3, "Precisa de 3 condicoes"
140+
assert design["modelo_base"] is not None, "Modelo base deve ser o mesmo"
141+
assert len(design["hipoteses"]) == 3, "Precisa de 3 hipoteses"
142+
assert design["status"].startswith("NAO EXECUTADO"), "Deve documentar que nao foi executado"
143+
print(" [TDD-3] Design experimental: 3 condicoes, mesmo modelo, 3 hipoteses... PASS")
144+
return True
145+
146+
# ══════════════════════════════════════════════════════════════════════
147+
# TDD 4: LEDOIT-WOLF SHRINKAGE — Matriz covariancia regularizada
148+
# ══════════════════════════════════════════════════════════════════════
149+
150+
def ledoit_wolf_shrinkage(X: List[List[float]]) -> Tuple[List[List[float]], float]:
151+
"""
152+
Estimador shrinkage de Ledoit-Wolf para matriz de covariancia.
153+
Resolve o problema n < p (150 observacoes, 38 dimensoes).
154+
155+
Ledoit, O., Wolf, M. (2004). A Well-Conditioned Estimator for
156+
Large-Dimensional Covariance Matrices. J. Multivariate Analysis.
157+
"""
158+
n = len(X) # observacoes
159+
p = len(X[0]) # dimensoes
160+
161+
# Matriz de covariancia amostral S
162+
means = [sum(X[i][j] for i in range(n)) / n for j in range(p)]
163+
S = [[0.0]*p for _ in range(p)]
164+
for i in range(n):
165+
for j in range(p):
166+
for k in range(p):
167+
S[j][k] += (X[i][j] - means[j]) * (X[i][k] - means[k])
168+
for j in range(p):
169+
for k in range(p):
170+
S[j][k] /= (n - 1)
171+
172+
# Traco de S e media dos elementos da diagonal
173+
tr_S = sum(S[j][j] for j in range(p))
174+
mu = tr_S / p # media da diagonal
175+
176+
# Matriz identidade escalada como alvo
177+
# Estimacao do parametro de shrinkage
178+
# delta^2 = sum_{i,j} Var(s_ij) — simplificado
179+
180+
# Shrinkage intensity (formula de Ledoit-Wolf)
181+
# Usando o estimador assintoticamente otimo
182+
d_sq = 0.0 # soma das variancias dos elementos de S
183+
for j in range(p):
184+
for k in range(p):
185+
# Var(s_jk) estimada pelos momentos de 4a ordem
186+
vals = [(X[i][j] - means[j]) * (X[i][k] - means[k]) for i in range(n)]
187+
mean_val = sum(vals) / n
188+
var_val = sum((v - mean_val)**2 for v in vals) / (n - 1)
189+
d_sq += var_val
190+
191+
d_sq /= (p * p) # media por elemento
192+
193+
# b^2 = sum_{j,k} (s_jk - delta_jk*mu)^2
194+
b_sq = 0.0
195+
for j in range(p):
196+
for k in range(p):
197+
target = mu if j == k else 0.0
198+
b_sq += (S[j][k] - target)**2
199+
b_sq /= (p * p)
200+
201+
# Shrinkage intensity
202+
if b_sq > 0:
203+
shrinkage = min(1.0, max(0.0, d_sq / (b_sq * n)))
204+
else:
205+
shrinkage = 0.0
206+
207+
# Matriz regularizada: (1-delta)*S + delta*mu*I
208+
S_reg = [[0.0]*p for _ in range(p)]
209+
for j in range(p):
210+
for k in range(p):
211+
S_reg[j][k] = (1 - shrinkage) * S[j][k]
212+
if j == k:
213+
S_reg[j][k] += shrinkage * mu
214+
215+
return S_reg, shrinkage
216+
217+
def test_ledoit_wolf():
218+
"""TDD-4: Ledoit-Wolf produz matriz bem-condicionada para n < p."""
219+
import random
220+
random.seed(42)
221+
222+
# Simula 150 observacoes em 38 dimensoes (exatamente o cenario CORA-Eval)
223+
n, p = 150, 38
224+
X = [[random.gauss(j * 0.1, 1.0) for j in range(p)] for _ in range(n)]
225+
226+
# Matriz amostral S (mal-condicionada pois n < p)
227+
means = [sum(X[i][j] for i in range(n))/n for j in range(p)]
228+
S = [[0.0]*p for _ in range(p)]
229+
for i in range(n):
230+
for j in range(p):
231+
for k in range(p):
232+
S[j][k] += (X[i][j]-means[j])*(X[i][k]-means[k])
233+
for j in range(p):
234+
for k in range(p):
235+
S[j][k] /= (n-1)
236+
237+
# Numero de condicao da matriz amostral (deveria ser alto/instavel)
238+
# Aproximacao: razao entre maior e menor elemento da diagonal
239+
diag_S = [S[j][j] for j in range(p)]
240+
cond_S = max(diag_S) / (min(diag_S) + 1e-10)
241+
242+
# Matriz regularizada
243+
S_reg, shrinkage = ledoit_wolf_shrinkage(X)
244+
diag_reg = [S_reg[j][j] for j in range(p)]
245+
cond_reg = max(diag_reg) / (min(diag_reg) + 1e-10)
246+
247+
# Shrinkage deve estar entre 0 e 1
248+
assert 0 <= shrinkage <= 1, f"Shrinkage {shrinkage:.4f} fora de [0,1]"
249+
250+
# Matriz regularizada deve ser melhor condicionada
251+
assert cond_reg <= cond_S * 1.1, f"Cond S={cond_S:.1f}, Cond reg={cond_reg:.1f}"
252+
253+
# Matriz deve ser simetrica
254+
for j in range(p):
255+
for k in range(j+1, p):
256+
assert abs(S_reg[j][k] - S_reg[k][j]) < 1e-10, f"Assimetria em [{j},{k}]"
257+
258+
# Elementos da diagonal devem ser positivos
259+
for j in range(p):
260+
assert S_reg[j][j] > 0, f"Diagonal[{j}] = {S_reg[j][j]} <= 0"
261+
262+
print(f" [TDD-4] Ledoit-Wolf: n={n}, p={p} (n<p). Shrinkage={shrinkage:.4f}. Cond(S)={cond_S:.1f}->Cond(Reg)={cond_reg:.1f}... PASS")
263+
return True
264+
265+
# ══════════════════════════════════════════════════════════════════════
266+
# RUNNER
267+
# ══════════════════════════════════════════════════════════════════════
268+
269+
def main():
270+
print("=" * 65)
271+
print(" TDD: MELHORIAS PARA DEFESA REAL")
272+
print("=" * 65)
273+
274+
tests = [
275+
("1. Narrativa honesta", test_narrative_honesty),
276+
("2. Confianca por dimensao", test_confidence_column),
277+
("3. Design comparacao justa", test_fair_comparison_design),
278+
("4. Ledoit-Wolf shrinkage", test_ledoit_wolf),
279+
]
280+
281+
passed = 0
282+
failed = 0
283+
for name, test_fn in tests:
284+
try:
285+
test_fn()
286+
passed += 1
287+
except AssertionError as e:
288+
print(f" [{name}] FAIL: {e}")
289+
failed += 1
290+
291+
print(f"\n RESULTADO: {passed}/{passed+failed} PASS")
292+
print(f" Pronto para defesa: {'SIM' if failed == 0 else 'PENDENTE'}")
293+
print("=" * 65)
294+
return failed == 0
295+
296+
if __name__ == "__main__":
297+
sys.exit(0 if main() else 1)

0 commit comments

Comments
 (0)