Source code for ipsuite.configuration_selection.uniform_energetic

"""Module for selecting atoms uniformly in energy space."""

import logging
import typing

import ase
import numpy as np
import zntrack

from ipsuite.configuration_selection import ConfigurationSelection

log = logging.getLogger(__name__)


[docs] class UniformEnergeticSelection(ConfigurationSelection): """A class to perform data selection based on uniform global energy selection.""" n_configurations: int = zntrack.params()
[docs] def select_atoms(self, atoms_lst: typing.List[ase.Atoms]) -> typing.List[int]: """Select Atoms uniform in energy space.""" log.warning(f"Running search for {self.n_configurations} to max {len(atoms_lst)}") data = np.array([x.get_potential_energy() for x in atoms_lst]) sorted_data = data[np.argsort(data)] indices = [] for anchor_size in range(self.n_configurations, len(sorted_data)): temporary_anchor = np.linspace( start=sorted_data[0], stop=sorted_data[-1], num=anchor_size, ) if anchor_size > self.n_configurations and anchor_size % 100 == 0: log.debug("Extending Search range!") indices = np.searchsorted(sorted_data, temporary_anchor, side="left") indices = np.unique(indices) if len(indices) >= self.n_configurations: break return np.arange(len(data))[np.argsort(data)][indices].tolist()