def run(): """Main FCIQMC function.""" # Initialization. bit_num = integrals.para_list[0] chunk_num = integrals.para_list[1] change_shift_crit_num = ctrl_panel.change_shift_crit_num init_walker_num = ctrl_panel.init_walker_num max_iter_num = ctrl_panel.max_iter_num damping = ctrl_panel.damping ref_key = ctrl_panel.ref_key shift = ctrl_panel.init_shift tau = ctrl_panel.tau change_shift_step = ctrl_panel.change_shift_step update_plots_step = ctrl_panel.update_plots_step exact_corr = ctrl_panel.exact_corr aver_flag = False change_shift_flag = False aver_numer = 0 aver_denom = 1 aver_shift = 0 aver_times = 0 old_w_num = change_shift_crit_num old_shift = shift w_num = init_walker_num dets_p = dict({ref_key : det.Det(w_num, True)}) dets_p[ref_key].diag_entry = 0 dets_p_old = {} for key in dets_p: dets_p_old[key] = det.Det(dets_p[key].value, True) key_list = test.gen_key_list() aver_iter_num_list = [] aver_proj_list = [] aver_shift_list = [] shift_list = [] init_w_num_list = [] iter_num_list = [] log_init_w_num_list = [] log_w_num_list = [] proj_list = [] w_num_list = [] # Figure 0: walker number in log. init_figure(0, [0, 20] + ctrl_panel.y_axis_log_w_num_plot, 'Iteration', 'Log of walker number') # Figure 1: walker number. init_figure(1, [0, 20, 0, w_num*1.2], 'Iteration', 'Walker number') # Figure 2: energy. init_figure(2, [0, 20] + ctrl_panel.y_axis_energy_plot, 'Iteration', 'Energy') # Figure 3: |Psi(t)>. init_figure(3, [0, len(key_list)] + ctrl_panel.y_axis_eig_vec_plot, 'Dimension', 'Value') for iter_num in range(1, max_iter_num+1): det_ops.single_step(dets_p, tau, shift) w_num = det_ops.count_u_num(dets_p) init_w_num = abs(dets_p[ref_key].value) if iter_num % update_plots_step == 0: iter_num_list.append(iter_num) log_w_num_list.append(math.log(w_num)) log_init_w_num_list.append(math.log(init_w_num)) # Figure 0: walker number. plt.figure(0) plt.clf() plt.axis([0, iter_num] + ctrl_panel.y_axis_log_w_num_plot) # Draws log of walker number. draw_curve(iter_num_list, log_w_num_list, 'b') draw_curve(iter_num_list, log_init_w_num_list, 'r') plt.xlabel('Iteration') plt.ylabel('Log of walker number') plt.pause(0.01) w_num_list.append(w_num) init_w_num_list.append(init_w_num) # Figure 1: walker number. plt.figure(1) plt.clf() plt.axis([0, iter_num, 0, w_num*1.2]) # Draws walker number. draw_curve(iter_num_list, w_num_list, 'b') draw_curve(iter_num_list, init_w_num_list, 'r') plt.xlabel('Iteration') plt.ylabel('Walker number') plt.pause(0.01) shift_list.append(shift) numer, denom = det_ops.corr_by_proj(dets_p, ref_key) proj_energy = numer / denom proj_list.append(proj_energy) if aver_flag: aver_iter_num_list.append(iter_num) aver_shift_list.append(aver_shift) aver_proj_list.append(aver_proj) # Figure 2: correlation energy. plt.figure(2) plt.clf() plt.axis([0, iter_num] + ctrl_panel.y_axis_energy_plot) # Draws shift. draw_curve([0, max_iter_num], [exact_corr, exact_corr], 'k') draw_curve(iter_num_list, shift_list, 'b') draw_curve(iter_num_list, proj_list, 'r') draw_curve(aver_iter_num_list, aver_shift_list, 'c') draw_curve(aver_iter_num_list, aver_proj_list, 'm') plt.xlabel('Iteration') plt.ylabel('Energy') plt.pause(0.01) vec = det_ops.dets_2_vec(key_list, dets_p) # Figure 3: |Psi(t)>. plt.figure(3) plt.clf() plt.axis([0, len(key_list)] + ctrl_panel.y_axis_eig_vec_plot) # Draws eigenvector. draw_curve(range(1, len(vec)+1), vec, 'b') plt.xlabel('Dimension') plt.ylabel('Value') plt.pause(0.01) # ref_key_cand = det_ops.find_ref(dets_p); print iter_num, w_num, dets_p[ref_key].value, shift, proj_energy if (not change_shift_flag) and w_num > change_shift_crit_num: change_shift_flag = True shift = proj_energy crit_iter_num = iter_num if change_shift_flag: if iter_num % change_shift_step == 0: correction = -damping / change_shift_step / tau \ * math.log(w_num / float(old_w_num)) shift += correction old_w_num = w_num if (not aver_flag) and (iter_num - crit_iter_num) > ctrl_panel.wait_for_aver_num: if abs(shift - old_shift) < 0.02: aver_flag = True if aver_flag: aver_shift = (aver_shift*aver_times+shift) / (aver_times+1) aver_numer = (aver_numer*aver_times+numer) / (aver_times+1) aver_denom = (aver_denom*aver_times+denom) / (aver_times+1) aver_proj = aver_numer / aver_denom aver_times += 1 old_shift = shift """ # Figure 3: Derivative of log(w_num). s_log_w_num_list = smooth(log_w_num_list, 2) d_log_w_num_list = derivative(s_log_w_num_list, 2) f3 = plt.figure(3) plt.axis([0, max_iter_num, -0.1, 0.2]) plt.ion() plt.clf() draw_curve(iter_num_list[:len(s_log_w_num_list)], s_log_w_num_list, 'b') draw_curve(iter_num_list[:len(d_log_w_num_list)], d_log_w_num_list, 'r') plt.xlabel('Iteration') plt.ylabel('Derivative of log(w_num)') plt.show() """ return aver_shift, aver_proj, dets_p, vec
def run(): """Main FCIQMC function.""" # Initialization. bit_num = integrals.para_list[0] chunk_num = integrals.para_list[1] dim = len(ctrl_panel.key_list) change_shift_crit_num = ctrl_panel.change_shift_crit_num w_num = ctrl_panel.init_walker_num init_w_num = w_num max_iter_num = ctrl_panel.max_iter_num damping = ctrl_panel.damping ref_key = ctrl_panel.ref_key shift = ctrl_panel.init_shift tau = ctrl_panel.tau change_shift_step = ctrl_panel.change_shift_step update_plots_step = ctrl_panel.update_plots_step exact_corr = ctrl_panel.exact_corr aver_flag = False change_shift_flag = False aver_numer = 0 aver_denom = 1 aver_shift = 0 aver_times = 0 old_w_num = change_shift_crit_num old_shift = shift dets_p = dict({ref_key: det.Det(w_num, True)}) dets_p[ref_key].diag_entry = 0 dets_p_old = {} for key in dets_p: dets_p_old[key] = det.Det(dets_p[key].value, True) aver_iter_num_list = [] aver_proj_list = [] aver_shift_list = [] shift_list = [] init_w_num_list = [] iter_num_list = [] log_init_w_num_list = [] log_w_num_list = [] proj_list = [] w_num_list = [] spawn_map = visual.new_spawn_map(dim) for iter_num in range(0, max_iter_num + 1): if iter_num % update_plots_step == 0: iter_num_list.append(iter_num) # Figure 4: 2D spawning map. visual.plot_update_2D(dim, spawn_map) # Figure 0: log of walker number. log_w_num_list.append(math.log(w_num)) log_init_w_num_list.append(math.log(init_w_num)) data = (iter_num_list, log_w_num_list, log_init_w_num_list) color = ("b", "r") ax_range = [0, iter_num] + ctrl_panel.y_axis_log_w_num_plot label = ("Iteration", "Log of walker number") visual.plot_update_1D(0, data, color, ax_range, label) # Figure 1: walker number. w_num_list.append(w_num) init_w_num_list.append(init_w_num) data = (iter_num_list, w_num_list, init_w_num_list) color = ("b", "r") ax_range = [0, iter_num, 0, w_num * 1.2] label = ("Iteration", "Walker number") visual.plot_update_1D(1, data, color, ax_range, label) # Figure 2: correlation energy. shift_list.append(shift) numer, denom = det_ops.corr_by_proj(dets_p, ref_key) proj_energy = numer / denom proj_list.append(proj_energy) if aver_flag: aver_iter_num_list.append(iter_num) aver_shift_list.append(aver_shift) aver_proj_list.append(aver_proj) data = (iter_num_list, shift_list, proj_list, [exact_corr] * len(iter_num_list)) color = ("b", "g", "r") label = ("Iteration", "Energy") ax_range = [0, iter_num] + ctrl_panel.y_axis_energy_plot visual.plot_update_1D(2, data, color, ax_range, label) # Figure 3: |Psi(t)>. vec = det_ops.dets_2_vec(dets_p) data = (range(len(vec)), vec) color = ("b",) label = ("Dimension", "Value") ax_range = [0, dim] + ctrl_panel.y_axis_eig_vec_plot visual.plot_update_1D(3, data, color, ax_range, label) # ref_key_cand = det_ops.find_ref(dets_p); print iter_num, w_num, dets_p[ref_key].value, shift, proj_energy if (not change_shift_flag) and w_num > change_shift_crit_num: change_shift_flag = True shift = proj_energy crit_iter_num = iter_num if change_shift_flag: if iter_num % change_shift_step == 0: correction = -damping / change_shift_step / tau * math.log(w_num / float(old_w_num)) shift += correction old_w_num = w_num if (not aver_flag) and (iter_num - crit_iter_num) > ctrl_panel.wait_for_aver_num: if abs(shift - old_shift) < 0.02: aver_flag = True if aver_flag: aver_shift = (aver_shift * aver_times + shift) / (aver_times + 1) aver_numer = (aver_numer * aver_times + numer) / (aver_times + 1) aver_denom = (aver_denom * aver_times + denom) / (aver_times + 1) aver_proj = aver_numer / aver_denom aver_times += 1 old_shift = shift det_ops.single_step(dets_p, spawn_map, tau, shift, True) w_num = det_ops.count_u_num(dets_p) init_w_num = abs(dets_p[ref_key].value)
def run(old_vec = []): """Main FCIQMC function.""" ### Initialization. # Intializes walker distribution as D0 and puts 10 walkers on it. ref_key = (8, 10, 6, 4) tau = gl_consts.tau shift = gl_consts.shift max_iter_num = gl_consts.max_iter_num bit_num = gl_consts.para_list[0] chunk_num = gl_consts.para_list[1] shift = -6 old_shift = shift gl_consts.init_crit_w_num = 0 change_shift_step = 5 update_plots_step = 20 damping = 0.05 change_shift_flag = False aver_flag = False change_shift_crit_num = 50000 old_w_num = change_shift_crit_num tau = 0.002 exact_gnd = -8.892162249 aver_times = 0 aver_shift = 0 aver_numer = 0 aver_denom = 1 max_iter_num = 100000 init_walker_num = 50 init_walker = det.Det(init_walker_num, True) w_num = init_walker_num dets_p = {} det_ops.merge(dets_p, dict({ref_key : init_walker})) ref_energy = dets_p[ref_key].diag_entry w_num_list = [] log_w_num_list = [] iter_num_list = [] aver_iter_num_list = [] shift_list = [] aver_shift_list = [] proj_list = [] aver_proj_list = [] dets_p_old = {} for key in dets_p: dets_p_old[key] = det.Det(dets_p[key].value, True) # Figure 0: walker number. f0 = plt.figure(0) # plt.axis([0, max_iter_num, 0, 20000]) plt.axis([0, max_iter_num, 3, 11]) plt.ion() plt.xlabel('Iteration') # plt.ylabel('Walker number') plt.ylabel('Log of walker number') plt.show() # Figure 1: shift. f2 = plt.figure(1) plt.axis([0, max_iter_num, -12, 0]) plt.ion() plt.xlabel('Iteration') plt.ylabel('Energy') plt.show() """""" # Figure 2: |Psi(t)>. f2 = plt.figure(2) plt.axis([0, (2**bit_num)**chunk_num - 1, -1, 1]) plt.ion() plt.xlabel('Dimension') plt.ylabel('Value') plt.show() """""" for iter_num in range(1, max_iter_num+1): det_ops.single_step(dets_p, tau, shift) w_num = det_ops.count_u_num(dets_p) if iter_num % update_plots_step == 0: iter_num_list.append(iter_num) log_w_num_list.append(math.log(w_num)) # Figure 0: walker number. plt.figure(0) plt.clf() plt.axis([0, max_iter_num, 3, 11]) # Draws walker number. draw_curve(iter_num_list, log_w_num_list, 'b') plt.xlabel('Iteration') plt.ylabel('Log of walker number') plt.pause(0.01) shift_list.append(shift) numer, denom = det_ops.corr_by_proj(dets_p, ref_key) proj_energy = numer / denom + ref_energy proj_list.append(proj_energy) if aver_flag: aver_iter_num_list.append(iter_num) aver_shift_list.append(aver_shift) aver_proj_list.append(aver_proj) # Figure 1: shift. plt.figure(1) plt.clf() plt.axis([0, max_iter_num, -12, 0]) # Draws shift. draw_curve([0, max_iter_num], [exact_gnd, exact_gnd], 'k') draw_curve(iter_num_list, shift_list, 'b') draw_curve(iter_num_list, proj_list, 'r') draw_curve(aver_iter_num_list, aver_shift_list, 'c') draw_curve(aver_iter_num_list, aver_proj_list, 'm') plt.xlabel('Iteration') plt.ylabel('Energy') plt.pause(0.01) """""" vec = det_ops.dets_2_vec(dets_p) # Figure 2: |Psi(t)>. plt.figure(2) plt.clf() plt.axis([0, len(vec)-1, -1, 1]) # Draws eigenvector. if len(old_vec) == len(vec): draw_curve(range(len(old_vec)), old_vec, 'r') draw_curve(range(len(vec)), vec, 'b') plt.xlabel('Dimension') plt.ylabel('Value') plt.pause(0.01) """""" ref_key_cand = det_ops.find_ref(dets_p); print iter_num, w_num, dets_p[ref_key].value, shift, proj_energy, ref_key_cand if (not change_shift_flag) and w_num > change_shift_crit_num: change_shift_flag = True shift = proj_energy crit_iter_num = iter_num if change_shift_flag: if iter_num % change_shift_step == 0: correction = -damping / change_shift_step / tau \ * math.log(w_num / float(old_w_num)) shift += correction old_w_num = w_num if (not aver_flag) and (iter_num - crit_iter_num) > 500: if abs(shift - old_shift) < 0.02: aver_flag = True if aver_flag: aver_shift = (aver_shift*aver_times+shift) / (aver_times+1) aver_numer = (aver_numer*aver_times+numer) / (aver_times+1) aver_denom = (aver_denom*aver_times+denom) / (aver_times+1) aver_proj = aver_numer / aver_denom + ref_energy aver_times += 1 old_shift = shift """ # Figure 3: Derivative of log(w_num). s_log_w_num_list = smooth(log_w_num_list, 2) d_log_w_num_list = derivative(s_log_w_num_list, 2) f3 = plt.figure(3) plt.axis([0, max_iter_num, -0.1, 0.2]) plt.ion() plt.clf() draw_curve(iter_num_list[:len(s_log_w_num_list)], s_log_w_num_list, 'b') draw_curve(iter_num_list[:len(d_log_w_num_list)], d_log_w_num_list, 'r') plt.xlabel('Iteration') plt.ylabel('Derivative of log(w_num)') plt.show() """ return aver_shift, dets_p, vec