Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
#sql_archive(None,init),
#sql_archive('sqlite:///memo.db',init),
#sql_archive('memo',init),
]
#FIXME: even 'safe' archives throw Error when cache.load, cache.dump fails
# (often demonstrated in sqltable_archive, as barfs on tuple & dict)
#XXX: when running a single map, there should be 3 possible results:
# 1) flat=False may produce unhashable keys: all misses
# 2) typed=False doesn't distinguish float & int: more hits & loads
# 3) typed=True distingushes float & int: less hits & loads
#XXX: due to the seed, each of the 3 cases should yield the same results
maps = [
None,
keymap(typed=False, flat=True, sentinel=NOSENTINEL),
keymap(typed=False, flat=False, sentinel=NOSENTINEL),
#FIXME: keymap of (typed=True,flat=True) fails w/ dir_archive on Windows b/c
# keymap(typed=True, flat=True, sentinel=NOSENTINEL), # bad directory name?
keymap(typed=True, flat=False, sentinel=NOSENTINEL),
#keymap(typed=False, flat=True, sentinel=SENTINEL),
#keymap(typed=False, flat=False, sentinel=SENTINEL),
#keymap(typed=True, flat=True, sentinel=SENTINEL),
#keymap(typed=True, flat=False, sentinel=SENTINEL),
hashmap(typed=False, flat=True, sentinel=NOSENTINEL),
hashmap(typed=False, flat=False, sentinel=NOSENTINEL),
hashmap(typed=True, flat=True, sentinel=NOSENTINEL),
hashmap(typed=True, flat=False, sentinel=NOSENTINEL),
#hashmap(typed=False, flat=True, sentinel=SENTINEL),
#hashmap(typed=False, flat=False, sentinel=SENTINEL),
#hashmap(typed=True, flat=True, sentinel=SENTINEL),
#hashmap(typed=True, flat=False, sentinel=SENTINEL),
stringmap(typed=False, flat=True, sentinel=NOSENTINEL),
archives = [
hdf_archive('memo.hdf5',init,serialized=True,meta=False),
hdf_archive('memo.h5',init,serialized=False,meta=False),
hdf_archive('xxxx.hdf5',init,serialized=True,meta=True),
hdf_archive('xxxx.h5',init,serialized=False,meta=True),
# hdfdir_archive('memoq',init,serialized=False,meta=False),
hdfdir_archive('memor',init,serialized=True,meta=False),
# hdfdir_archive('memos',init,serialized=False,meta=True),
hdfdir_archive('memot',init,serialized=True,meta=True),
#FIXME: hdfdir_archive fails with serialized=False in python 3.x
]
maps = [
None,
keymap(typed=False, flat=True, sentinel=NOSENTINEL),
keymap(typed=False, flat=False, sentinel=NOSENTINEL),
keymap(typed=True, flat=False, sentinel=NOSENTINEL),
hashmap(typed=False, flat=True, sentinel=NOSENTINEL),
hashmap(typed=False, flat=False, sentinel=NOSENTINEL),
hashmap(typed=True, flat=True, sentinel=NOSENTINEL),
hashmap(typed=True, flat=False, sentinel=NOSENTINEL),
stringmap(typed=False, flat=True, sentinel=NOSENTINEL),
stringmap(typed=False, flat=False, sentinel=NOSENTINEL),
stringmap(typed=True, flat=True, sentinel=NOSENTINEL),
stringmap(typed=True, flat=False, sentinel=NOSENTINEL),
picklemap(typed=False, flat=True, sentinel=NOSENTINEL),
picklemap(typed=False, flat=False, sentinel=NOSENTINEL),
picklemap(typed=True, flat=True, sentinel=NOSENTINEL),
picklemap(typed=True, flat=False, sentinel=NOSENTINEL),
]
for mapper in maps:
#print (mapper)
def __add__(self, other):
"""concatenate two keymaps, to produce a new keymap"""
if not isinstance(other, keymap):
raise TypeError("can't concatenate '%s' and '%s' objects" % (self.__class__.__name__, other.__class__.__name__))
k = copy(other)
#k.__chain__ = __chain__(self, k)
k.__inner__ = copy(self) #XXX: or just... self ?
k.__outer__ = copy(other) #XXX: or just... other ?
return k
def _memoize(self, solver, tol=1, all=False, size=None):
"""apply caching to ensemble solver instance"""
archive = self.archive if all else self.cache
from klepto import lru_cache as _cache #XXX: or lru_? or ?
from klepto.keymaps import keymap
km = keymap()
ca = _cache(maxsize=size, ignore=('**','out'),
tol=tol, cache=archive, keymap=km)
@ca
def memo(*args, **kwds):
return kwds['out']
l = -1 if self._inv else 1
if all: #FIXME: applied *after* _solve; should be *during* _solve
cache = memo.__cache__()
for _solver in solver._allSolvers:
if _solver._evalmon:
param = _solver._evalmon._x
cost = _solver._evalmon._y #FIXME: python2.5
cache.update((tuple(x),l*y) for (x,y) in zip(param,cost))
else:
- call: __call__ the function with the most recently provided arguments
- valid: True if the most recently provided arguments are valid
- key: get the cache key for the most recently provided arguments
- keymap: get the registered keymap [default: klepto.keymaps.keymap]
- register: register a new keymap
The function is not evaluated until the 'call' method is called. Both
generating the key and checking for validity avoid calling the function
by inspecting the function's input signature.
The default keymap is keymaps.keymap(flat=True). Alternate keymaps can be
set with the 'register' method on the decorated function."""
# returns (*varargs, **kwds) where all info in kwds except varargs
# however, special cases (builtins, etc) return (*args, **kwds)
_map = kwds.get('keymap', None)
if _map is None: _map = kleptokeymap()
tol = kwds.get('tol', None)
deep = kwds.get('deep', False)
if deep: rounded = deep_round
else: rounded = simple_round
# enable rounding
@rounded(tol)
def rounded_args(*args, **kwds):
return (args, kwds)
def dec(f):
_args = [(),{}]
_keymap = [_map] #[kleptokeymap()]
def last_args():
"get the most recently provided (*args, **kwds)"
return _args[0],_args[1]
def func(*args, **kwds):
_args[0] = args
if not isinstance(other, keymap):
raise TypeError("can't concatenate '%s' and '%s' objects" % (self.__class__.__name__, other.__class__.__name__))
k = copy(other)
#k.__chain__ = __chain__(self, k)
k.__inner__ = copy(self) #XXX: or just... self ?
k.__outer__ = copy(other) #XXX: or just... other ?
return k
# interface
sentinel = property(__get_sentinel, __sentinel)
inner = property(__get_inner, __chain)
outer = property(__get_outer, __chain)
pass
class hashmap(keymap):
"""tool for converting a function's input signature to an unique key
This keymap generates a hash for the given object. Not all objects are
hashable, and generating a hash incurrs some information loss. Hashing
is fast, however there is not a method to recover the input signature
from a hash.
""" #XXX: algorithm as first argument? easier to build, but less standard
def __init__(self, typed=False, flat=True, sentinel=NOSENTINEL, **kwds):
'''initialize the key builder
typed: if True, include type information in the key
flat: if True, flatten the key to a sequence; if False, use (args, kwds)
sentinel: marker for separating args and kwds in flattened keys
algorithm: string name of hashing algorithm [default: use python's hash]
This keymap stores function args and kwds as (args, kwds) if flat=False,
Use kelpto.crypto.encodings() to get the names of available string
encodings.
'''
self.__type__ = kwds.pop('encoding', None)
keymap.__init__(self, typed=typed, flat=flat, sentinel=sentinel, **kwds)
self.__stub__ = 'encoding' #XXX: unnecessary if unified kwd
return
def encode(self, *args, **kwds):
"""use a flattened scheme for generating a key"""
return string(keymap.encode(self, *args, **kwds), encoding=self.__type__, **self._config)
def encrypt(self, *args, **kwds):
"""use a non-flat scheme for generating a key"""
return string(keymap.encrypt(self, *args, **kwds), encoding=self.__type__, **self._config)
class picklemap(keymap):
"""tool for converting a function's input signature to an unique key
This keymap serializes objects by pickling the object. Serializing an
object with pickle is relatively slower, however will reliably produce a
unique key for all picklable objects. Also, pickling is a reversible
operation, where the original input signature can be recovered from the
generated key.
""" #XXX: serializer as first argument? easier to build, but less standard
def __init__(self, typed=False, flat=True, sentinel=NOSENTINEL, **kwds):
'''initialize the key builder
typed: if True, include type information in the key
flat: if True, flatten the key to a sequence; if False, use (args, kwds)
sentinel: marker for separating args and kwds in flattened keys
serializer: string name of pickler [default: use python's repr]
Returns:
klepto db object (has dictionary-like interface)
Notes:
If keys is None, create a direct handle to the db.
If a key in keys is not found, it will be ignored.
"""
if type is None:
from klepto.archives import dir_archive as _archive
else:
_archive = type
if keys is None:
return _archive(name, cached=False)
if keymap is None:
from klepto.keymaps import keymap as _kmap
keymap = _kmap()
archive = _archive(name, cached=True)
if keys is False:
return archive
if keys is True:
archive.load()
else: # apply keymap to keys
archive.load(*(keymap(*(k if hasattr(k, '__len__') else (k,))) for k in keys))
return archive # archive with keymapped keys
def encode(self, *args, **kwds):
"""use a flattened scheme for generating a key"""
return string(keymap.encode(self, *args, **kwds), encoding=self.__type__, **self._config)
def encrypt(self, *args, **kwds):
def encrypt(self, *args, **kwds):
"""use a non-flat scheme for generating a key"""
return hash(keymap.encrypt(self, *args, **kwds), algorithm=self.__type__, **self._config)