def __init__(self, nr_particles=42, hard_volume_fraction=0.5, epsilon=1, alpha=0.2): np.random.seed(42) self.nr_particles = nr_particles self.hard_volume_fraction = hard_volume_fraction self.epsilon = epsilon self.alpha = alpha self.hard_radii = np.random.normal(loc=1, scale=0.1, size=self.nr_particles) self.box_length = np.power( np.sum(np.asarray([4 * np.pi * r**3 / 3 for r in self.hard_radii])) / self.hard_volume_fraction, 1 / 3) self.nr_dof = 3 * self.nr_particles self.x = np.random.uniform(-0.5 * self.box_length, 0.5 * self.box_length, self.nr_dof) self.box_vector = np.ones(3) * self.box_length self.rcut = 2 * (1 + alpha) * np.amax(self.hard_radii) self.potential = HS_WCA(use_periodic=True, use_cell_lists=False, eps=self.epsilon, sca=self.alpha, radii=self.hard_radii, boxvec=self.box_vector, rcut=self.rcut) self.optimizer = LBFGS_CPP(self.x, self.potential) print "energy before:", self.potential.getEnergy(self.x) self.optimizer.run() print "minimization converged", self.optimizer.get_result().success print "energy after:", self.potential.getEnergy( self.optimizer.get_result().coords)
def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x ** self.ndim self.dof = self.ndim * self.N self.amplitude = amplitude self.x = np.zeros(self.dof) for particle in xrange(self.N): pid = self.ndim * particle self.x[pid] = particle % self.LX self.x[pid + 1] = int(particle / self.LX) self.x_initial = np.asarray([xi + np.random.uniform(- self.amplitude, self.amplitude) for xi in self.x]) self.x_initial = np.reshape(self.x_initial, (self.N,2)) self.x_initial[:,0] -= np.mean(self.x_initial[:,0]) self.x_initial[:,1] -= np.mean(self.x_initial[:,1]) self.x_initial = self.x_initial.flatten() #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 self.boxvec = np.array([self.LX, self.LY]) self.potential = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.potential_ = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1 self.potential_cells = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.potential_cells_ = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert(self.boxvec[0]==self.boxvec[1]) print "x_initial energy:", self.potential.getEnergy(self.x_initial) print "x_initial cells energy:", self.potential_cells.getEnergy(self.x_initial) assert(self.potential.getEnergy(self.x_initial) == self.potential_.getEnergy(self.x_initial)) assert(self.potential_cells.getEnergy(self.x_initial) == self.potential_cells_.getEnergy(self.x_initial)) #assert abs(self.potential.getEnergy(self.x_initial) - self.potential_cells.getEnergy(self.x_initial)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial), self.potential_cells.getEnergy(self.x_initial), rtol=1e-10) print self.boxvec
def FindMinimumHSWCA(foldname): """ Finds the true minimum corresponding: Note Gradient Descent step should be adequately small for this to work """ foldpath = BASE_DIRECTORY + "/" + foldname sysparams = load_params(foldpath) (hs_radii, initial_coords, box_length) = load_secondary_params(foldpath) box_length = float(box_length) boxv = [box_length] * sysparams.ndim.value potential = HS_WCA( use_cell_lists=False, eps=sysparams.eps.value, sca=sysparams.pot_sca.value, radii=hs_radii * sysparams.radius_sca.value, boxvec=boxv, ndim=sysparams.ndim.value, distance_method=Distance.PERIODIC, ) # ret = steepest_descent(initial_coords, potential) # ret = fire(initial_coords, potential, iprint=1) # E, V = print(potential.getEnergyGradient(initial_coords)) # ret = quench_mixed_optimizer(potential, initial_coords, conv_tol=1e-100) ret = quench_mixed_optimizer(potential, initial_coords, conv_tol=0, nsteps=1000) # ret = quench_steepest(potential, initial_coords, stepsize=0.05, nsteps=2000) print(ret.nsteps) print(ret.nfev) np.savetxt(foldpath + "/trueminimum.txt", ret.coords, delimiter=",")
def test_same_minima_HS_WCA(self): nparticles = 32 radius_sca = 0.9085602964160698 pot_sca = 0.1 eps = 1.0 hs_radii = 0.05 * np.random.randn(nparticles) + 1 volpart = np.sum(4. / 3. * np.pi * hs_radii**3) phi = 0.7 boxl = (volpart / phi)**(1 / 3.) boxv = [boxl, boxl, boxl] coords = np.random.rand(nparticles * 3) * boxl ncellx_scale = get_ncellsx_scale(np.ones(nparticles), boxv) bdim = 3 distance_method = Distance.PERIODIC pot_cellists = HS_WCA(use_cell_lists=True, eps=eps, sca=pot_sca, radii=hs_radii * radius_sca, boxvec=boxv, ndim=bdim, ncellx_scale=ncellx_scale, distance_method=distance_method) pot_no_cellists = HS_WCA(use_cell_lists=False, eps=eps, sca=pot_sca, radii=hs_radii * radius_sca, boxvec=boxv, ndim=bdim, ncellx_scale=ncellx_scale, distance_method=distance_method) nsteps = 1000 tol = 1e-5 res_cell_lists = lbfgs_cpp(coords, pot_cellists, nsteps=nsteps, tol=tol) res_no_cell_lists = lbfgs_cpp(coords, pot_no_cellists, nsteps=nsteps, tol=tol) fcoords_cell_lists = res_cell_lists.coords fcoords_no_cell_lists = res_no_cell_lists.coords # self.assertEqual(fcoords_no_cell_lists,fcoords_cell_lists) self.assertTrue(np.all(fcoords_no_cell_lists == fcoords_cell_lists))
def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x ** self.ndim self.dof = self.ndim * self.N self.amplitude = amplitude self.x = np.zeros(self.dof) for particle in range(self.N): pid = self.ndim * particle self.x[pid] = particle % self.LX self.x[pid + 1] = int(particle / self.LX) self.x_initial = np.asarray([xi + np.random.uniform(- self.amplitude, self.amplitude) for xi in self.x]) self.x_initial = np.reshape(self.x_initial, (self.N,2)) self.x_initial[:,0] -= np.mean(self.x_initial[:,0]) self.x_initial[:,1] -= np.mean(self.x_initial[:,1]) self.x_initial = self.x_initial.flatten() #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 self.boxvec = np.array([self.LX, self.LY]) self.potential = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.potential_ = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1 self.potential_cells = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.potential_cells_ = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert(self.boxvec[0]==self.boxvec[1]) print("x_initial energy:", self.potential.getEnergy(self.x_initial)) print("x_initial cells energy:", self.potential_cells.getEnergy(self.x_initial)) assert(self.potential.getEnergy(self.x_initial) == self.potential_.getEnergy(self.x_initial)) assert(self.potential_cells.getEnergy(self.x_initial) == self.potential_cells_.getEnergy(self.x_initial)) #assert abs(self.potential.getEnergy(self.x_initial) - self.potential_cells.getEnergy(self.x_initial)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial), self.potential_cells.getEnergy(self.x_initial), rtol=1e-10) print(self.boxvec)
class MinimizeUniformHardsSpheres(object): def __init__(self, nr_particles=42, hard_volume_fraction=0.5, epsilon=1, alpha=0.2): np.random.seed(42) self.nr_particles = nr_particles self.hard_volume_fraction = hard_volume_fraction self.epsilon = epsilon self.alpha = alpha self.hard_radii = np.random.normal(loc=1, scale=0.1, size=self.nr_particles) self.box_length = np.power(np.sum(np.asarray([4 * np.pi * r**3 / 3 for r in self.hard_radii])) / self.hard_volume_fraction, 1/3) self.nr_dof = 3 * self.nr_particles self.x = np.random.uniform(-0.5 * self.box_length, 0.5 * self.box_length, self.nr_dof) self.box_vector = np.ones(3) * self.box_length self.rcut = 2 * (1 + alpha) * np.amax(self.hard_radii) self.potential = HS_WCA(use_periodic=True, use_cell_lists=False, eps=self.epsilon, sca=self.alpha, radii=self.hard_radii, boxvec=self.box_vector, rcut=self.rcut) self.optimizer = LBFGS_CPP(self.x, self.potential) print "energy before:", self.potential.getEnergy(self.x) self.optimizer.run() print "minimization converged", self.optimizer.get_result().success print "energy after:", self.potential.getEnergy(self.optimizer.get_result().coords)
def setUp(self): np.random.seed(42) self.L_mobile = 4 self.L_total = self.L_mobile + 2 self.nr_particles_mobile = self.L_mobile * self.L_mobile self.nr_particles_total = self.L_total * self.L_total self.nr_particles_frozen = self.nr_particles_total - self.nr_particles_mobile self.box_dimension = 2 self.ndof = self.nr_particles_total * self.box_dimension self.n_frozen_dof = self.nr_particles_frozen * self.box_dimension self.frozen_dof = [] self.frozen_atoms = [] for particle_index in range(self.nr_particles_total): xmean = int(particle_index % self.L_total) ymean = int(particle_index / self.L_total) if ymean == 0 or ymean == self.L_total - 1 or xmean == 0 or xmean == self.L_total - 1: self.frozen_dof.append(particle_index * self.box_dimension) self.frozen_dof.append(particle_index * self.box_dimension + 1) self.frozen_atoms.append(particle_index) self.eps = 1 self.x = np.zeros(self.ndof) for p in range(self.nr_particles_total): xmean = int(p % self.L_total) ymean = int(p / self.L_total) self.x[p * self.box_dimension] = xmean + 0.1 * np.random.rand() self.x[p * self.box_dimension + 1] = ymean + 0.1 * np.random.rand() self.radii = np.asarray([0.3 + 0.01 * np.random.rand() for _ in range(self.nr_particles_total)]) self.sca = 1 self.rcut = 2 * (1 + self.sca) * np.amax(self.radii) self.boxvec = (self.L_total + self.rcut) * np.ones(self.box_dimension) self.pot_cells_N_frozen_N = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=False, use_cell_lists=False) self.pot_cells_Y_frozen_N = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=False, use_cell_lists=True, reference_coords=self.x, rcut=self.rcut) self.pot_cells_N_frozen_Y = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=True, use_cell_lists=False, frozen_atoms=self.frozen_atoms, reference_coords=self.x) self.pot_cells_Y_frozen_Y = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=True, use_cell_lists=True, reference_coords=self.x, frozen_atoms=self.frozen_atoms, rcut=self.rcut) self.x_red = [] for atom in range(self.nr_particles_total): if atom not in self.frozen_atoms: self.x_red.extend(self.x[atom * self.box_dimension : (atom + 1) * self.box_dimension]) self.opt_NN = ModifiedFireCPP(self.x, self.pot_cells_N_frozen_N) self.opt_YN = ModifiedFireCPP(self.x, self.pot_cells_Y_frozen_N) self.opt_NY = ModifiedFireCPP(self.x_red, self.pot_cells_N_frozen_Y) self.opt_YY = ModifiedFireCPP(self.x_red, self.pot_cells_Y_frozen_Y)
class Config2D(object): def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x ** self.ndim self.dof = self.ndim * self.N self.amplitude = amplitude self.x = np.zeros(self.dof) for particle in xrange(self.N): pid = self.ndim * particle self.x[pid] = particle % self.LX self.x[pid + 1] = int(particle / self.LX) self.x_initial = np.asarray([xi + np.random.uniform(- self.amplitude, self.amplitude) for xi in self.x]) self.x_initial = np.reshape(self.x_initial, (self.N,2)) self.x_initial[:,0] -= np.mean(self.x_initial[:,0]) self.x_initial[:,1] -= np.mean(self.x_initial[:,1]) self.x_initial = self.x_initial.flatten() #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 self.boxvec = np.array([self.LX, self.LY]) self.potential = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.potential_ = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1 self.potential_cells = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.potential_cells_ = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert(self.boxvec[0]==self.boxvec[1]) print "x_initial energy:", self.potential.getEnergy(self.x_initial) print "x_initial cells energy:", self.potential_cells.getEnergy(self.x_initial) assert(self.potential.getEnergy(self.x_initial) == self.potential_.getEnergy(self.x_initial)) assert(self.potential_cells.getEnergy(self.x_initial) == self.potential_cells_.getEnergy(self.x_initial)) #assert abs(self.potential.getEnergy(self.x_initial) - self.potential_cells.getEnergy(self.x_initial)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial), self.potential_cells.getEnergy(self.x_initial), rtol=1e-10) print self.boxvec #plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) def optimize(self, nr_samples = 1): self.optimizer = ModifiedFireCPP(self.x_initial.copy(), self.potential, dtmax=1, maxstep=self.maxstep, tol=self.tol, nsteps=1e8, verbosity=-1, iprint=-1) self.optimizer_ = LBFGS_CPP(self.x_initial.copy(), self.potential_) self.optimizer_cells = ModifiedFireCPP(self.x_initial.copy(), self.potential_cells, dtmax=1, maxstep=self.maxstep, tol=self.tol, nsteps=1e8, verbosity=-1, iprint=-1) self.optimizer_cells_ = LBFGS_CPP(self.x_initial.copy(), self.potential_cells_) print "initial E, x:", self.potential.getEnergy(self.x_initial.copy()) print "initial E, x_:", self.potential_cells.getEnergy(self.x_initial.copy()) t0 = time.time() print "self.optimizer.run(self.nstepsmax)", self.nstepsmax self.optimizer.run(self.nstepsmax) self.res_x_final = self.optimizer.get_result() t1 = time.time() self.optimizer_cells.run(self.nstepsmax) self.res_x_final_cells = self.optimizer_cells.get_result() t2 = time.time() self.x_final = self.res_x_final.coords self.x_final_cells = self.res_x_final_cells.coords print "fire final E, x:", self.optimizer.get_result().energy print "fire final E, x_cells:", self.optimizer_cells.get_result().energy print "fire final E, plain: ", self.potential.getEnergy(self.x_final) print "fire final E, cell: ", self.potential_cells.getEnergy(self.x_final_cells) print "fire number of particles:", self.N print "fire time no cell lists:", t1 - t0, "sec" print "fire time cell lists:", t2 - t1, "sec" print "fire ratio:", (t1 - t0) / (t2 - t1) if not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final.rms:", self.res_x_final.rms print "res_x_final.nfev:", self.res_x_final.nfev print "res_x_final_cells.rms:", self.res_x_final_cells.rms print "res_x_final_cells.nfev:", self.res_x_final_cells.nfev print "self.res_x_final.success", self.res_x_final.success print "self.res_x_final_cells.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells, self.radii, self.boxvec, sca=self.sca) self.optimizer_.run(self.nstepsmax) self.res_x_final_ = self.optimizer_.get_result() t3 = time.time() self.optimizer_cells_.run(self.nstepsmax) self.res_x_final_cells_ = self.optimizer_cells_.get_result() t4 = time.time() self.x_final_ = self.res_x_final_.coords self.x_final_cells_ = self.res_x_final_cells_.coords print "lbfgs final E, x:", self.optimizer_.get_result().energy print "lbfgs final E, x_cells:", self.optimizer_cells_.get_result().energy print "lbfgs final E, plain: ", self.potential_.getEnergy(self.x_final_) print "lbfgs final E, cell: ", self.potential_cells_.getEnergy(self.x_final_cells_) print "lbfgs number of particles:", self.N print "lbfgs time no cell lists:", t3 - t2, "sec" print "lbfgs time cell lists:", t4 - t3, "sec" print "lbfgs ratio:", (t3 - t2) / (t4 - t3) if not self.res_x_final_.success or not self.res_x_final_cells_.success or not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final_.rms:", self.res_x_final_.rms print "res_x_final_.nfev:", self.res_x_final_.nfev print "res_x_final_cells_.rms:", self.res_x_final_cells_.rms print "res_x_final_cells_.nfev:", self.res_x_final_cells_.nfev print "self.res_x_final_.success", self.res_x_final.success print "self.res_x_final_cells_.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells_, self.radii, self.boxvec, sca=self.sca) assert(self.res_x_final.success) assert(self.res_x_final_cells.success) assert(self.res_x_final_.success) assert(self.res_x_final_cells_.success) for (xci, xi) in zip(self.x_final_cells, self.x_final): passed = (np.abs(xci - xi) < 1e-10) if (passed is False): print "xci", xci print "xi", xi assert(passed) print "energy no cell lists:", self.res_x_final.energy print "energy cell lists:", self.res_x_final_cells.energy self.t_ratio = (t1 - t0) / (t2 - t1) self.t_ratio_lbfgs = (t3 - t2) / (t4 - t3)
def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x ** self.ndim self.amplitude = amplitude self.dof = self.ndim * self.N self.x = np.zeros(self.dof) self.frozen_atoms = [] for particle in xrange(self.N): pid = self.ndim * particle xcoor = particle % self.LX ycoor = int(particle / self.LX) self.x[pid] = xcoor self.x[pid + 1] = ycoor if xcoor == 0 or xcoor == self.LX - 1 or ycoor == 0 or ycoor == self.LY - 1: self.frozen_atoms.append(particle) self.x_initial = copy.copy(self.x) for particle in xrange(self.N): if particle not in self.frozen_atoms: pid = self.ndim * particle self.x_initial[pid] += np.random.uniform(- self.amplitude, self.amplitude) self.x_initial[pid + 1] += np.random.uniform(- self.amplitude, self.amplitude) self.x_initial = np.reshape(self.x_initial, (self.N,2)) self.x_initial[:,0] -= np.mean(self.x_initial[:,0]) self.x_initial[:,1] -= np.mean(self.x_initial[:,1]) self.x_initial = self.x_initial.flatten() min_x = np.amin(self.x_initial) if min_x < 0: self.x_initial -= min_x #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 max_edge = np.amax([np.amax(self.x_initial), np.abs(np.amin(self.x_initial))]) + 2 * self.amplitude + (1 + self.sca) * self.radius self.boxvec = np.array([max_edge, max_edge]) self.frozen_atoms1 = np.array(self.frozen_atoms) self.frozen_atoms2 = np.array(self.frozen_atoms) print "self.frozen_atoms1", self.frozen_atoms1 self.potential = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, reference_coords=self.x_initial, frozen_atoms=self.frozen_atoms1, eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.ndim, boxvec=self.boxvec) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1.0 self.potential_cells = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii, boxvec=self.boxvec, reference_coords=self.x_initial, rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale, frozen_atoms=self.frozen_atoms2) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert(self.boxvec[0]==self.boxvec[1]) self.x_initial_red = reduce_coordinates(self.x_initial,self.frozen_atoms,self.ndim) print "x_initial energy:", self.potential.getEnergy(self.x_initial_red) print "x_initial cells energy:", self.potential_cells.getEnergy(self.x_initial_red) #assert abs(self.potential.getEnergy(self.x_initial_red) - self.potential_cells.getEnergy(self.x_initial_red)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial_red), self.potential_cells.getEnergy(self.x_initial_red), rtol=1e-10) print self.boxvec
class Config2DFrozenBoundary(object): def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x ** self.ndim self.amplitude = amplitude self.dof = self.ndim * self.N self.x = np.zeros(self.dof) self.frozen_atoms = [] for particle in xrange(self.N): pid = self.ndim * particle xcoor = particle % self.LX ycoor = int(particle / self.LX) self.x[pid] = xcoor self.x[pid + 1] = ycoor if xcoor == 0 or xcoor == self.LX - 1 or ycoor == 0 or ycoor == self.LY - 1: self.frozen_atoms.append(particle) self.x_initial = copy.copy(self.x) for particle in xrange(self.N): if particle not in self.frozen_atoms: pid = self.ndim * particle self.x_initial[pid] += np.random.uniform(- self.amplitude, self.amplitude) self.x_initial[pid + 1] += np.random.uniform(- self.amplitude, self.amplitude) self.x_initial = np.reshape(self.x_initial, (self.N,2)) self.x_initial[:,0] -= np.mean(self.x_initial[:,0]) self.x_initial[:,1] -= np.mean(self.x_initial[:,1]) self.x_initial = self.x_initial.flatten() min_x = np.amin(self.x_initial) if min_x < 0: self.x_initial -= min_x #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 max_edge = np.amax([np.amax(self.x_initial), np.abs(np.amin(self.x_initial))]) + 2 * self.amplitude + (1 + self.sca) * self.radius self.boxvec = np.array([max_edge, max_edge]) self.frozen_atoms1 = np.array(self.frozen_atoms) self.frozen_atoms2 = np.array(self.frozen_atoms) print "self.frozen_atoms1", self.frozen_atoms1 self.potential = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, reference_coords=self.x_initial, frozen_atoms=self.frozen_atoms1, eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.ndim, boxvec=self.boxvec) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1.0 self.potential_cells = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii, boxvec=self.boxvec, reference_coords=self.x_initial, rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale, frozen_atoms=self.frozen_atoms2) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert(self.boxvec[0]==self.boxvec[1]) self.x_initial_red = reduce_coordinates(self.x_initial,self.frozen_atoms,self.ndim) print "x_initial energy:", self.potential.getEnergy(self.x_initial_red) print "x_initial cells energy:", self.potential_cells.getEnergy(self.x_initial_red) #assert abs(self.potential.getEnergy(self.x_initial_red) - self.potential_cells.getEnergy(self.x_initial_red)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial_red), self.potential_cells.getEnergy(self.x_initial_red), rtol=1e-10) print self.boxvec def optimize(self, nr_samples=1): self.x_initial_red = reduce_coordinates(self.x_initial,self.frozen_atoms,self.ndim) self.optimizer = ModifiedFireCPP(self.x_initial_red.copy(), self.potential, tol = self.tol, maxstep = self.maxstep) self.optimizer_ = LBFGS_CPP(self.x_initial_red.copy(), self.potential) self.optimizer_cells = ModifiedFireCPP(self.x_initial_red.copy(), self.potential_cells, tol = self.tol, maxstep = self.maxstep) self.optimizer_cells_ = LBFGS_CPP(self.x_initial_red.copy(), self.potential_cells) t0 = time.time() print "self.optimizer.run(self.nstepsmax)", self.nstepsmax self.optimizer.run(self.nstepsmax) self.res_x_final = self.optimizer.get_result() t1 = time.time() self.optimizer_cells.run(self.nstepsmax) self.res_x_final_cells = self.optimizer_cells.get_result() t2 = time.time() self.x_final = self.res_x_final.coords self.x_final_cells = self.res_x_final_cells.coords print "fire final E, x:", self.optimizer.get_result().energy print "fire final E, x_cells:", self.optimizer_cells.get_result().energy print "fire final E, plain: ", self.potential.getEnergy(self.x_final) print "fire final E, cell: ", self.potential_cells.getEnergy(self.x_final_cells) print "fire number of particles:", self.N print "fire time no cell lists:", t1 - t0, "sec" print "fire time cell lists:", t2 - t1, "sec" print "fire ratio:", (t1 - t0) / (t2 - t1) if not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final.rms:", self.res_x_final.rms print "res_x_final.nfev:", self.res_x_final.nfev print "res_x_final_cells.rms:", self.res_x_final_cells.rms print "res_x_final_cells.nfev:", self.res_x_final_cells.nfev print "self.res_x_final.success", self.res_x_final.success print "self.res_x_final_cells.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells, self.radii, self.boxvec, sca=self.sca) self.optimizer_.run(self.nstepsmax) self.res_x_final_ = self.optimizer_.get_result() t3 = time.time() self.optimizer_cells_.run(self.nstepsmax) self.res_x_final_cells_ = self.optimizer_cells_.get_result() t4 = time.time() self.x_final_ = self.res_x_final_.coords self.x_final_cells_ = self.res_x_final_cells_.coords print "lbfgs final E, x:", self.optimizer_.get_result().energy print "lbfgs final E, x_cells:", self.optimizer_cells_.get_result().energy print "lbfgs final E, plain: ", self.potential.getEnergy(self.x_final_) print "lbfgs final E, cell: ", self.potential_cells.getEnergy(self.x_final_cells_) print "lbfgs number of particles:", self.N print "lbfgs time no cell lists:", t3 - t2, "sec" print "lbfgs time cell lists:", t4 - t3, "sec" print "lbfgs ratio:", (t3 - t2) / (t4 - t3) if not self.res_x_final_.success or not self.res_x_final_cells_.success or not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final_.rms:", self.res_x_final_.rms print "res_x_final_.nfev:", self.res_x_final_.nfev print "res_x_final_cells_.rms:", self.res_x_final_cells_.rms print "res_x_final_cells_.nfev:", self.res_x_final_cells_.nfev print "self.res_x_final_.success", self.res_x_final.success print "self.res_x_final_cells_.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells_, self.radii, self.boxvec, sca=self.sca) assert(self.res_x_final.success) assert(self.res_x_final_cells.success) assert(self.res_x_final_.success) assert(self.res_x_final_cells_.success) for (xci, xi) in zip(self.x_final_cells, self.x_final): passed = (np.abs(xci - xi) < 1e-10) if (passed is False): print "xci", xci print "xi", xi assert(passed) print "energy no cell lists:", self.res_x_final.energy print "energy cell lists:", self.res_x_final_cells.energy self.t_ratio = (t1 - t0) / (t2 - t1) self.t_ratio_lbfgs = (t3 - t2) / (t4 - t3)
class Test2dMinimization(unittest.TestCase): def setUp(self): np.random.seed(42) self.L_mobile = 4 self.L_total = self.L_mobile + 2 self.nr_particles_mobile = self.L_mobile * self.L_mobile self.nr_particles_total = self.L_total * self.L_total self.nr_particles_frozen = self.nr_particles_total - self.nr_particles_mobile self.box_dimension = 2 self.ndof = self.nr_particles_total * self.box_dimension self.n_frozen_dof = self.nr_particles_frozen * self.box_dimension self.frozen_dof = [] self.frozen_atoms = [] for particle_index in xrange(self.nr_particles_total): xmean = int(particle_index % self.L_total) ymean = int(particle_index / self.L_total) if ymean == 0 or ymean == self.L_total - 1 or xmean == 0 or xmean == self.L_total - 1: self.frozen_dof.append(particle_index * self.box_dimension) self.frozen_dof.append(particle_index * self.box_dimension + 1) self.frozen_atoms.append(particle_index) self.eps = 1 self.x = np.zeros(self.ndof) for p in xrange(self.nr_particles_total): xmean = int(p % self.L_total) ymean = int(p / self.L_total) self.x[p * self.box_dimension] = xmean + 0.1 * np.random.rand() self.x[p * self.box_dimension + 1] = ymean + 0.1 * np.random.rand() self.radii = np.asarray([ 0.3 + 0.01 * np.random.rand() for _ in xrange(self.nr_particles_total) ]) self.sca = 1 self.rcut = 2 * (1 + self.sca) * np.amax(self.radii) self.boxvec = (self.L_total + self.rcut) * np.ones(self.box_dimension) self.pot_cells_N_frozen_N = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=False, use_cell_lists=False) self.pot_cells_Y_frozen_N = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=False, use_cell_lists=True, reference_coords=self.x, rcut=self.rcut) self.pot_cells_N_frozen_Y = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=True, use_cell_lists=False, frozen_atoms=self.frozen_atoms, reference_coords=self.x) self.pot_cells_Y_frozen_Y = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=True, use_cell_lists=True, reference_coords=self.x, frozen_atoms=self.frozen_atoms, rcut=self.rcut) self.x_red = [] for atom in xrange(self.nr_particles_total): if atom not in self.frozen_atoms: self.x_red.extend(self.x[atom * self.box_dimension:(atom + 1) * self.box_dimension]) self.opt_NN = ModifiedFireCPP(self.x, self.pot_cells_N_frozen_N) self.opt_YN = ModifiedFireCPP(self.x, self.pot_cells_Y_frozen_N) self.opt_NY = ModifiedFireCPP(self.x_red, self.pot_cells_N_frozen_Y) self.opt_YY = ModifiedFireCPP(self.x_red, self.pot_cells_Y_frozen_Y) def test_energies(self): self.res_e_before_cells_N_frozen_N = self.opt_NN.get_result() self.res_e_before_cells_Y_frozen_N = self.opt_YN.get_result() self.res_e_before_cells_N_frozen_Y = self.opt_NY.get_result() self.res_e_before_cells_Y_frozen_Y = self.opt_YY.get_result() self.assertAlmostEqual(self.res_e_before_cells_N_frozen_N.energy, self.res_e_before_cells_N_frozen_Y.energy, delta=1e-10) self.assertAlmostEqual(self.res_e_before_cells_Y_frozen_N.energy, self.res_e_before_cells_N_frozen_N.energy, delta=1e-10) self.assertAlmostEqual(self.res_e_before_cells_N_frozen_N.energy, self.res_e_before_cells_Y_frozen_Y.energy, delta=1e-10) self.assertAlmostEqual(self.pot_cells_N_frozen_N.getEnergy(self.x), self.pot_cells_Y_frozen_N.getEnergy(self.x), delta=1e-10) def test_minimization(self): self.opt_NN.run() self.opt_YN.run() self.opt_NY.run() self.opt_YY.run() self.res_NN = self.opt_NN.get_result() self.res_YN = self.opt_YN.get_result() self.res_NY = self.opt_NY.get_result() self.res_YY = self.opt_YY.get_result() self.assertTrue(self.res_NN.success) self.assertTrue(self.res_YN.success) self.assertTrue(self.res_NY.success) self.assertTrue(self.res_YY.success) self.assertAlmostEqual(self.res_NY.energy, self.res_YY.energy, delta=1e-10) self.assertAlmostEqual( self.pot_cells_N_frozen_N.getEnergy(self.res_NN.coords), self.pot_cells_Y_frozen_N.getEnergy(self.res_YN.coords), delta=1e-10)
class Config2D(object): def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x**self.ndim self.dof = self.ndim * self.N self.amplitude = amplitude self.x = np.zeros(self.dof) for particle in xrange(self.N): pid = self.ndim * particle self.x[pid] = particle % self.LX self.x[pid + 1] = int(particle / self.LX) self.x_initial = np.asarray([ xi + np.random.uniform(-self.amplitude, self.amplitude) for xi in self.x ]) self.x_initial = np.reshape(self.x_initial, (self.N, 2)) self.x_initial[:, 0] -= np.mean(self.x_initial[:, 0]) self.x_initial[:, 1] -= np.mean(self.x_initial[:, 1]) self.x_initial = self.x_initial.flatten() #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 self.boxvec = np.array([self.LX, self.LY]) self.potential = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.potential_ = HS_WCA(use_periodic=use_periodic, eps=self.eps, sca=self.sca, radii=self.radii.copy(), ndim=self.ndim, boxvec=self.boxvec.copy()) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1 self.potential_cells = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.potential_cells_ = HS_WCA(use_periodic=use_periodic, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii.copy(), boxvec=self.boxvec.copy(), rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert (self.boxvec[0] == self.boxvec[1]) print "x_initial energy:", self.potential.getEnergy(self.x_initial) print "x_initial cells energy:", self.potential_cells.getEnergy( self.x_initial) assert (self.potential.getEnergy( self.x_initial) == self.potential_.getEnergy(self.x_initial)) assert (self.potential_cells.getEnergy( self.x_initial) == self.potential_cells_.getEnergy(self.x_initial)) #assert abs(self.potential.getEnergy(self.x_initial) - self.potential_cells.getEnergy(self.x_initial)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial), self.potential_cells.getEnergy(self.x_initial), rtol=1e-10) print self.boxvec #plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) def optimize(self, nr_samples=1): self.optimizer = ModifiedFireCPP(self.x_initial.copy(), self.potential, dtmax=1, maxstep=self.maxstep, tol=self.tol, nsteps=1e8, verbosity=-1, iprint=-1) self.optimizer_ = LBFGS_CPP(self.x_initial.copy(), self.potential_) self.optimizer_cells = ModifiedFireCPP(self.x_initial.copy(), self.potential_cells, dtmax=1, maxstep=self.maxstep, tol=self.tol, nsteps=1e8, verbosity=-1, iprint=-1) self.optimizer_cells_ = LBFGS_CPP(self.x_initial.copy(), self.potential_cells_) print "initial E, x:", self.potential.getEnergy(self.x_initial.copy()) print "initial E, x_:", self.potential_cells.getEnergy( self.x_initial.copy()) t0 = time.time() print "self.optimizer.run(self.nstepsmax)", self.nstepsmax self.optimizer.run(self.nstepsmax) self.res_x_final = self.optimizer.get_result() t1 = time.time() self.optimizer_cells.run(self.nstepsmax) self.res_x_final_cells = self.optimizer_cells.get_result() t2 = time.time() self.x_final = self.res_x_final.coords self.x_final_cells = self.res_x_final_cells.coords print "fire final E, x:", self.optimizer.get_result().energy print "fire final E, x_cells:", self.optimizer_cells.get_result( ).energy print "fire final E, plain: ", self.potential.getEnergy(self.x_final) print "fire final E, cell: ", self.potential_cells.getEnergy( self.x_final_cells) print "fire number of particles:", self.N print "fire time no cell lists:", t1 - t0, "sec" print "fire time cell lists:", t2 - t1, "sec" print "fire ratio:", (t1 - t0) / (t2 - t1) if not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final.rms:", self.res_x_final.rms print "res_x_final.nfev:", self.res_x_final.nfev print "res_x_final_cells.rms:", self.res_x_final_cells.rms print "res_x_final_cells.nfev:", self.res_x_final_cells.nfev print "self.res_x_final.success", self.res_x_final.success print "self.res_x_final_cells.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells, self.radii, self.boxvec, sca=self.sca) self.optimizer_.run(self.nstepsmax) self.res_x_final_ = self.optimizer_.get_result() t3 = time.time() self.optimizer_cells_.run(self.nstepsmax) self.res_x_final_cells_ = self.optimizer_cells_.get_result() t4 = time.time() self.x_final_ = self.res_x_final_.coords self.x_final_cells_ = self.res_x_final_cells_.coords print "lbfgs final E, x:", self.optimizer_.get_result().energy print "lbfgs final E, x_cells:", self.optimizer_cells_.get_result( ).energy print "lbfgs final E, plain: ", self.potential_.getEnergy( self.x_final_) print "lbfgs final E, cell: ", self.potential_cells_.getEnergy( self.x_final_cells_) print "lbfgs number of particles:", self.N print "lbfgs time no cell lists:", t3 - t2, "sec" print "lbfgs time cell lists:", t4 - t3, "sec" print "lbfgs ratio:", (t3 - t2) / (t4 - t3) if not self.res_x_final_.success or not self.res_x_final_cells_.success or not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final_.rms:", self.res_x_final_.rms print "res_x_final_.nfev:", self.res_x_final_.nfev print "res_x_final_cells_.rms:", self.res_x_final_cells_.rms print "res_x_final_cells_.nfev:", self.res_x_final_cells_.nfev print "self.res_x_final_.success", self.res_x_final.success print "self.res_x_final_cells_.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells_, self.radii, self.boxvec, sca=self.sca) assert (self.res_x_final.success) assert (self.res_x_final_cells.success) assert (self.res_x_final_.success) assert (self.res_x_final_cells_.success) for (xci, xi) in zip(self.x_final_cells, self.x_final): passed = (np.abs(xci - xi) < 1e-10) if (passed is False): print "xci", xci print "xi", xi assert (passed) print "energy no cell lists:", self.res_x_final.energy print "energy cell lists:", self.res_x_final_cells.energy self.t_ratio = (t1 - t0) / (t2 - t1) self.t_ratio_lbfgs = (t3 - t2) / (t4 - t3)
def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x**self.ndim self.amplitude = amplitude self.dof = self.ndim * self.N self.x = np.zeros(self.dof) self.frozen_atoms = [] for particle in xrange(self.N): pid = self.ndim * particle xcoor = particle % self.LX ycoor = int(particle / self.LX) self.x[pid] = xcoor self.x[pid + 1] = ycoor if xcoor == 0 or xcoor == self.LX - 1 or ycoor == 0 or ycoor == self.LY - 1: self.frozen_atoms.append(particle) self.x_initial = copy.copy(self.x) for particle in xrange(self.N): if particle not in self.frozen_atoms: pid = self.ndim * particle self.x_initial[pid] += np.random.uniform( -self.amplitude, self.amplitude) self.x_initial[pid + 1] += np.random.uniform( -self.amplitude, self.amplitude) self.x_initial = np.reshape(self.x_initial, (self.N, 2)) self.x_initial[:, 0] -= np.mean(self.x_initial[:, 0]) self.x_initial[:, 1] -= np.mean(self.x_initial[:, 1]) self.x_initial = self.x_initial.flatten() min_x = np.amin(self.x_initial) if min_x < 0: self.x_initial -= min_x #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 max_edge = np.amax([ np.amax(self.x_initial), np.abs(np.amin(self.x_initial)) ]) + 2 * self.amplitude + (1 + self.sca) * self.radius self.boxvec = np.array([max_edge, max_edge]) self.frozen_atoms1 = np.array(self.frozen_atoms) self.frozen_atoms2 = np.array(self.frozen_atoms) print "self.frozen_atoms1", self.frozen_atoms1 self.potential = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, reference_coords=self.x_initial, frozen_atoms=self.frozen_atoms1, eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.ndim, boxvec=self.boxvec) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1.0 self.potential_cells = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii, boxvec=self.boxvec, reference_coords=self.x_initial, rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale, frozen_atoms=self.frozen_atoms2) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert (self.boxvec[0] == self.boxvec[1]) self.x_initial_red = reduce_coordinates(self.x_initial, self.frozen_atoms, self.ndim) print "x_initial energy:", self.potential.getEnergy(self.x_initial_red) print "x_initial cells energy:", self.potential_cells.getEnergy( self.x_initial_red) #assert abs(self.potential.getEnergy(self.x_initial_red) - self.potential_cells.getEnergy(self.x_initial_red)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial_red), self.potential_cells.getEnergy(self.x_initial_red), rtol=1e-10) print self.boxvec
class Config2DFrozenBoundary(object): def __init__(self, nparticles_x, amplitude): self.ndim = 2 self.LX = nparticles_x self.LY = self.LX self.nparticles_x = nparticles_x self.N = self.nparticles_x**self.ndim self.amplitude = amplitude self.dof = self.ndim * self.N self.x = np.zeros(self.dof) self.frozen_atoms = [] for particle in xrange(self.N): pid = self.ndim * particle xcoor = particle % self.LX ycoor = int(particle / self.LX) self.x[pid] = xcoor self.x[pid + 1] = ycoor if xcoor == 0 or xcoor == self.LX - 1 or ycoor == 0 or ycoor == self.LY - 1: self.frozen_atoms.append(particle) self.x_initial = copy.copy(self.x) for particle in xrange(self.N): if particle not in self.frozen_atoms: pid = self.ndim * particle self.x_initial[pid] += np.random.uniform( -self.amplitude, self.amplitude) self.x_initial[pid + 1] += np.random.uniform( -self.amplitude, self.amplitude) self.x_initial = np.reshape(self.x_initial, (self.N, 2)) self.x_initial[:, 0] -= np.mean(self.x_initial[:, 0]) self.x_initial[:, 1] -= np.mean(self.x_initial[:, 1]) self.x_initial = self.x_initial.flatten() min_x = np.amin(self.x_initial) if min_x < 0: self.x_initial -= min_x #self.radius = 0.3 #self.sca = 1.5 self.radius = 0.25 self.sca = 1.8 self.radii = np.ones(self.N) * self.radius self.eps = 1.0 max_edge = np.amax([ np.amax(self.x_initial), np.abs(np.amin(self.x_initial)) ]) + 2 * self.amplitude + (1 + self.sca) * self.radius self.boxvec = np.array([max_edge, max_edge]) self.frozen_atoms1 = np.array(self.frozen_atoms) self.frozen_atoms2 = np.array(self.frozen_atoms) print "self.frozen_atoms1", self.frozen_atoms1 self.potential = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, reference_coords=self.x_initial, frozen_atoms=self.frozen_atoms1, eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.ndim, boxvec=self.boxvec) self.rcut = 2 * (1 + self.sca) * self.radius self.ncellx_scale = 1.0 self.potential_cells = HS_WCA(use_frozen=True, use_periodic=use_periodic_frozen, use_cell_lists=True, eps=self.eps, sca=self.sca, radii=self.radii, boxvec=self.boxvec, reference_coords=self.x_initial, rcut=self.rcut, ndim=self.ndim, ncellx_scale=self.ncellx_scale, frozen_atoms=self.frozen_atoms2) self.tol = 1e-7 self.maxstep = np.amax(self.radii) self.nstepsmax = int(1e6) assert (self.boxvec[0] == self.boxvec[1]) self.x_initial_red = reduce_coordinates(self.x_initial, self.frozen_atoms, self.ndim) print "x_initial energy:", self.potential.getEnergy(self.x_initial_red) print "x_initial cells energy:", self.potential_cells.getEnergy( self.x_initial_red) #assert abs(self.potential.getEnergy(self.x_initial_red) - self.potential_cells.getEnergy(self.x_initial_red)) < 1e-10 assert np.allclose(self.potential.getEnergy(self.x_initial_red), self.potential_cells.getEnergy(self.x_initial_red), rtol=1e-10) print self.boxvec def optimize(self, nr_samples=1): self.x_initial_red = reduce_coordinates(self.x_initial, self.frozen_atoms, self.ndim) self.optimizer = ModifiedFireCPP(self.x_initial_red.copy(), self.potential, tol=self.tol, maxstep=self.maxstep) self.optimizer_ = LBFGS_CPP(self.x_initial_red.copy(), self.potential) self.optimizer_cells = ModifiedFireCPP(self.x_initial_red.copy(), self.potential_cells, tol=self.tol, maxstep=self.maxstep) self.optimizer_cells_ = LBFGS_CPP(self.x_initial_red.copy(), self.potential_cells) t0 = time.time() print "self.optimizer.run(self.nstepsmax)", self.nstepsmax self.optimizer.run(self.nstepsmax) self.res_x_final = self.optimizer.get_result() t1 = time.time() self.optimizer_cells.run(self.nstepsmax) self.res_x_final_cells = self.optimizer_cells.get_result() t2 = time.time() self.x_final = self.res_x_final.coords self.x_final_cells = self.res_x_final_cells.coords print "fire final E, x:", self.optimizer.get_result().energy print "fire final E, x_cells:", self.optimizer_cells.get_result( ).energy print "fire final E, plain: ", self.potential.getEnergy(self.x_final) print "fire final E, cell: ", self.potential_cells.getEnergy( self.x_final_cells) print "fire number of particles:", self.N print "fire time no cell lists:", t1 - t0, "sec" print "fire time cell lists:", t2 - t1, "sec" print "fire ratio:", (t1 - t0) / (t2 - t1) if not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final.rms:", self.res_x_final.rms print "res_x_final.nfev:", self.res_x_final.nfev print "res_x_final_cells.rms:", self.res_x_final_cells.rms print "res_x_final_cells.nfev:", self.res_x_final_cells.nfev print "self.res_x_final.success", self.res_x_final.success print "self.res_x_final_cells.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells, self.radii, self.boxvec, sca=self.sca) self.optimizer_.run(self.nstepsmax) self.res_x_final_ = self.optimizer_.get_result() t3 = time.time() self.optimizer_cells_.run(self.nstepsmax) self.res_x_final_cells_ = self.optimizer_cells_.get_result() t4 = time.time() self.x_final_ = self.res_x_final_.coords self.x_final_cells_ = self.res_x_final_cells_.coords print "lbfgs final E, x:", self.optimizer_.get_result().energy print "lbfgs final E, x_cells:", self.optimizer_cells_.get_result( ).energy print "lbfgs final E, plain: ", self.potential.getEnergy(self.x_final_) print "lbfgs final E, cell: ", self.potential_cells.getEnergy( self.x_final_cells_) print "lbfgs number of particles:", self.N print "lbfgs time no cell lists:", t3 - t2, "sec" print "lbfgs time cell lists:", t4 - t3, "sec" print "lbfgs ratio:", (t3 - t2) / (t4 - t3) if not self.res_x_final_.success or not self.res_x_final_cells_.success or not self.res_x_final.success or not self.res_x_final_cells.success: print "-------------" print "res_x_final_.rms:", self.res_x_final_.rms print "res_x_final_.nfev:", self.res_x_final_.nfev print "res_x_final_cells_.rms:", self.res_x_final_cells_.rms print "res_x_final_cells_.nfev:", self.res_x_final_cells_.nfev print "self.res_x_final_.success", self.res_x_final.success print "self.res_x_final_cells_.success", self.res_x_final_cells.success print "-------------" plot_disks(self.x_initial, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_, self.radii, self.boxvec, sca=self.sca) plot_disks(self.x_final_cells_, self.radii, self.boxvec, sca=self.sca) assert (self.res_x_final.success) assert (self.res_x_final_cells.success) assert (self.res_x_final_.success) assert (self.res_x_final_cells_.success) for (xci, xi) in zip(self.x_final_cells, self.x_final): passed = (np.abs(xci - xi) < 1e-10) if (passed is False): print "xci", xci print "xi", xi assert (passed) print "energy no cell lists:", self.res_x_final.energy print "energy cell lists:", self.res_x_final_cells.energy self.t_ratio = (t1 - t0) / (t2 - t1) self.t_ratio_lbfgs = (t3 - t2) / (t4 - t3)
class Test2dMinimization(unittest.TestCase): def setUp(self): np.random.seed(42) self.L_mobile = 4 self.L_total = self.L_mobile + 2 self.nr_particles_mobile = self.L_mobile * self.L_mobile self.nr_particles_total = self.L_total * self.L_total self.nr_particles_frozen = self.nr_particles_total - self.nr_particles_mobile self.box_dimension = 2 self.ndof = self.nr_particles_total * self.box_dimension self.n_frozen_dof = self.nr_particles_frozen * self.box_dimension self.frozen_dof = [] self.frozen_atoms = [] for particle_index in range(self.nr_particles_total): xmean = int(particle_index % self.L_total) ymean = int(particle_index / self.L_total) if ymean == 0 or ymean == self.L_total - 1 or xmean == 0 or xmean == self.L_total - 1: self.frozen_dof.append(particle_index * self.box_dimension) self.frozen_dof.append(particle_index * self.box_dimension + 1) self.frozen_atoms.append(particle_index) self.eps = 1 self.x = np.zeros(self.ndof) for p in range(self.nr_particles_total): xmean = int(p % self.L_total) ymean = int(p / self.L_total) self.x[p * self.box_dimension] = xmean + 0.1 * np.random.rand() self.x[p * self.box_dimension + 1] = ymean + 0.1 * np.random.rand() self.radii = np.asarray([0.3 + 0.01 * np.random.rand() for _ in range(self.nr_particles_total)]) self.sca = 1 self.rcut = 2 * (1 + self.sca) * np.amax(self.radii) self.boxvec = (self.L_total + self.rcut) * np.ones(self.box_dimension) self.pot_cells_N_frozen_N = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=False, use_cell_lists=False) self.pot_cells_Y_frozen_N = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=False, use_cell_lists=True, reference_coords=self.x, rcut=self.rcut) self.pot_cells_N_frozen_Y = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=True, use_cell_lists=False, frozen_atoms=self.frozen_atoms, reference_coords=self.x) self.pot_cells_Y_frozen_Y = HS_WCA(eps=self.eps, sca=self.sca, radii=self.radii, ndim=self.box_dimension, boxvec=self.boxvec, use_periodic=True, use_frozen=True, use_cell_lists=True, reference_coords=self.x, frozen_atoms=self.frozen_atoms, rcut=self.rcut) self.x_red = [] for atom in range(self.nr_particles_total): if atom not in self.frozen_atoms: self.x_red.extend(self.x[atom * self.box_dimension : (atom + 1) * self.box_dimension]) self.opt_NN = ModifiedFireCPP(self.x, self.pot_cells_N_frozen_N) self.opt_YN = ModifiedFireCPP(self.x, self.pot_cells_Y_frozen_N) self.opt_NY = ModifiedFireCPP(self.x_red, self.pot_cells_N_frozen_Y) self.opt_YY = ModifiedFireCPP(self.x_red, self.pot_cells_Y_frozen_Y) def test_energies(self): self.res_e_before_cells_N_frozen_N = self.opt_NN.get_result() self.res_e_before_cells_Y_frozen_N = self.opt_YN.get_result() self.res_e_before_cells_N_frozen_Y = self.opt_NY.get_result() self.res_e_before_cells_Y_frozen_Y = self.opt_YY.get_result() self.assertAlmostEqual(self.res_e_before_cells_N_frozen_N.energy, self.res_e_before_cells_N_frozen_Y.energy, places=8) self.assertAlmostEqual(self.res_e_before_cells_Y_frozen_N.energy, self.res_e_before_cells_N_frozen_N.energy, places=8) self.assertAlmostEqual(self.res_e_before_cells_N_frozen_N.energy, self.res_e_before_cells_Y_frozen_Y.energy, places=8) self.assertAlmostEqual(self.pot_cells_N_frozen_N.getEnergy(self.x), self.pot_cells_Y_frozen_N.getEnergy(self.x), places=8) def test_minimization(self): self.opt_NN.run() self.opt_YN.run() self.opt_NY.run() self.opt_YY.run() self.res_NN = self.opt_NN.get_result() self.res_YN = self.opt_YN.get_result() self.res_NY = self.opt_NY.get_result() self.res_YY = self.opt_YY.get_result() self.assertTrue(self.res_NN.success) self.assertTrue(self.res_YN.success) self.assertTrue(self.res_NY.success) self.assertTrue(self.res_YY.success) self.assertAlmostEqual(self.res_NY.energy, self.res_YY.energy, delta=1e-10) self.assertAlmostEqual(self.pot_cells_N_frozen_N.getEnergy(self.res_NN.coords), self.pot_cells_Y_frozen_N.getEnergy(self.res_YN.coords), delta=1e-10)
def __init__(self, boxdim=2, nr_particles=100, hard_phi=0.4, nr_steps=1e6, epsilon=1, alpha=0.1, verbose=False): # Settings. np.random.seed(42) # Input parameters. self.boxdim = boxdim self.nr_particles = nr_particles self.hard_phi = hard_phi self.nr_steps = nr_steps self.epsilon = epsilon self.alpha = alpha self.verbose = verbose # Derived quantities. self.hard_radii = np.ones(self.nr_particles) def volume_nball(radius, n): return np.power(np.pi, n / 2) * np.power(radius, n) / gamma(n / 2 + 1) self.box_length = np.power( np.sum( np.asarray( [volume_nball(r, self.boxdim) for r in self.hard_radii])) / self.hard_phi, 1 / self.boxdim) self.box_vector = np.ones(self.boxdim) * self.box_length # HS-WCA potential. self.potential = HS_WCA(use_periodic=True, use_cell_lists=True, ndim=self.boxdim, eps=self.epsilon, sca=self.alpha, radii=self.hard_radii, boxvec=self.box_vector) # Initial configuration by minimization. self.nr_dof = self.boxdim * self.nr_particles self.x = np.random.uniform(-0.5 * self.box_length, 0.5 * self.box_length, self.nr_dof) optimizer = LBFGS_CPP(self.x, self.potential) optimizer.run() if not optimizer.get_result().success: print("warning: minimization has not converged") self.x = optimizer.get_result().coords.copy() # Potential and MC rules. self.temperature = 1 self.mc = MC(self.potential, self.x, self.temperature, self.nr_steps) self.step = RandomCoordsDisplacement(42, 1, single=True, nparticles=self.nr_particles, bdim=self.boxdim) if self.verbose: print("initial MC stepsize") print self.step.get_stepsize() self.mc.set_takestep(self.step) self.eq_steps = self.nr_steps / 2 self.mc.set_report_steps(self.eq_steps) self.gr_quench = RecordPairDistHistogram(self.box_vector, 50, self.eq_steps, self.nr_particles, optimizer=optimizer) self.gr = RecordPairDistHistogram(self.box_vector, 50, self.eq_steps, self.nr_particles) self.mc.add_action(self.gr_quench) self.mc.add_action(self.gr) self.test = MetropolisTest(44) self.mc.add_accept_test(self.test)