def assert_allclose_up_to_global_phase( actual: np.ndarray, desired: np.ndarray, *, # Forces keyword args. rtol: float = 1e-7, atol: float, # Require atol to be specified equal_nan: bool = True, err_msg: Optional[str] = '', verbose: bool = True) -> None: """Checks if a ~= b * exp(i t) for some t. Args: actual: A numpy array. desired: Another numpy array. rtol: Relative error tolerance. atol: Absolute error tolerance. equal_nan: Whether or not NaN entries should be considered equal to other NaN entries. err_msg: The error message to be printed in case of failure. verbose: If True, the conflicting values are appended to the error message. Raises: AssertionError: The matrices aren't nearly equal up to global phase. """ actual, desired = linalg.match_global_phase(actual, desired) np.testing.assert_allclose(actual=actual, desired=desired, rtol=rtol, atol=atol, equal_nan=equal_nan, err_msg=err_msg, verbose=verbose)
def assert_qasm_is_consistent_with_unitary(val: Any): """Uses `val._unitary_` to check `val._qasm_`'s behavior.""" # Only test if qiskit is installed. try: import qiskit except ImportError: # coverage: ignore warnings.warn("Skipped assert_qasm_is_consistent_with_unitary because " "qiskit isn't installed to verify against.") return unitary = protocols.unitary(val, None) if unitary is None: # Vacuous consistency. return controls = getattr(val, 'control_qubits', None) if controls is None: qubit_count = len(unitary).bit_length() - 1 else: qubit_count = len(unitary).bit_length() - 1 - (len(controls) - controls.count(None)) if isinstance(val, ops.Operation): qubits = val.qubits op = val elif isinstance(val, ops.Gate): qubits = tuple(line.LineQubit.range(qubit_count)) op = val.on(*qubits) else: raise NotImplementedError("Don't know how to test {!r}".format(val)) args = protocols.QasmArgs( qubit_id_map={q: 'q[{}]'.format(i) for i, q in enumerate(qubits)}) qasm = protocols.qasm(op, args=args, default=None) if qasm is None: return header = """ OPENQASM 2.0; include "qelib1.inc"; qreg q[{}]; """.format(len(qubits)) qasm = header + qasm qasm_unitary = None try: result = qiskit.execute( qiskit.load_qasm_string(qasm), backend=qiskit.Aer.get_backend('unitary_simulator')) qasm_unitary = result.result().get_unitary() qasm_unitary = _reorder_indices_of_matrix( qasm_unitary, list(reversed(range(len(qubits))))) lin_alg_utils.assert_allclose_up_to_global_phase(qasm_unitary, unitary, rtol=1e-8, atol=1e-8) except Exception as ex: if qasm_unitary is not None: p_unitary, p_qasm_unitary = linalg.match_global_phase( unitary, qasm_unitary) else: p_unitary = None p_qasm_unitary = None raise AssertionError( 'QASM be consistent with cirq.unitary(op) up to global phase.\n\n' 'op:\n{}\n\n' 'cirq.unitary(op):\n{}\n\n' 'Generated QASM:\n\n{}\n\n' 'Unitary of generated QASM:\n{}\n\n' 'Phased matched cirq.unitary(op):\n{}\n\n' 'Phased matched unitary of generated QASM:\n{}\n\n' 'Underlying error:\n{}'.format(_indent(repr(op)), _indent(repr(unitary)), _indent(qasm), _indent(repr(qasm_unitary)), _indent(repr(p_unitary)), _indent(repr(p_qasm_unitary)), _indent(str(ex))))
def assert_qasm_is_consistent_with_unitary(val: Any): """Uses `val._unitary_` to check `val._qasm_`'s behavior.""" # Only test if qiskit is installed. try: import qiskit except ImportError: # coverage: ignore warnings.warn("Skipped assert_qasm_is_consistent_with_unitary because " "qiskit isn't installed to verify against.") return unitary = protocols.unitary(val, None) if unitary is None: # Vacuous consistency. return qubit_count = len(unitary).bit_length() - 1 if isinstance(val, ops.Operation): qubits = val.qubits op = val elif isinstance(val, ops.Gate): qubits = tuple(line.LineQubit.range(qubit_count)) op = val.on(*qubits) else: raise NotImplementedError("Don't know how to test {!r}".format(val)) qasm = str(circuits.QasmOutput(op, qubits[::-1], precision=10)) qasm_unitary = None try: result = qiskit.execute( qiskit.load_qasm_string(qasm), backend=qiskit.Aer.get_backend('unitary_simulator')) qasm_unitary = result.result().get_unitary() lin_alg_utils.assert_allclose_up_to_global_phase( qasm_unitary, unitary, rtol=1e-8, atol=1e-8) except Exception as ex: if qasm_unitary is not None: p_unitary, p_qasm_unitary = linalg.match_global_phase( unitary, qasm_unitary) else: p_unitary = None p_qasm_unitary = None raise AssertionError( 'QASM be consistent with cirq.unitary(op) up to global phase.\n\n' 'op:\n{}\n\n' 'cirq.unitary(op):\n{}\n\n' 'Generated QASM:\n\n{}\n\n' 'Unitary of generated QASM:\n{}\n\n' 'Phased matched cirq.unitary(op):\n{}\n\n' 'Phased matched unitary of generated QASM:\n{}\n\n' 'Underlying error:\n{}'.format( _indent(repr(op)), _indent(repr(unitary)), _indent(qasm), _indent(repr(qasm_unitary)), _indent(repr(p_unitary)), _indent(repr(p_qasm_unitary)), _indent(str(ex))))
def assert_qasm_is_consistent_with_unitary(val: Any): """Uses `val._unitary_` to check `val._qasm_`'s behavior.""" # Only test if qiskit is installed. try: import qiskit except ImportError: # coverage: ignore warnings.warn("Skipped assert_qasm_is_consistent_with_unitary because " "qiskit isn't installed to verify against.") return unitary = protocols.unitary(val, None) if unitary is None: # Vacuous consistency. return if isinstance(val, ops.Operation): qubits: Sequence[ops.Qid] = val.qubits op = val elif isinstance(val, ops.Gate): qid_shape = protocols.qid_shape(val) remaining_shape = list(qid_shape) controls = getattr(val, 'control_qubits', None) if controls is not None: for i, q in zip(reversed(range(len(controls))), reversed(controls)): if q is not None: remaining_shape.pop(i) qubits = devices.LineQid.for_qid_shape(remaining_shape) op = val.on(*qubits) else: raise NotImplementedError(f"Don't know how to test {val!r}") args = protocols.QasmArgs( qubit_id_map={q: f'q[{i}]' for i, q in enumerate(qubits)}) qasm = protocols.qasm(op, args=args, default=None) if qasm is None: return num_qubits = len(qubits) header = f""" OPENQASM 2.0; include "qelib1.inc"; qreg q[{num_qubits}]; """ qasm = header + qasm qasm_unitary = None try: result = qiskit.execute( qiskit.QuantumCircuit.from_qasm_str(qasm), backend=qiskit.Aer.get_backend('unitary_simulator'), ) qasm_unitary = result.result().get_unitary() qasm_unitary = _reorder_indices_of_matrix( qasm_unitary, list(reversed(range(num_qubits)))) lin_alg_utils.assert_allclose_up_to_global_phase(qasm_unitary, unitary, rtol=1e-8, atol=1e-8) except Exception as ex: if qasm_unitary is not None: p_unitary, p_qasm_unitary = linalg.match_global_phase( unitary, qasm_unitary) else: p_unitary = None p_qasm_unitary = None raise AssertionError( 'QASM not consistent with cirq.unitary(op) up to global phase.\n\n' 'op:\n{}\n\n' 'cirq.unitary(op):\n{}\n\n' 'Generated QASM:\n\n{}\n\n' 'Unitary of generated QASM:\n{}\n\n' 'Phased matched cirq.unitary(op):\n{}\n\n' 'Phased matched unitary of generated QASM:\n{}\n\n' 'Underlying error:\n{}'.format( _indent(repr(op)), _indent(repr(unitary)), _indent(qasm), _indent(repr(qasm_unitary)), _indent(repr(p_unitary)), _indent(repr(p_qasm_unitary)), _indent(str(ex)), ))