Source code for cv19gm.utils.cv19files

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import toml

import os
package_directory = os.path.dirname(os.path.abspath(__file__))

import cv19gm.data.cv19data as cv19data
import cv19gm.utils.cv19functions as cv19functions 
import cv19gm.utils.cv19timeutils as cv19timeutils

"""
# ------------------------------------------------- #   
#                                                   #
#            Configuration File manager             #
#                                                   #
# ------------------------------------------------- #
To Do:
  * Improve this code
  * Input data is not working yet in here
  * Fix meta-population dynamic parameters
  * 
   
"""

[docs]def loadconfig(sim,config,inputdata=None,**kwargs): # ------------------------------- # # Parameters Load # # ------------------------------- # load_default(sim) # Serves for loading optional parameters when they are not defined # Update parameters using config file if type(config) == dict: # If config is a dictionary sim.cfg.update(config) elif type(config) == str: # If config is a filepath sim.cfg.update(toml.load(config)) # Import static variables for key,value in sim.cfg['parameters']['static'].items(): # Check if the variable is in kwargs if key in kwargs: value = kwargs[key] # Overwrite by kwargs values sim.cfg['parameters']['static'][key]=value # Update config with kwargs values sim.__dict__.update({key:value}) # t_end and t_init are useful when the simulation time should be relative to others sim.tsim = sim.t_end - sim.t_init # Build dynamic variables #TODO: Simplify this code if "Metapopulation" in sim.compartmentalmodel: # Metapopulation for key,value in sim.cfg['parameters']['dynamic'].items(): if key in kwargs: value = kwargs[key] sim.cfg['parameters']['dynamic'][key] = value if type(value) == list or type(value) == np.ndarray: sim.__dict__.update({key:cv19functions.build_metapopulation(value)}) else: sim.__dict__.update({key:cv19functions.build(value)}) else: for key,value in sim.cfg['parameters']['dynamic'].items(): if key in kwargs: value = kwargs[key] sim.cfg['parameters']['dynamic'][key] = value sim.__dict__.update({key:cv19functions.build(value)}) # Ephemeris if 'ephemeris' in sim.cfg: sim.ephemeris = sim.cfg['ephemeris'] # Data: for key,value in sim.cfg['data'].items(): if key in kwargs: value = kwargs[key] sim.cfg['data'][key] = value sim.__dict__.update({key:value}) # Convert to datetime format if it's a string if sim.initdate and type(sim.initdate) == str: sim.initdate = cv19timeutils.txt2Datetime(sim.initdate) # cv19data object if inputdata: sim.inputdata = inputdata sim.data = sim.inputdata.data sim.initdate = sim.inputdata.initdate #if not type(sim.initdate) == datetime.datetime: # sim.initdate = cv19timeutils.txt2Datetime(sim.initdate) #sim.country = sim.inputdata.country sim.state = sim.inputdata.tstate #sim.county = sim.inputdata.county #if sim.inputdata.loc_name: #sim.loc_name = sim.inputdata.loc_name else: # Local file if sim.datafile: # Falta construir funcion para cargar datos desde archivos, pero primero tengo que construir ese archivo sim.data = pd.DataFrame(sim.cfg['data']['datafile']) sim.inputdata = None elif sim.importdata: #sim.inputdata = cv19data.ImportData(country=sim.country,state=sim.state,county=sim.county,healthservice=sim.healthservice,initdate=sim.initdate,user = None,password = None) sim.inputdata = cv19data.ImportData(tstate=sim.state,initdate=sim.initdate,user = None,password = None) sim.inputdata.import_data() sim.data = sim.inputdata.data else: # No data added sim.data = None sim.inputdata = None # ------------------------------- # # Initial conditions # # ------------------------------- # sim.initialconditions = sim.cfg['initialconditions'] for key,value in sim.initialconditions.items(): # Overwrite by kwargs values if key in kwargs: value = kwargs[key] if type (value) == list: value = np.array(value) sim.initialconditions[key] = value sim.cfg['initialconditions'][key] = value # Initializing variables with external data if available if type(value) == str: # Crear error cuando no haya archivo de datos y fecha inicial try: sim.__dict__.update({key:sim.data[value][0]}) except: sim.__dict__.update({key:sim.inputdata.__dict__[value]}) else: # Using the values expressed in the configuration file if type (value) == list: value = np.array(value) sim.__dict__.update({key:value}) return
[docs]def load_default(sim): sim.cfg = getdefault(sim.compartmentalmodel) # Static variables for key,value in sim.cfg['parameters']['static'].items(): sim.__dict__.update({key:value}) # Dynamic variables for key,value in sim.cfg['parameters']['dynamic'].items(): sim.__dict__.update({key:cv19functions.build(value)}) # Initial conditions sim.initialconditions = sim.cfg['initialconditions'] for key,value in sim.cfg.items(): sim.__dict__.update({key:value}) return
[docs]def getdefault(compartmentalmodel): return toml.load(os.path.abspath(package_directory+'/../default_config_files/'+compartmentalmodel+'.toml'))
[docs]def saveconfig(filename,config): with open(filename, "w") as toml_file: toml.dump(config, toml_file) print('Configuration file saved in:\n'+filename)#update return
[docs]def savedata(data=None,simulation=None,filename=None): if data: pass elif simulation: pass else: print("No data given") # raise error return return
[docs]def unwrapconfig(config,**kwargs): # ------------------------------- # # Parameters Load # # ------------------------------- # out = {} if type(config) == dict: cfg = config else: cfg = toml.load(config) # Model out.update({'model':cfg['model']}) # Import fixed variables for key,value in cfg['parameters']['static'].items(): if key in kwargs: value = kwargs[key] cfg['parameters']['static'][key]=value out.update({key:value}) # Build functions for key,value in cfg['parameters']['dynamic'].items(): if key in kwargs: value = kwargs[key] cfg['parameters']['dynamic'][key] = value out.update({key:value}) # Ephemeris if 'ephemeris' in cfg: out.update({'ephemeris':cfg['ephemeris']}) # Data: for key,value in cfg['data'].items(): if key in kwargs: value = kwargs[key] cfg['data'][key] = value out.update({key:value}) # ------------------------------- # # Initial conditions # # ------------------------------- # for key,value in cfg['initialconditions'].items(): if key in kwargs: value = kwargs[key] cfg['initialconditions'][key] = value out.update({key:value}) return out