forked from buwantaiji/FermiFlow
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFermionHO2D.py
More file actions
76 lines (55 loc) · 2.65 KB
/
FermionHO2D.py
File metadata and controls
76 lines (55 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import torch
torch.set_default_dtype(torch.float64)
from orbitals import HO2D
from base_dist import FreeFermion
from MLP import MLP
from equivariant_funs import Backflow
from flow import CNF
from potentials import HO, CoulombPairPotential
from VMC import GSVMC
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Ground-state variational Monte Carlo simulation")
parser.add_argument("--nup", type=int, default=6, help="number of spin-up electrons")
parser.add_argument("--ndown", type=int, default=0, help="number of spin-down electrons")
parser.add_argument("--Z", type=float, default=0.5, help="Coulomb interaction strength")
parser.add_argument("--cuda", type=int, default=0, help="GPU device number")
parser.add_argument("--Deta", type=int, default=50, help="hidden layer size in the MLP representation of two-body backflow potential eta")
parser.add_argument("--nomu", action="store_true", help="do not use the one-body backflow potential mu")
parser.add_argument("--Dmu", type=int, default=50, help="hidden layer size in the MLP representation of one-body backflow potential mu")
parser.add_argument("--t0", type=float, default=0.0, help="starting time")
parser.add_argument("--t1", type=float, default=1.0, help="ending time")
parser.add_argument("--iternum", type=int, default=1000, help="number of new iterations")
parser.add_argument("--batch", type=int, default=8000, help="batch size")
args = parser.parse_args()
device = torch.device("cuda:%d" % args.cuda)
orbitals = HO2D()
basedist = FreeFermion(device=device)
eta = MLP(1, args.Deta)
eta.init_zeros()
if not args.nomu:
mu = MLP(1, args.Dmu)
mu.init_zeros()
else:
mu = None
v = Backflow(eta, mu=mu)
t_span = (args.t0, args.t1)
cnf = CNF(v, t_span)
sp_potential = HO()
pair_potential = CoulombPairPotential(args.Z)
model = GSVMC(args.nup, args.ndown, orbitals, basedist, cnf,
pair_potential, sp_potential=sp_potential)
model.to(device=device)
print("nup = %d, ndown = %d, Z = %.1f" % (args.nup, args.ndown, args.Z))
optimizer = torch.optim.Adam(model.parameters(), lr=1e-2)
print("batch = %d, iternum = %d." % (args.batch, args.iternum))
import time
for i in range(1, args.iternum + 1):
start = time.time()
gradE = model(args.batch)
optimizer.zero_grad()
gradE.backward()
optimizer.step()
speed = (time.time() - start) * 100 / 3600
print("iter: %03d" % i, "E:", model.E, "E_std:", model.E_std,
"Instant speed (hours per 100 iters):", speed)