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)
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)