Download tests/unit/test_magic_entropy.py from Tatopenn/dense-Evolution: direct link, hf CLI and curl.
- Browser
- Download file 5.05 kB
-
https://huggingface.co/Tatopenn/dense-Evolution/resolve/main/tests/unit/test_magic_entropy.py
- Command line
-
hf download hf://Tatopenn/dense-Evolution/tests/unit/test_magic_entropy.py
-
curl -L -o test_magic_entropy.py https://huggingface.co/Tatopenn/dense-Evolution/resolve/main/tests/unit/test_magic_entropy.py
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 | |