def path_naive_sampling( N_path = 10,beta = 4., N_iter = int(1e5), delta = 0.5, potential = harmonic_potential, append_every = 1 ): """ Uso: """ dtau = beta/N_path path_x = [0.] * N_path pathss_x = [path_x[:]] t_0 = time() N_iter = int(N_iter) for step in range(N_iter): k = np.random.randint(0,N_path) #Periodic boundary conditions knext, kprev = (k+1) % N_path, (k-1) % N_path x_new = path_x[k] + np.random.uniform(-delta,delta) old_weight = ( rho_free(path_x[kprev],path_x[k],dtau) * np.exp(- dtau * potential(path_x[k])) * rho_free(path_x[k],path_x[knext],dtau) ) new_weight = ( rho_free(path_x[kprev],x_new,dtau) * np.exp(- dtau * potential(x_new)) * rho_free(x_new,path_x[knext],dtau) ) if np.random.uniform(0,1) < new_weight/old_weight: path_x[k] = x_new if step%append_every == 0: pathss_x.append(path_x[:]) t_1 = time() print('Path integral naive sampling: %d iterations -> %.2E seconds'%(N_iter,t_1-t_0)) pathss_x = np.array(pathss_x) return pathss_x
def path_naive_sampling( N_path=10, beta=4., N_iter=int(1e5), delta=0.5, potential=harmonic_potential, potential_string='harmonic_potential', append_every=1, save_paths_data=True, paths_file_name=None, paths_relevant_info=None): """ Uso: """ dtau = beta/N_path path_x = [0.] * N_path pathss_x = [path_x[:]] N_iter = int(N_iter) t_0 = time() for step in range(N_iter): k = np.random.randint(0,N_path) #Periodic boundary conditions knext, kprev = (k+1) % N_path, (k-1) % N_path x_new = path_x[k] + np.random.uniform(-delta,delta) old_weight = ( rho_free(path_x[kprev],path_x[k],dtau) * np.exp(- dtau * potential(path_x[k])) * rho_free(path_x[k],path_x[knext],dtau) ) new_weight = ( rho_free(path_x[kprev],x_new,dtau) * np.exp(- dtau * potential(x_new)) * rho_free(x_new,path_x[knext],dtau) ) if np.random.uniform(0,1) < new_weight/old_weight: path_x[k] = x_new if step%append_every == 0: pathss_x.append(path_x[:]) t_1 = time() print('Path integral naive sampling: %d iterations -> %.2E seconds'%(N_iter,t_1-t_0)) pathss_x = np.array(pathss_x) script_dir = os.path.dirname(os.path.abspath(__file__)) if save_paths_data: if paths_file_name is None: paths_file_name = ( 'pi_x-pi-%s-beta_%.3f-N_path_%d-N_iter_%d-delta_%.3f-append_every_%d.csv' %(potential_string, beta, N_path, N_iter, delta, append_every) ) paths_file_name = script_dir + '/' + paths_file_name if paths_relevant_info is None: paths_relevant_info = [ 'All paths generated by path_integral_naive_sampling.py each row is a path', '%s beta = %.3f N_path = %d N_iter = %d delta = %.3f' %(potential_string, beta, N_path, N_iter, delta) ] save_csv(pathss_x, None, None, paths_file_name, paths_relevant_info) return pathss_x
def path_naive_sampling(N_path=10, beta=4., N_iter=int(1e5), delta=0.5, potential=harmonic_potential, potential_string='harmonic_potential', append_every=1, save_paths_data=True, paths_file_name=None, paths_relevant_info=None): """ Uso: """ # Parámetros relevantes. dtau = beta / N_path # Path a ser modificado por cada iteración se inicializa en ceros. path_x = [0.] * N_path # Lista que guardará todos los paths, comenzando por el path inicial. pathss_x = [path_x[:]] N_iter = int(N_iter) t_0 = time() for step in range(N_iter): k = np.random.randint(0, N_path) #Periodic boundary conditions knext, kprev = (k + 1) % N_path, (k - 1) % N_path x_new = path_x[k] + np.random.uniform(-delta, delta) old_weight = (rho_free(path_x[kprev], path_x[k], dtau) * np.exp(-dtau * potential(path_x[k])) * rho_free(path_x[k], path_x[knext], dtau)) new_weight = (rho_free(path_x[kprev], x_new, dtau) * np.exp(-dtau * potential(x_new)) * rho_free(x_new, path_x[knext], dtau)) # Decide si acepta proposición x_new para x[k] if np.random.uniform(0, 1) < new_weight / old_weight: path_x[k] = x_new # Se añade el path generado cada int(append_every) iteraciones if step % append_every == 0: pathss_x.append(path_x[:]) t_1 = time() print('Path integral naive sampling: %d iterations -> %.2E seconds' % (N_iter, t_1 - t_0)) pathss_x = np.array(pathss_x) script_dir = os.path.dirname(os.path.abspath(__file__)) # Guarda datos. if save_paths_data: if paths_file_name is None: paths_file_name = ( 'pi_x-pi-%s-beta_%.3f-N_path_%d-N_iter_%d-delta_%.3f-append_every_%d.csv' % (potential_string, beta, N_path, N_iter, delta, append_every)) paths_file_name = script_dir + '/' + paths_file_name if paths_relevant_info is None: paths_relevant_info = [ 'All paths generated by path_integral_naive_sampling.py each row is a path', '%s beta = %.3f N_path = %d N_iter = %d delta = %.3f' % (potential_string, beta, N_path, N_iter, delta) ] #Tamaño en memoria es menor y no afecta los cálculos en casos armónico y anarmónico pathss_x = np.round(pathss_x, 5) save_csv(pathss_x, None, None, paths_file_name, paths_relevant_info) return pathss_x
def path_naive_sampling( N_path=10, beta=4., N_iter=int(1e5), delta=0.5, potential=harmonic_potential, potential_string='harmonic_potential', append_every=1, save_paths_data=True, paths_file_name=None, paths_relevant_info=None): """Path integral naive sampling Uso: genera camninos aleatorios con método montecarlo para calcular pi(x;beta) para un potencial (potential) dado. Recibe: N_path: int -> determina el tamaño del camino aleatorio. beta: float -> inverso de temperatura en unidades reducidas = 1/T. N_iter: int -> iteraciones del algoritmo. delta: float -> máximo tamaño en proposición del paso para el camino aleatorio. potential: function -> potencial al cual está sometido el sistema. potential_string: str -> nombre del potencial. append every: int -> cada append_every iteraciones se guarda el estado del camino aleatorio. save_paths_data: bool -> decide si guarda paths que resultan del algoritmo en archivo CSV. paths_file_name: str -> nombre del archivo en el que se guardarán los datos. paths_relevant_info: list -> información relevante para añadir al archivo como comentario en primeras líneas del archivo. Cada elemento de la lista debe ser un str, el cual. Cada elemento de la lista se comentará como una línea diferente. Devuelve: pathss_x: list -> contiene los paths generados cada int(append_every) iteraciones. """ # Parámetros relevantes. dtau = beta/N_path # Path a ser modificado por cada iteración se inicializa en ceros. path_x = [0.] * N_path # Lista que guardará todos los paths, comenzando por el path inicial. pathss_x = [path_x[:]] N_iter = int(N_iter) t_0 = time() for step in range(N_iter): k = np.random.randint(0,N_path) #Periodic boundary conditions knext, kprev = (k+1) % N_path, (k-1) % N_path x_new = path_x[k] + np.random.uniform(-delta,delta) old_weight = (rho_free(path_x[kprev],path_x[k],dtau) * np.exp(- dtau * potential(path_x[k])) * rho_free(path_x[k],path_x[knext],dtau)) new_weight = (rho_free(path_x[kprev],x_new,dtau) * np.exp(- dtau * potential(x_new)) * rho_free(x_new,path_x[knext],dtau)) # Decide si acepta proposición x_new para x[k] if np.random.uniform(0,1) < new_weight/old_weight: path_x[k] = x_new # Se añade el path generado cada int(append_every) iteraciones if step%append_every == 0: pathss_x.append(path_x[:]) t_1 = time() print('Path integral naive sampling: %d iterations -> %.2E seconds'%(N_iter,t_1-t_0)) pathss_x = np.array(pathss_x) script_dir = os.path.dirname(os.path.abspath(__file__)) # Guarda datos en archivo CSV. if save_paths_data: if paths_file_name is None: paths_file_name = ( 'pi_x-pi-%s-beta_%.3f-N_path_%d-N_iter_%d-delta_%.3f-append_every_%d.csv' %(potential_string, beta, N_path, N_iter, delta, append_every) ) paths_file_name = script_dir + '/' + paths_file_name if paths_relevant_info is None: paths_relevant_info = [ 'All paths generated by path_integral_naive_sampling.py each row is a path', '%s beta = %.3f N_path = %d N_iter = %d delta = %.3f' %(potential_string, beta, N_path, N_iter, delta) ] #Tamaño en memoria es menor y no afecta los cálculos en casos armónico y anarmónico pathss_x = np.round(pathss_x,5) save_csv(pathss_x, None, None, paths_file_name, paths_relevant_info) return pathss_x