def _fidelity_result( state_result: AnalysisResultData, target: Union[Choi, DensityMatrix], input_dim: int = 1, ): """Faster computation of fidelity from eigen decomposition""" evals = state_result.extra["eigvals"] evecs = state_result.extra["eigvecs"] # Format target to statevector or densitymatrix array name = "process_fidelity" if input_dim > 1 else "state_fidelity" if target is None: raise AnalysisError("No target state provided") if isinstance(target, QuantumChannel): target_state = Choi(target).data / input_dim elif isinstance(target, BaseOperator): target_state = np.ravel(Operator(target), order="F") / np.sqrt(input_dim) else: # Statevector or density matrix target_state = np.array(target) if target_state.ndim == 1: rho = evecs @ (evals / input_dim * evecs).T.conj() fidelity = np.real(target_state.conj() @ rho @ target_state) else: sqrt_rho = evecs @ (np.sqrt(evals / input_dim) * evecs).T.conj() eig = la.eigvalsh(sqrt_rho @ target_state @ sqrt_rho) fidelity = np.sum(np.sqrt(np.maximum(eig, 0)))**2 return AnalysisResultData(name, fidelity)
def _fidelity_result(evals, evecs, target, qpt=False): """Faster computation of fidelity from eigen decomposition""" # Format target to statevector or densitymatrix array trace = np.sqrt(len(evals)) if qpt else 1 name = "process_fidelity" if qpt else "state_fidelity" if target is None: raise AnalysisError("No target state provided") if isinstance(target, QuantumChannel): target_state = Choi(target).data / trace elif isinstance(target, BaseOperator): target_state = np.ravel(Operator(target), order="F") / np.sqrt(trace) else: target_state = np.array(target) if target_state.ndim == 1: rho = evecs @ (evals / trace * evecs).T.conj() fidelity = np.real(target_state.conj() @ rho @ target_state) else: sqrt_rho = evecs @ (np.sqrt(evals / trace) * evecs).T.conj() eig = la.eigvalsh(sqrt_rho @ target_state @ sqrt_rho) fidelity = np.sum(np.sqrt(np.maximum(eig, 0))) ** 2 return AnalysisResultData(name, fidelity)