def generate(info, template): definitions = [] for function, function_info in each_function(info): arg_info = function_arguments(function_info) function_args = '' for arg_name, arg_type in zip(arg_info['names'], arg_info['types']): function_args += ', {} {}'.format(utils.type_conv.type_from_proto[ arg_type]['pyx'], arg_name) definitions.append( 'cdef extern from "nbla/function/{}.hpp" namespace "nbla":'.format(info['Names'][function])) definitions.append( ' shared_ptr[CFunction] create_{}(const CContext&{}) except +'.format(function, function_args)) return template.format(function_definitions='\n'.join(definitions))
def generate(info, template): create_functions = [] if_prefix = '' for function, function_info in each_function(info): arg_info = function_arguments(function_info) create_functions.append(' {}if f.type == "{}":'.format( if_prefix, function)) args = ['ctx'] for arg, type in zip(arg_info['names'], arg_info['types']): arg_suffix = '.dim' if type == 'Shape' else '' args.append('{0}=f.{1}_param.{0}{2}'.format( arg, info['Names'][function], arg_suffix)) create_functions.append(' function = F.{}({})'.format( function, ',\n '.join(args))) if_prefix = 'el' return template.format(create_functions='\n'.join(create_functions))
def generate(info, template): create_functions = [] if_prefix = '' for function, function_info in each_function(info): arg_info = function_arguments(function_info) create_functions.append( ' {}if f.type == "{}":'.format(if_prefix, function)) args = ['ctx'] for arg, type in zip(arg_info['names'], arg_info['types']): arg_suffix = '.dim' if type == 'Shape' else '' args.append('{0}=f.{1}_param.{0}{2}'.format( arg, info['Names'][function], arg_suffix)) create_functions.append(' function = F.{}({})'.format( function, ',\n '.join(args))) if_prefix = 'el' return template.format(create_functions='\n'.join(create_functions))
def generate(info, template): definitions = [] for function, function_info in each_function(info): arg_info = function_arguments(function_info) function_args = '' for arg_name, arg_type in zip(arg_info['names'], arg_info['types']): function_args += ', {} {}'.format( utils.type_conv.type_from_proto[arg_type]['pyx'], arg_name) definitions.append( 'cdef extern from "nbla/function/{}.hpp" namespace "nbla":'.format( info['Names'][function])) definitions.append( ' shared_ptr[CFunction] create_{}(const CContext&{}) except +'. format(function, function_args)) return template.format(function_definitions='\n'.join(definitions))
def generate(info, template): definitions = [] for function, function_info in each_function(info): arg_info = function_arguments(function_info) function_args1 = '' function_args2 = '' store_args = [' info.args = {}'] for arg_name, arg_type in zip(arg_info['names'], arg_info['types']): function_args1 += ', {} {}'.format(utils.type_conv.type_from_proto[ arg_type]['pyx'], arg_name) function_args2 += ', {}'.format(arg_name) store_args.append(" info.args['{0}'] = {0}".format(arg_name)) definitions.append('def {}(CContext ctx{}):'.format( function, function_args1)) definitions.append(' info = Info()') definitions += store_args definitions.append(' info.type_name = \'{}\''.format(function)) definitions.append(' f = Function.create(create_{}(ctx{}), info)'.format( function, function_args2)) definitions.append(' return f') return template.format(function_definitions='\n'.join(definitions))
def generate(info, template): definitions = [] for function, function_info in each_function(info): arg_info = function_arguments(function_info) function_args1 = '' function_args2 = '' store_args = [' info.args = {}'] for arg_name, arg_type in zip(arg_info['names'], arg_info['types']): function_args1 += ', {} {}'.format( utils.type_conv.type_from_proto[arg_type]['pyx'], arg_name) function_args2 += ', {}'.format(arg_name) store_args.append(" info.args['{0}'] = {0}".format(arg_name)) definitions.append('def {}(CContext ctx{}):'.format( function, function_args1)) definitions.append(' info = Info()') definitions += store_args definitions.append(' info.type_name = \'{}\''.format(function)) definitions.append( ' f = Function.create(create_{}(ctx{}), info)'.format( function, function_args2)) definitions.append(' return f') return template.format(function_definitions='\n'.join(definitions))
def generate(info, template): lines = [] if_prefix = '' for function, function_info in each_function(info): arg_info = function_arguments(function_info) lines.append(' {}if function[\'type\'] == "{}":'.format( if_prefix, function)) arg_prefix = 'f.{}_param'.format(info['Names'][function]) for arg, arg_type in zip(arg_info['names'], arg_info['types']): if arg_type in ['float', 'double', 'int64', 'string']: lines.append( ' {0}.{1} = function[\'args\'][\'{1}\']'.format(arg_prefix, arg)) elif arg_type == 'bool': lines.append( ' if function[\'args\'][\'{}\']:'.format(arg)) lines.append( ' {0}.{1} = True'.format(arg_prefix, arg)) lines.append(' else:') lines.append( ' {0}.{1} = False'.format(arg_prefix, arg)) pass elif arg_type == 'Shape': lines.append(' {0}.{1}.dim.extend(function[\'args\'][\'{1}\'])'.format( arg_prefix, arg)) elif arg_type == 'repeated int64': lines.append( ' {0}.{1}.extend(function[\'args\'][\'{1}\'])'.format(arg_prefix, arg)) else: print('Unknown argument type [{}]'.format(arg_type)) raise 'Unknown argument type [{}]'.format(arg_type) arg_suffix = '.dim' if type == 'Shape' else '' lines.append(' pass') if_prefix = 'el' return template.format(create_function_args='\n'.join(lines))
def generate(info, template): apis = [] for function, function_info in each_function(info): io_info = function_io(function_info) arg_info = function_arguments(function_info) desc = function_info['description'] variadic = False desc.append('Args:') for a_n, a_info in function_info['input'].items(): a_type = '~nnabla.Variable' if 'Options' in a_info: if 'Variadic' in a_info['Options']: variadic = True name = a_n if variadic: name = '*inputs' if 'Options' in a_info: desc.append(' {}({}): [{}] {}'.format( name, a_type, a_info['Options'], a_info['Description'])) else: desc.append(' {}({}): {}'.format(name, a_type, a_info['Description'])) if 'argument' in function_info: for a_n, a_info in function_info['argument'].items(): a_type = a_info['Type'] if a_type == 'Shape': a_type = ':obj:`tuple` of :obj:`int`' elif a_type == 'int64': a_type = 'int' elif a_type == 'double': a_type = 'float' if variadic: desc.append(' **param({}): [name={}] {}'.format( a_type, a_n, a_info['Description'])) else: desc.append(' {}({}): {}'.format( a_n, a_type, a_info['Description'])) desc.append('') desc.append('Returns:') for o_n, o_info in function_info['output'].items(): desc.append(' ~nnabla.Variable: {}'.format( o_info['Description'])) desc.append('') description = '\n '.join(desc) if io_info['input']['repeat']: apis.append( generate_repeated_inputs(info, function, io_info, arg_info, description)) continue args1 = [] args2 = [] args3 = [] args3_optional = [] optional_code = [] set_default_values = [] for i, n in enumerate(io_info['input']['names']): if i < io_info['input']['min']: args1.append(n) args3.append(n) else: args1.append('{} = None'.format(n)) args3_optional.append(n) for n, d in zip(arg_info['names'], arg_info['defaults']): args2.append(n) if d is None: args1.append(n) else: if d.__class__.__name__ == "DefaultRHS": args1.append('{}=None'.format(n)) set_default_values.append(' if {} is None:'.format(n)) set_default_values.append(' {} = {}'.format( n, d.rhs)) else: args1.append('{}={}'.format(n, repr(d))) if len(args1) > 0: args1 = ', ' + ', '.join(args1) else: args1 = '' if len(args2) > 0: args2 = ', ' + ', '.join(args2) else: args2 = '' if len(args3_optional) > 0: optional_code.append(' inputs = ({})'.format(', '.join(args3))) for a in args3_optional: optional_code.append(' if {} is not None:'.format(a)) optional_code.append(' inputs += ({}, )'.format(a)) args3 = '*inputs' else: args3 = ','.join(args3) if args3: args3 += ', ' apis.append('') apis.append('') apis.append('@function_api') apis.append('def {}(ctx{}, n_outputs=-1, outputs=None):'.format( info['Names'][function], args1)) apis.append(' r"""{}'.format(description)) apis.append(' """') apis.append('') apis += optional_code apis += set_default_values apis.append( ' return F.{}(ctx{})({}n_outputs=n_outputs, auto_forward=get_auto_forward(), outputs=outputs)' .format(function, args2, args3)) return template.format(function_apis='\n'.join(apis))
def generate(info, template): apis = [] for function, function_info in each_function(info): io_info = function_io(function_info) arg_info = function_arguments(function_info) desc = function_info['description'] variadic = False desc.append('Args:') for a_n, a_info in function_info['input'].items(): a_type = '~nnabla.Variable' if 'Options' in a_info: if 'Variadic' in a_info['Options']: variadic = True name = a_n if variadic: name = '*inputs' if 'Options' in a_info: desc.append(' {}({}): [{}] {}'.format( name, a_type, a_info['Options'], a_info['Description'])) else: desc.append(' {}({}): {}'.format( name, a_type, a_info['Description'])) if 'argument' in function_info: for a_n, a_info in function_info['argument'].items(): a_type = a_info['Type'] if a_type == 'Shape': a_type = ':obj:`tuple` of :obj:`int`' elif a_type == 'int64': a_type = 'int' elif a_type == 'double': a_type = 'float' if variadic: desc.append( ' **param({}): [name={}] {}'.format(a_type, a_n, a_info['Description'])) else: desc.append(' {}({}): {}'.format( a_n, a_type, a_info['Description'])) desc.append('') desc.append('Returns:') for o_n, o_info in function_info['output'].items(): desc.append(' ~nnabla.Variable: {}'.format( o_info['Description'])) desc.append('') description = '\n '.join(desc) if io_info['input']['repeat']: apis.append(generate_repeated_inputs( info, function, io_info, arg_info, description)) continue args1 = [] args2 = [] args3 = [] args3_optional = [] optional_code = [] set_default_values = [] for i, n in enumerate(io_info['input']['names']): if i < io_info['input']['min']: args1.append(n) args3.append(n) else: args1.append('{} = None'.format(n)) args3_optional.append(n) for n, d in zip(arg_info['names'], arg_info['defaults']): args2.append(n) if d is None: args1.append(n) else: if d.__class__.__name__ == "DefaultRHS": args1.append('{}=None'.format(n)) set_default_values.append(' if {} is None:'.format(n)) set_default_values.append( ' {} = {}'.format(n, d.rhs)) else: args1.append('{}={}'.format(n, repr(d))) if len(args1) > 0: args1 = ', ' + ', '.join(args1) else: args1 = '' if len(args2) > 0: args2 = ', ' + ', '.join(args2) else: args2 = '' if len(args3_optional) > 0: optional_code.append(' inputs = ({})'.format(', '.join(args3))) for a in args3_optional: optional_code.append(' if {} is not None:'.format(a)) optional_code.append(' inputs += ({}, )'.format(a)) args3 = '*inputs' else: args3 = ','.join(args3) if args3: args3 += ', ' apis.append('') apis.append('') apis.append('@function_api') apis.append('def {}(ctx{}, n_outputs=-1, outputs=None):'.format( info['Names'][function], args1)) apis.append(' r"""{}'.format(description)) apis.append(' """') apis.append('') apis += optional_code apis += set_default_values apis.append(' return F.{}(ctx{})({}n_outputs=n_outputs, auto_forward=get_auto_forward(), outputs=outputs)'.format( function, args2, args3)) return template.format(function_apis='\n'.join(apis))