def test_apply_noise_to_moments_initialization_2QubitNoise_2( circuit_2qubit, noise_2qubit, noise_1qubit, noise_1qubit_2 ): circ = apply_noise_to_moments( circuit_2qubit, [noise_1qubit, noise_2qubit, noise_1qubit_2], target_qubits=QubitSet([0, 1]), position="initialization", ) expected = ( Circuit() .add_instruction(Instruction(noise_1qubit, 0)) .add_instruction(Instruction(noise_1qubit, 1)) .add_instruction(Instruction(noise_2qubit, [0, 1])) .add_instruction(Instruction(noise_1qubit_2, 0)) .add_instruction(Instruction(noise_1qubit_2, 1)) .add_instruction(Instruction(Gate.X(), 0)) .add_instruction(Instruction(Gate.Y(), 1)) .add_instruction(Instruction(Gate.X(), 0)) .add_instruction(Instruction(Gate.X(), 1)) .add_instruction(Instruction(Gate.CNot(), [0, 1])) ) assert circ == expected
def test_apply_noise_to_moments_readout_1QubitNoise_2(circuit_2qubit, noise_1qubit): circ = apply_noise_to_moments( circuit_2qubit, [noise_1qubit], target_qubits=QubitSet(1), position="readout", ) expected = (Circuit().add_instruction(Instruction( Gate.X(), 0)).add_instruction(Instruction(Gate.Y(), 1)).add_instruction( Instruction(Gate.X(), 0)).add_instruction(Instruction( Gate.X(), 1)).add_instruction(Instruction( Gate.CNot(), [0, 1])).add_instruction(Instruction(noise_1qubit, 1))) assert circ == expected
def apply_readout_noise( self, noise: Union[Type[Noise], Iterable[Type[Noise]]], target_qubits: Optional[QubitSetInput] = None, ) -> Circuit: """Apply `noise` right before measurement in every qubit (default) or target_qubits`. Only when `target_qubits` is given can the noise be applied to an empty circuit. When `noise.qubit_count` > 1, the number of qubits in target_qubits must be equal to `noise.qubit_count`. Args: noise (Union[Type[Noise], Iterable[Type[Noise]]]): Noise channel(s) to be applied to the circuit. target_qubits (Union[QubitSetInput, optional]): Index or indices of qubit(s). Default=None. Returns: Circuit: self Raises: TypeError: If `noise` is not Noise type. If `target_qubits` has non-integers. IndexError: If applying noise to an empty circuit. ValueError: If `target_qubits` has negative integers. If `noise.qubit_count` > 1 and the number of qubits in target_qubits is not the same as `noise.qubit_count`. Examples: >>> circ = Circuit().x(0).y(1).z(0).x(1).cnot(0,1) >>> print(circ) >>> noise = Noise.Depolarizing(probability=0.1) >>> circ = Circuit().x(0).y(1).z(0).x(1).cnot(0,1) >>> print(circ.apply_initialization_noise(noise)) >>> circ = Circuit().x(0).y(1).z(0).x(1).cnot(0,1) >>> print(circ.apply_initialization_noise(noise, target_qubits = 1)) >>> circ = Circuit() >>> print(circ.apply_initialization_noise(noise, target_qubits = [0, 1])) """ if (len(self.qubits) == 0) and (target_qubits is None): raise IndexError( "target_qubits must be provided in order to apply the readout noise \ to an empty circuit.") if target_qubits is None: target_qubits = self.qubits else: if not isinstance(target_qubits, list): target_qubits = [target_qubits] if not all(isinstance(q, int) for q in target_qubits): raise TypeError("target_qubits must be integer(s)") if not all(q >= 0 for q in target_qubits): raise ValueError( "target_qubits must contain only non-negative integers.") target_qubits = QubitSet(target_qubits) # make noise a list noise = wrap_with_list(noise) for noise_channel in noise: if not isinstance(noise_channel, Noise): raise TypeError("Noise must be an instance of the Noise class") if noise_channel.qubit_count > 1 and noise_channel.qubit_count != len( target_qubits): raise ValueError( "target_qubits needs to be provided for this multi-qubit noise channel, and \ the number of qubits in target_qubits must be the same as defined by the multi-qubit noise channel." ) return apply_noise_to_moments(self, noise, target_qubits, "readout")