Mercurial > octave
annotate libinterp/dldfcn/ccolamd.cc @ 21109:bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
In liboctave, use the same error text as err_disabled_feature, but
call error_handler directly because err_disabled_feature is in libinterp.
* errwarn.cc (err_disabled_feature): Don't print leading "%s:" if calling
function is "".
* errwarn.cc (warn_disabled_feature): New function. Same msg as
err_disabled_feature but uses warning rather than error.
* errwarn.h (warn_disabled_feature): prototype for new function.
* file-io.cc, gl-render.cc, gl2ps-renderer.cc, load-save.cc, ls-mat5.cc,
oct-hdf5-types.cc, pt-jit.cc, syscalls.cc, sysdep.cc, toplev.cc,
__delaunayn__.cc, __eigs__.cc, __fltk_uigetfile__.cc, __init_fltk__.cc,
__osmesa_print__.cc, __voronoi__.cc, amd.cc, ccolamd.cc, colamd.cc,
convhulln.cc, dmperm.cc, fftw.cc, symbfact.cc: Replace calls to error about
missing feature with calls to err_disabled_feature. Replace calls to warning
about missing feature with calls to warn_disabled_feature.
* CSparse.cc, dSparse.cc, SparseCmplxLU.cc, SparseCmplxQR.cc, SparseQR.cc,
SparsedbleLU.cc, sparse-base-chol.cc, sparse-dmsolve.cc, oct-shlib.cc:
Use same text of message from err_disabled_feature but call
(*current_liboctave_error_handler) or
(*current_liboctave_warning_with_id_handler).
author | Rik <rik@octave.org> |
---|---|
date | Tue, 19 Jan 2016 12:44:54 -0800 |
parents | 5e00ed38a58b |
children | 3d0d84305600 |
rev | line source |
---|---|
5451 | 1 /* |
2 | |
19697
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19040
diff
changeset
|
3 Copyright (C) 2005-2015 David Bateman |
5451 | 4 |
7016 | 5 This file is part of Octave. |
6 | |
5451 | 7 Octave is free software; you can redistribute it and/or modify it |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
5451 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
5451 | 20 |
21 */ | |
22 | |
23 // This is the octave interface to ccolamd, which bore the copyright given | |
24 // in the help of the functions. | |
25 | |
26 #ifdef HAVE_CONFIG_H | |
27 #include <config.h> | |
28 #endif | |
29 | |
30 #include <cstdlib> | |
31 | |
32 #include <string> | |
33 #include <vector> | |
34 | |
35 #include "ov.h" | |
36 #include "defun-dld.h" | |
37 #include "pager.h" | |
38 #include "ov-re-mat.h" | |
39 | |
40 #include "ov-re-sparse.h" | |
41 #include "ov-cx-sparse.h" | |
42 | |
43 #include "oct-sparse.h" | |
8377
25bc2d31e1bf
improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
7520
diff
changeset
|
44 #include "oct-locbuf.h" |
5451 | 45 |
16313
6aafe87a3144
use int64_t for idx type if --enable-64
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
46 #ifdef USE_64_BIT_IDX_T |
21109
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
47 # define CCOLAMD_NAME(name) ccolamd_l ## name |
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
48 # define CSYMAMD_NAME(name) csymamd_l ## name |
5451 | 49 #else |
21109
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
50 # define CCOLAMD_NAME(name) ccolamd ## name |
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
51 # define CSYMAMD_NAME(name) csymamd ## name |
5451 | 52 #endif |
53 | |
54 DEFUN_DLD (ccolamd, args, nargout, | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
55 "-*- texinfo -*-\n\ |
20853
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
56 @deftypefn {} {@var{p} =} ccolamd (@var{S})\n\ |
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
57 @deftypefnx {} {@var{p} =} ccolamd (@var{S}, @var{knobs})\n\ |
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
58 @deftypefnx {} {@var{p} =} ccolamd (@var{S}, @var{knobs}, @var{cmember})\n\ |
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
59 @deftypefnx {} {[@var{p}, @var{stats}] =} ccolamd (@dots{})\n\ |
5451 | 60 \n\ |
10840 | 61 Constrained column approximate minimum degree permutation.\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
62 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
63 @code{@var{p} = ccolamd (@var{S})} returns the column approximate minimum\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
64 degree permutation vector for the sparse matrix @var{S}. For a non-symmetric\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
65 matrix @var{S}, @code{@var{S}(:, @var{p})} tends to have sparser\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
66 LU@tie{}factors than @var{S}.\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
67 @code{chol (@var{S}(:, @var{p})' * @var{S}(:, @var{p}))} also tends to be\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
68 sparser than @code{chol (@var{S}' * @var{S})}.\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
69 @code{@var{p} = ccolamd (@var{S}, 1)} optimizes the ordering for\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
70 @code{lu (@var{S}(:, @var{p}))}. The ordering is followed by a column\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
71 elimination tree post-ordering.\n\ |
5451 | 72 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
73 @var{knobs} is an optional 1-element to 5-element input vector, with a\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
74 default value of @code{[0 10 10 1 0]} if not present or empty. Entries not\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
75 present are set to their defaults.\n\ |
5451 | 76 \n\ |
77 @table @code\n\ | |
78 @item @var{knobs}(1)\n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
79 if nonzero, the ordering is optimized for @code{lu (S(:, p))}. It will be a\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
80 poor ordering for @code{chol (@var{S}(:, @var{p})' * @var{S}(:, @var{p}))}.\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
81 This is the most important knob for ccolamd.\n\ |
5451 | 82 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
83 @item @var{knobs}(2)\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
84 if @var{S} is m-by-n, rows with more than\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
85 @code{max (16, @var{knobs}(2) * sqrt (n))} entries are ignored.\n\ |
5451 | 86 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
87 @item @var{knobs}(3)\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
88 columns with more than\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
89 @code{max (16, @var{knobs}(3) * sqrt (min (@var{m}, @var{n})))} entries are\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
90 ignored and ordered last in the output permutation\n\ |
7107 | 91 (subject to the cmember constraints).\n\ |
5451 | 92 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
93 @item @var{knobs}(4)\n\ |
5451 | 94 if nonzero, aggressive absorption is performed.\n\ |
95 \n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
96 @item @var{knobs}(5)\n\ |
5451 | 97 if nonzero, statistics and knobs are printed.\n\ |
98 \n\ | |
99 @end table\n\ | |
100 \n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
101 @var{cmember} is an optional vector of length @math{n}. It defines the\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
102 constraints on the column ordering. If @code{@var{cmember}(j) = @var{c}},\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
103 then column @var{j} is in constraint set @var{c} (@var{c} must be in the\n\ |
18679
a142f35f3cb6
doc: Fix unbalanced parentheses in documentation.
Rik <rik@octave.org>
parents:
17787
diff
changeset
|
104 range 1 to n). In the output permutation @var{p}, all columns in set 1\n\ |
a142f35f3cb6
doc: Fix unbalanced parentheses in documentation.
Rik <rik@octave.org>
parents:
17787
diff
changeset
|
105 appear first, followed by all columns in set 2, and so on.\n\ |
a142f35f3cb6
doc: Fix unbalanced parentheses in documentation.
Rik <rik@octave.org>
parents:
17787
diff
changeset
|
106 @code{@var{cmember} = ones (1,n)} if not present or empty.\n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
107 @code{ccolamd (@var{S}, [], 1 : n)} returns @code{1 : n}\n\ |
5451 | 108 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
109 @code{@var{p} = ccolamd (@var{S})} is about the same as\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
110 @code{@var{p} = colamd (@var{S})}. @var{knobs} and its default values\n\ |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10840
diff
changeset
|
111 differ. @code{colamd} always does aggressive absorption, and it finds an\n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
112 ordering suitable for both @code{lu (@var{S}(:, @var{p}))} and @code{chol\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
113 (@var{S}(:, @var{p})' * @var{S}(:, @var{p}))}; it cannot optimize its\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
114 ordering for @code{lu (@var{S}(:, @var{p}))} to the extent that\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
115 @code{ccolamd (@var{S}, 1)} can.\n\ |
5451 | 116 \n\ |
117 @var{stats} is an optional 20-element output vector that provides data\n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
118 about the ordering and the validity of the input matrix @var{S}. Ordering\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
119 statistics are in @code{@var{stats}(1 : 3)}. @code{@var{stats}(1)} and\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
120 @code{@var{stats}(2)} are the number of dense or empty rows and columns\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
121 ignored by @sc{ccolamd} and @code{@var{stats}(3)} is the number of garbage\n\ |
10840 | 122 collections performed on the internal data structure used by @sc{ccolamd}\n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
123 (roughly of size @code{2.2 * nnz (@var{S}) + 4 * @var{m} + 7 * @var{n}}\n\ |
5451 | 124 integers).\n\ |
125 \n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
126 @code{@var{stats}(4 : 7)} provide information if CCOLAMD was able to\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
127 continue. The matrix is OK if @code{@var{stats}(4)} is zero, or 1 if\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
128 invalid. @code{@var{stats}(5)} is the rightmost column index that is\n\ |
5451 | 129 unsorted or contains duplicate entries, or zero if no such column exists.\n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
130 @code{@var{stats}(6)} is the last seen duplicate or out-of-order row\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
131 index in the column index given by @code{@var{stats}(5)}, or zero if no\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
132 such row index exists. @code{@var{stats}(7)} is the number of duplicate\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
133 or out-of-order row indices. @code{@var{stats}(8 : 20)} is always zero in\n\ |
10840 | 134 the current version of @sc{ccolamd} (reserved for future use).\n\ |
5451 | 135 \n\ |
19040
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
136 The authors of the code itself are @nospell{S. Larimore, T. Davis}\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
137 (Univ. of Florida) and @nospell{S. Rajamanickam} in collaboration with\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
138 @nospell{J. Bilbert and E. Ng}. Supported by the National Science Foundation\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
139 @nospell{(DMS-9504974, DMS-9803599, CCR-0203270)}, and a grant from\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
140 @nospell{Sandia} National Lab.\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
141 See @url{http://www.cise.ufl.edu/research/sparse} for\n\ |
16826
a4969508008e
doc: Periodic spellcheck of the documentation.
Rik <rik@octave.org>
parents:
16313
diff
changeset
|
142 ccolamd, csymamd, amd, colamd, symamd, and other related orderings.\n\ |
5642 | 143 @seealso{colamd, csymamd}\n\ |
144 @end deftypefn") | |
5451 | 145 { |
146 #ifdef HAVE_CCOLAMD | |
5771 | 147 |
5451 | 148 int nargin = args.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
149 |
20909
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
150 if (nargin < 1 || nargin > 3) |
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
151 print_usage (); |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
152 |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
153 octave_value_list retval (nargout == 2 ? 2 : 1); |
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
154 int spumoni = 0; |
5451 | 155 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
156 // Get knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
157 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
158 CCOLAMD_NAME (_set_defaults) (knobs); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
159 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
160 // Check for user-passed knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
161 if (nargin > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
162 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
163 NDArray User_knobs = args(1).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
164 int nel_User_knobs = User_knobs.numel (); |
5451 | 165 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
166 if (nel_User_knobs > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
167 knobs[CCOLAMD_LU] = (User_knobs(0) != 0); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
168 if (nel_User_knobs > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
169 knobs[CCOLAMD_DENSE_ROW] = User_knobs(1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
170 if (nel_User_knobs > 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
171 knobs[CCOLAMD_DENSE_COL] = User_knobs(2); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
172 if (nel_User_knobs > 3) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
173 knobs[CCOLAMD_AGGRESSIVE] = (User_knobs(3) != 0); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
174 if (nel_User_knobs > 4) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
175 spumoni = (User_knobs(4) != 0); |
5451 | 176 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
177 // print knob settings if spumoni is set |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
178 if (spumoni) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
179 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
180 octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "." |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
181 << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
182 << ":\nknobs(1): " << User_knobs(0) << ", order for "; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
183 if (knobs[CCOLAMD_LU] != 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
184 octave_stdout << "lu (A)\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
185 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
186 octave_stdout << "chol (A'*A)\n"; |
5451 | 187 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
188 if (knobs[CCOLAMD_DENSE_ROW] >= 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
189 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
190 << ", rows with > max (16," |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
191 << knobs[CCOLAMD_DENSE_ROW] |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
192 << "*sqrt (size(A,2)))" |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
193 << " entries removed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
194 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
195 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
196 << ", no dense rows removed\n"; |
5451 | 197 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
198 if (knobs[CCOLAMD_DENSE_COL] >= 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
199 octave_stdout << "knobs(3): " << User_knobs(2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
200 << ", cols with > max (16," |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
201 << knobs[CCOLAMD_DENSE_COL] << "*sqrt (size(A)))" |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
202 << " entries removed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
203 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
204 octave_stdout << "knobs(3): " << User_knobs(2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
205 << ", no dense columns removed\n"; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
206 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
207 if (knobs[CCOLAMD_AGGRESSIVE] != 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
208 octave_stdout << "knobs(4): " << User_knobs(3) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
209 << ", aggressive absorption: yes"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
210 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
211 octave_stdout << "knobs(4): " << User_knobs(3) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
212 << ", aggressive absorption: no"; |
5451 | 213 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
214 octave_stdout << "knobs(5): " << User_knobs(4) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
215 << ", statistics and knobs printed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
216 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
217 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
218 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
219 octave_idx_type n_row, n_col, nnz; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
220 octave_idx_type *ridx, *cidx; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
221 SparseComplexMatrix scm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
222 SparseMatrix sm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
223 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
224 if (args(0).is_sparse_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
225 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
226 if (args(0).is_complex_type ()) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
227 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
228 scm = args(0). sparse_complex_matrix_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
229 n_row = scm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
230 n_col = scm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
231 nnz = scm.nnz (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
232 ridx = scm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
233 cidx = scm.xcidx (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
234 } |
5451 | 235 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
236 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
237 sm = args(0).sparse_matrix_value (); |
5451 | 238 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
239 n_row = sm.rows (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
240 n_col = sm.cols (); |
10527
b4d2080b6df7
Replace nzmax by nnz as needed
David Bateman <dbateman@free.fr>
parents:
10282
diff
changeset
|
241 nnz = sm.nnz (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
242 ridx = sm.xridx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
243 cidx = sm.xcidx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
244 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
245 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
246 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
247 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
248 if (args(0).is_complex_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
249 sm = SparseMatrix (real (args(0).complex_matrix_value ())); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
250 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
251 sm = SparseMatrix (args(0).matrix_value ()); |
5451 | 252 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
253 n_row = sm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
254 n_col = sm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
255 nnz = sm.nnz (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
256 ridx = sm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
257 cidx = sm.xcidx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
258 } |
5451 | 259 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
260 // Allocate workspace for ccolamd |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
261 OCTAVE_LOCAL_BUFFER (octave_idx_type, p, n_col+1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
262 for (octave_idx_type i = 0; i < n_col+1; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
263 p[i] = cidx[i]; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
264 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
265 octave_idx_type Alen = CCOLAMD_NAME (_recommended) (nnz, n_row, n_col); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
266 OCTAVE_LOCAL_BUFFER (octave_idx_type, A, Alen); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
267 for (octave_idx_type i = 0; i < nnz; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
268 A[i] = ridx[i]; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
269 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
270 OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
271 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
272 if (nargin > 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
273 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
274 NDArray in_cmember = args(2).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
275 octave_idx_type cslen = in_cmember.numel (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
276 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
277 for (octave_idx_type i = 0; i < cslen; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
278 // convert cmember from 1-based to 0-based |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
279 cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1); |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
280 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
281 if (cslen != n_col) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
282 error ("ccolamd: CMEMBER must be of length equal to #cols of A"); |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
283 |
21055
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
284 // Order the columns (destroys A) |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
285 if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, cmember)) |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
286 { |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
287 CCOLAMD_NAME (_report) (stats) ; |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
288 |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
289 error ("ccolamd: internal error!"); |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
290 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
291 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
292 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
293 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
294 // Order the columns (destroys A) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
295 if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, 0)) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
296 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
297 CCOLAMD_NAME (_report) (stats) ; |
5451 | 298 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
299 error ("ccolamd: internal error!"); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
300 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
301 } |
5451 | 302 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
303 // return the permutation vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
304 NDArray out_perm (dim_vector (1, n_col)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
305 for (octave_idx_type i = 0; i < n_col; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
306 out_perm(i) = p[i] + 1; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
307 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
308 retval(0) = out_perm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
309 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
310 // print stats if spumoni > 0 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
311 if (spumoni > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
312 CCOLAMD_NAME (_report) (stats) ; |
5451 | 313 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
314 // Return the stats vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
315 if (nargout == 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
316 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
317 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
318 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
319 out_stats(i) = stats[i] ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
320 retval(1) = out_stats; |
5451 | 321 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
322 // fix stats (5) and (6), for 1-based information on |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
323 // jumbled matrix. note that this correction doesn't |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
324 // occur if symamd returns FALSE |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
325 out_stats (CCOLAMD_INFO1) ++ ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
326 out_stats (CCOLAMD_INFO2) ++ ; |
5451 | 327 } |
328 | |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
329 return retval; |
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
330 |
5451 | 331 #else |
21109
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
332 err_disabled_feature ("ccolamd", "CCOLAMD"); |
5451 | 333 #endif |
334 } | |
335 | |
336 DEFUN_DLD (csymamd, args, nargout, | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
337 "-*- texinfo -*-\n\ |
20853
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
338 @deftypefn {} {@var{p} =} csymamd (@var{S})\n\ |
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
339 @deftypefnx {} {@var{p} =} csymamd (@var{S}, @var{knobs})\n\ |
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
340 @deftypefnx {} {@var{p} =} csymamd (@var{S}, @var{knobs}, @var{cmember})\n\ |
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
341 @deftypefnx {} {[@var{p}, @var{stats}] =} csymamd (@dots{})\n\ |
5451 | 342 \n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
343 For a symmetric positive definite matrix @var{S}, return the permutation\n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
344 vector @var{p} such that @code{@var{S}(@var{p},@var{p})} tends to have a\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
345 sparser Cholesky@tie{}factor than @var{S}.\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
346 \n\ |
20181
aa36fb998a4d
maint: Remove unnecessary whitespace at end of lines.
Rik <rik@octave.org>
parents:
20163
diff
changeset
|
347 Sometimes @code{csymamd} works well for symmetric indefinite matrices too. \n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
348 The matrix @var{S} is assumed to be symmetric; only the strictly lower\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
349 triangular part is referenced. @var{S} must be square. The ordering is\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
350 followed by an elimination tree post-ordering.\n\ |
5451 | 351 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
352 @var{knobs} is an optional 1-element to 3-element input vector, with a\n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
353 default value of @code{[10 1 0]}. Entries not present are set to their\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
354 defaults.\n\ |
5451 | 355 \n\ |
356 @table @code\n\ | |
357 @item @var{knobs}(1)\n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
358 If @var{S} is n-by-n, then rows and columns with more than\n\ |
5451 | 359 @code{max(16,@var{knobs}(1)*sqrt(n))} entries are ignored, and ordered\n\ |
360 last in the output permutation (subject to the cmember constraints).\n\ | |
361 \n\ | |
362 @item @var{knobs}(2)\n\ | |
363 If nonzero, aggressive absorption is performed.\n\ | |
364 \n\ | |
365 @item @var{knobs}(3)\n\ | |
366 If nonzero, statistics and knobs are printed.\n\ | |
367 \n\ | |
368 @end table\n\ | |
369 \n\ | |
370 @var{cmember} is an optional vector of length n. It defines the constraints\n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
371 on the ordering. If @code{@var{cmember}(j) = @var{S}}, then row/column j is\n\ |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
372 in constraint set @var{c} (@var{c} must be in the range 1 to n). In the\n\ |
5451 | 373 output permutation @var{p}, rows/columns in set 1 appear first, followed\n\ |
14854
5ae9f0f77635
maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
374 by all rows/columns in set 2, and so on. @code{@var{cmember} = ones (1,n)}\n\ |
5ae9f0f77635
maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
375 if not present or empty. @code{csymamd (@var{S},[],1:n)} returns @code{1:n}.\n\ |
5451 | 376 \n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
377 @code{@var{p} = csymamd (@var{S})} is about the same as\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
378 @code{@var{p} = symamd (@var{S})}. @var{knobs} and its default values\n\ |
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
379 differ.\n\ |
5451 | 380 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
381 @code{@var{stats}(4:7)} provide information if CCOLAMD was able to\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
382 continue. The matrix is OK if @code{@var{stats}(4)} is zero, or 1 if\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
383 invalid. @code{@var{stats}(5)} is the rightmost column index that is\n\ |
5451 | 384 unsorted or contains duplicate entries, or zero if no such column exists.\n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
385 @code{@var{stats}(6)} is the last seen duplicate or out-of-order row\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
386 index in the column index given by @code{@var{stats}(5)}, or zero if no\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
387 such row index exists. @code{@var{stats}(7)} is the number of duplicate\n\ |
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
388 or out-of-order row indices. @code{@var{stats}(8:20)} is always zero in\n\ |
10840 | 389 the current version of @sc{ccolamd} (reserved for future use).\n\ |
5451 | 390 \n\ |
19040
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
391 The authors of the code itself are @nospell{S. Larimore, T. Davis}\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
392 (Univ. of Florida) and @nospell{S. Rajamanickam} in collaboration with\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
393 @nospell{J. Bilbert and E. Ng}. Supported by the National Science Foundation\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
394 @nospell{(DMS-9504974, DMS-9803599, CCR-0203270)}, and a grant from\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
395 @nospell{Sandia} National Lab.\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
396 See @url{http://www.cise.ufl.edu/research/sparse} for\n\ |
16826
a4969508008e
doc: Periodic spellcheck of the documentation.
Rik <rik@octave.org>
parents:
16313
diff
changeset
|
397 ccolamd, csymamd, amd, colamd, symamd, and other related orderings.\n\ |
5642 | 398 @seealso{symamd, ccolamd}\n\ |
399 @end deftypefn") | |
5451 | 400 { |
401 #if HAVE_CCOLAMD | |
5771 | 402 |
5451 | 403 int nargin = args.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
404 |
20909
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
405 if (nargin < 1 || nargin > 3) |
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
406 print_usage (); |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
407 |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
408 octave_value_list retval (nargout == 2 ? 2 : 1); |
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
409 int spumoni = 0; |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
410 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
411 // Get knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
412 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
413 CCOLAMD_NAME (_set_defaults) (knobs); |
5451 | 414 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
415 // Check for user-passed knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
416 if (nargin > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
417 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
418 NDArray User_knobs = args(1).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
419 int nel_User_knobs = User_knobs.numel (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
420 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
421 if (nel_User_knobs > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
422 knobs[CCOLAMD_DENSE_ROW] = User_knobs(0); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
423 if (nel_User_knobs > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
424 knobs[CCOLAMD_AGGRESSIVE] = User_knobs(1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
425 if (nel_User_knobs > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
426 spumoni = static_cast<int> (User_knobs(2)); |
5451 | 427 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
428 // print knob settings if spumoni is set |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
429 if (spumoni) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
430 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
431 octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
432 << "." << CCOLAMD_SUB_VERSION |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
433 << ", " << CCOLAMD_DATE << "\n"; |
5451 | 434 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
435 if (knobs[CCOLAMD_DENSE_ROW] >= 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
436 octave_stdout << "knobs(1): " << User_knobs(0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
437 << ", rows/cols with > max (16," |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
438 << knobs[CCOLAMD_DENSE_ROW] |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
439 << "*sqrt (size(A,2)))" |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
440 << " entries removed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
441 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
442 octave_stdout << "knobs(1): " << User_knobs(0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
443 << ", no dense rows/cols removed\n"; |
5451 | 444 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
445 if (knobs[CCOLAMD_AGGRESSIVE] != 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
446 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
447 << ", aggressive absorption: yes"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
448 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
449 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
450 << ", aggressive absorption: no"; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
451 |
5451 | 452 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
453 octave_stdout << "knobs(3): " << User_knobs(2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
454 << ", statistics and knobs printed\n"; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
455 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
456 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
457 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
458 octave_idx_type n_row, n_col; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
459 octave_idx_type *ridx, *cidx; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
460 SparseMatrix sm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
461 SparseComplexMatrix scm; |
5451 | 462 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
463 if (args(0).is_sparse_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
464 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
465 if (args(0).is_complex_type ()) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
466 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
467 scm = args(0).sparse_complex_matrix_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
468 n_row = scm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
469 n_col = scm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
470 ridx = scm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
471 cidx = scm.xcidx (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
472 } |
5451 | 473 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
474 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
475 sm = args(0).sparse_matrix_value (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
476 n_row = sm.rows (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
477 n_col = sm.cols (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
478 ridx = sm.xridx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
479 cidx = sm.xcidx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
480 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
481 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
482 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
483 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
484 if (args(0).is_complex_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
485 sm = SparseMatrix (real (args(0).complex_matrix_value ())); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
486 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
487 sm = SparseMatrix (args(0).matrix_value ()); |
5451 | 488 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
489 n_row = sm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
490 n_col = sm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
491 ridx = sm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
492 cidx = sm.xcidx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
493 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
494 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
495 if (n_row != n_col) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
496 error ("csymamd: matrix S must be square"); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
497 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
498 // Allocate workspace for symamd |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
499 OCTAVE_LOCAL_BUFFER (octave_idx_type, perm, n_col+1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
500 OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS); |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
501 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
502 if (nargin > 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
503 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
504 NDArray in_cmember = args(2).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
505 octave_idx_type cslen = in_cmember.numel (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
506 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
507 for (octave_idx_type i = 0; i < cslen; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
508 // convert cmember from 1-based to 0-based |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
509 cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
510 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
511 if (cslen != n_col) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
512 error ("csymamd: CMEMBER must be of length equal to #cols of A"); |
21055
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
513 |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
514 if (! CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats, |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
515 &calloc, &free, cmember, -1)) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
516 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
517 CSYMAMD_NAME (_report) (stats) ; |
5451 | 518 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
519 error ("csymamd: internal error!") ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
520 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
521 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
522 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
523 { |
20955
77f5591878bf
maint: Use '! expr' rather than '!expr' to conform to coding guidelines.
Rik <rik@octave.org>
parents:
20909
diff
changeset
|
524 if (! CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats, |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
525 &calloc, &free, 0, -1)) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
526 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
527 CSYMAMD_NAME (_report) (stats) ; |
5451 | 528 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
529 error ("csymamd: internal error!") ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
530 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
531 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
532 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
533 // return the permutation vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
534 NDArray out_perm (dim_vector (1, n_col)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
535 for (octave_idx_type i = 0; i < n_col; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
536 out_perm(i) = perm[i] + 1; |
5451 | 537 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
538 retval(0) = out_perm; |
5451 | 539 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
540 // print stats if spumoni > 0 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
541 if (spumoni > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
542 CSYMAMD_NAME (_report) (stats) ; |
5451 | 543 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
544 // Return the stats vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
545 if (nargout == 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
546 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
547 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
548 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
549 out_stats(i) = stats[i] ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
550 retval(1) = out_stats; |
5451 | 551 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
552 // fix stats (5) and (6), for 1-based information on |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
553 // jumbled matrix. note that this correction doesn't |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
554 // occur if symamd returns FALSE |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
555 out_stats (CCOLAMD_INFO1) ++ ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
556 out_stats (CCOLAMD_INFO2) ++ ; |
5451 | 557 } |
558 | |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
559 return retval; |
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
560 |
5451 | 561 #else |
21109
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
562 err_disabled_feature ("csymamd", "CCOLAMD"); |
5451 | 563 #endif |
564 } |