Source code for qrisp.circuit.instruction

"""
\********************************************************************************
* Copyright (c) 2023 the Qrisp authors
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is
* available at https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
"""


[docs] class Instruction: """ This class combines Operation objects with their operands (ie. qubits and classical bits). The data attribut of the QuantumCircuit class consists of a list of Instructions. Instructions can be added to QuantumCircuits using the `append <qrisp.QuantumCircuit.append>` method without any qubit/ classical bit arguments. Parameters ---------- op : Operation The Operation object. qubits : list[Qubit], optional The list of Qubits on which op should take place. The default is []. clbits : list[Clbit], optional The list of Clbits on which op should take place. The default is []. Examples -------- We create two Instruction objects, merge them and append the result to a QuantumCircuit. >>> from qrisp import Instruction, QuantumCircuit, CXGate, XGate >>> qc = QuantumCircuit(2) >>> ins_0 = Instruction(XGate(), [qc.qubits[0]]) >>> ins_1 = Instruction(CXGate(), qc.qubits) >>> merged_ins = ins_0.merge(ins_1) >>> qc.append(merged_ins) >>> qc.measure(qc.qubits[1]) >>> qc.run() {'1': 10000} >>> print(qc.transpile()) :: ┌───┐ qb_0: ┤ X ├──■───── └───┘┌─┴─┐┌─┐ qb_1: ─────┤ X ├┤M├ └───┘└╥┘ cb_0: ═══════════╩═ """ def __init__(self, op, qubits=[], clbits=[]): self.op = op self.qubits = qubits self.clbits = clbits
[docs] def merge(self, other): """ Merges two instructions into one. Parameters ---------- other : Instruction The second instruction. Returns ------- res : Instruction The merged instruction (self is executed first). """ from qrisp.circuit import QuantumCircuit qubit_list = list(set(self.qubits + other.qubits)) clbit_list = list(set(self.clbits + other.clbits)) qubit_list.sort(key=lambda x: x.identifier) clbit_list.sort(key=lambda x: x.identifier) qc = QuantumCircuit() for i in range(len(qubit_list)): qc.add_qubit(qubit_list[i]) for i in range(len(clbit_list)): qc.add_clbit(clbit_list[i]) qc.data = [self, other] res = Instruction(qc.to_op(), qubit_list, clbit_list) return res
[docs] def copy(self): """ Returns a copy of the Instruction. Returns ------- Instruction The copied Instruction. """ return Instruction(self.op.copy(), list(self.qubits), list(self.clbits))
def inverse(self): res = self.copy() res.op = res.op.inverse() return res def __str__(self): if len(self.clbits): return ( self.op.name + "(" + str(self.qubits)[1:-1] + ", " + str(self.clbits)[1:-1] + ")" ) else: return self.op.name + "(" + str(self.qubits)[1:-1] + ")" def __repr__(self): return self.__str__()