Module project.PSO.utils
Expand source code
import pickle
from enum import Enum
from pprint import pprint
from random import randint
import numpy as np
import project.esn.core as core
import project.esn.transformer as transf
import project.PSO.config as c
import project.esn.core as core
import random as r
from pprint import pprint
def bind_enum_idx(idx: float, e: Enum) -> int:
return int(idx) if int(idx) < len(list(e)) else int(idx) - 1
def map_params(**PSO_kwargs) -> dict:
for k, v in PSO_kwargs.items():
if k in ["t_squeeze", "squeeze_o"]:
PSO_kwargs[k] = list(transf.Squeezers)[bind_enum_idx(
v, transf.Squeezers)].value
if k == "transformer":
PSO_kwargs[k] = list(transf.Transformers)[bind_enum_idx(
v, transf.Transformers)]
if k == "reservoir":
PSO_kwargs[k] = list(c.Res)[bind_enum_idx(v, c.Res)]
return PSO_kwargs
def res_name(conf: dict) -> list:
return [
str(v) for k, v in conf.items()
if k not in ["desired", "output", "input"]
]
def run_net_load_matrix(load_param: c.Res, **kwargs) -> dict:
run_dict = core.Run(**{
**c.esn_gen,
**kwargs
}).load((c.path + load_param.value), randint(0, 9)).__enter__()()
with open(c.path_esn + "_".join(res_name(run_dict)), "wb") as f:
pickle.dump(run_dict, f)
return run_dict
def run_network(out_transf: transf.Transformer = transf.Transformers.sig_prob,
**PSO_kwargs) -> tuple:
PSO_kwargs = map_params(**PSO_kwargs)
load_param = PSO_kwargs.pop("reservoir") if PSO_kwargs.get(
"reservoir", None) else None
run_dict = (run_net_load_matrix(load_param, **PSO_kwargs)
if load_param else core.Run(**{
**c.esn_gen,
**PSO_kwargs
}).__enter__()())
pprint(f"dumped conf : {PSO_kwargs}")
return ((raw_out := run_dict["output"]),
out_transf.value(0.8,
transf._identity)(raw_out), run_dict["desired"])
check_default = lambda obj, default, call, *args, **kwargs: (
obj if obj is not None else
(default(*args, **kwargs)
if hasattr(default, "__call__") and call else default))
def enum_rand_idx(e: Enum, velocity: bool) -> float:
return np.random.uniform(0 if not velocity else -len(list(e)),
len(list(e)))
def check_transformer(dims: dict):
if "transformer" in (keys := dims.keys()):
if "t_param" not in keys:
dims["t_param"] = (0.05, 1)
if "t_squeeze" not in keys:
dims["t_squeeze"] = transf.Squeezers
def distribute_dimensions(dims: dict, velocity: bool = False) -> float:
check_transformer(dims)
ret = []
for k, v in dims.items():
if k in ["t_squeeze", "squeeze_o"] and v.__name__ == "Squeezers":
ret.append(enum_rand_idx(transf.Squeezers, velocity))
elif k == "transformer" and v.__name__ == "Transformers":
ret.append(enum_rand_idx(transf.Transformers, velocity))
elif k == "reservoir" and v.__name__ == "Res":
ret.append(enum_rand_idx(c.Res, velocity))
elif isinstance(v, tuple):
up, low = v
ret.append(
np.random.uniform(up, low) if not velocity else np.random.
uniform(-np.abs(up - low), np.abs(up - low)))
return np.array(ret)
Functions
def bind_enum_idx(idx: float, e: enum.Enum) ‑> int-
Expand source code
def bind_enum_idx(idx: float, e: Enum) -> int: return int(idx) if int(idx) < len(list(e)) else int(idx) - 1 def check_default(obj, default, call, *args, **kwargs)-
Expand source code
check_default = lambda obj, default, call, *args, **kwargs: ( obj if obj is not None else (default(*args, **kwargs) if hasattr(default, "__call__") and call else default)) def check_transformer(dims: dict)-
Expand source code
def check_transformer(dims: dict): if "transformer" in (keys := dims.keys()): if "t_param" not in keys: dims["t_param"] = (0.05, 1) if "t_squeeze" not in keys: dims["t_squeeze"] = transf.Squeezers def distribute_dimensions(dims: dict, velocity: bool = False) ‑> float-
Expand source code
def distribute_dimensions(dims: dict, velocity: bool = False) -> float: check_transformer(dims) ret = [] for k, v in dims.items(): if k in ["t_squeeze", "squeeze_o"] and v.__name__ == "Squeezers": ret.append(enum_rand_idx(transf.Squeezers, velocity)) elif k == "transformer" and v.__name__ == "Transformers": ret.append(enum_rand_idx(transf.Transformers, velocity)) elif k == "reservoir" and v.__name__ == "Res": ret.append(enum_rand_idx(c.Res, velocity)) elif isinstance(v, tuple): up, low = v ret.append( np.random.uniform(up, low) if not velocity else np.random. uniform(-np.abs(up - low), np.abs(up - low))) return np.array(ret) def enum_rand_idx(e: enum.Enum, velocity: bool) ‑> float-
Expand source code
def enum_rand_idx(e: Enum, velocity: bool) -> float: return np.random.uniform(0 if not velocity else -len(list(e)), len(list(e))) def map_params(**PSO_kwargs) ‑> dict-
Expand source code
def map_params(**PSO_kwargs) -> dict: for k, v in PSO_kwargs.items(): if k in ["t_squeeze", "squeeze_o"]: PSO_kwargs[k] = list(transf.Squeezers)[bind_enum_idx( v, transf.Squeezers)].value if k == "transformer": PSO_kwargs[k] = list(transf.Transformers)[bind_enum_idx( v, transf.Transformers)] if k == "reservoir": PSO_kwargs[k] = list(c.Res)[bind_enum_idx(v, c.Res)] return PSO_kwargs def res_name(conf: dict) ‑> list-
Expand source code
def res_name(conf: dict) -> list: return [ str(v) for k, v in conf.items() if k not in ["desired", "output", "input"] ] def run_net_load_matrix(load_param: Res, **kwargs) ‑> dict-
Expand source code
def run_net_load_matrix(load_param: c.Res, **kwargs) -> dict: run_dict = core.Run(**{ **c.esn_gen, **kwargs }).load((c.path + load_param.value), randint(0, 9)).__enter__()() with open(c.path_esn + "_".join(res_name(run_dict)), "wb") as f: pickle.dump(run_dict, f) return run_dict def run_network(out_transf: Transformer = Transformers.sig_prob, **PSO_kwargs) ‑> tuple-
Expand source code
def run_network(out_transf: transf.Transformer = transf.Transformers.sig_prob, **PSO_kwargs) -> tuple: PSO_kwargs = map_params(**PSO_kwargs) load_param = PSO_kwargs.pop("reservoir") if PSO_kwargs.get( "reservoir", None) else None run_dict = (run_net_load_matrix(load_param, **PSO_kwargs) if load_param else core.Run(**{ **c.esn_gen, **PSO_kwargs }).__enter__()()) pprint(f"dumped conf : {PSO_kwargs}") return ((raw_out := run_dict["output"]), out_transf.value(0.8, transf._identity)(raw_out), run_dict["desired"])