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
Beispiel #2
0
 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]
Beispiel #3
0
 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
Beispiel #5
0
    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)
Beispiel #6
0
    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)
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.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))
Beispiel #8
0
 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]
Beispiel #9
0
 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)
Beispiel #13
0
 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]], [])) 
Beispiel #14
0
 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)
Beispiel #17
0
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)
Beispiel #18
0
 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]], []))