| |
| """Deterministic finite and formula audit for networked BCE information aggregation.""" |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import csv |
| import hashlib |
| import itertools |
| import json |
| import math |
| from pathlib import Path |
|
|
| import matplotlib |
|
|
| matplotlib.use("Agg") |
| import matplotlib.pyplot as plt |
| import numpy as np |
|
|
|
|
| PDF_SHA256 = "ca7263e8fd591b27cbd3f869d93ffe1818af27baaa439f278a27a5248ddd92b7" |
| SOURCE_SHA256 = "d17612d6f31795fe581812dd7e20bf00ce5fabc7408e61411b439232b9917417" |
|
|
| CLAIMS = [ |
| "Theorem 3.7 proves an upper bound on excess risk of B_p* * B_X * M/sqrt(D) under an M-coverage condition on depth-D DAGs, extending networked information aggregation from squared loss to Binary Cross-Entropy-based binary classification (Theorem 3.7).", |
| "Theorem 4.5 proves a matching lower bound showing instances with excess loss of at least Omega(k/D), where k is feature dimension and D is path depth, establishing network depth as a necessary bottleneck (Theorem 4.5).", |
| "Lemma 3.1 establishes an orthogonality property of Binary Cross-Entropy residuals, E[x(p*(x)-y)] = 0, replacing the variance-decomposition tools used in prior squared-loss analyses (Lemma 3.1).", |
| "Lemma 3.3 provides a KL/Bregman-type loss decomposition L(q) = L(p*) + D(p*||q), used with Pinsker-style bounds to connect BCE progress to prediction error (Lemma 3.3).", |
| "The protocol models a sequential DAG in which each agent observes only a subset of features, receives parent logits (not probabilities), and locally minimizes Binary Cross-Entropy before passing its own logits downstream (Section 2).", |
| ] |
|
|
|
|
| def sha256(path: Path) -> str: |
| digest = hashlib.sha256() |
| with path.open("rb") as handle: |
| for block in iter(lambda: handle.read(1 << 20), b""): |
| digest.update(block) |
| return digest.hexdigest() |
|
|
|
|
| def stable_float(value: float) -> float: |
| return round(float(value), 12) |
|
|
|
|
| def write_csv(path: Path, rows: list[dict]) -> None: |
| if not rows: |
| raise ValueError(f"no rows for {path}") |
| with path.open("w", newline="", encoding="utf-8") as handle: |
| writer = csv.DictWriter(handle, fieldnames=list(rows[0])) |
| writer.writeheader() |
| writer.writerows(rows) |
|
|
|
|
| def sigmoid(logit: np.ndarray) -> np.ndarray: |
| clipped = np.clip(logit, -40.0, 40.0) |
| return 1.0 / (1.0 + np.exp(-clipped)) |
|
|
|
|
| def bce_loss(logit: np.ndarray, target_probability: np.ndarray, weights: np.ndarray) -> float: |
| return float(np.sum(weights * (np.logaddexp(0.0, logit) - target_probability * logit))) |
|
|
|
|
| def fit_logistic( |
| design: np.ndarray, |
| target_probability: np.ndarray, |
| weights: np.ndarray, |
| initial: np.ndarray | None = None, |
| ) -> np.ndarray: |
| theta = np.zeros(design.shape[1]) if initial is None else initial.astype(float).copy() |
| for _ in range(120): |
| logit = design @ theta |
| probability = sigmoid(logit) |
| gradient = design.T @ (weights * (probability - target_probability)) |
| curvature = weights * probability * (1.0 - probability) |
| hessian = design.T @ (design * curvature[:, None]) |
| hessian += 1e-11 * np.eye(hessian.shape[0]) |
| step = np.linalg.lstsq(hessian, gradient, rcond=None)[0] |
| if np.linalg.norm(step) < 1e-13: |
| break |
| current = bce_loss(logit, target_probability, weights) |
| scale = 1.0 |
| while scale > 1e-8: |
| candidate = theta - scale * step |
| if bce_loss(design @ candidate, target_probability, weights) <= current + 1e-15: |
| theta = candidate |
| break |
| scale *= 0.5 |
| if scale <= 1e-8: |
| break |
| return theta |
|
|
|
|
| def finite_support(dimension: int) -> np.ndarray: |
| return np.asarray(list(itertools.product((-1.0, 1.0), repeat=dimension))) |
|
|
|
|
| def orthogonality_decomposition_audit() -> tuple[list[dict], dict]: |
| rows: list[dict] = [] |
| for seed in range(24): |
| rng = np.random.default_rng(101000 + seed) |
| dimension = 3 + seed % 4 |
| raw = finite_support(dimension) |
| probability_weights = rng.dirichlet(np.full(len(raw), 1.5)) |
| true_theta = rng.normal(scale=0.55, size=dimension) |
| nonlinear = 0.45 * raw[:, 0] * raw[:, 1] - 0.25 * raw[:, -1] * raw[:, -2] |
| target_probability = sigmoid(raw @ true_theta + nonlinear) |
| used = 2 + seed % (dimension - 1) |
| design = np.column_stack([np.ones(len(raw)), raw[:, :used]]) |
| optimum = fit_logistic(design, target_probability, probability_weights) |
| p_star = sigmoid(design @ optimum) |
| residual_moment = design.T @ (probability_weights * (p_star - target_probability)) |
| perturbation = rng.normal(scale=0.35, size=len(optimum)) |
| q_theta = optimum + perturbation |
| q = sigmoid(design @ q_theta) |
| loss_star = bce_loss(design @ optimum, target_probability, probability_weights) |
| loss_q = bce_loss(design @ q_theta, target_probability, probability_weights) |
| kl = float( |
| np.sum( |
| probability_weights |
| * ( |
| p_star * np.log(p_star / q) |
| + (1.0 - p_star) * np.log((1.0 - p_star) / (1.0 - q)) |
| ) |
| ) |
| ) |
| pinsker_rhs = float(2.0 * np.sum(probability_weights * (p_star - q) ** 2)) |
| nonoptimal_reference = optimum + 0.2 * np.sign(perturbation + 1e-9) |
| reference_probability = sigmoid(design @ nonoptimal_reference) |
| reference_loss = bce_loss( |
| design @ nonoptimal_reference, target_probability, probability_weights |
| ) |
| reference_kl = float( |
| np.sum( |
| probability_weights |
| * ( |
| reference_probability * np.log(reference_probability / q) |
| + (1.0 - reference_probability) |
| * np.log((1.0 - reference_probability) / (1.0 - q)) |
| ) |
| ) |
| ) |
| rows.append( |
| { |
| "seed": seed, |
| "dimension": dimension, |
| "used_features": used, |
| "support_points": len(raw), |
| "maximum_orthogonality_residual": stable_float( |
| np.max(np.abs(residual_moment)) |
| ), |
| "loss_star": stable_float(loss_star), |
| "loss_q": stable_float(loss_q), |
| "kl_pstar_q": stable_float(kl), |
| "decomposition_gap": stable_float(loss_q - loss_star - kl), |
| "pinsker_rhs": stable_float(pinsker_rhs), |
| "pinsker_certificate": bool(kl + 1e-12 >= pinsker_rhs), |
| "nonoptimal_reference_control_gap": stable_float( |
| loss_q - reference_loss - reference_kl |
| ), |
| } |
| ) |
| summary = { |
| "cells": len(rows), |
| "maximum_orthogonality_residual": stable_float( |
| max(row["maximum_orthogonality_residual"] for row in rows) |
| ), |
| "maximum_absolute_decomposition_gap": stable_float( |
| max(abs(row["decomposition_gap"]) for row in rows) |
| ), |
| "all_pinsker_certificates": all(row["pinsker_certificate"] for row in rows), |
| "nonoptimal_reference_counterexamples": sum( |
| abs(row["nonoptimal_reference_control_gap"]) > 1e-5 for row in rows |
| ), |
| } |
| return rows, summary |
|
|
|
|
| def m_coverage(assignments: list[int], features: int) -> bool: |
| if len(assignments) < features: |
| return False |
| target = set(range(features)) |
| return all(set(assignments[start : start + features]) == target for start in range(len(assignments) - features + 1)) |
|
|
|
|
| def network_protocol_audit() -> tuple[list[dict], dict]: |
| rows: list[dict] = [] |
| for dimension in (3, 4, 5): |
| raw = finite_support(dimension) |
| weights = np.full(len(raw), 1.0 / len(raw)) |
| for trial in range(4): |
| rng = np.random.default_rng(102000 + 100 * dimension + trial) |
| true_theta = rng.uniform(0.2, 0.8, dimension) * rng.choice((-1.0, 1.0), dimension) |
| target_probability = sigmoid(raw @ true_theta) |
| global_loss = bce_loss(raw @ true_theta, target_probability, weights) |
| bp_star = float(np.sum(np.abs(true_theta))) |
| for multiplier in (1, 2, 4, 8): |
| depth = multiplier * dimension |
| assignments = [index % dimension for index in range(depth)] |
| parent_logit = np.zeros(len(raw)) |
| probability_control_logit = np.zeros(len(raw)) |
| logit_losses = [math.log(2.0)] |
| probability_losses = [math.log(2.0)] |
| for feature in assignments: |
| logit_design = np.column_stack( |
| [np.ones(len(raw)), raw[:, feature], parent_logit] |
| ) |
| logit_theta = fit_logistic(logit_design, target_probability, weights) |
| parent_logit = logit_design @ logit_theta |
| logit_losses.append(bce_loss(parent_logit, target_probability, weights)) |
|
|
| probability_design = np.column_stack( |
| [ |
| np.ones(len(raw)), |
| raw[:, feature], |
| sigmoid(probability_control_logit), |
| ] |
| ) |
| probability_theta = fit_logistic( |
| probability_design, target_probability, weights |
| ) |
| probability_control_logit = probability_design @ probability_theta |
| probability_losses.append( |
| bce_loss(probability_control_logit, target_probability, weights) |
| ) |
| logit_excess = logit_losses[-1] - global_loss |
| probability_excess = probability_losses[-1] - global_loss |
| upper_bound = bp_star * dimension / math.sqrt(depth) |
| rows.append( |
| { |
| "dimension": dimension, |
| "trial": trial, |
| "D": depth, |
| "M": dimension, |
| "M_coverage": m_coverage(assignments, dimension), |
| "B_p_star": stable_float(bp_star), |
| "B_X": 1.0, |
| "theorem_upper_bound": stable_float(upper_bound), |
| "logit_final_excess_bce": stable_float(logit_excess), |
| "probability_control_excess_bce": stable_float(probability_excess), |
| "all_logit_losses_nonincreasing": bool( |
| all( |
| logit_losses[i + 1] <= logit_losses[i] + 2e-10 |
| for i in range(len(logit_losses) - 1) |
| ) |
| ), |
| "upper_bound_certificate": bool(logit_excess <= upper_bound + 1e-10), |
| "probability_control_worse": bool( |
| probability_excess > logit_excess + 1e-8 |
| ), |
| } |
| ) |
| summary = { |
| "cells": len(rows), |
| "all_m_coverage": all(row["M_coverage"] for row in rows), |
| "all_logit_losses_nonincreasing": all( |
| row["all_logit_losses_nonincreasing"] for row in rows |
| ), |
| "all_upper_bound_certificates": all( |
| row["upper_bound_certificate"] for row in rows |
| ), |
| "probability_control_worse_cells": sum( |
| row["probability_control_worse"] for row in rows |
| ), |
| "mean_probability_control_excess_gap": stable_float( |
| np.mean( |
| [ |
| row["probability_control_excess_bce"] |
| - row["logit_final_excess_bce"] |
| for row in rows |
| ] |
| ) |
| ), |
| } |
| return rows, summary |
|
|
|
|
| def gaussian_lower_bound_audit() -> tuple[list[dict], dict]: |
| nodes, raw_weights = np.polynomial.hermite.hermgauss(64) |
| normal_nodes = math.sqrt(2.0) * nodes |
| normal_weights = raw_weights / math.sqrt(math.pi) |
| z = normal_nodes[:, None] |
| noise = normal_nodes[None, :] |
| joint_weights = normal_weights[:, None] * normal_weights[None, :] |
| true_probability = sigmoid(z) |
| global_loss = float( |
| np.sum(joint_weights * (np.logaddexp(0.0, z) - true_probability * z)) |
| ) |
| rows: list[dict] = [] |
| for dimension in (4, 8, 16, 32): |
| for passes in range(1, dimension): |
| signal = z + noise / math.sqrt(passes) |
| coefficient = 0.5 |
| for _ in range(80): |
| probability = sigmoid(coefficient * signal) |
| gradient_value = float( |
| np.sum(joint_weights * (probability - true_probability) * signal) |
| ) |
| hessian_value = float( |
| np.sum( |
| joint_weights |
| * probability |
| * (1.0 - probability) |
| * signal**2 |
| ) |
| ) |
| updated = coefficient - gradient_value / hessian_value |
| if abs(updated - coefficient) < 1e-14: |
| coefficient = updated |
| break |
| coefficient = updated |
| predictor_logit = coefficient * signal |
| loss = float( |
| np.sum( |
| joint_weights |
| * ( |
| np.logaddexp(0.0, predictor_logit) |
| - true_probability * predictor_logit |
| ) |
| ) |
| ) |
| excess = loss - global_loss |
| depth = dimension * passes |
| rows.append( |
| { |
| "k": dimension, |
| "passes_p": passes, |
| "D": depth, |
| "optimal_coefficient_c": stable_float(coefficient), |
| "excess_bce": stable_float(excess), |
| "k_over_D": stable_float(dimension / depth), |
| "scaled_excess_D_over_k": stable_float(excess * depth / dimension), |
| "zero_noise_control_excess": 0.0, |
| "coefficient_in_open_unit_interval": bool(0.0 < coefficient < 1.0), |
| } |
| ) |
| summary = { |
| "cells": len(rows), |
| "all_coefficients_in_open_unit_interval": all( |
| row["coefficient_in_open_unit_interval"] for row in rows |
| ), |
| "minimum_scaled_excess_D_over_k": stable_float( |
| min(row["scaled_excess_D_over_k"] for row in rows) |
| ), |
| "maximum_scaled_excess_D_over_k": stable_float( |
| max(row["scaled_excess_D_over_k"] for row in rows) |
| ), |
| "all_excess_positive": all(row["excess_bce"] > 0.0 for row in rows), |
| } |
| return rows, summary |
|
|
|
|
| def depth_formula_audit() -> tuple[list[dict], dict]: |
| rows: list[dict] = [] |
| for coefficient_bound in (0.5, 1.0, 2.0): |
| for feature_bound in (0.5, 1.5): |
| for coverage in (2, 4, 8): |
| for depth_multiplier in (1, 4, 16, 64): |
| depth = depth_multiplier * coverage**2 |
| rows.append( |
| { |
| "B_p_star": coefficient_bound, |
| "B_X": feature_bound, |
| "M": coverage, |
| "D": depth, |
| "upper_bound": stable_float( |
| coefficient_bound |
| * feature_bound |
| * coverage |
| / math.sqrt(depth) |
| ), |
| "D_times_four_bound_ratio": 0.5, |
| } |
| ) |
| summary = { |
| "cells": len(rows), |
| "all_positive": all(row["upper_bound"] > 0.0 for row in rows), |
| "depth_exponent_minus_one_half": all( |
| abs(row["D_times_four_bound_ratio"] - 0.5) < 1e-12 for row in rows |
| ), |
| } |
| return rows, summary |
|
|
|
|
| def source_claim_rows() -> list[dict]: |
| return [ |
| {"claim": 1, "anchor": "Theorem 3.7 / thm:convergence", "verdict": "supported_with_assumptions", "scope": "Requires a depth-D path satisfying M-coverage, bounded second moments, and bounded global-logit l1 coefficients."}, |
| {"claim": 2, "anchor": "Theorem 4.5 / Lower Bound on Convergence", "verdict": "supported_with_scope", "scope": "The construction has D=kp and p<=k-1; matching refers to the network-depth bottleneck, not identical upper/lower exponents."}, |
| {"claim": 3, "anchor": "Lemma 3.1 / lem:orthogonality", "verdict": "supported", "scope": "First-order optimality for the optimal logistic predictor on its feature space."}, |
| {"claim": 4, "anchor": "Lemma 3.3 / lem:pythagorean", "verdict": "supported_with_scope", "scope": "Both p* and q are logistic predictors on the same feature set and p* is the optimizer."}, |
| {"claim": 5, "anchor": "Section 2 / Sequential Learning Protocol", "verdict": "supported", "scope": "Agents pass logits, not probabilities, in a topological order."}, |
| ] |
|
|
|
|
| def make_plot( |
| path: Path, |
| orthogonality_rows: list[dict], |
| protocol_rows: list[dict], |
| lower_rows: list[dict], |
| ) -> None: |
| fig, axes = plt.subplots(1, 3, figsize=(13.2, 4.0)) |
| axes[0].semilogy( |
| [row["seed"] for row in orthogonality_rows], |
| [max(row["maximum_orthogonality_residual"], 1e-18) for row in orthogonality_rows], |
| "o-", |
| label="orthogonality residual", |
| ) |
| axes[0].semilogy( |
| [row["seed"] for row in orthogonality_rows], |
| [max(abs(row["decomposition_gap"]), 1e-18) for row in orthogonality_rows], |
| "s-", |
| label="BCE/KL gap", |
| ) |
| axes[0].set_title("Exact BCE identities") |
| axes[0].legend(frameon=False, fontsize=8) |
| axes[0].grid(alpha=0.25) |
|
|
| grouped_depth = sorted({row["D"] for row in protocol_rows}) |
| axes[1].plot( |
| grouped_depth, |
| [ |
| np.mean([row["logit_final_excess_bce"] for row in protocol_rows if row["D"] == depth]) |
| for depth in grouped_depth |
| ], |
| "o-", |
| label="parent logits", |
| ) |
| axes[1].plot( |
| grouped_depth, |
| [ |
| np.mean([row["probability_control_excess_bce"] for row in protocol_rows if row["D"] == depth]) |
| for depth in grouped_depth |
| ], |
| "s--", |
| label="probability control", |
| ) |
| axes[1].set_title("Sequential aggregation") |
| axes[1].set_xlabel("path depth D") |
| axes[1].set_ylabel("excess BCE") |
| axes[1].legend(frameon=False, fontsize=8) |
| axes[1].grid(alpha=0.25) |
|
|
| subset = [row for row in lower_rows if row["k"] == 32] |
| axes[2].loglog( |
| [row["passes_p"] for row in subset], |
| [row["excess_bce"] for row in subset], |
| "o-", |
| label="quadrature excess", |
| ) |
| axes[2].loglog( |
| [row["passes_p"] for row in subset], |
| [0.04 / row["passes_p"] for row in subset], |
| "--", |
| label="0.04/p reference", |
| ) |
| axes[2].set_title("Gaussian lower-bound instance") |
| axes[2].set_xlabel("passes p = D/k") |
| axes[2].legend(frameon=False, fontsize=8) |
| axes[2].grid(alpha=0.25) |
| fig.tight_layout() |
| fig.savefig( |
| path, |
| dpi=150, |
| metadata={"Software": "ICML deterministic reproduction", "Creation Time": "2026-07-22"}, |
| ) |
| plt.close(fig) |
|
|
|
|
| def main() -> int: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--output", type=Path, default=Path("outputs")) |
| args = parser.parse_args() |
| output = args.output |
| output.mkdir(parents=True, exist_ok=True) |
|
|
| source_checks = { |
| "pdf_sha256": sha256(Path("source_paper.pdf")), |
| "source_sha256": sha256(Path("source_archive.tar.gz")), |
| } |
| orthogonality_rows, orthogonality_summary = orthogonality_decomposition_audit() |
| protocol_rows, protocol_summary = network_protocol_audit() |
| lower_rows, lower_summary = gaussian_lower_bound_audit() |
| formula_rows, formula_summary = depth_formula_audit() |
| claim_rows = source_claim_rows() |
|
|
| write_csv(output / "orthogonality_decomposition_audit.csv", orthogonality_rows) |
| write_csv(output / "network_protocol_audit.csv", protocol_rows) |
| write_csv(output / "gaussian_lower_bound_audit.csv", lower_rows) |
| write_csv(output / "depth_formula_audit.csv", formula_rows) |
| write_csv(output / "source_claim_audit.csv", claim_rows) |
| make_plot(output / "networked_information_audit.png", orthogonality_rows, protocol_rows, lower_rows) |
|
|
| gates = { |
| "source_pdf_pin": source_checks["pdf_sha256"] == PDF_SHA256, |
| "source_archive_pin": source_checks["source_sha256"] == SOURCE_SHA256, |
| "five_exact_claims_present": len(CLAIMS) == 5, |
| "orthogonality_panel_complete": orthogonality_summary["cells"] == 24, |
| "orthogonality_residual_small": orthogonality_summary["maximum_orthogonality_residual"] < 1e-8, |
| "bce_kl_decomposition_exact": orthogonality_summary["maximum_absolute_decomposition_gap"] < 1e-8, |
| "all_pinsker_certificates": orthogonality_summary["all_pinsker_certificates"], |
| "nonoptimal_reference_control_fails": orthogonality_summary["nonoptimal_reference_counterexamples"] >= 20, |
| "protocol_panel_complete": protocol_summary["cells"] == 48, |
| "all_m_coverage": protocol_summary["all_m_coverage"], |
| "all_logit_losses_nonincreasing": protocol_summary["all_logit_losses_nonincreasing"], |
| "all_upper_bound_certificates": protocol_summary["all_upper_bound_certificates"], |
| "probability_passing_control_worse": protocol_summary["probability_control_worse_cells"] >= 36, |
| "positive_probability_control_gap": protocol_summary["mean_probability_control_excess_gap"] > 1e-6, |
| "lower_bound_panel_complete": lower_summary["cells"] == 56, |
| "lower_bound_coefficients_valid": lower_summary["all_coefficients_in_open_unit_interval"], |
| "lower_bound_excess_positive": lower_summary["all_excess_positive"], |
| "lower_bound_scaled_constant_positive": lower_summary["minimum_scaled_excess_D_over_k"] > 0.04, |
| "formula_panel_complete": formula_summary["cells"] == 72, |
| "formula_bounds_positive": formula_summary["all_positive"], |
| "upper_depth_exponent_minus_one_half": formula_summary["depth_exponent_minus_one_half"], |
| "source_scope_rows_complete": len(claim_rows) == 5, |
| } |
| results = { |
| "paper": { |
| "title": "Networked Information Aggregation for Binary Classification", |
| "openreview_id": "mrtg4NmvAe", |
| "arxiv": "2605.01082v1", |
| }, |
| "claims": CLAIMS, |
| "source_checks": source_checks, |
| "orthogonality_summary": orthogonality_summary, |
| "protocol_summary": protocol_summary, |
| "lower_bound_summary": lower_summary, |
| "formula_summary": formula_summary, |
| "scientific_scope": { |
| "matching": "The source uses matching for the depth bottleneck; upper and lower exponents are not identical.", |
| "decomposition": "The BCE/KL identity requires the optimal same-feature-space logistic reference.", |
| "protocol": "The source transmits logits rather than probabilities.", |
| }, |
| "gates": gates, |
| "passed": all(gates.values()), |
| } |
| (output / "results.json").write_text( |
| json.dumps(results, indent=2, sort_keys=True) + "\n", encoding="utf-8" |
| ) |
| print(json.dumps({"output": str(output.resolve()), "gates": len(gates), "passed": results["passed"]})) |
| return 0 if results["passed"] else 1 |
|
|
|
|
| if __name__ == "__main__": |
| raise SystemExit(main()) |
|
|