def test_thermal_error(backend, density_matrix): thermal = ThermalRelaxationError(2, 1, 0.3) noise = NoiseModel() noise.add(thermal, gates.X, 1) noise.add(thermal, gates.CNOT) noise.add(thermal, gates.Z, (0,1)) circuit = Circuit(3, density_matrix=density_matrix) circuit.add(gates.CNOT(0,1)) circuit.add(gates.Z(1)) circuit.add(gates.X(1)) circuit.add(gates.X(2)) circuit.add(gates.Z(2)) target_circuit = Circuit(3, density_matrix=density_matrix) target_circuit.add(gates.CNOT(0,1)) target_circuit.add(gates.ThermalRelaxationChannel(0, 2, 1, 0.3)) target_circuit.add(gates.ThermalRelaxationChannel(1, 2, 1, 0.3)) target_circuit.add(gates.Z(1)) target_circuit.add(gates.ThermalRelaxationChannel(1, 2, 1, 0.3)) target_circuit.add(gates.X(1)) target_circuit.add(gates.ThermalRelaxationChannel(1, 2, 1, 0.3)) target_circuit.add(gates.X(2)) target_circuit.add(gates.Z(2)) initial_psi = random_density_matrix(3) if density_matrix else random_state(3) np.random.seed(123) K.set_seed(123) final_state = noise.apply(circuit)(initial_state=np.copy(initial_psi)) np.random.seed(123) K.set_seed(123) target_final_state = target_circuit(initial_state=np.copy(initial_psi)) K.assert_allclose(final_state, target_final_state)
def test_thermal_relaxation_channel_repeated(backend): original_backend = qibo.get_backend() qibo.set_backend(backend) initial_state = random_state(5) c = Circuit(5) c.add(gates.ThermalRelaxationChannel(4, t1=1.0, t2=0.6, time=0.8, excited_population=0.8, seed=123)) final_state = c(np.copy(initial_state), nshots=30) pz, p0, p1 = c.queue[0].calculate_probabilities(1.0, 0.6, 0.8, 0.8) np.random.seed(123) target_state = [] for _ in range(30): noiseless_c = Circuit(5) if np.random.random() < pz: noiseless_c.add(gates.Z(4)) if np.random.random() < p0: noiseless_c.add(gates.Collapse(4)) if np.random.random() < p1: noiseless_c.add(gates.Collapse(4)) noiseless_c.add(gates.X(4)) target_state.append(noiseless_c(np.copy(initial_state))) np.testing.assert_allclose(final_state, target_state) qibo.set_backend(original_backend)
def test_thermal_relaxation_channel_errors(backend, t1, t2, time, excpop): with pytest.raises(ValueError): gate = gates.ThermalRelaxationChannel(0, t1, t2, time, excited_population=excpop)
def test_thermal_relaxation_channel_repeated(backend): initial_state = random_state(5) c = Circuit(5) c.add( gates.ThermalRelaxationChannel(4, t1=1.0, t2=0.6, time=0.8, excited_population=0.8, seed=123)) final_state = c(K.cast(np.copy(initial_state)), nshots=30) pz, p0, p1 = c.queue[0].calculate_probabilities(1.0, 0.6, 0.8, 0.8) np.random.seed(123) target_state = [] collapse = gates.M(4, collapse=True) collapse.nqubits = 5 zgate, xgate = gates.Z(4), gates.X(4) for _ in range(30): state = K.cast(np.copy(initial_state)) if np.random.random() < pz: state = zgate(state) if np.random.random() < p0: state = K.state_vector_collapse(collapse, state, [0]) if np.random.random() < p1: state = K.state_vector_collapse(collapse, state, [0]) state = xgate(state) target_state.append(K.copy(state)) target_state = K.stack(target_state) K.assert_allclose(final_state, target_state)
def test_thermal_relaxation_channel_errors(backend, t1, t2, time, excpop): original_backend = qibo.get_backend() qibo.set_backend(backend) with pytest.raises(ValueError): gate = gates.ThermalRelaxationChannel(0, t1, t2, time, excited_population=excpop) qibo.set_backend(original_backend)
def test_thermal_relaxation_channel(backend, t1, t2, time, excpop): """Check ``gates.ThermalRelaxationChannel`` on a 3-qubit random density matrix.""" original_backend = qibo.get_backend() qibo.set_backend(backend) initial_rho = utils.random_density_matrix(3) c = models.Circuit(3, density_matrix=True) gate = gates.ThermalRelaxationChannel(0, t1, t2, time=time, excited_population=excpop) c.add(gate) final_rho = c(np.copy(initial_rho)) exp, p0, p1 = gates.ThermalRelaxationChannel._calculate_probs( t1, t2, time, excpop) if t2 > t1: matrix = np.diag([1 - p1, p0, p1, 1 - p0]) matrix[0, -1], matrix[-1, 0] = exp, exp matrix = matrix.reshape(4 * (2, )) # Apply matrix using Eq. (3.28) from arXiv:1111.6950 target_rho = np.copy(initial_rho).reshape(6 * (2, )) target_rho = np.einsum("abcd,aJKcjk->bJKdjk", matrix, target_rho) target_rho = target_rho.reshape(initial_rho.shape) else: pz = exp pi = 1 - pz - p0 - p1 dtype = initial_rho.dtype collapsed_rho = np.copy(initial_rho).reshape(6 * (2, )) collapsed_rho[0, :, :, 1, :, :] = np.zeros(4 * (2, ), dtype=dtype) collapsed_rho[1, :, :, 0, :, :] = np.zeros(4 * (2, ), dtype=dtype) collapsed_rho[1, :, :, 1, :, :] = np.zeros(4 * (2, ), dtype=dtype) collapsed_rho = collapsed_rho.reshape((8, 8)) collapsed_rho /= np.trace(collapsed_rho) mx = np.kron(np.array([[0, 1], [1, 0]]), np.eye(4)) mz = np.kron(np.array([[1, 0], [0, -1]]), np.eye(4)) z_rho = mz.dot(initial_rho.dot(mz)) flipped_rho = mx.dot(collapsed_rho.dot(mx)) target_rho = (pi * initial_rho + pz * z_rho + p0 * collapsed_rho + p1 * flipped_rho) np.testing.assert_allclose(final_rho, target_rho) # Try to apply to state vector if t1 < t2 if t1 < t2: with pytest.raises(ValueError): gate.state_vector_call(initial_rho) # pylint: disable=no-member qibo.set_backend(original_backend)