Example #1
0
def get_lapack_funcs(names, arrays=()):
    """Return available LAPACK function objects with names.
    arrays are used to determine the optimal prefix of
    LAPACK routines.
    """
    #If force_clapack is True then available Atlas routine
    #is returned for column major storaged arrays with
    #rowmajor argument set to False.
    force_clapack=False  #XXX: Don't set it true! The feature is unreliable
                         #     and may cause incorrect results.
                         #     See test_basic.test_solve.check_20Feb04_bug.

    required_prefix, dtype, isfortran = find_best_lapack_type(arrays)
    # Default lookup:
    if isfortran:
        # prefer Fortran code for leading array with column major order
        m1, m2 = flapack, clapack
    else:
        # in all other cases, C code is preferred
        m1, m2 = clapack, flapack
    if not _use_force_clapack:
        force_clapack = False
    funcs = []
    m1_name = m1.__name__.split('.')[-1]
    m2_name = m2.__name__.split('.')[-1]
    for name in names:
        func_name = required_prefix + name
        func = getattr(m1,func_name,None)
        if func is None:
            func = getattr(m2,func_name)
            module_name = m2_name
        else:
            module_name = m1_name
            if force_clapack and m1 is flapack:
                func2 = getattr(m2,func_name,None)
                if func2 is not None:
                    exec _colmajor_func_template % {'func_name':func_name}
                    func = types.FunctionType(func_code,
                                              {'clapack_func':func2},
                                              func_name)
                    module_name = m2_name
        register_func_info(func, module_name, required_prefix, None, dtype)
        funcs.append(func)
    return tuple(funcs)
Example #2
0
def get_blas_funcs(names,arrays=(),debug=0):
    """Return available BLAS function objects with names.
    arrays are used to determine the optimal prefix of
    BLAS routines.

    """
    ordering = []
    for i in range(len(arrays)):
        t = arrays[i].dtype.char
        if t not in _type_conv:
            t = 'd'
        ordering.append((t,i))
    if ordering:
        ordering.sort()
        required_prefix = _type_conv[ordering[0][0]]
    else:
        required_prefix = 'd'
    typecode = _inv_type_conv[required_prefix]
    # Default lookup:
    if ordering and has_column_major_storage(arrays[ordering[0][1]]):
        # prefer Fortran code for leading array with column major order
        m1,m2 = fblas,cblas
    else:
        # in all other cases, C code is preferred
        m1,m2 = cblas,fblas
    funcs = []
    for name in names:
        if name=='ger' and typecode in 'FD':
            name = 'gerc'
        func_name = required_prefix + name
        func = getattr(m1,func_name,None)
        if func is None:
            func = getattr(m2,func_name)
            module_name = m2.__name__.split('.')[-1]
        else:
            module_name = m1.__name__.split('.')[-1]
        register_func_info(func, module_name, required_prefix, typecode, None)
        funcs.append(func)
    return tuple(funcs)