Module project.expander.expander
Expand source code
import copy
import pickle
import signal
import project.esn.core as c
import project.esn.matrix as m
import project.esn.transformer as t
from project.esn.utils import *
from itertools import product,tee
@mydataclass(init=True, repr=True, check=True)
class Expander():
"""Class that performs a cartesian product of the gen_dict and then
call the _generator function for each configuration the _name_gen if
called witha configuration should return a valid name/path used to
dump the file
"""
_generator: callable
_name_gen: callable
gen_dict: lambda x: True
def __post_init__(self):
self._gen_cart = ({
k: v
for k, v in zip(self.gen_dict.keys(), elem)
} for elem in product(*[v for k, v in self.gen_dict.items()]))
def __call__(self):
self._gen_cart, copy = tee(self._gen_cart)
return ({
**elem,
"result": self._generator(**elem),
} for elem in copy)
def __invert__(self):
self._gen_cart, copy = tee(self._gen_cart)
return (self._name_gen(elem) for elem in copy)
def d_expander(inverter):
"""decorator that create a new Expander
"""
inner = lambda fun: lambda gen_dict, *args, **kwargs: Expander(
fun, inverter, gen_dict, *args, **kwargs)
return inner
def res_name(conf: dict):
""" name generator for the reservoir runs
"""
return [
str(v) for k, v in conf.items() if k not in ["result", "repetition"]
]
def esn_name(conf: dict):
"""name generator for the esn runs
"""
return str(
reduce(lambda x, y: hash(str(hash(str(y))) + str(hash(str(x)))),
conf.values()))
@d_expander(lambda x: "_".join(res_name(x)))
def gen_reservoir(spectral_radius=None,
density=None,
size=None,
repetition=None):
"""perform the reservoir generation
"""
return [
m.scale_spectral_smatrix(m.generate_smatrix(size,
size,
density=density),
spectral_radius=spectral_radius)
for _ in range(repetition)
]
@d_expander(esn_name)
def run_esn(repetition, matrix_path, idx, **kwargs):
"""run the esn with the current configuration
"""
return [
c.Run(**kwargs).load(matrix_path, idx).__enter__()()
for _ in range(repetition)
] if kwargs["transformer"] not in [
t.Transformers.threshold, t.Transformers.identity
] else [c.Run(**kwargs).load(matrix_path, idx).__enter__()()]
@mydataclass(init=True, repr=True, check=False)
class Pickler():
"""This class wraps an Expander, when called pickle all the results
of the expander process
"""
expander: Expander
path_to_dir: str
_dumper: callable = lambda x: x
max_exp: lambda x: x is True or isinstance(x, int) = True
verbose: bool = None
def __call__(self, max_exp=None):
if not max_exp is None:
self.max_exp = max_exp
for i, conf in enumerate(self.expander()):
if (not (self.max_exp is True)) and self.max_exp == i:
return self.path_to_dir
print(f"dump conf {i}{self._dumper(conf)}" if self.
verbose else f"dump conf {i}")
with open(
self.path_to_dir + self.expander._name_gen(conf),
"wb") as f:
pickle.dump(self._dumper(conf), f)
return self.path_to_dir
reservoir_pickler = lambda gen_dict, *args, **kwargs: Pickler(
gen_reservoir(gen_dict), *args, **kwargs)
esn_pickler = lambda gen_dict, *args, **kwargs: Pickler(
run_esn(gen_dict), *args, **kwargs, _dumper=lambda x: x["result"])
Functions
def d_expander(inverter)-
decorator that create a new Expander
Expand source code
def d_expander(inverter): """decorator that create a new Expander """ inner = lambda fun: lambda gen_dict, *args, **kwargs: Expander( fun, inverter, gen_dict, *args, **kwargs) return inner def esn_name(conf: dict)-
name generator for the esn runs
Expand source code
def esn_name(conf: dict): """name generator for the esn runs """ return str( reduce(lambda x, y: hash(str(hash(str(y))) + str(hash(str(x)))), conf.values())) def esn_pickler(gen_dict, *args, **kwargs)-
Expand source code
esn_pickler = lambda gen_dict, *args, **kwargs: Pickler( run_esn(gen_dict), *args, **kwargs, _dumper=lambda x: x["result"]) def gen_reservoir(gen_dict, *args, **kwargs)-
Expand source code
inner = lambda fun: lambda gen_dict, *args, **kwargs: Expander( fun, inverter, gen_dict, *args, **kwargs) def res_name(conf: dict)-
name generator for the reservoir runs
Expand source code
def res_name(conf: dict): """ name generator for the reservoir runs """ return [ str(v) for k, v in conf.items() if k not in ["result", "repetition"] ] def reservoir_pickler(gen_dict, *args, **kwargs)-
Expand source code
reservoir_pickler = lambda gen_dict, *args, **kwargs: Pickler( gen_reservoir(gen_dict), *args, **kwargs) def run_esn(gen_dict, *args, **kwargs)-
Expand source code
inner = lambda fun: lambda gen_dict, *args, **kwargs: Expander( fun, inverter, gen_dict, *args, **kwargs)
Classes
class Expander (_generator:, _name_gen: , gen_dict: Expander. at 0x7fe31c67edc0>) -
Class that performs a cartesian product of the gen_dict and then call the _generator function for each configuration the _name_gen if called witha configuration should return a valid name/path used to dump the file
Expand source code
class Expander(): """Class that performs a cartesian product of the gen_dict and then call the _generator function for each configuration the _name_gen if called witha configuration should return a valid name/path used to dump the file """ _generator: callable _name_gen: callable gen_dict: lambda x: True def __post_init__(self): self._gen_cart = ({ k: v for k, v in zip(self.gen_dict.keys(), elem) } for elem in product(*[v for k, v in self.gen_dict.items()])) def __call__(self): self._gen_cart, copy = tee(self._gen_cart) return ({ **elem, "result": self._generator(**elem), } for elem in copy) def __invert__(self): self._gen_cart, copy = tee(self._gen_cart) return (self._name_gen(elem) for elem in copy) class Pickler (expander: Expander, path_to_dir: str, max_exp:Pickler. at 0x7fe31c665820> = True, verbose: bool = None) -
This class wraps an Expander, when called pickle all the results of the expander process
Expand source code
class Pickler(): """This class wraps an Expander, when called pickle all the results of the expander process """ expander: Expander path_to_dir: str _dumper: callable = lambda x: x max_exp: lambda x: x is True or isinstance(x, int) = True verbose: bool = None def __call__(self, max_exp=None): if not max_exp is None: self.max_exp = max_exp for i, conf in enumerate(self.expander()): if (not (self.max_exp is True)) and self.max_exp == i: return self.path_to_dir print(f"dump conf {i}{self._dumper(conf)}" if self. verbose else f"dump conf {i}") with open( self.path_to_dir + self.expander._name_gen(conf), "wb") as f: pickle.dump(self._dumper(conf), f) return self.path_to_dirClass variables
var max_exp :Pickler. at 0x7fe31c665820> var verbose : bool