def _generate_circuit(self, elements: Iterable[Clifford], lengths: Iterable[int]) -> List[QuantumCircuit]: """Return the RB circuits constructed from the given element list. Args: elements: A list of Clifford elements lengths: A list of RB sequences lengths. Returns: A list of :class:`QuantumCircuit`s. Additional information: The circuits are constructed iteratively; each circuit is obtained by extending the previous circuit (without the inversion and measurement gates) """ qubits = list(range(self.num_qubits)) circuits = [] circs = [QuantumCircuit(self.num_qubits) for _ in range(len(lengths))] for circ in circs: circ.barrier(qubits) circ_op = Clifford(np.eye(2 * self.num_qubits)) for current_length, group_elt_circ in enumerate(elements): if isinstance(group_elt_circ, tuple): group_elt_gate = group_elt_circ[0] group_elt_op = group_elt_circ[1] else: group_elt_gate = group_elt_circ group_elt_op = Clifford(group_elt_circ) if not isinstance(group_elt_gate, Gate): group_elt_gate = group_elt_gate.to_gate() circ_op = circ_op.compose(group_elt_op) for circ in circs: circ.append(group_elt_gate, qubits) circ.barrier(qubits) if current_length + 1 in lengths: # copy circuit and add inverse inv = circ_op.adjoint() rb_circ = circs.pop() rb_circ.append(inv, qubits) rb_circ.barrier(qubits) rb_circ.metadata = { "experiment_type": self._type, "xval": current_length + 1, "group": "Clifford", "physical_qubits": self.physical_qubits, } rb_circ.measure_all() circuits.append(rb_circ) return circuits
def _generate_circuit(self, elements: Iterable[Clifford], lengths: Iterable[int]): """Return the RB circuits constructed from the given element list. Args: elements: A list of Clifford elements lengths: A list of RB sequences lengths. Returns: List[QuantumCircuit]: A list of :class:`QuantumCircuit`s. Additional information: The circuits are constructed iteratively; each circuit is obtained by extending the previous circuit (without the inversion and measurement gates) """ qubits = list(range(self.num_qubits)) circuits = [] circ = QuantumCircuit(self.num_qubits) circ.barrier(qubits) circ_op = Clifford(np.eye(2 * self.num_qubits)) for current_length, group_elt in enumerate(elements): circ_op = circ_op.compose(group_elt) circ.append(group_elt, qubits) circ.barrier(qubits) if current_length + 1 in lengths: # copy circuit and add inverse inv = circ_op.adjoint() rb_circ = circ.copy() rb_circ.append(inv, qubits) rb_circ.barrier(qubits) rb_circ.metadata = { "experiment_type": self._type, "xdata": current_length + 1, "ylabel": self.num_qubits * "0", "group": "Clifford", "qubits": self.physical_qubits, } rb_circ.measure_all() circuits.append(rb_circ) return circuits