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]
        x_gate = XGate()
        x_gate.condition = (creg, 3)
        dag = DAGCircuit()
        dag.add_qreg(qreg)
        dag.add_creg(creg)
        dag.apply_operation_back(HGate(), [qubit0], [])
        dag.apply_operation_back(CXGate(), [qubit0, qubit1], [])
        dag.apply_operation_back(Measure(), [qubit1, clbit1], [])
        dag.apply_operation_back(x_gate, [qubit1], [])
        dag.apply_operation_back(Measure(), [qubit0, clbit0], [])
        dag.apply_operation_back(Measure(), [qubit1, clbit1], [])

        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)
Beispiel #2
0
 def test_apply_operation_back(self):
     """The apply_operation_back() method."""
     x_gate = XGate()
     x_gate.condition = self.condition
     self.dag.apply_operation_back(HGate(), [self.qubit0], [])
     self.dag.apply_operation_back(CXGate(), [self.qubit0, self.qubit1], [])
     self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [])
     self.dag.apply_operation_back(x_gate, [self.qubit1], [])
     self.dag.apply_operation_back(Measure(), [self.qubit0, self.clbit0], [])
     self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [])
     self.assertEqual(len(list(self.dag.nodes())), 16)
     self.assertEqual(len(list(self.dag.edges())), 17)
Beispiel #3
0
 def test_edges(self):
     """Test that DAGCircuit.edges() behaves as expected with ops."""
     x_gate = XGate()
     x_gate.condition = self.condition
     self.dag.apply_operation_back(HGate(), [self.qubit0], [])
     self.dag.apply_operation_back(CXGate(), [self.qubit0, self.qubit1], [])
     self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [])
     self.dag.apply_operation_back(x_gate, [self.qubit1], [])
     self.dag.apply_operation_back(Measure(), [self.qubit0, self.clbit0], [])
     self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], [])
     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)
Beispiel #4
0
 def _get_rule(self, node):
     q = QuantumRegister(node.op.num_qubits, "q")
     if node.name == "u1":
         rule = [(RZGate(node.op.params[0]), [q[0]], [])]
     elif node.name == "u2":
         rule = [
             (RZGate(node.op.params[1]), [q[0]], []),
             (SYGate(), [q[0]], []),
             (RZGate(node.op.params[0]), [q[0]], []),
         ]
     elif node.name == "u3":
         rule = [
             (RZGate(node.op.params[2]), [q[0]], []),
             (RYGate(node.op.params[0]), [q[0]], []),
             (RZGate(node.op.params[1]), [q[0]], []),
         ]
     elif node.name == "cx":
         # // controlled-NOT as per Maslov (2017); this implementation takes s = v = +1
         # gate cx a,b
         # {
         # ry(pi/2) a;
         # ms(pi/2, 0) a,b;
         # rx(-pi/2) a;
         # rx(-pi/2) b;
         # ry(-pi/2) a;
         # }
         rule = [
             (SYGate(), [q[0]], []),
             (MSGate(pi / 2, 0), [q[0], q[1]], []),
             (RXGate(-pi / 2), [q[0]], []),
             (RXGate(-pi / 2), [q[1]], []),
             (RYGate(-pi / 2), [q[0]], []),
         ]
     elif node.name == "rx":
         if node.op.params[0] == pi:
             rule = [(XGate(), [q[0]], [])]
         elif node.op.params[0] == pi / 2:
             rule = [(SXGate(), [q[0]], [])]
         else:
             rule = [(RGate(0, node.op.params[0]), [q[0]], [])]
     elif node.name == "h":
         rule = [
             (ZGate(), [q[0]], []),
             (SYGate(), [q[0]], []),
         ]
     elif node.name == "ry":
         if node.op.params[0] == pi:
             rule = [(YGate(), [q[0]], [])]
         elif node.op.params[0] == pi / 2:
             rule = [(SYGate(), [q[0]], [])]
         else:
             rule = [(RGate(pi / 2, node.op.params[0]), [q[0]], [])]
     else:
         rule = node.op.definition
     return rule
Beispiel #5
0
    def _define_from_label(self):
        q = QuantumRegister(self.num_qubits, "q")
        initialize_circuit = QuantumCircuit(q, name="init_def")

        for qubit, param in enumerate(reversed(self.params)):
            initialize_circuit.append(Reset(), [q[qubit]])

            if param == "1":
                initialize_circuit.append(XGate(), [q[qubit]])
            elif param == "+":
                initialize_circuit.append(HGate(), [q[qubit]])
            elif param == "-":
                initialize_circuit.append(XGate(), [q[qubit]])
                initialize_circuit.append(HGate(), [q[qubit]])
            elif param == "r":  # |+i>
                initialize_circuit.append(HGate(), [q[qubit]])
                initialize_circuit.append(SGate(), [q[qubit]])
            elif param == "l":  # |-i>
                initialize_circuit.append(HGate(), [q[qubit]])
                initialize_circuit.append(SdgGate(), [q[qubit]])

        return initialize_circuit
Beispiel #6
0
    def _define_from_label(self):
        q = QuantumRegister(self.num_qubits, 'q')
        initialize_circuit = QuantumCircuit(q, name='init_def')

        for qubit, param in enumerate(reversed(self.params)):
            initialize_circuit.append(Reset(), [q[qubit]])

            if param == '1':
                initialize_circuit.append(XGate(), [q[qubit]])
            elif param == '+':
                initialize_circuit.append(HGate(), [q[qubit]])
            elif param == '-':
                initialize_circuit.append(XGate(), [q[qubit]])
                initialize_circuit.append(HGate(), [q[qubit]])
            elif param == 'r':  # |+i>
                initialize_circuit.append(HGate(), [q[qubit]])
                initialize_circuit.append(SGate(), [q[qubit]])
            elif param == 'l':  # |-i>
                initialize_circuit.append(HGate(), [q[qubit]])
                initialize_circuit.append(SdgGate(), [q[qubit]])

        return initialize_circuit
Beispiel #7
0
    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(CXGate(), [self.qubit0, self.qubit1], [])
        self.dag.apply_operation_back(XGate(), [self.qubit1], [])
    def _define_from_int(self):
        q = QuantumRegister(self.num_qubits, 'q')
        initialize_circuit = QuantumCircuit(q, name='init_def')

        # Convert to int since QuantumCircuit converted to complex
        # and make a bit string and reverse it
        intstr = f'{int(np.real(self.params[0])):0{self.num_qubits}b}'[::-1]

        # Raise if number of bits is greater than num_qubits
        if len(intstr) > self.num_qubits:
            raise QiskitError("Initialize integer has %s bits, but this exceeds the"
                              " number of qubits in the circuit, %s." %
                              (len(intstr), self.num_qubits))

        for qubit, bit in enumerate(intstr):
            initialize_circuit.append(Reset(), [q[qubit]])
            if bit == '1':
                initialize_circuit.append(XGate(), [q[qubit]])

        return initialize_circuit
    def _define_from_int(self):
        q = QuantumRegister(self.num_qubits, "q")
        initialize_circuit = QuantumCircuit(q, name="init_def")

        # Convert to int since QuantumCircuit converted to complex
        # and make a bit string and reverse it
        intstr = f"{int(np.real(self.params[0])):0{self.num_qubits}b}"[::-1]

        # Raise if number of bits is greater than num_qubits
        if len(intstr) > self.num_qubits:
            raise QiskitError(
                "StatePreparation integer has %s bits, but this exceeds the"
                " number of qubits in the circuit, %s." %
                (len(intstr), self.num_qubits))

        for qubit, bit in enumerate(intstr):
            if bit == "1":
                initialize_circuit.append(XGate(), [q[qubit]])

        # note: X is it's own inverse, so even if self._inverse is True,
        # we don't need to invert anything
        return initialize_circuit