Code source de tinamit.mod.corrida

import itertools

from tinamit.config import _
from tinamit.mod.res import ResultadosSimul


class Corrida(object):
    def __init__(símismo, nombre, t, extern, vars_mod, vars_interés, clima):
        símismo.nombre = nombre
        símismo.t = t

        símismo.extern = extern

        símismo.variables = vars_mod

        símismo.clima = clima

        símismo.resultados = vars_mod.gen_res(
            nombre=nombre, t=t, vars_interés=vars_interés
        )

    def actualizar_res(símismo):
        if símismo.t.t_guardar():
            símismo.resultados.actualizar()

    def obt_extern_act(símismo, var=None):
        if símismo.extern:
            return {vr: vl.values[0] for vr, vl in símismo.extern.obt_vals(símismo.t, var=var).items()}

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


[docs]class Rebanada(object): """Una rebanada del eje de tiempo que corresponde al paso actual.""" def __init__(símismo, n_pasos, resultados): """ Parameters ---------- n_pasos: int El número de pasos que debe incrementar el modelo. resultados: ResultadosSimul Objeto de resultados deseados. El modelo tiene que leer los egresos únicamente de los variables de interés presentes en este objeto y guardarlos en `símismo.variables` (otros variables de egreso se pueden ignorar). """ símismo.n_pasos = n_pasos símismo.resultados = resultados
class PlantillaOpsSimulGrupo(object): """ Clase pariente para especificaciones de corridas en grupo. """ def __init__(símismo, **argsll): símismo.opciones = argsll for ll, v in símismo.opciones.items(): if not isinstance(v, list): símismo.opciones[ll] = [v] def __iter__(símismo): raise NotImplementedError
[docs]class OpsSimulGrupoCombin(PlantillaOpsSimulGrupo): """ Corridas en grupo que generan todas las combinaciones posibles de las opciones de simulación especificadas. """ def __init__(símismo, t, extern=None, clima=None, vars_interés=None, nombre='Tinamït'): símismo.nombre = nombre símismo.vars_interés = vars_interés super().__init__(t=t, extern=extern, clima=clima) def __iter__(símismo): ops = itertools.product(*símismo.opciones.values()) nmbs = ['t', 'extern', 'clima'] for i, op in enumerate(ops): yield { **{n: o for n, o in zip(nmbs, op)}, 'nombre': '{}_{}'.format(símismo.nombre, str(i)), 'vars_interés': símismo.vars_interés }
[docs]class OpsSimulGrupo(PlantillaOpsSimulGrupo): """ Corridas en grupo sin combinaciones (las primeras opciones de cada parámetro se corrirán juntas en una simulación, seguidas por las segundas, etc.). """ def __init__(símismo, t, extern=None, clima=None, vars_interés=None, nombre='Tinamït'): símismo.nombre = nombre símismo.vars_interés = vars_interés args = { 't': t, 'extern': extern, 'clima': clima } if not isinstance(nombre, str): args['nombre'] = nombre super().__init__(**args) tmñs = {len(o) for o in símismo.opciones.values() if len(o) != 1} if len(tmñs) > 1: raise ValueError(_('Todas las opciones deben tener el mismo número de valores.')) elif not tmñs: símismo.tmñ_ops = 1 else: símismo.tmñ_ops = list(tmñs)[0] if 'nombre' not in símismo.opciones: símismo.opciones['nombre'] = ['{}_{}'.format(nombre, str(i)) for i in range(símismo.tmñ_ops)] def __iter__(símismo): for i in range(símismo.tmñ_ops): yield { **{n: op[i] if len(op) > 1 else op[0] for n, op in símismo.opciones.items()}, 'vars_interés': símismo.vars_interés }