def ideal(self): """Return True if this error object is composed only of identity operations. Note that the identity check is best effort and up to global phase.""" for circ in self.circuits: try: # Circuit-level identity check for clifford Circuits clifford = Clifford(circ) if clifford != Clifford(np.eye(2 * circ.num_qubits, dtype=bool)): return False except QiskitError: pass # Component-wise check for non-Clifford circuits for op, _, _ in circ: if isinstance(op, IGate): continue if isinstance(op, PauliGate): if op.params[0].replace('I', ''): return False else: # Convert to Kraus and check if identity kmats = Kraus(op).data if len(kmats) > 1: return False if not is_identity_matrix(kmats[0], ignore_phase=True, atol=self.atol, rtol=self.rtol): return False return True
def iden(self, num_qubits): """Initialize an identity group element""" self._num_qubits = num_qubits if self._group_gates_type: return CNOTDihedral(num_qubits) else: return Clifford(np.eye(2 * num_qubits))
def iden(self, num_qubits): """Initialize an identity group element""" self._num_qubits = num_qubits if self._group_gates_type: assert num_qubits <= 2, "num_qubits for CNOT-Dihedral RB should be 1 or 2" return CNOTDihedral(num_qubits) else: return Clifford(np.eye(2 * num_qubits))
def __init__(self, data, validate=True): """Initialize a StabilizerState object. Args: data (StabilizerState or Clifford or Pauli or QuantumCircuit or qiskit.circuit.Instruction): Data from which the stabilizer state can be constructed. validate (boolean): validate that the stabilizer state data is a valid Clifford. """ # Initialize from another StabilizerState if isinstance(data, StabilizerState): self._data = data._data # Initialize from a Pauli elif isinstance(data, Pauli): self._data = Clifford(data.to_instruction()) # Initialize from a Clifford, QuantumCircuit or Instruction else: self._data = Clifford(data, validate) # Initialize super().__init__(op_shape=OpShape.auto(num_qubits_r=self._data.num_qubits, num_qubits_l=0))
def reset(self, qargs=None): """Reset state or subsystems to the 0-state. Args: qargs (list or None): subsystems to reset, if None all subsystems will be reset to their 0-state (Default: None). Returns: StabilizerState: the reset state. Additional Information: If all subsystems are reset this will return the ground state on all subsystems. If only some subsystems are reset this function will perform a measurement on those subsystems and evolve the subsystems so that the collapsed post-measurement states are rotated to the 0-state. The RNG seed for this sampling can be set using the :meth:`seed` method. """ # Resetting all qubits does not require sampling or RNG if qargs is None: return StabilizerState( Clifford(np.eye(2 * self.clifford.num_qubits))) randbits = self._rng.integers(2, size=len(qargs)) ret = self.copy() for bit, qubit in enumerate(qargs): # Apply measurement and get classical outcome outcome = ret._measure_and_update(qubit, randbits[bit]) # Use the outcome to apply X gate to any qubits left in the # |1> state after measure, then discard outcome. if outcome == 1: _append_x(ret.clifford, qubit) return ret
def to_operator(self): """Convert state to matrix operator class""" return Clifford(self.clifford).to_operator()