MCPcopy Create free account
hub / github.com/numpy/numpy / init_evd

Function init_evd

numpy/linalg/umath_linalg.cpp:1301–1371  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1299 */
1300template<typename typ>
1301static inline int
1302init_evd(EIGH_PARAMS_t<typ>* params, char JOBZ, char UPLO,
1303 fortran_int N, scalar_trait)
1304{
1305 npy_uint8 *mem_buff = NULL;
1306 npy_uint8 *mem_buff2 = NULL;
1307 fortran_int lwork;
1308 fortran_int liwork;
1309 npy_uint8 *a, *w, *work, *iwork;
1310 size_t safe_N = N;
1311 size_t alloc_size = safe_N * (safe_N + 1) * sizeof(typ);
1312 fortran_int lda = fortran_int_max(N, 1);
1313
1314 mem_buff = (npy_uint8 *)malloc(alloc_size);
1315
1316 if (!mem_buff) {
1317 goto error;
1318 }
1319 a = mem_buff;
1320 w = mem_buff + safe_N * safe_N * sizeof(typ);
1321
1322 params->A = (typ*)a;
1323 params->W = (typ*)w;
1324 params->RWORK = NULL; /* unused */
1325 params->N = N;
1326 params->LRWORK = 0; /* unused */
1327 params->JOBZ = JOBZ;
1328 params->UPLO = UPLO;
1329 params->LDA = lda;
1330
1331 /* Work size query */
1332 {
1333 typ query_work_size;
1334 fortran_int query_iwork_size;
1335
1336 params->LWORK = -1;
1337 params->LIWORK = -1;
1338 params->WORK = &query_work_size;
1339 params->IWORK = &query_iwork_size;
1340
1341 if (call_evd(params) != 0) {
1342 goto error;
1343 }
1344
1345 lwork = (fortran_int)query_work_size;
1346 liwork = query_iwork_size;
1347 }
1348
1349 mem_buff2 = (npy_uint8 *)malloc(lwork*sizeof(typ) + liwork*sizeof(fortran_int));
1350 if (!mem_buff2) {
1351 goto error;
1352 }
1353
1354 work = mem_buff2;
1355 iwork = mem_buff2 + lwork*sizeof(typ);
1356
1357 params->LWORK = lwork;
1358 params->WORK = (typ*)work;

Callers 1

eigh_wrapperFunction · 0.85

Calls 2

fortran_int_maxFunction · 0.85
call_evdFunction · 0.85

Tested by

no test coverage detected