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))
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)])
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
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):
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) ])
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))