Skip to content

Commit b5d469e

Browse files
committed
refactoring complete
1 parent e9df9fd commit b5d469e

File tree

1 file changed

+60
-145
lines changed

1 file changed

+60
-145
lines changed

numpy/linalg/umath_linalg.c.src

Lines changed: 60 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -3159,6 +3159,9 @@ static void
31593159

31603160
/**end repeat**/
31613161

3162+
/* -------------------------------------------------------------------------- */
3163+
/* qr common code (modes - reduced and complete) */
3164+
31623165
typedef struct gqr_params_struct
31633166
{
31643167
fortran_int M;
@@ -3191,7 +3194,6 @@ call_@lapack_func@(GQR_PARAMS_t *params)
31913194
/**end repeat**/
31923195

31933196
/**begin repeat
3194-
#TYPE=FLOAT,DOUBLE#
31953197
#lapack_func=sorgqr,dorgqr#
31963198
#ftyp=fortran_real,fortran_doublereal#
31973199
*/
@@ -3275,73 +3277,27 @@ init_@lapack_func@_common(GQR_PARAMS_t *params,
32753277

32763278
/**end repeat**/
32773279

3278-
/* -------------------------------------------------------------------------- */
3279-
/* qr (modes - reduced) */
3280-
3281-
3282-
static inline void
3283-
dump_gqr_params(const char *name,
3284-
GQR_PARAMS_t *params)
3285-
{
3286-
TRACE_TXT("\n%s:\n"\
3287-
3288-
"%14s: %18p\n"\
3289-
"%14s: %18p\n"\
3290-
"%14s: %18p\n"\
3291-
"%14s: %18d\n"\
3292-
"%14s: %18d\n"\
3293-
"%14s: %18d\n"\
3294-
"%14s: %18d\n"\
3295-
"%14s: %18d\n",
3296-
3297-
name,
3298-
3299-
"Q", params->Q,
3300-
"TAU", params->TAU,
3301-
"WORK", params->WORK,
3302-
3303-
"M", (int)params->M,
3304-
"MC", (int)params->MC,
3305-
"MN", (int)params->MN,
3306-
"LDA", (int)params->LDA,
3307-
"LWORK", (int)params->LWORK);
3308-
}
3309-
3310-
/**begin repeat
3311-
#TYPE=FLOAT,DOUBLE#
3312-
#lapack_func=sorgqr,dorgqr#
3313-
#ftyp=fortran_real,fortran_doublereal#
3314-
*/
3315-
static inline int
3316-
init_@lapack_func@(GQR_PARAMS_t *params,
3317-
fortran_int m,
3318-
fortran_int n)
3319-
{
3320-
return init_@lapack_func@_common(params, m, n, fortran_int_min(m, n));
3321-
}
3322-
3323-
/**end repeat**/
3324-
33253280
/**begin repeat
3326-
#TYPE=CFLOAT,CDOUBLE#
33273281
#lapack_func=cungqr,zungqr#
33283282
#ftyp=fortran_complex,fortran_doublecomplex#
33293283
*/
33303284
static inline int
3331-
init_@lapack_func@(GQR_PARAMS_t *params,
3332-
fortran_int m,
3333-
fortran_int n)
3285+
init_@lapack_func@_common(GQR_PARAMS_t *params,
3286+
fortran_int m,
3287+
fortran_int n,
3288+
fortran_int mc)
33343289
{
33353290
npy_uint8 *mem_buff = NULL;
33363291
npy_uint8 *mem_buff2 = NULL;
33373292
npy_uint8 *a, *q, *tau, *work;
33383293
fortran_int min_m_n = fortran_int_min(m, n);
3294+
size_t safe_mc = mc;
33393295
size_t safe_min_m_n = min_m_n;
33403296
size_t safe_m = m;
33413297
size_t safe_n = n;
33423298

33433299
size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
3344-
size_t q_size = safe_m * safe_min_m_n * sizeof(@ftyp@);
3300+
size_t q_size = safe_m * safe_mc * sizeof(@ftyp@);
33453301
size_t tau_size = safe_min_m_n * sizeof(@ftyp@);
33463302

33473303
fortran_int work_count_r, work_count_i, work_count;
@@ -3359,7 +3315,7 @@ init_@lapack_func@(GQR_PARAMS_t *params,
33593315

33603316

33613317
params->M = m;
3362-
params->MC = min_m_n;
3318+
params->MC = mc;
33633319
params->MN = min_m_n;
33643320
params->A = a;
33653321
params->Q = q;
@@ -3411,6 +3367,54 @@ init_@lapack_func@(GQR_PARAMS_t *params,
34113367

34123368
/**end repeat**/
34133369

3370+
/* -------------------------------------------------------------------------- */
3371+
/* qr (modes - reduced) */
3372+
3373+
3374+
static inline void
3375+
dump_gqr_params(const char *name,
3376+
GQR_PARAMS_t *params)
3377+
{
3378+
TRACE_TXT("\n%s:\n"\
3379+
3380+
"%14s: %18p\n"\
3381+
"%14s: %18p\n"\
3382+
"%14s: %18p\n"\
3383+
"%14s: %18d\n"\
3384+
"%14s: %18d\n"\
3385+
"%14s: %18d\n"\
3386+
"%14s: %18d\n"\
3387+
"%14s: %18d\n",
3388+
3389+
name,
3390+
3391+
"Q", params->Q,
3392+
"TAU", params->TAU,
3393+
"WORK", params->WORK,
3394+
3395+
"M", (int)params->M,
3396+
"MC", (int)params->MC,
3397+
"MN", (int)params->MN,
3398+
"LDA", (int)params->LDA,
3399+
"LWORK", (int)params->LWORK);
3400+
}
3401+
3402+
/**begin repeat
3403+
#lapack_func=sorgqr,dorgqr,cungqr,zungqr#
3404+
#ftyp=fortran_real,fortran_doublereal,fortran_complex,fortran_doublecomplex#
3405+
*/
3406+
static inline int
3407+
init_@lapack_func@(GQR_PARAMS_t *params,
3408+
fortran_int m,
3409+
fortran_int n)
3410+
{
3411+
return init_@lapack_func@_common(
3412+
params, m, n,
3413+
fortran_int_min(m, n));
3414+
}
3415+
3416+
/**end repeat**/
3417+
34143418
/**begin repeat
34153419
#lapack_func=sorgqr,dorgqr,cungqr,zungqr#
34163420
*/
@@ -3486,9 +3490,8 @@ static void
34863490
/* qr (modes - complete) */
34873491

34883492
/**begin repeat
3489-
#TYPE=FLOAT,DOUBLE#
3490-
#lapack_func=sorgqr,dorgqr#
3491-
#ftyp=fortran_real,fortran_doublereal#
3493+
#lapack_func=sorgqr,dorgqr,cungqr,zungqr#
3494+
#ftyp=fortran_real,fortran_doublereal,fortran_complex,fortran_doublecomplex#
34923495
*/
34933496
static inline int
34943497
init_@lapack_func@_complete(GQR_PARAMS_t *params,
@@ -3500,94 +3503,6 @@ init_@lapack_func@_complete(GQR_PARAMS_t *params,
35003503

35013504
/**end repeat**/
35023505

3503-
/**begin repeat
3504-
#TYPE=CFLOAT,CDOUBLE#
3505-
#lapack_func=cungqr,zungqr#
3506-
#ftyp=fortran_complex,fortran_doublecomplex#
3507-
*/
3508-
static inline int
3509-
init_@lapack_func@_complete(GQR_PARAMS_t *params,
3510-
fortran_int m,
3511-
fortran_int n)
3512-
{
3513-
npy_uint8 *mem_buff = NULL;
3514-
npy_uint8 *mem_buff2 = NULL;
3515-
npy_uint8 *a, *q, *tau, *work;
3516-
fortran_int min_m_n = fortran_int_min(m, n);
3517-
size_t safe_min_m_n = min_m_n;
3518-
size_t safe_m = m;
3519-
size_t safe_n = n;
3520-
3521-
size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
3522-
size_t q_size = safe_m * safe_m * sizeof(@ftyp@);
3523-
size_t tau_size = safe_min_m_n * sizeof(@ftyp@);
3524-
3525-
fortran_int work_count_r, work_count_i, work_count;
3526-
size_t work_size;
3527-
fortran_int lda = fortran_int_max(1, m);
3528-
3529-
mem_buff = malloc(q_size + tau_size + a_size);
3530-
3531-
if (!mem_buff)
3532-
goto error;
3533-
3534-
q = mem_buff;
3535-
tau = q + q_size;
3536-
a = tau + tau_size;
3537-
3538-
3539-
params->M = m;
3540-
params->MC = m;
3541-
params->MN = min_m_n;
3542-
params->A = a;
3543-
params->Q = q;
3544-
params->TAU = tau;
3545-
params->LDA = lda;
3546-
3547-
{
3548-
/* compute optimal work size */
3549-
@ftyp@ work_size_query;
3550-
3551-
params->WORK = &work_size_query;
3552-
params->LWORK = -1;
3553-
3554-
if (call_@lapack_func@(params) != 0)
3555-
goto error;
3556-
3557-
work_count_r = (fortran_int) ((@ftyp@*)params->WORK)->r;
3558-
work_count_i = (fortran_int) ((@ftyp@*)params->WORK)->i;
3559-
3560-
work_count = (fortran_int) sqrt((fortran_doublereal) work_count_r*work_count_r +
3561-
(fortran_doublereal) work_count_i*work_count_i);
3562-
3563-
}
3564-
3565-
params->LWORK = fortran_int_max(fortran_int_max(1, n),
3566-
work_count);
3567-
3568-
work_size = (size_t) params->LWORK * sizeof(@ftyp@);
3569-
mem_buff2 = malloc(work_size);
3570-
if (!mem_buff2)
3571-
goto error;
3572-
3573-
work = mem_buff2;
3574-
memset(work, 0, work_size);
3575-
3576-
params->WORK = work;
3577-
params->LWORK = work_count;
3578-
3579-
return 1;
3580-
error:
3581-
TRACE_TXT("%s failed init\n", __FUNCTION__);
3582-
free(mem_buff);
3583-
free(mem_buff2);
3584-
memset(params, 0, sizeof(*params));
3585-
3586-
return 0;
3587-
}
3588-
3589-
/**end repeat**/
3590-
35913506
/**begin repeat
35923507
#TYPE=FLOAT,DOUBLE,CFLOAT,CDOUBLE#
35933508
#REALTYPE=FLOAT,DOUBLE,FLOAT,DOUBLE#

0 commit comments

Comments
 (0)