def convert(e, definitions=[], func_name='func', extra_args=[], index_trans={}, **kw): free_vars = extract_free_variables(e) for d in definitions: def_free_vars = extract_free_variables(d.rhs) free_vars.update(def_free_vars) free_vars.remove(d.lhs) #func_args = [c_var(str(a)) for a in sorted(free_vars,key=lambda x:str(x))] func_args = [] for a in sorted(free_vars,key=lambda x:str(x)): if a.is_Integer: func_args.append(c_int(str(a))) elif str(a) == 'f': func_args.append(c_var(str(a),c_type(kw['func_type_name']))) else: func_args.append(c_double(str(a))) func_args.extend([c_double(a) for a in extra_args]) func_type = c_func_type(c_double(func_name), *func_args) func_decl = c_func_decl(func_type) e_args = [c_double() for a in extra_args] inner_func_type = c_func_type(c_double(), c_double(), *e_args) func_typedef = c_typedef(kw['func_type_name'], inner_func_type) ft = kw.get('func_trans',{}) # break expression into the sum (and children) and everything else (above the sum) (sum, other) = extract_sum(e) ep = expr_to_c(index_trans=index_trans, extra_args=extra_args, func_trans=ft)(other) init = c_assign(c_double('total'), c_num(0)) sum = sum_to_c(sum, extra_args=extra_args, index_trans=index_trans) body = c_block() fd = c_function_def(func_type, body) for d in definitions: define = c_assign(c_double(str(d.lhs)), expr_to_c()(d.rhs)) body.add_statement(define) body.add_statement(init, sum) if other: final = c_assign(c_double('final'), ep) body.add_statement(final) body.add_statement(c_return(c_var('final'))) return fd, c_block(func_typedef, func_decl)
def convert(e,definitions=[], func_name='func', extra_args=[], index_trans={}): # function arguments = free variables + extra args free_vars = extract_free_variables(e) for d in definitions: def_free_vars = extract_free_variables(d.rhs) free_vars.update(def_free_vars) free_vars.remove(d.lhs) func_args = [py_var(str(a)) for a in sorted(free_vars,key=lambda x:str(x))] func_args.extend([py_var(a) for a in extra_args]) epy = expr_to_py(extra_args=extra_args, index_trans=index_trans) ep = epy(e) fd = py_function_def(func_name,py_arg_list(*func_args)) for d in definitions: define = py_assign_stmt(py_var(str(d.lhs)), expr_to_py()(d.rhs), py_assign_stmt.PY_ASSIGN_EQUAL) fd.add_statement(define) fd.add_statement(*epy._pre_statements) fd.add_statement(py_return_stmt(ep)) return fd
def convert_simple_func(e, func_name='func', extra_args=[]): free_vars = extract_free_variables(e) func_args = [] for a in sorted(free_vars, key=lambda x:str(x)): func_args.append(py_var(str(a))) func_args.extend([py_var(a) for a in extra_args]) ep = expr_to_py(extra_args=extra_args)(e) fd = py_function_def(func_name, py_arg_list(*func_args)) fd.add_statement(py_return_stmt(ep)) return fd
def convert_simple_func(e, func_name='func', extra_args=[]): free_vars = extract_free_variables(e) func_args = [] for a in sorted(free_vars,key=lambda x:str(x)): if a.is_Integer: func_args.append(c_int(str(a))) else: func_args.append(c_double(str(a))) func_args.extend([c_double(a) for a in extra_args]) func_type = c_func_type(c_double(func_name), *func_args) func_decl = c_func_decl(func_type) e_args = [c_double() for a in extra_args] ep = expr_to_c(extra_args=extra_args)(e) body = c_block() fd = c_function_def(func_type, body) body.add_statement(c_return(ep)) return fd