From 12ac9bc6da1ef8ef77fac9def07d66e8fc379b6d Mon Sep 17 00:00:00 2001 From: YurenHao0426 Date: Sat, 29 Aug 2026 18:47:30 -0500 Subject: test: verify large-grid edges affect CLLN outputs --- experiments/coupled_ladder_audit.py | 36 ++++++++++++++++++++++++++- results/coupled_ladder/x0_locality_audit.json | 6 +++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/experiments/coupled_ladder_audit.py b/experiments/coupled_ladder_audit.py index 13692b9..fa8c599 100644 --- a/experiments/coupled_ladder_audit.py +++ b/experiments/coupled_ladder_audit.py @@ -26,6 +26,7 @@ from sdil.physical_grid import ( # noqa: E402 GridSquareLawImperfection, RingClassificationDataset, edge_voltage_drops, + output_difference, ) @@ -82,6 +83,29 @@ def main() -> None: ) kcl_residual = maximum_unknown_kcl_residual( side32, gates32, state32) + sensitivity_indices = np.unique(np.linspace( + 0, side32.edge_count - 1, 128, dtype=int)) + sensitivity_step_v = 1e-5 + sampled_sensitivities = [] + sources32 = side32.source_values(*dataset.inputs_v[0]) + for edge in sensitivity_indices: + gates_plus = gates32.copy() + gates_minus = gates32.copy() + gates_plus[edge] += sensitivity_step_v + gates_minus[edge] -= sensitivity_step_v + output_plus = output_difference( + side32, + solve_linear_grid_state(side32, gates_plus, sources32), + ) + output_minus = output_difference( + side32, + solve_linear_grid_state(side32, gates_minus, sources32), + ) + sampled_sensitivities.append( + (output_plus - output_minus) / (2.0 * sensitivity_step_v)) + absolute_sensitivities = np.abs(np.asarray(sampled_sensitivities)) + sampled_influence_fraction = float(np.mean( + absolute_sensitivities > 1e-9)) edge_count = side4.edge_count rng = np.random.default_rng(20260829) @@ -158,6 +182,8 @@ def main() -> None: "released_side4_layout_exact": layout_exact, "released_side4_gate_vector_exact": tiling_exact, "side32_kcl_residual_below_1e_12": kcl_residual < 1e-12, + "side32_sampled_edges_influence_output": ( + sampled_influence_fraction == 1.0), "common_mode_cancellation_below_1e_12": ( common_mode_cancellation_error < 1e-12), "default_imperfection_is_state_dependent": ( @@ -176,6 +202,15 @@ def main() -> None: "checks": checks, "measurements": { "side32_maximum_unknown_kcl_residual_a": kcl_residual, + "side32_sampled_edge_count": len(sensitivity_indices), + "side32_sampled_output_sensitivity_min_abs": float( + np.min(absolute_sensitivities)), + "side32_sampled_output_sensitivity_median_abs": float( + np.median(absolute_sensitivities)), + "side32_sampled_output_sensitivity_max_abs": float( + np.max(absolute_sensitivities)), + "side32_sampled_influence_fraction_above_1e_9": ( + sampled_influence_fraction), "common_mode_cancellation_max_abs_v_per_s": ( common_mode_cancellation_error), "state_dependent_neutral_bias_difference_rms_v_per_s": ( @@ -201,4 +236,3 @@ def main() -> None: if __name__ == "__main__": main() - diff --git a/results/coupled_ladder/x0_locality_audit.json b/results/coupled_ladder/x0_locality_audit.json index a21f9c0..cd41471 100644 --- a/results/coupled_ladder/x0_locality_audit.json +++ b/results/coupled_ladder/x0_locality_audit.json @@ -6,6 +6,7 @@ "released_side4_layout_exact": true, "released_side4_gate_vector_exact": true, "side32_kcl_residual_below_1e_12": true, + "side32_sampled_edges_influence_output": true, "common_mode_cancellation_below_1e_12": true, "default_imperfection_is_state_dependent": true, "ideal_paths_have_identical_gates": true, @@ -15,6 +16,11 @@ }, "measurements": { "side32_maximum_unknown_kcl_residual_a": 8.646088809098271e-19, + "side32_sampled_edge_count": 128, + "side32_sampled_output_sensitivity_min_abs": 5.488387522234461e-08, + "side32_sampled_output_sensitivity_median_abs": 9.380685117577059e-06, + "side32_sampled_output_sensitivity_max_abs": 0.00011643896263846541, + "side32_sampled_influence_fraction_above_1e_9": 1.0, "common_mode_cancellation_max_abs_v_per_s": 3.552713678800501e-15, "state_dependent_neutral_bias_difference_rms_v_per_s": 1.0419674628075035, "ideal_path_max_gate_difference_v": 0.0, -- cgit v1.2.3