diff --git a/libpyvinyl/BaseCalculator.py b/libpyvinyl/BaseCalculator.py index 2bb26e2..76f3785 100644 --- a/libpyvinyl/BaseCalculator.py +++ b/libpyvinyl/BaseCalculator.py @@ -32,6 +32,7 @@ from pathlib import Path import logging import os +import hashlib from libpyvinyl.AbstractBaseClass import AbstractBaseClass from libpyvinyl.BaseData import BaseData, DataCollection @@ -382,6 +383,11 @@ def __call__(self, parameters=None, **kwargs): new.parameters = parameters return new + def __hash__(self): + a = dill.copy(self) + a.init_parameters() + return int.from_bytes(hashlib.sha256(dill.dumps(a)).digest(), "big") + @classmethod def from_dump(cls, dumpfile: str): """Load a dill dump from a dumpfile. diff --git a/libpyvinyl/Parameters/Collections.py b/libpyvinyl/Parameters/Collections.py index 78ada2e..2a3dea6 100644 --- a/libpyvinyl/Parameters/Collections.py +++ b/libpyvinyl/Parameters/Collections.py @@ -109,6 +109,15 @@ def new_parameter(self, *args, **kwargs): self.add(new_parameter) return new_parameter + def __hash__(self): + """ + Returns a hash for the parameter list + """ + h = 0 + for parameter in self.parameters: + h = h + hash(self.parameters[parameter]) + return hash(h) + def __contains__(self, key): """ Returns True if the parameter exists @@ -383,7 +392,9 @@ def add_master_parameter(self, name, links, **kwargs): for link_key in links: if link_key not in self.parameters_dict: - raise RuntimeError("A link had a key which was not recognized.") + raise RuntimeError( + f"A link had a key which was not recognized: {link_key}" + ) master_parameter.add_links(links) self.master.add(master_parameter) diff --git a/libpyvinyl/Parameters/Parameter.py b/libpyvinyl/Parameters/Parameter.py index 43c102b..f767acc 100644 --- a/libpyvinyl/Parameters/Parameter.py +++ b/libpyvinyl/Parameters/Parameter.py @@ -3,6 +3,7 @@ import math import numpy +import hashlib from libpyvinyl.AbstractBaseClass import AbstractBaseClass from pint.unit import Unit @@ -506,3 +507,6 @@ def __repr__(self) -> str: string += " " + str(option) + "\n" return string + + def __hash__(self): + return int.from_bytes(hashlib.sha256(self.value).digest(), "big")