コード例 #1
0
ファイル: modeldiff.py プロジェクト: lasselarsendk/ModelFlow
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*} '))
コード例 #2
0
ファイル: modeldiff.py プロジェクト: IbHansen/modelflow
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)
コード例 #3
0
ファイル: modeldiff.py プロジェクト: lasselarsendk/ModelFlow
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])
コード例 #4
0
ファイル: modeldiff.py プロジェクト: lasselarsendk/ModelFlow
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
コード例 #5
0
ファイル: modeldiff.py プロジェクト: lasselarsendk/ModelFlow
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)
コード例 #6
0
    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
コード例 #7
0
    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