Source code for matador.hull.hull_diff

# coding: utf-8
# Distributed under the terms of the MIT License.

""" This file implements the diffing of phase diagrams as new structures
are added.

Intended usage:

- Compare current hull with 5 days ago

    matador hulldiff -c KSnP -int --compare 5

- Compare hull a month ago to 2 days ago

    matador hulldiff -c KSnP -int --compare 30 2

"""


from matador.utils.cursor_utils import display_results


[docs]class HullDiff: """Takes two QueryConvexHull objects and 'diffs' them, printing a +/- line for each new/deleted structure within the specified hull cutoff (i.e. compares hull.hull_cursor only). """ def __init__(self, hull_old, hull_new, **args): """Initialise difference from two hulls. Parameters: hull_old (QueryConvexHull): older hull object. hull_new (QueryConvexHull): newer hull object. Keyword arguments: args: dict, command-line arguments to print results. """ self.id_new = [doc["text_id"] for doc in hull_new.hull_cursor] self.id_old = [doc["text_id"] for doc in hull_old.hull_cursor] self.additions = [] self.deletions = [] self.cursor = [] # self.cursor = [doc for doc in hull_new.hull_cursor] for doc in hull_new.hull_cursor: if doc["text_id"] not in self.id_old: self.cursor.append(doc) self.additions.append(doc["text_id"]) for doc in hull_old.hull_cursor: if doc["text_id"] not in self.id_new: self.cursor.append(doc) self.deletions.append(doc["text_id"]) self.cursor = sorted( self.cursor, key=lambda x: (x["enthalpy_per_atom"], x["concentration"]) ) self.print_diff(**args)
[docs] def print_diff(self, **args): """Use the display_results function to print the diff.""" display_results( self.cursor, hull=True, additions=self.additions, deletions=self.deletions ) if self.additions is not None: if args.get("summary"): print( "{} additions and {} replacements as best at stoichiometry.".format( len(self.additions), len(self.deletions) ) ) else: print( "{} additions and {} deletions.".format( len(self.additions), len(self.deletions) ) )
[docs] def plot_diff(self): """Plot the hull with additions ONLY highlighted in green.""" raise NotImplementedError
[docs]def diff_hulls(client, collections, **args): """Helper function to diff hulls from cmd-line args. Parameters: client (MongoClient): connection to database collections (dict of Collection): dict of collections to query Keyword arguments: args: dict, command-line arguments to select hulls. """ from matador.query import DBQuery from matador.hull import QueryConvexHull diff_args = args["compare"] del args["compare"] args["no_plot"] = True if args.get("verbosity") in [0, None] and not args.get("debug"): args["quiet"] = True diff_args = sorted(diff_args) args["time"] = diff_args[0] print("Calculating hull {} days ago...".format(args["time"])) query_old = DBQuery(client, collections, **args) hull_old = QueryConvexHull(query_old, **args) if len(diff_args) == 1 or isinstance(diff_args, str): args["time"] = "0" else: args["time"] = diff_args[1] if args["time"] == "0": print("... to compare with up-to-date hull.") else: print("... to compare with hull {} days ago.".format(args["time"])) query_new = DBQuery(client, collections, **args) hull_new = QueryConvexHull(query_new, **args) HullDiff(hull_old, hull_new, **args)