Exemple #1
0
    def test_function_nested_wrapper(self):

        @QubitFuncWrapper.wrap
        def circuit_b(*args):
            return H(*args)

        @QubitFuncWrapper.wrap
        def circuit_a(*args):
            return C(circuit_b)(*args)

        q1 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q2 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q3 = Qubit(n=1)

        c1, c2, c3 = C(C(H))(q1, q2, q3)
        o1, _ = run(c1, c2, c3)

        q4 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q5 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q6 = Qubit(n=1)

        c4, c5, c6 = C(circuit_a)(q4, q5, q6)
        o2, _ = run(c4, c5, c6)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #2
0
    def test_not_ordered(self):
        q1 = Qubit(n=1)
        q2 = Qubit(n=1)
        q3 = Qubit(n=3)

        n1 = Not(q1)
        n2 = H(q2)
        n3 = Not(q3)
        o1, _ = run(n1,
                    n2,
                    n3,
                    feed={
                        q1: [1.0, 0.0],
                        q2: [1.0, 0.0],
                        q3: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
                    })
        q1 = Qubit(n=1)
        q2 = Qubit(n=1)
        q3 = Qubit(n=3)

        n2 = H(q2)
        n3 = Not(q3)
        n1 = Not(q1)
        o2, _ = run(n1,
                    n2,
                    n3,
                    feed={
                        q1: [1.0, 0.0],
                        q2: [1.0, 0.0],
                        q3: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
                    })

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #3
0
 def test_cnot(self):
     q1 = Qubit(n=1)
     q2 = Qubit(n=1)
     c1, c2 = C(Not)(q1, q2)
     o, _ = run(c1, c2, feed={q1: [1.0, 0.0], q2: [1.0, 0.0]})
     self.assertTrue(numpy.allclose(o, [1.0, 0.0, 0.0, 0.0]))
     o, _ = run(c1, c2, feed={q1: [0.0, 1.0], q2: [1.0, 0.0]})
     self.assertTrue(numpy.allclose(o, [0.0, 0.0, 0.0, 1.0]))
Exemple #4
0
 def test_default(self):
     # Default value setup
     q1 = Qubit(n=1, default=[0.0, 1.0])
     q2 = Qubit(n=1)
     o1, _ = run(q1, q2, feed={q2: [1.0, 0.0]})
     # Feed setup
     q3 = Qubit(n=1)
     q4 = Qubit(n=1)
     o2, _ = run(q3, q4, feed={q3: [0.0, 1.0], q4: [1.0, 0.0]})
     self.assertTrue(numpy.allclose(o1, o2))
Exemple #5
0
    def test_rop_tuplefeed(self):
        q1 = Qubit(n=1)
        q2 = Qubit(n=1)
        r2 = Rm(2, q2)
        o1, _ = run(q1, r2, feed={q1: [1.0, 0.0], q2: [0.0, 1.0]})
        o2, _ = run(q1, r2, feed={(q1, q2): [0.0, 1.0, 0.0, 0.0]})
        o3, _ = run(q1, r2, feed={(q2, q1): [0.0, 0.0, 1.0, 0.0]})

        self.assertTrue(numpy.allclose(numpy.abs(o1), [0, 1.0, 0, 0]))
        self.assertTrue(numpy.allclose(numpy.abs(o2), [0, 1.0, 0, 0]))
        self.assertTrue(numpy.allclose(numpy.abs(o3), [0, 1.0, 0, 0]))
Exemple #6
0
    def test_fop(self):
        n = 2
        reg1 = Qubit(n=n, default=[1, 2, 3, 4])
        reg2 = Qubit(n=n, default=[1, 0, 0, 0])
        freg1, freg2 = F(lambda x: 1, reg1, reg2)
        o1, _ = run(freg1, freg2)

        mock1 = Qubit(n=n, default=[1, 2, 3, 4])
        mock2 = Qubit(n=n, default=[0.0, 1.0, 0, 0])
        o2, _ = run(mock1, mock2)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #7
0
    def test_fop_withq(self):
        # reg2 = 1 and f(x) = 1 therefore f(x)^reg2 == 0
        n = 2
        reg1 = Qubit(n=n, default=[1, 2, 3, 4])
        reg2 = Qubit(n=n, default=[0, 1, 0, 0])
        freg1, freg2 = F(lambda x: 1, reg1, reg2)
        o1, _ = run(freg1, freg2)

        mock1 = Qubit(n=n, default=[1, 2, 3, 4])
        mock2 = Qubit(n=n, default=[1, 0, 0, 0])
        o2, _ = run(mock1, mock2)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #8
0
 def test_fop_regsize(self):
     n = 2
     reg1 = Qubit(n=2 * n,
                  default=numpy.ones(2**(2 * n)) * pow(2**(2 * n), -0.5))
     reg2 = Qubit(n=n)
     freg1, freg2 = F(lambda x: pow(3, x, 2**n), reg1, reg2)
     o1, _ = run(freg1, freg2)
Exemple #9
0
    def test_basic_context(self):
        q1 = Qubit(n=1, default=[pow(2,-0.5), pow(2, -0.5)])
        q2 = Qubit(n=1)

        # Normal circuit
        c1, c2 = C(H)(q1, q2)
        o1, _ = run(c1, c2)

        # Context circuit
        q3 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q4 = Qubit(n=1)

        with QubitWrapperContext(C, [q3]):
            h = H(q4)

        o2, _ = run(h)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #10
0
    def test_function_wrapper(self):

        @QubitFuncWrapper.wrap
        def circuit(*args):
            return H(*args)

        q1 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q2 = Qubit(n=2)

        c1, c2 = C(H)(q1, q2)
        o1, _ = run(c1, c2)

        q3 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q4 = Qubit(n=2)

        c3, c4 = C(circuit)(q3, q4)
        o2, _ = run(c3, c4)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #11
0
    def test_explicit_context(self):
        q1 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q2 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q3 = Qubit(n=1)

        # Normal circuit
        c1, c2, c3 = C(C(H))(q1, q2, q3)
        o1, _ = run(c1, c2, c3)

        # Context circuit
        q4 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q5 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q6 = Qubit(n=1)

        with QubitWrapperContext(C, [q4]):
            c4, c5 = C(H)(q5, q6)
        o2, _ = run(c4, c5)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #12
0
    def test_allsplit(self):
        n = 5
        q = Qubit(n=n)
        qs = q.split(range(n + 1))
        self.assertEqual(len(qs), n)
        newq = Qubit(*qs)

        state = numpy.cos(numpy.linspace(0, numpy.pi, 2**n))
        o, _ = run(newq, feed={q: state})
        self.assertTrue(numpy.allclose(state, o))
Exemple #13
0
 def test_measure_stochastic(self):
     q1 = Qubit(n=2)
     q2 = Qubit(n=2)
     m1 = StochasticMeasure(q2)
     _, c = run(m1,
                q1,
                feed={
                    q1: [0.0, 0.0, 1.0, 0.0],
                    q2: [0.5, 0.5, 0.5, 0.5]
                })
     self.assertTrue(numpy.allclose(c[m1], [0.25, 0.25, 0.25, 0.25]))
Exemple #14
0
    def test_default2(self):
        n = 2
        reg11 = Qubit(n=n, default=[1, 2, 3, 4])
        reg21 = Qubit(n=n, default=[1, 0, 0, 0])
        o1, _ = run(reg11, reg21)

        reg12 = Qubit(n=n, default=[1, 2, 3, 4])
        reg22 = Qubit(n=n)
        o2, _ = run(reg12, reg22, feed={reg22: [1, 0, 0, 0]})

        reg13 = Qubit(n=n)
        reg23 = Qubit(n=n)
        o3, _ = run(reg13,
                    reg23,
                    feed={
                        reg13: [1, 2, 3, 4],
                        reg23: [1, 0, 0, 0]
                    })

        self.assertTrue(numpy.allclose(o1, o2))
        self.assertTrue(numpy.allclose(o1, o3))
Exemple #15
0
    def test_function_double_nested_c(self):

        @QubitFuncWrapper.wrap
        def circuit(*args):
            return C(C(H))(*args)

        q1 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q2 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q3 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q4 = Qubit(n=1)

        c1, c2, c3, c4 = C(C(C(H)))(q1, q2, q3, q4)
        o1, _ = run(c1, c2, c3, c4)

        q5 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q6 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q7 = Qubit(n=1, default=[pow(2, -0.5), pow(2, -0.5)])
        q8 = Qubit(n=1)

        c5, c6, c7, c8 = C(circuit)(q5, q6, q7, q8)
        o2, _ = run(c5, c6, c7, c8)

        self.assertTrue(numpy.allclose(o1, o2))
Exemple #16
0
    def test_measure_stochastic_top(self):
        q1 = Qubit(n=2)
        q2 = Qubit(n=2)
        m1 = StochasticMeasure(q2, top_k=3)
        _, c = run(m1,
                   q1,
                   feed={
                       q1: [0.0, 0.0, 1.0, 0.0],
                       q2: [0.6, 0.8, 0.0, 0.0]
                   })

        self.assertEqual(c[m1][0][0], 1)
        self.assertEqual(c[m1][0][1], 0)
        # Doesn't matter what third index is since it's a tie.

        self.assertTrue(numpy.allclose(c[m1][1], [0.64, 0.36, 0.0]))
Exemple #17
0
    def test_split(self):
        q1 = Qubit(n=1)
        q2 = Qubit(n=1)
        n1, n2 = Not(q1, q2)
        f1 = Not(n1)
        f2 = Not(n2)
        # f1 should be back to q1 whereas n2 should be negated.
        o, _ = f1.run(feed={q1: [1.0, 0.0], q2: [1.0, 0.0]})
        self.assertTrue(numpy.allclose(o, [0.0, 1.0, 0.0, 0.0]))

        # Vice versa
        o, _ = f2.run(feed={q1: [1.0, 0.0], q2: [1.0, 0.0]})
        self.assertTrue(numpy.allclose(o, [0.0, 0.0, 1.0, 0.0]))

        # Now both back to normal
        o, _ = run(f1, f2, feed={q1: [1.0, 0.0], q2: [1.0, 0.0]})
        self.assertTrue(numpy.allclose(o, [1.0, 0.0, 0.0, 0.0]))
Exemple #18
0
    def test_toffoli(self):
        q1 = Qubit(n=1)
        q2 = Qubit(n=1)
        q3 = Qubit(n=1)

        # CCNOT
        c1, c2, c3 = C(C(Not))(q1, q2, q3)

        o, c = run(c1,
                   c2,
                   c3,
                   feed={
                       q1: [pow(2, -0.5), pow(2, -0.5)],
                       q2: [pow(2, -0.5), pow(2, -0.5)]
                   })
        self.assertTrue(
            numpy.allclose(numpy.abs(o), [0.5, 0, 0.5, 0, 0.5, 0, 0, 0.5]))
Exemple #19
0
def test(n):
    q1 = Qubit(n=n-1)
    q2 = Qubit(n=1)
    n2 = Not(q2)
    o = run(q1, n2, feed={q2: [1.0, 0.0]})
Exemple #20
0
 def test_rop(self):
     q1 = Qubit(n=1)
     q2 = Qubit(n=1, default=1)
     r2 = Rm(2, q2)
     o, _ = run(q1, r2)
     self.assertTrue(numpy.allclose(numpy.abs(o), [0, 1.0, 0, 0]))
Exemple #21
0
 def test_basic_rop(self):
     q1 = Qubit(n=1)
     q2 = Qubit(n=1)
     r2 = Rm(2, q2)
     o, _ = run(q1, r2)
     self.assertTrue(numpy.allclose(numpy.abs(o), [1, 0, 0, 0]))
Exemple #22
0
 def test_many_bits(self):
     q1 = Qubit(n=19)
     q2 = Qubit(n=1)
     n2 = Not(q2)
     o, _ = run(q1, n2, feed={q2: [1.0, 0.0]})
     self.assertEqual(o[1], numpy.sum(numpy.abs(o)))