1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036 |
- """
- Low-level LAPACK functions (:mod:`scipy.linalg.lapack`)
- =======================================================
- This module contains low-level functions from the LAPACK library.
- .. versionadded:: 0.12.0
- .. note::
- The common ``overwrite_<>`` option in many routines, allows the
- input arrays to be overwritten to avoid extra memory allocation.
- However this requires the array to satisfy two conditions
- which are memory order and the data type to match exactly the
- order and the type expected by the routine.
- As an example, if you pass a double precision float array to any
- ``S....`` routine which expects single precision arguments, f2py
- will create an intermediate array to match the argument types and
- overwriting will be performed on that intermediate array.
- Similarly, if a C-contiguous array is passed, f2py will pass a
- FORTRAN-contiguous array internally. Please make sure that these
- details are satisfied. More information can be found in the f2py
- documentation.
- .. warning::
- These functions do little to no error checking.
- It is possible to cause crashes by mis-using them,
- so prefer using the higher-level routines in `scipy.linalg`.
- Finding functions
- -----------------
- .. autosummary::
- :toctree: generated/
- get_lapack_funcs
- All functions
- -------------
- .. autosummary::
- :toctree: generated/
- sgbsv
- dgbsv
- cgbsv
- zgbsv
- sgbtrf
- dgbtrf
- cgbtrf
- zgbtrf
- sgbtrs
- dgbtrs
- cgbtrs
- zgbtrs
- sgebal
- dgebal
- cgebal
- zgebal
- sgecon
- dgecon
- cgecon
- zgecon
- sgeequ
- dgeequ
- cgeequ
- zgeequ
- sgeequb
- dgeequb
- cgeequb
- zgeequb
- sgees
- dgees
- cgees
- zgees
- sgeev
- dgeev
- cgeev
- zgeev
- sgeev_lwork
- dgeev_lwork
- cgeev_lwork
- zgeev_lwork
- sgehrd
- dgehrd
- cgehrd
- zgehrd
- sgehrd_lwork
- dgehrd_lwork
- cgehrd_lwork
- zgehrd_lwork
- sgejsv
- dgejsv
- sgels
- dgels
- cgels
- zgels
- sgels_lwork
- dgels_lwork
- cgels_lwork
- zgels_lwork
- sgelsd
- dgelsd
- cgelsd
- zgelsd
- sgelsd_lwork
- dgelsd_lwork
- cgelsd_lwork
- zgelsd_lwork
- sgelss
- dgelss
- cgelss
- zgelss
- sgelss_lwork
- dgelss_lwork
- cgelss_lwork
- zgelss_lwork
- sgelsy
- dgelsy
- cgelsy
- zgelsy
- sgelsy_lwork
- dgelsy_lwork
- cgelsy_lwork
- zgelsy_lwork
- sgeqp3
- dgeqp3
- cgeqp3
- zgeqp3
- sgeqrf
- dgeqrf
- cgeqrf
- zgeqrf
- sgeqrf_lwork
- dgeqrf_lwork
- cgeqrf_lwork
- zgeqrf_lwork
- sgeqrfp
- dgeqrfp
- cgeqrfp
- zgeqrfp
- sgeqrfp_lwork
- dgeqrfp_lwork
- cgeqrfp_lwork
- zgeqrfp_lwork
- sgerqf
- dgerqf
- cgerqf
- zgerqf
- sgesdd
- dgesdd
- cgesdd
- zgesdd
- sgesdd_lwork
- dgesdd_lwork
- cgesdd_lwork
- zgesdd_lwork
- sgesv
- dgesv
- cgesv
- zgesv
- sgesvd
- dgesvd
- cgesvd
- zgesvd
- sgesvd_lwork
- dgesvd_lwork
- cgesvd_lwork
- zgesvd_lwork
- sgesvx
- dgesvx
- cgesvx
- zgesvx
- sgetrf
- dgetrf
- cgetrf
- zgetrf
- sgetc2
- dgetc2
- cgetc2
- zgetc2
- sgetri
- dgetri
- cgetri
- zgetri
- sgetri_lwork
- dgetri_lwork
- cgetri_lwork
- zgetri_lwork
- sgetrs
- dgetrs
- cgetrs
- zgetrs
- sgesc2
- dgesc2
- cgesc2
- zgesc2
- sgges
- dgges
- cgges
- zgges
- sggev
- dggev
- cggev
- zggev
- sgglse
- dgglse
- cgglse
- zgglse
- sgglse_lwork
- dgglse_lwork
- cgglse_lwork
- zgglse_lwork
- sgtsv
- dgtsv
- cgtsv
- zgtsv
- sgtsvx
- dgtsvx
- cgtsvx
- zgtsvx
- chbevd
- zhbevd
- chbevx
- zhbevx
- checon
- zhecon
- cheequb
- zheequb
- cheev
- zheev
- cheev_lwork
- zheev_lwork
- cheevd
- zheevd
- cheevd_lwork
- zheevd_lwork
- cheevr
- zheevr
- cheevr_lwork
- zheevr_lwork
- cheevx
- zheevx
- cheevx_lwork
- zheevx_lwork
- chegst
- zhegst
- chegv
- zhegv
- chegv_lwork
- zhegv_lwork
- chegvd
- zhegvd
- chegvx
- zhegvx
- chegvx_lwork
- zhegvx_lwork
- chesv
- zhesv
- chesv_lwork
- zhesv_lwork
- chesvx
- zhesvx
- chesvx_lwork
- zhesvx_lwork
- chetrd
- zhetrd
- chetrd_lwork
- zhetrd_lwork
- chetrf
- zhetrf
- chetrf_lwork
- zhetrf_lwork
- chfrk
- zhfrk
- slamch
- dlamch
- slange
- dlange
- clange
- zlange
- slarf
- dlarf
- clarf
- zlarf
- slarfg
- dlarfg
- clarfg
- zlarfg
- slartg
- dlartg
- clartg
- zlartg
- slasd4
- dlasd4
- slaswp
- dlaswp
- claswp
- zlaswp
- slauum
- dlauum
- clauum
- zlauum
- sorcsd
- dorcsd
- sorcsd_lwork
- dorcsd_lwork
- sorghr
- dorghr
- sorghr_lwork
- dorghr_lwork
- sorgqr
- dorgqr
- sorgrq
- dorgrq
- sormqr
- dormqr
- sormrz
- dormrz
- sormrz_lwork
- dormrz_lwork
- spbsv
- dpbsv
- cpbsv
- zpbsv
- spbtrf
- dpbtrf
- cpbtrf
- zpbtrf
- spbtrs
- dpbtrs
- cpbtrs
- zpbtrs
- spftrf
- dpftrf
- cpftrf
- zpftrf
- spftri
- dpftri
- cpftri
- zpftri
- spftrs
- dpftrs
- cpftrs
- zpftrs
- spocon
- dpocon
- cpocon
- zpocon
- spstrf
- dpstrf
- cpstrf
- zpstrf
- spstf2
- dpstf2
- cpstf2
- zpstf2
- sposv
- dposv
- cposv
- zposv
- sposvx
- dposvx
- cposvx
- zposvx
- spotrf
- dpotrf
- cpotrf
- zpotrf
- spotri
- dpotri
- cpotri
- zpotri
- spotrs
- dpotrs
- cpotrs
- zpotrs
- sppcon
- dppcon
- cppcon
- zppcon
- sppsv
- dppsv
- cppsv
- zppsv
- spptrf
- dpptrf
- cpptrf
- zpptrf
- spptri
- dpptri
- cpptri
- zpptri
- spptrs
- dpptrs
- cpptrs
- zpptrs
- sptsv
- dptsv
- cptsv
- zptsv
- sptsvx
- dptsvx
- cptsvx
- zptsvx
- spttrf
- dpttrf
- cpttrf
- zpttrf
- spttrs
- dpttrs
- cpttrs
- zpttrs
- spteqr
- dpteqr
- cpteqr
- zpteqr
- crot
- zrot
- ssbev
- dsbev
- ssbevd
- dsbevd
- ssbevx
- dsbevx
- ssfrk
- dsfrk
- sstebz
- dstebz
- sstein
- dstein
- sstemr
- dstemr
- sstemr_lwork
- dstemr_lwork
- ssterf
- dsterf
- sstev
- dstev
- ssycon
- dsycon
- csycon
- zsycon
- ssyconv
- dsyconv
- csyconv
- zsyconv
- ssyequb
- dsyequb
- csyequb
- zsyequb
- ssyev
- dsyev
- ssyev_lwork
- dsyev_lwork
- ssyevd
- dsyevd
- ssyevd_lwork
- dsyevd_lwork
- ssyevr
- dsyevr
- ssyevr_lwork
- dsyevr_lwork
- ssyevx
- dsyevx
- ssyevx_lwork
- dsyevx_lwork
- ssygst
- dsygst
- ssygv
- dsygv
- ssygv_lwork
- dsygv_lwork
- ssygvd
- dsygvd
- ssygvx
- dsygvx
- ssygvx_lwork
- dsygvx_lwork
- ssysv
- dsysv
- csysv
- zsysv
- ssysv_lwork
- dsysv_lwork
- csysv_lwork
- zsysv_lwork
- ssysvx
- dsysvx
- csysvx
- zsysvx
- ssysvx_lwork
- dsysvx_lwork
- csysvx_lwork
- zsysvx_lwork
- ssytf2
- dsytf2
- csytf2
- zsytf2
- ssytrd
- dsytrd
- ssytrd_lwork
- dsytrd_lwork
- ssytrf
- dsytrf
- csytrf
- zsytrf
- ssytrf_lwork
- dsytrf_lwork
- csytrf_lwork
- zsytrf_lwork
- stbtrs
- dtbtrs
- ctbtrs
- ztbtrs
- stfsm
- dtfsm
- ctfsm
- ztfsm
- stfttp
- dtfttp
- ctfttp
- ztfttp
- stfttr
- dtfttr
- ctfttr
- ztfttr
- stgexc
- dtgexc
- ctgexc
- ztgexc
- stgsen
- dtgsen
- ctgsen
- ztgsen
- stgsen_lwork
- dtgsen_lwork
- ctgsen_lwork
- ztgsen_lwork
- stpttf
- dtpttf
- ctpttf
- ztpttf
- stpttr
- dtpttr
- ctpttr
- ztpttr
- strexc
- dtrexc
- ctrexc
- ztrexc
- strsen
- dtrsen
- ctrsen
- ztrsen
- strsen_lwork
- dtrsen_lwork
- ctrsen_lwork
- ztrsen_lwork
- strsyl
- dtrsyl
- ctrsyl
- ztrsyl
- strtri
- dtrtri
- ctrtri
- ztrtri
- strtrs
- dtrtrs
- ctrtrs
- ztrtrs
- strttf
- dtrttf
- ctrttf
- ztrttf
- strttp
- dtrttp
- ctrttp
- ztrttp
- stzrzf
- dtzrzf
- ctzrzf
- ztzrzf
- stzrzf_lwork
- dtzrzf_lwork
- ctzrzf_lwork
- ztzrzf_lwork
- cunghr
- zunghr
- cunghr_lwork
- zunghr_lwork
- cungqr
- zungqr
- cungrq
- zungrq
- cunmqr
- zunmqr
- sgeqrt
- dgeqrt
- cgeqrt
- zgeqrt
- sgemqrt
- dgemqrt
- cgemqrt
- zgemqrt
- sgttrf
- dgttrf
- cgttrf
- zgttrf
- sgttrs
- dgttrs
- cgttrs
- zgttrs
- stpqrt
- dtpqrt
- ctpqrt
- ztpqrt
- stpmqrt
- dtpmqrt
- ctpmqrt
- ztpmqrt
- cuncsd
- zuncsd
- cuncsd_lwork
- zuncsd_lwork
- cunmrz
- zunmrz
- cunmrz_lwork
- zunmrz_lwork
- ilaver
- """
- #
- # Author: Pearu Peterson, March 2002
- #
- import numpy as _np
- from .blas import _get_funcs, _memoize_get_funcs
- from scipy.linalg import _flapack
- from re import compile as regex_compile
- try:
- from scipy.linalg import _clapack
- except ImportError:
- _clapack = None
- try:
- from scipy.linalg import _flapack_64
- HAS_ILP64 = True
- except ImportError:
- HAS_ILP64 = False
- _flapack_64 = None
- # Expose all functions (only flapack --- clapack is an implementation detail)
- empty_module = None
- from scipy.linalg._flapack import *
- del empty_module
- __all__ = ['get_lapack_funcs']
- # some convenience alias for complex functions
- _lapack_alias = {
- 'corghr': 'cunghr', 'zorghr': 'zunghr',
- 'corghr_lwork': 'cunghr_lwork', 'zorghr_lwork': 'zunghr_lwork',
- 'corgqr': 'cungqr', 'zorgqr': 'zungqr',
- 'cormqr': 'cunmqr', 'zormqr': 'zunmqr',
- 'corgrq': 'cungrq', 'zorgrq': 'zungrq',
- }
- # Place guards against docstring rendering issues with special characters
- p1 = regex_compile(r'with bounds (?P<b>.*?)( and (?P<s>.*?) storage){0,1}\n')
- p2 = regex_compile(r'Default: (?P<d>.*?)\n')
- def backtickrepl(m):
- if m.group('s'):
- return ('with bounds ``{}`` with ``{}`` storage\n'
- ''.format(m.group('b'), m.group('s')))
- else:
- return 'with bounds ``{}``\n'.format(m.group('b'))
- for routine in [ssyevr, dsyevr, cheevr, zheevr,
- ssyevx, dsyevx, cheevx, zheevx,
- ssygvd, dsygvd, chegvd, zhegvd]:
- if routine.__doc__:
- routine.__doc__ = p1.sub(backtickrepl, routine.__doc__)
- routine.__doc__ = p2.sub('Default ``\\1``\n', routine.__doc__)
- else:
- continue
- del regex_compile, p1, p2, backtickrepl
- @_memoize_get_funcs
- def get_lapack_funcs(names, arrays=(), dtype=None, ilp64=False):
- """Return available LAPACK function objects from names.
- Arrays are used to determine the optimal prefix of LAPACK routines.
- Parameters
- ----------
- names : str or sequence of str
- Name(s) of LAPACK functions without type prefix.
- arrays : sequence of ndarrays, optional
- Arrays can be given to determine optimal prefix of LAPACK
- routines. If not given, double-precision routines will be
- used, otherwise the most generic type in arrays will be used.
- dtype : str or dtype, optional
- Data-type specifier. Not used if `arrays` is non-empty.
- ilp64 : {True, False, 'preferred'}, optional
- Whether to return ILP64 routine variant.
- Choosing 'preferred' returns ILP64 routine if available, and
- otherwise the 32-bit routine. Default: False
- Returns
- -------
- funcs : list
- List containing the found function(s).
- Notes
- -----
- This routine automatically chooses between Fortran/C
- interfaces. Fortran code is used whenever possible for arrays with
- column major order. In all other cases, C code is preferred.
- In LAPACK, the naming convention is that all functions start with a
- type prefix, which depends on the type of the principal
- matrix. These can be one of {'s', 'd', 'c', 'z'} for the NumPy
- types {float32, float64, complex64, complex128} respectively, and
- are stored in attribute ``typecode`` of the returned functions.
- Examples
- --------
- Suppose we would like to use '?lange' routine which computes the selected
- norm of an array. We pass our array in order to get the correct 'lange'
- flavor.
- >>> import numpy as np
- >>> import scipy.linalg as LA
- >>> rng = np.random.default_rng()
- >>> a = rng.random((3,2))
- >>> x_lange = LA.get_lapack_funcs('lange', (a,))
- >>> x_lange.typecode
- 'd'
- >>> x_lange = LA.get_lapack_funcs('lange',(a*1j,))
- >>> x_lange.typecode
- 'z'
- Several LAPACK routines work best when its internal WORK array has
- the optimal size (big enough for fast computation and small enough to
- avoid waste of memory). This size is determined also by a dedicated query
- to the function which is often wrapped as a standalone function and
- commonly denoted as ``###_lwork``. Below is an example for ``?sysv``
- >>> a = rng.random((1000, 1000))
- >>> b = rng.random((1000, 1)) * 1j
- >>> # We pick up zsysv and zsysv_lwork due to b array
- ... xsysv, xlwork = LA.get_lapack_funcs(('sysv', 'sysv_lwork'), (a, b))
- >>> opt_lwork, _ = xlwork(a.shape[0]) # returns a complex for 'z' prefix
- >>> udut, ipiv, x, info = xsysv(a, b, lwork=int(opt_lwork.real))
- """
- if isinstance(ilp64, str):
- if ilp64 == 'preferred':
- ilp64 = HAS_ILP64
- else:
- raise ValueError("Invalid value for 'ilp64'")
- if not ilp64:
- return _get_funcs(names, arrays, dtype,
- "LAPACK", _flapack, _clapack,
- "flapack", "clapack", _lapack_alias,
- ilp64=False)
- else:
- if not HAS_ILP64:
- raise RuntimeError("LAPACK ILP64 routine requested, but Scipy "
- "compiled only with 32-bit BLAS")
- return _get_funcs(names, arrays, dtype,
- "LAPACK", _flapack_64, None,
- "flapack_64", None, _lapack_alias,
- ilp64=True)
- _int32_max = _np.iinfo(_np.int32).max
- _int64_max = _np.iinfo(_np.int64).max
- def _compute_lwork(routine, *args, **kwargs):
- """
- Round floating-point lwork returned by lapack to integer.
- Several LAPACK routines compute optimal values for LWORK, which
- they return in a floating-point variable. However, for large
- values of LWORK, single-precision floating point is not sufficient
- to hold the exact value --- some LAPACK versions (<= 3.5.0 at
- least) truncate the returned integer to single precision and in
- some cases this can be smaller than the required value.
- Examples
- --------
- >>> from scipy.linalg import lapack
- >>> n = 5000
- >>> s_r, s_lw = lapack.get_lapack_funcs(('sysvx', 'sysvx_lwork'))
- >>> lwork = lapack._compute_lwork(s_lw, n)
- >>> lwork
- 32000
- """
- dtype = getattr(routine, 'dtype', None)
- int_dtype = getattr(routine, 'int_dtype', None)
- ret = routine(*args, **kwargs)
- if ret[-1] != 0:
- raise ValueError("Internal work array size computation failed: "
- "%d" % (ret[-1],))
- if len(ret) == 2:
- return _check_work_float(ret[0].real, dtype, int_dtype)
- else:
- return tuple(_check_work_float(x.real, dtype, int_dtype)
- for x in ret[:-1])
- def _check_work_float(value, dtype, int_dtype):
- """
- Convert LAPACK-returned work array size float to integer,
- carefully for single-precision types.
- """
- if dtype == _np.float32 or dtype == _np.complex64:
- # Single-precision routine -- take next fp value to work
- # around possible truncation in LAPACK code
- value = _np.nextafter(value, _np.inf, dtype=_np.float32)
- value = int(value)
- if int_dtype.itemsize == 4:
- if value < 0 or value > _int32_max:
- raise ValueError("Too large work array required -- computation "
- "cannot be performed with standard 32-bit"
- " LAPACK.")
- elif int_dtype.itemsize == 8:
- if value < 0 or value > _int64_max:
- raise ValueError("Too large work array required -- computation"
- " cannot be performed with standard 64-bit"
- " LAPACK.")
- return value
|