diff --git a/binarycpython/utils/cache.py b/binarycpython/utils/cache.py index 50dfe03c00455af1f82ab6b4a82635a736bdcf2e..f34037e41b99bc2ab211a2188531acc6c166748b 100644 --- a/binarycpython/utils/cache.py +++ b/binarycpython/utils/cache.py @@ -10,6 +10,7 @@ Please see the LRU_* options in there. import cachetools import contextlib import functools +import getpass import importlib import os import sys @@ -17,6 +18,27 @@ import time import tempfile class cache(): + + + def __init__(self, **kwargs): + # don't do anything: we just inherit from this class + return + + def default_cache_dir(self): + """ + Return a default cache directory path for binary_c-python, or None if we cannot find one. This is used in grid_options_defaults.py + """ + error_string = "__*ERR*__" # string that cannot be a path + for path in [ + os.path.join(os.environ.get('HOME',error_string), '.cache'), + os.path.join(os.environ.get('TMP',error_string), 'cache'), + os.path.join('var','tmp',getpass.getuser(),'cache') + ]: + if not error_string in path and os.path.isdir(path): + return os.path.join(path,'binary_c') + return None + + class NullCache(cachetools.Cache): """ A cachetools cache object that does as little as possible and never matches. @@ -32,10 +54,6 @@ class cache(): def __delitem__(self, key): return - def __init__(self, **kwargs): - # don't do anything: we just inherit from this class - return - def setup_function_cache(self,vb=False,type=None): """ Function to wrap binary_c-python's functions in function cache. diff --git a/binarycpython/utils/grid_options_defaults.py b/binarycpython/utils/grid_options_defaults.py index 1d1538ff99061551373aa36188576fedfe377f94..c01dfa456240fc79cc1f78d353719c55318c5f74 100644 --- a/binarycpython/utils/grid_options_defaults.py +++ b/binarycpython/utils/grid_options_defaults.py @@ -42,7 +42,7 @@ class grid_options_defaults(): "parse_function": None, # Function to parse the output with. "multiplicity_fraction_function": 0, # Which multiplicity fraction function to use. 0: None, 1: Arenou 2010, 2: Rhagavan 2010, 3: Moe and di Stefano 2017 "tmp_dir": temp_dir(), # Setting the temp dir of the program - "cache_dir" : None, # Cache location + "cache_dir" : self.default_cache_dir(), # Cache location, usually $HOME/.cache "status_dir" : None, # "_main_pid": -1, # Placeholder for the main process id of the run. "save_ensemble_chunks": True, # Force the ensemble chunk to be saved even if we are joining a thread (just in case the joining fails) @@ -571,3 +571,16 @@ class grid_options_defaults(): file=filehandle, ) print("", file=filehandle) + + def default_cache_dir(self): + """ + Return a default cache directory path, or None if we cannot find one. + """ + error_string = "__*ERR*__" # string that cannot be a path + for path in [ + os.path.join(os.environ.get('HOME',error_string), '.cache', 'binary_c'), + os.path.join(os.environ.get('TMP',error_string), 'cache'), + ]: + if not error_string in path and os.path.isdir(path): + return path + return None diff --git a/binarycpython/utils/spacing_functions.py b/binarycpython/utils/spacing_functions.py index 61f90e73c830d37c2e3bd69967cdfefe9b792393..14cab7627a4c3a6e65fc1d5d4a1cbf24c43cf29e 100644 --- a/binarycpython/utils/spacing_functions.py +++ b/binarycpython/utils/spacing_functions.py @@ -13,7 +13,10 @@ import json import math import numpy as np import py_rinterpolate +import traceback import sys + +import traceback from typing import Union class spacing_functions(): @@ -205,8 +208,9 @@ class spacing_functions(): showlist: if True, show the mass list once generated logmasses: if True, the masses are logged with math.log() log10masses: if True, the masses are logged with math.log10() - usecache: if True (the default) uses cached results if they are saved (in cachedir) - cachedir: if None, defaults to grid_options['tmp_dir']/const_dt_cache + usecache: if True (the default) uses cached results if they are saved (in cachedir) and cachedir is not None + cachedir: where the cache is stored. if None, defaults to grid_options['cache_dir']+'/const_dt_cache' + vb : verbose logging flag (default False) Returns: Array of masses. @@ -222,12 +226,21 @@ class spacing_functions(): samplerfunc="self.const_dt(self,dlogt=0.1,nres=100,mmin=0.07,mmax=80.0,maxdm=((0.07,1.0,0.1),(1.0,10.0,1.0),(10.0,80.0,2.0)),showtable=True,logspacing=True,fsample=1.0/4.0)" """ - print("Cache dir {}".format(self.grid_options['cache_dir'])) - if cachedir is not None: - cachedir = self.grid_options['cache_dir'] + '/const_dt_cache' - cache = diskcache.Cache(cachedir) - else: - cache = None + + if usecache: + if cachedir is None: + cachedir = self.grid_options['cache_dir'] + + if cachedir is not None: + cachedir += '/const_dt_cache' + cache = diskcache.Cache(cachedir) + print("Use const_dt cache in {} [cache object {}]".format( + cachedir, + cache)) + else: + print("const_dt uses no cache") + cache = None + def _const_dt_wrapper(cachedir=None, num_cores=None, bse_options=None, @@ -249,10 +262,30 @@ class spacing_functions(): showlist=False, showtable=False, usecache=True, + vb=False ): - print("call _const_dt num_cores={} dt={} dlogt={} mmin={} mmax={} nres={} logspacing={} tmin={} mindm={} maxdm={} fsample={} factor={} logmasses={} log10masses={}".format( - num_cores,dt,dlogt,mmin,mmax,nres,logspacing,tmin,mindm,maxdm,fsample,factor,logmasses,log10masses)) - + print("call _const_dt num_cores={} dt={} dlogt={} mmin={} mmax={} nres={} logspacing={} tmin={} mindm={} maxdm={} fsample={} factor={} logmasses={} log10masses={} showlist={} usecache={} [cache={} vb={}]".format( + num_cores, + dt, + dlogt, + mmin, + mmax, + nres, + logspacing, + tmin, + mindm, + maxdm, + fsample, + factor, + logmasses, + log10masses, + showlist, + usecache, + cache, + vb)) + + if vb: + traceback.print_stack() # strip bse_options of options that will not affect # _const_dt @@ -268,6 +301,8 @@ class spacing_functions(): bse_options_json = json.dumps(bse_stripped, sort_keys=True, ensure_ascii=False) + if vb: + print("BSE options JSON:",bse_options_json) return _const_dt(cachedir=cachedir, num_cores=num_cores, @@ -304,7 +339,7 @@ class spacing_functions(): else: __decorator = __dummy_decorator - @__decorator + @__decorator() def _const_dt(cachedir=None, num_cores=None, bse_options_json=None, # JSON string