summaryrefslogtreecommitdiff
path: root/experiments/coupled_ladder_audit.py
diff options
context:
space:
mode:
Diffstat (limited to 'experiments/coupled_ladder_audit.py')
-rw-r--r--experiments/coupled_ladder_audit.py36
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()
-