Beispiel #1
0
def test_spinbitconversion():
    a = np.array([0., 1., 0., 1., 0., 1., 0., 1., 0., 1.])
    b = tools.bits2spins(a)
    c = tools.spins2bits(b)
    assert (np.all(a == [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]))
    assert (np.all(b == [1, -1, 1, -1, 1, -1, 1, -1, 1, -1]))
    assert (np.all(c == a))
Beispiel #2
0
def getbitstr(vec):
    """ Return bitstring from spin vector array. """
    return reduce(lambda x, y: x + y,
                  [str(int(k)) for k in tools.spins2bits(vec)])
Beispiel #3
0
    spinVector = spinVector_original.copy()
    sa.Anneal(tannealingsched, preannealingmcsteps, spinVector, neighbors, rng)
    print(sa.ClassicalIsingEnergy(spinVector, isingJ), getbitstr(spinVector))
# Try using SA (random start)
print("SA results using random state (start and end):")
for sa_itr in range(trotterslices):
    spinVector = np.array([2 * rng.randint(2) - 1 for k in range(nspins)],
                          dtype=np.float)
    starten, startstate = (sa.ClassicalIsingEnergy(spinVector, isingJ),
                           getbitstr(spinVector))
    sa.Anneal(tannealingsched, preannealingmcsteps, spinVector, neighbors, rng)
    print(starten, startstate, sa.ClassicalIsingEnergy(spinVector, isingJ),
          getbitstr(spinVector))

# Now do PIQA
print("QA results:")
print("PIQMC starting state: ", getbitstr(spinVector))
qmc.QuantumAnneal(annealingsched, annealingmcsteps, trotterslices,
                  annealingtemp, nspins, configurations, neighbors, rng)
minEnergy, minConfiguration = np.inf, []
print("Final states of PIQMC replicas: ")
for col in configurations.T:
    candidateEnergy = sa.ClassicalIsingEnergy(col, isingJ)
    print(
        candidateEnergy,
        reduce(lambda x, y: x + y,
               [str(int(k)) for k in tools.spins2bits(col)]))
    if candidateEnergy < minEnergy:
        minEnergy = candidateEnergy
        minConfiguration = col
Beispiel #4
0
    bitstr = getbitstr(spinVector)
    coinc_sa[int(bitstr, 2)] += 1

# Now do PIQA
qmc_errors_diff = 0
for s in xrange(samples):
    confs = np.tile(
        np.array([2 * rng.randint(2) - 1 for k in range(nspins)],
                 dtype=np.float), (trotterslices, 1)).T
    qmc.QuantumAnneal(annealingsched, annealingmcsteps, trotterslices,
                      annealingtemp, nspins, confs, neighbors, rng)
    if not np.all(np.sum(confs, axis=1) / trotterslices == confs[:, 0]):
        qmc_errors_diff += 1
    else:
        bitstr = reduce(lambda x, y: x + y,
                        [str(int(k)) for k in tools.spins2bits(confs[:, 0])])
        coinc_qa[int(bitstr, 2)] += 1

print("QMC differing slices:", qmc_errors_diff)
print("Input:", getbitstr(vinput))
print("Memories:")
for k in memories:
    print(k, getbitstr(k))

print("Coincidences (state, QA count, SA count):")
stuff = sorted(enumerate(zip(coinc_qa, coinc_sa)), key=lambda x: x[1][0])[::-1]
for idx, (qa, sa) in stuff[:16]:
    print("%s\t%d\t%d" % (bin(idx)[2:].rjust(8, '0'), qa, sa))


def fsaveplot(path, ext='png', close=True, verbose=True):
Beispiel #5
0
def getbitstr(vec):
    """ Return bitstring from spin vector array. """
    return reduce(lambda x,y: x+y, 
                  [ str(int(k)) for k in tools.spins2bits(vec) ])
Beispiel #6
0
          getbitstr(spinVector))
# Try using SA (random start)
print ("SA results using random state (start and end):")
for sa_itr in range(trotterslices):
    spinVector = np.array([ 2*rng.randint(2)-1 for k in range(nspins) ], 
                          dtype=np.float)
    starten, startstate = (sa.ClassicalIsingEnergy(spinVector, isingJ), 
                           getbitstr(spinVector))
    sa.Anneal(tannealingsched, preannealingmcsteps, 
                   spinVector, neighbors, rng)
    print(starten, startstate, 
          sa.ClassicalIsingEnergy(spinVector, isingJ), 
          getbitstr(spinVector))

# Now do PIQA
print ("QA results:")
print("PIQMC starting state: ", getbitstr(spinVector))
qmc.QuantumAnneal(annealingsched, annealingmcsteps, 
                       trotterslices, annealingtemp, nspins, 
                       configurations, neighbors, rng)
minEnergy, minConfiguration = np.inf, []
print ("Final states of PIQMC replicas: ")
for col in configurations.T:
    candidateEnergy = sa.ClassicalIsingEnergy(col, isingJ)
    print(candidateEnergy, 
          reduce(lambda x,y: x+y, 
                 [ str(int(k)) for k in tools.spins2bits(col) ]))
    if candidateEnergy < minEnergy:
        minEnergy = candidateEnergy
        minConfiguration = col
# Now do PIQA
qmc_errors_diff = 0
for s in xrange(samples):
    confs = np.tile(np.array([ 2*rng.randint(2)-1 for k in range(nspins) ], 
                             dtype=np.float), (trotterslices, 1)).T
    qmc.QuantumAnneal(annealingsched, annealingmcsteps, 
                      trotterslices, annealingtemp, nspins, 
                      confs, neighbors, rng)
    if not np.all(np.sum(confs, axis=1)/trotterslices
                  == confs[:,0]):
        qmc_errors_diff += 1
    else:
        bitstr = reduce(
            lambda x,y: x+y, 
            [ str(int(k)) for k in tools.spins2bits(confs[:,0]) ]
        )
        coinc_qa[int(bitstr, 2)] += 1

print("QMC differing slices:", qmc_errors_diff)
print("Input:", getbitstr(vinput))
print("Memories:")
for k in memories:
    print(k,getbitstr(k))

print("Coincidences (state, QA count, SA count):")
stuff = sorted(enumerate(zip(coinc_qa, coinc_sa)),
               key=lambda x: x[1][0])[::-1]
for idx, (qa, sa) in stuff[:16]:
    print("%s\t%d\t%d" % (bin(idx)[2:].rjust(8,'0'), qa, sa))