def relaxML(self, anew, Fmax=0.1, with_error=True): a = anew.copy() # Relax label = self.traj_namebase + 'ML{}'.format(self.traj_counter) if with_error: krr_calc = krr_calculator(self.MLmodel, kappa=self.kappa) else: krr_calc = krr_calculator(self.MLmodel) a_relaxed = relax_VarianceBreak(a, krr_calc, label, niter_max=1, forcemax=Fmax) return a_relaxed
def update_MLrelaxed_pop(self): # Initialize MLrelaxed population self.population.pop_MLrelaxed = [] for a in self.population.pop: self.population.pop_MLrelaxed.append(a.copy()) E_relaxed_pop = np.zeros(len(self.population.pop)) error_relaxed_pop = np.zeros(len(self.population.pop)) dmin_relaxed_pop = np.zeros(len(self.population.pop)) if self.comm.rank < len(self.population.pop): index = self.comm.rank a_MLrelaxed = self.relaxML(self.population.pop[index], Fmax=0.005) self.population.pop_MLrelaxed[index] = a_MLrelaxed E_temp, error_temp, _ = self.MLmodel.predict_energy( a_MLrelaxed, return_error=True) E_relaxed_pop[index] = E_temp error_relaxed_pop[index] = error_temp dmin_temp = self.get_minDistance2data(a_MLrelaxed) dmin_relaxed_pop[index] = dmin_temp # test a_test = a_MLrelaxed.copy() krr_calc = krr_calculator(self.MLmodel) a_test.set_calculator(krr_calc) Ftest = a_test.get_forces(a_MLrelaxed).reshape((-1, 3)) Ftest_max = (Ftest**2).sum(axis=1).max()**0.5 print('Fmax_relaxedPop[{}]'.format(self.comm.rank), Ftest_max, flush=True) for i in range(len(self.population.pop)): pos = self.population.pop_MLrelaxed[i].positions self.comm.broadcast(pos, i) self.population.pop_MLrelaxed[i].set_positions(pos) E = np.array([E_relaxed_pop[i]]) error = np.array([error_relaxed_pop[i]]) dmin = np.array([dmin_relaxed_pop[i]]) self.comm.broadcast(E, i) self.comm.broadcast(error, i) self.comm.broadcast(dmin, i) self.population.pop_MLrelaxed[i].info['key_value_pairs'][ 'predictedEnergy'] = E[0] self.population.pop_MLrelaxed[i].info['key_value_pairs'][ 'predictedError'] = error[0] self.population.pop_MLrelaxed[i].info['key_value_pairs'][ 'fitness'] = E[0] - self.kappa * error[0] self.population.pop_MLrelaxed[i].info['key_value_pairs'][ 'dmin'] = dmin[0] label_MLrelaxed_pop = self.pop_dir + 'ML_relaxed_pop{}'.format( self.traj_counter) write(label_MLrelaxed_pop + '.traj', self.population.pop_MLrelaxed) label_pop = self.pop_dir + 'pop{}'.format(self.traj_counter) write(label_pop + '.traj', self.population.pop) self.comm.barrier() if self.master: print('Relaxing population done', flush=True)
def relaxML(self, anew, Fmax=0.1): a = anew.copy() # Relax label = self.traj_namebase + 'ML{}'.format(self.traj_counter) krr_calc = krr_calculator(self.MLmodel) a_relaxed = relax_VarianceBreak(a, krr_calc, label, niter_max=1, forcemax=Fmax) #self.traj_counter += 1 return a_relaxed