diff options
Diffstat (limited to 'experiments/coupled_ladder_audit.py')
| -rw-r--r-- | experiments/coupled_ladder_audit.py | 36 |
1 files changed, 35 insertions, 1 deletions
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() - |
