def test_sample_sequence_qiskit(): qreg = qiskit.QuantumRegister(1) circuit = qiskit.QuantumCircuit(qreg) _ = circuit.h(qreg) xcircuit = qiskit.QuantumCircuit(qreg) _ = xcircuit.x(qreg) zcircuit = qiskit.QuantumCircuit(qreg) _ = zcircuit.z(qreg) noisy_xop = NoisyOperation(xcircuit) noisy_zop = NoisyOperation(zcircuit) rep = OperationRepresentation( ideal=circuit, basis_expansion={ noisy_xop: 0.5, noisy_zop: -0.5 }, ) for _ in range(5): seqs, signs, norm = sample_sequence(circuit, representations=[rep]) assert isinstance(seqs[0], qiskit.QuantumCircuit) assert signs[0] in {1, -1} assert norm == 1.0
def test_sample_sequence_choi(gate: cirq.Gate): """Tests the sample_sequence by comparing the exact Choi matrices.""" qreg = cirq.LineQubit.range(gate.num_qubits()) ideal_op = gate.on(*qreg) ideal_circ = cirq.Circuit(ideal_op) noisy_op_tree = [ideal_op] + [cirq.depolarize(BASE_NOISE)(q) for q in qreg] ideal_choi = _operation_to_choi(ideal_op) noisy_choi = _operation_to_choi(noisy_op_tree) representation = represent_operation_with_local_depolarizing_noise( ideal_circ, BASE_NOISE, ) choi_unbiased_estimates = [] rng = np.random.RandomState(1) for _ in range(500): imp_seqs, signs, norm = sample_sequence(ideal_circ, [representation], random_state=rng) noisy_sequence = imp_seqs[0].with_noise(cirq.depolarize(BASE_NOISE)) sequence_choi = _circuit_to_choi(noisy_sequence) choi_unbiased_estimates.append(norm * signs[0] * sequence_choi) choi_pec_estimate = np.average(choi_unbiased_estimates, axis=0) noise_error = np.linalg.norm(ideal_choi - noisy_choi) pec_error = np.linalg.norm(ideal_choi - choi_pec_estimate) assert pec_error < noise_error assert np.allclose(ideal_choi, choi_pec_estimate, atol=0.05)
def test_sample_sequence_no_representation(): circuit = cirq.Circuit(cirq.H.on(cirq.LineQubit(0))) with pytest.warns(UserWarning, match="No representation found for"): sequences, signs, norm = sample_sequence(circuit, []) assert _equal(sequences[0], circuit, require_qubit_equality=True) assert signs == [1] assert norm == 1
def test_sample_sequence_cirq_random_state(seed): circuit = cirq.Circuit(cirq.H.on(cirq.LineQubit(0))) rep = OperationRepresentation( ideal=circuit, basis_expansion={ NoisyOperation.from_cirq(circuit=cirq.X): 0.5, NoisyOperation.from_cirq(circuit=cirq.Z): -0.5, }, ) sequences, signs, norm = sample_sequence( circuit, [rep], random_state=np.random.RandomState(seed)) for _ in range(20): new_sequences, new_signs, new_norm = sample_sequence( circuit, [rep], random_state=np.random.RandomState(seed)) assert _equal(new_sequences[0], sequences[0]) assert new_signs[0] == signs[0] assert np.isclose(new_norm, norm)
def test_sample_sequence_pyquil(): circuit = pyquil.Program(pyquil.gates.H(0)) noisy_xop = NoisyOperation(pyquil.Program(pyquil.gates.X(0))) noisy_zop = NoisyOperation(pyquil.Program(pyquil.gates.Z(0))) rep = OperationRepresentation( ideal=circuit, basis_expansion={noisy_xop: 0.5, noisy_zop: -0.5}, ) for _ in range(50): seq, sign, norm = sample_sequence(circuit, representations=[rep]) assert isinstance(seq, pyquil.Program) assert sign in {1, -1} assert norm == 1.0
def test_sample_sequence_cirq(): circuit = cirq.Circuit(cirq.H(cirq.LineQubit(0))) circuit.append(cirq.measure(cirq.LineQubit(0))) rep = OperationRepresentation( ideal=circuit, basis_expansion={ NoisyOperation.from_cirq(circuit=cirq.X): 0.5, NoisyOperation.from_cirq(circuit=cirq.Z): -0.5, }, ) for _ in range(5): seqs, signs, norm = sample_sequence(circuit, representations=[rep]) assert isinstance(seqs[0], cirq.Circuit) assert signs[0] in {1, -1} assert norm == 1.0