Mercurial > jwe > octave
diff liboctave/numeric/fEIG.cc @ 21136:7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Remove statements after call to handler that are no longer reachable.
Place input validation first and immediately call handler if necessary.
Change if/error_handler/else to if/error_handler and re-indent code.
* Array-util.cc, Array.cc, CColVector.cc, CDiagMatrix.cc, CMatrix.cc,
CNDArray.cc, CRowVector.cc, CSparse.cc, DiagArray2.cc, MArray.cc,
PermMatrix.cc, Sparse.cc, Sparse.h, chMatrix.cc, chNDArray.cc, dColVector.cc,
dDiagMatrix.cc, dMatrix.cc, dNDArray.cc, dRowVector.cc, dSparse.cc,
fCColVector.cc, fCDiagMatrix.cc, fCMatrix.cc, fCNDArray.cc, fCRowVector.cc,
fColVector.cc, fDiagMatrix.cc, fMatrix.cc, fNDArray.cc, fRowVector.cc,
idx-vector.cc, CmplxAEPBAL.cc, CmplxCHOL.cc, CmplxGEPBAL.cc, CmplxHESS.cc,
CmplxLU.cc, CmplxQR.cc, CmplxSCHUR.cc, CmplxSVD.cc, DASPK.cc, EIG.cc, LSODE.cc,
Quad.cc, SparseCmplxCHOL.cc, SparseCmplxLU.cc, SparseCmplxQR.cc, SparseQR.cc,
SparsedbleCHOL.cc, SparsedbleLU.cc, base-lu.cc, bsxfun-defs.cc, dbleAEPBAL.cc,
dbleCHOL.cc, dbleGEPBAL.cc, dbleHESS.cc, dbleLU.cc, dbleQR.cc, dbleSCHUR.cc,
dbleSVD.cc, eigs-base.cc, fCmplxAEPBAL.cc, fCmplxCHOL.cc, fCmplxLU.cc,
fCmplxQR.cc, fCmplxSCHUR.cc, fEIG.cc, floatAEPBAL.cc, floatCHOL.cc,
floatGEPBAL.cc, floatHESS.cc, floatLU.cc, floatQR.cc, floatSCHUR.cc,
floatSVD.cc, lo-specfun.cc, oct-fftw.cc, oct-rand.cc, oct-spparms.cc,
sparse-base-chol.cc, sparse-dmsolve.cc, file-ops.cc, lo-sysdep.cc,
mach-info.cc, oct-env.cc, oct-syscalls.cc, cmd-edit.cc, cmd-hist.cc,
data-conv.cc, lo-ieee.cc, lo-regexp.cc, oct-base64.cc, oct-shlib.cc,
pathsearch.cc, singleton-cleanup.cc, sparse-util.cc, unwind-prot.cc:
Remove statements after call to handler that are no longer reachable.
Place input validation first and immediately call handler if necessary.
Change if/error_handler/else to if/error_handler and re-indent code.
author | Rik <rik@octave.org> |
---|---|
date | Sat, 23 Jan 2016 13:52:03 -0800 |
parents | ff904ae0285b |
children | f7121e111991 |
line wrap: on
line diff
--- a/liboctave/numeric/fEIG.cc Fri Jan 22 13:45:21 2016 -0500 +++ b/liboctave/numeric/fEIG.cc Sat Jan 23 13:52:03 2016 -0800 @@ -137,11 +137,8 @@ FloatEIG::init (const FloatMatrix& a, bool calc_ev) { if (a.any_element_is_inf_or_nan ()) - { - (*current_liboctave_error_handler) - ("EIG: matrix contains Inf or NaN values"); - return -1; - } + (*current_liboctave_error_handler) + ("EIG: matrix contains Inf or NaN values"); if (a.is_symmetric ()) return symmetric_init (a, calc_ev); @@ -149,10 +146,7 @@ octave_idx_type n = a.rows (); if (n != a.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); octave_idx_type info = 0; @@ -182,66 +176,55 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work); - Array<float> work (dim_vector (lwork, 1)); - float *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("sgeev workspace query failed"); - F77_XFCN (sgeev, SGEEV, (F77_CONST_CHAR_ARG2 ("N", 1), - F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - n, tmp_data, n, pwr, pwi, dummy, - idummy, pvr, n, pwork, lwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work); + Array<float> work (dim_vector (lwork, 1)); + float *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in sgeev"); - return info; - } + F77_XFCN (sgeev, SGEEV, (F77_CONST_CHAR_ARG2 ("N", 1), + F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + n, tmp_data, n, pwr, pwi, dummy, + idummy, pvr, n, pwork, lwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("sgeev failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in sgeev"); - lambda.resize (n); - v.resize (nvr, nvr); + if (info > 0) + (*current_liboctave_error_handler) ("sgeev failed to converge"); + + lambda.resize (n); + v.resize (nvr, nvr); - for (octave_idx_type j = 0; j < n; j++) + for (octave_idx_type j = 0; j < n; j++) + { + if (wi.elem (j) == 0.0) { - if (wi.elem (j) == 0.0) - { - lambda.elem (j) = FloatComplex (wr.elem (j)); - for (octave_idx_type i = 0; i < nvr; i++) - v.elem (i, j) = vr.elem (i, j); - } - else + lambda.elem (j) = FloatComplex (wr.elem (j)); + for (octave_idx_type i = 0; i < nvr; i++) + v.elem (i, j) = vr.elem (i, j); + } + else + { + if (j+1 >= n) + (*current_liboctave_error_handler) ("EIG: internal error"); + + lambda.elem (j) = FloatComplex (wr.elem (j), wi.elem (j)); + lambda.elem (j+1) = FloatComplex (wr.elem (j+1), wi.elem (j+1)); + + for (octave_idx_type i = 0; i < nvr; i++) { - if (j+1 >= n) - { - (*current_liboctave_error_handler) ("EIG: internal error"); - return -1; - } - - lambda.elem (j) = FloatComplex (wr.elem (j), wi.elem (j)); - lambda.elem (j+1) = FloatComplex (wr.elem (j+1), wi.elem (j+1)); - - for (octave_idx_type i = 0; i < nvr; i++) - { - float real_part = vr.elem (i, j); - float imag_part = vr.elem (i, j+1); - v.elem (i, j) = FloatComplex (real_part, imag_part); - v.elem (i, j+1) = FloatComplex (real_part, -imag_part); - } - j++; + float real_part = vr.elem (i, j); + float imag_part = vr.elem (i, j+1); + v.elem (i, j) = FloatComplex (real_part, imag_part); + v.elem (i, j+1) = FloatComplex (real_part, -imag_part); } + j++; } } - else - (*current_liboctave_error_handler) ("sgeev workspace query failed"); return info; } @@ -252,10 +235,7 @@ octave_idx_type n = a.rows (); if (n != a.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); octave_idx_type info = 0; @@ -274,35 +254,27 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work); - Array<float> work (dim_vector (lwork, 1)); - float *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("ssyev workspace query failed"); - F77_XFCN (ssyev, SSYEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - F77_CONST_CHAR_ARG2 ("U", 1), - n, tmp_data, n, pwr, pwork, lwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work); + Array<float> work (dim_vector (lwork, 1)); + float *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in ssyev"); - return info; - } + F77_XFCN (ssyev, SSYEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + F77_CONST_CHAR_ARG2 ("U", 1), + n, tmp_data, n, pwr, pwork, lwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("ssyev failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in ssyev"); - lambda = FloatComplexColumnVector (wr); - v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); - } - else - (*current_liboctave_error_handler) ("ssyev workspace query failed"); + if (info > 0) + (*current_liboctave_error_handler) ("ssyev failed to converge"); + + lambda = FloatComplexColumnVector (wr); + v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); return info; } @@ -311,11 +283,8 @@ FloatEIG::init (const FloatComplexMatrix& a, bool calc_ev) { if (a.any_element_is_inf_or_nan ()) - { - (*current_liboctave_error_handler) - ("EIG: matrix contains Inf or NaN values"); - return -1; - } + (*current_liboctave_error_handler) + ("EIG: matrix contains Inf or NaN values"); if (a.is_hermitian ()) return hermitian_init (a, calc_ev); @@ -323,10 +292,7 @@ octave_idx_type n = a.rows (); if (n != a.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); octave_idx_type info = 0; @@ -357,36 +323,28 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work.real ()); - Array<FloatComplex> work (dim_vector (lwork, 1)); - FloatComplex *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("cgeev workspace query failed"); - F77_XFCN (cgeev, CGEEV, (F77_CONST_CHAR_ARG2 ("N", 1), - F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - n, tmp_data, n, pw, dummy, idummy, - pv, n, pwork, lwork, prwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work.real ()); + Array<FloatComplex> work (dim_vector (lwork, 1)); + FloatComplex *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in cgeev"); - return info; - } + F77_XFCN (cgeev, CGEEV, (F77_CONST_CHAR_ARG2 ("N", 1), + F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + n, tmp_data, n, pw, dummy, idummy, + pv, n, pwork, lwork, prwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("cgeev failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in cgeev"); - lambda = w; - v = vtmp; - } - else - (*current_liboctave_error_handler) ("cgeev workspace query failed"); + if (info > 0) + (*current_liboctave_error_handler) ("cgeev failed to converge"); + + lambda = w; + v = vtmp; return info; } @@ -397,10 +355,7 @@ octave_idx_type n = a.rows (); if (n != a.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); octave_idx_type info = 0; @@ -424,35 +379,27 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work.real ()); - Array<FloatComplex> work (dim_vector (lwork, 1)); - FloatComplex *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("cheev workspace query failed"); - F77_XFCN (cheev, CHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - F77_CONST_CHAR_ARG2 ("U", 1), - n, tmp_data, n, pwr, pwork, lwork, prwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work.real ()); + Array<FloatComplex> work (dim_vector (lwork, 1)); + FloatComplex *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in cheev"); - return info; - } + F77_XFCN (cheev, CHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + F77_CONST_CHAR_ARG2 ("U", 1), + n, tmp_data, n, pwr, pwork, lwork, prwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("cheev failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in cheev"); - lambda = FloatComplexColumnVector (wr); - v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); - } - else - (*current_liboctave_error_handler) ("cheev workspace query failed"); + if (info > 0) + (*current_liboctave_error_handler) ("cheev failed to converge"); + + lambda = FloatComplexColumnVector (wr); + v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); return info; } @@ -461,26 +408,17 @@ FloatEIG::init (const FloatMatrix& a, const FloatMatrix& b, bool calc_ev) { if (a.any_element_is_inf_or_nan () || b.any_element_is_inf_or_nan ()) - { - (*current_liboctave_error_handler) - ("EIG: matrix contains Inf or NaN values"); - return -1; - } + (*current_liboctave_error_handler) + ("EIG: matrix contains Inf or NaN values"); octave_idx_type n = a.rows (); octave_idx_type nb = b.rows (); if (n != a.cols () || nb != b.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); if (n != nb) - { - (*current_liboctave_error_handler) ("EIG requires same size matrices"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires same size matrices"); octave_idx_type info = 0; @@ -530,70 +468,59 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work); - Array<float> work (dim_vector (lwork, 1)); - float *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("sggev workspace query failed"); - F77_XFCN (sggev, SGGEV, (F77_CONST_CHAR_ARG2 ("N", 1), - F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - n, atmp_data, n, btmp_data, n, - par, pai, pbeta, - dummy, idummy, pvr, n, - pwork, lwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work); + Array<float> work (dim_vector (lwork, 1)); + float *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in sggev"); - return info; - } + F77_XFCN (sggev, SGGEV, (F77_CONST_CHAR_ARG2 ("N", 1), + F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + n, atmp_data, n, btmp_data, n, + par, pai, pbeta, + dummy, idummy, pvr, n, + pwork, lwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("sggev failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in sggev"); - lambda.resize (n); - v.resize (nvr, nvr); + if (info > 0) + (*current_liboctave_error_handler) ("sggev failed to converge"); + + lambda.resize (n); + v.resize (nvr, nvr); - for (octave_idx_type j = 0; j < n; j++) + for (octave_idx_type j = 0; j < n; j++) + { + if (ai.elem (j) == 0.0) + { + lambda.elem (j) = FloatComplex (ar.elem (j) / beta.elem (j)); + for (octave_idx_type i = 0; i < nvr; i++) + v.elem (i, j) = vr.elem (i, j); + } + else { - if (ai.elem (j) == 0.0) - { - lambda.elem (j) = FloatComplex (ar.elem (j) / beta.elem (j)); - for (octave_idx_type i = 0; i < nvr; i++) - v.elem (i, j) = vr.elem (i, j); - } - else + if (j+1 >= n) + (*current_liboctave_error_handler) ("EIG: internal error"); + + lambda.elem (j) = FloatComplex (ar.elem (j) / beta.elem (j), + ai.elem (j) / beta.elem (j)); + lambda.elem (j+1) = FloatComplex (ar.elem (j+1) / beta.elem (j+1), + ai.elem (j+1) / beta.elem (j+1)); + + for (octave_idx_type i = 0; i < nvr; i++) { - if (j+1 >= n) - { - (*current_liboctave_error_handler) ("EIG: internal error"); - return -1; - } - - lambda.elem (j) = FloatComplex (ar.elem (j) / beta.elem (j), - ai.elem (j) / beta.elem (j)); - lambda.elem (j+1) = FloatComplex (ar.elem (j+1) / beta.elem (j+1), - ai.elem (j+1) / beta.elem (j+1)); - - for (octave_idx_type i = 0; i < nvr; i++) - { - float real_part = vr.elem (i, j); - float imag_part = vr.elem (i, j+1); - v.elem (i, j) = FloatComplex (real_part, imag_part); - v.elem (i, j+1) = FloatComplex (real_part, -imag_part); - } - j++; + float real_part = vr.elem (i, j); + float imag_part = vr.elem (i, j+1); + v.elem (i, j) = FloatComplex (real_part, imag_part); + v.elem (i, j+1) = FloatComplex (real_part, -imag_part); } + j++; } } - else - (*current_liboctave_error_handler) ("sggev workspace query failed"); return info; } @@ -606,16 +533,10 @@ octave_idx_type nb = b.rows (); if (n != a.cols () || nb != b.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); if (n != nb) - { - (*current_liboctave_error_handler) ("EIG requires same size matrices"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires same size matrices"); octave_idx_type info = 0; @@ -639,37 +560,29 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work); - Array<float> work (dim_vector (lwork, 1)); - float *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("ssygv workspace query failed"); - F77_XFCN (ssygv, SSYGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - F77_CONST_CHAR_ARG2 ("U", 1), - n, atmp_data, n, - btmp_data, n, - pwr, pwork, lwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work); + Array<float> work (dim_vector (lwork, 1)); + float *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in ssygv"); - return info; - } + F77_XFCN (ssygv, SSYGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + F77_CONST_CHAR_ARG2 ("U", 1), + n, atmp_data, n, + btmp_data, n, + pwr, pwork, lwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("ssygv failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in ssygv"); - lambda = FloatComplexColumnVector (wr); - v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); - } - else - (*current_liboctave_error_handler) ("ssygv workspace query failed"); + if (info > 0) + (*current_liboctave_error_handler) ("ssygv failed to converge"); + + lambda = FloatComplexColumnVector (wr); + v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); return info; } @@ -679,26 +592,17 @@ bool calc_ev) { if (a.any_element_is_inf_or_nan () || b.any_element_is_inf_or_nan ()) - { - (*current_liboctave_error_handler) - ("EIG: matrix contains Inf or NaN values"); - return -1; - } + (*current_liboctave_error_handler) + ("EIG: matrix contains Inf or NaN values"); octave_idx_type n = a.rows (); octave_idx_type nb = b.rows (); if (n != a.cols () || nb != b.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); if (n != nb) - { - (*current_liboctave_error_handler) ("EIG requires same size matrices"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires same size matrices"); octave_idx_type info = 0; @@ -748,41 +652,33 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work.real ()); - Array<FloatComplex> work (dim_vector (lwork, 1)); - FloatComplex *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("cggev workspace query failed"); - F77_XFCN (cggev, CGGEV, (F77_CONST_CHAR_ARG2 ("N", 1), - F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - n, atmp_data, n, btmp_data, n, - palpha, pbeta, dummy, idummy, - pv, n, pwork, lwork, prwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work.real ()); + Array<FloatComplex> work (dim_vector (lwork, 1)); + FloatComplex *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in cggev"); - return info; - } + F77_XFCN (cggev, CGGEV, (F77_CONST_CHAR_ARG2 ("N", 1), + F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + n, atmp_data, n, btmp_data, n, + palpha, pbeta, dummy, idummy, + pv, n, pwork, lwork, prwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("cggev failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in cggev"); - lambda.resize (n); + if (info > 0) + (*current_liboctave_error_handler) ("cggev failed to converge"); - for (octave_idx_type j = 0; j < n; j++) - lambda.elem (j) = alpha.elem (j) / beta.elem (j); + lambda.resize (n); - v = vtmp; - } - else - (*current_liboctave_error_handler) ("cggev workspace query failed"); + for (octave_idx_type j = 0; j < n; j++) + lambda.elem (j) = alpha.elem (j) / beta.elem (j); + + v = vtmp; return info; } @@ -795,16 +691,10 @@ octave_idx_type nb = b.rows (); if (n != a.cols () || nb != b.cols ()) - { - (*current_liboctave_error_handler) ("EIG requires square matrix"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires square matrix"); if (n != nb) - { - (*current_liboctave_error_handler) ("EIG requires same size matrices"); - return -1; - } + (*current_liboctave_error_handler) ("EIG requires same size matrices"); octave_idx_type info = 0; @@ -833,37 +723,29 @@ F77_CHAR_ARG_LEN (1) F77_CHAR_ARG_LEN (1))); - if (info == 0) - { - lwork = static_cast<octave_idx_type> (dummy_work.real ()); - Array<FloatComplex> work (dim_vector (lwork, 1)); - FloatComplex *pwork = work.fortran_vec (); + if (info != 0) + (*current_liboctave_error_handler) ("zhegv workspace query failed"); - F77_XFCN (chegv, CHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), - F77_CONST_CHAR_ARG2 ("U", 1), - n, atmp_data, n, - btmp_data, n, - pwr, pwork, lwork, prwork, info - F77_CHAR_ARG_LEN (1) - F77_CHAR_ARG_LEN (1))); + lwork = static_cast<octave_idx_type> (dummy_work.real ()); + Array<FloatComplex> work (dim_vector (lwork, 1)); + FloatComplex *pwork = work.fortran_vec (); - if (info < 0) - { - (*current_liboctave_error_handler) ("unrecoverable error in zhegv"); - return info; - } + F77_XFCN (chegv, CHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1), + F77_CONST_CHAR_ARG2 ("U", 1), + n, atmp_data, n, + btmp_data, n, + pwr, pwork, lwork, prwork, info + F77_CHAR_ARG_LEN (1) + F77_CHAR_ARG_LEN (1))); - if (info > 0) - { - (*current_liboctave_error_handler) ("zhegv failed to converge"); - return info; - } + if (info < 0) + (*current_liboctave_error_handler) ("unrecoverable error in zhegv"); - lambda = FloatComplexColumnVector (wr); - v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); - } - else - (*current_liboctave_error_handler) ("zhegv workspace query failed"); + if (info > 0) + (*current_liboctave_error_handler) ("zhegv failed to converge"); + + lambda = FloatComplexColumnVector (wr); + v = calc_ev ? FloatComplexMatrix (atmp) : FloatComplexMatrix (); return info; }