Ejemplo n.º 1
0
def test_init():
    q = Qubits(1)
    assert q.state[0] == 1
    assert q.state[1] == 0
    assert _allclose(q.state.flatten(), xp.array([1, 0]))

    q = Qubits(2)
    assert q.state[0, 0] == 1
    assert q.state[0, 1] == 0
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 0
    assert _allclose(q.state.flatten(), xp.array([1, 0, 0, 0]))
Ejemplo n.º 2
0
def test_gate_control_0():
    q = Qubits(2)
    q.gate(X, target=0, control_0=1)
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 0
    assert q.state[1, 0] == 1
    assert q.state[1, 1] == 0

    q = Qubits(2)
    q.gate(X, target=1)
    q.gate(X, target=0, control_0=1)
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 1
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 0
Ejemplo n.º 3
0
def test_gate_single_target():
    q = Qubits(2)
    q.gate(X, target=0)
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 0
    assert q.state[1, 0] == 1
    assert q.state[1, 1] == 0
    assert _allclose(q.state.flatten(), xp.array([0, 0, 1, 0]))

    q = Qubits(2)
    q.gate(X, target=1)
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 1
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 0
    assert _allclose(q.state.flatten(), xp.array([0, 1, 0, 0]))
Ejemplo n.º 4
0
def test_set_state():
    q = Qubits(2)
    q.set_state('10')
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 0
    assert q.state[1, 0] == 1
    assert q.state[1, 1] == 0
    assert _allclose(q.state.flatten(), xp.array([0, 0, 1, 0]))
    q.set_state([0, 1, 0, 0])
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 1
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 0
    assert _allclose(q.state.flatten(), xp.array([0, 1, 0, 0]))
    q.set_state([[0, 0], [0, 1]])
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 0
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 1
    assert _allclose(q.state, xp.array([[0, 0], [0, 1]]))
Ejemplo n.º 5
0
 def __init__(self, qubits):
     Qubits.__init__(self, qubits)
     self.qubits = qubits
Ejemplo n.º 6
0
 def __init__(self, qubits, layers):
     Qubits.__init__(self, qubits)
     self.layers = layers
     self.parameters = xp.random.rand(2 * layers + 1, qubits, 3)
     self.qubits = self.size
Ejemplo n.º 7
0
    def circuitFromLine(self, line):
        self.gateNo += 1
        line = line.split('#')[0].strip()
        if (line.startswith('qubits')):
            qubits = int(line[7:])
            if (self.is_nqs()):
                self.nqs = nq.nqs.NQS(qubits, self.numInitialHidden,
                                      self.numSampleSteps,
                                      self.numRandomRestarts,
                                      self.earlyStopping, self.optimizer)
            else:
                self.exact = Qubits(qubits)
                for q in range(qubits):
                    self.exact.gate(H, target=q)

        elif (line.startswith('X')):
            for q in self.readQubits(line.strip('X')):
                if (self.is_nqs()):
                    self.nqs.applyPauliX(q)
                else:
                    self.exact.gate(X, target=q)

        elif (line.startswith('Y')):
            for q in self.readQubits(line.strip('Y')):
                if (self.is_nqs()):
                    self.nqs.applyPauliY(q)
                else:
                    self.exact.gate(Y, target=q)

        elif (line.startswith('Z')):
            for q in self.readQubits(line.strip('Z')):
                if (self.is_nqs()):
                    self.nqs.applyPauliZ(q)
                else:
                    self.exact.gate(Z, target=q)

        elif (line.startswith('H')):
            for q in self.readQubits(line.strip('H')):
                if (self.is_nqs()):
                    self.nqs.learnHadamard(q, self.numSamples,
                                           self.numIterations)
                else:
                    self.exact.gate(H, target=q)

        elif (line.startswith('Rz')):
            for q in self.readQubits(line.split(',')[0].strip('Rz')):
                if (self.is_nqs()):
                    self.nqs.applySingleZRotation(q, float(line.split(',')[1]))
                else:
                    self.exact.gate(rz(float(line.split(',')[1])), target=q)

        elif (line.startswith('Toffoli')):
            q0 = self.readQubits(line.strip('Toffoli').split(',')[0])[0]
            q1 = self.readQubits(line.strip('Toffoli').split(',')[1])[0]
            q2 = self.readQubits(line.strip('Toffoli').split(',')[2])[0]
            if (self.is_nqs()):
                self.nqs.applyToffoli(q0, q1, q2, self.numSamples,
                                      self.numIterations)
            else:
                #https://arxiv.org/pdf/0803.2316.pdf
                self.exact.gate(H, target=q2)
                self.exact.gate(X, target=q2, control=q1)
                self.exact.gate(Tdag, target=q2)
                self.exact.gate(X, target=q2, control=q0)
                self.exact.gate(T, target=q2)
                self.exact.gate(X, target=q2, control=q1)
                self.exact.gate(Tdag, target=q2)
                self.exact.gate(X, target=q2, control=q0)
                self.exact.gate(T, target=q1)
                self.exact.gate(T, target=q2)
                self.exact.gate(H, target=q2)
                self.exact.gate(X, target=q1, control=q0)
                self.exact.gate(T, target=q0)
                self.exact.gate(Tdag, target=q1)
                self.exact.gate(X, target=q1, control=q0)

        elif (line.startswith('Tdag')):
            for q in self.readQubits(line.strip('Tdag')):
                if (self.is_nqs()):
                    self.nqs.applyTDagger(q)
                else:
                    self.exact.gate(T, target=q)

        elif (line.startswith('T')):
            for q in self.readQubits(line.strip('T')):
                if (self.is_nqs()):
                    self.nqs.applyT(q)
                else:
                    self.exact.gate(T, target=q)

        elif (line.startswith('sqrt_X')):
            for q in self.readQubits(line.strip('sqrt_X')):
                if (self.is_nqs()):
                    self.nqs.learnSqrtX(q, self.numSamples, self.numIterations)
                else:
                    self.exact.gate(sqrt_X, target=q)

        elif (line.startswith('sqrt_Y')):
            for q in self.readQubits(line.strip('sqrt_Y')):
                if (self.is_nqs()):
                    self.nqs.learnSqrtY(q, self.numSamples, self.numIterations)
                else:
                    self.exact.gate(sqrt_Y, target=q)

        elif (line.startswith('CZ')):
            q0 = self.readQubits(line.strip('CZ').split(',')[0])[0]
            q1 = self.readQubits(line.strip('CZ').split(',')[1])[0]
            if (self.is_nqs()):
                if (self.learnCZ):
                    self.nqs.learnControlledZRotation(q0, q1, cmath.pi,
                                                      self.numSamples,
                                                      self.numIterations)
                else:
                    self.nqs.applyControlledZRotation(q0, q1, cmath.pi)
            else:
                self.exact.gate(Z, target=q0, control=q1)

        else:
            # no CNOT, named and repeated subcircuits among others...
            self.gateNo -= 1
Ejemplo n.º 8
0
class QASMReader:
    def __init__(self, method, numSamples, numIterations, numInitialHidden,
                 numSampleSteps, numRandomRestarts, earlyStopping, optimizer,
                 learnCZ):
        assert (method == 'nqs' or method == 'exact')
        self.numSamples = numSamples
        self.numIterations = numIterations
        self.numInitialHidden = numInitialHidden
        self.numSampleSteps = numSampleSteps
        self.numRandomRestarts = numRandomRestarts
        self.earlyStopping = earlyStopping
        self.optimizer = optimizer
        self.nqs = None
        self.exact = None
        self.method = method
        self.start = None
        self.end = None
        self.gateNo = 0
        self.learnCZ = learnCZ

    def is_nqs(self):
        return self.method == 'nqs'

    def buildCircuit(self, filename):
        f = open(filename)
        oldGateNo = self.gateNo  #to avoid storing data without changes
        for line in f:
            self.circuitFromLine(line)
            if (oldGateNo != self.gateNo):
                if (self.is_nqs()):
                    if (comm.rank == 0):
                        self.nqs.save('parameters_gate_{}.json'.format(
                            self.gateNo))
                else:
                    if (comm.rank == 0):
                        with open('exact_gate_{}.json'.format(self.gateNo),
                                  'wb') as f:
                            pickle.dump(self.exact.get_state(), f)
            oldGateNo = self.gateNo
        f.close()

    def readQubits(self, line):
        line = line.strip(' q[]')
        qubits = []
        for s in line.split(','):
            if (len(s.split(':')) > 1):
                for i in range(int(s.split(':')[0]), int(s.split(':')[1]) + 1):
                    qubits.append(i)
            else:
                qubits.append(int(s))
        return qubits

    def circuitFromLine(self, line):
        self.gateNo += 1
        line = line.split('#')[0].strip()
        if (line.startswith('qubits')):
            qubits = int(line[7:])
            if (self.is_nqs()):
                self.nqs = nq.nqs.NQS(qubits, self.numInitialHidden,
                                      self.numSampleSteps,
                                      self.numRandomRestarts,
                                      self.earlyStopping, self.optimizer)
            else:
                self.exact = Qubits(qubits)
                for q in range(qubits):
                    self.exact.gate(H, target=q)

        elif (line.startswith('X')):
            for q in self.readQubits(line.strip('X')):
                if (self.is_nqs()):
                    self.nqs.applyPauliX(q)
                else:
                    self.exact.gate(X, target=q)

        elif (line.startswith('Y')):
            for q in self.readQubits(line.strip('Y')):
                if (self.is_nqs()):
                    self.nqs.applyPauliY(q)
                else:
                    self.exact.gate(Y, target=q)

        elif (line.startswith('Z')):
            for q in self.readQubits(line.strip('Z')):
                if (self.is_nqs()):
                    self.nqs.applyPauliZ(q)
                else:
                    self.exact.gate(Z, target=q)

        elif (line.startswith('H')):
            for q in self.readQubits(line.strip('H')):
                if (self.is_nqs()):
                    self.nqs.learnHadamard(q, self.numSamples,
                                           self.numIterations)
                else:
                    self.exact.gate(H, target=q)

        elif (line.startswith('Rz')):
            for q in self.readQubits(line.split(',')[0].strip('Rz')):
                if (self.is_nqs()):
                    self.nqs.applySingleZRotation(q, float(line.split(',')[1]))
                else:
                    self.exact.gate(rz(float(line.split(',')[1])), target=q)

        elif (line.startswith('Toffoli')):
            q0 = self.readQubits(line.strip('Toffoli').split(',')[0])[0]
            q1 = self.readQubits(line.strip('Toffoli').split(',')[1])[0]
            q2 = self.readQubits(line.strip('Toffoli').split(',')[2])[0]
            if (self.is_nqs()):
                self.nqs.applyToffoli(q0, q1, q2, self.numSamples,
                                      self.numIterations)
            else:
                #https://arxiv.org/pdf/0803.2316.pdf
                self.exact.gate(H, target=q2)
                self.exact.gate(X, target=q2, control=q1)
                self.exact.gate(Tdag, target=q2)
                self.exact.gate(X, target=q2, control=q0)
                self.exact.gate(T, target=q2)
                self.exact.gate(X, target=q2, control=q1)
                self.exact.gate(Tdag, target=q2)
                self.exact.gate(X, target=q2, control=q0)
                self.exact.gate(T, target=q1)
                self.exact.gate(T, target=q2)
                self.exact.gate(H, target=q2)
                self.exact.gate(X, target=q1, control=q0)
                self.exact.gate(T, target=q0)
                self.exact.gate(Tdag, target=q1)
                self.exact.gate(X, target=q1, control=q0)

        elif (line.startswith('Tdag')):
            for q in self.readQubits(line.strip('Tdag')):
                if (self.is_nqs()):
                    self.nqs.applyTDagger(q)
                else:
                    self.exact.gate(T, target=q)

        elif (line.startswith('T')):
            for q in self.readQubits(line.strip('T')):
                if (self.is_nqs()):
                    self.nqs.applyT(q)
                else:
                    self.exact.gate(T, target=q)

        elif (line.startswith('sqrt_X')):
            for q in self.readQubits(line.strip('sqrt_X')):
                if (self.is_nqs()):
                    self.nqs.learnSqrtX(q, self.numSamples, self.numIterations)
                else:
                    self.exact.gate(sqrt_X, target=q)

        elif (line.startswith('sqrt_Y')):
            for q in self.readQubits(line.strip('sqrt_Y')):
                if (self.is_nqs()):
                    self.nqs.learnSqrtY(q, self.numSamples, self.numIterations)
                else:
                    self.exact.gate(sqrt_Y, target=q)

        elif (line.startswith('CZ')):
            q0 = self.readQubits(line.strip('CZ').split(',')[0])[0]
            q1 = self.readQubits(line.strip('CZ').split(',')[1])[0]
            if (self.is_nqs()):
                if (self.learnCZ):
                    self.nqs.learnControlledZRotation(q0, q1, cmath.pi,
                                                      self.numSamples,
                                                      self.numIterations)
                else:
                    self.nqs.applyControlledZRotation(q0, q1, cmath.pi)
            else:
                self.exact.gate(Z, target=q0, control=q1)

        else:
            # no CNOT, named and repeated subcircuits among others...
            self.gateNo -= 1

    def toDecimal(self, sample):
        return int("".join(str(int(x)) for x in sample), 2)

    def display(self):
        if (comm.rank == 0):
            if (self.is_nqs()):
                startSampling = time.time()
                raw_data = [
                    self.toDecimal(self.nqs.sample()) for _ in range(shots)
                ]
                histogram = collections.Counter(raw_data)
                endSampling = time.time()

                with open('raw_data.json', 'w') as f:
                    json.dump(raw_data, f)

                with open('histogram.json', 'w') as f:
                    json.dump(histogram, f)

                with open('duration_sampling.time', 'w') as f:
                    f.write(str(endSampling - startSampling))

                self.nqs.save('parameters.json')
            else:
                with open('exact.json', 'wb') as f:
                    pickle.dump(self.exact.get_state(), f)

            with open('duration.time', 'w') as f:
                f.write(str(self.end - self.start))
Ejemplo n.º 9
0
def test_swap_is_3cnot():
    q = Qubits(2)
    q.gate(rx(0.1), target=0)
    q.gate(rx(0.1), target=1, control=0)
    q.gate(swap, target=(0, 1))
    psi1 = q.state

    q = Qubits(2)
    q.gate(rx(0.1), target=0)
    q.gate(rx(0.1), target=1, control=0)
    q.gate(X, target=0, control=1)
    q.gate(X, target=1, control=0)
    q.gate(X, target=0, control=1)
    psi2 = q.state

    assert _allclose(psi1, psi2)
Ejemplo n.º 10
0
def test_gate_single_qubit():
    q = Qubits(1)
    q.gate(Y, target=0)

    assert _allclose(q.state, xp.array([0, 1j]))

    q = Qubits(1)
    q.gate(ry(0.1), target=0)
    q.gate(rz(0.1), target=0)
    psi1 = q.state

    q = Qubits(1)
    q.gate(xp.dot(rz(0.1), ry(0.1)), target=0)
    psi2 = q.state

    q = Qubits(1)
    q.gate(xp.dot(ry(0.1), rz(0.1)), target=0)
    psi3 = q.state

    assert _allclose(psi1, psi2)
    assert not _allclose(psi1, psi3)
Ejemplo n.º 11
0
def test_get_state():
    q = Qubits(2)
    q.set_state('11')
    assert _allclose(q.get_state(), xp.array([0, 0, 0, 1]))
    q.set_state('01')
    assert _allclose(q.get_state(flatten=False), xp.array([[0, 1], [0, 0]]))
Ejemplo n.º 12
0
def test_expect():
    q = Qubits(2)
    res = q.expect(xp.kron(I, I))
    assert res == 1

    q = Qubits(2)
    res = q.expect(xp.kron(I, X))
    assert res == 0

    q = Qubits(2)
    res = q.expect({'YI': 2.5, 'II': 2, 'IX': 1.5, 'IZ': 1})
    assert res == 3

    q = Qubits(2)
    q.set_state('01')
    res = q.expect({'IZ': 2})
    assert res == -2

    q = Qubits(2)
    q.set_state('10')
    res = q.expect({'IZ': 2})
    assert res == 2

    q = Qubits(2)
    q.set_state('01')
    res = q.expect({'ZI': 2})
    assert res == 2

    q = Qubits(2)
    q.set_state('11')
    res = q.expect({'ZZ': 2})
    assert res == 2
Ejemplo n.º 13
0
def test_project():
    q = Qubits(2)
    res0 = q.project(target=0)
    res1 = q.project(target=1)
    assert res0 == 0
    assert res1 == 0

    q = Qubits(2)
    q.gate(Y, target=0)
    res0 = q.project(target=0)
    res1 = q.project(target=1)
    assert res0 == 1
    assert res1 == 0

    q = Qubits(2)
    q.gate(Y, target=1)
    res0 = q.project(target=0)
    res1 = q.project(target=1)
    assert res0 == 0
    assert res1 == 1

    q = Qubits(2)
    q.gate(Y, target=0)
    q.gate(Y, target=1)
    res0 = q.project(target=0)
    res1 = q.project(target=1)
    assert res0 == 1
    assert res1 == 1
Ejemplo n.º 14
0
def test_gate_multi_targets():
    q = Qubits(2)
    q.gate(X, target=0)
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 0
    assert q.state[1, 0] == 1
    assert q.state[1, 1] == 0
    q.gate(swap, target=(0, 1))
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 1
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 0

    q = Qubits(2)
    q.gate(X, target=0)
    q.gate(swap, target=(1, 0))
    assert q.state[0, 0] == 0
    assert q.state[0, 1] == 1
    assert q.state[1, 0] == 0
    assert q.state[1, 1] == 0