1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

# 

# Author: Pearu Peterson, March 2002 

# 

 

from __future__ import division, print_function, absolute_import 

 

__all__ = ['get_flinalg_funcs'] 

 

# The following ensures that possibly missing flavor (C or Fortran) is 

# replaced with the available one. If none is available, exception 

# is raised at the first attempt to use the resources. 

try: 

from . import _flinalg 

except ImportError: 

_flinalg = None 

# from numpy.distutils.misc_util import PostponedException 

# _flinalg = PostponedException() 

# print _flinalg.__doc__ 

has_column_major_storage = lambda a:0 

 

 

def has_column_major_storage(arr): 

return arr.flags['FORTRAN'] 

 

 

_type_conv = {'f':'s', 'd':'d', 'F':'c', 'D':'z'} # 'd' will be default for 'i',.. 

 

 

def get_flinalg_funcs(names,arrays=(),debug=0): 

"""Return optimal available _flinalg function objects with 

names. arrays are used to determine optimal prefix.""" 

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' 

# Some routines may require special treatment. 

# Handle them here before the default lookup. 

 

# Default lookup: 

if ordering and has_column_major_storage(arrays[ordering[0][1]]): 

suffix1,suffix2 = '_c','_r' 

else: 

suffix1,suffix2 = '_r','_c' 

 

funcs = [] 

for name in names: 

func_name = required_prefix + name 

func = getattr(_flinalg,func_name+suffix1, 

getattr(_flinalg,func_name+suffix2,None)) 

funcs.append(func) 

return tuple(funcs)