コード例 #1
0
    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
コード例 #2
0
    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)
コード例 #3
0
    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