def __init__( self, operations: 'cirq.OP_TREE', qubits: Tuple['cirq.Qid', ...], header: str = '', precision: int = 10, version: str = '2.0', ) -> None: """Representation of a circuit in QASM format. Args: operations: Tree of operations to insert. qubits: The qubits used in the operations. header: A multi-line string that is placed in a comment at the top of the QASM. precision: The number of digits after the decimal to show for numbers in the QASM code. version: The QASM version to target. Objects may return different QASM depending on version. """ self.operations = tuple(ops.flatten_to_ops(operations)) self.qubits = qubits self.header = header self.measurements = tuple(op for op in self.operations if isinstance(op.gate, ops.MeasurementGate)) meas_key_id_map, meas_comments = self._generate_measurement_ids() self.meas_comments = meas_comments qubit_id_map = self._generate_qubit_ids() self.args = protocols.QasmArgs( precision=precision, version=version, qubit_id_map=qubit_id_map, meas_key_id_map=meas_key_id_map, )
def __init__(self, operations: 'cirq.OP_TREE', qubits: Tuple['cirq.Qid', ...], header: str = '', precision: int = 10, version: str = '2.0') -> None: self.operations = tuple(ops.flatten_to_ops(operations)) self.qubits = qubits self.header = header self.measurements = tuple(op for op in self.operations if isinstance(op.gate, ops.MeasurementGate)) meas_key_id_map, meas_comments = self._generate_measurement_ids() self.meas_comments = meas_comments qubit_id_map = self._generate_qubit_ids() self.args = protocols.QasmArgs(precision=precision, version=version, qubit_id_map=qubit_id_map, meas_key_id_map=meas_key_id_map)
def __init__(self, operations: ops.OP_TREE, qubits: Tuple[ops.Qid, ...], header: str = '', precision: int = 10, version: str = '2.0') -> None: self.operations = tuple(ops.flatten_op_tree(operations)) self.qubits = qubits self.header = header self.measurements = tuple( op for op in self.operations if ops.op_gate_of_type(op, ops.MeasurementGate)) # type: ignore meas_key_id_map, meas_comments = self._generate_measurement_ids() self.meas_comments = meas_comments qubit_id_map = self._generate_qubit_ids() self.args = protocols.QasmArgs(precision=precision, version=version, qubit_id_map=qubit_id_map, meas_key_id_map=meas_key_id_map)
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 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)), ))