Beispiel #1
0
def test_ideal_harmonic_oscillator():
    omega, N, D = 1, 5, 3
    H = HarmonicOscillator(omega_ho=omega)
    psi = SimpleGaussian(alpha=0.5 * omega)
    sampler = ImportanceSampler(np.empty((N, D)), psi, 0.1)
    sampler.thermalize(10000)

    # Energy:
    E = compute_statistics_for_series(H.local_energy_array(
        sampler, psi, 2**10))
    assert N * D * omega / 2 == E["mean"], "Energy should be exactly equal."
    assert E["var"] < 1e-16

    # Squared radius:
    r2 = compute_statistics_for_series(H.mean_squared_radius_array(
        sampler, 2**16),
                                       method="blocking")
    print(r2)
    assert (abs(3 / omega / 2 - r2["mean"]) <
            1.96 * r2["sem"]), "Should be withing 95% CI of analytic result."

    # Radius:
    r = compute_statistics_for_series(H.mean_radius_array(sampler, 2**16),
                                      method="blocking")
    print(r)
    assert (abs(2 / np.sqrt(np.pi * omega) - r["mean"]) <
            1.96 * r["sem"]), "Should be withing 95% CI of analytic result."
import matplotlib.pyplot as plt
import matplotlib2tikz

from qflow.wavefunctions import SimpleGaussian
from qflow.hamiltonians import HarmonicOscillator
from qflow.samplers import ImportanceSampler
from qflow.optimizers import SgdOptimizer, AdamOptimizer
from qflow.training import EnergyCallback, train
from qflow.mpi import master_rank

N, D = 1, 1
system = np.empty((N, D))
H = HarmonicOscillator(omega_ho=1)
psi = SimpleGaussian(0.8)
org_params = psi.parameters[:]
sampler = ImportanceSampler(system, psi, 0.5)

labels = [
    r"Sgd($\eta=0.1$)",
    r"Sgd($\eta=0.050$)",
    r"Sgd($\eta=0.025$)",
    r"Sgd($\eta=0.010$)",
    r"Adam($\eta=0.05,\beta_1=0.9$)",
    r"Adam($\eta=0.05,\beta_1=0.7$)",
]
optimizers = [
    SgdOptimizer(0.1),
    SgdOptimizer(0.05),
    SgdOptimizer(0.025),
    SgdOptimizer(0.01),
    AdamOptimizer(len(psi.parameters), 0.05, 0.9),
Beispiel #3
0
# Wave functions:
simple_gaussian = SimpleGaussian(alpha=0.5)
jastrow = JastrowPade(alpha=1, beta=1)
simple_and_jastrow = WavefunctionProduct(simple_gaussian, jastrow)

layers = [
    DenseLayer(P * D, 32, activation=tanh, scale_factor=0.001),
    DenseLayer(32, 16, activation=tanh),
    DenseLayer(16, 1, activation=exponential),
]
dnn = Dnn()
for l in layers:
    dnn.add_layer(l)
psi = WavefunctionProduct(simple_and_jastrow, dnn)
psi_sampler = ImportanceSampler(system, psi, step_size=0.1)

# Sorted
simple_gaussian2 = SimpleGaussian(alpha=0.5)
jastrow2 = JastrowPade(alpha=1, beta=1)
simple_and_jastrow2 = WavefunctionProduct(simple_gaussian2, jastrow2)

layers2 = [
    DenseLayer(P * D, 32, activation=tanh, scale_factor=0.001),
    DenseLayer(32, 16, activation=tanh),
    DenseLayer(16, 1, activation=exponential),
]
dnn2 = Dnn()
for l in layers2:
    dnn2.add_layer(l)
psi_sorted_base = WavefunctionProduct(simple_and_jastrow2, dnn2)
Beispiel #4
0
    eax.legend()

    pax.plot(np.asarray(parameters)[:, [0, 3]])
    pax.set_xlabel(r"% of training")
    pax.legend([r"$\alpha_G$", r"$\beta_{PJ}$"])

    matplotlib2tikz.save(__file__ + ".tex")


P, D = 2, 2  # Particles, dimensions
system = np.empty((P, D))
H = CoulombHarmonicOscillator()
simple_gaussian = SimpleGaussian(alpha=0.5)
jastrow = JastrowPade(alpha=1, beta=1)
psi = WavefunctionProduct(simple_gaussian, jastrow)
psi_sampler = ImportanceSampler(system, psi, step_size=0.1)
psi_simple_sampler = ImportanceSampler(system, simple_gaussian, step_size=0.1)

psi_energies = EnergyCallback(samples=100000)
psi_parameters = ParameterCallback()

train(
    psi,
    H,
    psi_sampler,
    iters=2000,
    samples=1000,
    gamma=0,
    optimizer=AdamOptimizer(len(psi.parameters)),
    call_backs=(psi_energies, psi_parameters),
)
Beispiel #5
0
# Wave functions:
simple_gaussian = SimpleGaussian(alpha=0.5)
jastrow = JastrowPade(alpha=1, beta=1)
simple_and_jastrow = WavefunctionProduct(simple_gaussian, jastrow)

layers = [
    DenseLayer(P * D, 32, activation=tanh, scale_factor=0.001),
    DenseLayer(32, 16, activation=tanh),
    DenseLayer(16, 1, activation=exponential),
]
dnn = Dnn()
for l in layers:
    dnn.add_layer(l)
psi = WavefunctionProduct(simple_and_jastrow, dnn)
psi_sampler = ImportanceSampler(system, psi, step_size=0.1)
psi.parameters = np.loadtxt("QD-parameters-dnn-regular.txt")

# Sorted
simple_gaussian2 = SimpleGaussian(alpha=0.5)
jastrow2 = JastrowPade(alpha=1, beta=1)
simple_and_jastrow2 = WavefunctionProduct(simple_gaussian2, jastrow2)

layers2 = [
    DenseLayer(P * D, 32, activation=tanh, scale_factor=0.001),
    DenseLayer(32, 16, activation=tanh),
    DenseLayer(16, 1, activation=exponential),
]
dnn2 = Dnn()
for l in layers2:
    dnn2.add_layer(l)
def test_mean_dist_large_cached(benchmark):
    with DistanceCache(large_system):
        result = benchmark(H0.mean_distance_array,
                           ImportanceSampler(large_system, psi0), samples)
        assert np.isfinite(result).all()
def test_E_L_grad_large(benchmark):
    result = benchmark(H0.local_energy_gradient,
                       ImportanceSampler(large_system, psi0), psi0, samples)
    assert np.isfinite(result).all()
def test_mean_dist_small(benchmark):
    result = benchmark(H0.mean_distance_array,
                       ImportanceSampler(small_system, psi0), samples)
    assert np.isfinite(result).all()
def test_E_L_small(benchmark):
    result = benchmark(H0.local_energy, ImportanceSampler(small_system, psi0),
                       psi0, samples)
    assert np.isfinite(result).all()
Beispiel #10
0
import numpy as np
import matplotlib.pyplot as plt
import matplotlib2tikz

from qflow.wavefunctions import JastrowPade, SimpleGaussian, WavefunctionProduct
from qflow.hamiltonians import CoulombHarmonicOscillator
from qflow.samplers import ImportanceSampler
from qflow.mpi import master_rank

P, D = 2, 2  # Particles, dimensions
system = np.empty((P, D))
H = CoulombHarmonicOscillator()
simple_gaussian = SimpleGaussian(alpha=0.4950)
jastrow = JastrowPade(alpha=1, beta=0.3978)
psi = WavefunctionProduct(simple_gaussian, jastrow)
sampler = ImportanceSampler(system, psi, step_size=0.1)
sampler.thermalize(10000)

samples = 2**27
n_bins = 100
max_r = 3.0
r = np.linspace(0, max_r, n_bins)
bins = H.onebodydensity(sampler, n_bins, max_r, samples)
rho = bins / np.trapz(bins, x=r)
exact_ideal = np.exp(-r**2)
exact_ideal /= np.trapz(exact_ideal, x=r)

if master_rank():
    print(rho)
    plt.plot(r, rho, label=r"$\psi_{PJ}$")
    plt.plot(r, exact_ideal, "--", label=r"$\exp(-r^2)$")
Beispiel #11
0
import numpy as np

from qflow.wavefunctions import SimpleGaussian
from qflow.hamiltonians import HarmonicOscillator
from qflow.samplers import ImportanceSampler
from qflow.statistics import compute_statistics_for_series, statistics_to_tex
from qflow.mpi import mpiprint

N, D = 100, 3
system = np.empty((N, D))
H = HarmonicOscillator(omega_ho=1)
psi_opt = SimpleGaussian(alpha=0.5)
psi_nopt = SimpleGaussian(alpha=0.51)
sampler_opt = ImportanceSampler(system, psi_opt, 0.1)
sampler_nopt = ImportanceSampler(system, psi_nopt, 0.1)

sampler_opt.thermalize(10000)
sampler_nopt.thermalize(10000)

samples = 2**23

stats = [
    compute_statistics_for_series(
        H.local_energy_array(sampler_opt, psi_opt, 100) / N),
    compute_statistics_for_series(
        H.local_energy_array(sampler_nopt, psi_nopt, samples) / N,
        method="blocking"),
]

labels = [r"$\alpha_G = 0.5$", r"$\alpha_G=0.51$"]
Beispiel #12
0
from qflow.training import train, EnergyCallback, ParameterCallback
from qflow.statistics import compute_statistics_for_series
from qflow.mpi import mpiprint, master_rank

P, D = 2, 2  # Particles, dimensions

# Define Hamiltonian:
H = CoulombHarmonicOscillator(omega_ho=1)

# Define trial wave function:
gaussian = SimpleGaussian(alpha=0.8)
jastrow = JastrowPade(alpha=1, beta=1)
psi = WavefunctionProduct(gaussian, jastrow)

# Set up sampling strategy:
sampler = ImportanceSampler(np.empty((P, D)), psi, step_size=0.1)

# Train wave function:
training_energies = EnergyCallback(samples=100000)
training_params = ParameterCallback()
train(
    psi,
    H,
    sampler,
    iters=150,     # Optimization steps.
    samples=1000,  # MC cycles per optimization step.
    gamma=0,       # Regularization parameter (disabled here).
    optimizer=SgdOptimizer(0.1),
    call_backs=(training_energies, training_params),
)
Beispiel #13
0
def test_mean_dist_large(benchmark):
    result = benchmark(H0.mean_distance, ImportanceSampler(large_system, psi0), samples)
    assert np.isfinite(result).all()
Beispiel #14
0
import numpy as np
import matplotlib.pyplot as plt
import matplotlib2tikz

from qflow.wavefunctions import SimpleGaussian
from qflow.hamiltonians import HarmonicOscillator
from qflow.samplers import ImportanceSampler
from qflow.optimizers import SgdOptimizer
from qflow.training import train, EnergyCallback, ParameterCallback

N, D = 10, 3
system = np.empty((N, D))
H = HarmonicOscillator(omega_ho=1)
psi_G = SimpleGaussian(alpha=0.3)
isampler_G = ImportanceSampler(system, psi_G, 0.1)

isampler_G.thermalize(10000)

E_training = EnergyCallback(samples=50000, verbose=True)
G_training = ParameterCallback()
train(
    psi_G,
    H,
    isampler_G,
    iters=100,
    samples=1000,
    gamma=0,
    optimizer=SgdOptimizer(0.001),
    call_backs=[E_training, G_training],
)
E_training = np.asarray(E_training) / N
Beispiel #15
0
system = np.empty((P, D))

simple_gaussian = SimpleGaussian(alpha=0.5)
jastrow = JastrowOrion(beta=2, gamma=1.5)
layers = [
    DenseLayer(2 * D, 32, activation=tanh, scale_factor=0.001),
    DenseLayer(32, 1, activation=exponential),
]
dnn = Dnn()
for l in layers:
    dnn.add_layer(l)

simple_and_jastrow = WavefunctionProduct(simple_gaussian, jastrow)
pooled_dnn = SumPooling(dnn)
psi = WavefunctionProduct(simple_and_jastrow, pooled_dnn)
psi_sampler = ImportanceSampler(system, psi, step_size=0.1)

psi_energies = EnergyCallback(samples=5000, verbose=True)
psi_symmetries = SymmetryCallback(samples=100)
psi_parameters = ParameterCallback()

train(
    psi,
    H1,
    psi_sampler,
    iters=50,
    samples=1000,
    gamma=0,
    optimizer=AdamOptimizer(len(psi.parameters)),
    # call_backs=(psi_energies, psi_symmetries, psi_parameters),
)
Beispiel #16
0
from qflow.mpi import master_rank

N, D = 10, 3
system = np.empty((N, D))
H = HarmonicOscillator(omega_ho=1)
psi = SimpleGaussian(alpha=0.51)

n_thermal = 50000
n_energy = 2**21

arm, ari = [], []
semm, semi = [], []
steps = np.logspace(-6.5, 1.1, 150)
for step in tqdm(steps):
    ms = MetropolisSampler(system, psi, step)
    si = ImportanceSampler(system, psi, step)

    ms.thermalize(n_thermal)
    si.thermalize(n_thermal)

    arm.append(ms.acceptance_rate * 100)
    ari.append(si.acceptance_rate * 100)
    semm.append(
        compute_statistics_for_series(H.local_energy_array(ms, psi, n_energy),
                                      method="blocking")["sem"])
    semi.append(
        compute_statistics_for_series(H.local_energy_array(si, psi, n_energy),
                                      method="blocking")["sem"])

if master_rank():
    mask = np.asarray(semi) < np.max(semm)