def reorder_preamble(pr): import sympy from dolang.triangular_solver import solve_triangular_system unknowns = [*pr.keys()] incidence = [[str(e) for e in sympy.sympify((exp)).atoms()] for exp in pr.values()] sol = solve_triangular_system(dict(zip(unknowns, incidence))) return dict([(k, pr[k]) for k in sol.keys()])
def calibration_to_vector(symbols, calibration_dict): from dolang.triangular_solver import solve_triangular_system from numpy import nan sol = solve_triangular_system(calibration_dict) calibration = dict() for group in symbols: # t = numpy.array([sol.get(s, nan) for s in symbols[group]], dtype=float) t = numpy.array([sol.get(s, nan) for s in symbols[group]], dtype=float) calibration[group] = t return calibration
def get_calibration(self): from dolang.symbolic import remove_timing import copy calibration = dict() for k, v in self.data.get("calibration", {}).items(): if v.tag == "tag:yaml.org,2002:str": expr = parse_string(v) expr = remove_timing(expr) expr = str_expression(expr) else: expr = float(v.value) kk = remove_timing(parse_string(k)) kk = str_expression(kk) calibration[kk] = expr from dolang.triangular_solver import solve_triangular_system return solve_triangular_system(calibration)
# with timeit("Conversion mod -> json"): # from dolo.compiler.import_dynare import import_dynare # model = import_dynare("/home/pablo/Downloads/EA_QUEST3.mod", output_type='json') # txt = json.dumps(model) # model['calibration'] # with open("EA_QUEST3.json",'w') as f: # json.dump(model,f) with timeit('Load json'): with open("EA_QUEST3.json") as f: model = json.load(f) model['symbols'].keys() with timeit("Solve triangular system"): calibration = model['calibration'] sol = solve_triangular_system(calibration) with timeit("Parse equations"): equations = model['equations'] compat = lambda s: s.replace("^", "**").replace('==', '=').replace( '=', '==') equations = [compat(eq) for eq in equations] equations = ['{} - ({})'.format(*str.split(eq, '==')) for eq in equations] equations = [parse_string(e) for e in equations] with timeit("stringify equations"): all_variables = [(v, 1) for v in model['symbols']['variables']] + \ [(v, 0) for v in model['symbols']['variables']] + \
# = e"ndogenous variables", n="0.33", z="zbar", rk="1/β-1+δ", w="(1-α)*exp(z)*(k/n)**(α)", k="n/(rk/α)**(1/(1-α))", y="exp(z)*k**α*n**(1-α)", i="δ*k", c="y - i", V="log(c)/(1-β)", u="c**(1-σ)/(1-σ) - χ*n**(1+η)/(1+η)", m="β/c**σ*(1-δ+rk)") from dolang.triangular_solver import solve_triangular_system calibration_dict = solve_triangular_system(calibration_strings) calibration_vector = calibration_to_vector(symbols, calibration_dict) calibration = CalibrationDict(symbols, calibration_vector) calibration ### ### Define functions ### # the basic formulation of the functions (aka kernel) # take and return "tuples" of floats because tuples are supposed # to be easy to be optimzed away by the compiler # after the definition of the function, there is some boilerplate # to translate these functions into broadcastable ones, with
def get_calibration(self): # if self.__calibration__ is None: from dolang.symbolic import remove_timing import copy symbols = self.symbols calibration = dict() for k, v in self.data.get("calibration", {}).items(): if v.tag == "tag:yaml.org,2002:str": expr = parse_string(v) expr = remove_timing(expr) expr = str_expression(expr) else: expr = float(v.value) kk = remove_timing(parse_string(k)) kk = str_expression(kk) calibration[kk] = expr definitions = self.definitions initial_values = { "exogenous": 0, "expectations": 0, "values": 0, "controls": float("nan"), "states": float("nan"), } # variables defined by a model equation default to using these definitions initialized_from_model = { "values": "value", "expectations": "expectation", "direct_responses": "direct_response", } for k, v in definitions.items(): kk = remove_timing(k) if kk not in calibration: if isinstance(v, str): vv = remove_timing(v) else: vv = v calibration[kk] = vv for symbol_group in symbols: if symbol_group not in initialized_from_model.keys(): if symbol_group in initial_values: default = initial_values[symbol_group] else: default = float("nan") for s in symbols[symbol_group]: if s not in calibration: calibration[s] = default from dolang.triangular_solver import solve_triangular_system return solve_triangular_system(calibration)
# model = import_dynare("/home/pablo/Downloads/EA_QUEST3.mod", output_type='json') # txt = json.dumps(model) # model['calibration'] # with open("EA_QUEST3.json",'w') as f: # json.dump(model,f) with timeit('Load json'): with open("EA_QUEST3.json") as f: model = json.load(f) model['symbols'].keys() with timeit("Solve triangular system"): calibration = model['calibration'] sol = solve_triangular_system(calibration) with timeit("Parse equations"): equations = model['equations'] compat = lambda s: s.replace("^", "**").replace('==','=').replace('=','==') equations = [compat(eq) for eq in equations] equations = ['{} - ({})'.format(*str.split(eq,'==')) for eq in equations] equations = [parse_string(e) for e in equations] with timeit("stringify equations"): all_variables = [(v, 1) for v in model['symbols']['variables']] + \