diff options
| author | czgdp1807 <gdp.1807@gmail.com> | 2021-06-22 10:05:47 +0530 |
|---|---|---|
| committer | czgdp1807 <gdp.1807@gmail.com> | 2021-06-22 10:05:47 +0530 |
| commit | b5d469efbfa4a400fd9213cb0a5c11c826be9da3 (patch) | |
| tree | 78a0cec79a0de77c3acd28137c5a53fdc90353a5 /numpy/linalg | |
| parent | e9df9fdc0a2d26b53b881d64b492454cbdeed3b4 (diff) | |
| download | numpy-b5d469efbfa4a400fd9213cb0a5c11c826be9da3.tar.gz | |
refactoring complete
Diffstat (limited to 'numpy/linalg')
| -rw-r--r-- | numpy/linalg/umath_linalg.c.src | 205 |
1 files changed, 60 insertions, 145 deletions
diff --git a/numpy/linalg/umath_linalg.c.src b/numpy/linalg/umath_linalg.c.src index 86946274f..964c4d481 100644 --- a/numpy/linalg/umath_linalg.c.src +++ b/numpy/linalg/umath_linalg.c.src @@ -3159,6 +3159,9 @@ static void /**end repeat**/ +/* -------------------------------------------------------------------------- */ + /* qr common code (modes - reduced and complete) */ + typedef struct gqr_params_struct { fortran_int M; @@ -3191,7 +3194,6 @@ call_@lapack_func@(GQR_PARAMS_t *params) /**end repeat**/ /**begin repeat - #TYPE=FLOAT,DOUBLE# #lapack_func=sorgqr,dorgqr# #ftyp=fortran_real,fortran_doublereal# */ @@ -3275,73 +3277,27 @@ init_@lapack_func@_common(GQR_PARAMS_t *params, /**end repeat**/ -/* -------------------------------------------------------------------------- */ - /* qr (modes - reduced) */ - - -static inline void -dump_gqr_params(const char *name, - GQR_PARAMS_t *params) -{ - TRACE_TXT("\n%s:\n"\ - - "%14s: %18p\n"\ - "%14s: %18p\n"\ - "%14s: %18p\n"\ - "%14s: %18d\n"\ - "%14s: %18d\n"\ - "%14s: %18d\n"\ - "%14s: %18d\n"\ - "%14s: %18d\n", - - name, - - "Q", params->Q, - "TAU", params->TAU, - "WORK", params->WORK, - - "M", (int)params->M, - "MC", (int)params->MC, - "MN", (int)params->MN, - "LDA", (int)params->LDA, - "LWORK", (int)params->LWORK); -} - -/**begin repeat - #TYPE=FLOAT,DOUBLE# - #lapack_func=sorgqr,dorgqr# - #ftyp=fortran_real,fortran_doublereal# - */ -static inline int -init_@lapack_func@(GQR_PARAMS_t *params, - fortran_int m, - fortran_int n) -{ - return init_@lapack_func@_common(params, m, n, fortran_int_min(m, n)); -} - -/**end repeat**/ - /**begin repeat - #TYPE=CFLOAT,CDOUBLE# #lapack_func=cungqr,zungqr# #ftyp=fortran_complex,fortran_doublecomplex# */ static inline int -init_@lapack_func@(GQR_PARAMS_t *params, - fortran_int m, - fortran_int n) +init_@lapack_func@_common(GQR_PARAMS_t *params, + fortran_int m, + fortran_int n, + fortran_int mc) { npy_uint8 *mem_buff = NULL; npy_uint8 *mem_buff2 = NULL; npy_uint8 *a, *q, *tau, *work; fortran_int min_m_n = fortran_int_min(m, n); + size_t safe_mc = mc; size_t safe_min_m_n = min_m_n; size_t safe_m = m; size_t safe_n = n; size_t a_size = safe_m * safe_n * sizeof(@ftyp@); - size_t q_size = safe_m * safe_min_m_n * sizeof(@ftyp@); + size_t q_size = safe_m * safe_mc * sizeof(@ftyp@); size_t tau_size = safe_min_m_n * sizeof(@ftyp@); fortran_int work_count_r, work_count_i, work_count; @@ -3359,7 +3315,7 @@ init_@lapack_func@(GQR_PARAMS_t *params, params->M = m; - params->MC = min_m_n; + params->MC = mc; params->MN = min_m_n; params->A = a; params->Q = q; @@ -3411,6 +3367,54 @@ init_@lapack_func@(GQR_PARAMS_t *params, /**end repeat**/ +/* -------------------------------------------------------------------------- */ + /* qr (modes - reduced) */ + + +static inline void +dump_gqr_params(const char *name, + GQR_PARAMS_t *params) +{ + TRACE_TXT("\n%s:\n"\ + + "%14s: %18p\n"\ + "%14s: %18p\n"\ + "%14s: %18p\n"\ + "%14s: %18d\n"\ + "%14s: %18d\n"\ + "%14s: %18d\n"\ + "%14s: %18d\n"\ + "%14s: %18d\n", + + name, + + "Q", params->Q, + "TAU", params->TAU, + "WORK", params->WORK, + + "M", (int)params->M, + "MC", (int)params->MC, + "MN", (int)params->MN, + "LDA", (int)params->LDA, + "LWORK", (int)params->LWORK); +} + +/**begin repeat + #lapack_func=sorgqr,dorgqr,cungqr,zungqr# + #ftyp=fortran_real,fortran_doublereal,fortran_complex,fortran_doublecomplex# + */ +static inline int +init_@lapack_func@(GQR_PARAMS_t *params, + fortran_int m, + fortran_int n) +{ + return init_@lapack_func@_common( + params, m, n, + fortran_int_min(m, n)); +} + +/**end repeat**/ + /**begin repeat #lapack_func=sorgqr,dorgqr,cungqr,zungqr# */ @@ -3486,9 +3490,8 @@ static void /* qr (modes - complete) */ /**begin repeat - #TYPE=FLOAT,DOUBLE# - #lapack_func=sorgqr,dorgqr# - #ftyp=fortran_real,fortran_doublereal# + #lapack_func=sorgqr,dorgqr,cungqr,zungqr# + #ftyp=fortran_real,fortran_doublereal,fortran_complex,fortran_doublecomplex# */ static inline int init_@lapack_func@_complete(GQR_PARAMS_t *params, @@ -3501,94 +3504,6 @@ init_@lapack_func@_complete(GQR_PARAMS_t *params, /**end repeat**/ /**begin repeat - #TYPE=CFLOAT,CDOUBLE# - #lapack_func=cungqr,zungqr# - #ftyp=fortran_complex,fortran_doublecomplex# - */ -static inline int -init_@lapack_func@_complete(GQR_PARAMS_t *params, - fortran_int m, - fortran_int n) -{ - npy_uint8 *mem_buff = NULL; - npy_uint8 *mem_buff2 = NULL; - npy_uint8 *a, *q, *tau, *work; - fortran_int min_m_n = fortran_int_min(m, n); - size_t safe_min_m_n = min_m_n; - size_t safe_m = m; - size_t safe_n = n; - - size_t a_size = safe_m * safe_n * sizeof(@ftyp@); - size_t q_size = safe_m * safe_m * sizeof(@ftyp@); - size_t tau_size = safe_min_m_n * sizeof(@ftyp@); - - fortran_int work_count_r, work_count_i, work_count; - size_t work_size; - fortran_int lda = fortran_int_max(1, m); - - mem_buff = malloc(q_size + tau_size + a_size); - - if (!mem_buff) - goto error; - - q = mem_buff; - tau = q + q_size; - a = tau + tau_size; - - - params->M = m; - params->MC = m; - params->MN = min_m_n; - params->A = a; - params->Q = q; - params->TAU = tau; - params->LDA = lda; - - { - /* compute optimal work size */ - @ftyp@ work_size_query; - - params->WORK = &work_size_query; - params->LWORK = -1; - - if (call_@lapack_func@(params) != 0) - goto error; - - work_count_r = (fortran_int) ((@ftyp@*)params->WORK)->r; - work_count_i = (fortran_int) ((@ftyp@*)params->WORK)->i; - - work_count = (fortran_int) sqrt((fortran_doublereal) work_count_r*work_count_r + - (fortran_doublereal) work_count_i*work_count_i); - - } - - params->LWORK = fortran_int_max(fortran_int_max(1, n), - work_count); - - work_size = (size_t) params->LWORK * sizeof(@ftyp@); - mem_buff2 = malloc(work_size); - if (!mem_buff2) - goto error; - - work = mem_buff2; - memset(work, 0, work_size); - - params->WORK = work; - params->LWORK = work_count; - - return 1; - error: - TRACE_TXT("%s failed init\n", __FUNCTION__); - free(mem_buff); - free(mem_buff2); - memset(params, 0, sizeof(*params)); - - return 0; -} - -/**end repeat**/ - -/**begin repeat #TYPE=FLOAT,DOUBLE,CFLOAT,CDOUBLE# #REALTYPE=FLOAT,DOUBLE,FLOAT,DOUBLE# #lapack_func=sorgqr,dorgqr,cungqr,zungqr# |
