Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)