def test_initial_guess_in_minimize_one_norm(): for noise_level in [0.7, 0.9]: depo_kraus = global_depolarizing_kraus(noise_level, num_qubits=1) depo_super = kraus_to_super(depo_kraus) ideal_matrix = kraus_to_super(channel(H)) basis_matrices = [ depo_super @ kraus_to_super(channel(gate)) @ ideal_matrix for gate in [I, X, Y, Z, H] ] optimal_coeffs = minimize_one_norm( ideal_matrix, basis_matrices, initial_guess=[1.0, 1.0, 1.0, 1.0, 1.0], ) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)]) assert np.allclose(ideal_matrix, represented_mat) # With a very bad guess it should fail with raises(RuntimeError, match="optimal representation failed"): minimize_one_norm( ideal_matrix, basis_matrices, initial_guess=[-1.0e9, 1.0e9, -1.0e9, +1.0e9, -1.0e9], )
def test_initial_guess_in_minimize_one_norm(): for noise_level in [0.7, 0.9]: depo_kraus = global_depolarizing_kraus(noise_level, num_qubits=1) depo_super = kraus_to_super(depo_kraus) ideal_matrix = kraus_to_super(kraus(H)) basis_matrices = [ depo_super @ kraus_to_super(kraus(gate)) @ ideal_matrix for gate in [I, X, Y, Z, H] ] optimal_coeffs = minimize_one_norm( ideal_matrix, basis_matrices, initial_guess=[1.0, 1.0, 1.0, 1.0, 1.0], ) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)] ) assert np.allclose(ideal_matrix, represented_mat) # Test bad argument with raises(ValueError, match="shapes"): minimize_one_norm( ideal_matrix, basis_matrices, initial_guess=[1], )
def test_minimize_one_norm_with_depolarized_superoperators(): for noise_level in [0.01, 0.02, 0.03]: depo_kraus = global_depolarizing_kraus(noise_level, num_qubits=1) depo_super = kraus_to_super(depo_kraus) ideal_matrix = kraus_to_super(channel(H)) basis_matrices = [ depo_super @ kraus_to_super(channel(gate)) @ ideal_matrix for gate in [I, X, Y, Z, H] ] optimal_coeffs = minimize_one_norm(ideal_matrix, basis_matrices) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)]) assert np.allclose(ideal_matrix, represented_mat) # Optimal analytic result by Takagi (arXiv:2006.12509) eps = 4.0 / 3.0 * noise_level expected = (1.0 + 0.5 * eps) / (1.0 - eps) assert np.isclose(np.linalg.norm(optimal_coeffs, 1), expected)
def test_minimize_one_norm_with_depolarized_choi(): for noise_level in [0.01, 0.02, 0.03]: q = LineQubit(0) ideal_matrix = _operation_to_choi(H(q)) basis_matrices = [ _operation_to_choi( [H(q), gate(q), DepolarizingChannel(noise_level, 1)(q)]) for gate in [I, X, Y, Z, H] ] optimal_coeffs = minimize_one_norm(ideal_matrix, basis_matrices) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)]) assert np.allclose(ideal_matrix, represented_mat) # Optimal analytic result by Takagi (arXiv:2006.12509) eps = 4.0 / 3.0 * noise_level expected = (1.0 + 0.5 * eps) / (1.0 - eps) assert np.isclose(np.linalg.norm(optimal_coeffs, 1), expected)
def test_minimize_one_norm_with_amp_damp_choi(): for noise_level in [0.01, 0.02, 0.03]: q = LineQubit(0) ideal_matrix = _operation_to_choi(H(q)) basis_matrices = [ _operation_to_choi( [H(q), gate(q), AmplitudeDampingChannel(noise_level)(q)]) for gate in [I, Z] ] # Append reset channel reset_kraus = channel(ResetChannel()) basis_matrices.append(kraus_to_choi(reset_kraus)) optimal_coeffs = minimize_one_norm(ideal_matrix, basis_matrices) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)]) assert np.allclose(ideal_matrix, represented_mat) # Optimal analytic result by Takagi (arXiv:2006.12509) expected = (1.0 + noise_level) / (1.0 - noise_level) assert np.isclose(np.linalg.norm(optimal_coeffs, 1), expected)
def test_minimize_one_norm_tolerance(): depo_kraus = global_depolarizing_kraus(noise_level=0.1, num_qubits=1) depo_super = kraus_to_super(depo_kraus) ideal_matrix = kraus_to_super(channel(H)) basis_matrices = [ depo_super @ kraus_to_super(channel(gate)) @ ideal_matrix for gate in [I, X, Y, Z] ] previous_minimum = 0.0 previous_error = 1.0 for tol in [1.0e-2, 1.0e-4, 1.0e-6, 1.0e-8]: optimal_coeffs = minimize_one_norm(ideal_matrix, basis_matrices, tol) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)]) worst_case_error = np.max(abs(ideal_matrix - represented_mat)) minimum = np.linalg.norm(optimal_coeffs, 1) # Reducing "tol" should decrease the worst case error # and should also increase the objective function assert worst_case_error < previous_error assert minimum > previous_minimum previous_error = worst_case_error previous_minimum = minimum
def test_minimize_one_norm_with_amp_damp_superoperators(): for noise_level in [0.01, 0.02, 0.03]: damp_kraus = amplitude_damping_kraus(noise_level, num_qubits=1) damp_super = kraus_to_super(damp_kraus) ideal_matrix = kraus_to_super(channel(H)) basis_matrices = [ damp_super @ kraus_to_super(channel(gate)) @ ideal_matrix for gate in [I, Z] ] # Append reset channel reset_kraus = channel(ResetChannel()) basis_matrices.append(kraus_to_super(reset_kraus)) optimal_coeffs = minimize_one_norm(ideal_matrix, basis_matrices, tol=1.0e-6) represented_mat = sum( [eta * mat for eta, mat in zip(optimal_coeffs, basis_matrices)]) assert np.allclose(ideal_matrix, represented_mat) # Optimal analytic result by Takagi (arXiv:2006.12509) expected = (1.0 + noise_level) / (1.0 - noise_level) assert np.isclose(np.linalg.norm(optimal_coeffs, 1), expected)
def test_minimize_one_norm_failure_error(): ideal_matrix = np.random.rand(2, 2) basis_matrices = [np.random.rand(2, 2)] with raises(RuntimeError, match="optimal representation failed"): minimize_one_norm(ideal_matrix, basis_matrices)