def array(name,inarray): import numpy as np if not inarray.dtype.name in type_converters.numpy_c_typenames: raise ValueError('Array dtype must be one of the following: %s' % ','.join(type_converters.numpy_c_typenames.keys())) array = inarray #np.ascontiguousarray(inarray,dtype=cast_type) pointer = array.ctypes.data class ArrayAccessDelegate(object): def __init__(self,name,array): self.name = name self.array_obj = expresso.create_object(array,'%s__id_%r' % (name,id(array))) self.argc = len(array.shape) def __repr__(self): return self.name def __call__(self,*args): if len(args) != self.argc: raise ValueError('%s takes %s arguments' % (self.name,self.argc)) args = [self.array_obj] + list(args) return ArrayAccess(*args) for t,v in inverse_python_types.iteritems(): if isinstance(inarray.dtype,t): # TODO: register in local context, not global evaluators from evaluators.type_evaluator import evaluator evaluator.add_rule(ArrayAccessDelegate([Wildcard(str(i)) for i in range(array.shape)]),v) break return ArrayAccessDelegate(name,array)
def custom_function(name, argc=None, return_type=None, **kwargs): class CustomFunctionData(object): def __init__(self, **kwargs): self.__dict__.update(kwargs) func_obj = expresso.create_object(CustomFunctionData(name=name, **kwargs), name) if argc is not None and not isinstance(argc, (tuple, list)): argc = [argc] class CustomFunctionDelegate(object): def __init__(self, func_obj, name, argc): self.func_obj = func_obj self.name = name self.argc = argc def __repr__(self): return name def __call__(self, *args): if self.argc != None and len(args) not in self.argc: raise ValueError( '%s takes %s arguments' % (self.name, ' or '.join([str(s) for s in self.argc]))) args = [self.func_obj] + list(args) return CustomFunction(*args) res = CustomFunctionDelegate(func_obj, name, argc) if return_type != None: if not argc: raise ValueError( 'argc needs to be defined to register result type') # TODO: register in local context, not global evaluators from evaluators.type_evaluator import evaluator for c in argc: evaluator.add_rule( Type(res(*[Wildcard(str(s)) for s in range(c)])), return_type) return res
def custom_function(name,argc = None,return_type = None,**kwargs): class CustomFunctionData(object): def __init__(self,**kwargs): self.__dict__.update(kwargs) func_obj = expresso.create_object(CustomFunctionData(name=name,**kwargs),name) if argc is not None and not isinstance(argc,(tuple,list)): argc = [argc] class CustomFunctionDelegate(object): def __init__(self,func_obj,name,argc): self.func_obj = func_obj self.name = name self.argc = argc def __repr__(self): return name def __call__(self,*args): if self.argc != None and len(args) not in self.argc: raise ValueError('%s takes %s arguments' % (self.name,' or '.join([str(s) for s in self.argc]))) args = [self.func_obj] + list(args) return CustomFunction(*args) res = CustomFunctionDelegate(func_obj,name,argc) if return_type != None: if not argc: raise ValueError('argc needs to be defined to register result type') # TODO: register in local context, not global evaluators from evaluators.type_evaluator import evaluator for c in argc: evaluator.add_rule(Type(res(*[Wildcard(str(s)) for s in range(c)])),return_type) return res
def array(name, inarray): import numpy as np if not inarray.dtype.name in type_converters.numpy_c_typenames: raise ValueError('Array dtype must be one of the following: %s' % ','.join(type_converters.numpy_c_typenames.keys())) array = inarray #np.ascontiguousarray(inarray,dtype=cast_type) pointer = array.ctypes.data class ArrayAccessDelegate(object): def __init__(self, name, array): self.name = name self.array_obj = expresso.create_object( array, '%s__id_%r' % (name, id(array))) self.argc = len(array.shape) def __repr__(self): return self.name def __call__(self, *args): if len(args) != self.argc: raise ValueError('%s takes %s arguments' % (self.name, self.argc)) args = [self.array_obj] + list(args) return ArrayAccess(*args) for t, v in inverse_python_types.iteritems(): if isinstance(inarray.dtype, t): # TODO: register in local context, not global evaluators from evaluators.type_evaluator import evaluator evaluator.add_rule( ArrayAccessDelegate( [Wildcard(str(i)) for i in range(array.shape)]), v) break return ArrayAccessDelegate(name, array)