diff --git a/.gitignore b/.gitignore index 5bb7f95f..31ced741 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ dptb/tests/**/*.pth dptb/tests/**/*.npy dptb/tests/**/*.traj dptb/tests/**/out*/* +dptb/tests/**/out*/* +dptb/tests/**/*lmdb +dptb/tests/**/*h5 examples/_* *.dat *log* diff --git a/dptb/__main__.py b/dptb/__main__.py index c3b188d8..2cc41d23 100644 --- a/dptb/__main__.py +++ b/dptb/__main__.py @@ -1,5 +1,39 @@ -from dptb.entrypoints.main import main +from dptb.entrypoints.main import main as entry_main +import logging +import pyfiglet +from dptb import __version__ +logging.basicConfig(level=logging.INFO, format='%(message)s') +log = logging.getLogger(__name__) + +def print_logo(): + f = pyfiglet.Figlet(font='dos_rebel') # 您可以选择您喜欢的字体 + logo = f.renderText("DeePTB") + log.info(" ") + log.info(" ") + log.info("#"*81) + log.info("#" + " "*79 + "#") + log.info("#" + " "*79 + "#") + for line in logo.split('\n'): + if line.strip(): # 避免记录空行 + log.info('# '+line+ ' #') + log.info("#" + " "*79 + "#") + version_info = f"Version: {__version__}" + padding = (79 - len(version_info)) // 2 + nspace = 79-padding + format_str = "#" + "{}"+"{:<"+f"{nspace}" + "}"+ "#" + log.info(format_str.format(" "*padding, version_info)) + log.info("#" + " "*79 + "#") + log.info("#"*81) + log.info(" ") + log.info(" ") +def main() -> None: + """ + The main entry point for the dptb package. + """ + print_logo() + entry_main() if __name__ == '__main__': - main() \ No newline at end of file + #print_logo() + main() diff --git a/dptb/data/AtomicData.py b/dptb/data/AtomicData.py index cf7447b1..0017070b 100644 --- a/dptb/data/AtomicData.py +++ b/dptb/data/AtomicData.py @@ -496,7 +496,7 @@ def from_points( def from_ase( cls, atoms, - r_max, + r_max: Union[float, int, dict], er_max: Optional[float] = None, oer_max: Optional[float] = None, key_mapping: Optional[Dict[str, str]] = {}, diff --git a/dptb/data/build.py b/dptb/data/build.py index d2c6e56a..2f121e7a 100644 --- a/dptb/data/build.py +++ b/dptb/data/build.py @@ -3,7 +3,7 @@ from copy import deepcopy import glob from importlib import import_module - +from typing import Union from dptb.data.dataset import DefaultDataset from dptb.data.dataset._deeph_dataset import DeePHE3Dataset from dptb.data.dataset._hdf5_dataset import HDF5Dataset @@ -14,7 +14,13 @@ from dptb.utils import instantiate, get_w_prefix from dptb.utils.tools import j_loader from dptb.utils.argcheck import normalize_setinfo, normalize_lmdbsetinfo +from dptb.utils.argcheck import collect_cutoffs +import logging +import torch +import copy + +log = logging.getLogger(__name__) def dataset_from_config(config, prefix: str = "dataset") -> AtomicDataset: """initialize database based on a config instance @@ -105,10 +111,17 @@ def dataset_from_config(config, prefix: str = "dataset") -> AtomicDataset: return instance +class DatasetBuilder: + def __init__(self): + pass -def build_dataset( + def __call__(self, # set_options root: str, + # dataset_options + r_max: Union[float, int, dict], + er_max: Union[float, int, dict] = None, + oer_max: Union[float, int, dict] = None, type: str = "DefaultDataset", prefix: str = None, separator:str='.', @@ -116,156 +129,251 @@ def build_dataset( get_overlap: bool = False, get_DM: bool = False, get_eigenvalues: bool = False, - # common_options orthogonal: bool = False, basis: str = None, **kwargs, ): - """ - Build a dataset based on the provided set options and common options. - - Args: - - type (str): The type of dataset to build. Default is "DefaultDataset". - - root (str): The main directory storing all trajectory folders. - - prefix (str, optional): Load selected trajectory folders with the specified prefix. - - get_Hamiltonian (bool, optional): Load the Hamiltonian file to edges of the graph or not. - - get_eigenvalues (bool, optional): Load the eigenvalues to the graph or not. - e.g. - type = "DefaultDataset", - root = "foo/bar/data_files_here", - prefix = "set" - - - basis (str, optional): The basis for the OrbitalMapper. - - Returns: - dataset: The built dataset. - - Raises: - ValueError: If the dataset type is not supported. - Exception: If the info.json file is not properly provided for a trajectory folder. - """ - dataset_type = type - # See if we can get a OrbitalMapper. - if basis is not None: - idp = OrbitalMapper(basis=basis) - else: - idp = None - - if dataset_type in ["DefaultDataset", "DeePHDataset", "HDF5Dataset", "LMDBDataset"]: - - # Explore the dataset's folder structure. - #include_folders = [] - #for dir_name in os.listdir(root): - # dir_path = os.path.join(root, dir_name) - # if os.path.isdir(dir_path): - # # If the `processed_dataset` or other folder is here too, they do not have the proper traj data files. - # # And we will have problem in generating TrajData! - # # So we test it here: the data folder must have `.dat` or `.traj` file. - # # If not, we will skip thi - # if glob.glob(os.path.join(dir_path, '*.dat')) or glob.glob(os.path.join(dir_path, '*.traj')): - # if prefix is not None: - # if dir_name[:len(prefix)] == prefix: - # include_folders.append(dir_name) - # else: - # include_folders.append(dir_name) - - assert prefix is not None, "The prefix is not provided. Please provide the prefix to select the trajectory folders." - prefix_folders = glob.glob(f"{root}/{prefix}{separator}*") - include_folders=[] - for idir in prefix_folders: - if os.path.isdir(idir): - if not glob.glob(os.path.join(idir, '*.dat')) \ - and not glob.glob(os.path.join(idir, '*.traj')) \ - and not glob.glob(os.path.join(idir, '*.h5')) \ - and not glob.glob(os.path.join(idir, '*.mdb')): - raise Exception(f"{idir} does not have the proper traj data files. Please check the data files.") - include_folders.append(idir.split('/')[-1]) - - assert isinstance(include_folders, list) and len(include_folders) > 0, "No trajectory folders are found. Please check the prefix." - - # We need to check the `info.json` very carefully here. - # Different `info` points to different dataset, - # even if the data files in `root` are basically the same. - info_files = {} - - # See if a public info is provided. - #if "info.json" in os.listdir(root): - if os.path.exists(f"{root}/info.json"): - public_info = j_loader(os.path.join(root, "info.json")) - if dataset_type == "LMDBDataset": - public_info = normalize_lmdbsetinfo(public_info) - else: - public_info = normalize_setinfo(public_info) - print("A public `info.json` file is provided, and will be used by the subfolders who do not have their own `info.json` file.") + """ + Build a dataset based on the provided set options and common options. + + Args: + - type (str): The type of dataset to build. Default is "DefaultDataset". + - root (str): The main directory storing all trajectory folders. + - prefix (str, optional): Load selected trajectory folders with the specified prefix. + - get_Hamiltonian (bool, optional): Load the Hamiltonian file to edges of the graph or not. + - get_eigenvalues (bool, optional): Load the eigenvalues to the graph or not. + e.g. + type = "DefaultDataset", + root = "foo/bar/data_files_here", + prefix = "set" + + - basis (str, optional): The basis for the OrbitalMapper. + + Returns: + dataset: The built dataset. + + Raises: + ValueError: If the dataset type is not supported. + Exception: If the info.json file is not properly provided for a trajectory folder. + """ + self.r_max = r_max + self.er_max = er_max + self.oer_max = oer_max + + self.if_check_cutoffs = False + + dataset_type = type + # See if we can get a OrbitalMapper. + if basis is not None: + idp = OrbitalMapper(basis=basis) else: - public_info = None - - # Load info in each trajectory folders seperately. - for file in include_folders: - #if "info.json" in os.listdir(os.path.join(root, file)): - if os.path.exists(f"{root}/{file}/info.json"): - # use info provided in this trajectory. - info = j_loader(f"{root}/{file}/info.json") + idp = None + + if dataset_type in ["DefaultDataset", "DeePHDataset", "HDF5Dataset", "LMDBDataset"]: + assert prefix is not None, "The prefix is not provided. Please provide the prefix to select the trajectory folders." + prefix_folders = glob.glob(f"{root}/{prefix}{separator}*") + include_folders=[] + for idir in prefix_folders: + if os.path.isdir(idir): + if not glob.glob(os.path.join(idir, '*.dat')) \ + and not glob.glob(os.path.join(idir, '*.traj')) \ + and not glob.glob(os.path.join(idir, '*.h5')) \ + and not glob.glob(os.path.join(idir, '*.mdb')): + raise Exception(f"{idir} does not have the proper traj data files. Please check the data files.") + include_folders.append(idir.split('/')[-1]) + + assert isinstance(include_folders, list) and len(include_folders) > 0, "No trajectory folders are found. Please check the prefix." + + # We need to check the `info.json` very carefully here. + # Different `info` points to different dataset, + # even if the data files in `root` are basically the same. + info_files = {} + + # See if a public info is provided. + #if "info.json" in os.listdir(root): + if os.path.exists(f"{root}/info.json"): + public_info = j_loader(os.path.join(root, "info.json")) if dataset_type == "LMDBDataset": - info = normalize_lmdbsetinfo(info) + public_info = {} + log.info("A public `info.json` file is provided, but will not be used anymore for LMDBDataset.") else: - info = normalize_setinfo(info) - info_files[file] = info - elif public_info is not None: - # use public info instead - # yaml will not dump correctly if this is not a deepcopy. - info_files[file] = deepcopy(public_info) + public_info = normalize_setinfo(public_info) + log.info("A public `info.json` file is provided, and will be used by the subfolders who do not have their own `info.json` file.") else: - # no info for this file - raise Exception(f"info.json is not properly provided for `{file}`.") - - # We will sort the info_files here. - # The order itself is not important, but must be consistant for the same list. - info_files = {key: info_files[key] for key in sorted(info_files)} + public_info = None + + # Load info in each trajectory folders seperately. + for file in include_folders: + #if "info.json" in os.listdir(os.path.join(root, file)): + + if dataset_type == "LMDBDataset": + info_files[file] = {} + elif os.path.exists(f"{root}/{file}/info.json"): + # use info provided in this trajectory. + info = j_loader(f"{root}/{file}/info.json") + info = normalize_setinfo(info) + info_files[file] = info + elif public_info is not None: # not lmbd and no info in subfolder, then must use public info. + # use public info instead + # yaml will not dump correctly if this is not a deepcopy. + info_files[file] = deepcopy(public_info) + else: # not lmdb no info in subfolder and no public info. then raise error. + log.error(f"for {dataset_type} type, the info.json is not properly provided for `{file}`") + raise ValueError(f"for {dataset_type} type, the info.json is not properly provided for `{file}`") + + # We will sort the info_files here. + # The order itself is not important, but must be consistant for the same list. + info_files = {key: info_files[key] for key in sorted(info_files)} - if dataset_type == "DeePHDataset": - dataset = DeePHE3Dataset( - root=root, - type_mapper=idp, - get_Hamiltonian=get_Hamiltonian, - get_eigenvalues=get_eigenvalues, - info_files = info_files - ) - elif dataset_type == "DefaultDataset": - dataset = DefaultDataset( + for ikey in info_files: + info_files[ikey].update({'r_max': r_max, 'er_max': er_max, 'oer_max': oer_max}) + + if dataset_type == "DeePHDataset": + dataset = DeePHE3Dataset( + root=root, + type_mapper=idp, + get_Hamiltonian=get_Hamiltonian, + get_eigenvalues=get_eigenvalues, + info_files = info_files + ) + elif dataset_type == "DefaultDataset": + dataset = DefaultDataset( + root=root, + type_mapper=idp, + get_Hamiltonian=get_Hamiltonian, + get_overlap=get_overlap, + get_DM=get_DM, + get_eigenvalues=get_eigenvalues, + info_files = info_files + ) + elif dataset_type == "HDF5Dataset": + dataset = HDF5Dataset( + root=root, + type_mapper=idp, + get_Hamiltonian=get_Hamiltonian, + get_overlap=get_overlap, + get_DM=get_DM, + get_eigenvalues=get_eigenvalues, + info_files = info_files + ) + elif dataset_type == "LMDBDataset": + dataset = LMDBDataset( root=root, type_mapper=idp, + orthogonal=orthogonal, get_Hamiltonian=get_Hamiltonian, get_overlap=get_overlap, get_DM=get_DM, get_eigenvalues=get_eigenvalues, info_files = info_files ) - elif dataset_type == "HDF5Dataset": - dataset = HDF5Dataset( - root=root, - type_mapper=idp, - get_Hamiltonian=get_Hamiltonian, - get_overlap=get_overlap, - get_DM=get_DM, - get_eigenvalues=get_eigenvalues, - info_files = info_files - ) - elif dataset_type == "LMDBDataset": - dataset = LMDBDataset( - root=root, - type_mapper=idp, - orthogonal=orthogonal, - get_Hamiltonian=get_Hamiltonian, - get_overlap=get_overlap, - get_DM=get_DM, - get_eigenvalues=get_eigenvalues, - info_files = info_files + + else: + raise ValueError(f"Not support dataset type: {type}.") + + if not self.if_check_cutoffs: + log.warning("The cutoffs in data and model are not checked. be careful!") + + return dataset + + def from_model(self, + model, + root: str, + type: str = "DefaultDataset", + prefix: str = None, + separator:str='.', + get_Hamiltonian: bool = False, + get_overlap: bool = False, + get_DM: bool = False, + get_eigenvalues: bool = False, + # common_options + orthogonal: bool = False, + basis: str = None, + **kwargs): + """ + Build a dataset from a model. + + Args: + - model (torch.nn.Module): The model to build the dataset from. + - dataset_type (str, optional): The type of dataset to build. Default is "DefaultDataset". + + Returns: + dataset: The built dataset. + """ + cutoff_options = collect_cutoffs(model.model_options) + + dataset = self( + root = root, + **cutoff_options, + type = type, + prefix = prefix, + separator = separator, + get_Hamiltonian = get_Hamiltonian, + get_overlap = get_overlap, + get_DM = get_DM, + get_eigenvalues = get_eigenvalues, + orthogonal = orthogonal, + basis = basis, + **kwargs, ) - else: - raise ValueError(f"Not support dataset type: {type}.") + return dataset + + def check_cutoffs(self,model:torch.nn.Module=None, **kwargs): + if model is None: + self.if_check_cutoffs = False + log.warning("No model is provided. We can not check the cutoffs used in data and model are consistent.") + else: + self.if_check_cutoffs = True + cutoff_options = collect_cutoffs(model.model_options) + if isinstance(cutoff_options['r_max'],dict): + assert isinstance(self.r_max,dict), "The r_max in model is a dict, but in dataset it is not." + for key in cutoff_options['r_max']: + if key not in self.r_max: + log.error(f"The key {key} in r_max is not defined in dataset") + raise ValueError(f"The key {key} in r_max is not defined in dataset") + assert self.r_max >= cutoff_options['r_max'][key], f"The r_max in model shoule be smaller than in dataset for {key}." + + elif isinstance(cutoff_options['r_max'],float): + assert isinstance(self.r_max,float), "The r_max in model is a float, but in dataset it is not." + assert self.r_max >= cutoff_options['r_max'], "The r_max in model shoule be smaller than in dataset." + + if isinstance(cutoff_options['er_max'],dict): + assert isinstance(self.er_max,dict), "The er_max in model is a dict, but in dataset it is not." + for key in cutoff_options['er_max']: + if key not in self.er_max: + log.error(f"The key {key} in er_max is not defined in dataset") + raise ValueError(f"The key {key} in er_max is not defined in dataset") + + assert self.er_max >= cutoff_options['er_max'][key], f"The er_max in model shoule be smaller than in dataset for {key}." + + elif isinstance(cutoff_options['er_max'],float): + assert isinstance(self.er_max,float), "The er_max in model is a float, but in dataset it is not." + assert self.er_max >= cutoff_options['er_max'], "The er_max in model shoule be smaller than in dataset." + elif cutoff_options['er_max'] is None: + assert self.er_max is None, "The er_max in model is None, but in dataset it is not." + + + if isinstance(cutoff_options['oer_max'],dict): + assert isinstance(self.oer_max,dict), "The oer_max in model is a dict, but in dataset it is not." + for key in cutoff_options['oer_max']: + if key not in self.oer_max: + log.error(f"The key {key} in oer_max is not defined in dataset") + raise ValueError(f"The key {key} in oer_max is not defined in dataset") + + assert self.oer_max >= cutoff_options['oer_max'][key], f"The oer_max in model shoule be smaller than in dataset for {key}." + elif isinstance(cutoff_options['oer_max'],float): + assert isinstance(self.oer_max,float), "The oer_max in model is a float, but in dataset it is not." + assert self.oer_max >= cutoff_options['oer_max'], "The oer_max in model shoule be smaller than in dataset." + elif cutoff_options['oer_max'] is None: + assert self.oer_max is None, "The oer_max in model is None, but in dataset it is not." + +# note, compared to the previous build_dataset, this one is more flexible. +# previous build_dataset is a function. now i define a class DataBuilder and re-defined __call__ function. +# then build_dataset is an instance of DataBuilder class. so i can use build_dataset.from_model() to build dataset from model. +# at the same time the previous way to use build_dataset is still available. like build_dataset(...). + +build_dataset = DatasetBuilder() - return dataset \ No newline at end of file diff --git a/dptb/data/dataset/_deeph_dataset.py b/dptb/data/dataset/_deeph_dataset.py index 0aee98e5..9e540e32 100644 --- a/dptb/data/dataset/_deeph_dataset.py +++ b/dptb/data/dataset/_deeph_dataset.py @@ -43,13 +43,11 @@ def __init__( for file in self.info_files.keys(): # get the info here info = info_files[file] - assert "AtomicData_options" in info - AtomicData_options = info["AtomicData_options"] - assert "r_max" in AtomicData_options - assert "pbc" in AtomicData_options + assert "r_max" in info + assert "pbc" in info subdata = os.path.join(self.root, file) self.raw_data.append(subdata) - self.data_options[subdata] = AtomicData_options + self.data_options[subdata] = info # The AtomicData_options is never used here. # Because we always return a list of AtomicData object in `get_data()`. @@ -68,12 +66,15 @@ def get_data(self): for subpath in tqdm(self.raw_data, desc="Loading data"): # the type_mapper here is loaded in PyG `dataset` type as `transform` attritube # so the OrbitalMapper can be accessed by self.transform here - AtomicData_options = self.data_options[subpath] + info = self.data_options[subpath] atomic_data = AtomicData.from_points( pos = np.loadtxt(os.path.join(subpath, "site_positions.dat")).T, cell = np.loadtxt(os.path.join(subpath, "lat.dat")).T, atomic_numbers = np.loadtxt(os.path.join(subpath, "element.dat")), - **AtomicData_options, + pbc = info["pbc"], + r_max=info["r_max"], + er_max=info.get("er_max", None), + oer_max=info.get("oer_max", None) ) idp = self.type_mapper openmx_to_deeptb(atomic_data, idp, os.path.join(subpath, "./hamiltonians.h5")) diff --git a/dptb/data/dataset/_default_dataset.py b/dptb/data/dataset/_default_dataset.py index 1a18480d..94d34b43 100644 --- a/dptb/data/dataset/_default_dataset.py +++ b/dptb/data/dataset/_default_dataset.py @@ -21,6 +21,9 @@ from dptb.data.AtomicDataDict import with_edge_vectors from dptb.nn.hamiltonian import E3Hamiltonian from tqdm import tqdm +import logging + +log = logging.getLogger(__name__) class _TrajData(object): ''' @@ -40,71 +43,18 @@ class _TrajData(object): def __init__(self, root: str, - AtomicData_options: Dict[str, Any] = {}, + data ={}, get_Hamiltonian = False, get_overlap = False, get_DM = False, get_eigenvalues = False, - info = None, - _clear = False): + info = None): assert not get_Hamiltonian * get_DM, "Hamiltonian and Density Matrix can only loaded one at a time, for which will occupy the same attribute in the AtomicData." self.root = root - self.AtomicData_options = AtomicData_options self.info = info + self.data = data - self.data = {} - # load cell - - pbc = AtomicData_options["pbc"] - if isinstance(pbc, bool): - has_cell = pbc - elif isinstance(pbc, list): - has_cell = any(pbc) - else: - raise ValueError("pbc must be bool or list.") - - if has_cell: - cell = np.loadtxt(os.path.join(root, "cell.dat")) - if cell.shape[0] == 3: - # same cell size, then copy it to all frames. - cell = np.expand_dims(cell, axis=0) - self.data["cell"] = np.broadcast_to(cell, (self.info["nframes"], 3, 3)) - elif cell.shape[0] == self.info["nframes"] * 3: - self.data["cell"] = cell.reshape(self.info["nframes"], 3, 3) - else: - raise ValueError("Wrong cell dimensions.") - - # load positions, stored as cartesion no matter what provided. - pos = np.loadtxt(os.path.join(root, "positions.dat")) - if len(pos.shape) == 1: - pos = pos.reshape(1,3) - natoms = self.info["natoms"] - if natoms < 0: - natoms = int(pos.shape[0] / self.info["nframes"]) - assert pos.shape[0] == self.info["nframes"] * natoms - pos = pos.reshape(self.info["nframes"], natoms, 3) - # ase use cartesian by default. - if self.info["pos_type"] == "cart" or self.info["pos_type"] == "ase": - self.data["pos"] = pos - elif self.info["pos_type"] == "frac": - self.data["pos"] = pos @ self.data["cell"] - else: - raise NameError("Position type must be cart / frac.") - - # load atomic numbers - atomic_numbers = np.loadtxt(os.path.join(root, "atomic_numbers.dat")) - if atomic_numbers.shape == (): - atomic_numbers = atomic_numbers.reshape(1) - if atomic_numbers.shape[0] == natoms: - # same atomic_numbers, copy it to all frames. - atomic_numbers = np.expand_dims(atomic_numbers, axis=0) - self.data["atomic_numbers"] = np.broadcast_to(atomic_numbers, (self.info["nframes"], natoms)) - elif atomic_numbers.shape[0] == natoms * self.info["nframes"]: - self.data["atomic_numbers"] = atomic_numbers.reshape(self.info["nframes"],natoms) - else: - raise ValueError("Wrong atomic_number dimensions.") - # load optional data files if get_eigenvalues == True: if os.path.exists(os.path.join(self.root, "eigenvalues.npy")): @@ -146,16 +96,77 @@ def __init__(self, else: self.data["DM_blocks"] = h5py.File(os.path.join(self.root, "DM.h5"), "r") - # this is used to clear the tmp files to load ase trajectory only. - if _clear: - os.remove(os.path.join(root, "positions.dat")) - os.remove(os.path.join(root, "cell.dat")) - os.remove(os.path.join(root, "atomic_numbers.dat")) - + @classmethod + def from_text_data(cls, + root: str, + get_Hamiltonian = False, + get_overlap = False, + get_DM = False, + get_eigenvalues = False, + info = None): + + data = {} + pbc = info["pbc"] + # load cell + if isinstance(pbc, bool): + has_cell = pbc + elif isinstance(pbc, list): + has_cell = any(pbc) + else: + raise ValueError("pbc must be bool or list.") + + if has_cell: + cell = np.loadtxt(os.path.join(root, "cell.dat")) + if cell.shape[0] == 3: + # same cell size, then copy it to all frames. + cell = np.expand_dims(cell, axis=0) + data["cell"] = np.broadcast_to(cell, (info["nframes"], 3, 3)) + elif cell.shape[0] == info["nframes"] * 3: + data["cell"] = cell.reshape(info["nframes"], 3, 3) + else: + raise ValueError("Wrong cell dimensions.") + + # load positions, stored as cartesion no matter what provided. + pos = np.loadtxt(os.path.join(root, "positions.dat")) + if len(pos.shape) == 1: + pos = pos.reshape(1,3) + natoms = info["natoms"] + if natoms < 0: + natoms = int(pos.shape[0] / info["nframes"]) + assert pos.shape[0] == info["nframes"] * natoms + pos = pos.reshape(info["nframes"], natoms, 3) + # ase use cartesian by default. + if info["pos_type"] == "cart" or info["pos_type"] == "ase": + data["pos"] = pos + elif info["pos_type"] == "frac": + data["pos"] = pos @ data["cell"] + else: + raise NameError("Position type must be cart / frac.") + + # load atomic numbers + atomic_numbers = np.loadtxt(os.path.join(root, "atomic_numbers.dat")) + if atomic_numbers.shape == (): + atomic_numbers = atomic_numbers.reshape(1) + if atomic_numbers.shape[0] == natoms: + # same atomic_numbers, copy it to all frames. + atomic_numbers = np.expand_dims(atomic_numbers, axis=0) + data["atomic_numbers"] = np.broadcast_to(atomic_numbers, (info["nframes"], natoms)) + elif atomic_numbers.shape[0] == natoms * info["nframes"]: + data["atomic_numbers"] = atomic_numbers.reshape(info["nframes"],natoms) + else: + raise ValueError("Wrong atomic_number dimensions.") + + return cls(root=root, + data=data, + get_Hamiltonian=get_Hamiltonian, + get_overlap=get_overlap, + get_DM=get_DM, + get_eigenvalues=get_eigenvalues, + info=info) + @classmethod def from_ase_traj(cls, root: str, - AtomicData_options: Dict[str, Any] = {}, get_Hamiltonian = False, get_overlap = False, get_DM = False, @@ -167,31 +178,63 @@ def from_ase_traj(cls, traj_file = glob.glob(f"{root}/*.traj") assert len(traj_file) == 1, print("only one ase trajectory file can be provided.") traj = Trajectory(traj_file[0], 'r') + nframes = len(traj) + assert nframes > 0, print("trajectory file is empty.") + if nframes != info.get("nframes", None): + info['nframes'] = nframes + log.info(f"Number of frames ({nframes}) in trajectory file does not match the number of frames in info file.") + + natoms = traj[0].positions.shape[0] + if natoms != info["natoms"]: + info["natoms"] = natoms + + pbc = info.get("pbc",None) + if pbc is None: + pbc = traj[0].pbc.tolist() + info["pbc"] = pbc + + if isinstance(pbc, bool): + pbc = [pbc] * 3 + + if pbc != traj[0].pbc.tolist(): + log.warning("!! PBC setting in info file does not match the PBC setting in trajectory file, we use the one in info json. BE CAREFUL!") + positions = [] cell = [] atomic_numbers = [] + for atoms in traj: positions.append(atoms.get_positions()) - cell.append(atoms.get_cell()) + atomic_numbers.append(atoms.get_atomic_numbers()) + if (np.abs(atoms.get_cell()-np.zeros([3,3]))< 1e-6).all(): + cell = None + else: + cell.append(atoms.get_cell()) + positions = np.array(positions) - positions = positions.reshape(-1, 3) - cell = np.array(cell) - cell = cell.reshape(-1, 3) + positions = positions.reshape(nframes,natoms, 3) + + if cell is not None: + cell = np.array(cell) + cell = cell.reshape(nframes,3, 3) + atomic_numbers = np.array(atomic_numbers) - atomic_numbers = atomic_numbers.reshape(-1, 1) - np.savetxt(os.path.join(root, "positions.dat"), positions) - np.savetxt(os.path.join(root, "cell.dat"), cell) - np.savetxt(os.path.join(root, "atomic_numbers.dat"), atomic_numbers, fmt='%d') + atomic_numbers = atomic_numbers.reshape(nframes, natoms) + + data = {} + if cell is not None: + data["cell"] = cell + data["pos"] = positions + data["atomic_numbers"] = atomic_numbers return cls(root=root, - AtomicData_options=AtomicData_options, + data=data, get_Hamiltonian=get_Hamiltonian, get_overlap=get_overlap, get_DM=get_DM, get_eigenvalues=get_eigenvalues, - info=info, - _clear=True) + info=info) def toAtomicDataList(self, idp: TypeMapper = None): data_list = [] @@ -218,10 +261,11 @@ def toAtomicDataList(self, idp: TypeMapper = None): dtype=torch.long) atomic_data = AtomicData.from_points( + r_max = self.info["r_max"], + pbc = self.info["pbc"], + er_max = self.info.get("er_max", None), + oer_max= self.info.get("oer_max", None), **kwargs, - # pbc is stored in AtomicData_options now. - #pbc = self.info["pbc"], - **self.AtomicData_options ) if "hamiltonian_blocks" in self.data: assert idp is not None, "LCAO Basis must be provided in `common_option` for loading Hamiltonian." @@ -300,21 +344,19 @@ def __init__( for file in self.info_files.keys(): # get the info here info = info_files[file] - assert "AtomicData_options" in info - AtomicData_options = info["AtomicData_options"] - assert "r_max" in AtomicData_options - assert "pbc" in AtomicData_options + # assert "AtomicData_options" in info + assert "r_max" in info + assert "pbc" in info + pbc = info["pbc"] if info["pos_type"] == "ase": subdata = _TrajData.from_ase_traj(os.path.join(self.root, file), - AtomicData_options, get_Hamiltonian, get_overlap, get_DM, get_eigenvalues, info=info) else: - subdata = _TrajData(os.path.join(self.root, file), - AtomicData_options, + subdata = _TrajData.from_text_data(os.path.join(self.root, file), get_Hamiltonian, get_overlap, get_DM, diff --git a/dptb/data/dataset/_hdf5_dataset.py b/dptb/data/dataset/_hdf5_dataset.py index c6b853e8..ef726589 100644 --- a/dptb/data/dataset/_hdf5_dataset.py +++ b/dptb/data/dataset/_hdf5_dataset.py @@ -38,7 +38,6 @@ class _HDF5_TrajData(object): def __init__(self, root: str, - AtomicData_options: Dict[str, Any] = {}, get_Hamiltonian = False, get_overlap = False, get_DM = False, @@ -46,9 +45,7 @@ def __init__(self, info = None): assert not get_Hamiltonian * get_DM, "Cannot get both Hamiltonian and DM" self.root = root - self.AtomicData_options = AtomicData_options self.info = info - self.data = {} assert os.path.exists(os.path.join(root, "structure.pkl")), "structure file not found." @@ -87,9 +84,11 @@ def toAtomicDataList(self, idp: TypeMapper = None): pos = self.data['structure'][frame]["positions"][:], cell = frame_cell, atomic_numbers = self.data['structure'][frame]["atomic_numbers"][:], - # pbc is stored in AtomicData_options now. - #pbc = self.info["pbc"], - **self.AtomicData_options) + r_max = self.info["r_max"], + er_max = self.info.get("er_max", None), + oer_max = self.info.get("oer_max", None), + pbc = self.info["pbc"], + ) if "hamiltonian_blocks" in self.data: assert idp is not None, "LCAO Basis must be provided in `common_option` for loading Hamiltonian." @@ -171,13 +170,10 @@ def __init__( for file in self.info_files.keys(): # get the info here info = info_files[file] - assert "AtomicData_options" in info - AtomicData_options = info["AtomicData_options"] - assert "r_max" in AtomicData_options - assert "pbc" in AtomicData_options + assert "r_max" in info + assert "pbc" in info if info["pos_type"] in ["hdf5", 'pickle']: subdata = _HDF5_TrajData(os.path.join(self.root, file), - AtomicData_options, get_Hamiltonian, get_overlap, get_DM, diff --git a/dptb/entrypoints/train.py b/dptb/entrypoints/train.py index 958dec4b..a9e5c7d7 100644 --- a/dptb/entrypoints/train.py +++ b/dptb/entrypoints/train.py @@ -3,7 +3,7 @@ from dptb.data.build import build_dataset from dptb.plugins.monitor import TrainLossMonitor, LearningRateMonitor, Validationer from dptb.plugins.train_logger import Logger -from dptb.utils.argcheck import normalize +from dptb.utils.argcheck import normalize, collect_cutoffs from dptb.plugins.saver import Saver from typing import Dict, List, Optional, Any from dptb.utils.tools import j_loader, setup_seed, j_must_have @@ -18,6 +18,7 @@ import json import os import time +import copy __all__ = ["train"] @@ -147,12 +148,19 @@ def train( jdata["train_options"] = f["config"]["train_options"] if jdata.get("model_options") is None: jdata["model_options"] = f["config"]["model_options"] + + ## add some warning ! + for k, v in jdata["model_options"].items(): + if k not in f["config"]["model_options"]: + log.warning(f"The model options {k} is not defined in checkpoint, set to {v}.") + else: + deep_dict_difference(k, v, f["config"]["model_options"]) del f else: j_must_have(jdata, "model_options") j_must_have(jdata, "train_options") - + cutoff_options =collect_cutoffs(jdata) # setup seed setup_seed(seed=jdata["common_options"]["seed"]) @@ -160,13 +168,13 @@ def train( # json.dump(jdata, fp, indent=4) # build dataset - train_datasets = build_dataset(**jdata["data_options"]["train"], **jdata["common_options"]) + train_datasets = build_dataset(**cutoff_options,**jdata["data_options"]["train"], **jdata["common_options"]) if jdata["data_options"].get("validation"): - validation_datasets = build_dataset(**jdata["data_options"]["validation"], **jdata["common_options"]) + validation_datasets = build_dataset(**cutoff_options, **jdata["data_options"]["validation"], **jdata["common_options"]) else: validation_datasets = None if jdata["data_options"].get("reference"): - reference_datasets = build_dataset(**jdata["data_options"]["reference"], **jdata["common_options"]) + reference_datasets = build_dataset(**cutoff_options, **jdata["data_options"]["reference"], **jdata["common_options"]) else: reference_datasets = None @@ -228,3 +236,26 @@ def train( log.info(f"wall time: {(end_time - start_time):.3f} s") +def deep_dict_difference(base_key, expected_value, model_options): + """ + 递归地记录嵌套字典中的选项差异。 + + :param base_key: 基础键名,用于构建警告消息的前缀。 + :param expected_value: 期望的值,可能是字典或非字典类型。 + :param model_options: 用于比较的模型选项字典。 + """ + target_dict= copy.deepcopy(model_options) # 防止修改原始字典 + if isinstance(expected_value, dict): + for subk, subv in expected_value.items(): + + if not isinstance(target_dict.get(base_key, {}),dict): + log.warning(f"The model option {subk} in {base_key} is not defined in checkpoint, set to {subv}.") + + elif subk not in target_dict.get(base_key, {}): + log.warning(f"The model option {subk} in {base_key} is not defined in checkpoint, set to {subv}.") + else: + target2 = copy.deepcopy(target_dict[base_key]) + deep_dict_difference(f"{subk}", subv, target2) + else: + if expected_value != target_dict[base_key]: + log.warning(f"The model option {base_key} is set to {expected_value}, but in checkpoint it is {target_dict[base_key]}, make sure it it correct!") \ No newline at end of file diff --git a/dptb/plugins/train_logger.py b/dptb/plugins/train_logger.py index 7cc3684b..8a9a6f40 100644 --- a/dptb/plugins/train_logger.py +++ b/dptb/plugins/train_logger.py @@ -7,7 +7,7 @@ class Logger(Plugin): alignment = 4 # 不同字段之间的分隔符 - separator = '#' * 160 + separator = '-' * 81 def __init__(self, fields, interval=None): if interval is None: diff --git a/dptb/postprocess/bandstructure/band.py b/dptb/postprocess/bandstructure/band.py index b8758dc6..88565166 100644 --- a/dptb/postprocess/bandstructure/band.py +++ b/dptb/postprocess/bandstructure/band.py @@ -170,7 +170,7 @@ def __init__(self, model:torch.nn.Module, results_path: str=None, use_gui: bool= self.results_path = results_path self.use_gui = use_gui - def get_bands(self, data: Union[AtomicData, ase.Atoms, str], kpath_kwargs: dict, AtomicData_options: dict={}): + def get_bands(self, data: Union[AtomicData, ase.Atoms, str], kpath_kwargs: dict, pbc:Union[bool,list]=None, AtomicData_options:dict=None): kline_type = kpath_kwargs['kline_type'] # get the ase structure @@ -208,7 +208,7 @@ def get_bands(self, data: Union[AtomicData, ase.Atoms, str], kpath_kwargs: dict, log.error('Error, now, kline_type only support ase_kpath, abacus, or vasp.') raise ValueError - data, eigenvalues = self.get_eigs(data, klist, AtomicData_options) + data, eigenvalues = self.get_eigs(data=data, klist=klist, pbc=pbc, AtomicData_options=AtomicData_options) # get the E_fermi from data @@ -229,7 +229,7 @@ def get_bands(self, data: Union[AtomicData, ase.Atoms, str], kpath_kwargs: dict, # estimated_E_fermi = None if nel_atom is not None: data,estimated_E_fermi = self.get_fermi_level(data=data, nel_atom=nel_atom, \ - klist = klist, AtomicData_options=AtomicData_options) + klist = klist, pbc=pbc, AtomicData_options=AtomicData_options) else: estimated_E_fermi = None diff --git a/dptb/postprocess/elec_struc_cal.py b/dptb/postprocess/elec_struc_cal.py index 96df0f72..d2b47ab7 100644 --- a/dptb/postprocess/elec_struc_cal.py +++ b/dptb/postprocess/elec_struc_cal.py @@ -9,6 +9,8 @@ log = logging.getLogger(__name__) from dptb.data import AtomicData, AtomicDataDict from dptb.nn.energy import Eigenvalues +from dptb.utils.argcheck import get_cutoffs_from_model_options +from copy import deepcopy # This class `ElecStruCal` is designed to calculate electronic structure properties such as # eigenvalues and Fermi energy based on provided input data and model. @@ -42,6 +44,10 @@ def __init__ ( self.model.eval() self.overlap = hasattr(model, 'overlap') + if not self.model.transform: + log.error('The model.transform is not True, please check the model.') + raise RuntimeError('The model.transform is not True, please check the model.') + if self.overlap: self.eigv = Eigenvalues( idp=model.idp, @@ -57,8 +63,9 @@ def __init__ ( device=self.device, dtype=model.dtype, ) - - def get_data(self,data: Union[AtomicData, ase.Atoms, str],AtomicData_options: dict={},device: Union[str, torch.device]=None): + r_max, er_max, oer_max = get_cutoffs_from_model_options(model.model_options) + self.cutoffs = {'r_max': r_max, 'er_max': er_max, 'oer_max': oer_max} + def get_data(self,data: Union[AtomicData, ase.Atoms, str],pbc:Union[bool,list]=None, device: Union[str, torch.device]=None, AtomicData_options:dict=None): '''The function `get_data` takes input data in the form of a string, ase.Atoms object, or AtomicData object, processes it accordingly, and returns the AtomicData class. @@ -79,15 +86,36 @@ def get_data(self,data: Union[AtomicData, ase.Atoms, str],AtomicData_options: di the loaded AtomicData object. ''' + atomic_options = deepcopy(self.cutoffs) + if pbc is not None: + atomic_options.update({'pbc': pbc}) + + if AtomicData_options is not None: + if AtomicData_options.get('r_max', None) is not None: + if atomic_options['r_max'] != AtomicData_options.get('r_max'): + atomic_options['r_max'] = AtomicData_options.get('r_max') + log.warning(f'Overwrite the r_max setting in the model with the r_max setting in the AtomicData_options: {AtomicData_options.get("r_max")}') + log.warning(f'This is very dangerous, please make sure you know what you are doing.') + if AtomicData_options.get('er_max', None) is not None: + if atomic_options['er_max'] != AtomicData_options.get('er_max'): + atomic_options['er_max'] = AtomicData_options.get('er_max') + log.warning(f'Overwrite the er_max setting in the model with the er_max setting in the AtomicData_options: {AtomicData_options.get("er_max")}') + log.warning(f'This is very dangerous, please make sure you know what you are doing.') + if AtomicData_options.get('oer_max', None) is not None: + if atomic_options['oer_max'] != AtomicData_options.get('oer_max'): + atomic_options['oer_max'] = AtomicData_options.get('oer_max') + log.warning(f'Overwrite the oer_max setting in the model with the oer_max setting in the AtomicData_options: {AtomicData_options.get("oer_max")}') + log.warning(f'This is very dangerous, please make sure you know what you are doing.') if isinstance(data, str): structase = read(data) - data = AtomicData.from_ase(structase, **AtomicData_options) + data = AtomicData.from_ase(structase, **atomic_options) elif isinstance(data, ase.Atoms): structase = data - data = AtomicData.from_ase(structase, **AtomicData_options) + data = AtomicData.from_ase(structase, **atomic_options) elif isinstance(data, AtomicData): # structase = data.to("cpu").to_ase() + log.info('The data is already an instance of AtomicData. Then the data is used directly.') data = data else: raise ValueError('data should be either a string, ase.Atoms, or AtomicData') @@ -100,7 +128,7 @@ def get_data(self,data: Union[AtomicData, ase.Atoms, str],AtomicData_options: di return data - def get_eigs(self, data: Union[AtomicData, ase.Atoms, str], klist: np.ndarray, AtomicData_options: dict={}): + def get_eigs(self, data: Union[AtomicData, ase.Atoms, str], klist: np.ndarray, pbc:Union[bool,list]=None, AtomicData_options:dict=None): '''This function calculates eigenvalues for Hk at specified k-points. Parameters @@ -120,7 +148,7 @@ def get_eigs(self, data: Union[AtomicData, ase.Atoms, str], klist: np.ndarray, A ''' - data = self.get_data(data=data, AtomicData_options=AtomicData_options, device=self.device) + data = self.get_data(data=data, pbc=pbc, device=self.device,AtomicData_options=AtomicData_options) # set the kpoint of the AtomicData data[AtomicDataDict.KPOINT_KEY] = \ torch.nested.as_nested_tensor([torch.as_tensor(klist, dtype=self.model.dtype, device=self.device)]) @@ -133,7 +161,7 @@ def get_eigs(self, data: Union[AtomicData, ase.Atoms, str], klist: np.ndarray, A return data, data[AtomicDataDict.ENERGY_EIGENVALUE_KEY][0].detach().cpu().numpy() def get_fermi_level(self, data: Union[AtomicData, ase.Atoms, str], nel_atom: dict, \ - meshgrid: list = None, klist: np.ndarray=None, AtomicData_options: dict={}): + meshgrid: list = None, klist: np.ndarray=None, pbc:Union[bool,list]=None,AtomicData_options:dict=None): '''This function calculates the Fermi level based on provided data with iteration method, electron counts per atom, and optional parameters like specific k-points and eigenvalues. @@ -184,7 +212,7 @@ def get_fermi_level(self, data: Union[AtomicData, ase.Atoms, str], nel_atom: dic # eigenvalues would be used if provided, otherwise the eigenvalues would be calculated from the model on the specified k-points if not AtomicDataDict.ENERGY_EIGENVALUE_KEY in data: - data, eigs = self.get_eigs(data=data, klist=klist, AtomicData_options=AtomicData_options) + data, eigs = self.get_eigs(data=data, klist=klist, pbc=pbc, AtomicData_options=AtomicData_options) log.info('Getting eigenvalues from the model.') else: log.info('The eigenvalues are already in data. will use them.') diff --git a/dptb/tests/data/Sn/soc/dataset/set.0/info.json b/dptb/tests/data/Sn/soc/dataset/set.0/info.json index 01857942..7086f714 100644 --- a/dptb/tests/data/Sn/soc/dataset/set.0/info.json +++ b/dptb/tests/data/Sn/soc/dataset/set.0/info.json @@ -2,12 +2,7 @@ "nframes": 1, "natoms": -1, "pos_type": "ase", - "AtomicData_options": { - "r_max": 6.0, - "er_max": 5.0, - "oer_max":3.0, - "pbc": true - }, + "pbc": true, "bandinfo": { "band_min": 0, "band_max":16, diff --git a/dptb/tests/data/Sn/soc/input/input_soc.json b/dptb/tests/data/Sn/soc/input/input_soc.json index fb18805d..86007a2f 100644 --- a/dptb/tests/data/Sn/soc/input/input_soc.json +++ b/dptb/tests/data/Sn/soc/input/input_soc.json @@ -43,7 +43,7 @@ }, "model_options": { "nnsk": { - "onsite": {"method": "strain","rs":6.0, "w": 0.1}, + "onsite": {"method": "strain","rs":3.0, "w": 0.1}, "hopping": {"method": "powerlaw", "rs":6.0, "w": 0.1}, "soc":{"method":"uniform"}, "push": false, diff --git a/dptb/tests/data/hBN/dataset/kpath.0/info.json b/dptb/tests/data/hBN/dataset/kpath.0/info.json index ac146605..41e9d706 100644 --- a/dptb/tests/data/hBN/dataset/kpath.0/info.json +++ b/dptb/tests/data/hBN/dataset/kpath.0/info.json @@ -2,12 +2,7 @@ "nframes": 1, "natoms": 2, "pos_type": "ase", - "AtomicData_options": { - "r_max": 2.6, - "er_max": 2.6, - "oer_max":1.6, - "pbc": true - }, + "pbc": true, "bandinfo": { "band_min": 0, "band_max": 6, diff --git a/dptb/tests/data/hBN/input/input_mix_dftbsk.json b/dptb/tests/data/hBN/input/input_mix_dftbsk.json index 5d214e0d..f9cbe2d4 100644 --- a/dptb/tests/data/hBN/input/input_mix_dftbsk.json +++ b/dptb/tests/data/hBN/input/input_mix_dftbsk.json @@ -29,7 +29,8 @@ }, "model_options": { "dftbsk": { - "skdata":"./examples/hBN_dftb/slakos" + "skdata":"./examples/hBN_dftb/slakos", + "r_max": 5.0 }, "embedding":{ "method": "se2", diff --git a/dptb/tests/data/test_sktb/dataset/kpath_spk.0/info.json b/dptb/tests/data/test_sktb/dataset/kpath_spk.0/info.json index 4304669a..8912eaf7 100644 --- a/dptb/tests/data/test_sktb/dataset/kpath_spk.0/info.json +++ b/dptb/tests/data/test_sktb/dataset/kpath_spk.0/info.json @@ -2,12 +2,7 @@ "nframes": 1, "natoms": 2, "pos_type": "ase", - "AtomicData_options": { - "r_max": 5.0, - "er_max": 5.0, - "oer_max": 2.5, - "pbc": true - }, + "pbc": true, "bandinfo": { "band_min": 0, "band_max": 6, diff --git a/dptb/tests/data/test_sktb/dataset/kpathmd25.0/info.json b/dptb/tests/data/test_sktb/dataset/kpathmd25.0/info.json index 6485de04..823b0eba 100644 --- a/dptb/tests/data/test_sktb/dataset/kpathmd25.0/info.json +++ b/dptb/tests/data/test_sktb/dataset/kpathmd25.0/info.json @@ -2,12 +2,7 @@ "nframes": 10, "natoms": 8, "pos_type": "ase", - "AtomicData_options": { - "r_max": 5.0, - "er_max": 5.0, - "oer_max": 2.5, - "pbc": true - }, + "pbc": true, "bandinfo": { "band_min": 0, "band_max": 8, diff --git a/dptb/tests/data/test_sktb/input/input_push_rs.json b/dptb/tests/data/test_sktb/input/input_push_rs.json index 40d8b6f1..7dacbe85 100644 --- a/dptb/tests/data/test_sktb/input/input_push_rs.json +++ b/dptb/tests/data/test_sktb/input/input_push_rs.json @@ -33,6 +33,8 @@ } }, "data_options": { + "r_max": 5.0, + "oer_max":2.5, "train": { "root": "./dptb/tests/data/test_sktb/dataset/", "prefix": "kpath_spk", diff --git a/dptb/tests/data/test_sktb/input/input_push_w.json b/dptb/tests/data/test_sktb/input/input_push_w.json index 77e56525..997d0924 100644 --- a/dptb/tests/data/test_sktb/input/input_push_w.json +++ b/dptb/tests/data/test_sktb/input/input_push_w.json @@ -33,6 +33,8 @@ } }, "data_options": { + "r_max": 5.0, + "oer_max":2.5, "train": { "root": "./dptb/tests/data/test_sktb/dataset/", "prefix": "kpath_spk", diff --git a/dptb/tests/test_SKHamiltonian.py b/dptb/tests/test_SKHamiltonian.py index 2ef4153e..40607943 100644 --- a/dptb/tests/test_SKHamiltonian.py +++ b/dptb/tests/test_SKHamiltonian.py @@ -39,6 +39,9 @@ class TestSKHamiltonian: "push": None} } data_options = { + "r_max": 2.6, + "er_max": 2.6, + "oer_max":1.6, "train": { "root": f"{rootdir}/hBN/dataset", "prefix": "kpath", @@ -46,7 +49,7 @@ class TestSKHamiltonian: } } - train_datasets = build_dataset(**data_options["train"], **common_options) + train_datasets = build_dataset(**data_options, **data_options["train"], **common_options) train_loader = DataLoader(dataset=train_datasets, batch_size=1, shuffle=True) batch = next(iter(train_loader)) diff --git a/dptb/tests/test_block_to_feature.py b/dptb/tests/test_block_to_feature.py index db1b0d53..86880339 100644 --- a/dptb/tests/test_block_to_feature.py +++ b/dptb/tests/test_block_to_feature.py @@ -40,6 +40,9 @@ class TestBlock2Feature: "push": None} } data_options = { + "r_max": 2.6, + "er_max": 2.6, + "oer_max":1.6, "train": { "root": f"{rootdir}/hBN/dataset", "prefix": "kpath", @@ -47,7 +50,7 @@ class TestBlock2Feature: } } - train_datasets = build_dataset(**data_options["train"], **common_options) + train_datasets = build_dataset(**data_options, **data_options["train"], **common_options) train_loader = DataLoader(dataset=train_datasets, batch_size=1, shuffle=True) batch = next(iter(train_loader)) diff --git a/dptb/tests/test_build_dataset.py b/dptb/tests/test_build_dataset.py index d10a9c9f..ca1f3ed9 100644 --- a/dptb/tests/test_build_dataset.py +++ b/dptb/tests/test_build_dataset.py @@ -10,6 +10,9 @@ def root_directory(request): def test_build_dataset_success(root_directory): set_options = { + "r_max": 5.0, + "er_max": 5.0, + "oer_max": 2.5, "root": f"{root_directory}/dptb/tests/data/test_sktb/dataset", "prefix": "kpath_spk", "get_eigenvalues": True, @@ -53,6 +56,9 @@ def test_build_dataset_success(root_directory): def test_build_dataset_fail(root_directory): set_options = { + "r_max": 5.0, + "er_max": 5.0, + "oer_max": 2.5, "root": f"{root_directory}/dptb/tests/data/test_sktb/dataset", "prefix": "kpath_spk", "get_eigenvalues": False, diff --git a/dptb/tests/test_dataloader_batch.py b/dptb/tests/test_dataloader_batch.py index b96dda0b..329ed7ee 100644 --- a/dptb/tests/test_dataloader_batch.py +++ b/dptb/tests/test_dataloader_batch.py @@ -14,6 +14,9 @@ class TestDataLoaderBatch: data_options = { + "r_max": 5.0, + "er_max": 5.0, + "oer_max": 2.5, "train": { "root": f"{rootdir}/test_sktb/dataset", "prefix": "kpath_spk", @@ -29,7 +32,7 @@ class TestDataLoaderBatch: "overlap": False, "seed": 3982377700 } - train_datasets = build_dataset(**data_options["train"], **common_options) + train_datasets = build_dataset(**data_options, **data_options["train"], **common_options) def test_init(self): train_loader = DataLoader(dataset=self.train_datasets, batch_size=1, shuffle=True) diff --git a/dptb/tests/test_default_dataset.py b/dptb/tests/test_default_dataset.py index 590ad9be..6f585218 100644 --- a/dptb/tests/test_default_dataset.py +++ b/dptb/tests/test_default_dataset.py @@ -17,10 +17,10 @@ class TestDefaultDatasetSKTB: info_files = {'kpath_spk.0': {'nframes': 1, 'natoms': 2, 'pos_type': 'ase', - 'AtomicData_options': {'r_max': 5.0, + 'pbc': True, + 'r_max': 5.0, 'er_max': 5.0, 'oer_max': 2.5, - 'pbc': True}, 'bandinfo': {'nkpoints': 61, 'nbands': 14, 'band_min': 0, @@ -56,7 +56,7 @@ def test_inparas(self): def test_raw_data(self): assert len(self.dataset.raw_data) == 1 assert isinstance(self.dataset.raw_data[0], _TrajData) - assert self.dataset.raw_data[0].AtomicData_options == {'r_max': 5.0, 'er_max': 5.0, 'oer_max': 2.5, 'pbc': True} + # assert self.dataset.raw_data[0].AtomicData_options == {'r_max': 5.0, 'er_max': 5.0, 'oer_max': 2.5, 'pbc': True} assert self.dataset.raw_data[0].info == self.info_files['kpath_spk.0'] assert "bandinfo" in self.dataset.raw_data[0].info assert list(self.dataset.raw_data[0].data.keys()) == (['cell', 'pos', 'atomic_numbers', 'kpoint', 'eigenvalue']) diff --git a/dptb/tests/test_dftbsk.py b/dptb/tests/test_dftbsk.py index 2ae5ba9c..9619d85c 100644 --- a/dptb/tests/test_dftbsk.py +++ b/dptb/tests/test_dftbsk.py @@ -31,13 +31,16 @@ class TestDFTBSK: } } data_options = { + "r_max": 2.6, + "er_max": 2.6, + "oer_max":1.6, "train": { "root": f"{rootdir}/hBN/dataset", "prefix": "kpath", "get_eigenvalues": False } } - train_datasets = build_dataset(**data_options["train"], **common_options) + train_datasets = build_dataset(**data_options, **data_options["train"], **common_options) train_loader = DataLoader(dataset=train_datasets, batch_size=1, shuffle=True) batch = next(iter(train_loader)) diff --git a/dptb/tests/test_from_v1json.py b/dptb/tests/test_from_v1json.py index f7f3e6ce..d0a87d6f 100644 --- a/dptb/tests/test_from_v1json.py +++ b/dptb/tests/test_from_v1json.py @@ -66,27 +66,93 @@ def test_bands(self): device=model.device) stru_data = f"{rootdir}/json_model/AlAs.vasp" - AtomicData_options = {"r_max": 5.2, "pbc": True} - eigenstatus = bcal.get_bands(data=stru_data, - kpath_kwargs=kpath_kwargs, - AtomicData_options=AtomicData_options) + kpath_kwargs=kpath_kwargs) - expected_bands =np.array([[-2.48727150e+01, -1.29382324e+01, -1.29382257e+01, -1.29382229e+01, -1.10868120e+01, -8.07862854e+00, -8.07862568e+00, -8.07861805e+00, 9.56408596e+00, 9.56408691e+00, 1.25271873e+01, 1.25271950e+01, 1.25271978e+01, 4.23655891e+01, 4.23656044e+01, 4.32170753e+01, 4.32170792e+01, 4.32170868e+01], - [-2.41187267e+01, -1.61148472e+01, -1.42793083e+01, -1.42793045e+01, -1.03604565e+01, -8.68612957e+00, -5.90628624e+00, -5.90628576e+00, 2.25617599e+00, 5.51729870e+00, 5.51730347e+00, 5.61441135e+00, 5.90860081e+00, 2.50449829e+01, 2.82622643e+01, 2.82622776e+01, 2.84239502e+01, 3.07470131e+01], - [-2.29336300e+01, -1.85238571e+01, -1.51972685e+01, -1.51972666e+01, -1.13513584e+01, -1.05228834e+01, -2.21334386e+00, -2.21334243e+00, -3.03742558e-01, -3.03741843e-01, -9.65526607e-03, 8.24528575e-01, 1.84810734e+00, 7.89270067e+00, 1.01749058e+01, 1.01749077e+01, 1.34912348e+01, 1.40874834e+01], - [-2.29474239e+01, -1.84172096e+01, -1.56978197e+01, -1.50829716e+01, -1.10063257e+01, -9.69069576e+00, -2.91590619e+00, -2.64113235e+00, -1.43450952e+00, -4.38025206e-01, 1.01333761e+00, 1.07858098e+00, 3.61593747e+00, 7.17037296e+00, 9.29849529e+00, 1.00337200e+01, 1.38197346e+01, 1.42732258e+01], - [-2.30109138e+01, -1.81435585e+01, -1.63736401e+01, -1.47889500e+01, -1.06536665e+01, -7.59100485e+00, -4.40897274e+00, -4.01978016e+00, -1.59141457e+00, -8.14805627e-02, 1.07713044e+00, 2.36757493e+00, 6.39950705e+00, 6.44096851e+00, 8.05662537e+00, 1.10570469e+01, 1.42302742e+01, 1.53123789e+01], - [-2.30108986e+01, -1.81435699e+01, -1.63736362e+01, -1.47889528e+01, -1.06536646e+01, -7.59101057e+00, -4.40896845e+00, -4.01978016e+00, -1.59141552e+00, -8.14811662e-02, 1.07712996e+00, 2.36757469e+00, 6.39950800e+00, 6.44096851e+00, 8.05662632e+00, 1.10570469e+01, 1.42302704e+01, 1.53123856e+01], - [-2.40611782e+01, -1.67647114e+01, -1.50329933e+01, -1.34557276e+01, -9.01750469e+00, -7.44570971e+00, -7.16721439e+00, -6.34023905e+00, 2.99699736e+00, 3.46649384e+00, 4.46376228e+00, 5.20905399e+00, 7.82006931e+00, 2.53436356e+01, 2.59452019e+01, 2.75783978e+01, 2.84669800e+01, 2.92158451e+01], - [-2.48727150e+01, -1.29382324e+01, -1.29382257e+01, -1.29382229e+01, -1.10868120e+01, -8.07862854e+00, -8.07862568e+00, -8.07861805e+00, 9.56408596e+00, 9.56408691e+00, 1.25271873e+01, 1.25271950e+01, 1.25271978e+01, 4.23655891e+01, 4.23656044e+01, 4.32170753e+01, 4.32170792e+01, 4.32170868e+01], - [-2.43790150e+01, -1.64551792e+01, -1.34435387e+01, -1.34435349e+01, -1.03514795e+01, -7.39460945e+00, -7.39460516e+00, -6.10483932e+00, 4.67000580e+00, 4.67000914e+00, 6.74771929e+00, 6.74772310e+00, 9.39733410e+00, 3.10563354e+01, 3.10563450e+01, 3.17371826e+01, 3.17371864e+01, 3.35946846e+01], - [-2.35396881e+01, -1.85059109e+01, -1.37993116e+01, -1.37993116e+01, -1.08380241e+01, -7.56033421e+00, -7.56033087e+00, -3.32421374e+00, -4.98459250e-01, -4.98458147e-01, 4.68962049e+00, 4.68962288e+00, 7.64235640e+00, 1.68248940e+01, 1.68248997e+01, 2.04327011e+01, 2.04327030e+01, 2.12005653e+01], - [-2.31961079e+01, -1.82634125e+01, -1.56346197e+01, -1.44923830e+01, -9.23417282e+00, -7.92826271e+00, -5.95008469e+00, -4.99026012e+00, -1.32351279e+00, -5.01590669e-01, 2.95195317e+00, 4.62497950e+00, 5.44099808e+00, 1.17575951e+01, 1.19310246e+01, 1.50337820e+01, 1.79441051e+01, 1.80985184e+01], - [-2.29424934e+01, -1.80575047e+01, -1.62370167e+01, -1.56745434e+01, -8.23033428e+00, -7.16741085e+00, -6.62496185e+00, -5.73856449e+00, -1.48688376e+00, 1.80971527e+00, 2.45554900e+00, 3.85232139e+00, 4.23087120e+00, 5.92445564e+00, 6.44421244e+00, 8.21325207e+00, 1.44543571e+01, 1.44987440e+01], - [-2.29404392e+01, -1.83383312e+01, -1.57138681e+01, -1.54623451e+01, -1.01436739e+01, -9.37874889e+00, -4.06893778e+00, -3.25271797e+00, -1.23538244e+00, -4.17988628e-01, 1.19791162e+00, 2.69611549e+00, 3.94141436e+00, 6.43033361e+00, 8.37113857e+00, 9.67157173e+00, 1.41308174e+01, 1.42368813e+01], - [-2.29336300e+01, -1.85238571e+01, -1.51972685e+01, -1.51972666e+01, -1.13513584e+01, -1.05228834e+01, -2.21334386e+00, -2.21334243e+00, -3.03742558e-01, -3.03741843e-01, -9.65526607e-03, 8.24528575e-01, 1.84810734e+00, 7.89270067e+00, 1.01749058e+01, 1.01749077e+01, 1.34912348e+01, 1.40874834e+01]]) - + expected_bands =np.array([[-2.48738842e+01, -1.29387579e+01, -1.29387531e+01, + -1.29387484e+01, -1.10866852e+01, -8.07882595e+00, + -8.07881832e+00, -8.07881737e+00, 9.56978989e+00, + 9.56979179e+00, 1.25314865e+01, 1.25314980e+01, + 1.25315008e+01, 4.23717499e+01, 4.23717537e+01, + 4.32215462e+01, 4.32215538e+01, 4.32215614e+01], + [-2.41191730e+01, -1.61150684e+01, -1.42791767e+01, + -1.42791719e+01, -1.03606348e+01, -8.68642616e+00, + -5.90601444e+00, -5.90600967e+00, 2.25788760e+00, + 5.51916361e+00, 5.51916647e+00, 5.61485243e+00, + 5.91050625e+00, 2.50469570e+01, 2.82641335e+01, + 2.82641392e+01, 2.84246483e+01, 3.07487679e+01], + [-2.29339600e+01, -1.85236092e+01, -1.51975479e+01, + -1.51975431e+01, -1.13508320e+01, -1.05211630e+01, + -2.21044850e+00, -2.21044683e+00, -3.01877409e-01, + -3.01874220e-01, -5.50282327e-03, 8.32842171e-01, + 1.85165548e+00, 7.89621782e+00, 1.01784697e+01, + 1.01784744e+01, 1.34970484e+01, 1.40907288e+01], + [-2.29477081e+01, -1.84168339e+01, -1.56979408e+01, + -1.50834084e+01, -1.10056238e+01, -9.68981457e+00, + -2.91448879e+00, -2.63903880e+00, -1.43107760e+00, + -4.35178548e-01, 1.01621652e+00, 1.08422828e+00, + 3.61865139e+00, 7.17336273e+00, 9.30155849e+00, + 1.00361338e+01, 1.38237772e+01, 1.42762747e+01], + [-2.30109749e+01, -1.81430511e+01, -1.63737125e+01, + -1.47896776e+01, -1.06530704e+01, -7.59097767e+00, + -4.40895557e+00, -4.01798630e+00, -1.59009695e+00, + -8.00317004e-02, 1.07963777e+00, 2.36884308e+00, + 6.40078640e+00, 6.44294930e+00, 8.05769444e+00, + 1.10569324e+01, 1.42315102e+01, 1.53139381e+01], + [-2.30109730e+01, -1.81430492e+01, -1.63737125e+01, + -1.47896767e+01, -1.06530619e+01, -7.59097576e+00, + -4.40895939e+00, -4.01798677e+00, -1.59010005e+00, + -8.00331011e-02, 1.07963753e+00, 2.36884212e+00, + 6.40078783e+00, 6.44294262e+00, 8.05769157e+00, + 1.10569296e+01, 1.42315063e+01, 1.53139343e+01], + [-2.40614185e+01, -1.67648468e+01, -1.50328369e+01, + -1.34554472e+01, -9.01719761e+00, -7.44597864e+00, + -7.16829062e+00, -6.34035254e+00, 2.99600887e+00, + 3.46569014e+00, 4.46293497e+00, 5.20906973e+00, + 7.81929064e+00, 2.53426857e+01, 2.59447289e+01, + 2.75785408e+01, 2.84667950e+01, 2.92152786e+01], + [-2.48738842e+01, -1.29387579e+01, -1.29387531e+01, + -1.29387484e+01, -1.10866852e+01, -8.07882595e+00, + -8.07881832e+00, -8.07881737e+00, 9.56978989e+00, + 9.56979179e+00, 1.25314865e+01, 1.25314980e+01, + 1.25315008e+01, 4.23717499e+01, 4.23717537e+01, + 4.32215462e+01, 4.32215538e+01, 4.32215614e+01], + [-2.43795700e+01, -1.64551907e+01, -1.34434357e+01, + -1.34434280e+01, -1.03514872e+01, -7.39513445e+00, + -7.39513063e+00, -6.10492849e+00, 4.66958141e+00, + 4.66959238e+00, 6.74782705e+00, 6.74782896e+00, + 9.39744949e+00, 3.10566292e+01, 3.10566330e+01, + 3.17376080e+01, 3.17376156e+01, 3.35952110e+01], + [-2.35389977e+01, -1.85056343e+01, -1.37990303e+01, + -1.37990227e+01, -1.08380346e+01, -7.56264687e+00, + -7.56264400e+00, -3.32416415e+00, -5.02199292e-01, + -5.02196670e-01, 4.68519068e+00, 4.68519211e+00, + 7.63819790e+00, 1.68208370e+01, 1.68208504e+01, + 2.04270325e+01, 2.04270401e+01, 2.11967201e+01], + [-2.31957893e+01, -1.82630310e+01, -1.56345882e+01, + -1.44928350e+01, -9.23434162e+00, -7.92852402e+00, + -5.95022917e+00, -4.99064732e+00, -1.32462871e+00, + -5.02915382e-01, 2.95047784e+00, 4.62426805e+00, + 5.43929529e+00, 1.17566347e+01, 1.19293985e+01, + 1.50316639e+01, 1.79418583e+01, 1.80968723e+01], + [-2.29426270e+01, -1.80574532e+01, -1.62369022e+01, + -1.56748543e+01, -8.22931576e+00, -7.16701651e+00, + -6.62407303e+00, -5.73891783e+00, -1.48577607e+00, + 1.81063569e+00, 2.45844960e+00, 3.85335517e+00, + 4.23286629e+00, 5.92695141e+00, 6.44531107e+00, + 8.21370125e+00, 1.44566507e+01, 1.44983978e+01], + [-2.29406662e+01, -1.83379650e+01, -1.57140999e+01, + -1.54625340e+01, -1.01433325e+01, -9.37792110e+00, + -4.06694746e+00, -3.25191188e+00, -1.23258555e+00, + -4.15170372e-01, 1.20202124e+00, 2.69886231e+00, + 3.94393396e+00, 6.43281651e+00, 8.37365723e+00, + 9.67361927e+00, 1.41347656e+01, 1.42384768e+01], + [-2.29339600e+01, -1.85236092e+01, -1.51975479e+01, + -1.51975431e+01, -1.13508320e+01, -1.05211630e+01, + -2.21044850e+00, -2.21044683e+00, -3.01877409e-01, + -3.01874220e-01, -5.50282327e-03, 8.32842171e-01, + 1.85165548e+00, 7.89621782e+00, 1.01784697e+01, + 1.01784744e+01, 1.34970484e+01, 1.40907288e+01]], dtype=np.float32) assert np.allclose(eigenstatus["eigenvalues"], expected_bands, atol=1e-4) @@ -149,25 +215,77 @@ def test_bands(self): device=model.device) stru_data = f"{rootdir}/json_model/silicon.vasp" - AtomicData_options = {"r_max": 2.6, "oer_max":2.5, "pbc": True} eigenstatus = bcal.get_bands(data=stru_data, - kpath_kwargs=kpath_kwargs, - AtomicData_options=AtomicData_options) - - expected_bands =np.array([[-20.259584 , -8.328452 , -8.328452 , -8.328451 , -5.782879 , -5.782879 , -5.7828774 , -4.800206 , -0.8470682 , -0.8470663 , 4.9619126 , 4.961913 , 4.9619136 , 6.4527135 , 6.452714 , 6.452715 , 10.1427765 , 10.142781 ], - [-19.173727 , -11.876228 , -10.340221 , -10.34022 , -6.861969 , -4.9920564 , -2.1901789 , -2.1901765 , -0.9258757 , 0.76235735, 4.2745295 , 4.2745323 , 4.990632 , 5.55916 , 5.559161 , 8.533346 , 8.716906 , 11.661528 ], - [-16.172304 , -16.172298 , -11.271987 , -11.271983 , -7.4252186 , -7.4252176 , 2.1354833 , 2.135485 , 2.4157436 , 2.4157462 , 2.7901921 , 2.7901928 , 3.6496053 , 3.649607 , 4.6478515 , 4.6478524 , 11.951376 , 11.951382 ], - [-16.322428 , -15.988458 , -11.912281 , -11.193047 , -7.3037252 , -6.193884 , 1.205529 , 1.386399 , 1.6548665 , 1.8747401 , 2.580269 , 3.005812 , 3.4153423 , 4.022218 , 5.4699235 , 6.23605 , 11.671546 , 11.832637 ], - [-16.799667 , -15.46194 , -12.612725 , -10.942198 , -6.9641047 , -3.7625234 , -0.7360446 , 0.28918347, 0.47772366, 0.6291326 , 2.4882295 , 3.1617444 , 4.0417986 , 4.6302714 , 6.5749364 , 8.062847 , 10.855666 , 11.509191 ], - [-16.799667 , -15.461945 , -12.612727 , -10.9422035 , -6.9641085 , -3.7625222 , -0.73604566, 0.28918162, 0.4777242 , 0.62913096, 2.4882276 , 3.1617427 , 4.041798 , 4.6302724 , 6.5749335 , 8.062847 , 10.855668 , 11.509187 ], - [-19.12568 , -12.3842125 , -11.161121 , -9.196095 , -5.6751695 , -4.8814125 , -3.031833 , -2.0943422 , -2.0460339 , 0.7482071 , 3.5014281 , 4.8715053 , 5.2672033 , 5.640518 , 6.8847284 , 7.1940207 , 10.2244625 , 10.705325 ], - [-20.259584 , -8.328452 , -8.328452 , -8.328451 , -5.782879 , -5.782879 , -5.7828774 , -4.800206 , -0.8470682 , -0.8470663 , 4.9619126 , 4.961913 , 4.9619136 , 6.4527135 , 6.452714 , 6.452715 , 10.1427765 , 10.142781 ], - [-19.503462 , -12.068741 , -9.1723 , -9.172297 , -6.1124167 , -4.959279 , -4.959278 , -1.1632957 , -1.1632944 , -1.1617142 , 4.8985996 , 5.257441 , 5.257443 , 6.191231 , 6.2036867 , 6.203688 , 10.432747 , 10.432751 ], - [-18.410772 , -14.457038 , -9.623036 , -9.623032 , -6.8522253 , -5.3134403 , -5.3134394 , 0.34697238, 0.3469742 , 1.5420008 , 3.4220562 , 3.4220574 , 5.17151 , 5.250026 , 7.019237 , 7.0192394 , 10.747205 , 10.747212 ], - [-17.752392 , -14.654745 , -11.930272 , -10.688241 , -5.6049733 , -4.517258 , -2.4019077 , -0.54922515, -0.42735893, 1.6003915 , 2.3744426 , 3.288959 , 4.6278877 , 4.90705 , 7.08742 , 9.220286 , 9.723419 , 11.138031 ], - [-16.101318 , -16.101318 , -12.243194 , -12.243191 , -3.945867 , -3.9458647 , -2.42533 , -2.4253287 , 2.3399496 , 2.3399508 , 2.8937058 , 2.893708 , 3.2351081 , 3.235109 , 7.9230847 , 7.9230857 , 11.04461 , 11.044615 ], - [-16.138231 , -16.138226 , -11.826924 , -11.826924 , -6.087353 , -6.087353 , 0.08484415, 0.08484493, 2.342462 , 2.3424625 , 2.8806267 , 2.8806279 , 3.2753062 , 3.2753084 , 6.610969 , 6.6109715 , 11.579055 , 11.579056 ], - [-16.172304 , -16.172298 , -11.271987 , -11.271983 , -7.4252186 , -7.4252176 , 2.1354833 , 2.135485 , 2.4157436 , 2.4157462 , 2.7901921 , 2.7901928 , 3.6496053 , 3.649607 , 4.6478515 , 4.6478524 , 11.951376 , 11.951382 ]]) - + kpath_kwargs=kpath_kwargs) + expected_bands = np.array([[-28.032394 , -12.518021 , -8.789028 , -8.789027 , + -8.78902 , -6.074078 , -6.074069 , -6.0740604 , + 17.192019 , 17.192028 , 22.030336 , 22.030338 , + 22.03035 , 23.343376 , 23.343376 , 23.343384 , + 28.18668 , 28.186697 ], + [-26.710665 , -17.258825 , -11.786415 , -11.786402 , + -6.316819 , -6.08972 , -2.2474113 , -2.2474105 , + 15.599638 , 18.773561 , 20.637032 , 21.751331 , + 21.751333 , 22.788795 , 22.788813 , 26.043669 , + 26.558607 , 29.842487 ], + [-22.908417 , -22.90841 , -13.267318 , -13.267316 , + -5.855864 , -5.8558598 , 0.13847035, 0.13847637, + 17.0159 , 17.0159 , 21.383863 , 21.383865 , + 22.246996 , 22.247007 , 22.64281 , 22.642822 , + 29.825714 , 29.825722 ], + [-23.125595 , -22.677975 , -13.552594 , -13.126421 , + -6.040592 , -5.239112 , -0.16200367, 0.15783598, + 17.022974 , 17.076164 , 20.278925 , 21.015097 , + 21.579382 , 22.268646 , 23.596603 , 24.191101 , + 29.491728 , 29.689163 ], + [-23.748362 , -21.997149 , -13.956201 , -12.712631 , + -6.524768 , -3.9821868 , -0.98925126, 0.1548973 , + 17.227066 , 17.242361 , 18.778227 , 20.15013 , + 22.017757 , 22.306322 , 24.653385 , 25.92878 , + 28.555614 , 29.325285 ], + [-23.748354 , -21.997162 , -13.956195 , -12.712616 , + -6.5247726 , -3.9821932 , -0.98925066, 0.15489526, + 17.22706 , 17.242352 , 18.778234 , 20.150133 , + 22.017756 , 22.306314 , 24.653393 , 25.928793 , + 28.555605 , 29.325268 ], + [-26.629864 , -17.600563 , -12.377507 , -10.340946 , + -8.252066 , -4.5056643 , -3.1107721 , -1.5953344 , + 16.209995 , 17.483477 , 20.519865 , 21.010235 , + 22.459747 , 22.790142 , 24.399433 , 24.6775 , + 28.152231 , 28.817282 ], + [-28.032394 , -12.518021 , -8.789028 , -8.789027 , + -8.78902 , -6.074078 , -6.074069 , -6.0740604 , + 17.192019 , 17.192028 , 22.030336 , 22.030338 , + 22.03035 , 23.343376 , 23.343376 , 23.343384 , + 28.18668 , 28.186697 ], + [-27.095016 , -16.587624 , -10.282119 , -10.282109 , + -9.392605 , -4.47474 , -4.4747334 , -2.0351746 , + 16.790812 , 16.79082 , 21.469982 , 21.469984 , + 22.261318 , 23.112501 , 23.889814 , 23.889832 , + 28.476255 , 28.476261 ], + [-25.650513 , -19.811338 , -11.168917 , -11.168911 , + -9.854099 , -3.526547 , -3.5265448 , 0.52536994, + 17.867775 , 17.86778 , 18.799477 , 18.799482 , + 22.678572 , 22.67859 , 25.41526 , 25.415262 , + 28.463633 , 28.463642 ], + [-24.895058 , -20.650934 , -13.44941 , -12.120061 , + -7.257396 , -3.5902717 , -2.117014 , 0.15689819, + 17.095425 , 17.784517 , 18.656044 , 19.36713 , + 22.366032 , 22.408947 , 25.288326 , 26.88247 , + 27.520784 , 28.909798 ], + [-22.888115 , -22.888107 , -13.577753 , -13.577752 , + -5.001314 , -5.0013084 , -0.38720337, -0.38719827, + 17.119455 , 17.11947 , 19.495407 , 19.495422 , + 21.823872 , 21.823875 , 25.932095 , 25.9321 , + 28.705719 , 28.705719 ], + [-22.898304 , -22.898302 , -13.427348 , -13.427342 , + -5.4427934 , -5.442793 , -0.10512064, -0.10511683, + 17.060398 , 17.060402 , 20.222359 , 20.222364 , + 21.842312 , 21.842323 , 24.5921 , 24.5921 , + 29.378563 , 29.378567 ], + [-22.908417 , -22.90841 , -13.267318 , -13.267316 , + -5.855864 , -5.8558598 , 0.13847035, 0.13847637, + 17.0159 , 17.0159 , 21.383863 , 21.383865 , + 22.246996 , 22.247007 , 22.64281 , 22.642822 , + 29.825714 , 29.825722 ]]) assert np.allclose(eigenstatus["eigenvalues"], expected_bands, atol=1e-4) \ No newline at end of file diff --git a/dptb/tests/test_from_v2json.py b/dptb/tests/test_from_v2json.py index 172e04d7..b4dbd885 100644 --- a/dptb/tests/test_from_v2json.py +++ b/dptb/tests/test_from_v2json.py @@ -42,27 +42,94 @@ def test_bands(self): device=model.device) stru_data = f"{rootdir}/json_model/AlAs.vasp" - AtomicData_options = {"r_max": 5.2, "pbc": True} eigenstatus = bcal.get_bands(data=stru_data, - kpath_kwargs=kpath_kwargs, - AtomicData_options=AtomicData_options) + kpath_kwargs=kpath_kwargs) - expected_bands =np.array([[-2.48727150e+01, -1.29382324e+01, -1.29382257e+01, -1.29382229e+01, -1.10868120e+01, -8.07862854e+00, -8.07862568e+00, -8.07861805e+00, 9.56408596e+00, 9.56408691e+00, 1.25271873e+01, 1.25271950e+01, 1.25271978e+01, 4.23655891e+01, 4.23656044e+01, 4.32170753e+01, 4.32170792e+01, 4.32170868e+01], - [-2.41187267e+01, -1.61148472e+01, -1.42793083e+01, -1.42793045e+01, -1.03604565e+01, -8.68612957e+00, -5.90628624e+00, -5.90628576e+00, 2.25617599e+00, 5.51729870e+00, 5.51730347e+00, 5.61441135e+00, 5.90860081e+00, 2.50449829e+01, 2.82622643e+01, 2.82622776e+01, 2.84239502e+01, 3.07470131e+01], - [-2.29336300e+01, -1.85238571e+01, -1.51972685e+01, -1.51972666e+01, -1.13513584e+01, -1.05228834e+01, -2.21334386e+00, -2.21334243e+00, -3.03742558e-01, -3.03741843e-01, -9.65526607e-03, 8.24528575e-01, 1.84810734e+00, 7.89270067e+00, 1.01749058e+01, 1.01749077e+01, 1.34912348e+01, 1.40874834e+01], - [-2.29474239e+01, -1.84172096e+01, -1.56978197e+01, -1.50829716e+01, -1.10063257e+01, -9.69069576e+00, -2.91590619e+00, -2.64113235e+00, -1.43450952e+00, -4.38025206e-01, 1.01333761e+00, 1.07858098e+00, 3.61593747e+00, 7.17037296e+00, 9.29849529e+00, 1.00337200e+01, 1.38197346e+01, 1.42732258e+01], - [-2.30109138e+01, -1.81435585e+01, -1.63736401e+01, -1.47889500e+01, -1.06536665e+01, -7.59100485e+00, -4.40897274e+00, -4.01978016e+00, -1.59141457e+00, -8.14805627e-02, 1.07713044e+00, 2.36757493e+00, 6.39950705e+00, 6.44096851e+00, 8.05662537e+00, 1.10570469e+01, 1.42302742e+01, 1.53123789e+01], - [-2.30108986e+01, -1.81435699e+01, -1.63736362e+01, -1.47889528e+01, -1.06536646e+01, -7.59101057e+00, -4.40896845e+00, -4.01978016e+00, -1.59141552e+00, -8.14811662e-02, 1.07712996e+00, 2.36757469e+00, 6.39950800e+00, 6.44096851e+00, 8.05662632e+00, 1.10570469e+01, 1.42302704e+01, 1.53123856e+01], - [-2.40611782e+01, -1.67647114e+01, -1.50329933e+01, -1.34557276e+01, -9.01750469e+00, -7.44570971e+00, -7.16721439e+00, -6.34023905e+00, 2.99699736e+00, 3.46649384e+00, 4.46376228e+00, 5.20905399e+00, 7.82006931e+00, 2.53436356e+01, 2.59452019e+01, 2.75783978e+01, 2.84669800e+01, 2.92158451e+01], - [-2.48727150e+01, -1.29382324e+01, -1.29382257e+01, -1.29382229e+01, -1.10868120e+01, -8.07862854e+00, -8.07862568e+00, -8.07861805e+00, 9.56408596e+00, 9.56408691e+00, 1.25271873e+01, 1.25271950e+01, 1.25271978e+01, 4.23655891e+01, 4.23656044e+01, 4.32170753e+01, 4.32170792e+01, 4.32170868e+01], - [-2.43790150e+01, -1.64551792e+01, -1.34435387e+01, -1.34435349e+01, -1.03514795e+01, -7.39460945e+00, -7.39460516e+00, -6.10483932e+00, 4.67000580e+00, 4.67000914e+00, 6.74771929e+00, 6.74772310e+00, 9.39733410e+00, 3.10563354e+01, 3.10563450e+01, 3.17371826e+01, 3.17371864e+01, 3.35946846e+01], - [-2.35396881e+01, -1.85059109e+01, -1.37993116e+01, -1.37993116e+01, -1.08380241e+01, -7.56033421e+00, -7.56033087e+00, -3.32421374e+00, -4.98459250e-01, -4.98458147e-01, 4.68962049e+00, 4.68962288e+00, 7.64235640e+00, 1.68248940e+01, 1.68248997e+01, 2.04327011e+01, 2.04327030e+01, 2.12005653e+01], - [-2.31961079e+01, -1.82634125e+01, -1.56346197e+01, -1.44923830e+01, -9.23417282e+00, -7.92826271e+00, -5.95008469e+00, -4.99026012e+00, -1.32351279e+00, -5.01590669e-01, 2.95195317e+00, 4.62497950e+00, 5.44099808e+00, 1.17575951e+01, 1.19310246e+01, 1.50337820e+01, 1.79441051e+01, 1.80985184e+01], - [-2.29424934e+01, -1.80575047e+01, -1.62370167e+01, -1.56745434e+01, -8.23033428e+00, -7.16741085e+00, -6.62496185e+00, -5.73856449e+00, -1.48688376e+00, 1.80971527e+00, 2.45554900e+00, 3.85232139e+00, 4.23087120e+00, 5.92445564e+00, 6.44421244e+00, 8.21325207e+00, 1.44543571e+01, 1.44987440e+01], - [-2.29404392e+01, -1.83383312e+01, -1.57138681e+01, -1.54623451e+01, -1.01436739e+01, -9.37874889e+00, -4.06893778e+00, -3.25271797e+00, -1.23538244e+00, -4.17988628e-01, 1.19791162e+00, 2.69611549e+00, 3.94141436e+00, 6.43033361e+00, 8.37113857e+00, 9.67157173e+00, 1.41308174e+01, 1.42368813e+01], - [-2.29336300e+01, -1.85238571e+01, -1.51972685e+01, -1.51972666e+01, -1.13513584e+01, -1.05228834e+01, -2.21334386e+00, -2.21334243e+00, -3.03742558e-01, -3.03741843e-01, -9.65526607e-03, 8.24528575e-01, 1.84810734e+00, 7.89270067e+00, 1.01749058e+01, 1.01749077e+01, 1.34912348e+01, 1.40874834e+01]]) - + expected_bands =np.array([[-2.48738842e+01, -1.29387579e+01, -1.29387531e+01, + -1.29387484e+01, -1.10866852e+01, -8.07882595e+00, + -8.07881832e+00, -8.07881737e+00, 9.56978989e+00, + 9.56979179e+00, 1.25314865e+01, 1.25314980e+01, + 1.25315008e+01, 4.23717499e+01, 4.23717537e+01, + 4.32215462e+01, 4.32215538e+01, 4.32215614e+01], + [-2.41191730e+01, -1.61150684e+01, -1.42791767e+01, + -1.42791719e+01, -1.03606348e+01, -8.68642616e+00, + -5.90601444e+00, -5.90600967e+00, 2.25788760e+00, + 5.51916361e+00, 5.51916647e+00, 5.61485243e+00, + 5.91050625e+00, 2.50469570e+01, 2.82641335e+01, + 2.82641392e+01, 2.84246483e+01, 3.07487679e+01], + [-2.29339600e+01, -1.85236092e+01, -1.51975479e+01, + -1.51975431e+01, -1.13508320e+01, -1.05211630e+01, + -2.21044850e+00, -2.21044683e+00, -3.01877409e-01, + -3.01874220e-01, -5.50282327e-03, 8.32842171e-01, + 1.85165548e+00, 7.89621782e+00, 1.01784697e+01, + 1.01784744e+01, 1.34970484e+01, 1.40907288e+01], + [-2.29477081e+01, -1.84168339e+01, -1.56979408e+01, + -1.50834084e+01, -1.10056238e+01, -9.68981457e+00, + -2.91448879e+00, -2.63903880e+00, -1.43107760e+00, + -4.35178548e-01, 1.01621652e+00, 1.08422828e+00, + 3.61865139e+00, 7.17336273e+00, 9.30155849e+00, + 1.00361338e+01, 1.38237772e+01, 1.42762747e+01], + [-2.30109749e+01, -1.81430511e+01, -1.63737125e+01, + -1.47896776e+01, -1.06530704e+01, -7.59097767e+00, + -4.40895557e+00, -4.01798630e+00, -1.59009695e+00, + -8.00317004e-02, 1.07963777e+00, 2.36884308e+00, + 6.40078640e+00, 6.44294930e+00, 8.05769444e+00, + 1.10569324e+01, 1.42315102e+01, 1.53139381e+01], + [-2.30109730e+01, -1.81430492e+01, -1.63737125e+01, + -1.47896767e+01, -1.06530619e+01, -7.59097576e+00, + -4.40895939e+00, -4.01798677e+00, -1.59010005e+00, + -8.00331011e-02, 1.07963753e+00, 2.36884212e+00, + 6.40078783e+00, 6.44294262e+00, 8.05769157e+00, + 1.10569296e+01, 1.42315063e+01, 1.53139343e+01], + [-2.40614185e+01, -1.67648468e+01, -1.50328369e+01, + -1.34554472e+01, -9.01719761e+00, -7.44597864e+00, + -7.16829062e+00, -6.34035254e+00, 2.99600887e+00, + 3.46569014e+00, 4.46293497e+00, 5.20906973e+00, + 7.81929064e+00, 2.53426857e+01, 2.59447289e+01, + 2.75785408e+01, 2.84667950e+01, 2.92152786e+01], + [-2.48738842e+01, -1.29387579e+01, -1.29387531e+01, + -1.29387484e+01, -1.10866852e+01, -8.07882595e+00, + -8.07881832e+00, -8.07881737e+00, 9.56978989e+00, + 9.56979179e+00, 1.25314865e+01, 1.25314980e+01, + 1.25315008e+01, 4.23717499e+01, 4.23717537e+01, + 4.32215462e+01, 4.32215538e+01, 4.32215614e+01], + [-2.43795700e+01, -1.64551907e+01, -1.34434357e+01, + -1.34434280e+01, -1.03514872e+01, -7.39513445e+00, + -7.39513063e+00, -6.10492849e+00, 4.66958141e+00, + 4.66959238e+00, 6.74782705e+00, 6.74782896e+00, + 9.39744949e+00, 3.10566292e+01, 3.10566330e+01, + 3.17376080e+01, 3.17376156e+01, 3.35952110e+01], + [-2.35389977e+01, -1.85056343e+01, -1.37990303e+01, + -1.37990227e+01, -1.08380346e+01, -7.56264687e+00, + -7.56264400e+00, -3.32416415e+00, -5.02199292e-01, + -5.02196670e-01, 4.68519068e+00, 4.68519211e+00, + 7.63819790e+00, 1.68208370e+01, 1.68208504e+01, + 2.04270325e+01, 2.04270401e+01, 2.11967201e+01], + [-2.31957893e+01, -1.82630310e+01, -1.56345882e+01, + -1.44928350e+01, -9.23434162e+00, -7.92852402e+00, + -5.95022917e+00, -4.99064732e+00, -1.32462871e+00, + -5.02915382e-01, 2.95047784e+00, 4.62426805e+00, + 5.43929529e+00, 1.17566347e+01, 1.19293985e+01, + 1.50316639e+01, 1.79418583e+01, 1.80968723e+01], + [-2.29426270e+01, -1.80574532e+01, -1.62369022e+01, + -1.56748543e+01, -8.22931576e+00, -7.16701651e+00, + -6.62407303e+00, -5.73891783e+00, -1.48577607e+00, + 1.81063569e+00, 2.45844960e+00, 3.85335517e+00, + 4.23286629e+00, 5.92695141e+00, 6.44531107e+00, + 8.21370125e+00, 1.44566507e+01, 1.44983978e+01], + [-2.29406662e+01, -1.83379650e+01, -1.57140999e+01, + -1.54625340e+01, -1.01433325e+01, -9.37792110e+00, + -4.06694746e+00, -3.25191188e+00, -1.23258555e+00, + -4.15170372e-01, 1.20202124e+00, 2.69886231e+00, + 3.94393396e+00, 6.43281651e+00, 8.37365723e+00, + 9.67361927e+00, 1.41347656e+01, 1.42384768e+01], + [-2.29339600e+01, -1.85236092e+01, -1.51975479e+01, + -1.51975431e+01, -1.13508320e+01, -1.05211630e+01, + -2.21044850e+00, -2.21044683e+00, -3.01877409e-01, + -3.01874220e-01, -5.50282327e-03, 8.32842171e-01, + 1.85165548e+00, 7.89621782e+00, 1.01784697e+01, + 1.01784744e+01, 1.34970484e+01, 1.40907288e+01]], dtype=np.float32) assert np.allclose(eigenstatus["eigenvalues"], expected_bands, atol=1e-4) @@ -99,25 +166,79 @@ def test_bands(self): device=model.device) stru_data = f"{rootdir}/json_model/silicon.vasp" - AtomicData_options = {"r_max": 2.6, "oer_max":2.5, "pbc": True} + AtomicData_options = {"r_max": 2.6, "oer_max":2.5} eigenstatus = bcal.get_bands(data=stru_data, - kpath_kwargs=kpath_kwargs, - AtomicData_options=AtomicData_options) + kpath_kwargs=kpath_kwargs) - expected_bands =np.array([[-20.259584 , -8.328452 , -8.328452 , -8.328451 , -5.782879 , -5.782879 , -5.7828774 , -4.800206 , -0.8470682 , -0.8470663 , 4.9619126 , 4.961913 , 4.9619136 , 6.4527135 , 6.452714 , 6.452715 , 10.1427765 , 10.142781 ], - [-19.173727 , -11.876228 , -10.340221 , -10.34022 , -6.861969 , -4.9920564 , -2.1901789 , -2.1901765 , -0.9258757 , 0.76235735, 4.2745295 , 4.2745323 , 4.990632 , 5.55916 , 5.559161 , 8.533346 , 8.716906 , 11.661528 ], - [-16.172304 , -16.172298 , -11.271987 , -11.271983 , -7.4252186 , -7.4252176 , 2.1354833 , 2.135485 , 2.4157436 , 2.4157462 , 2.7901921 , 2.7901928 , 3.6496053 , 3.649607 , 4.6478515 , 4.6478524 , 11.951376 , 11.951382 ], - [-16.322428 , -15.988458 , -11.912281 , -11.193047 , -7.3037252 , -6.193884 , 1.205529 , 1.386399 , 1.6548665 , 1.8747401 , 2.580269 , 3.005812 , 3.4153423 , 4.022218 , 5.4699235 , 6.23605 , 11.671546 , 11.832637 ], - [-16.799667 , -15.46194 , -12.612725 , -10.942198 , -6.9641047 , -3.7625234 , -0.7360446 , 0.28918347, 0.47772366, 0.6291326 , 2.4882295 , 3.1617444 , 4.0417986 , 4.6302714 , 6.5749364 , 8.062847 , 10.855666 , 11.509191 ], - [-16.799667 , -15.461945 , -12.612727 , -10.9422035 , -6.9641085 , -3.7625222 , -0.73604566, 0.28918162, 0.4777242 , 0.62913096, 2.4882276 , 3.1617427 , 4.041798 , 4.6302724 , 6.5749335 , 8.062847 , 10.855668 , 11.509187 ], - [-19.12568 , -12.3842125 , -11.161121 , -9.196095 , -5.6751695 , -4.8814125 , -3.031833 , -2.0943422 , -2.0460339 , 0.7482071 , 3.5014281 , 4.8715053 , 5.2672033 , 5.640518 , 6.8847284 , 7.1940207 , 10.2244625 , 10.705325 ], - [-20.259584 , -8.328452 , -8.328452 , -8.328451 , -5.782879 , -5.782879 , -5.7828774 , -4.800206 , -0.8470682 , -0.8470663 , 4.9619126 , 4.961913 , 4.9619136 , 6.4527135 , 6.452714 , 6.452715 , 10.1427765 , 10.142781 ], - [-19.503462 , -12.068741 , -9.1723 , -9.172297 , -6.1124167 , -4.959279 , -4.959278 , -1.1632957 , -1.1632944 , -1.1617142 , 4.8985996 , 5.257441 , 5.257443 , 6.191231 , 6.2036867 , 6.203688 , 10.432747 , 10.432751 ], - [-18.410772 , -14.457038 , -9.623036 , -9.623032 , -6.8522253 , -5.3134403 , -5.3134394 , 0.34697238, 0.3469742 , 1.5420008 , 3.4220562 , 3.4220574 , 5.17151 , 5.250026 , 7.019237 , 7.0192394 , 10.747205 , 10.747212 ], - [-17.752392 , -14.654745 , -11.930272 , -10.688241 , -5.6049733 , -4.517258 , -2.4019077 , -0.54922515, -0.42735893, 1.6003915 , 2.3744426 , 3.288959 , 4.6278877 , 4.90705 , 7.08742 , 9.220286 , 9.723419 , 11.138031 ], - [-16.101318 , -16.101318 , -12.243194 , -12.243191 , -3.945867 , -3.9458647 , -2.42533 , -2.4253287 , 2.3399496 , 2.3399508 , 2.8937058 , 2.893708 , 3.2351081 , 3.235109 , 7.9230847 , 7.9230857 , 11.04461 , 11.044615 ], - [-16.138231 , -16.138226 , -11.826924 , -11.826924 , -6.087353 , -6.087353 , 0.08484415, 0.08484493, 2.342462 , 2.3424625 , 2.8806267 , 2.8806279 , 3.2753062 , 3.2753084 , 6.610969 , 6.6109715 , 11.579055 , 11.579056 ], - [-16.172304 , -16.172298 , -11.271987 , -11.271983 , -7.4252186 , -7.4252176 , 2.1354833 , 2.135485 , 2.4157436 , 2.4157462 , 2.7901921 , 2.7901928 , 3.6496053 , 3.649607 , 4.6478515 , 4.6478524 , 11.951376 , 11.951382 ]]) - + expected_bands =np.array([[-28.032394 , -12.518021 , -8.789028 , -8.789027 , + -8.78902 , -6.074078 , -6.074069 , -6.0740604 , + 17.192019 , 17.192028 , 22.030336 , 22.030338 , + 22.03035 , 23.343376 , 23.343376 , 23.343384 , + 28.18668 , 28.186697 ], + [-26.710665 , -17.258825 , -11.786415 , -11.786402 , + -6.316819 , -6.08972 , -2.2474113 , -2.2474105 , + 15.599638 , 18.773561 , 20.637032 , 21.751331 , + 21.751333 , 22.788795 , 22.788813 , 26.043669 , + 26.558607 , 29.842487 ], + [-22.908417 , -22.90841 , -13.267318 , -13.267316 , + -5.855864 , -5.8558598 , 0.13847035, 0.13847637, + 17.0159 , 17.0159 , 21.383863 , 21.383865 , + 22.246996 , 22.247007 , 22.64281 , 22.642822 , + 29.825714 , 29.825722 ], + [-23.125595 , -22.677975 , -13.552594 , -13.126421 , + -6.040592 , -5.239112 , -0.16200367, 0.15783598, + 17.022974 , 17.076164 , 20.278925 , 21.015097 , + 21.579382 , 22.268646 , 23.596603 , 24.191101 , + 29.491728 , 29.689163 ], + [-23.748362 , -21.997149 , -13.956201 , -12.712631 , + -6.524768 , -3.9821868 , -0.98925126, 0.1548973 , + 17.227066 , 17.242361 , 18.778227 , 20.15013 , + 22.017757 , 22.306322 , 24.653385 , 25.92878 , + 28.555614 , 29.325285 ], + [-23.748354 , -21.997162 , -13.956195 , -12.712616 , + -6.5247726 , -3.9821932 , -0.98925066, 0.15489526, + 17.22706 , 17.242352 , 18.778234 , 20.150133 , + 22.017756 , 22.306314 , 24.653393 , 25.928793 , + 28.555605 , 29.325268 ], + [-26.629864 , -17.600563 , -12.377507 , -10.340946 , + -8.252066 , -4.5056643 , -3.1107721 , -1.5953344 , + 16.209995 , 17.483477 , 20.519865 , 21.010235 , + 22.459747 , 22.790142 , 24.399433 , 24.6775 , + 28.152231 , 28.817282 ], + [-28.032394 , -12.518021 , -8.789028 , -8.789027 , + -8.78902 , -6.074078 , -6.074069 , -6.0740604 , + 17.192019 , 17.192028 , 22.030336 , 22.030338 , + 22.03035 , 23.343376 , 23.343376 , 23.343384 , + 28.18668 , 28.186697 ], + [-27.095016 , -16.587624 , -10.282119 , -10.282109 , + -9.392605 , -4.47474 , -4.4747334 , -2.0351746 , + 16.790812 , 16.79082 , 21.469982 , 21.469984 , + 22.261318 , 23.112501 , 23.889814 , 23.889832 , + 28.476255 , 28.476261 ], + [-25.650513 , -19.811338 , -11.168917 , -11.168911 , + -9.854099 , -3.526547 , -3.5265448 , 0.52536994, + 17.867775 , 17.86778 , 18.799477 , 18.799482 , + 22.678572 , 22.67859 , 25.41526 , 25.415262 , + 28.463633 , 28.463642 ], + [-24.895058 , -20.650934 , -13.44941 , -12.120061 , + -7.257396 , -3.5902717 , -2.117014 , 0.15689819, + 17.095425 , 17.784517 , 18.656044 , 19.36713 , + 22.366032 , 22.408947 , 25.288326 , 26.88247 , + 27.520784 , 28.909798 ], + [-22.888115 , -22.888107 , -13.577753 , -13.577752 , + -5.001314 , -5.0013084 , -0.38720337, -0.38719827, + 17.119455 , 17.11947 , 19.495407 , 19.495422 , + 21.823872 , 21.823875 , 25.932095 , 25.9321 , + 28.705719 , 28.705719 ], + [-22.898304 , -22.898302 , -13.427348 , -13.427342 , + -5.4427934 , -5.442793 , -0.10512064, -0.10511683, + 17.060398 , 17.060402 , 20.222359 , 20.222364 , + 21.842312 , 21.842323 , 24.5921 , 24.5921 , + 29.378563 , 29.378567 ], + [-22.908417 , -22.90841 , -13.267318 , -13.267316 , + -5.855864 , -5.8558598 , 0.13847035, 0.13847637, + 17.0159 , 17.0159 , 21.383863 , 21.383865 , + 22.246996 , 22.247007 , 22.64281 , 22.642822 , + 29.825714 , 29.825722 ]], dtype=np.float32) assert np.allclose(eigenstatus["eigenvalues"], expected_bands, atol=1e-4) \ No newline at end of file diff --git a/dptb/tests/test_get_fermi.py b/dptb/tests/test_get_fermi.py index cc0df8c0..51d55fd1 100644 --- a/dptb/tests/test_get_fermi.py +++ b/dptb/tests/test_get_fermi.py @@ -9,23 +9,16 @@ def test_get_fermi(): - ckpt = f"{rootdir}/test_get_fermi/nnsk.best.pth" + ckpt = f"{rootdir}/test_get_fermi/nnsk.best.pth" # 'hopping': {'method': 'poly2exp', 'rs': 5.0, 'w': 0.6}, stru_data = f"{rootdir}/test_get_fermi/PRIMCELL.vasp" model = build_model(checkpoint=ckpt) - AtomicData_options={ - "r_max": 5.50, - "pbc": True - } - - AtomicData_options = AtomicData_options nel_atom = {"Au":11} elec_cal = ElecStruCal(model=model,device='cpu') _, efermi =elec_cal.get_fermi_level(data=stru_data, nel_atom = nel_atom, - meshgrid=[30,30,30], - AtomicData_options=AtomicData_options) + meshgrid=[30,30,30]) - assert abs(efermi + 3.25725233554) < 1e-5 + assert abs(efermi + 3.194006085395813) < 1e-5 diff --git a/dptb/tests/test_multi_batch.py b/dptb/tests/test_multi_batch.py index 00bedb93..5f468b38 100644 --- a/dptb/tests/test_multi_batch.py +++ b/dptb/tests/test_multi_batch.py @@ -15,6 +15,9 @@ class TestMultiBatch: set_options = { + "r_max": 5.0, + "er_max": 5.0, + "oer_max": 2.5, "root": f"{rootdir}/test_sktb/dataset", "prefix": "kpathmd25", "get_eigenvalues": True, diff --git a/dptb/tests/test_nnsk.py b/dptb/tests/test_nnsk.py index 11f79517..ca5ded30 100644 --- a/dptb/tests/test_nnsk.py +++ b/dptb/tests/test_nnsk.py @@ -39,6 +39,9 @@ class TestNNSK: "push": None} } data_options = { + "r_max": 2.6, + "er_max": 2.6, + "oer_max":1.6, "train": { "root": f"{rootdir}/hBN/dataset", "prefix": "kpath", @@ -46,7 +49,7 @@ class TestNNSK: } } - train_datasets = build_dataset(**data_options["train"], **common_options) + train_datasets = build_dataset(**data_options, **data_options["train"], **common_options) train_loader = DataLoader(dataset=train_datasets, batch_size=1, shuffle=True) batch = next(iter(train_loader)) diff --git a/dptb/tests/test_nrl.py b/dptb/tests/test_nrl.py index def169ea..2c0a1d63 100644 --- a/dptb/tests/test_nrl.py +++ b/dptb/tests/test_nrl.py @@ -44,7 +44,7 @@ def test_nrl_json_band(): } stru_data = f"{rootdir}/json_model/silicon.vasp" - AtomicData_options = {"r_max": 5.0, "oer_max":6.6147151362875, "pbc": True} + AtomicData_options = {"r_max": 5.0, "oer_max":6.6147151362875} kpath_kwargs = jdata["task_options"] bcal = Band(model=model, use_gui=True, @@ -52,24 +52,64 @@ def test_nrl_json_band(): device=model.device) eigenstatus = bcal.get_bands(data=stru_data, - kpath_kwargs=kpath_kwargs, - AtomicData_options=AtomicData_options) - - expected_eigenvalues = np.array([[-6.1745434 , 5.282297 , 5.282303 , 5.2823052 , 8.658317 , 8.6583185 , 8.658324 , 9.862869 , 14.152446 , 14.152451 , 15.180438 , 15.180452 , 16.983887 , 16.983889 , 16.983896 , 23.09491 , 23.094921 , 23.094925 ], - [-5.5601606 , 2.1920488 , 3.4229636 , 3.4229672 , 7.347074 , 9.382092 , 11.1772175 , 11.177221 , 14.349099 , 14.924912 , 15.062427 , 15.064081 , 16.540335 , 16.54034 , 20.871534 , 20.871536 , 21.472364 , 28.740482 ], - [-2.556269 , -2.5562677 , 2.3915231 , 2.391524 , 6.4689007 , 6.468908 , 14.639398 , 14.6394005 , 14.734453 , 14.734456 , 14.747707 , 14.74771 , 15.57567 , 15.575676 , 17.403324 , 17.403334 , 38.39217 , 38.392174 ], - [-2.6333795 , -2.367625 , 1.6872846 , 2.5042236 , 6.6183453 , 7.9818068 , 13.933364 , 14.267717 , 14.706404 , 14.793142 , 14.841357 , 15.211192 , 15.578381 , 15.838447 , 17.168877 , 18.059359 , 35.321945 , 37.87687 ], - [-2.9967206 , -1.8161079 , 0.88636655, 2.829976 , 7.0469265 , 10.600885 , 12.648353 , 13.126463 , 14.653016 , 14.841116 , 15.541919 , 15.576077 , 16.276308 , 16.574654 , 17.213411 , 19.315798 , 28.62305 , 35.468586 ], - [-2.996724 , -1.8161156 , 0.88636786, 2.8299737 , 7.046927 , 10.600888 , 12.648361 , 13.126465 , 14.653028 , 14.841116 , 15.541907 , 15.5760765 , 16.276312 , 16.574644 , 17.21341 , 19.315798 , 28.623045 , 35.46858 ], - [-5.471941 , 1.5238439 , 2.5368657 , 4.577535 , 8.749301 , 9.402245 , 10.557684 , 11.247256 , 14.576941 , 14.75164 , 14.775435 , 15.122616 , 17.103615 , 17.840292 , 18.390976 , 22.68788 , 23.806395 , 24.265633 ], - [-6.1745434 , 5.282297 , 5.282303 , 5.2823052 , 8.658317 , 8.6583185 , 8.658324 , 9.862869 , 14.152446 , 14.152451 , 15.180438 , 15.180452 , 16.983887 , 16.983889 , 16.983896 , 23.09491 , 23.094921 , 23.094925 ], - [-5.749872 , 1.7248219 , 4.5455103 , 4.545513 , 8.227031 , 9.438793 , 9.4388 , 11.6675415 , 14.485937 , 14.485939 , 14.894153 , 14.894157 , 16.697474 , 16.697474 , 19.904425 , 23.02558 , 23.025585 , 23.831646 ], - [-4.44458 , -1.6045983 , 4.0464916 , 4.046497 , 7.2234683 , 9.777258 , 9.777259 , 14.115966 , 14.4775715 , 14.4775715 , 14.98191 , 14.9819145 , 16.346727 , 16.346727 , 18.716038 , 23.819721 , 23.819735 , 27.016748 ], - [-3.8950639 , -1.3644799 , 1.8130541 , 3.112887 , 8.6044655 , 9.8463125 , 11.3755455 , 12.709737 , 14.566758 , 14.910749 , 15.183235 , 15.717886 , 16.694214 , 17.240337 , 19.386671 , 21.171314 , 23.601032 , 29.806623 ], - [-2.3356187 , -2.3356178 , 1.3771206 , 1.3771234 , 10.240082 , 10.240085 , 12.212795 , 12.212798 , 14.746381 , 14.746386 , 15.778043 , 15.778048 , 15.790003 , 15.790005 , 18.402258 , 18.40226 , 31.99752 , 31.997526 ], - [-2.4508858 , -2.4508843 , 1.809629 , 1.809632 , 8.082377 , 8.082378 , 13.7137 , 13.713703 , 14.742302 , 14.742307 , 15.081548 , 15.081549 , 15.864478 , 15.864485 , 17.778458 , 17.77847 , 35.317 , 35.317005 ], - [-2.556269 , -2.5562677 , 2.3915231 , 2.391524 , 6.4689007 , 6.468908 , 14.639398 , 14.6394005 , 14.734453 , 14.734456 , 14.747707 , 14.74771 , 15.57567 , 15.575676 , 17.403324 , 17.403334 , 38.39217 , 38.392174 ]]) + kpath_kwargs=kpath_kwargs) + expected_eigenvalues = np.array([[-6.1741133 , 5.2992673 , 5.299269 , 5.2992706 , 8.679379 , + 8.67938 , 8.679387 , 9.836669 , 14.15181 , 14.151812 , + 15.179906 , 15.179909 , 17.065308 , 17.065311 , 17.065315 , + 23.384512 , 23.384514 , 23.384523 ], + [-5.5645704 , 2.1704118 , 3.4521012 , 3.4521055 , 7.330651 , + 9.427716 , 11.252065 , 11.252069 , 14.348874 , 14.904958 , + 15.063788 , 15.08024 , 16.522131 , 16.522133 , 20.978777 , + 20.97878 , 21.235731 , 28.363321 ], + [-2.554551 , -2.5545506 , 2.4126623 , 2.4126637 , 6.4693484 , + 6.46935 , 14.620965 , 14.620967 , 14.736008 , 14.736009 , + 14.747112 , 14.747118 , 15.574924 , 15.574924 , 17.599064 , + 17.599068 , 38.834724 , 38.83473 ], + [-2.6305206 , -2.3678906 , 1.7033997 , 2.5220068 , 6.6189265 , + 7.990758 , 13.693519 , 14.290318 , 14.706135 , 14.793065 , + 14.83984 , 15.134137 , 15.58144 , 15.826494 , 17.384142 , + 18.580969 , 35.741035 , 37.842724 ], + [-2.990186 , -1.8204781 , 0.89282584, 2.8375692 , 7.0482116 , + 10.63623 , 12.305137 , 13.244209 , 14.652864 , 14.841782 , + 15.511359 , 15.560423 , 16.049604 , 16.561003 , 17.382034 , + 20.065767 , 28.94485 , 34.8759 ], + [-2.9901865 , -1.8204774 , 0.8928198 , 2.8375793 , 7.0482135 , + 10.636231 , 12.305133 , 13.244207 , 14.65287 , 14.8417845 , + 15.51136 , 15.560425 , 16.049616 , 16.560993 , 17.38204 , + 20.065779 , 28.944853 , 34.8759 ], + [-5.47864 , 1.5369629 , 2.5553446 , 4.5224996 , 8.77259 , + 9.497431 , 10.579291 , 11.207781 , 14.566749 , 14.716702 , + 14.79304 , 15.098012 , 17.310905 , 17.856058 , 18.338556 , + 22.161259 , 23.587708 , 24.457659 ], + [-6.1741133 , 5.2992673 , 5.299269 , 5.2992706 , 8.679379 , + 8.67938 , 8.679387 , 9.836669 , 14.15181 , 14.151812 , + 15.179906 , 15.179909 , 17.065308 , 17.065311 , 17.065315 , + 23.384512 , 23.384514 , 23.384523 ], + [-5.7577815 , 1.7521204 , 4.532131 , 4.532138 , 8.251087 , + 9.490989 , 9.490992 , 11.636496 , 14.439946 , 14.439954 , + 14.857351 , 14.857357 , 16.893194 , 16.8932 , 19.772648 , + 22.80723 , 22.807241 , 23.869514 ], + [-4.443464 , -1.6066544 , 4.0123796 , 4.012383 , 7.202861 , + 9.727551 , 9.72756 , 13.991438 , 14.478059 , 14.478066 , + 14.982593 , 14.982594 , 16.354605 , 16.354612 , 18.78879 , + 23.787397 , 23.7874 , 27.123451 ], + [-3.8896487 , -1.3633558 , 1.791838 , 3.1084414 , 8.638544 , + 9.726504 , 11.305393 , 12.739989 , 14.571893 , 14.913423 , + 15.175632 , 15.675038 , 16.678635 , 17.124842 , 19.235235 , + 21.592587 , 24.378092 , 28.834328 ], + [-2.3344338 , -2.334433 , 1.3823981 , 1.3824005 , 10.204421 , + 10.204421 , 12.187885 , 12.187888 , 14.745355 , 14.745364 , + 15.736717 , 15.736728 , 15.787358 , 15.787364 , 18.632502 , + 18.632504 , 31.974377 , 31.974384 ], + [-2.449809 , -2.4498005 , 1.8228805 , 1.8228889 , 8.088991 , + 8.088991 , 13.572681 , 13.572683 , 14.7421055 , 14.742113 , + 15.033702 , 15.03371 , 15.825112 , 15.825113 , 18.229067 , + 18.229078 , 35.388714 , 35.388718 ], + [-2.554551 , -2.5545506 , 2.4126623 , 2.4126637 , 6.4693484 , + 6.46935 , 14.620965 , 14.620967 , 14.736008 , 14.736009 , + 14.747112 , 14.747118 , 15.574924 , 15.574924 , 17.599064 , + 17.599068 , 38.834724 , 38.83473 ]], dtype=np.float32) assert np.allclose(eigenstatus["eigenvalues"], expected_eigenvalues, atol=1e-4) diff --git a/dptb/tests/test_soc.py b/dptb/tests/test_soc.py index 9ca18220..c50d3974 100644 --- a/dptb/tests/test_soc.py +++ b/dptb/tests/test_soc.py @@ -43,148 +43,147 @@ def test_soc_json_band(): results_path='./', device=model.device) - stru_data = f"{rootdir}/Sn/soc/dataset/Sn.vasp" - AtomicData_options = {"r_max": 6.0, "oer_max":3.0, "pbc": True} - + stru_data = f"{rootdir}/Sn/soc/dataset/Sn.vasp" eigenstatus = bcal.get_bands(data=stru_data, - kpath_kwargs=kpath_kwargs, - AtomicData_options=AtomicData_options) + kpath_kwargs=kpath_kwargs) - expected_eigenvalues = np.array([[-18.796585 , -18.796577 , -8.796718 , -8.796717 , - -8.467822 , -8.46782 , -8.202273 , -8.202273 , - -8.202272 , -8.202268 , -6.520131 , -6.5201283 , - -5.6209826 , -5.6209826 , -5.6209803 , -5.620978 , - 1.1558133 , 1.1558162 , 1.1558177 , 1.1558225 , - 3.8549075 , 3.8549078 , 3.8549087 , 3.8549109 , - 10.136021 , 10.136023 , 10.439617 , 10.439617 , - 10.439621 , 10.439622 , 16.604067 , 16.60407 , - 16.604074 , 16.604078 , 16.60518 , 16.60518 ], - [-17.965763 , -17.965757 , -12.480173 , -12.480173 , - -10.082873 , -10.082871 , -10.001692 , -10.001686 , - -6.423237 , -6.423237 , -5.713276 , -5.713276 , - -3.4990137 , -3.4990127 , -3.2606316 , -3.260627 , - -1.2786437 , -1.278643 , -0.16114095, -0.16113918, - 2.7485087 , 2.7485092 , 2.9157577 , 2.9157612 , - 9.215347 , 9.215352 , 9.373201 , 9.373207 , - 13.123983 , 13.123989 , 14.268081 , 14.268081 , - 14.278081 , 14.278091 , 15.152899 , 15.1529045 ], - [-15.753845 , -15.753845 , -15.753841 , -15.753836 , - -11.016632 , -11.016631 , -11.016631 , -11.01663 , - -6.9324965 , -6.932495 , -6.932495 , -6.9324923 , - -0.52784276, -0.52784216, -0.52783954, -0.5278391 , - 0.07181728, 0.07181839, 0.07181882, 0.07181931, - 0.08202878, 0.08202914, 0.08203014, 0.08203081, - 6.5781436 , 6.5781474 , 6.5781474 , 6.578152 , - 12.591245 , 12.591249 , 12.591251 , 12.591253 , - 14.805855 , 14.805855 , 14.805863 , 14.805869 ], - [-15.858617 , -15.858613 , -15.649114 , -15.64911 , - -11.349122 , -11.34912 , -10.8918085 , -10.891806 , - -6.870063 , -6.8700614 , -6.157268 , -6.1572657 , - -1.2535331 , -1.253531 , -1.0800866 , -1.0800853 , - -0.28412414, -0.28412127, -0.22913142, -0.2291308 , - 0.43651295, 0.43651417, 0.61508846, 0.6150922 , - 6.995065 , 6.995071 , 7.036594 , 7.0365944 , - 11.637238 , 11.637241 , 12.705406 , 12.705407 , - 14.5028715 , 14.502877 , 15.520835 , 15.520839 ], - [-16.183804 , -16.183802 , -15.329778 , -15.329772 , - -11.730029 , -11.730025 , -10.597874 , -10.597873 , - -6.6675787 , -6.667575 , -4.5243273 , -4.524324 , - -2.293503 , -2.2935014 , -1.9981623 , -1.9981592 , - -1.0307596 , -1.0307531 , -0.8473131 , -0.847308 , - 0.8623935 , 0.86239386, 1.1516515 , 1.1516529 , - 7.940049 , 7.9400563 , 8.233609 , 8.23361 , - 10.271218 , 10.27122 , 13.005727 , 13.00573 , - 13.675878 , 13.675881 , 16.305794 , 16.3058 ], - [-16.336843 , -16.336843 , -15.167489 , -15.167487 , - -11.641985 , -11.641981 , -10.840412 , -10.840409 , - -5.5028615 , -5.502861 , -4.4378824 , -4.437881 , - -3.1876206 , -3.1876204 , -2.8593407 , -2.8593404 , - -1.0223196 , -1.0223194 , -0.03593016, -0.0359299 , - 0.5331634 , 0.53316516, 1.094498 , 1.0945 , - 8.331565 , 8.331567 , 9.181907 , 9.181908 , - 10.318527 , 10.31853 , 11.164237 , 11.16424 , - 14.783967 , 14.783967 , 16.183851 , 16.18386 ], - [-16.183802 , -16.183798 , -15.329779 , -15.329777 , - -11.730029 , -11.730021 , -10.597873 , -10.59787 , - -6.6675773 , -6.6675754 , -4.5243297 , -4.524327 , - -2.2935047 , -2.2935045 , -1.9981617 , -1.9981614 , - -1.0307611 , -1.0307586 , -0.84731257, -0.8473123 , - 0.86239225, 0.862393 , 1.1516463 , 1.1516486 , - 7.9400487 , 7.9400496 , 8.23361 , 8.233611 , - 10.27122 , 10.271224 , 13.005723 , 13.005732 , - 13.675874 , 13.675881 , 16.305796 , 16.305796 ], - [-17.900473 , -17.900473 , -12.844977 , -12.844976 , - -10.530397 , -10.530396 , -9.09718 , -9.097178 , - -6.7394004 , -6.739399 , -4.928301 , -4.9282985 , - -4.1416554 , -4.1416535 , -3.2446477 , -3.2446465 , - -1.2467662 , -1.2467624 , -0.16752447, -0.1675212 , - 2.0890796 , 2.0890806 , 2.8771484 , 2.87715 , - 10.350287 , 10.350292 , 10.554118 , 10.554125 , - 10.833848 , 10.833856 , 13.666271 , 13.666271 , - 14.696394 , 14.696395 , 15.524468 , 15.524472 ], - [-18.796585 , -18.796577 , -8.796718 , -8.796717 , - -8.467822 , -8.46782 , -8.202273 , -8.202273 , - -8.202272 , -8.202268 , -6.520131 , -6.5201283 , - -5.6209826 , -5.6209826 , -5.6209803 , -5.620978 , - 1.1558133 , 1.1558162 , 1.1558177 , 1.1558225 , - 3.8549075 , 3.8549078 , 3.8549087 , 3.8549109 , - 10.136021 , 10.136023 , 10.439617 , 10.439617 , - 10.439621 , 10.439622 , 16.604067 , 16.60407 , - 16.604074 , 16.604078 , 16.60518 , 16.60518 ], - [-18.186668 , -18.186663 , -12.287521 , -12.287515 , - -9.351741 , -9.351739 , -8.878574 , -8.878569 , - -7.6058683 , -7.6058674 , -5.154534 , -5.154529 , - -4.6624527 , -4.662451 , -3.4278681 , -3.427864 , - -0.41998848, -0.41998297, -0.4095187 , -0.40951777, - 2.9563828 , 2.9563835 , 2.9918096 , 2.9918125 , - 10.380918 , 10.380918 , 10.549788 , 10.549789 , - 11.232219 , 11.232219 , 14.940169 , 14.940175 , - 15.070571 , 15.070571 , 15.075499 , 15.0755005 ], - [-17.198385 , -17.19838 , -14.515316 , -14.515307 , - -9.862983 , -9.862981 , -9.357086 , -9.357084 , - -8.073727 , -8.073721 , -4.8036227 , -4.8036175 , - -4.4337177 , -4.4337125 , -1.1210939 , -1.1210878 , - 0.15520462, 0.15520588, 0.16363804, 0.16363822, - 0.24147274, 0.24147661, 0.41342714, 0.41343114, - 10.37974 , 10.379746 , 10.456181 , 10.456185 , - 10.552433 , 10.552438 , 13.742164 , 13.742164 , - 13.763256 , 13.763256 , 14.501388 , 14.501396 ], - [-16.80349 , -16.803486 , -14.751759 , -14.751757 , - -11.285735 , -11.285734 , -10.22461 , -10.224609 , - -6.24789 , -6.24789 , -4.6060047 , -4.6060038 , - -3.434149 , -3.4341471 , -2.2420568 , -2.2420552 , - -1.0955485 , -1.0955476 , -0.19254336, -0.19254316, - 0.6856604 , 0.68566144, 1.1567098 , 1.1567105 , - 9.163708 , 9.16371 , 9.635809 , 9.635814 , - 10.698371 , 10.698381 , 11.82481 , 11.82481 , - 13.985387 , 13.985389 , 16.133114 , 16.133121 ], - [-15.776018 , -15.776018 , -15.7288265 , -15.728823 , - -11.566163 , -11.566163 , -11.256174 , -11.256172 , - -4.9769745 , -4.9769716 , -4.5070167 , -4.5070157 , - -3.389411 , -3.3894083 , -3.2984304 , -3.2984302 , - 0.10734507, 0.10734744, 0.17103618, 0.17103752, - 0.26678348, 0.26678437, 0.40296242, 0.40296602, - 8.415588 , 8.415589 , 8.428018 , 8.428018 , - 10.579563 , 10.579564 , 10.626951 , 10.626951 , - 15.609341 , 15.6093445 , 15.68799 , 15.688002 ], - [-15.769385 , -15.769385 , -15.736303 , -15.736301 , - -11.354855 , -11.354855 , -11.111078 , -11.111077 , - -6.22072 , -6.2207155 , -5.98496 , -5.9849544 , - -1.8360822 , -1.8360817 , -1.750961 , -1.7509596 , - 0.07467235, 0.07467385, 0.08895914, 0.0889603 , - 0.30550689, 0.30550796, 0.39796725, 0.39797014, - 7.371509 , 7.371511 , 7.3771377 , 7.377142 , - 11.648639 , 11.648641 , 11.689653 , 11.689657 , - 15.269731 , 15.269734 , 15.337125 , 15.3371315 ], - [-15.753845 , -15.753845 , -15.753841 , -15.753836 , - -11.016632 , -11.016631 , -11.016631 , -11.01663 , - -6.9324965 , -6.932495 , -6.932495 , -6.9324923 , - -0.52784276, -0.52784216, -0.52783954, -0.5278391 , - 0.07181728, 0.07181839, 0.07181882, 0.07181931, - 0.08202878, 0.08202914, 0.08203014, 0.08203081, - 6.5781436 , 6.5781474 , 6.5781474 , 6.578152 , - 12.591245 , 12.591249 , 12.591251 , 12.591253 , - 14.805855 , 14.805855 , 14.805863 , 14.805869 ]]) + expected_eigenvalues = np.array([[-31.007423 , -31.007412 , -20.67866 , -20.67866 , + -7.1311283 , -7.1311274 , -6.2365704 , -6.236563 , + -6.2365613 , -6.236559 , -4.480998 , -4.4809933 , + -3.6357822 , -3.6357768 , -3.6357756 , -3.635771 , + 15.448533 , 15.448537 , 15.448545 , 15.448548 , + 18.147615 , 18.147623 , 18.147627 , 18.14763 , + 21.01311 , 21.013113 , 21.065922 , 21.065931 , + 21.065935 , 21.065937 , 32.408985 , 32.409 , + 32.412453 , 32.412453 , 32.41246 , 32.412476 ], + [-30.019188 , -30.019176 , -23.397747 , -23.397734 , + -8.958991 , -8.958984 , -8.785677 , -8.785676 , + -6.2776294 , -6.2776294 , -3.6961977 , -3.69619 , + -1.2760161 , -1.2760139 , -1.1798258 , -1.1798238 , + 13.354958 , 13.354959 , 14.130192 , 14.130194 , + 16.96592 , 16.965923 , 17.039839 , 17.03985 , + 21.02412 , 21.024126 , 21.045391 , 21.045391 , + 24.641224 , 24.641228 , 29.585321 , 29.585337 , + 29.58534 , 29.585346 , 30.32741 , 30.32742 ], + [-27.350065 , -27.35006 , -27.350042 , -27.350033 , + -10.221095 , -10.221094 , -10.221093 , -10.221088 , + -5.289955 , -5.2899523 , -5.289951 , -5.28995 , + 0.7171254 , 0.71712595, 0.71712595, 0.7171319 , + 14.130192 , 14.130204 , 14.130204 , 14.1302185 , + 14.374711 , 14.374722 , 14.374723 , 14.374728 , + 20.969217 , 20.969225 , 20.969225 , 20.96923 , + 26.569042 , 26.569044 , 26.569046 , 26.569054 , + 27.952032 , 27.952042 , 27.952045 , 27.952055 ], + [-27.49865 , -27.498644 , -27.19673 , -27.19673 , + -10.559897 , -10.55989 , -10.0144 , -10.014399 , + -5.4945364 , -5.494536 , -4.606873 , -4.606865 , + 0.3039738 , 0.30398044, 0.7527365 , 0.7527418 , + 13.917292 , 13.917292 , 14.088804 , 14.088809 , + 14.138776 , 14.138779 , 14.5281515 , 14.528152 , + 21.21819 , 21.218195 , 21.557903 , 21.557907 , + 25.775951 , 25.775955 , 26.720558 , 26.72057 , + 27.603914 , 27.603914 , 28.495499 , 28.495508 ], + [-27.919712 , -27.919712 , -26.734297 , -26.734297 , + -11.013819 , -11.013816 , -9.459296 , -9.459282 , + -5.9804435 , -5.980443 , -3.2812905 , -3.281289 , + -0.75303936, -0.75303817, 0.8340004 , 0.83400106, + 13.480661 , 13.480672 , 13.648575 , 13.64858 , + 14.139681 , 14.1396885 , 14.928459 , 14.928464 , + 21.759964 , 21.759964 , 23.02673 , 23.026749 , + 24.617811 , 24.61782 , 26.638662 , 26.638674 , + 27.167816 , 27.167816 , 29.041767 , 29.041769 ], + [-28.098797 , -28.098768 , -26.521578 , -26.521578 , + -10.925957 , -10.925954 , -9.719855 , -9.719849 , + -5.3289404 , -5.3289347 , -3.4857965 , -3.4857874 , + -0.8316949 , -0.8316835 , 0.6037956 , 0.60380006, + 13.456583 , 13.456588 , 13.499516 , 13.49952 , + 14.212908 , 14.212912 , 14.896738 , 14.896739 , + 22.213148 , 22.21315 , 23.82316 , 23.82316 , + 24.460823 , 24.460823 , 25.166416 , 25.166416 , + 28.172297 , 28.17231 , 28.86319 , 28.8632 ], + [-27.919712 , -27.919704 , -26.734303 , -26.7343 , + -11.01382 , -11.013814 , -9.459293 , -9.459288 , + -5.9804454 , -5.9804373 , -3.2812903 , -3.2812803 , + -0.7530421 , -0.7530401 , 0.8340004 , 0.8340021 , + 13.480662 , 13.480664 , 13.648575 , 13.648577 , + 14.139686 , 14.139686 , 14.928462 , 14.928464 , + 21.759954 , 21.759956 , 23.026733 , 23.02674 , + 24.617813 , 24.617823 , 26.638664 , 26.638676 , + 27.167807 , 27.167809 , 29.041767 , 29.041777 ], + [-29.944735 , -29.944721 , -23.561832 , -23.561829 , + -9.715744 , -9.715741 , -7.5436654 , -7.5436587 , + -6.1717205 , -6.1717124 , -4.739689 , -4.739689 , + -1.834329 , -1.8343287 , -0.03966267, -0.03966105, + 13.234669 , 13.234671 , 14.016897 , 14.016902 , + 16.121174 , 16.121176 , 16.95364 , 16.953648 , + 22.364038 , 22.364048 , 22.465113 , 22.465115 , + 23.00061 , 23.00061 , 29.137392 , 29.137402 , + 29.942379 , 29.942392 , 29.959831 , 29.959839 ], + [-31.007423 , -31.007412 , -20.67866 , -20.67866 , + -7.1311283 , -7.1311274 , -6.2365704 , -6.236563 , + -6.2365613 , -6.236559 , -4.480998 , -4.4809933 , + -3.6357822 , -3.6357768 , -3.6357756 , -3.635771 , + 15.448533 , 15.448537 , 15.448545 , 15.448548 , + 18.147615 , 18.147623 , 18.147627 , 18.14763 , + 21.01311 , 21.013113 , 21.065922 , 21.065931 , + 21.065935 , 21.065937 , 32.408985 , 32.409 , + 32.412453 , 32.412453 , 32.41246 , 32.412476 ], + [-30.286106 , -30.2861 , -22.779444 , -22.77944 , + -8.85198 , -8.851977 , -7.2529488 , -7.2529426 , + -6.6678324 , -6.6678243 , -3.990609 , -3.990604 , + -3.436167 , -3.4361634 , -0.08859432, -0.08859341, + 13.929121 , 13.929123 , 13.930216 , 13.93022 , + 17.052921 , 17.052929 , 17.060263 , 17.060268 , + 22.167538 , 22.167542 , 22.193502 , 22.193504 , + 22.477976 , 22.477985 , 30.144094 , 30.144098 , + 30.552849 , 30.552858 , 30.55339 , 30.553398 ], + [-29.173805 , -29.173784 , -25.033434 , -25.033417 , + -9.945103 , -9.945093 , -7.7411456 , -7.7411284 , + -7.1410484 , -7.141039 , -3.7853212 , -3.7853165 , + -3.2343507 , -3.23435 , 2.390824 , 2.390826 , + 13.766307 , 13.766312 , 13.78635 , 13.786352 , + 14.691134 , 14.691136 , 14.692142 , 14.692142 , + 23.275118 , 23.275133 , 23.289207 , 23.289211 , + 25.757067 , 25.757072 , 25.949417 , 25.949417 , + 28.67229 , 28.672306 , 28.672436 , 28.672441 ], + [-28.684181 , -28.684177 , -25.763704 , -25.7637 , + -10.81131 , -10.811302 , -8.742746 , -8.742743 , + -6.2349133 , -6.2349105 , -3.2419832 , -3.2419827 , + -1.9287543 , -1.9287531 , 1.3457793 , 1.3457811 , + 13.380306 , 13.380309 , 13.471299 , 13.471307 , + 14.535177 , 14.535184 , 15.065143 , 15.065147 , + 22.488743 , 22.488745 , 23.84412 , 23.844122 , + 24.985334 , 24.985338 , 25.403091 , 25.403091 , + 28.17821 , 28.178225 , 29.002228 , 29.002228 ], + [-27.351118 , -27.351114 , -27.341087 , -27.341082 , + -10.680595 , -10.680593 , -10.367012 , -10.367 , + -4.5969605 , -4.5969515 , -4.0144343 , -4.0144315 , + -0.15337452, -0.15337159, 0.09929406, 0.09930123, + 13.607671 , 13.607682 , 13.630874 , 13.630874 , + 14.311764 , 14.311765 , 14.321676 , 14.321679 , + 22.750446 , 22.75046 , 22.754383 , 22.754389 , + 24.868992 , 24.868992 , 24.869698 , 24.8697 , + 28.487803 , 28.487806 , 28.497576 , 28.497597 ], + [-27.351591 , -27.351583 , -27.344496 , -27.344492 , + -10.500957 , -10.500956 , -10.2600565 , -10.260055 , + -5.015775 , -5.0157743 , -4.6251984 , -4.625198 , + 0.30658934, 0.3065895 , 0.4448485 , 0.44485575, + 13.87227 , 13.872274 , 13.888172 , 13.888175 , + 14.319462 , 14.319463 , 14.325819 , 14.325821 , + 21.738235 , 21.738243 , 21.74036 , 21.74037 , + 25.797703 , 25.797709 , 25.79885 , 25.798855 , + 28.278435 , 28.278444 , 28.286423 , 28.286427 ], + [-27.350065 , -27.35006 , -27.350042 , -27.350033 , + -10.221095 , -10.221094 , -10.221093 , -10.221088 , + -5.289955 , -5.2899523 , -5.289951 , -5.28995 , + 0.7171254 , 0.71712595, 0.71712595, 0.7171319 , + 14.130192 , 14.130204 , 14.130204 , 14.1302185 , + 14.374711 , 14.374722 , 14.374723 , 14.374728 , + 20.969217 , 20.969225 , 20.969225 , 20.96923 , + 26.569042 , 26.569044 , 26.569046 , 26.569054 , + 27.952032 , 27.952042 , 27.952045 , 27.952055 ]], + dtype=np.float32) + assert np.allclose(eigenstatus["eigenvalues"], expected_eigenvalues, atol=1e-4) diff --git a/dptb/tests/test_trainer.py b/dptb/tests/test_trainer.py index a9b284c0..bcb178d3 100644 --- a/dptb/tests/test_trainer.py +++ b/dptb/tests/test_trainer.py @@ -2,7 +2,7 @@ from dptb.nnops.trainer import Trainer import os from pathlib import Path -from dptb.utils.argcheck import normalize +from dptb.utils.argcheck import normalize,collect_cutoffs from dptb.utils.tools import j_loader from dptb.nn.build import build_model from dptb.data.build import build_dataset @@ -24,7 +24,8 @@ class TestTrainer: jdata = j_loader(INPUT_file) jdata = normalize(jdata) - train_datasets = build_dataset(**jdata["data_options"]["train"], **jdata["common_options"]) + cutoffops = collect_cutoffs(jdata) + train_datasets = build_dataset(**cutoffops, **jdata["data_options"]["train"], **jdata["common_options"]) @@ -70,7 +71,7 @@ def test_fromscratch_ref_noval(self): jdata["train_options"]["loss_options"]["reference"] = jdata["train_options"]["loss_options"]["train"] train_datasets = self.train_datasets - reference_datasets = build_dataset(**jdata["data_options"]["reference"], **jdata["common_options"]) + reference_datasets = build_dataset(**self.cutoffops,**jdata["data_options"]["reference"], **jdata["common_options"]) model = build_model(None, model_options=jdata["model_options"], common_options=jdata["common_options"]) @@ -97,7 +98,7 @@ def test_fromscratch_noref_val(self): jdata["train_options"]["loss_options"]["validation"] = jdata["train_options"]["loss_options"]["train"] train_datasets = self.train_datasets - validation_datasets = build_dataset(**jdata["data_options"]["validation"], **jdata["common_options"]) + validation_datasets = build_dataset(**self.cutoffops,**jdata["data_options"]["validation"], **jdata["common_options"]) model = build_model(None, model_options=jdata["model_options"], common_options=jdata["common_options"]) diff --git a/dptb/utils/argcheck.py b/dptb/utils/argcheck.py index 4e138f56..c64a93a1 100644 --- a/dptb/utils/argcheck.py +++ b/dptb/utils/argcheck.py @@ -1,6 +1,8 @@ -from typing import List, Callable +from typing import List, Callable, Dict, Any, Union from dargs import dargs, Argument, Variant, ArgumentEncoder import logging +from numbers import Number + log = logging.getLogger(__name__) @@ -338,6 +340,9 @@ def test_data_sub(): def data_options(): args = [ + Argument("r_max", [float,int], optional=True, default="5.0", doc="r_max"), + Argument("oer_max", [float,int], optional=True, default="5.0", doc="oer_max"), + Argument("er_max", [float,int], optional=True, default="5.0", doc="er_max"), train_data_sub(), validation_data_sub(), reference_data_sub() @@ -594,6 +599,7 @@ def dftbsk(): return Argument("dftbsk", dict, sub_fields=[ Argument("skdata", str, optional=False, doc="The path to the skfile or sk database."), + Argument("r_max", float, optional=False, doc="the cutoff values to use sk files."), ], sub_variants=[], optional=True, doc=doc_dftbsk) def nnsk(): @@ -1413,28 +1419,14 @@ def set_info_options(): doc_nframes = "Number of frames in this trajectory." doc_natoms = "Number of atoms in each frame." doc_pos_type = "Type of atomic position input. Can be frac / cart / ase." + doc_pbc = "The periodic condition for the structure, can bool or list of bool to specific x,y,z direction." args = [ Argument("nframes", int, optional=False, doc=doc_nframes), Argument("natoms", int, optional=True, default=-1, doc=doc_natoms), Argument("pos_type", str, optional=False, doc=doc_pos_type), - bandinfo_sub(), - AtomicData_options_sub() - ] - - return Argument("setinfo", dict, sub_fields=args) - -def set_info_options(): - doc_nframes = "Number of frames in this trajectory." - doc_natoms = "Number of atoms in each frame." - doc_pos_type = "Type of atomic position input. Can be frac / cart / ase." - - args = [ - Argument("nframes", int, optional=False, doc=doc_nframes), - Argument("natoms", int, optional=True, default=-1, doc=doc_natoms), - Argument("pos_type", str, optional=False, doc=doc_pos_type), - bandinfo_sub(), - AtomicData_options_sub() + Argument("pbc", [bool, list], optional=False, doc=doc_pbc), + bandinfo_sub() ] return Argument("setinfo", dict, sub_fields=args) @@ -1461,4 +1453,139 @@ def normalize_lmdbsetinfo(data): data = setinfo.normalize_value(data) setinfo.check_value(data, strict=True) - return data \ No newline at end of file + return data + + +def format_cuts(rcut: Union[Dict[str, Number], Number], decay_w: Number, nbuffer: int) -> Union[Dict[str, Number], Number]: + if not isinstance(decay_w, Number) or decay_w <= 0: + raise ValueError("decay_w should be a positive number") + + buffer_addition = decay_w * nbuffer + + if isinstance(rcut, dict): + return {key: value + buffer_addition for key, value in rcut.items()} + elif isinstance(rcut, Number): + return rcut + buffer_addition + else: + raise TypeError("rcut should be a dict or a number") + +def get_cutoffs_from_model_options(model_options): + """ + Extract cutoff values from the provided model options. + + This function retrieves the cutoff values `r_max`, `er_max`, and `oer_max` from the `model_options` + dictionary. It handles different model types such as `embedding`, `nnsk`, and `dftbsk`, ensuring + that the appropriate cutoff values are provided and valid. + + Parameters: + model_options (dict): A dictionary containing model configuration options. It may include keys + like `embedding`, `nnsk`, and `dftbsk` with their respective cutoff values. + + Returns: + tuple: A tuple containing the cutoff values (`r_max`, `er_max`, `oer_max`). + + Raises: + ValueError: If neither `r_max` nor `rc` is provided in `model_options` for embedding. + AssertionError: If `r_max` is provided outside the `nnsk` or `dftbsk` context when those models are used. + + Logs: + Error messages if required cutoff values are missing or incorrectly provided. + """ + r_max, er_max, oer_max = None, None, None + if model_options.get("embedding",None) is not None: + # switch according to the embedding method + embedding = model_options.get("embedding") + if embedding["method"] == "se2": + er_max = embedding["rc"] + elif embedding["method"] in ["slem", "lem"]: + r_max = embedding["r_max"] + else: + log.error("The method of embedding have not been defined in get cutoff functions") + raise NotImplementedError("The method of embedding have not been defined in get cutoff functions") + + if model_options.get("nnsk", None) is not None: + assert r_max is None, "r_max should not be provided in outside the nnsk for training nnsk model." + if model_options["nnsk"]["hopping"].get("rs",None) is not None: + # 其他方法在模型公式中,已经包含了 +5w 的范围,所以这里为了保险额外加上3w 的范围; + # 对于两个特例,powerlaw 和 varTang96 的情况,为了和旧版存档的兼容, 模型公式的本身并没有 +5w 的范围,所以这里额外加上8w 的范围。 + if model_options["nnsk"]["hopping"]['method'] in ["powerlaw","varTang96"]: + # r_max = model_options["nnsk"]["hopping"]["rs"] + 8 * model_options["nnsk"]["hopping"]["w"] + r_max = format_cuts(model_options["nnsk"]["hopping"]["rs"], model_options["nnsk"]["hopping"]["w"], 8) + else: + # r_max = model_options["nnsk"]["hopping"]["rs"] + 3 * model_options["nnsk"]["hopping"]["w"] + r_max = format_cuts(model_options["nnsk"]["hopping"]["rs"], model_options["nnsk"]["hopping"]["w"], 3) + + if model_options["nnsk"]["onsite"].get("rs",None) is not None: + if model_options["nnsk"]["onsite"]['method'] == "strain" and model_options["nnsk"]["hopping"]['method'] in ["powerlaw","varTang96"]: + # oer_max = model_options["nnsk"]["onsite"]["rs"] + 8 * model_options["nnsk"]["onsite"]["w"] + oer_max = format_cuts(model_options["nnsk"]["onsite"]["rs"], model_options["nnsk"]["onsite"]["w"], 8) + else: + # oer_max = model_options["nnsk"]["onsite"]["rs"] + 3 * model_options["nnsk"]["onsite"]["w"] + oer_max = format_cuts(model_options["nnsk"]["onsite"]["rs"], model_options["nnsk"]["onsite"]["w"], 3) + + elif model_options.get("dftbsk", None) is not None: + assert r_max is None, "r_max should not be provided in outside the dftbsk for training dftbsk model." + r_max = model_options["dftbsk"]["r_max"] + + else: + # not nnsk not dftbsk, must be only env or E3. the embedding should be provided. + assert model_options.get("embedding",None) is not None + + return r_max, er_max, oer_max +def collect_cutoffs(jdata): + """ + Collect cutoff values from the provided JSON data. + + This function extracts the cutoff values `r_max`, `er_max`, and `oer_max` from the `model_options` + in the provided JSON data. If the `nnsk` push model is used, it ensures that the necessary + cutoff values are provided in `data_options` and overrides the values from `model_options` + accordingly. + + Parameters: + jdata (dict): A dictionary containing model and data options. It must include `model_options` + and optionally `data_options` if `nnsk` push model is used. + + Returns: + dict: A dictionary containing the cutoff options with keys `r_max`, `er_max`, and `oer_max`. + + Raises: + AssertionError: If required keys are missing in `jdata` or if `r_max` is not provided when + using the `nnsk` push model. + + Logs: + Various informational messages about the cutoff values and their sources. + """ + + model_options = jdata["model_options"] + r_max, er_max, oer_max = get_cutoffs_from_model_options(model_options) + + if model_options.get("nnsk", None) is not None: + if model_options["nnsk"]["push"]: + assert jdata.get("data_options",None) is not None, "data_options should be provided in jdata for nnsk push" + assert jdata['data_options'].get("r_max") is not None, "r_max should be provided in data_options for nnsk push" + log.info('YOU ARE USING NNSK PUSH MODEL, r_max will be used from data_options. Be careful! check the value in data options and model options. r_max or rs/rc !') + r_max = jdata['data_options']['r_max'] + + if model_options["nnsk"]["onsite"]["method"] in ["strain", "NRL"]: + assert jdata['data_options'].get("oer_max") is not None, "oer_max should be provided in data_options for nnsk push with strain onsite mode" + log.info('YOU ARE USING NNSK PUSH MODEL with `strain` onsite mode, oer_max will be used from data_options. Be careful! check the value in data options and model options. rs/rc !') + oer_max = jdata['data_options']['oer_max'] + + if jdata['data_options'].get("er_max") is not None: + log.info("IN PUSH mode, the env correction should not be used. the er_max will not take effect.") + else: + if jdata['data_options'].get("r_max") is not None: + log.info("When not nnsk/push. the cutoffs will take from the model options: r_max rs and rc values. this seting in data_options will be ignored.") + + assert r_max is not None + cutoff_options = ({"r_max": r_max, "er_max": er_max, "oer_max": oer_max}) + + log.info("-"*66) + log.info(' {:<55} '.format("Cutoff options:")) + log.info(' {:<55} '.format(" "*30)) + log.info(' {:<16} : {:<36} '.format("r_max", f"{r_max}")) + log.info(' {:<16} : {:<36} '.format("er_max", f"{er_max}")) + log.info(' {:<16} : {:<36} '.format("oer_max", f"{oer_max}")) + log.info("-"*66) + + return cutoff_options diff --git a/examples/hBN/band_plot.ipynb b/examples/hBN/band_plot.ipynb index 4ba7b241..f0a7e94e 100644 --- a/examples/hBN/band_plot.ipynb +++ b/examples/hBN/band_plot.ipynb @@ -4,7 +4,15 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "TBPLaS is not installed. Thus the TBPLaS is not available, Please install it first.\n" + ] + } + ], "source": [ "from dptb.postprocess.bandstructure.band import Band\n", "from dptb.nn.nnsk import NNSK\n", @@ -15,12 +23,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -36,21 +44,311 @@ "results_path = \"./band_plot\"\n", "kpath_kwargs = jdata[\"task_options\"]\n", "stru_data = \"./data/struct.vasp\"\n", - "AtomicData_options = {\"r_max\": 5.0, \"oer_max\":1.6, \"pbc\": True}\n", + "AtomicData_options = {\"r_max\": 3.6+5*0.3}\n", "\n", "bcal = Band(model=model, \n", " use_gui=False, \n", " results_path=results_path, \n", " device=model.device)\n", "bcal.get_bands(data=stru_data, \n", - " kpath_kwargs=kpath_kwargs, \n", - " AtomicData_options=AtomicData_options)\n", + " kpath_kwargs=kpath_kwargs)\n", "bcal.band_plot(ref_band = kpath_kwargs[\"ref_band\"],\n", " E_fermi = kpath_kwargs[\"E_fermi\"],\n", " emin = kpath_kwargs[\"emin\"],\n", " emax = kpath_kwargs[\"emax\"])" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'nnsk': {'onsite': {'method': 'none'},\n", + " 'hopping': {'method': 'powerlaw', 'rs': 1.6, 'w': 0.3},\n", + " 'soc': {},\n", + " 'freeze': False,\n", + " 'push': False,\n", + " 'std': 0.01}}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.model_options" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "model.model_options \n", + "aa = {\n", + " 'pbc':None\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aa" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aa.pop(\"pbc\",True)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ____ ____ _____ ____ \n", + "| _ \\ ___ ___| _ \\_ _| __ ) \n", + "| | | |/ _ \\/ _ \\ |_) || | | _ \\ \n", + "| |_| | __/ __/ __/ | | | |_) |\n", + "|____/ \\___|\\___|_| |_| |____/ \n", + " \n", + "\n" + ] + } + ], + "source": [ + "import pyfiglet\n", + "\n", + "# 创建 Figlet 对象并设置字体\n", + "f = pyfiglet.Figlet(font='standard')\n", + "\n", + "# 将普通文本转换为艺术字并打印\n", + "text = \"DeePTB\"\n", + "print(f.renderText(text))" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['univers', 'small_poison', 'clb8x8', 'stellar', 'icl-1900', 'skateord', 'pod_____', 'funky_dr', 'grand_pr', 'sansi', 'script__', 'rot13', 'amc_razor2', 'tec_7000', 'britei', 'bulbhead', 'arrows', 'rally_sp', 'chiseled', 'rozzo', 'mnemonic', 'utopiab', 'isometric1', 'ansi_regular', 'delta_corps_priest_1', 'xttyb', 'speed', 'xchartri', 'runyc', 'tanja', 'gothic__', 'chunky', 'maxfour', 'sl_script', '5x8', 'knob', 'xsbook', 'twopoint', 'sub-zero', 'demo_2__', 'char1___', 'advenger', 'ebbs_2__', 'test1', 'xhelvbi', 'serifcap', 'isometric2', 'larry3d', 'amc_neko', 'c_ascii_', 'radical_', 'helvb', 'fbr12___', 'sblood', 'train', 'js_bracket_letters', 'jazmine', 'graffiti', 'rally_s2', 'glenyn', 'coil_cop', 'rev', 'dcs_bfmo', 'big_money-sw', 'clr5x6', 'smslant', 'a_zooloo', 'eftiwater', 'space_op', 'the_edge', 'asslt__m', 'triad_st', 'timesofl', 'basic', 'e__fist_', 'fireing_', 'clr8x8', 'dotmatrix', 'star_strips', 'f15_____', 'amc_3_liv1', 'cybermedium', 'pawn_ins', 'nancyj-underlined', 'rastan__', 'lean', 'tecrvs__', 'future_3', 'pepper', 'taxi____', 'skate_ro', 'danc4', 'nfi1____', 'lockergnome', 'elite', 'ogre', 'bigfig', 'benjamin', 'cola', 'bloody', 'ttyb', 'charact3', 'big_money-nw', 'keyboard', 'heart_right', 'rainbow_', 'britebi', 'banner3-D', 'sbooki', 'demo_1__', 'amc_3_line', 'mad_nurs', 'platoon_', 'binary', 'invita', 'hades___', 'smshadow', 'crawford2', 'tsn_base', 'top_duck', 'rammstein', 'cosmike', 'bubble', 'road_rai', 'sbookbi', 'notie_ca', 'heavy_me', 'z-pilot_', 't__of_ap', 'horizontal_right', 'clr6x6', 'relief2', 'asc_____', 'krak_out', 'fair_mea', 'fp2_____', 'thin', 'flower_power', 'this', 'deep_str', 'old_banner', 'eca_____', 'master_o', 'stop', 'ebbs_1__', 'morse2', 'ansi_shadow', 'sweet', 'bubble_b', 'impossible', 'sm______', 'platoon2', 'epic', 'xhelvi', 'star_war', 'courbi', 'future_6', 'rampage_', '6x10', 'future_8', 'small_caps', '1943____', 'big_money-ne', 'js_cursive', 'times', 'flipped', 'courb', 'alligator2', '1row', 'hills___', 'finalass', 'line_blocks', 'hyper___', 'linux', 'hex', 'slscript', 'red_phoenix', 'subteran', 'couri', 'ghost', 'gauntlet', 'short', 'poison', 'smisome1', 'konto', 'xcouri', 'morse', 'fender', 'dos_rebel', 'double', 'cyberlarge', 'home_pak', 'octal', 'kban', 'hieroglyphs', 'contessa', 'clr7x10', 'banner', 'katakana', 'letterw3', 'wavy', 'fp1_____', 'bell', 'nvscript', 'zone7___', 'com_sen_', 'stacey', 'letters', 'fun_face', 'eftifont', 'fbr1____', 'magic_ma', 'marquee', 'lil_devil', 'ghoulish', 'amc_thin', 'isometric4', 'letter_w', 'shadow', 'fuzzy', 'nipples', 'eftipiti', 'outrun__', 'block', 'street_s', 'chartri', 'd_dragon', 'sbookb', 'spc_demo', 'gothic', 'rci_____', 'os2', 'jacky', 'xcourb', 'crawford', 'cybersmall', 'demo_m__', 'threepoint', 'war_of_w', 'banner3', 'tengwar', 'new_asci', 'xcourbi', 'eftichess', 'caligraphy', 'tomahawk', 'slant', 'xsansbi', 'merlin2', 'briteb', 'b_m__200', 'stick_letters', 'clr6x10', 'dancing_font', 'soft', 'acrobatic', 'wet_letter', 'fbr_stri', 'banner4', 'yie-ar__', 'ntgreek', 'patorjk-hex', 'future_1', 'amc_tubes', 'puzzle', 'bear', 'small_slant', 'calvin_s', 'trek', 'atc_____', 'super_te', 'panther_', 'italic', 'ascii___', 'colossal', 'pacos_pe', 'xchartr', 'future_5', 'fantasy_', 'fbr_tilt', 'tiles', 'rad_phan', 'tav1____', 'flyn_sh', 'tsalagi', 'ripper!_', 'small', 'puffy', 'xsbookbi', 'stronger_than_all', 'brite', 'kik_star', 'battlesh', 'aquaplan', 'rowancap', 'ts1_____', 'type_set', '4max', 'horizontal_left', 'eftiwall', 'odel_lak', 'def_leppard', 'stforek', 'bigchief', 'fun_faces', 'swan', 'xhelvb', 'vortron_', 'house_of', 'xcour', 'sansb', 'calgphy2', 'cursive', 'lcd', 'mike', 'roman', 'charact5', 'xbritebi', 'catwalk', 'assalt_m', 'hypa_bal', 'broadway', 'char3___', 'chartr', 'beer_pub', 'battle_s', 'small_shadow', 'smkeyboard', 'filter', 'convoy__', 'runic', 'thick', 'merlin1', 'crazy', 'future_2', 'rotated', 'high_noo', 'electronic', 'heart_left', 'helv', 'fbr2____', 'phonix__', 'pebbles', 'xsansi', 'pawp', 'amc_slash', 'unarmed_', 'jerusalem', 'spliff', 'slant_relief', 'italics_', 'xhelv', 'relief', \"patorjk's_cheese\", 'tubular', 'cli8x8', 'fourtops', '3d-ascii', 'alligator', 'xtty', 'char4___', 'santa_clara', 'xbriteb', 'green_be', '64f1____', '4x4_offr', 'lazy_jon', 'weird', 'inc_raw_', 'amc_slider', 'amc_aaa01', 'doh', 'avatar', 'b1ff', 'caus_in_', 'mirror', 'yie_ar_k', 'contrast', 'fire_font-s', 'clr5x8', 'usa_____', 'hollywood', 'c1______', '6x9', 'tsm_____', 'rok_____', 'defleppard', 'atc_gran', 'shimrod', 'fairligh', 'decimal', 'computer', 'heroboti', 'joust___', 'alphabet', '5x7', '3d_diagonal', 'goofy', 'xbrite', 'clb6x10', 'eftirobot', 'nscript', 'js_block_letters', 'cricket', 'r2-d2___', 'sketch_s', 'stencil2', 'ghost_bo', 'georgi16', 'konto_slant', 'rounded', 'digital', 'xsansb', 'drpepper', 'c2______', 'helvi', 'varsity', 'xsbooki', 'xtimes', 'utopiabi', 'rad_____', 'eftitalic', 'straight', 'npn_____', 'mayhem_d', 'double_shorts', 'sbook', 'barbwire', 'stealth_', 'efti_robot', 'trashman', 'diamond', 'charact4', 'clr4x6', 'stampatello', 'ticks', 'js_stick_letters', 'future_4', 'ok_beer_', 'xbritei', 'big', 'future_7', 'cards', 'fraktur', 'usaflag', 'greek', 'peaks', 'graceful', 'etcrvs__', 'mig_ally', 'modern__', 'ugalympi', 'clr8x10', 'rectangles', 'cygnet', 'broadway_kb', 'henry_3d', 'cosmic', 'cour', 'term', 'clr5x10', 'whimsy', 'big_money-se', 'script', 'p_s_h_m_', 'bright', 'stencil1', 'charact1', 'clb8x10', 'swamp_land', 'dwhistled', '3-d', 'standard', 'raw_recu', 'ivrit', 'bubble__', 'nancyj', 'madrid', 'usa_pq__', 'nancyj-improved', 'faces_of', 'utopiai', 'characte', 'mini', 'wow', 'smtengwar', 'bolger', 'twisted', 'js_capital_curves', 'charact6', 'tinker-toy', 'coinstak', 'sansbi', 'tty', 'amc_untitled', 'char2___', 'xsans', 'ucf_fan_', 'skateroc', '3x5', 'nancyj-fancy', 'roman___', 'tec1____', 'clr7x8', 'devilish', 'alpha', 'mshebrew210', 'pyramid', 'stampate', 'gradient', 'p_skateb', 'fire_font-k', 'charset_', 'starwars', 'braced', 'ticksslant', 'georgia11', 'mcg_____', 'baz__bil', 'moscow', 'diet_cola', 'tombstone', 'kgames_i', 'clr6x8', 'lexible_', 'smscript', 'helvbi', 'muzzle', 'druid___', 'c_consen', 'doom', 'charact2', 'isometric3', 'xsbookb', 'zig_zag_', '5lineoblique', 'rockbox_', 'slide', 'ti_pan__', 'ascii_new_roman', 'twin_cob', 'utopia', 'blocky', 'modular', 'blocks', 'thorned', 'sans', 'o8', 'amc_razor']\n" + ] + } + ], + "source": [ + "from pyfiglet import FigletFont\n", + "fonts_res = FigletFont().getFonts()\n", + "print(fonts_res)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Font: dos_rebel\n", + " ██████████ ███████████ ███████████ ███████████ \n", + "░░███░░░░███ ░░███░░░░░███░█░░░███░░░█░░███░░░░░███\n", + " ░███ ░░███ ██████ ██████ ░███ ░███░ ░███ ░ ░███ ░███\n", + " ░███ ░███ ███░░███ ███░░███ ░██████████ ░███ ░██████████ \n", + " ░███ ░███░███████ ░███████ ░███░░░░░░ ░███ ░███░░░░░███\n", + " ░███ ███ ░███░░░ ░███░░░ ░███ ░███ ░███ ░███\n", + " ██████████ ░░██████ ░░██████ █████ █████ ███████████ \n", + "░░░░░░░░░░ ░░░░░░ ░░░░░░ ░░░░░ ░░░░░ ░░░░░░░░░░░ \n", + " \n", + " \n", + " \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: electronic\n", + " ▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄ \n", + "▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░▌ \n", + "▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀█░█▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌\n", + "▐░▌ ▐░▌▐░▌ ▐░▌ ▐░▌ ▐░▌ ▐░▌ ▐░▌ ▐░▌\n", + "▐░▌ ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌ ▐░▌ ▐░█▄▄▄▄▄▄▄█░▌\n", + "▐░▌ ▐░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░▌ ▐░░░░░░░░░░▌ \n", + "▐░▌ ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░▌ ▐░█▀▀▀▀▀▀▀█░▌\n", + "▐░▌ ▐░▌▐░▌ ▐░▌ ▐░▌ ▐░▌ ▐░▌ ▐░▌\n", + "▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░▌ ▐░▌ ▐░█▄▄▄▄▄▄▄█░▌\n", + "▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌ ▐░▌ ▐░░░░░░░░░░▌ \n", + " ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀ ▀▀▀▀▀▀▀▀▀▀ \n", + " \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: varsity\n", + " ______ _______ _________ ______ \n", + "|_ _ `. |_ __ \\ | _ _ ||_ _ \\ \n", + " | | `. \\ .---. .---. | |__) ||_/ | | \\_| | |_) | \n", + " | | | |/ /__\\\\/ /__\\\\ | ___/ | | | __'. \n", + " _| |_.' /| \\__.,| \\__., _| |_ _| |_ _| |__) | \n", + "|______.' '.__.' '.__.'|_____| |_____| |_______/ \n", + " \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: blocky\n", + "████████ ████████ ████████ ████████ ████████ ████████ \n", + "██ ██ ██ ██ ██ ██ ██ ██ ██ \n", + "██ ██ ██ ██ ██ ██ ██ ██ ██ \n", + "██ ██ ██████ ██████ ████████ ██ ████████ \n", + "██ ██ ██ ██ ██ ██ ██ ██ \n", + "██ ██ ██ ██ ██ ██ ██ ██ \n", + "████████ ████████ ████████ ██ ██ ████████ \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: standard\n", + " ____ ____ _____ ____ \n", + "| _ \\ ___ ___| _ \\_ _| __ ) \n", + "| | | |/ _ \\/ _ \\ |_) || | | _ \\ \n", + "| |_| | __/ __/ __/ | | | |_) |\n", + "|____/ \\___|\\___|_| |_| |____/ \n", + " \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: doom\n", + "______ ______ ___________ \n", + "| _ \\ | ___ \\_ _| ___ \\\n", + "| | | |___ ___| |_/ / | | | |_/ /\n", + "| | | / _ \\/ _ \\ __/ | | | ___ \\\n", + "| |/ / __/ __/ | | | | |_/ /\n", + "|___/ \\___|\\___\\_| \\_/ \\____/ \n", + " \n", + " \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: roman\n", + "oooooooooo. ooooooooo. ooooooooooooo oooooooooo. \n", + "`888' `Y8b `888 `Y88. 8' 888 `8 `888' `Y8b \n", + " 888 888 .ooooo. .ooooo. 888 .d88' 888 888 888 \n", + " 888 888 d88' `88b d88' `88b 888ooo88P' 888 888oooo888' \n", + " 888 888 888ooo888 888ooo888 888 888 888 `88b \n", + " 888 d88' 888 .o 888 .o 888 888 888 .88P \n", + "o888bood8P' `Y8bod8P' `Y8bod8P' o888o o888o o888bood8P' \n", + " \n", + " \n", + " \n", + "\n", + "--------------------------------------------------\n", + "\n", + "Font: colossal\n", + "8888888b. 8888888b.88888888888888888b. \n", + "888 \"Y88b 888 Y88b 888 888 \"88b \n", + "888 888 888 888 888 888 .88P \n", + "888 888 .d88b. .d88b. 888 d88P 888 8888888K. \n", + "888 888d8P Y8bd8P Y8b8888888P\" 888 888 \"Y88b \n", + "888 8888888888888888888888 888 888 888 \n", + "888 .d88PY8b. Y8b. 888 888 888 d88P \n", + "8888888P\" \"Y8888 \"Y8888 888 888 8888888P\" \n", + " \n", + " \n", + " \n", + "\n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "import pyfiglet\n", + "#fonts = ['univers', 'small_poison', 'clb8x8', 'stellar', 'icl-1900', 'skateord', 'pod_____', 'funky_dr', 'grand_pr', 'sansi', 'script__', 'rot13', 'amc_razor2', 'tec_7000', 'britei', 'bulbhead', 'arrows', 'rally_sp', 'chiseled', 'rozzo', 'mnemonic', 'utopiab', 'isometric1', 'ansi_regular', 'delta_corps_priest_1', 'xttyb', 'speed', 'xchartri', 'runyc', 'tanja', 'gothic__', 'chunky', 'maxfour', 'sl_script', '5x8', 'knob', 'xsbook', 'twopoint', 'sub-zero', 'demo_2__', 'char1___', 'advenger', 'ebbs_2__', 'test1', 'xhelvbi', 'serifcap', 'isometric2', 'larry3d', 'amc_neko', 'c_ascii_', 'radical_', 'helvb', 'fbr12___', 'sblood', 'train', 'js_bracket_letters', 'jazmine', 'graffiti', 'rally_s2', 'glenyn', 'coil_cop', 'rev', 'dcs_bfmo', 'big_money-sw', 'clr5x6', 'smslant', 'a_zooloo', 'eftiwater', 'space_op', 'the_edge', 'asslt__m', 'triad_st', 'timesofl', 'basic', 'e__fist_', 'fireing_', 'clr8x8', 'dotmatrix', 'star_strips', 'f15_____', 'amc_3_liv1', 'cybermedium', 'pawn_ins', 'nancyj-underlined', 'rastan__', 'lean', 'tecrvs__', 'future_3', 'pepper', 'taxi____', 'skate_ro', 'danc4', 'nfi1____', 'lockergnome', 'elite', 'ogre', 'bigfig', 'benjamin', 'cola', 'bloody', 'ttyb', 'charact3', 'big_money-nw', 'keyboard', 'heart_right', 'rainbow_', 'britebi', 'banner3-D', 'sbooki', 'demo_1__', 'amc_3_line', 'mad_nurs', 'platoon_', 'binary', 'invita', 'hades___', 'smshadow', 'crawford2', 'tsn_base', 'top_duck', 'rammstein', 'cosmike', 'bubble', 'road_rai', 'sbookbi', 'notie_ca', 'heavy_me', 'z-pilot_', 't__of_ap', 'horizontal_right', 'clr6x6', 'relief2', 'asc_____', 'krak_out', 'fair_mea', 'fp2_____', 'thin', 'flower_power', 'this', 'deep_str', 'old_banner', 'eca_____', 'master_o', 'stop', 'ebbs_1__', 'morse2', 'ansi_shadow', 'sweet', 'bubble_b', 'impossible', 'sm______', 'platoon2', 'epic', 'xhelvi', 'star_war', 'courbi', 'future_6', 'rampage_', '6x10', 'future_8', 'small_caps', '1943____', 'big_money-ne', 'js_cursive', 'times', 'flipped', 'courb', 'alligator2', '1row', 'hills___', 'finalass', 'line_blocks', 'hyper___', 'linux', 'hex', 'slscript', 'red_phoenix', 'subteran', 'couri', 'ghost', 'gauntlet', 'short', 'poison', 'smisome1', 'konto', 'xcouri', 'morse', 'fender', 'dos_rebel', 'double', 'cyberlarge', 'home_pak', 'octal', 'kban', 'hieroglyphs', 'contessa', 'clr7x10', 'banner', 'katakana', 'letterw3', 'wavy', 'fp1_____', 'bell', 'nvscript', 'zone7___', 'com_sen_', 'stacey', 'letters', 'fun_face', 'eftifont', 'fbr1____', 'magic_ma', 'marquee', 'lil_devil', 'ghoulish', 'amc_thin', 'isometric4', 'letter_w', 'shadow', 'fuzzy', 'nipples', 'eftipiti', 'outrun__', 'block', 'street_s', 'chartri', 'd_dragon', 'sbookb', 'spc_demo', 'gothic', 'rci_____', 'os2', 'jacky', 'xcourb', 'crawford', 'cybersmall', 'demo_m__', 'threepoint', 'war_of_w', 'banner3', 'tengwar', 'new_asci', 'xcourbi', 'eftichess', 'caligraphy', 'tomahawk', 'slant', 'xsansbi', 'merlin2', 'briteb', 'b_m__200', 'stick_letters', 'clr6x10', 'dancing_font', 'soft', 'acrobatic', 'wet_letter', 'fbr_stri', 'banner4', 'yie-ar__', 'ntgreek', 'patorjk-hex', 'future_1', 'amc_tubes', 'puzzle', 'bear', 'small_slant', 'calvin_s', 'trek', 'atc_____', 'super_te', 'panther_', 'italic', 'ascii___', 'colossal', 'pacos_pe', 'xchartr', 'future_5', 'fantasy_', 'fbr_tilt', 'tiles', 'rad_phan', 'tav1____', 'flyn_sh', 'tsalagi', 'ripper!_', 'small', 'puffy', 'xsbookbi', 'stronger_than_all', 'brite', 'kik_star', 'battlesh', 'aquaplan', 'rowancap', 'ts1_____', 'type_set', '4max', 'horizontal_left', 'eftiwall', 'odel_lak', 'def_leppard', 'stforek', 'bigchief', 'fun_faces', 'swan', 'xhelvb', 'vortron_', 'house_of', 'xcour', 'sansb', 'calgphy2', 'cursive', 'lcd', 'mike', 'roman', 'charact5', 'xbritebi', 'catwalk', 'assalt_m', 'hypa_bal', 'broadway', 'char3___', 'chartr', 'beer_pub', 'battle_s', 'small_shadow', 'smkeyboard', 'filter', 'convoy__', 'runic', 'thick', 'merlin1', 'crazy', 'future_2', 'rotated', 'high_noo', 'electronic', 'heart_left', 'helv', 'fbr2____', 'phonix__', 'pebbles', 'xsansi', 'pawp', 'amc_slash', 'unarmed_', 'jerusalem', 'spliff', 'slant_relief', 'italics_', 'xhelv', 'relief', \"patorjk's_cheese\", 'tubular', 'cli8x8', 'fourtops', '3d-ascii', 'alligator', 'xtty', 'char4___', 'santa_clara', 'xbriteb', 'green_be', '64f1____', '4x4_offr', 'lazy_jon', 'weird', 'inc_raw_', 'amc_slider', 'amc_aaa01', 'doh', 'avatar', 'b1ff', 'caus_in_', 'mirror', 'yie_ar_k', 'contrast', 'fire_font-s', 'clr5x8', 'usa_____', 'hollywood', 'c1______', '6x9', 'tsm_____', 'rok_____', 'defleppard', 'atc_gran', 'shimrod', 'fairligh', 'decimal', 'computer', 'heroboti', 'joust___', 'alphabet', '5x7', '3d_diagonal', 'goofy', 'xbrite', 'clb6x10', 'eftirobot', 'nscript', 'js_block_letters', 'cricket', 'r2-d2___', 'sketch_s', 'stencil2', 'ghost_bo', 'georgi16', 'konto_slant', 'rounded', 'digital', 'xsansb', 'drpepper', 'c2______', 'helvi', 'varsity', 'xsbooki', 'xtimes', 'utopiabi', 'rad_____', 'eftitalic', 'straight', 'npn_____', 'mayhem_d', 'double_shorts', 'sbook', 'barbwire', 'stealth_', 'efti_robot', 'trashman', 'diamond', 'charact4', 'clr4x6', 'stampatello', 'ticks', 'js_stick_letters', 'future_4', 'ok_beer_', 'xbritei', 'big', 'future_7', 'cards', 'fraktur', 'usaflag', 'greek', 'peaks', 'graceful', 'etcrvs__', 'mig_ally', 'modern__', 'ugalympi', 'clr8x10', 'rectangles', 'cygnet', 'broadway_kb', 'henry_3d', 'cosmic', 'cour', 'term', 'clr5x10', 'whimsy', 'big_money-se', 'script', 'p_s_h_m_', 'bright', 'stencil1', 'charact1', 'clb8x10', 'swamp_land', 'dwhistled', '3-d', 'standard', 'raw_recu', 'ivrit', 'bubble__', 'nancyj', 'madrid', 'usa_pq__', 'nancyj-improved', 'faces_of', 'utopiai', 'characte', 'mini', 'wow', 'smtengwar', 'bolger', 'twisted', 'js_capital_curves', 'charact6', 'tinker-toy', 'coinstak', 'sansbi', 'tty', 'amc_untitled', 'char2___', 'xsans', 'ucf_fan_', 'skateroc', '3x5', 'nancyj-fancy', 'roman___', 'tec1____', 'clr7x8', 'devilish', 'alpha', 'mshebrew210', 'pyramid', 'stampate', 'gradient', 'p_skateb', 'fire_font-k', 'charset_', 'starwars', 'braced', 'ticksslant', 'georgia11', 'mcg_____', 'baz__bil', 'moscow', 'diet_cola', 'tombstone', 'kgames_i', 'clr6x8', 'lexible_', 'smscript', 'helvbi', 'muzzle', 'druid___', 'c_consen', 'doom', 'charact2', 'isometric3', 'xsbookb', 'zig_zag_', '5lineoblique', 'rockbox_', 'slide', 'ti_pan__', 'ascii_new_roman', 'twin_cob', 'utopia', 'blocky', 'modular', 'blocks', 'thorned', 'sans', 'o8', 'amc_razor']\n", + "\n", + "def display_deeptb_fonts():\n", + " fonts = ['dos_rebel', 'electronic', 'varsity', 'blocky', 'standard', 'doom', 'roman', 'colossal']\n", + " text = \"DeePTB\"\n", + " \n", + " for font in fonts:\n", + " print(f\"\\nFont: {font}\")\n", + " f = pyfiglet.Figlet(font=font)\n", + " print(f.renderText(text))\n", + " print(\"-\" * 50)\n", + "\n", + "# 显示所有字体\n", + "display_deeptb_fonts()" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "padding=2\n", + "nnn = 78-padding\n", + "format_str = \"#\" + \"{}\"+\"{:<\"+f\"{nnn}\" + \"}\"+ \"#\" " + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "66" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(\"##################################################################\")" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/hBN/data/kpath.0/info.json b/examples/hBN/data/kpath.0/info.json index b48038b6..8912eaf7 100644 --- a/examples/hBN/data/kpath.0/info.json +++ b/examples/hBN/data/kpath.0/info.json @@ -2,12 +2,7 @@ "nframes": 1, "natoms": 2, "pos_type": "ase", - "AtomicData_options": { - "r_max": 5.5, - "er_max": 3.5, - "oer_max":1.6, - "pbc": true - }, + "pbc": true, "bandinfo": { "band_min": 0, "band_max": 6, diff --git a/examples/hBN/input_short.json b/examples/hBN/input_short.json index ce1f0330..8eb1b882 100644 --- a/examples/hBN/input_short.json +++ b/examples/hBN/input_short.json @@ -37,6 +37,9 @@ } }, "data_options": { + "r_max": 5.5, + "er_max": 3.5, + "oer_max":1.6, "train": { "root": "./data/", "prefix": "kpath",