dense-Evolution / tests /unit /test_magic_entropy.py
Tatopenn's picture
Sync mirror with GitHub main (v8.1.62): subpackage refactor, mitigation promotions, MCP server refactor
2a87ede verified
Raw History Blame Contribute Delete
5.05 kB
"""
Unit tests for dense_evolution/mitigation/magic_entropy.py. Values
cross-checked against Dense-Evolution-Discovery Experiment 30
(https://tatopenn-cell.github.io/Dense-Evolution-Discovery/quantum_ruzsa_magic_entropy/),
where the same numbers were independently validated against the source
paper's own Lemma 9 identity and stabilizer-state claim.
"""
import jax
import jax.numpy as jnp
import numpy as np
import pytest
from dense_evolution.mitigation import magic_entropy, magic_entropy_jit
from dense_evolution.mitigation.magic_entropy import _KEY_UNITARY_K3, _self_convolve_3_core
def _sv_to_rho(sv):
sv = jnp.asarray(sv, dtype=jnp.complex128)
return jnp.outer(sv, jnp.conj(sv))
def _stabilizer_states():
zero = jnp.array([1.0, 0.0], dtype=jnp.complex128)
one = jnp.array([0.0, 1.0], dtype=jnp.complex128)
plus = (zero + one) / jnp.sqrt(2.0)
minus = (zero - one) / jnp.sqrt(2.0)
plus_i = (zero + 1j * one) / jnp.sqrt(2.0)
minus_i = (zero - 1j * one) / jnp.sqrt(2.0)
return [zero, one, plus, minus, plus_i, minus_i]
def _t_state():
zero = jnp.array([1.0, 0.0], dtype=jnp.complex128)
one = jnp.array([0.0, 1.0], dtype=jnp.complex128)
return (zero + jnp.exp(1j * jnp.pi / 4.0) * one) / jnp.sqrt(2.0)
def test_key_unitary_matches_paper_lemma_9_identity():
# V|x1 x2 x3> = |x1+x2+x3> (x) |x2+x1> (x) |x3+x1> (mod 2)
for x1 in (0, 1):
for x2 in (0, 1):
for x3 in (0, 1):
idx_in = (x1 << 2) | (x2 << 1) | x3
sv_in = jnp.zeros(8, dtype=jnp.complex128).at[idx_in].set(1.0)
sv_out = _KEY_UNITARY_K3 @ sv_in
y1, y2, y3 = x1 ^ x2 ^ x3, x2 ^ x1, x3 ^ x1
idx_expected = (y1 << 2) | (y2 << 1) | y3
out_idx = int(jnp.argmax(jnp.abs(sv_out)))
assert out_idx == idx_expected
assert abs(complex(sv_out[out_idx])) > 0.999
def test_key_unitary_is_unitary():
v = _KEY_UNITARY_K3
identity = jnp.eye(8, dtype=jnp.complex128)
assert np.allclose(np.array(v @ jnp.conj(v).T), np.array(identity), atol=1e-10)
def test_all_single_qubit_stabilizer_states_have_zero_magic_entropy():
for sv in _stabilizer_states():
m = magic_entropy(_sv_to_rho(sv))
assert m < 1e-8
def test_t_and_h_states_match_experiment_30_value():
t_rho = _sv_to_rho(_t_state())
zero = jnp.array([1.0, 0.0], dtype=jnp.complex128)
one = jnp.array([0.0, 1.0], dtype=jnp.complex128)
h_sv = jnp.cos(jnp.pi / 8.0) * zero + jnp.sin(jnp.pi / 8.0) * one
h_rho = _sv_to_rho(h_sv)
assert magic_entropy(t_rho) == pytest.approx(0.8112781245, abs=1e-6)
assert magic_entropy(h_rho) == pytest.approx(0.8112781245, abs=1e-6)
def test_fully_mixed_state_has_maximal_magic_entropy():
mixed = jnp.eye(2, dtype=jnp.complex128) / 2.0
assert magic_entropy(mixed) == pytest.approx(1.0, abs=1e-6)
def test_jit_matches_eager():
rho = _sv_to_rho(_t_state())
eager = magic_entropy(rho)
jitted = float(magic_entropy_jit(rho))
assert eager == pytest.approx(jitted, abs=1e-12)
def test_self_convolve_3_output_is_a_valid_density_matrix():
rho = _sv_to_rho(_t_state())
reduced = _self_convolve_3_core(rho)
assert abs(complex(jnp.trace(reduced)) - 1.0) < 1e-9
ev = np.linalg.eigvalsh(np.array(reduced))
assert np.all(ev > -1e-9)
def test_differentiable_at_a_degenerate_stabilizer_state():
# I/2's reduced matrix has exactly degenerate eigenvalues [0.5, 0.5] --
# the case uhlmann_fidelity needed a custom eigh JVP rule for, since it
# reconstructs eigenvectors. magic_entropy only needs eigenvalues
# (jnp.linalg.eigvalsh), whose gradient stays well-defined here.
def loss(theta):
# a state that is exactly |0> at theta=0 (a stabilizer state, whose
# magic-entropy reduced matrix is degenerate) but still lets grad
# flow through theta.
sv = jnp.array([jnp.cos(theta), jnp.sin(theta)], dtype=jnp.complex128)
rho = jnp.outer(sv, jnp.conj(sv))
from dense_evolution.mitigation.magic_entropy import _magic_entropy_core
return _magic_entropy_core(rho)
g = jax.grad(loss)(0.0)
assert not jnp.isnan(g)
def test_differentiable_at_a_magic_state():
def loss(theta):
sv = jnp.array([jnp.cos(theta), jnp.exp(1j * jnp.pi / 4.0) * jnp.sin(theta)], dtype=jnp.complex128)
rho = jnp.outer(sv, jnp.conj(sv))
from dense_evolution.mitigation.magic_entropy import _magic_entropy_core
return _magic_entropy_core(rho)
# theta=pi/4 is exactly the T-state -- a stationary point of
# magic_entropy(theta) under this parametrization by symmetry, so its
# gradient is genuinely 0, not a differentiability failure. Use a
# generic angle instead to check the gradient is actually informative.
g = jax.grad(loss)(0.3)
assert not jnp.isnan(g)
assert abs(g) > 1e-8