def to_statevector(self, atol=None, rtol=None): """Return a statevector from a pure density matrix. Args: atol (float): Absolute tolerance for checking operation validity. rtol (float): Relative tolerance for checking operation validity. Returns: Statevector: The pure density matrix's corresponding statevector. Corresponds to the eigenvector of the only non-zero eigenvalue. Raises: QiskitError: if the state is not pure. """ from qiskit.quantum_info.states.statevector import Statevector if atol is None: atol = self.atol if rtol is None: rtol = self.rtol if not is_hermitian_matrix(self._data, atol=atol, rtol=rtol): raise QiskitError("Not a valid density matrix (non-hermitian).") evals, evecs = np.linalg.eig(self._data) nonzero_evals = evals[abs(evals) > atol] if len(nonzero_evals) != 1 or not np.isclose(nonzero_evals[0], 1, atol=atol, rtol=rtol): raise QiskitError("Density matrix is not a pure state") psi = evecs[:, np.argmax(evals)] # eigenvectors returned in columns. return Statevector(psi)
def from_label(cls, label): r"""Return a tensor product of Pauli X,Y,Z eigenstates. .. list-table:: Single-qubit state labels :header-rows: 1 * - Label - Statevector * - ``"0"`` - :math:`\begin{pmatrix} 1 & 0 \\ 0 & 0 \end{pmatrix}` * - ``"1"`` - :math:`\begin{pmatrix} 0 & 0 \\ 0 & 1 \end{pmatrix}` * - ``"+"`` - :math:`\frac{1}{2}\begin{pmatrix} 1 & 1 \\ 1 & 1 \end{pmatrix}` * - ``"-"`` - :math:`\frac{1}{2}\begin{pmatrix} 1 & -1 \\ -1 & 1 \end{pmatrix}` * - ``"r"`` - :math:`\frac{1}{2}\begin{pmatrix} 1 & -i \\ i & 1 \end{pmatrix}` * - ``"l"`` - :math:`\frac{1}{2}\begin{pmatrix} 1 & i \\ -i & 1 \end{pmatrix}` Args: label (string): a eigenstate string ket label (see table for allowed values). Returns: Statevector: The N-qubit basis state density matrix. Raises: QiskitError: if the label contains invalid characters, or the length of the label is larger than an explicitly specified num_qubits. """ from qiskit.quantum_info.states.statevector import Statevector return DensityMatrix(Statevector.from_label(label))
def format_statevector(vec, decimals=None): """Format statevector coming from the backend to present to the Qiskit user. Args: vec (list): a list of [re, im] complex numbers. decimals (int): the number of decimals in the statevector. If None, no rounding is done. Returns: list[complex]: a list of python complex numbers. """ # pylint: disable=cyclic-import from qiskit.quantum_info.states.statevector import Statevector if isinstance(vec, Statevector): if decimals: return Statevector(np.around(vec.data, decimals=decimals), dims=vec.dims()) return vec if isinstance(vec, np.ndarray): if decimals: return np.around(vec, decimals=decimals) return vec num_basis = len(vec) if vec and isinstance(vec[0], complex): vec_complex = np.array(vec, dtype=complex) else: vec_complex = np.zeros(num_basis, dtype=complex) for i in range(num_basis): vec_complex[i] = vec[i][0] + 1j * vec[i][1] if decimals: vec_complex = np.around(vec_complex, decimals=decimals) return vec_complex
def test_from_labels(self): """Initialize from labels.""" desired_sv = Statevector.from_label('01+-lr') qc = QuantumCircuit(6) qc.initialize('01+-lr', range(6)) job = execute(qc, BasicAer.get_backend('statevector_simulator')) result = job.result() statevector = result.get_statevector() fidelity = state_fidelity(statevector, desired_sv) self.assertGreater( fidelity, self._desired_fidelity, "Initializer has low fidelity {:.2g}.".format(fidelity))
def from_label(cls, label): """Return a tensor product of Pauli X,Y,Z eigenstates. Args: label (string): a eigenstate string ket label 0,1,+,-,r,l. Returns: Statevector: The N-qubit basis state density matrix. Raises: QiskitError: if the label contains invalid characters, or the length of the label is larger than an explicitly specified num_qubits. Additional Information: The labels correspond to the single-qubit states: '0': [[1, 0], [0, 0]] '1': [[0, 0], [0, 1]] '+': [[0.5, 0.5], [0.5 , 0.5]] '-': [[0.5, -0.5], [-0.5 , 0.5]] 'r': [[0.5, -0.5j], [0.5j , 0.5]] 'l': [[0.5, 0.5j], [-0.5j , 0.5]] """ return DensityMatrix(Statevector.from_label(label))
def _format_state(state, validate=True): """Format input state into class object""" if isinstance(state, list): state = np.array(state, dtype=complex) if isinstance(state, np.ndarray): ndim = state.ndim if ndim == 1: state = Statevector(state) elif ndim == 2: dim1, dim2 = state.shape if dim2 == 1: state = Statevector(state) elif dim1 == dim2: state = DensityMatrix(state) if not isinstance(state, (Statevector, DensityMatrix)): raise QiskitError("Input is not a quantum state") if validate and not state.is_valid(): raise QiskitError("Input quantum state is not a valid") return state