diff --git a/python/dune/perftool/preambles.py b/python/dune/perftool/preambles.py index 18c1a017ae9c180ab8e63e80ca4fb316a931d865..a11eed6de55507db3d38f6c6458182010d4ee4cd 100644 --- a/python/dune/perftool/preambles.py +++ b/python/dune/perftool/preambles.py @@ -26,12 +26,12 @@ class UFL2LoopyDataCache(dict): def __init__(self): self.counter = 0 - def register(self, cachekey, content, preamble): - self[cachekey] = (content, self.counter, preamble) + def register(self, cachekey, content): + self[cachekey] = (content, self.counter) self.counter = self.counter + 1 def extract_preambles(self): - return [(p[1], p[0]) for p in self.values() if p[2]] + return [(p[1], p[0]) for p in self.values() if p[0].generate_preambel] # have one such cache on the module level. It is easier than handing around an instance of it. @@ -72,21 +72,23 @@ class _RegisteredFunction(object): """ The data structure for a function that accesses UFL2LoopyDataCache """ def __init__(self, func, cache_key_generator=lambda *a : freeze(a), - generate_preamble=True + generate_preamble=False, + return_content=False ): self.func = func self.cache_key_generator = cache_key_generator self.generate_preamble = generate_preamble + self.return_content = return_content def __call__(self, *args): - cache_key = (self.func, self.cache_key_generator(*args)) + cache_key = (self, self.cache_key_generator(*args)) if cache_key in _cache: - if not self.generate_preamble: + if self.return_content: return _cache[cache_key][0] else: content = self.func(*args) - _cache.register(cache_key, content, self.generate_preamble) - if not self.generate_preamble: + _cache.register(cache_key, content) + if self.return_content: return content @@ -112,6 +114,9 @@ def _dune_decorator_factory(**factory_kwargs): This is usually not the case, when you generate something like symbol names. Those are inserted into other snippets, but not on their own right. + return_content : bool + Whether the content of the cache should be returned on subsequent function calls. + If the cache is only used for requirements tracking, this is not needed. """ def _dec(*args, **kwargs): # Modify the kwargs according to the factorys kwargs @@ -127,7 +132,7 @@ def _dune_decorator_factory(**factory_kwargs): # A decorator for a dune preambel -dune_preambel = _dune_decorator_factory() +dune_preambel = _dune_decorator_factory(generate_preamble=True) # A decorator for a dune symbol name -dune_symbol = _dune_decorator_factory(generate_preamble=False) +dune_symbol = _dune_decorator_factory(return_content=True)