diff options
author | Pjotr Prins | 2018-08-25 09:48:03 +0000 |
---|---|---|
committer | Pjotr Prins | 2018-08-25 09:48:03 +0000 |
commit | 4d1a44cb90affbe9c73a27767bae4a4b69c72402 (patch) | |
tree | 2ef95ca1df733f1d048f4d0a7eac56651fba3614 | |
parent | 3ebaa0718d92e9de9c85c9e462d8fff22ff65d1a (diff) | |
download | pangemma-4d1a44cb90affbe9c73a27767bae4a4b69c72402.tar.gz |
segfpe handling
-rw-r--r-- | INSTALL.md | 5 | ||||
-rw-r--r-- | src/gemma.cpp | 13 | ||||
-rw-r--r-- | src/gemma_io.cpp | 2 | ||||
-rw-r--r-- | src/lapack.cpp | 14 | ||||
-rw-r--r-- | src/lmm.cpp | 9 |
5 files changed, 30 insertions, 13 deletions
@@ -63,9 +63,10 @@ issues (i.e., for the purpose of debugging). Note that this is an advanced configuration option at this stage. GNU Guix will make it easier in the future to deal with shared -graphs. Contact Pjotr Prins if you are really interested. +graphs. Contact Pjotr Prins if you are really interested. For development +we have the [gemma-dev-env package](https://gitlab.com/genenetwork/guix-bioinformatics/blob/master/gn/packages/gemma.scm). -The following two links capture and provide the reproducible build +The following two links capture and provide the current reproducible build system that we use for development of GEMMA to generate /gnu/store/9ahrb1swr06kjm2gr2zg0fsyvps3xqgz-profile 1. https://gitlab.com/genenetwork/guix-bioinformatics/tree/99718d253ec9ed8ed836f0a348381a7cd83d4b9f diff --git a/src/gemma.cpp b/src/gemma.cpp index a183edc..78633e8 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -1624,7 +1624,7 @@ void GEMMA::BatchRun(PARAM &cPar) { clock_t time_begin, time_start; time_begin = clock(); - if (is_check_mode()) enable_segfpe(); // fast NaN checking + if (is_check_mode()) enable_segfpe(); // fast NaN checking by default // Read Files. cout << "Reading Files ... " << endl; @@ -1912,7 +1912,7 @@ void GEMMA::BatchRun(PARAM &cPar) { VARCOV cVarcov; cVarcov.CopyFromParam(cPar); - if (is_check_mode()) disable_segfpe(); // fast NaN checking + if (is_check_mode()) disable_segfpe(); // disable fast NaN checking for now if (!cPar.file_bfile.empty()) { cVarcov.AnalyzePlink(); @@ -2027,7 +2027,7 @@ void GEMMA::BatchRun(PARAM &cPar) { VARCOV cVarcov; cVarcov.CopyFromParam(cPar); - if (is_check_mode()) disable_segfpe(); // fast NaN checking + if (is_check_mode()) disable_segfpe(); // fast NaN checking for now if (!cPar.file_bfile.empty()) { cVarcov.AnalyzePlink(); @@ -2055,7 +2055,7 @@ void GEMMA::BatchRun(PARAM &cPar) { gsl_vector_view Y_col = gsl_matrix_column(Y, 0); - if (is_check_mode()) disable_segfpe(); // fast NaN checking + // if (is_check_mode()) disable_segfpe(); // disable fast NaN checking for now if (!cPar.file_gene.empty()) { cLm.AnalyzeGene(W, @@ -2763,7 +2763,7 @@ void GEMMA::BatchRun(PARAM &cPar) { LMM cLmm; cLmm.CopyFromParam(cPar); - if (is_check_mode()) disable_segfpe(); // fast NaN checking + if (is_check_mode()) disable_segfpe(); // disable fast NaN checking for now gsl_vector_view Y_col = gsl_matrix_column(Y, 0); gsl_vector_view UtY_col = gsl_matrix_column(UtY, 0); @@ -2790,14 +2790,13 @@ void GEMMA::BatchRun(PARAM &cPar) { &Y_col.vector, env); } } - cLmm.WriteFiles(); cLmm.CopyToParam(cPar); } else { MVLMM cMvlmm; cMvlmm.CopyFromParam(cPar); - if (is_check_mode()) disable_segfpe(); // fast NaN checking + if (is_check_mode()) disable_segfpe(); // disable fast NaN checking if (!cPar.file_bfile.empty()) { if (cPar.file_gxe.empty()) { diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index 818c5e8..fad3e47 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -1483,12 +1483,14 @@ bool BimbamKin(const string file_geno, const set<string> ksnps, // and transpose // FIXME: the following is very slow + debug_msg("begin transpose"); for (size_t i = 0; i < ni_total; ++i) { for (size_t j = 0; j < i; ++j) { d = gsl_matrix_get(matrix_kin, j, i); gsl_matrix_set(matrix_kin, i, j, d); } } + debug_msg("end transpose"); // GSL is faster - and there are even faster methods // enforce_gsl(gsl_matrix_transpose(matrix_kin)); diff --git a/src/lapack.cpp b/src/lapack.cpp index 187daa8..b309a1b 100644 --- a/src/lapack.cpp +++ b/src/lapack.cpp @@ -193,6 +193,8 @@ void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec, double WORK_temp[1]; int IWORK_temp[1]; + if (is_check_mode()) disable_segfpe(); // disable fast NaN checking for now + // DSYEVR - computes selected eigenvalues and, optionally, // eigenvectors of a real symmetric matrix // Here compute both (JOBZ is V), all eigenvalues (RANGE is A) @@ -200,7 +202,12 @@ void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec, dsyevr_(&JOBZ, &RANGE, &UPLO, &N, A->data, &LDA, &VL, &VU, &IL, &IU, &ABSTOL, &M, eval->data, evec->data, &LDZ, ISUPPZ, WORK_temp, &LWORK, IWORK_temp, &LIWORK, &INFO); - enforce_msg(INFO != 0, "lapack_eigen_symmv failed"); + // If info = 0, the execution is successful. + // If info = -i, the i-th parameter had an illegal value. + // If info = i, an internal error has occurred. + + if (INFO != 0) cerr << "ERROR: value of INFO is " << INFO; + enforce_msg(INFO == 0, "lapack_eigen_symmv failed"); LWORK = (int)WORK_temp[0]; LIWORK = (int)IWORK_temp[0]; @@ -210,7 +217,10 @@ void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec, dsyevr_(&JOBZ, &RANGE, &UPLO, &N, A->data, &LDA, &VL, &VU, &IL, &IU, &ABSTOL, &M, eval->data, evec->data, &LDZ, ISUPPZ, WORK, &LWORK, IWORK, &LIWORK, &INFO); - enforce_msg(INFO != 0, "lapack_eigen_symmv failed"); + if (INFO != 0) cerr << "ERROR: value of INFO is " << INFO; + enforce_msg(INFO == 0, "lapack_eigen_symmv failed"); + + if (is_check_mode()) disable_segfpe(); // reinstate fast NaN checking gsl_matrix_transpose(evec); diff --git a/src/lmm.cpp b/src/lmm.cpp index acd9667..7e4c3e1 100644 --- a/src/lmm.cpp +++ b/src/lmm.cpp @@ -97,8 +97,9 @@ void LMM::CopyToParam(PARAM &cPar) { } void LMM::WriteFiles() { - string file_str; + debug_msg("LMM::WriteFiles"); + file_str = path_out + "/" + file_out; file_str += ".assoc.txt"; @@ -1319,6 +1320,7 @@ void LMM::Analyze(std::function< SnpNameValues(size_t) >& fetch_snp, auto batch_compute = [&](size_t l) { // using a C++ closure // Compute SNPs in batch, note the computations are independent per SNP + debug_msg("enter batch_compute"); gsl_matrix_view Xlarge_sub = gsl_matrix_submatrix(Xlarge, 0, 0, inds, l); gsl_matrix_view UtXlarge_sub = gsl_matrix_submatrix(UtXlarge, 0, 0, inds, l); @@ -1366,6 +1368,7 @@ void LMM::Analyze(std::function< SnpNameValues(size_t) >& fetch_snp, p_wald, p_lrt, p_score, logl_H1}; sumStat.push_back(SNPs); } + debug_msg("exit batch_compute"); }; const auto num_snps = indicator_snp.size(); @@ -1441,9 +1444,11 @@ void LMM::Analyze(std::function< SnpNameValues(size_t) >& fetch_snp, gsl_vector_safe_memcpy(&Xlarge_col.vector, x); c++; // count SNPs going in - if (c % msize == 0) + if (c % msize == 0) { batch_compute(msize); + } } + batch_compute(c % msize); ProgressBar("Reading SNPs", num_snps - 1, num_snps - 1); // cout << "Counted SNPs " << c << " sumStat " << sumStat.size() << endl; |