Mercurial > octave
diff liboctave/numeric/sparse-lu.cc @ 31607:aac27ad79be6 stable
maint: Re-indent code after switch to using namespace macros.
* build-env.h, build-env.in.cc, Cell.h, __betainc__.cc, __eigs__.cc,
__ftp__.cc, __ichol__.cc, __ilu__.cc, __isprimelarge__.cc, __magick_read__.cc,
__pchip_deriv__.cc, amd.cc, base-text-renderer.cc, base-text-renderer.h,
besselj.cc, bitfcns.cc, bsxfun.cc, c-file-ptr-stream.h, call-stack.cc,
call-stack.h, ccolamd.cc, cellfun.cc, chol.cc, colamd.cc, dasrt.cc, data.cc,
debug.cc, defaults.cc, defaults.h, det.cc, display.cc, display.h, dlmread.cc,
dynamic-ld.cc, dynamic-ld.h, ellipj.cc, environment.cc, environment.h,
error.cc, error.h, errwarn.h, event-manager.cc, event-manager.h,
event-queue.cc, event-queue.h, fcn-info.cc, fcn-info.h, fft.cc, fft2.cc,
file-io.cc, filter.cc, find.cc, ft-text-renderer.cc, ft-text-renderer.h,
gcd.cc, gl-render.cc, gl-render.h, gl2ps-print.cc, gl2ps-print.h,
graphics-toolkit.cc, graphics-toolkit.h, graphics.cc, gsvd.cc, gtk-manager.cc,
gtk-manager.h, help.cc, help.h, hook-fcn.cc, hook-fcn.h, input.cc, input.h,
interpreter-private.cc, interpreter-private.h, interpreter.cc, interpreter.h,
inv.cc, jsondecode.cc, jsonencode.cc, latex-text-renderer.cc,
latex-text-renderer.h, load-path.cc, load-path.h, load-save.cc, load-save.h,
lookup.cc, ls-hdf5.cc, ls-mat4.cc, ls-mat5.cc, lsode.cc, lu.cc, mappers.cc,
matrix_type.cc, max.cc, mex.cc, mexproto.h, mxarray.h, mxtypes.in.h,
oct-errno.in.cc, oct-hdf5-types.cc, oct-hist.cc, oct-hist.h, oct-map.cc,
oct-map.h, oct-opengl.h, oct-prcstrm.h, oct-process.cc, oct-process.h,
oct-stdstrm.h, oct-stream.cc, oct-stream.h, oct-strstrm.h,
octave-default-image.h, ordqz.cc, ordschur.cc, pager.cc, pager.h, pinv.cc,
pow2.cc, pr-output.cc, psi.cc, qr.cc, quadcc.cc, rand.cc, regexp.cc,
settings.cc, settings.h, sighandlers.cc, sighandlers.h, sparse-xpow.cc,
sqrtm.cc, stack-frame.cc, stack-frame.h, stream-euler.cc, strfns.cc, svd.cc,
syminfo.cc, syminfo.h, symrcm.cc, symrec.cc, symrec.h, symscope.cc, symscope.h,
symtab.cc, symtab.h, sysdep.cc, sysdep.h, text-engine.cc, text-engine.h,
text-renderer.cc, text-renderer.h, time.cc, toplev.cc, typecast.cc,
url-handle-manager.cc, url-handle-manager.h, urlwrite.cc, utils.cc, utils.h,
variables.cc, variables.h, xdiv.cc, __delaunayn__.cc, __init_fltk__.cc,
__init_gnuplot__.cc, __ode15__.cc, __voronoi__.cc, audioread.cc, convhulln.cc,
gzip.cc, cdef-class.cc, cdef-class.h, cdef-fwd.h, cdef-manager.cc,
cdef-manager.h, cdef-method.cc, cdef-method.h, cdef-object.cc, cdef-object.h,
cdef-package.cc, cdef-package.h, cdef-property.cc, cdef-property.h,
cdef-utils.cc, cdef-utils.h, ov-base-diag.cc, ov-base-int.cc, ov-base-mat.cc,
ov-base-mat.h, ov-base-scalar.cc, ov-base.cc, ov-base.h, ov-bool-mat.cc,
ov-bool-mat.h, ov-bool-sparse.cc, ov-bool.cc, ov-builtin.h, ov-cell.cc,
ov-ch-mat.cc, ov-class.cc, ov-class.h, ov-classdef.cc, ov-classdef.h,
ov-complex.cc, ov-cx-diag.cc, ov-cx-mat.cc, ov-cx-sparse.cc, ov-dld-fcn.cc,
ov-dld-fcn.h, ov-fcn-handle.cc, ov-fcn-handle.h, ov-fcn.h, ov-float.cc,
ov-flt-complex.cc, ov-flt-cx-diag.cc, ov-flt-cx-mat.cc, ov-flt-re-diag.cc,
ov-flt-re-mat.cc, ov-flt-re-mat.h, ov-intx.h, ov-java.cc, ov-lazy-idx.cc,
ov-legacy-range.cc, ov-magic-int.cc, ov-mex-fcn.cc, ov-mex-fcn.h,
ov-null-mat.cc, ov-perm.cc, ov-range.cc, ov-re-diag.cc, ov-re-mat.cc,
ov-re-mat.h, ov-re-sparse.cc, ov-scalar.cc, ov-str-mat.cc, ov-struct.cc,
ov-typeinfo.cc, ov-typeinfo.h, ov-usr-fcn.cc, ov-usr-fcn.h, ov.cc, ov.h, ovl.h,
octave.cc, octave.h, op-b-sbm.cc, op-bm-sbm.cc, op-cs-scm.cc, op-fm-fcm.cc,
op-fs-fcm.cc, op-s-scm.cc, op-scm-cs.cc, op-scm-s.cc, op-sm-cs.cc, ops.h,
anon-fcn-validator.cc, anon-fcn-validator.h, bp-table.cc, bp-table.h,
comment-list.cc, comment-list.h, filepos.h, lex.h, oct-lvalue.cc, oct-lvalue.h,
parse.h, profiler.cc, profiler.h, pt-anon-scopes.cc, pt-anon-scopes.h,
pt-arg-list.cc, pt-arg-list.h, pt-args-block.cc, pt-args-block.h,
pt-array-list.cc, pt-array-list.h, pt-assign.cc, pt-assign.h, pt-binop.cc,
pt-binop.h, pt-bp.cc, pt-bp.h, pt-cbinop.cc, pt-cbinop.h, pt-cell.cc,
pt-cell.h, pt-check.cc, pt-check.h, pt-classdef.cc, pt-classdef.h, pt-cmd.h,
pt-colon.cc, pt-colon.h, pt-const.cc, pt-const.h, pt-decl.cc, pt-decl.h,
pt-eval.cc, pt-eval.h, pt-except.cc, pt-except.h, pt-exp.cc, pt-exp.h,
pt-fcn-handle.cc, pt-fcn-handle.h, pt-id.cc, pt-id.h, pt-idx.cc, pt-idx.h,
pt-jump.h, pt-loop.cc, pt-loop.h, pt-mat.cc, pt-mat.h, pt-misc.cc, pt-misc.h,
pt-pr-code.cc, pt-pr-code.h, pt-select.cc, pt-select.h, pt-spmd.cc, pt-spmd.h,
pt-stmt.cc, pt-stmt.h, pt-tm-const.cc, pt-tm-const.h, pt-unop.cc, pt-unop.h,
pt-walk.cc, pt-walk.h, pt.cc, pt.h, token.cc, token.h, Range.cc, Range.h,
idx-vector.cc, idx-vector.h, range-fwd.h, CollocWt.cc, CollocWt.h,
aepbalance.cc, aepbalance.h, chol.cc, chol.h, gepbalance.cc, gepbalance.h,
gsvd.cc, gsvd.h, hess.cc, hess.h, lo-mappers.cc, lo-mappers.h, lo-specfun.cc,
lo-specfun.h, lu.cc, lu.h, oct-convn.cc, oct-convn.h, oct-fftw.cc, oct-fftw.h,
oct-norm.cc, oct-norm.h, oct-rand.cc, oct-rand.h, oct-spparms.cc,
oct-spparms.h, qr.cc, qr.h, qrp.cc, qrp.h, randgamma.cc, randgamma.h,
randmtzig.cc, randmtzig.h, randpoisson.cc, randpoisson.h, schur.cc, schur.h,
sparse-chol.cc, sparse-chol.h, sparse-lu.cc, sparse-lu.h, sparse-qr.cc,
sparse-qr.h, svd.cc, svd.h, child-list.cc, child-list.h, dir-ops.cc, dir-ops.h,
file-ops.cc, file-ops.h, file-stat.cc, file-stat.h, lo-sysdep.cc, lo-sysdep.h,
lo-sysinfo.cc, lo-sysinfo.h, mach-info.cc, mach-info.h, oct-env.cc, oct-env.h,
oct-group.cc, oct-group.h, oct-password.cc, oct-password.h, oct-syscalls.cc,
oct-syscalls.h, oct-time.cc, oct-time.h, oct-uname.cc, oct-uname.h,
action-container.cc, action-container.h, base-list.h, cmd-edit.cc, cmd-edit.h,
cmd-hist.cc, cmd-hist.h, f77-fcn.h, file-info.cc, file-info.h,
lo-array-errwarn.cc, lo-array-errwarn.h, lo-hash.cc, lo-hash.h, lo-ieee.h,
lo-regexp.cc, lo-regexp.h, lo-utils.cc, lo-utils.h, oct-base64.cc,
oct-base64.h, oct-glob.cc, oct-glob.h, oct-inttypes.h, oct-mutex.cc,
oct-mutex.h, oct-refcount.h, oct-shlib.cc, oct-shlib.h, oct-sparse.cc,
oct-sparse.h, oct-string.h, octave-preserve-stream-state.h, pathsearch.cc,
pathsearch.h, quit.cc, quit.h, unwind-prot.cc, unwind-prot.h, url-transfer.cc,
url-transfer.h:
Re-indent code after switch to using namespace macros.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 01 Dec 2022 18:02:15 -0800 |
parents | e88a07dec498 |
children | 597f3ee61a48 |
line wrap: on
line diff
--- a/liboctave/numeric/sparse-lu.cc Thu Dec 01 14:23:45 2022 -0800 +++ b/liboctave/numeric/sparse-lu.cc Thu Dec 01 18:02:15 2022 -0800 @@ -41,455 +41,472 @@ OCTAVE_BEGIN_NAMESPACE(math) - // Wrappers for SuiteSparse (formerly UMFPACK) functions that have - // different names depending on the sparse matrix data type. - // - // All of these functions must be specialized to forward to the correct - // SuiteSparse functions. +// Wrappers for SuiteSparse (formerly UMFPACK) functions that have +// different names depending on the sparse matrix data type. +// +// All of these functions must be specialized to forward to the correct +// SuiteSparse functions. - template <typename T> - void - umfpack_defaults (double *Control); +template <typename T> +void +umfpack_defaults (double *Control); - template <typename T> - void - umfpack_free_numeric (void **Numeric); +template <typename T> +void +umfpack_free_numeric (void **Numeric); - template <typename T> - void - umfpack_free_symbolic (void **Symbolic); +template <typename T> +void +umfpack_free_symbolic (void **Symbolic); - template <typename T> - octave_idx_type - umfpack_get_lunz (octave_idx_type *lnz, octave_idx_type *unz, - void *Numeric); +template <typename T> +octave_idx_type +umfpack_get_lunz (octave_idx_type *lnz, octave_idx_type *unz, + void *Numeric); - template <typename T> - octave_idx_type - umfpack_get_numeric (octave_idx_type *Lp, octave_idx_type *Lj, - T *Lx, // Or Lz_packed - octave_idx_type *Up, octave_idx_type *Ui, - T *Ux, // Or Uz_packed - octave_idx_type *p, octave_idx_type *q, - double *Dz_packed, octave_idx_type *do_recip, - double *Rs, void *Numeric); +template <typename T> +octave_idx_type +umfpack_get_numeric (octave_idx_type *Lp, octave_idx_type *Lj, + T *Lx, // Or Lz_packed + octave_idx_type *Up, octave_idx_type *Ui, + T *Ux, // Or Uz_packed + octave_idx_type *p, octave_idx_type *q, + double *Dz_packed, octave_idx_type *do_recip, + double *Rs, void *Numeric); - template <typename T> - octave_idx_type - umfpack_numeric (const octave_idx_type *Ap, const octave_idx_type *Ai, - const T *Ax, // Or Az_packed - void *Symbolic, void **Numeric, - const double *Control, double *Info); +template <typename T> +octave_idx_type +umfpack_numeric (const octave_idx_type *Ap, const octave_idx_type *Ai, + const T *Ax, // Or Az_packed + void *Symbolic, void **Numeric, + const double *Control, double *Info); - template <typename T> - octave_idx_type - umfpack_qsymbolic (octave_idx_type n_row, octave_idx_type n_col, - const octave_idx_type *Ap, const octave_idx_type *Ai, - const T *Ax, // Or Az_packed - const octave_idx_type *Qinit, void **Symbolic, - const double *Control, double *Info); +template <typename T> +octave_idx_type +umfpack_qsymbolic (octave_idx_type n_row, octave_idx_type n_col, + const octave_idx_type *Ap, const octave_idx_type *Ai, + const T *Ax, // Or Az_packed + const octave_idx_type *Qinit, void **Symbolic, + const double *Control, double *Info); - template <typename T> - void - umfpack_report_control (const double *Control); +template <typename T> +void +umfpack_report_control (const double *Control); - template <typename T> - void - umfpack_report_info (const double *Control, const double *Info); +template <typename T> +void +umfpack_report_info (const double *Control, const double *Info); - template <typename T> - void - umfpack_report_matrix (octave_idx_type n_row, octave_idx_type n_col, - const octave_idx_type *Ap, - const octave_idx_type *Ai, - const T *Ax, // Or Az_packed - octave_idx_type col_form, const double *Control); +template <typename T> +void +umfpack_report_matrix (octave_idx_type n_row, octave_idx_type n_col, + const octave_idx_type *Ap, + const octave_idx_type *Ai, + const T *Ax, // Or Az_packed + octave_idx_type col_form, const double *Control); - template <typename T> - void - umfpack_report_numeric (void *Numeric, const double *Control); +template <typename T> +void +umfpack_report_numeric (void *Numeric, const double *Control); - template <typename T> - void - umfpack_report_perm (octave_idx_type np, const octave_idx_type *Perm, - const double *Control); +template <typename T> +void +umfpack_report_perm (octave_idx_type np, const octave_idx_type *Perm, + const double *Control); - template <typename T> - void - umfpack_report_status (double *Control, octave_idx_type status); +template <typename T> +void +umfpack_report_status (double *Control, octave_idx_type status); - template <typename T> - void - umfpack_report_symbolic (void *Symbolic, const double *Control); +template <typename T> +void +umfpack_report_symbolic (void *Symbolic, const double *Control); #if defined (HAVE_UMFPACK) - // SparseMatrix Specialization. +// SparseMatrix Specialization. - template <> - inline OCTAVE_API void - umfpack_defaults<double> (double *Control) - { - UMFPACK_DNAME (defaults) (Control); - } +template <> +inline OCTAVE_API void +umfpack_defaults<double> (double *Control) +{ + UMFPACK_DNAME (defaults) (Control); +} - template <> - inline OCTAVE_API void - umfpack_free_numeric<double> (void **Numeric) - { - UMFPACK_DNAME (free_numeric) (Numeric); - } +template <> +inline OCTAVE_API void +umfpack_free_numeric<double> (void **Numeric) +{ + UMFPACK_DNAME (free_numeric) (Numeric); +} - template <> - inline OCTAVE_API void - umfpack_free_symbolic<double> (void **Symbolic) - { - UMFPACK_DNAME (free_symbolic) (Symbolic); - } +template <> +inline OCTAVE_API void +umfpack_free_symbolic<double> (void **Symbolic) +{ + UMFPACK_DNAME (free_symbolic) (Symbolic); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_get_lunz<double> - (octave_idx_type *lnz, octave_idx_type *unz, void *Numeric) - { - suitesparse_integer ignore1, ignore2, ignore3; +template <> +inline OCTAVE_API octave_idx_type +umfpack_get_lunz<double> +(octave_idx_type *lnz, octave_idx_type *unz, void *Numeric) +{ + suitesparse_integer ignore1, ignore2, ignore3; - return UMFPACK_DNAME (get_lunz) (to_suitesparse_intptr (lnz), - to_suitesparse_intptr (unz), - &ignore1, &ignore2, &ignore3, Numeric); - } + return UMFPACK_DNAME (get_lunz) (to_suitesparse_intptr (lnz), + to_suitesparse_intptr (unz), + &ignore1, &ignore2, &ignore3, Numeric); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_get_numeric<double> - (octave_idx_type *Lp, octave_idx_type *Lj, double *Lx, - octave_idx_type *Up, octave_idx_type *Ui, double *Ux, - octave_idx_type *p, octave_idx_type *q, double *Dx, - octave_idx_type *do_recip, double *Rs, void *Numeric) - { - return UMFPACK_DNAME (get_numeric) (to_suitesparse_intptr (Lp), - to_suitesparse_intptr (Lj), - Lx, to_suitesparse_intptr (Up), - to_suitesparse_intptr (Ui), Ux, - to_suitesparse_intptr (p), - to_suitesparse_intptr (q), Dx, - to_suitesparse_intptr (do_recip), - Rs, Numeric); - } +template <> +inline OCTAVE_API octave_idx_type +umfpack_get_numeric<double> +(octave_idx_type *Lp, octave_idx_type *Lj, double *Lx, + octave_idx_type *Up, octave_idx_type *Ui, double *Ux, + octave_idx_type *p, octave_idx_type *q, double *Dx, + octave_idx_type *do_recip, double *Rs, void *Numeric) +{ + return UMFPACK_DNAME (get_numeric) (to_suitesparse_intptr (Lp), + to_suitesparse_intptr (Lj), + Lx, to_suitesparse_intptr (Up), + to_suitesparse_intptr (Ui), Ux, + to_suitesparse_intptr (p), + to_suitesparse_intptr (q), Dx, + to_suitesparse_intptr (do_recip), + Rs, Numeric); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_numeric<double> - (const octave_idx_type *Ap, const octave_idx_type *Ai, - const double *Ax, void *Symbolic, void **Numeric, - const double *Control, double *Info) - { - return UMFPACK_DNAME (numeric) (to_suitesparse_intptr (Ap), - to_suitesparse_intptr (Ai), - Ax, Symbolic, Numeric, Control, Info); - } +template <> +inline OCTAVE_API octave_idx_type +umfpack_numeric<double> +(const octave_idx_type *Ap, const octave_idx_type *Ai, + const double *Ax, void *Symbolic, void **Numeric, + const double *Control, double *Info) +{ + return UMFPACK_DNAME (numeric) (to_suitesparse_intptr (Ap), + to_suitesparse_intptr (Ai), + Ax, Symbolic, Numeric, Control, Info); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_qsymbolic<double> - (octave_idx_type n_row, octave_idx_type n_col, const octave_idx_type *Ap, - const octave_idx_type *Ai, const double *Ax, - const octave_idx_type *Qinit, void **Symbolic, - const double *Control, double *Info) - { - return UMFPACK_DNAME (qsymbolic) (n_row, n_col, - to_suitesparse_intptr (Ap), - to_suitesparse_intptr (Ai), Ax, - to_suitesparse_intptr (Qinit), - Symbolic, Control, Info); - } +template <> +inline OCTAVE_API octave_idx_type +umfpack_qsymbolic<double> +(octave_idx_type n_row, octave_idx_type n_col, const octave_idx_type *Ap, + const octave_idx_type *Ai, const double *Ax, + const octave_idx_type *Qinit, void **Symbolic, + const double *Control, double *Info) +{ + return UMFPACK_DNAME (qsymbolic) (n_row, n_col, + to_suitesparse_intptr (Ap), + to_suitesparse_intptr (Ai), Ax, + to_suitesparse_intptr (Qinit), + Symbolic, Control, Info); +} - template <> - inline OCTAVE_API void - umfpack_report_control<double> (const double *Control) - { - UMFPACK_DNAME (report_control) (Control); - } +template <> +inline OCTAVE_API void +umfpack_report_control<double> (const double *Control) +{ + UMFPACK_DNAME (report_control) (Control); +} - template <> - inline OCTAVE_API void - umfpack_report_info<double> (const double *Control, const double *Info) - { - UMFPACK_DNAME (report_info) (Control, Info); - } +template <> +inline OCTAVE_API void +umfpack_report_info<double> (const double *Control, const double *Info) +{ + UMFPACK_DNAME (report_info) (Control, Info); +} - template <> - inline OCTAVE_API void - umfpack_report_matrix<double> - (octave_idx_type n_row, octave_idx_type n_col, const octave_idx_type *Ap, - const octave_idx_type *Ai, const double *Ax, octave_idx_type col_form, - const double *Control) - { - UMFPACK_DNAME (report_matrix) (n_row, n_col, - to_suitesparse_intptr (Ap), - to_suitesparse_intptr (Ai), Ax, - col_form, Control); - } +template <> +inline OCTAVE_API void +umfpack_report_matrix<double> +(octave_idx_type n_row, octave_idx_type n_col, const octave_idx_type *Ap, + const octave_idx_type *Ai, const double *Ax, octave_idx_type col_form, + const double *Control) +{ + UMFPACK_DNAME (report_matrix) (n_row, n_col, + to_suitesparse_intptr (Ap), + to_suitesparse_intptr (Ai), Ax, + col_form, Control); +} - template <> - inline OCTAVE_API void - umfpack_report_numeric<double> (void *Numeric, const double *Control) - { - UMFPACK_DNAME (report_numeric) (Numeric, Control); - } +template <> +inline OCTAVE_API void +umfpack_report_numeric<double> (void *Numeric, const double *Control) +{ + UMFPACK_DNAME (report_numeric) (Numeric, Control); +} - template <> - inline OCTAVE_API void - umfpack_report_perm<double> - (octave_idx_type np, const octave_idx_type *Perm, const double *Control) - { - UMFPACK_DNAME (report_perm) (np, to_suitesparse_intptr (Perm), Control); - } +template <> +inline OCTAVE_API void +umfpack_report_perm<double> +(octave_idx_type np, const octave_idx_type *Perm, const double *Control) +{ + UMFPACK_DNAME (report_perm) (np, to_suitesparse_intptr (Perm), Control); +} - template <> - inline OCTAVE_API void - umfpack_report_status<double> (double *Control, octave_idx_type status) - { - UMFPACK_DNAME (report_status) (Control, status); - } +template <> +inline OCTAVE_API void +umfpack_report_status<double> (double *Control, octave_idx_type status) +{ + UMFPACK_DNAME (report_status) (Control, status); +} - template <> - inline OCTAVE_API void - umfpack_report_symbolic<double> (void *Symbolic, const double *Control) - { - UMFPACK_DNAME (report_symbolic) (Symbolic, Control); - } +template <> +inline OCTAVE_API void +umfpack_report_symbolic<double> (void *Symbolic, const double *Control) +{ + UMFPACK_DNAME (report_symbolic) (Symbolic, Control); +} - // SparseComplexMatrix specialization. +// SparseComplexMatrix specialization. - template <> - inline OCTAVE_API void - umfpack_defaults<Complex> (double *Control) - { - UMFPACK_ZNAME (defaults) (Control); - } +template <> +inline OCTAVE_API void +umfpack_defaults<Complex> (double *Control) +{ + UMFPACK_ZNAME (defaults) (Control); +} - template <> - inline OCTAVE_API void - umfpack_free_numeric<Complex> (void **Numeric) - { - UMFPACK_ZNAME (free_numeric) (Numeric); - } +template <> +inline OCTAVE_API void +umfpack_free_numeric<Complex> (void **Numeric) +{ + UMFPACK_ZNAME (free_numeric) (Numeric); +} - template <> - inline OCTAVE_API void - umfpack_free_symbolic<Complex> (void **Symbolic) - { - UMFPACK_ZNAME (free_symbolic) (Symbolic); - } +template <> +inline OCTAVE_API void +umfpack_free_symbolic<Complex> (void **Symbolic) +{ + UMFPACK_ZNAME (free_symbolic) (Symbolic); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_get_lunz<Complex> - (octave_idx_type *lnz, octave_idx_type *unz, void *Numeric) - { - suitesparse_integer ignore1, ignore2, ignore3; +template <> +inline OCTAVE_API octave_idx_type +umfpack_get_lunz<Complex> +(octave_idx_type *lnz, octave_idx_type *unz, void *Numeric) +{ + suitesparse_integer ignore1, ignore2, ignore3; - return UMFPACK_ZNAME (get_lunz) (to_suitesparse_intptr (lnz), - to_suitesparse_intptr (unz), - &ignore1, &ignore2, &ignore3, Numeric); - } + return UMFPACK_ZNAME (get_lunz) (to_suitesparse_intptr (lnz), + to_suitesparse_intptr (unz), + &ignore1, &ignore2, &ignore3, Numeric); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_get_numeric<Complex> - (octave_idx_type *Lp, octave_idx_type *Lj, Complex *Lz, - octave_idx_type *Up, octave_idx_type *Ui, Complex *Uz, - octave_idx_type *p, octave_idx_type *q, double *Dz, - octave_idx_type *do_recip, double *Rs, void *Numeric) - { - return UMFPACK_ZNAME (get_numeric) (to_suitesparse_intptr (Lp), - to_suitesparse_intptr (Lj), - reinterpret_cast<double *> (Lz), - nullptr, to_suitesparse_intptr (Up), - to_suitesparse_intptr (Ui), - reinterpret_cast<double *> (Uz), - nullptr, to_suitesparse_intptr (p), - to_suitesparse_intptr (q), - reinterpret_cast<double *> (Dz), - nullptr, to_suitesparse_intptr (do_recip), - Rs, Numeric); - } +template <> +inline OCTAVE_API octave_idx_type +umfpack_get_numeric<Complex> +(octave_idx_type *Lp, octave_idx_type *Lj, Complex *Lz, + octave_idx_type *Up, octave_idx_type *Ui, Complex *Uz, + octave_idx_type *p, octave_idx_type *q, double *Dz, + octave_idx_type *do_recip, double *Rs, void *Numeric) +{ + return UMFPACK_ZNAME (get_numeric) (to_suitesparse_intptr (Lp), + to_suitesparse_intptr (Lj), + reinterpret_cast<double *> (Lz), + nullptr, to_suitesparse_intptr (Up), + to_suitesparse_intptr (Ui), + reinterpret_cast<double *> (Uz), + nullptr, to_suitesparse_intptr (p), + to_suitesparse_intptr (q), + reinterpret_cast<double *> (Dz), + nullptr, to_suitesparse_intptr (do_recip), + Rs, Numeric); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_numeric<Complex> - (const octave_idx_type *Ap, const octave_idx_type *Ai, - const Complex *Az, void *Symbolic, void **Numeric, - const double *Control, double *Info) - { - return UMFPACK_ZNAME (numeric) (to_suitesparse_intptr (Ap), - to_suitesparse_intptr (Ai), - reinterpret_cast<const double *> (Az), - nullptr, Symbolic, Numeric, Control, Info); - } +template <> +inline OCTAVE_API octave_idx_type +umfpack_numeric<Complex> +(const octave_idx_type *Ap, const octave_idx_type *Ai, + const Complex *Az, void *Symbolic, void **Numeric, + const double *Control, double *Info) +{ + return UMFPACK_ZNAME (numeric) (to_suitesparse_intptr (Ap), + to_suitesparse_intptr (Ai), + reinterpret_cast<const double *> (Az), + nullptr, Symbolic, Numeric, Control, Info); +} - template <> - inline OCTAVE_API octave_idx_type - umfpack_qsymbolic<Complex> - (octave_idx_type n_row, octave_idx_type n_col, - const octave_idx_type *Ap, const octave_idx_type *Ai, - const Complex *Az, const octave_idx_type *Qinit, - void **Symbolic, const double *Control, double *Info) - { - return UMFPACK_ZNAME (qsymbolic) (n_row, n_col, - to_suitesparse_intptr (Ap), - to_suitesparse_intptr (Ai), - reinterpret_cast<const double *> (Az), - nullptr, to_suitesparse_intptr (Qinit), - Symbolic, Control, Info); - } +template <> +inline OCTAVE_API octave_idx_type +umfpack_qsymbolic<Complex> +(octave_idx_type n_row, octave_idx_type n_col, + const octave_idx_type *Ap, const octave_idx_type *Ai, + const Complex *Az, const octave_idx_type *Qinit, + void **Symbolic, const double *Control, double *Info) +{ + return UMFPACK_ZNAME (qsymbolic) (n_row, n_col, + to_suitesparse_intptr (Ap), + to_suitesparse_intptr (Ai), + reinterpret_cast<const double *> (Az), + nullptr, to_suitesparse_intptr (Qinit), + Symbolic, Control, Info); +} - template <> - inline OCTAVE_API void - umfpack_report_control<Complex> (const double *Control) - { - UMFPACK_ZNAME (report_control) (Control); - } +template <> +inline OCTAVE_API void +umfpack_report_control<Complex> (const double *Control) +{ + UMFPACK_ZNAME (report_control) (Control); +} - template <> - inline OCTAVE_API void - umfpack_report_info<Complex> (const double *Control, const double *Info) - { - UMFPACK_ZNAME (report_info) (Control, Info); - } +template <> +inline OCTAVE_API void +umfpack_report_info<Complex> (const double *Control, const double *Info) +{ + UMFPACK_ZNAME (report_info) (Control, Info); +} - template <> - inline OCTAVE_API void - umfpack_report_matrix<Complex> - (octave_idx_type n_row, octave_idx_type n_col, - const octave_idx_type *Ap, const octave_idx_type *Ai, - const Complex *Az, octave_idx_type col_form, const double *Control) - { - UMFPACK_ZNAME (report_matrix) (n_row, n_col, - to_suitesparse_intptr (Ap), - to_suitesparse_intptr (Ai), - reinterpret_cast<const double *> (Az), - nullptr, col_form, Control); - } +template <> +inline OCTAVE_API void +umfpack_report_matrix<Complex> +(octave_idx_type n_row, octave_idx_type n_col, + const octave_idx_type *Ap, const octave_idx_type *Ai, + const Complex *Az, octave_idx_type col_form, const double *Control) +{ + UMFPACK_ZNAME (report_matrix) (n_row, n_col, + to_suitesparse_intptr (Ap), + to_suitesparse_intptr (Ai), + reinterpret_cast<const double *> (Az), + nullptr, col_form, Control); +} - template <> - inline OCTAVE_API void - umfpack_report_numeric<Complex> (void *Numeric, const double *Control) - { - UMFPACK_ZNAME (report_numeric) (Numeric, Control); - } +template <> +inline OCTAVE_API void +umfpack_report_numeric<Complex> (void *Numeric, const double *Control) +{ + UMFPACK_ZNAME (report_numeric) (Numeric, Control); +} - template <> - inline OCTAVE_API void - umfpack_report_perm<Complex> - (octave_idx_type np, const octave_idx_type *Perm, const double *Control) - { - UMFPACK_ZNAME (report_perm) (np, to_suitesparse_intptr (Perm), Control); - } +template <> +inline OCTAVE_API void +umfpack_report_perm<Complex> +(octave_idx_type np, const octave_idx_type *Perm, const double *Control) +{ + UMFPACK_ZNAME (report_perm) (np, to_suitesparse_intptr (Perm), Control); +} - template <> - inline OCTAVE_API void - umfpack_report_status<Complex> (double *Control, octave_idx_type status) - { - UMFPACK_ZNAME (report_status) (Control, status); - } +template <> +inline OCTAVE_API void +umfpack_report_status<Complex> (double *Control, octave_idx_type status) +{ + UMFPACK_ZNAME (report_status) (Control, status); +} - template <> - inline OCTAVE_API void - umfpack_report_symbolic <Complex> (void *Symbolic, const double *Control) - { - UMFPACK_ZNAME (report_symbolic) (Symbolic, Control); - } +template <> +inline OCTAVE_API void +umfpack_report_symbolic <Complex> (void *Symbolic, const double *Control) +{ + UMFPACK_ZNAME (report_symbolic) (Symbolic, Control); +} #endif - template <typename lu_type> - sparse_lu<lu_type>::sparse_lu (const lu_type& a, const Matrix& piv_thres, - bool scale) - : m_L (), m_U (), m_R (), m_cond (0), m_P (), m_Q () - { +template <typename lu_type> +sparse_lu<lu_type>::sparse_lu (const lu_type& a, const Matrix& piv_thres, + bool scale) + : m_L (), m_U (), m_R (), m_cond (0), m_P (), m_Q () +{ #if defined (HAVE_UMFPACK) - octave_idx_type nr = a.rows (); - octave_idx_type nc = a.cols (); + octave_idx_type nr = a.rows (); + octave_idx_type nc = a.cols (); + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_defaults<lu_elt_type> (control); + + double tmp = sparse_params::get_key ("spumoni"); + if (! math::isnan (tmp)) + Control (UMFPACK_PRL) = tmp; - // Setup the control parameters - Matrix Control (UMFPACK_CONTROL, 1); - double *control = Control.fortran_vec (); - umfpack_defaults<lu_elt_type> (control); + if (piv_thres.numel () == 2) + { + tmp = (piv_thres (0) > 1. ? 1. : piv_thres (0)); + if (! math::isnan (tmp)) + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; - double tmp = sparse_params::get_key ("spumoni"); + tmp = (piv_thres (1) > 1. ? 1. : piv_thres (1)); if (! math::isnan (tmp)) - Control (UMFPACK_PRL) = tmp; + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + } + else + { + tmp = sparse_params::get_key ("piv_tol"); + if (! math::isnan (tmp)) + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; - if (piv_thres.numel () == 2) - { - tmp = (piv_thres (0) > 1. ? 1. : piv_thres (0)); - if (! math::isnan (tmp)) - Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + tmp = sparse_params::get_key ("sym_tol"); + if (! math::isnan (tmp)) + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + } - tmp = (piv_thres (1) > 1. ? 1. : piv_thres (1)); - if (! math::isnan (tmp)) - Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; - } - else - { - tmp = sparse_params::get_key ("piv_tol"); - if (! math::isnan (tmp)) - Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + // Set whether we are allowed to modify Q or not + tmp = sparse_params::get_key ("autoamd"); + if (! math::isnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; - tmp = sparse_params::get_key ("sym_tol"); - if (! math::isnan (tmp)) - Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; - } + // Turn-off UMFPACK scaling for LU + if (scale) + Control (UMFPACK_SCALE) = UMFPACK_SCALE_SUM; + else + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_report_control<lu_elt_type> (control); - // Set whether we are allowed to modify Q or not - tmp = sparse_params::get_key ("autoamd"); - if (! math::isnan (tmp)) - Control (UMFPACK_FIXQ) = tmp; + const octave_idx_type *Ap = a.cidx (); + const octave_idx_type *Ai = a.ridx (); + const lu_elt_type *Ax = a.data (); + + umfpack_report_matrix<lu_elt_type> (nr, nc, Ap, Ai, Ax, + static_cast<octave_idx_type> (1), + control); - // Turn-off UMFPACK scaling for LU - if (scale) - Control (UMFPACK_SCALE) = UMFPACK_SCALE_SUM; - else - Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_qsymbolic<lu_elt_type> (nr, nc, Ap, Ai, Ax, nullptr, + &Symbolic, control, info); - umfpack_report_control<lu_elt_type> (control); + if (status < 0) + { + umfpack_report_status<lu_elt_type> (control, status); + umfpack_report_info<lu_elt_type> (control, info); + + umfpack_free_symbolic<lu_elt_type> (&Symbolic); - const octave_idx_type *Ap = a.cidx (); - const octave_idx_type *Ai = a.ridx (); - const lu_elt_type *Ax = a.data (); + (*current_liboctave_error_handler) + ("sparse_lu: symbolic factorization failed"); + } + else + { + umfpack_report_symbolic<lu_elt_type> (Symbolic, control); - umfpack_report_matrix<lu_elt_type> (nr, nc, Ap, Ai, Ax, - static_cast<octave_idx_type> (1), - control); + void *Numeric; + status = umfpack_numeric<lu_elt_type> (Ap, Ai, Ax, Symbolic, + &Numeric, control, info); + umfpack_free_symbolic<lu_elt_type> (&Symbolic); - void *Symbolic; - Matrix Info (1, UMFPACK_INFO); - double *info = Info.fortran_vec (); - int status = umfpack_qsymbolic<lu_elt_type> (nr, nc, Ap, Ai, Ax, nullptr, - &Symbolic, control, info); + m_cond = Info (UMFPACK_RCOND); if (status < 0) { umfpack_report_status<lu_elt_type> (control, status); umfpack_report_info<lu_elt_type> (control, info); - umfpack_free_symbolic<lu_elt_type> (&Symbolic); + umfpack_free_numeric<lu_elt_type> (&Numeric); (*current_liboctave_error_handler) - ("sparse_lu: symbolic factorization failed"); + ("sparse_lu: numeric factorization failed"); } else { - umfpack_report_symbolic<lu_elt_type> (Symbolic, control); + umfpack_report_numeric<lu_elt_type> (Numeric, control); - void *Numeric; - status = umfpack_numeric<lu_elt_type> (Ap, Ai, Ax, Symbolic, - &Numeric, control, info); - umfpack_free_symbolic<lu_elt_type> (&Symbolic); - - m_cond = Info (UMFPACK_RCOND); + octave_idx_type lnz, unz; + status = umfpack_get_lunz<lu_elt_type> (&lnz, &unz, Numeric); if (status < 0) { @@ -499,235 +516,235 @@ umfpack_free_numeric<lu_elt_type> (&Numeric); (*current_liboctave_error_handler) - ("sparse_lu: numeric factorization failed"); + ("sparse_lu: extracting LU factors failed"); } else { - umfpack_report_numeric<lu_elt_type> (Numeric, control); + octave_idx_type n_inner = (nr < nc ? nr : nc); + + if (lnz < 1) + m_L = lu_type (n_inner, nr, + static_cast<octave_idx_type> (1)); + else + m_L = lu_type (n_inner, nr, lnz); + + octave_idx_type *Ltp = m_L.cidx (); + octave_idx_type *Ltj = m_L.ridx (); + lu_elt_type *Ltx = m_L.data (); + + if (unz < 1) + m_U = lu_type (n_inner, nc, + static_cast<octave_idx_type> (1)); + else + m_U = lu_type (n_inner, nc, unz); + + octave_idx_type *Up = m_U.cidx (); + octave_idx_type *Uj = m_U.ridx (); + lu_elt_type *Ux = m_U.data (); - octave_idx_type lnz, unz; - status = umfpack_get_lunz<lu_elt_type> (&lnz, &unz, Numeric); + m_R = SparseMatrix (nr, nr, nr); + for (octave_idx_type i = 0; i < nr; i++) + { + m_R.xridx (i) = i; + m_R.xcidx (i) = i; + } + m_R.xcidx (nr) = nr; + double *Rx = m_R.data (); + + m_P.resize (dim_vector (nr, 1)); + octave_idx_type *p = m_P.fortran_vec (); + + m_Q.resize (dim_vector (nc, 1)); + octave_idx_type *q = m_Q.fortran_vec (); + + octave_idx_type do_recip; + status = umfpack_get_numeric<lu_elt_type> (Ltp, Ltj, Ltx, + Up, Uj, Ux, + p, q, nullptr, + &do_recip, Rx, + Numeric); + + umfpack_free_numeric<lu_elt_type> (&Numeric); if (status < 0) { umfpack_report_status<lu_elt_type> (control, status); - umfpack_report_info<lu_elt_type> (control, info); - - umfpack_free_numeric<lu_elt_type> (&Numeric); (*current_liboctave_error_handler) ("sparse_lu: extracting LU factors failed"); } else { - octave_idx_type n_inner = (nr < nc ? nr : nc); - - if (lnz < 1) - m_L = lu_type (n_inner, nr, - static_cast<octave_idx_type> (1)); - else - m_L = lu_type (n_inner, nr, lnz); - - octave_idx_type *Ltp = m_L.cidx (); - octave_idx_type *Ltj = m_L.ridx (); - lu_elt_type *Ltx = m_L.data (); - - if (unz < 1) - m_U = lu_type (n_inner, nc, - static_cast<octave_idx_type> (1)); - else - m_U = lu_type (n_inner, nc, unz); + m_L = m_L.transpose (); - octave_idx_type *Up = m_U.cidx (); - octave_idx_type *Uj = m_U.ridx (); - lu_elt_type *Ux = m_U.data (); - - m_R = SparseMatrix (nr, nr, nr); - for (octave_idx_type i = 0; i < nr; i++) - { - m_R.xridx (i) = i; - m_R.xcidx (i) = i; - } - m_R.xcidx (nr) = nr; - double *Rx = m_R.data (); - - m_P.resize (dim_vector (nr, 1)); - octave_idx_type *p = m_P.fortran_vec (); - - m_Q.resize (dim_vector (nc, 1)); - octave_idx_type *q = m_Q.fortran_vec (); + if (do_recip) + for (octave_idx_type i = 0; i < nr; i++) + Rx[i] = 1.0 / Rx[i]; - octave_idx_type do_recip; - status = umfpack_get_numeric<lu_elt_type> (Ltp, Ltj, Ltx, - Up, Uj, Ux, - p, q, nullptr, - &do_recip, Rx, - Numeric); - - umfpack_free_numeric<lu_elt_type> (&Numeric); - - if (status < 0) - { - umfpack_report_status<lu_elt_type> (control, status); - - (*current_liboctave_error_handler) - ("sparse_lu: extracting LU factors failed"); - } - else - { - m_L = m_L.transpose (); + umfpack_report_matrix<lu_elt_type> (nr, n_inner, + m_L.cidx (), + m_L.ridx (), + m_L.data (), + static_cast<octave_idx_type> (1), + control); + umfpack_report_matrix<lu_elt_type> (n_inner, nc, + m_U.cidx (), + m_U.ridx (), + m_U.data (), + static_cast<octave_idx_type> (1), + control); + umfpack_report_perm<lu_elt_type> (nr, p, control); + umfpack_report_perm<lu_elt_type> (nc, q, control); + } - if (do_recip) - for (octave_idx_type i = 0; i < nr; i++) - Rx[i] = 1.0 / Rx[i]; - - umfpack_report_matrix<lu_elt_type> (nr, n_inner, - m_L.cidx (), - m_L.ridx (), - m_L.data (), - static_cast<octave_idx_type> (1), - control); - umfpack_report_matrix<lu_elt_type> (n_inner, nc, - m_U.cidx (), - m_U.ridx (), - m_U.data (), - static_cast<octave_idx_type> (1), - control); - umfpack_report_perm<lu_elt_type> (nr, p, control); - umfpack_report_perm<lu_elt_type> (nc, q, control); - } - - umfpack_report_info<lu_elt_type> (control, info); - } + umfpack_report_info<lu_elt_type> (control, info); } } + } #else - octave_unused_parameter (a); - octave_unused_parameter (piv_thres); - octave_unused_parameter (scale); + octave_unused_parameter (a); + octave_unused_parameter (piv_thres); + octave_unused_parameter (scale); - (*current_liboctave_error_handler) - ("support for UMFPACK was unavailable or disabled when liboctave was built"); + (*current_liboctave_error_handler) + ("support for UMFPACK was unavailable or disabled when liboctave was built"); #endif - } +} - template <typename lu_type> - sparse_lu<lu_type>::sparse_lu (const lu_type& a, - const ColumnVector& Qinit, - const Matrix& piv_thres, bool scale, - bool FixedQ, double droptol, - bool milu, bool udiag) - : m_L (), m_U (), m_R (), m_cond (0), m_P (), m_Q () - { +template <typename lu_type> +sparse_lu<lu_type>::sparse_lu (const lu_type& a, + const ColumnVector& Qinit, + const Matrix& piv_thres, bool scale, + bool FixedQ, double droptol, + bool milu, bool udiag) + : m_L (), m_U (), m_R (), m_cond (0), m_P (), m_Q () +{ #if defined (HAVE_UMFPACK) - if (milu) - (*current_liboctave_error_handler) - ("Modified incomplete LU not implemented"); + if (milu) + (*current_liboctave_error_handler) + ("Modified incomplete LU not implemented"); - octave_idx_type nr = a.rows (); - octave_idx_type nc = a.cols (); + octave_idx_type nr = a.rows (); + octave_idx_type nc = a.cols (); - // Setup the control parameters - Matrix Control (UMFPACK_CONTROL, 1); - double *control = Control.fortran_vec (); - umfpack_defaults<lu_elt_type> (control); + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_defaults<lu_elt_type> (control); - double tmp = sparse_params::get_key ("spumoni"); - if (! math::isnan (tmp)) - Control (UMFPACK_PRL) = tmp; + double tmp = sparse_params::get_key ("spumoni"); + if (! math::isnan (tmp)) + Control (UMFPACK_PRL) = tmp; - if (piv_thres.numel () == 2) - { - tmp = (piv_thres (0) > 1. ? 1. : piv_thres (0)); - if (! math::isnan (tmp)) - Control (UMFPACK_PIVOT_TOLERANCE) = tmp; - tmp = (piv_thres (1) > 1. ? 1. : piv_thres (1)); - if (! math::isnan (tmp)) - Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; - } - else - { - tmp = sparse_params::get_key ("piv_tol"); - if (! math::isnan (tmp)) - Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + if (piv_thres.numel () == 2) + { + tmp = (piv_thres (0) > 1. ? 1. : piv_thres (0)); + if (! math::isnan (tmp)) + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + tmp = (piv_thres (1) > 1. ? 1. : piv_thres (1)); + if (! math::isnan (tmp)) + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + } + else + { + tmp = sparse_params::get_key ("piv_tol"); + if (! math::isnan (tmp)) + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; - tmp = sparse_params::get_key ("sym_tol"); - if (! math::isnan (tmp)) - Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; - } + tmp = sparse_params::get_key ("sym_tol"); + if (! math::isnan (tmp)) + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + } + + if (droptol >= 0.) + Control (UMFPACK_DROPTOL) = droptol; - if (droptol >= 0.) - Control (UMFPACK_DROPTOL) = droptol; + // Set whether we are allowed to modify Q or not + if (FixedQ) + Control (UMFPACK_FIXQ) = 1.0; + else + { + tmp = sparse_params::get_key ("autoamd"); + if (! math::isnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + } - // Set whether we are allowed to modify Q or not - if (FixedQ) - Control (UMFPACK_FIXQ) = 1.0; - else - { - tmp = sparse_params::get_key ("autoamd"); - if (! math::isnan (tmp)) - Control (UMFPACK_FIXQ) = tmp; - } + // Turn-off UMFPACK scaling for LU + if (scale) + Control (UMFPACK_SCALE) = UMFPACK_SCALE_SUM; + else + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_report_control<lu_elt_type> (control); + + const octave_idx_type *Ap = a.cidx (); + const octave_idx_type *Ai = a.ridx (); + const lu_elt_type *Ax = a.data (); - // Turn-off UMFPACK scaling for LU - if (scale) - Control (UMFPACK_SCALE) = UMFPACK_SCALE_SUM; - else - Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + umfpack_report_matrix<lu_elt_type> (nr, nc, Ap, Ai, Ax, + static_cast<octave_idx_type> (1), + control); - umfpack_report_control<lu_elt_type> (control); + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status; - const octave_idx_type *Ap = a.cidx (); - const octave_idx_type *Ai = a.ridx (); - const lu_elt_type *Ax = a.data (); + // Null loop so that qinit is immediately deallocated when not needed + do + { + OCTAVE_LOCAL_BUFFER (octave_idx_type, qinit, nc); - umfpack_report_matrix<lu_elt_type> (nr, nc, Ap, Ai, Ax, - static_cast<octave_idx_type> (1), - control); + for (octave_idx_type i = 0; i < nc; i++) + qinit[i] = static_cast<octave_idx_type> (Qinit (i)); - void *Symbolic; - Matrix Info (1, UMFPACK_INFO); - double *info = Info.fortran_vec (); - int status; + status = umfpack_qsymbolic<lu_elt_type> (nr, nc, Ap, Ai, Ax, + qinit, &Symbolic, control, + info); + } + while (0); + + if (status < 0) + { + umfpack_report_status<lu_elt_type> (control, status); + umfpack_report_info<lu_elt_type> (control, info); - // Null loop so that qinit is immediately deallocated when not needed - do - { - OCTAVE_LOCAL_BUFFER (octave_idx_type, qinit, nc); + umfpack_free_symbolic<lu_elt_type> (&Symbolic); - for (octave_idx_type i = 0; i < nc; i++) - qinit[i] = static_cast<octave_idx_type> (Qinit (i)); + (*current_liboctave_error_handler) + ("sparse_lu: symbolic factorization failed"); + } + else + { + umfpack_report_symbolic<lu_elt_type> (Symbolic, control); - status = umfpack_qsymbolic<lu_elt_type> (nr, nc, Ap, Ai, Ax, - qinit, &Symbolic, control, - info); - } - while (0); + void *Numeric; + status = umfpack_numeric<lu_elt_type> (Ap, Ai, Ax, Symbolic, + &Numeric, control, info); + umfpack_free_symbolic<lu_elt_type> (&Symbolic); + + m_cond = Info (UMFPACK_RCOND); if (status < 0) { umfpack_report_status<lu_elt_type> (control, status); umfpack_report_info<lu_elt_type> (control, info); - umfpack_free_symbolic<lu_elt_type> (&Symbolic); + umfpack_free_numeric<lu_elt_type> (&Numeric); (*current_liboctave_error_handler) - ("sparse_lu: symbolic factorization failed"); + ("sparse_lu: numeric factorization failed"); } else { - umfpack_report_symbolic<lu_elt_type> (Symbolic, control); + umfpack_report_numeric<lu_elt_type> (Numeric, control); - void *Numeric; - status = umfpack_numeric<lu_elt_type> (Ap, Ai, Ax, Symbolic, - &Numeric, control, info); - umfpack_free_symbolic<lu_elt_type> (&Symbolic); - - m_cond = Info (UMFPACK_RCOND); + octave_idx_type lnz, unz; + status = umfpack_get_lunz<lu_elt_type> (&lnz, &unz, Numeric); if (status < 0) { @@ -737,253 +754,236 @@ umfpack_free_numeric<lu_elt_type> (&Numeric); (*current_liboctave_error_handler) - ("sparse_lu: numeric factorization failed"); + ("sparse_lu: extracting LU factors failed"); } else { - umfpack_report_numeric<lu_elt_type> (Numeric, control); + octave_idx_type n_inner = (nr < nc ? nr : nc); + + if (lnz < 1) + m_L = lu_type (n_inner, nr, + static_cast<octave_idx_type> (1)); + else + m_L = lu_type (n_inner, nr, lnz); + + octave_idx_type *Ltp = m_L.cidx (); + octave_idx_type *Ltj = m_L.ridx (); + lu_elt_type *Ltx = m_L.data (); + + if (unz < 1) + m_U = lu_type (n_inner, nc, + static_cast<octave_idx_type> (1)); + else + m_U = lu_type (n_inner, nc, unz); + + octave_idx_type *Up = m_U.cidx (); + octave_idx_type *Uj = m_U.ridx (); + lu_elt_type *Ux = m_U.data (); - octave_idx_type lnz, unz; - status = umfpack_get_lunz<lu_elt_type> (&lnz, &unz, Numeric); + m_R = SparseMatrix (nr, nr, nr); + for (octave_idx_type i = 0; i < nr; i++) + { + m_R.xridx (i) = i; + m_R.xcidx (i) = i; + } + m_R.xcidx (nr) = nr; + double *Rx = m_R.data (); + + m_P.resize (dim_vector (nr, 1)); + octave_idx_type *p = m_P.fortran_vec (); + + m_Q.resize (dim_vector (nc, 1)); + octave_idx_type *q = m_Q.fortran_vec (); + + octave_idx_type do_recip; + status = umfpack_get_numeric<lu_elt_type> (Ltp, Ltj, Ltx, + Up, Uj, Ux, + p, q, nullptr, + &do_recip, + Rx, Numeric); + + umfpack_free_numeric<lu_elt_type> (&Numeric); if (status < 0) { umfpack_report_status<lu_elt_type> (control, status); - umfpack_report_info<lu_elt_type> (control, info); - - umfpack_free_numeric<lu_elt_type> (&Numeric); (*current_liboctave_error_handler) ("sparse_lu: extracting LU factors failed"); } else { - octave_idx_type n_inner = (nr < nc ? nr : nc); - - if (lnz < 1) - m_L = lu_type (n_inner, nr, - static_cast<octave_idx_type> (1)); - else - m_L = lu_type (n_inner, nr, lnz); - - octave_idx_type *Ltp = m_L.cidx (); - octave_idx_type *Ltj = m_L.ridx (); - lu_elt_type *Ltx = m_L.data (); - - if (unz < 1) - m_U = lu_type (n_inner, nc, - static_cast<octave_idx_type> (1)); - else - m_U = lu_type (n_inner, nc, unz); + m_L = m_L.transpose (); - octave_idx_type *Up = m_U.cidx (); - octave_idx_type *Uj = m_U.ridx (); - lu_elt_type *Ux = m_U.data (); - - m_R = SparseMatrix (nr, nr, nr); - for (octave_idx_type i = 0; i < nr; i++) - { - m_R.xridx (i) = i; - m_R.xcidx (i) = i; - } - m_R.xcidx (nr) = nr; - double *Rx = m_R.data (); - - m_P.resize (dim_vector (nr, 1)); - octave_idx_type *p = m_P.fortran_vec (); - - m_Q.resize (dim_vector (nc, 1)); - octave_idx_type *q = m_Q.fortran_vec (); + if (do_recip) + for (octave_idx_type i = 0; i < nr; i++) + Rx[i] = 1.0 / Rx[i]; - octave_idx_type do_recip; - status = umfpack_get_numeric<lu_elt_type> (Ltp, Ltj, Ltx, - Up, Uj, Ux, - p, q, nullptr, - &do_recip, - Rx, Numeric); - - umfpack_free_numeric<lu_elt_type> (&Numeric); - - if (status < 0) - { - umfpack_report_status<lu_elt_type> (control, status); - - (*current_liboctave_error_handler) - ("sparse_lu: extracting LU factors failed"); - } - else - { - m_L = m_L.transpose (); + umfpack_report_matrix<lu_elt_type> (nr, n_inner, + m_L.cidx (), + m_L.ridx (), + m_L.data (), + static_cast<octave_idx_type> (1), + control); + umfpack_report_matrix<lu_elt_type> (n_inner, nc, + m_U.cidx (), + m_U.ridx (), + m_U.data (), + static_cast<octave_idx_type> (1), + control); + umfpack_report_perm<lu_elt_type> (nr, p, control); + umfpack_report_perm<lu_elt_type> (nc, q, control); + } - if (do_recip) - for (octave_idx_type i = 0; i < nr; i++) - Rx[i] = 1.0 / Rx[i]; - - umfpack_report_matrix<lu_elt_type> (nr, n_inner, - m_L.cidx (), - m_L.ridx (), - m_L.data (), - static_cast<octave_idx_type> (1), - control); - umfpack_report_matrix<lu_elt_type> (n_inner, nc, - m_U.cidx (), - m_U.ridx (), - m_U.data (), - static_cast<octave_idx_type> (1), - control); - umfpack_report_perm<lu_elt_type> (nr, p, control); - umfpack_report_perm<lu_elt_type> (nc, q, control); - } - - umfpack_report_info<lu_elt_type> (control, info); - } + umfpack_report_info<lu_elt_type> (control, info); } } + } - if (udiag) - (*current_liboctave_error_handler) - ("Option udiag of incomplete LU not implemented"); + if (udiag) + (*current_liboctave_error_handler) + ("Option udiag of incomplete LU not implemented"); #else - octave_unused_parameter (a); - octave_unused_parameter (Qinit); - octave_unused_parameter (piv_thres); - octave_unused_parameter (scale); - octave_unused_parameter (FixedQ); - octave_unused_parameter (droptol); - octave_unused_parameter (milu); - octave_unused_parameter (udiag); + octave_unused_parameter (a); + octave_unused_parameter (Qinit); + octave_unused_parameter (piv_thres); + octave_unused_parameter (scale); + octave_unused_parameter (FixedQ); + octave_unused_parameter (droptol); + octave_unused_parameter (milu); + octave_unused_parameter (udiag); - (*current_liboctave_error_handler) - ("support for UMFPACK was unavailable or disabled when liboctave was built"); + (*current_liboctave_error_handler) + ("support for UMFPACK was unavailable or disabled when liboctave was built"); #endif - } +} - template <typename lu_type> - lu_type - sparse_lu<lu_type>::Y (void) const +template <typename lu_type> +lu_type +sparse_lu<lu_type>::Y (void) const +{ + octave_idx_type nr = m_L.rows (); + octave_idx_type nz = m_L.cols (); + octave_idx_type nc = m_U.cols (); + + lu_type Yout (nr, nc, m_L.nnz () + m_U.nnz () - (nr<nz?nr:nz)); + octave_idx_type ii = 0; + Yout.xcidx (0) = 0; + + for (octave_idx_type j = 0; j < nc; j++) { - octave_idx_type nr = m_L.rows (); - octave_idx_type nz = m_L.cols (); - octave_idx_type nc = m_U.cols (); - - lu_type Yout (nr, nc, m_L.nnz () + m_U.nnz () - (nr<nz?nr:nz)); - octave_idx_type ii = 0; - Yout.xcidx (0) = 0; - - for (octave_idx_type j = 0; j < nc; j++) + for (octave_idx_type i = m_U.cidx (j); i < m_U.cidx (j + 1); i++) { - for (octave_idx_type i = m_U.cidx (j); i < m_U.cidx (j + 1); i++) - { - Yout.xridx (ii) = m_U.ridx (i); - Yout.xdata (ii++) = m_U.data (i); - } - - if (j < nz) - { - // Note the +1 skips the 1.0 on the diagonal - for (octave_idx_type i = m_L.cidx (j) + 1; - i < m_L.cidx (j +1); i++) - { - Yout.xridx (ii) = m_L.ridx (i); - Yout.xdata (ii++) = m_L.data (i); - } - } - - Yout.xcidx (j + 1) = ii; + Yout.xridx (ii) = m_U.ridx (i); + Yout.xdata (ii++) = m_U.data (i); } - return Yout; - } - - template <typename lu_type> - SparseMatrix - sparse_lu<lu_type>::Pr (void) const - { - octave_idx_type nr = m_L.rows (); - - SparseMatrix Pout (nr, nr, nr); - - for (octave_idx_type i = 0; i < nr; i++) + if (j < nz) { - Pout.cidx (i) = i; - Pout.ridx (m_P(i)) = i; - Pout.data (i) = 1; + // Note the +1 skips the 1.0 on the diagonal + for (octave_idx_type i = m_L.cidx (j) + 1; + i < m_L.cidx (j +1); i++) + { + Yout.xridx (ii) = m_L.ridx (i); + Yout.xdata (ii++) = m_L.data (i); + } } - Pout.cidx (nr) = nr; - - return Pout; + Yout.xcidx (j + 1) = ii; } - template <typename lu_type> - ColumnVector - sparse_lu<lu_type>::Pr_vec (void) const - { - octave_idx_type nr = m_L.rows (); - - ColumnVector Pout (nr); + return Yout; +} - for (octave_idx_type i = 0; i < nr; i++) - Pout.xelem (i) = static_cast<double> (m_P(i) + 1); - - return Pout; - } +template <typename lu_type> +SparseMatrix +sparse_lu<lu_type>::Pr (void) const +{ + octave_idx_type nr = m_L.rows (); - template <typename lu_type> - PermMatrix - sparse_lu<lu_type>::Pr_mat (void) const + SparseMatrix Pout (nr, nr, nr); + + for (octave_idx_type i = 0; i < nr; i++) { - return PermMatrix (m_P, false); + Pout.cidx (i) = i; + Pout.ridx (m_P(i)) = i; + Pout.data (i) = 1; } - template <typename lu_type> - SparseMatrix - sparse_lu<lu_type>::Pc (void) const - { - octave_idx_type nc = m_U.cols (); + Pout.cidx (nr) = nr; + + return Pout; +} - SparseMatrix Pout (nc, nc, nc); +template <typename lu_type> +ColumnVector +sparse_lu<lu_type>::Pr_vec (void) const +{ + octave_idx_type nr = m_L.rows (); + + ColumnVector Pout (nr); + + for (octave_idx_type i = 0; i < nr; i++) + Pout.xelem (i) = static_cast<double> (m_P(i) + 1); + + return Pout; +} - for (octave_idx_type i = 0; i < nc; i++) - { - Pout.cidx (i) = i; - Pout.ridx (i) = m_Q(i); - Pout.data (i) = 1; - } +template <typename lu_type> +PermMatrix +sparse_lu<lu_type>::Pr_mat (void) const +{ + return PermMatrix (m_P, false); +} - Pout.cidx (nc) = nc; +template <typename lu_type> +SparseMatrix +sparse_lu<lu_type>::Pc (void) const +{ + octave_idx_type nc = m_U.cols (); - return Pout; + SparseMatrix Pout (nc, nc, nc); + + for (octave_idx_type i = 0; i < nc; i++) + { + Pout.cidx (i) = i; + Pout.ridx (i) = m_Q(i); + Pout.data (i) = 1; } - template <typename lu_type> - ColumnVector - sparse_lu<lu_type>::Pc_vec (void) const - { - octave_idx_type nc = m_U.cols (); + Pout.cidx (nc) = nc; + + return Pout; +} - ColumnVector Pout (nc); +template <typename lu_type> +ColumnVector +sparse_lu<lu_type>::Pc_vec (void) const +{ + octave_idx_type nc = m_U.cols (); - for (octave_idx_type i = 0; i < nc; i++) - Pout.xelem (i) = static_cast<double> (m_Q(i) + 1); + ColumnVector Pout (nc); - return Pout; - } + for (octave_idx_type i = 0; i < nc; i++) + Pout.xelem (i) = static_cast<double> (m_Q(i) + 1); + + return Pout; +} - template <typename lu_type> - PermMatrix - sparse_lu<lu_type>::Pc_mat (void) const - { - return PermMatrix (m_Q, true); - } +template <typename lu_type> +PermMatrix +sparse_lu<lu_type>::Pc_mat (void) const +{ + return PermMatrix (m_Q, true); +} - // Instantiations we need. - template class OCTAVE_API sparse_lu<SparseMatrix>; +// Instantiations we need. +template class OCTAVE_API sparse_lu<SparseMatrix>; - template class OCTAVE_API sparse_lu<SparseComplexMatrix>; +template class OCTAVE_API sparse_lu<SparseComplexMatrix>; OCTAVE_END_NAMESPACE(math) OCTAVE_END_NAMESPACE(octave)