def _define(self): definition = [] q = QuantumRegister(self.num_qubits) definition.append((HGate(), [q[self.num_qubits - 1]], [])) definition.append((XGate(), [q[self.num_qubits - 1]], [])) definition.append((HGate(), [q[self.num_qubits - 1]], [])) definition.append((OracleGate(self.num_qubits, self.list_values, self.least_significant_bit_first), q, [])) definition.append((HGate(), [q[self.num_qubits - 1]], [])) definition.append((XGate(), [q[self.num_qubits - 1]], [])) definition.append((HGate(), [q[self.num_qubits - 1]], [])) definition.append((OracleGate(self.num_qubits, self.list_values, self.least_significant_bit_first), q, [])) self.definition = definition
def _define_decompositions(self): """ gate ch a,b { h b; sdg b; cx a,b; h b; t b; cx a,b; t b; h b; s b; x b; s a;} """ decomposition = DAGCircuit() q = QuantumRegister(2, "q") decomposition.add_qreg(q) rule = [ HGate(q[1]), SdgGate(q[1]), CnotGate(q[0], q[1]), HGate(q[1]), TGate(q[1]), CnotGate(q[0], q[1]), TGate(q[1]), HGate(q[1]), SGate(q[1]), XGate(q[1]), SGate(q[0]) ] for inst in rule: decomposition.apply_operation_back(inst) self._decompositions = [decomposition]
def _define(self): """ gate ch a,b { h b; sdg b; cx a,b; h b; t b; cx a,b; t b; h b; s b; x b; s a;} """ definition = [] q = QuantumRegister(2, "q") rule = [(HGate(), [q[1]], []), (SdgGate(), [q[1]], []), (CnotGate(), [q[0], q[1]], []), (HGate(), [q[1]], []), (TGate(), [q[1]], []), (CnotGate(), [q[0], q[1]], []), (TGate(), [q[1]], []), (HGate(), [q[1]], []), (SGate(), [q[1]], []), (XGate(), [q[1]], []), (SGate(), [q[0]], [])] for inst in rule: definition.append(inst) self.definition = definition
def _define(self): definition = [] distribution_qubits = QuantumRegister(self.num_qubits) theta = unary_encoding_angles(self.distribution) middle = int(self.num_qubits / 2) if self.least_significant_bit_first: distribution_qubits = distribution_qubits[::-1] definition.append((XGate(), [distribution_qubits[middle]], [])) definition.append( (PartialSwapGate(theta[middle - 1]), [distribution_qubits[middle - 1], distribution_qubits[middle]], [])) for step in range(middle - 1): step = step + 1 definition.append((PartialSwapGate(theta[middle - 1 - step]), [ distribution_qubits[middle - 1 - step], distribution_qubits[middle - step] ], [])) definition.append((PartialSwapGate(-theta[middle - 1 + step]), [ distribution_qubits[middle - 1 + step], distribution_qubits[middle + step] ], [])) if self.least_significant_bit_first: distribution_qubits = distribution_qubits[::-1] self.definition = definition
def test_layers_basic(self): """ The layers() method returns a list of layers, each of them with a list of nodes.""" qreg = QuantumRegister(2, 'qr') creg = ClassicalRegister(2, 'cr') qubit0 = qreg[0] qubit1 = qreg[1] clbit0 = creg[0] clbit1 = creg[1] condition = (creg, 3) dag = DAGCircuit() dag.add_basis_element('h', 1, 0, 0) dag.add_basis_element('cx', 2, 0, 0) dag.add_basis_element('x', 1, 0, 0) dag.add_basis_element('measure', 1, 1, 0) dag.add_qreg(qreg) dag.add_creg(creg) dag.apply_operation_back(HGate(qubit0)) dag.apply_operation_back(CnotGate(qubit0, qubit1), condition=None) dag.apply_operation_back(Measure(qubit1, clbit1), condition=None) dag.apply_operation_back(XGate(qubit1), condition=condition) dag.apply_operation_back(Measure(qubit0, clbit0), condition=None) dag.apply_operation_back(Measure(qubit1, clbit1), condition=None) layers = list(dag.layers()) self.assertEqual(5, len(layers)) name_layers = [[ node[1]["op"].name for node in layer["graph"].multi_graph.nodes(data=True) if node[1]["type"] == "op" ] for layer in layers] self.assertEqual( [['h'], ['cx'], ['measure'], ['x'], ['measure', 'measure']], name_layers)
def test_layers_basic(self): """The layers() method returns a list of layers, each of them with a list of nodes.""" qreg = QuantumRegister(2, 'qr') creg = ClassicalRegister(2, 'cr') qubit0 = qreg[0] qubit1 = qreg[1] clbit0 = creg[0] clbit1 = creg[1] condition = (creg, 3) dag = DAGCircuit() dag.add_qreg(qreg) dag.add_creg(creg) dag.apply_operation_back(HGate(), [qubit0], []) dag.apply_operation_back(CnotGate(), [qubit0, qubit1], [], condition=None) dag.apply_operation_back(Measure(), [qubit1, clbit1], [], condition=None) dag.apply_operation_back(XGate(), [qubit1], [], condition=condition) dag.apply_operation_back(Measure(), [qubit0, clbit0], [], condition=None) dag.apply_operation_back(Measure(), [qubit1, clbit1], [], condition=None) layers = list(dag.layers()) self.assertEqual(5, len(layers)) name_layers = [[ node.op.name for node in layer["graph"].nodes() if node.type == "op" ] for layer in layers] self.assertEqual( [['h'], ['cx'], ['measure'], ['x'], ['measure', 'measure']], name_layers)
def setUp(self): self.dag = DAGCircuit() qreg = QuantumRegister(3, 'qr') creg = ClassicalRegister(2, 'cr') self.dag.add_qreg(qreg) self.dag.add_creg(creg) self.dag.add_basis_element(name='h', number_qubits=1, number_classical=0, number_parameters=0) self.dag.add_basis_element('cx', 2, 0, 0) self.dag.add_basis_element('x', 1, 0, 0) self.dag.add_basis_element('measure', 1, 1, 0) self.dag.add_basis_element('reset', 1, 0, 0) self.qubit0 = qreg[0] self.qubit1 = qreg[1] self.qubit2 = qreg[2] self.clbit0 = creg[0] self.clbit1 = creg[1] self.condition = (creg, 3) self.dag.apply_operation_back(HGate(self.qubit0)) self.dag.apply_operation_back(CnotGate(self.qubit0, self.qubit1)) self.dag.apply_operation_back(XGate(self.qubit1))
def _define_decompositions(self): decomposition = DAGCircuit() q = QuantumRegister(6, "q") decomposition.add_qreg(q) decomposition.add_basis_element("u1", 1, 0, 1) decomposition.add_basis_element("h", 1, 0, 0) decomposition.add_basis_element("x", 1, 0, 0) decomposition.add_basis_element("cx", 2, 0, 0) decomposition.add_basis_element("ccx", 3, 0, 0) decomposition.add_basis_element("c3x", 4, 0, 0) decomposition.add_basis_element("c4x", 5, 0, 0) decomposition.add_basis_element("t", 1, 0, 0) decomposition.add_basis_element("tdg", 1, 0, 0) rule = [ HGate(q[5]), C4NotGate(q[0], q[1], q[2], q[3], q[5]), TdgGate(q[5]), CnotGate(q[4], q[5]), TGate(q[5]), C4NotGate(q[0], q[1], q[2], q[3], q[5]), TdgGate(q[5]), CnotGate(q[4], q[5]), TGate(q[5]), HGate(q[5]), C4NotGate(q[0], q[1], q[2], q[3], q[4]), C3NotGate(q[0], q[1], q[2], q[3]), ToffoliGate(q[0], q[1], q[2]), CnotGate(q[0], q[1]), XGate(q[0]), U1Gate(-math.pi / 32, q[1]), U1Gate(-math.pi / 16, q[2]), U1Gate(-math.pi / 8, q[3]), U1Gate(-math.pi / 4, q[4]), XGate(q[0]), CnotGate(q[0], q[1]), ToffoliGate(q[0], q[1], q[2]), C3NotGate(q[0], q[1], q[2], q[3]), C4NotGate(q[0], q[1], q[2], q[3], q[4]), U1Gate(math.pi / 32, q[0]), U1Gate(math.pi / 32, q[1]), U1Gate(math.pi / 16, q[2]), U1Gate(math.pi / 8, q[3]), U1Gate(math.pi / 4, q[4]) ] for inst in rule: decomposition.apply_operation_back(inst) self._decompositions = [decomposition]
def _define(self): definition = [] q = QuantumRegister(self.num_qubits) for number in self.list_values: definition.append( (ControlGate(self.num_qubits - 1, number, XGate(), self.least_significant_bit_first), q, [])) self.definition = definition
def _define(self): definition = [] q = QuantumRegister(self.num_qubits) binary = to_binary(self.number, self.num_qubits, self.least_significant_bit_first) for i in range(self.num_qubits): if binary[i] == '0': definition.append((XGate(), [q[self.num_qubits - i - 1]], [])) self.definition = definition
def test_apply_operation_back(self): """The apply_operation_back() method.""" self.dag.apply_operation_back(HGate(self.qubit0), condition=None) self.dag.apply_operation_back(CnotGate(self.qubit0, self.qubit1), condition=None) self.dag.apply_operation_back(Measure(self.qubit1, self.clbit1), condition=None) self.dag.apply_operation_back(XGate(self.qubit1), condition=self.condition) self.dag.apply_operation_back(Measure(self.qubit0, self.clbit0), condition=None) self.dag.apply_operation_back(Measure(self.qubit1, self.clbit1), condition=None) self.assertEqual(len(self.dag.multi_graph.nodes), 16) self.assertEqual(len(self.dag.multi_graph.edges), 17)
def test_apply_operation_back(self): """The apply_operation_back() method.""" self.dag.apply_operation_back(HGate(), [self.qubit0], [], condition=None) self.dag.apply_operation_back(CnotGate(), [self.qubit0, self.qubit1], [], condition=None) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [], condition=None) self.dag.apply_operation_back(XGate(), [self.qubit1], [], condition=self.condition) self.dag.apply_operation_back(Measure(), [self.qubit0, self.clbit0], [], condition=None) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [], condition=None) self.assertEqual(len(list(self.dag.nodes())), 16) self.assertEqual(len(list(self.dag.edges())), 17)
def _define(self): self.definition = [] distribution_qubits = QuantumRegister(self.num_qubits) theta = unary_encoding_angles(self.params) middle = int(self.num_qubits / 2) self.definition.append((XGate(), [distribution_qubits[middle]], [])) self.definition.append((PartialSwapGate(theta[middle - 1]), [distribution_qubits[middle - 1], distribution_qubits[middle]], [])) for step in range(middle - 1): step = step + 1 self.definition.append((PartialSwapGate(theta[middle - 1 - step]), [distribution_qubits[middle - 1 - step], distribution_qubits[middle - step]], [])) self.definition.append((PartialSwapGate(-theta[middle - 1 + step]), [distribution_qubits[middle - 1 + step], distribution_qubits[middle + step]], []))
def test_edges(self): """Test that DAGCircuit.edges() behaves as expected with ops.""" self.dag.apply_operation_back(HGate(), [self.qubit0], [], condition=None) self.dag.apply_operation_back(CXGate(), [self.qubit0, self.qubit1], [], condition=None) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [], condition=None) self.dag.apply_operation_back(XGate(), [self.qubit1], [], condition=self.condition) self.dag.apply_operation_back(Measure(), [self.qubit0, self.clbit0], [], condition=None) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [], condition=None) out_edges = self.dag.edges(self.dag.output_map.values()) self.assertEqual(list(out_edges), []) in_edges = self.dag.edges(self.dag.input_map.values()) # number of edges for input nodes should be the same as number of wires self.assertEqual(len(list(in_edges)), 5)
def setUp(self): self.dag = DAGCircuit() qreg = QuantumRegister(3, 'qr') creg = ClassicalRegister(2, 'cr') self.dag.add_qreg(qreg) self.dag.add_creg(creg) self.qubit0 = qreg[0] self.qubit1 = qreg[1] self.qubit2 = qreg[2] self.clbit0 = creg[0] self.clbit1 = creg[1] self.condition = (creg, 3) self.dag.apply_operation_back(HGate(), [self.qubit0], []) self.dag.apply_operation_back(CnotGate(), [self.qubit0, self.qubit1], []) self.dag.apply_operation_back(XGate(), [self.qubit1], [])
def create_dag_op(self, name, args, qubits): """Create a DAG op node. """ if name == "u0": op = U0Gate(args[0], qubits[0]) elif name == "u1": op = U1Gate(args[0], qubits[0]) elif name == "u2": op = U2Gate(args[0], args[1], qubits[0]) elif name == "u3": op = U3Gate(args[0], args[1], args[2], qubits[0]) elif name == "x": op = XGate(qubits[0]) elif name == "y": op = YGate(qubits[0]) elif name == "z": op = ZGate(qubits[0]) elif name == "t": op = TGate(qubits[0]) elif name == "tdg": op = TdgGate(qubits[0]) elif name == "s": op = SGate(qubits[0]) elif name == "sdg": op = SdgGate(qubits[0]) elif name == "swap": op = SwapGate(qubits[0], qubits[1]) elif name == "rx": op = RXGate(args[0], qubits[0]) elif name == "ry": op = RYGate(args[0], qubits[0]) elif name == "rz": op = RZGate(args[0], qubits[0]) elif name == "rzz": op = RZZGate(args[0], qubits[0], qubits[1]) elif name == "id": op = IdGate(qubits[0]) elif name == "h": op = HGate(qubits[0]) elif name == "cx": op = CnotGate(qubits[0], qubits[1]) elif name == "cy": op = CyGate(qubits[0], qubits[1]) elif name == "cz": op = CzGate(qubits[0], qubits[1]) elif name == "ch": op = CHGate(qubits[0], qubits[1]) elif name == "crz": op = CrzGate(args[0], qubits[0], qubits[1]) elif name == "cu1": op = Cu1Gate(args[0], qubits[0], qubits[1]) elif name == "cu3": op = Cu3Gate(args[0], args[1], args[2], qubits[0], qubits[1]) elif name == "ccx": op = ToffoliGate(qubits[0], qubits[1], qubits[2]) elif name == "cswap": op = FredkinGate(qubits[0], qubits[1], qubits[2]) else: raise BackendError("unknown operation for name ast node name %s" % name) self.circuit.add_basis_element(op.name, len(op.qargs), len(op.cargs), len(op.param)) self.start_gate(op) self.end_gate(op)
def _X_ctl(control: Union[AllOneControl, Qubits], q: Qubits): #TODO: Provide a decorator for adding the proper runtime signature checks. _multiplexed_control(XGate(), control, q)
def _define(self): self.definition = [] q = QuantumRegister(self.num_qubits) for i in range(len(self.string)): if self.string[i] == '0': self.definition.append((XGate(), [q[self.num_qubits - i - 1]], []))