julienmalard/Tikon

View on GitHub
tikon/central/paráms_exper.py

Summary

Maintainability
B
6 hrs
Test Coverage
import numpy as np
from scipy.stats import expon, norm

from tikon.ecs import Parám
from tikon.ecs.aprioris import APrioriDens, APrioriDist
from tikon.ecs.paráms import ValsParámCoso, ValsParámCosoInter, MatrParám
from tikon.ecs.árb_coso import ParámCoso
from tikon.utils import EJE_PARÁMS, EJE_ESTOC, EJE_TIEMPO
from ..ecs.dists.utils import proc_líms
from .datos import DatosVar, DatosMód


class PlantillaParámsExper(dict):
    def __init__(símismo, nombre, exper, sim, datos, n_reps):
        símismo.nombre = nombre
        símismo.exper = exper
        símismo.sim = sim
        símismo.datos = datos
        símismo.n_reps = n_reps
        super().__init__()

    def vals_paráms(símismo):
        return [val for s in símismo for val in símismo[s].vals_paráms()]

    def iniciar(símismo):
        for s in símismo:
            símismo[s].iniciar()

    def __str__(símismo):
        return símismo.nombre


class ParámsExperVar(PlantillaParámsExper):

    def __init__(símismo, nombre, exper, sim, datos, n_reps):
        super().__init__(nombre, exper, sim=sim, datos=datos, n_reps=n_reps)
        líms = proc_líms(sim.líms)
        # para hacer: estandardizar
        if símismo.datos.obs:
            ref = min(líms[1], np.nanmax([np.nanmax(o_.datos.values) for o_ in símismo.datos.obs]))
            if líms == (0, np.inf):
                apriori = APrioriDist(expon(0, ref))
            else:
                apriori = APrioriDist(norm(0, ref))
        else:
            apriori = sim.apriori

        símismo.prm = ParámInic(símismo.datos.prm, exper=exper, unids=sim.unids, líms=sim.líms, apriori=apriori)
        índs = list(sim.iter_índs(datos=sim.datos, excluir=[EJE_TIEMPO, EJE_PARÁMS, EJE_ESTOC]))
        coords = {
            dim: sim.datos.coords[dim] for dim in sim.datos.dims if dim not in [EJE_TIEMPO, EJE_PARÁMS, EJE_ESTOC]
        }

        for índ in índs:
            l_índ = list(índ.values())
            apriori_inic = símismo.datos.prm.apriori(inter=l_índ, heredar=True)
            if apriori_inic:
                símismo.prm.espec_apriori(APrioriDist(apriori_inic), inter=l_índ)
            else:
                apriori = sim.apriori_de_obs(símismo.datos.obs, índ)
                if apriori:
                    símismo.prm.espec_apriori(apriori, inter=l_índ)

        símismo.prm.de_dic(símismo.datos.prm.a_dic())

        def _gen_matr_prm(crds, índs_=None, inter=None):
            índs_ = [] if índs_ is None else índs_
            inter = inter or []
            if crds:
                eje = list(crds)[0]
                crds = dict(crds)
                índs_ = crds.pop(eje)
                cls = MatrParám if índs_ is None else ValsParámCosoInter
                return cls([
                    _gen_matr_prm(crds=crds, índs_=í, inter=inter + [í]) for í in índs_
                ], eje=eje, índice=inter[-1] if len(inter) else None
                )
            else:
                return ValsParámCoso(tmñ=símismo.n_reps, prm_base=símismo.prm, índice=índs_, inter=inter)

        símismo.matr = _gen_matr_prm(coords)

    def vals_paráms(símismo):
        return símismo.matr.vals_paráms()

    def iniciar(símismo):
        símismo.matr.act_vals()

    def a_dic(símismo):
        """No incluimos observaciones en el diccionario para guardar."""
        return símismo.prm.a_dic()

    def de_dic(símismo, d):
        símismo.prm.de_dic(d)


class ParámsExperMód(PlantillaParámsExper):

    def __init__(símismo, nombre, exper, sim, datos, n_reps):
        super().__init__(nombre, exper, sim, datos, n_reps)

        for var in símismo.sim:
            if símismo.sim[var].inicializable:
                if var not in símismo.datos:
                    símismo.datos[var] = DatosVar(var)
                datos = símismo.datos[var]
                símismo[var] = ParámsExperVar(var, exper, símismo.sim[var], datos=datos, n_reps=n_reps)


class ParámsExper(PlantillaParámsExper):

    def __init__(símismo, exper, sim):
        super().__init__(exper.nombre, exper, sim, datos=exper.datos, n_reps=sim.reps['paráms'])

        símismo.exper = exper
        for mód in símismo.sim:
            if mód not in símismo.datos:
                símismo.datos[mód] = DatosMód(mód)
            datos = símismo.datos[mód]
            símismo[mód] = ParámsExperMód(mód, exper, símismo.sim[mód], datos=datos, n_reps=símismo.n_reps)


class ParámInic(ParámCoso):

    def __init__(símismo, prm_espejo, exper, unids, líms, apriori):
        símismo.prm_espejo = prm_espejo
        nombre = prm_espejo.nombre
        atribs = {'nombre': nombre, 'unids': unids, 'líms': líms, 'apriori': apriori}
        super().__init__(pariente=type(nombre, (Parám,), atribs), coso=exper)

    def agregar_calib(símismo, id_cal, dist, inter=None):
        símismo.prm_espejo.agregar_calib(id_cal, dist, inter)