def prod_func(self): group_decl = c.POD(self.expr_type, self.group_id) init_prod = c.Assign(group_decl, 0) self.loop_body = c.Assign( self.group_id, '{} * {}'.format(self.group_id, self.expr_arg)) self.function_code.append(init_prod) assert len(self.bounds) > 0 func_loop = Index([self.loop_body], self.bounds_dict, self.bounds) self.function_code.append(func_loop.loop)
def max_func(self): group_decl = c.POD(self.expr_type, 'max') init_sum = c.Assign('max', self.limit_map[self.expr_type] + '_MIN') self.loop_body = c.If('max < {}'.format(self.expr_arg), c.Assign('max', self.expr_arg)) self.function_code.append(group_decl) self.function_code.append(init_sum) assert len(self.bounds) > 0 func_loop = Index([self.loop_body], self.bounds_dict, self.bounds) self.function_code.append(func_loop.loop)
def argmin_func(self): self.function_code.append(c.POD(self.expr_type, 'min')) self.function_code.append( c.Assign('min', self.limit_map[self.expr_type] + '_MAX')) self.function_code.append( c.ArrayInitializer( c.POD('int32', 'amin[{len}]'.format(len=len(self.bounds))), [0 for i in self.bounds])) assert len(self.bounds) > 0 block_code = [] block_code.append(c.Assign('min', self.expr_arg)) for b in range(len(self.bounds)): block_code.append( c.Assign('amin[{idx}]'.format(idx=b), '{idx}'.format(idx=self.bounds[b]))) self.loop_body = c.If('min > {}'.format(self.expr_arg), c.Block(block_code)) func_loop = Index([self.loop_body], self.bounds_dict, self.bounds) self.function_code.append(func_loop.loop)