def run_ES(parameters, model:MODEL, utils): n_step = parameters['n_step'] n_protocol = 2**n_step exact_data = np.zeros((n_protocol,2), dtype=np.float64) # 15 digits precision b2_array = lambda n10 : np.array(list(np.binary_repr(n10, width=n_step)), dtype=np.int) st=time.time() # ---> measuring estimated time <--- model.update_protocol(b2_array(0)) psi = model.compute_evolved_state() model.compute_fidelity(psi_evolve=psi) model.compute_energy(psi_evolve=psi) print("Est. run time : \t %.3f s"%(0.5*n_protocol*(time.time()-st))) # ---> Starting real calculation <--- st=time.time() for p in range(n_protocol): model.update_protocol(b2_array(p)) psi = model.compute_evolved_state() exact_data[p] = (model.compute_fidelity(psi_evolve=psi), model.compute_energy(psi_evolve=psi)) outfile = utils.make_file_name(parameters,root=parameters['root']) with open(outfile,'wb') as f: pickle.dump(exact_data, f, protocol=4) print("Total run time : \t %.3f s"%(time.time()-st)) print("\n Thank you and goodbye !") f.close()
def run_SA(parameters, model:MODEL, utils, save = True): if parameters['verbose'] == 0: blockPrint() outfile = utils.make_file_name(parameters,root=parameters['root']) n_exist_sample, all_result = utils.read_current_results(outfile) n_sample = parameters['n_sample'] if parameters['Ti'] < 0. : parameters['Ti'] = compute_initial_Ti(parameters, model, n_sample=1000) print("Initial temperature Ti=%.3f" % parameters['Ti']) if n_exist_sample >= n_sample : print("\n\n-----------> Samples already computed in file -- terminating ... <-----------") return all_result print("\n\n-----------> Starting simulated annealing <-----------") n_iteration_left = n_sample - n_exist_sample # data should be saved 10 times --> no more (otherwise things are way too slow !) n_mod = max([1, n_iteration_left // 10]) for it in range(n_iteration_left): start_time=time.time() best_fid, best_protocol, n_fid_eval = SA(parameters, model) # -- --> performing annealing here <-- -- if parameters['task'] == 'SASD': print(' -> Stochastic descent ... ') model.update_protocol(best_protocol) best_fid, best_protocol, n_fid_eval_SD = SD(parameters, model, init_random = False) n_fid_eval += n_fid_eval_SD energy = model.compute_energy(protocol = best_protocol) result = [n_fid_eval, best_fid, energy, best_protocol] print("\n----------> RESULT FOR ANNEALING NO %i <-------------"%(it+1)) print("Number of fidelity eval \t%i"%n_fid_eval) print("Best fidelity \t\t\t%.4f"%best_fid) print("Best hx_protocol\t\t",list(best_protocol)) all_result.append(result) if save and it % n_mod == 0: with open(outfile,'wb') as f: pickle.dump([parameters, all_result],f) f.close() print("Saved iteration --> %i to %s"%(it + n_exist_sample,outfile)) print("Iteration run time --> %.4f s" % (time.time()-start_time)) print("\n Thank you and goodbye !") enablePrint() if save : with open(outfile,'wb') as f: print("Saved results in %s"%outfile) pickle.dump([parameters, all_result],f) f.close() return all_result
def Gibbs_Sampling(param, model:MODEL): # should also measure acceptance rate Ti = param['Ti'] beta = 1./Ti n_step = param['n_step'] n_equilibrate = 10000 n_auto_correlate = n_step*10 # should look at auto-correlation time ! # initial random protocol model.update_protocol( np.random.randint(0, model.n_h_field, size=n_step) ) old_fid = model.compute_fidelity() best_fid = old_fid for i in range(n_equilibrate): random_time = np.random.randint(0,n_step) current_hx = model.protocol_hx(random_time) model.update_hx(random_time, model.random_flip(random_time)) new_fid = model.compute_fidelity() d_fid = new_fid - old_fid if d_fid > 0. : # accept move old_fid = new_fid elif np.exp(beta*d_fid) > np.random.uniform() : # accept move old_fid = new_fid else: # reject move model.update_hx(random_time, current_hx) samples = [] fid_samples = [] energy_samples = [] for i in range(n_sample): for j in range(n_auto_correlate): random_time = np.random.randint(0,n_step) current_hx = model.protocol_hx(random_time) model.update_hx(random_time, model.random_flip(random_time)) new_fid = model.compute_fidelity() d_fid = new_fid - old_fid if d_fid > 0. : # accept move old_fid = new_fid elif np.exp(beta*d_fid) > np.random.uniform() : # accept move old_fid = new_fid else: # reject move model.update_hx(random_time, current_hx) samples.append(np.copy(model.protocol())) fid_samples.append(model.compute_fidelity()) energy_samples.append(model.compute_energy()) return samples, fid_samples, energy_samples
def main(): # Reading parameters from para.dat file parameters = utils.read_parameter_file() # Printing parameters for user utils.print_parameters(parameters) # Defining Hamiltonian H = HAMILTONIAN(**parameters) # Defines the model, and precomputes evolution matrices given set of states model = MODEL(H, parameters) L = 6 T = 0.1 n_step = 28 param = {'L' : L, 'T': T, 'n_step': n_step} file_name = make_file_name(param, root= "/projectnb/fheating/SGD/ES/dynamicQL/SA/ES/data/") with open(file_name, 'rb') as f: fidelities=pickle.load(f) nfid=fidelities.shape[0] fid_and_energy=np.empty((nfid,2),dtype=np.float) for i,f in zip(range(nfid),fidelity): if i%10000 == 0: print(i) model.update_protocol(b2_array(i, w = 28)) psi = model.compute_evolved_state() fid_and_energy[i][0]=model.compute_fidelity(psi_evolve = psi) fid_and_energy[i][1]=model.compute_energy(psi_evolve = psi) print(fid_and_energy[0],'\t',f) break with open("ES_L-06_T-0.500_n_step-28-test.pkl", ‘wb’) as f: fidelities=pickle.dump(fid_and_energy,f, protocol=4)
def run_SD(parameters, model:MODEL, utils, save = True): if parameters['verbose'] == 0: blockPrint() outfile = utils.make_file_name(parameters,root=parameters['root']) n_exist_sample, all_result = utils.read_current_results(outfile) n_sample = parameters['n_sample'] if n_exist_sample >= n_sample : print("\n\n-----------> Samples already computed in file -- terminating ... <-----------") return all_result print("\n\n-----------> Starting stochastic descent <-----------") n_iteration_left = n_sample - n_exist_sample # data should be saved 10 times --> no more (otherwise things are way too slow !) n_mod = max([1,n_iteration_left // 10]) for it in range(n_iteration_left): start_time=time.time() if parameters['task'] == 'SD': best_fid, best_protocol, n_fid_eval, n_visit = SD(parameters, model, init_random=True) # -- --> performing stochastic descent here <-- -- elif parameters['task'] == 'SD2': best_fid, best_protocol, n_fid_eval, n_visit = SD_2SF(parameters, model, init_random=True) # -- --> performing 2 spin flip stochastic descent here <-- -- elif parameters['task'] == 'SD2M0': best_fid, best_protocol, n_fid_eval, n_visit = SD_2SF_M0(parameters, model, init_random=True) # -- --> performing 2 spin flip stochastic descent here <-- -- #elif parameters['task'] == 'SD4': #best_fid, best_protocol, n_fid_eval, n_enc_state = SD_4SF(parameters, model, init_random=True) # -- --> performing 2 spin flip stochastic descent here <-- -- else: assert False, 'Error in task specification' energy = model.compute_energy(protocol = best_protocol) result = [n_fid_eval, best_fid, energy, n_visit, best_protocol] print("\n----------> RESULT FOR STOCHASTIC DESCENT NO %i <-------------"%(it+1)) print("Number of fidelity eval \t%i"%n_fid_eval) print("Number of states visited \t%i"%n_visit) print("Best fidelity \t\t\t%.16f"%best_fid) print("Best hx_protocol\t\t",list(best_protocol)) all_result.append(result) if save and it % n_mod == 0: with open(outfile,'wb') as f: pickle.dump([parameters, all_result],f) f.close() print("Saved iteration --> %i to %s"%(it + n_exist_sample, outfile)) print("Iteration run time --> %.4f s" % (time.time()-start_time)) print("\n Thank you and goodbye !") enablePrint() if save : # final saving ! with open(outfile,'wb') as f: pickle.dump([parameters, all_result],f) print("Saved results in %s"%outfile) f.close() return all_result