Mercurial > hg > octave-lojdl
changeset 15264:94cdf82d4a0c
don't overload meaning of info in Sparse Cholesky factorization functions
* chol.cc (Fchol): New variable, force. Always pass natural
and force to SparseCHOL and SparseComplexCHOL constructors.
* SparsedbleCHOL.h, SparsedbleCHOL.cc (SparseCHOL::SparseCHOL):
New arg, force. Pass it to sparse_base_chol constructor.
* SparseCmplxCHOL.h, SparseCmplxCHOL.cc
(SparseComplexCHOL::SparseComplexCHOL): Likewise.
* sparse-base-chol.h (sparse_base_chol<>::sparse_base_chol_rep::init):
* sparse-base-chol.h, sparse-base-chol.cc
(sparse_base_chol<>::sparse_base_chol_rep::init): Replace nargout
argument with force. Check force, not nargout > 1.
* sparse-base-chol.h
(sparse_base_chol::sparse_base_chol_rep::sparse_base_chol_rep):
New arg, force. Pass it to init.
(sparse_base_chol::sparse_base_chol): New arg force. Pass it to rep
constructor.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 30 Aug 2012 16:57:24 -0400 |
parents | 2136343014d5 |
children | f463154f1c1b |
files | libinterp/dldfcn/chol.cc liboctave/SparseCmplxCHOL.h liboctave/SparsedbleCHOL.h liboctave/sparse-base-chol.cc liboctave/sparse-base-chol.h |
diffstat | 5 files changed, 38 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/dldfcn/chol.cc +++ b/libinterp/dldfcn/chol.cc @@ -180,7 +180,6 @@ octave_idx_type nr = arg.rows (); octave_idx_type nc = arg.columns (); - bool natural = (nargout != 3); int arg_is_empty = empty_arg ("chol", nr, nc); @@ -191,14 +190,18 @@ if (arg.is_sparse_type ()) { + octave_idx_type info; + bool natural = (nargout != 3); + bool force = nargout > 1; + if (arg.is_real_type ()) { SparseMatrix m = arg.sparse_matrix_value (); if (! error_state) { - octave_idx_type info = nargout; - SparseCHOL fact (m, info, natural); + SparseCHOL fact (m, info, natural, force); + if (nargout == 3) { if (vecout) @@ -225,8 +228,7 @@ if (! error_state) { - octave_idx_type info = nargout; - SparseComplexCHOL fact (m, info, natural); + SparseComplexCHOL fact (m, info, natural, force); if (nargout == 3) { @@ -405,14 +407,16 @@ { if (arg.is_sparse_type ()) { + octave_idx_type info; + if (arg.is_real_type ()) { SparseMatrix m = arg.sparse_matrix_value (); if (! error_state) { - octave_idx_type info; SparseCHOL chol (m, info); + if (info == 0) retval = chol.inverse (); else @@ -425,8 +429,8 @@ if (! error_state) { - octave_idx_type info; SparseComplexCHOL chol (m, info); + if (info == 0) retval = chol.inverse (); else
--- a/liboctave/SparseCmplxCHOL.h +++ b/liboctave/SparseCmplxCHOL.h @@ -38,14 +38,13 @@ SparseComplexCHOL (void) : sparse_base_chol<SparseComplexMatrix, Complex, SparseMatrix> () { } - SparseComplexCHOL (const SparseComplexMatrix& a, bool natural = true) : - sparse_base_chol<SparseComplexMatrix, Complex, SparseMatrix> - (a, natural) { } + SparseComplexCHOL (const SparseComplexMatrix& a, bool natural = true, + bool force = false) : + sparse_base_chol<SparseComplexMatrix, Complex, SparseMatrix> (a, natural, force) { } SparseComplexCHOL (const SparseComplexMatrix& a, octave_idx_type& info, - bool natural = true) : - sparse_base_chol<SparseComplexMatrix, Complex, SparseMatrix> - (a, info, natural) { } + bool natural = true, bool force = false) : + sparse_base_chol<SparseComplexMatrix, Complex, SparseMatrix> (a, info, natural, force) { } SparseComplexCHOL (const SparseComplexCHOL& a) : sparse_base_chol<SparseComplexMatrix, Complex, SparseMatrix> (a) { }
--- a/liboctave/SparsedbleCHOL.h +++ b/liboctave/SparsedbleCHOL.h @@ -35,12 +35,12 @@ SparseCHOL (void) : sparse_base_chol<SparseMatrix, double, SparseMatrix> () { } - SparseCHOL (const SparseMatrix& a, bool natural = true) : - sparse_base_chol<SparseMatrix, double, SparseMatrix> (a, natural) { } + SparseCHOL (const SparseMatrix& a, bool natural = true, bool force = false) : + sparse_base_chol<SparseMatrix, double, SparseMatrix> (a, natural, force) { } SparseCHOL (const SparseMatrix& a, octave_idx_type& info, - bool natural = true) : - sparse_base_chol<SparseMatrix, double, SparseMatrix> (a, info, natural) { } + bool natural = false, bool force = false) : + sparse_base_chol<SparseMatrix, double, SparseMatrix> (a, info, natural, force) { } SparseCHOL (const SparseCHOL& a) : sparse_base_chol<SparseMatrix, double, SparseMatrix> (a) { }
--- a/liboctave/sparse-base-chol.cc +++ b/liboctave/sparse-base-chol.cc @@ -80,9 +80,10 @@ template <class chol_type, class chol_elt, class p_type> octave_idx_type sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep::init - (const chol_type& a, bool natural, octave_idx_type nargout) + (const chol_type& a, bool natural, bool force) { volatile octave_idx_type info = 0; + #ifdef HAVE_CHOLMOD octave_idx_type a_nr = a.rows (); octave_idx_type a_nc = a.cols (); @@ -170,7 +171,7 @@ is_pd = cm->status == CHOLMOD_OK; info = (is_pd ? 0 : cm->status); - if (is_pd || nargout > 1) + if (is_pd || force) { BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; cond = CHOLMOD_NAME(rcond) (Lfactor, cm);
--- a/liboctave/sparse-base-chol.h +++ b/liboctave/sparse-base-chol.h @@ -41,19 +41,19 @@ perms (), cond (0) { } - sparse_base_chol_rep (const chol_type& a, const bool natural) + sparse_base_chol_rep (const chol_type& a, bool natural, bool force) : count (1), Lsparse (0), Common (), is_pd (false), minor_p (0), perms (), cond (0) { - init (a, natural); + init (a, natural, force); } sparse_base_chol_rep (const chol_type& a, octave_idx_type& info, - const bool natural) + bool natural, bool force) : count (1), Lsparse (0), Common (), is_pd (false), minor_p (0), perms (), cond (0) { - info = init (a, natural, info); + info = init (a, natural, force); } ~sparse_base_chol_rep (void) @@ -93,8 +93,7 @@ double cond; - octave_idx_type init (const chol_type& a, bool natural = true, - octave_idx_type nargout = 1); + octave_idx_type init (const chol_type& a, bool natural, bool force); void drop_zeros (const cholmod_sparse* S); @@ -111,18 +110,17 @@ sparse_base_chol_rep (void) : count (1), is_pd (false), minor_p (0), perms (), cond (0) { } - sparse_base_chol_rep (const chol_type& a, - const bool natural) + sparse_base_chol_rep (const chol_type& a, bool natural, bool force) : count (1), is_pd (false), minor_p (0), perms (), cond (0) { - init (a, natural); + init (a, natural, force); } sparse_base_chol_rep (const chol_type& a, octave_idx_type& info, - const bool natural) + bool natural, bool force) : count (1), is_pd (false), minor_p (0), perms (), cond (0) { - info = init (a, natural, info); + info = init (a, natural, force); } ~sparse_base_chol_rep (void) { } @@ -148,8 +146,7 @@ double cond; - octave_idx_type init (const chol_type& a, bool natural = true, - octave_idx_type nargout = 0); + octave_idx_type init (const chol_type& a, bool natural, bool force); // No copying! @@ -169,13 +166,14 @@ sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep ()) { } - sparse_base_chol (const chol_type& a, const bool n) + sparse_base_chol (const chol_type& a, bool natural, bool force) : rep (new typename - sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep (a, n)) + sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep (a, natural, force)) { } - sparse_base_chol (const chol_type& a, octave_idx_type& info, const bool n) - : rep (new typename sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep (a, info, n)) + sparse_base_chol (const chol_type& a, octave_idx_type& info, + bool natural, bool force) + : rep (new typename sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep (a, info, natural, force)) { } sparse_base_chol (const sparse_base_chol<chol_type, chol_elt, p_type>& a)