def test_sa(self): for i in range(self.trotterslices): spinVector = np.array([ 2*self.rng.randint(2)-1 for k in range(self.nspins) ], dtype=np.float64) tannealingsched = np.linspace(self.preannealingtemp, self.annealingtemp, self.annealingsteps) sa.Anneal(tannealingsched, self.annealingmcsteps, spinVector, self.nbs, self.rng) # with the given parameters, they have surely found a ground state assert(np.sum(spinVector[:4]) == 4 or np.sum(spinVector) == -8) assert(sa.ClassicalIsingEnergy(spinVector, self.isingJ) == -8.0)
# nspins, # isingJ, # 4, # 'ising_instances/santoro_80x80_neighbors.npy' # ) neighbors = np.load('ising_instances/santoro_80x80_neighbors.npy') # initialize the states spinVector = np.array([2 * rng.randint(2) - 1 for k in range(nspins)], dtype=np.float) configurations = np.tile(spinVector, (trotterslices, 1)).T print("Initial state energy: ", sa.ClassicalIsingEnergy(spinVector, isingJ)) print '\n' # Try just using SA tannealingsched = np.linspace(preannealingtemp, annealingtemp, annealingsteps) t0 = time.time() sa.Anneal(tannealingsched, annealingmcsteps, spinVector, neighbors, rng) t1 = time.time() print("Final SA energy: ", sa.ClassicalIsingEnergy(spinVector, isingJ)) print str( np.sum(spinVector == groundstate)) + '/' + str(nspins) + ' spins agree' print "SA time (seconds): ", str(t1 - t0) print '\n' # Now do PIQA preannealingsched = np.linspace(preannealingtemp, annealingtemp, 100) annealingsched = np.linspace(fieldstart, fieldend, annealingsteps) t0 = time.time() sa.Anneal(preannealingsched, 1, spinVector, neighbors, rng) # preannealing qmc.QuantumAnneal(annealingsched, annealingmcsteps, trotterslices, annealingtemp, nspins, configurations, neighbors, rng) t1 = time.time()
# Generate list of nearest-neighbors for each spin neighbors = tools.GenerateNeighbors(nspins, isingJ, 8) # keep a count of the populations coinc_sa = np.zeros(2**nspins) coinc_qa = np.zeros(2**nspins) print("") print("# samples", samples) # Try using SA (random start) for sa_itr in xrange(samples): 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, tannealingmcsteps, spinVector, neighbors, rng) 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,
]) # get the spin version svec = 2 * msvec - 1 print("Initial state energy: ", sorted([sa.ClassicalIsingEnergy(v, isingJ) for v in svec])) print '\n' # Generate list of nearest-neighbors for each spin neighbors = tools.GenerateNeighbors(nspins, isingJ, 4) # SA annealing schedule tannealingsched = np.linspace(preannealingtemp, annealingtemp, annealingsteps) # Normal annealing routine t0 = time.time() for vec in svec: sa.Anneal(tannealingsched, annealingmcsteps, vec, neighbors, rng) t1 = time.time() print("Final SA energy: ", sorted([sa.ClassicalIsingEnergy(v, isingJ) for v in svec])) print "SA time (seconds): ", str(t1 - t0) print '\n' # Now try multispin encoding t0 = time.time() sa.Anneal_multispin(tannealingsched, annealingmcsteps, msvec, neighbors, rng) t1 = time.time() print( "Final SA-multispin energies: ", sorted( [sa.ClassicalIsingEnergy(tools.bits2spins(v), isingJ) for v in msvec])) print "SA-multispin time (seconds): ", str(t1 - t0)