def display_ip(model, ivar): var = ivar.upper() a, fr, n, udtryk = split_frml(model.allvar[var]['frml']) udtryk2 = re.sub(r'_', r'\_', udtryk[:-1]) # get rid of _ udtryk3 = re.sub(r'(?P<var>[a-zA-Z_]\w*)\((?P<lag>-[0-9]+)\)', '\g<var>_{\g<lag>}', udtryk2) udtryk4 = re.sub(r'=', r' & = &', udtryk3, 1) totud = ['Formula:' + udtryk4 + r'\\'] for i in sorted(model.diffendocur[var].keys()): ud = r'\frac{\partial ' + var + '}{\partial ' + i + '} = ' + str( model.diffendocur[var][i]) ud = re.sub(r'_', r'\_', ud) ud2 = re.sub(r'(?P<var>[a-zA-Z_]\w*)\((?P<lag>-[0-9]+)\)', '\g<var>_{\g<lag>}', ud) ud2 = re.sub(r'=', r' & = &', ud2, 1) totud.append(r'' + ud2 + r'') try: totud.append(f'& = & {model.diffvalue[var][i]}') except: pass # print(' ') ud = r'\\'.join(totud) # display(Latex(r'\begin{align}'+r' \\'+ud+r'\end{align}')) display(Latex(r'\begin{eqnarray*}' + ud + r'\end{eqnarray*} '))
def modeldiff(model, silent=False, onlyendocur=False, endovar=None, maxdif=9999999999999999, forcenum=False): ''' Differentiate all relations with respect to all variable The result is placed in a dictory in the model instanse: model.diffendocur ''' with mc.ttimer('Find espressions for partial derivatives', not silent): model.diffendocur = { } #defaultdict(defaultdict) #here we wanmt to store the derivativs i = 0 for nvar, v in enumerate(model.endogene): if nvar >= maxdif: break if not silent: print(f'Now differentiating {v} {nvar}') if onlyendocur: endocur = findendocur(model, v) else: endocur = findallvar(model, v) model.diffendocur[v] = {} t = model.allvar[v]['frml'].upper() a, fr, n, udtryk = split_frml(t) udtryk = udtryk udtryk = re.sub(r'LOG\(', 'log(', udtryk) # sympy uses lover case for log and exp udtryk = re.sub(r'EXP\(', 'exp(', udtryk) lhs, rhs = udtryk.split('=', 1) try: kat = sympify( rhs[0:-1], _clash ) # we take the the $ out _clash1 makes I is not taken as imiganary except: print('* Problem sympify ', lhs, '=', rhs[0:-1]) for rhv in endocur: try: if not forcenum: ud = kat.diff(sympify(rhv, _clash)) if forcenum or 'Derivative(' in str(ud): ud = numdif(model, v, rhv, silent=silent) if not silent: print('numdif of {rhv}') model.diffendocur[v.upper()][rhv.upper()] = str(ud) except: print('we have a serous problem deriving:', lhs, '|', rhv, '\n', lhs, '=', rhs) i += 1 if not silent: print('Model :', model.name) print('Number of variables :', len(model.allvar)) print('Number of endogeneus variables :', len(model.diffendocur)) print('Number of derivatives :', i)
def display_diff(model, bank, var=''): temp = calculate_delta(bank) l = model.maxnavlen for v in sorted(model.diffvalue): if var and not v == var: continue f = re.sub(r' |\n', '', split_frml(model.allvar[v]['frml'])[3]) print(f) for e, w in sorted(model.impact[v].items(), key=lambda x: x[1]): evar = e.split('(')[0] diffvalue = '{:12.3f}'.format(model.diffvalue[v][e]) delta = '{:12.3f}'.format(temp[evar]) timpact = '{:12.1f}% '.format(model.impact[v][e] / temp[v] * 100.) print(v.ljust(l), e.ljust(l), diffvalue, delta, timpact, model.diffendocur[v][e])
def display_ip_old(model, ivar): var = ivar.upper() a, fr, n, udtryk = split_frml(model.allvar[var]['frml']) udtryk2 = re.sub(r'_', r'\_', udtryk[:-1]) # get rid of _ udtryk3 = re.sub(r'(?P<var>[a-zA-Z_]\w*)\((?P<lag>-[0-9]+)\)', '\g<var>_{\g<lag>}', udtryk2) udtryk3 = re.sub(r'delta_', r'\Delta ', udtryk3) totud = [udtryk3] for i in sorted(model.diffendocur[var].keys()): ud = r'\frac{\partial ' + var + '}{\partial ' + i + '} = ' + str( model.diffendocur[var][i]) ud = re.sub(r'delta_', r'\Delta ', ud) ud = re.sub(r'_', r'\_', ud) ud2 = re.sub(r'(?P<var>[a-zA-Z_]\w*)\((?P<lag>-[0-9]+)\)', '\g<var>_{\g<lag>}', ud) totud.append(r'' + ud2 + r'') # print(' ') ud = r'\\'.join(totud) ud2 = re.sub(r'=', r' & = &', ud) ud3 = r'$\begin{eqnarray}' + r' \\' + ud2 + r'\end{eqnarray}$' return ud3
def modeldiff(model, silent=False, onlyendocur=False): ''' Differentiate all relations with respect to all variable The result is placed in a dictory in the model instanse: model.diffendocur ''' model.diffendocur = { } #defaultdict(defaultdict) #here we wanmt to store the derivativs i = 0 for v in model.endogene: if onlyendocur: endocur = findendocur(model, v) else: endocur = findallvar(model, v) model.diffendocur[v] = {} t = model.allvar[v]['frml'].upper() a, fr, n, udtryk = split_frml(t) udtryk = udtryk udtryk = re.sub(r'LOG\(', 'log(', udtryk) # sympy uses lover case for log and exp udtryk = re.sub(r'EXP\(', 'exp(', udtryk) lhs, rhs = udtryk.split('=', 1) try: kat = sympify( rhs[0:-1], _clash ) # we take the the $ out _clash1 makes I is not taken as imiganary except: print('*', lhs, '=', rhs[0:-1]) for rhv in endocur: try: ud = kat.diff(sympify(rhv, _clash)) model.diffendocur[v.upper()][rhv.upper()] = ud except: print(lhs, '|', rhv, '\n', lhs, '=', rhs) i += 1 if not silent: print('Model :', model.name) print('Number of variables :', len(model.allvar)) print('Number of endogeneus variables :', len(model.diffendocur)) print('Number of derivatives :', i)
def modeldiff(self): ''' Differentiate relations for self.enovar with respect to endogeneous variable The result is placed in a dictory in the model instanse: model.diffendocur ''' def numdif(model, v, rhv, delta=0.005, silent=True): # print('**',model.allvar[v]['terms']['frml']) def tout(t): if t.lag: return f'{t.var}({t.lag})' return t.op + t.number + t.var # breakpoint() nt = model.allvar[v]['terms'] assignpos = nt.index(model.aequalterm) # find the position of = rhsterms = nt[assignpos + 1:-1] vterm = udtryk_parse(rhv)[0] plusterm = udtryk_parse(f'({rhv}+{delta/2})', funks=model.funks) minusterm = udtryk_parse(f'({rhv}-{delta/2})', funks=model.funks) plus = itertools.chain.from_iterable( [plusterm if t == vterm else [t] for t in rhsterms]) minus = itertools.chain.from_iterable( [minusterm if t == vterm else [t] for t in rhsterms]) eplus = f'({"".join(tout(t) for t in plus)})' eminus = f'({"".join(tout(t) for t in minus)})' expression = f'({eplus}-{eminus})/{delta}' if (not silent) and False: print(expression) return expression def findallvar(model, v): '''Finds all endogenous variables which is on the right side of = in the expresion for variable v lagged variables are included if self.onlyendocur == False ''' # print(v) terms = self.mmodel.allvar[v]['terms'][model. allvar[v]['assigpos']:-1] if self.endoandexo: rhsvar = { (nt.var + ('(' + nt.lag + ')' if nt.lag != '' else '')) for nt in terms if nt.var } rhsvar = {tovarlag(nt.var, nt.lag) for nt in terms if nt.var} else: if self.onlyendocur: rhsvar = { tovarlag(nt.var, nt.lag) for nt in terms if nt.var and nt.lag == '' and nt.var in self.declared_endo_set } else: rhsvar = { tovarlag(nt.var, nt.lag) for nt in terms if nt.var and nt.var in self.declared_endo_set } var2 = sorted(list(rhsvar)) return var2 with ttimer('Find espressions for partial derivatives', self.timeit): clash = {var: Symbol(var) for var in self.mmodel.allvar.keys()} diffendocur = { } #defaultdict(defaultdict) #here we wanmt to store the derivativs i = 0 for nvar, v in enumerate(self.endovar): if nvar >= self.maxdif: break if not self.silent and 0: print(f'Now differentiating {v} {nvar}') endocur = findallvar(self.mmodel, v) diffendocur[v] = {} t = self.mmodel.allvar[v]['frml'].upper() a, fr, n, udtryk = split_frml(t) udtryk = udtryk udtryk = re.sub( r'LOG\(', 'log(', udtryk) # sympy uses lover case for log and exp udtryk = re.sub(r'EXP\(', 'exp(', udtryk) lhs, rhs = udtryk.split('=', 1) try: if not self.forcenum: # kat=sympify(rhs[0:-1], md._clash) # we take the the $ out _clash1 makes I is not taken as imiganary kat = sympify( rhs[0:-1], clash ) # we take the the $ out _clash1 makes I is not taken as imiganary except: # breakpoint() print('* Problem sympify ', lhs, '=', rhs[0:-1]) for rhv in endocur: try: # breakpoint() if not self.forcenum: # ud=str(kat.diff(sympify(rhv,md._clash))) try: ud = str(kat.diff(sympify(rhv, clash))) ud = re.sub( pt.namepat + r'(?:(\()([0-9])(\)))', r'\g<1>\g<2>+\g<3>\g<4>', ud) except: ud = numdif(self.mmodel, v, rhv, silent=self.silent) if self.forcenum or 'Derivative(' in ud: ud = numdif(self.mmodel, v, rhv, silent=self.silent) if not self.silent and 0: print('numdif of {rhv}') diffendocur[v.upper()][rhv.upper()] = ud except: print('we have a serious problem deriving:', lhs, '|', rhv, '\n', lhs, '=', rhs) # breakpoint() i += 1 if not self.silent: print('Model :', self.mmodel.name) print('Number of endogeneus variables :', len(diffendocur)) print('Number of derivatives :', i) return diffendocur
def modeldiff(self): ''' Differentiate relations for self.enovar with respect to endogeneous variable The result is placed in a dictory in the model instanse: model.diffendocur ''' def findallvar(model, v): '''Finds all endogenous variables which is on the right side of = in the expresion for variable v lagged variables are included if self.onlyendocur == False ''' # print(v) terms = self.mmodel.allvar[v]['terms'][model. allvar[v]['assigpos']:-1] if self.endoandexo: rhsvar = { (nt.var + ('(' + nt.lag + ')' if nt.lag != '' else '')) for nt in terms if nt.var } rhsvar = {tovarlag(nt.var, nt.lag) for nt in terms if nt.var} else: if self.onlyendocur: rhsvar = { tovarlag(nt.var, nt.lag) for nt in terms if nt.var and nt.lag == '' and nt.var in self.declared_endo_set } else: rhsvar = { tovarlag(nt.var, nt.lag) for nt in terms if nt.var and nt.var in self.declared_endo_set } var2 = sorted(list(rhsvar)) return var2 with ttimer('Find espressions for partial derivatives', self.timeit): diffendocur = { } #defaultdict(defaultdict) #here we wanmt to store the derivativs i = 0 for nvar, v in enumerate(self.endovar): if nvar >= self.maxdif: break if not self.silent: print(f'Now differentiating {v} {nvar}') endocur = findallvar(self.mmodel, v) diffendocur[v] = {} t = self.mmodel.allvar[v]['frml'].upper() a, fr, n, udtryk = split_frml(t) udtryk = udtryk udtryk = re.sub( r'LOG\(', 'log(', udtryk) # sympy uses lover case for log and exp udtryk = re.sub(r'EXP\(', 'exp(', udtryk) lhs, rhs = udtryk.split('=', 1) try: if not self.forcenum: kat = sympify( rhs[0:-1], md._clash ) # we take the the $ out _clash1 makes I is not taken as imiganary except: # breakpoint() print('* Problem sympify ', lhs, '=', rhs[0:-1]) for rhv in endocur: try: if not self.forcenum: ud = str(kat.diff(sympify(rhv, md._clash))) ud = re.sub(pt.namepat + r'(?:(\()([0-9])(\)))', r'\g<1>\g<2>+\g<3>\g<4>', ud) if self.forcenum or 'Derivative(' in ud: ud = md.numdif(self.mmodel, v, rhv, silent=self.silent) if not self.silent: print('numdif of {rhv}') diffendocur[v.upper()][rhv.upper()] = ud except: print('we have a serous problem deriving:', lhs, '|', rhv, '\n', lhs, '=', rhs) breakpoint() i += 1 if not self.silent: print('Model :', self.mmodel.name) print('Number of endogeneus variables :', len(diffendocur)) print('Number of derivatives :', i) return diffendocur