コード例 #1
0
    def process_output(self, recipe=None):

        recipe = self.recipe

        model = self.model
        parms = model.symbols_s['parameters']


        fun_text = ''

        for eqg in self.model.equations_groups:

            args = []

            is_a_definition = 'definition' in recipe['equation_type'][eqg]

            if is_a_definition:
                arg_specs = recipe['equation_type'][eqg]['rhs']
            else:
                arg_specs = recipe['equation_type'][eqg]


            arg_names = []
            for syms in arg_specs:
                [sgn,time] = syms
                if syms[0] == 'shocks':
                    args.append( [ s(time) for s in model.symbols_s['shocks'] ] )
                else:
                    args.append( [ s(time) for s in model.symbols_s[sgn] ] )
                if time == 1:
                    stime = '_f'
                elif time == -1:
                    stime = '_p'
                else:
                    stime = ''
                arg_names.append( sgn + stime)

            equations = self.model.equations_groups[eqg]

            if is_a_definition:
                from dolo.compiler.common import solve_recursive_block
                equations = solve_recursive_block(equations)
                equations = [eq.rhs for eq in equations]
            else:
                equations = [eq.gap for eq in equations]

            from dolo.compiler.function_compiler_julia import compile_multiargument_function
            txt = compile_multiargument_function(equations, args, arg_names, parms, fname = eqg)

            fun_text += txt


        # the following part only makes sense for fga models

        calib = model.calibration

        cc = calib.copy()
        cc.pop('parameters')
        cc.pop('shocks')
        cc.pop('covariances')
        steady_state = cc
        parameters_values = '[{}]'.format( str.join(', ', [str(v) for v in calib['parameters']]) )


        funs_text = "functions = Dict{String, Function}()\n"
        for fun_name in recipe['equation_type']:
            funs_text += 'functions["{0}"] = {0}\n'.format(fun_name)

        ss_text = "calibration = Dict{String, Any}()\n"
        for k,v in steady_state.iteritems():
            ss_text += 'calibration["{0}"] = [{1}]\n'.format( k, str.join(', ', ['{}'.format(e) for e in v] ) )
        ss_text += 'calibration["parameters"] = {}\n'.format(str(parameters_values).replace('\n',' '))
        ss_text += 'calibration["covariances"] = {}'.format(str(calib['covariances']).replace('\n',';'))


        var_text = "symbols = Dict{String, Vector{String}}()\n"
        for vn, vg in model.symbols_s.iteritems():
            var_text += 'symbols["{0}"] = [{1}]\n'.format(vn, str.join(',', ['"{}"'.format(e ) for e in vg]))

        full_text = '''
{function_definitions}

{funs_text}

{ss_text}

{var_text}

model = {{
    "symbols" => symbols,
    "functions" => functions,
    "calibration" => calibration
}}
'''.format(
            function_definitions = fun_text,
            funs_text = funs_text,
            ss_text = ss_text,
            var_text = var_text,
        )

        return full_text
コード例 #2
0
ファイル: compiler_julia.py プロジェクト: TomAugspurger/dolo
    def process_output(self, recipe=None):

        recipe = self.recipe

        model = self.model
        parms = model['parameters_ordering']


        fun_text = ''

        for eqg in self.model['equations_groups']:

            args = []

            is_a_definition = 'definition' in recipe['equation_type'][eqg]

            if is_a_definition:
                arg_specs = recipe['equation_type'][eqg]['rhs']
            else:
                arg_specs = recipe['equation_type'][eqg]


            arg_names = []
            for syms in arg_specs:
                [sgn,time] = syms
                if syms[0] == 'shocks':
                    args.append( [ s(time) for s in model['shocks_ordering'] ] )
                else:
                    args.append( [ s(time) for s in model['variables_groups'][sgn] ] )
                if time == 1:
                    stime = '_f'
                elif time == -1:
                    stime = '_p'
                else:
                    stime = ''
                arg_names.append( sgn + stime)

            equations = self.model['equations_groups'][eqg]

            if is_a_definition:
                from dolo.compiler.common import solve_recursive_block
                equations = solve_recursive_block(equations)
                equations = [eq.rhs for eq in equations]
            else:
                equations = [eq.gap for eq in equations]

            from dolo.compiler.function_compiler_julia import compile_multiargument_function
            txt = compile_multiargument_function(equations, args, arg_names, parms, fname = eqg)

            fun_text += txt


        # the following part only makes sense for fga models

        calib = model.calibration

        steady_state = calib['steady_state']
        parameters_values = calib['parameters']


        funs_text = "functions = {\n"
        for fun_name in recipe['equation_type']:
            funs_text += '\t"{0}" => {0},\n'.format(fun_name)
        funs_text += '}'

        ss_text = "steady_state = {\n"
        for k,v in steady_state.iteritems():
            ss_text += '\t"{0}" => {1},\n'.format( k, str(v) )
        ss_text += '}'

        var_text = "symbols = {\n"
        for vn, vg in model['variables_groups'].iteritems():
            var_text += '\t"{0}" => [{1}],\n'.format(vn, str.join(',', ['"{}"'.format(e ) for e in vg]))

        var_text += '\t"parameters" => [{}],\n'.format(str.join(',', ['"{}"'.format(e ) for e in model['parameters_ordering']]))
        var_text += '\t"shocks" => [{}]\n'.format(str.join(',', ['"{}"'.format(e ) for e in model['shocks_ordering']]))

        var_text += '}'

        full_text = '''
{function_definitions}

{funs_text}

{ss_text}

{var_text}


calibration = {{
    "steady_state" => steady_state,
    "parameters" => {params}
}}

model = {{
    "symbols" => symbols,
    "functions" => functions,
    "calibration" => calibration
}}
'''.format(
            function_definitions = fun_text,
            funs_text = funs_text,
            ss_text = ss_text,
            var_text = var_text,
            params = str(parameters_values)

        )

        return full_text