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
Beispiel #4
0
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