diff --git a/examples/gp_potentials/cu_training.py b/examples/gp_potentials/cu_training.py index 8fb2e18..009bccf 100644 --- a/examples/gp_potentials/cu_training.py +++ b/examples/gp_potentials/cu_training.py @@ -21,7 +21,7 @@ def train(): fingerprints=Gaussian( cutoff=6.5, normalized=normalized, save_preprocessor="cu_training.scaler" ), - #model=GaussianProcess(batch_size=batch_size), + # model=GaussianProcess(batch_size=batch_size), model=GaussianProcess(), label="cu_training", ) diff --git a/ml4chem/data/handler.py b/ml4chem/data/handler.py index 408770b..adb1c20 100644 --- a/ml4chem/data/handler.py +++ b/ml4chem/data/handler.py @@ -90,7 +90,9 @@ def prepare_images(self, images, purpose=None): logger.info("Images hashed and processed...\n") if purpose == "training": - logger.info("There are {} atoms in your data set.".format(sum(self.atoms_per_image))) + logger.info( + "There are {} atoms in your data set.".format(sum(self.atoms_per_image)) + ) def is_valid_structure(self, images): """Check if the data has a valid structure diff --git a/ml4chem/fingerprints/gaussian.py b/ml4chem/fingerprints/gaussian.py index 3d9505a..a7227d6 100644 --- a/ml4chem/fingerprints/gaussian.py +++ b/ml4chem/fingerprints/gaussian.py @@ -110,7 +110,9 @@ def __init__( if custom is None: custom = {key: custom for key in keys} - elif custom is not None and len(list(set(keys).intersection(custom.keys()))) == 0: + elif ( + custom is not None and len(list(set(keys).intersection(custom.keys()))) == 0 + ): for value in custom.values(): for k, v in value.items(): if isinstance(v, list) is False: @@ -125,7 +127,7 @@ def __init__( # Delete useless variables delete = ["self", "scheduler", "overwrite", "k", "v", "value", "keys"] - for param in delete: + for param in delete: try: del _params[param] except KeyError: @@ -218,7 +220,7 @@ def calculate_features(self, images=None, purpose="training", data=None, svm=Fal ) self.custom.update({"GP": self.GP}) else: - logger.info('Using parameters from file to create symmetry functions...\n') + logger.info("Using parameters from file to create symmetry functions...\n") self.print_fingerprint_params(self.GP) diff --git a/ml4chem/metrics.py b/ml4chem/metrics.py index 8c7ef3e..ffbf2b7 100644 --- a/ml4chem/metrics.py +++ b/ml4chem/metrics.py @@ -37,6 +37,7 @@ def compute_rmse(outputs, targets, atoms_per_image=None): rmse = torch.sqrt(torch.mean((outputs - targets).pow(2))).item() return rmse + def compute_mse(outputs, targets, atoms_per_image=None): """Compute MSE diff --git a/ml4chem/models/gaussian_process.py b/ml4chem/models/gaussian_process.py index b548ca4..dd92560 100644 --- a/ml4chem/models/gaussian_process.py +++ b/ml4chem/models/gaussian_process.py @@ -68,6 +68,7 @@ class GaussianProcess(KernelRidge): This regressor applies the atomic decomposition Ansatz (ADA). For more information check the Notes on the KernelRidge class. """ + NAME = "GaussianProcess" def __init__( @@ -124,7 +125,6 @@ def __init__( else: self.weights = weights - def get_potential_energy(self, fingerprints, reference_space): """Get potential energy with Kernel Ridge diff --git a/ml4chem/models/merger.py b/ml4chem/models/merger.py index 5c76346..2395d4f 100644 --- a/ml4chem/models/merger.py +++ b/ml4chem/models/merger.py @@ -91,7 +91,7 @@ def train( batch_size=None, lr_scheduler=None, independent_loss=True, - loss_weights=None + loss_weights=None, ): self.epochs = epochs @@ -107,12 +107,16 @@ def train( logging.info("Loss functions:") if loss_weights is None: - self.loss_weights = [1. / len(lossfxn) for l in lossfxn] + self.loss_weights = [1.0 / len(lossfxn) for l in lossfxn] else: self.loss_weights = loss_weights for index, l in enumerate(lossfxn): - logging.info(" - Name: {}; Weight: {}.".format(l.__name__, self.loss_weights[index])) + logging.info( + " - Name: {}; Weight: {}.".format( + l.__name__, self.loss_weights[index] + ) + ) # If no batch_size provided then the whole training set length is the batch. if batch_size is None: @@ -192,7 +196,7 @@ def train( logging.info("-----------------") logging.info("Number of batches:") for index, c in enumerate(self.chunks): - logging.info(' - Model {}, {}.'.format(index, len(c))) + logging.info(" - Model {}, {}.".format(index, len(c))) logging.info("Batch size: {} elements per batch.\n".format(batch_size)) # Define optimizer @@ -207,7 +211,9 @@ def train( logger.info(" ") logger.info( - "{:6s} {:19s} {:12s} {:8s}".format("Epoch", "Time Stamp", "Loss", "RMSE (ave)") + "{:6s} {:19s} {:12s} {:8s}".format( + "Epoch", "Time Stamp", "Loss", "RMSE (ave)" + ) ) logger.info( "{:6s} {:19s} {:12s} {:8s}".format( @@ -261,13 +267,13 @@ def train( ts = time.time() ts = datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d " "%H:%M:%S") - logger.info( - "{:6d} {} {:8e} {:8f}".format(epoch, ts, loss, _rmse) - ) + logger.info("{:6d} {} {:8e} {:8f}".format(epoch, ts, loss, _rmse)) if convergence is None and epoch == self.epochs: converged = True - elif convergence is not None and all(i <= convergence["rmse"] for i in rmse): + elif convergence is not None and all( + i <= convergence["rmse"] for i in rmse + ): converged = True new_state_dict = {} @@ -276,13 +282,12 @@ def train( for key in old_state_dict: if not (old_state_dict[key] == new_state_dict[key]).all(): - print('Diff in {}'.format(key)) + print("Diff in {}".format(key)) else: - print('No diff in {}'.format(key)) + print("No diff in {}".format(key)) # print(rmse) - def closure(self, index, model, independent_loss, name=None): """Closure diff --git a/ml4chem/potentials.py b/ml4chem/potentials.py index da116a6..2c5fec5 100644 --- a/ml4chem/potentials.py +++ b/ml4chem/potentials.py @@ -45,10 +45,9 @@ class Potentials(Calculator, object): "PytorchIonicPotentials": "ionic", "RetentionTimes": "rt", "KernelRidge": "kernelridge", - "GaussianProcess": "gaussian_process" + "GaussianProcess": "gaussian_process", } - def __init__( self, fingerprints=None, @@ -97,7 +96,9 @@ def load(Cls, model=None, params=None, preprocessor=None, **kwargs): class_name = model_params["class_name"] module_name = Potentials.module_names[model_params["name"]] - model_class = dynamic_import(class_name, "ml4chem.models", alt_name=module_name) + model_class = dynamic_import( + class_name, "ml4chem.models", alt_name=module_name + ) delete = ["name", "type", "class_name"] for param in delete: @@ -353,7 +354,9 @@ def calculate(self, atoms, properties, system_changes): try: model.load_state_dict(torch.load(self.ml4chem_path), strict=True) except RuntimeError: - logger.warning('Your image does not have some atoms present in the loaded model.\n') + logger.warning( + "Your image does not have some atoms present in the loaded model.\n" + ) model.load_state_dict(torch.load(self.ml4chem_path), strict=False) model.eval() energy = model(fingerprints).item() diff --git a/ml4chem/utils.py b/ml4chem/utils.py index 2c52f18..6840409 100644 --- a/ml4chem/utils.py +++ b/ml4chem/utils.py @@ -156,7 +156,9 @@ def logger(filename=None, level=None, format=None, filemode="a"): for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) - logger = logging.basicConfig(filename=filename, level=level, format=format, filemode=filemode) + logger = logging.basicConfig( + filename=filename, level=level, format=format, filemode=filemode + ) return logger @@ -232,9 +234,9 @@ def get_header_message(): ╚═╝ ╚═╝╚══════╝╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝\n -ML4Chem is Machine Learning for Chemistry. This package is written in Python -3, and intends to offer modern and rich features to perform machine learning -workflows for chemical physics. +ML4Chem is Machine Learning for Chemistry and Materials. This package is +written in Python 3, and intends to offer modern and rich features to perform +machine learning workflows for chemical physics. This project is directed by Muammar El Khatib. diff --git a/setup.py b/setup.py index 1191f7c..a475e93 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ long_description_content_type="text/markdown", url="https://github.com/muammar/ml4chem", packages=setuptools.find_packages(), - scripts=['bin/ml4chem'], + scripts=["bin/ml4chem"], classifiers=[ "Programming Language :: Python :: 3", "Operating System :: OS Independent",