Mercurial > octave
annotate libinterp/dldfcn/ccolamd.cc @ 21211:2cf8bc5c7017
use "#if defined (HAVE_FOO)" instead of "#if HAVE_FOO" for feature tests
* configure.ac (HAVE_HDF5_INT2FLOAT_CONVERSIONS): AC_DEFINE here.
* ls-hdf5.cc (HAVE_HDF5_INT2FLOAT_CONVERSION): Delete definition.
* ls-hdf5.cc, ls-hdf5.h, ccolamd.cc, dmperm.cc, ov-base-int.cc,
ov-bool-mat.cc, ov-bool-sparse.cc, ov-bool.cc, ov-cell.cc,
ov-class.cc, ov-complex.cc, ov-cx-mat.cc, ov-cx-sparse.cc,
ov-fcn-handle.cc, ov-fcn-inline.cc, ov-float.cc, ov-flt-complex.cc,
ov-flt-cx-mat.cc, ov-flt-re-mat.cc, ov-java.cc, ov-range.cc,
ov-re-mat.cc, ov-re-sparse.cc, ov-scalar.cc, ov-str-mat.cc,
ov-struct.cc, pt-eval.cc:
Use #if defined (HAVE_FOO) instead of #if HAVE_FOO.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 06 Feb 2016 08:48:47 -0500 |
parents | fcac5dbbf9ed |
children | a83e7a384ee0 |
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 | |
21200
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21140
diff
changeset
|
27 # include <config.h> |
5451 | 28 #endif |
29 | |
30 #include <cstdlib> | |
31 | |
32 #include <string> | |
33 #include <vector> | |
34 | |
35 #include "ov.h" | |
36 #include "defun-dld.h" | |
21110
3d0d84305600
Use err_square_matrix_required more widely.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
37 #include "errwarn.h" |
5451 | 38 #include "pager.h" |
39 #include "ov-re-mat.h" | |
40 | |
41 #include "ov-re-sparse.h" | |
42 #include "ov-cx-sparse.h" | |
43 | |
44 #include "oct-sparse.h" | |
8377
25bc2d31e1bf
improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
7520
diff
changeset
|
45 #include "oct-locbuf.h" |
5451 | 46 |
21140
e06e600f396a
eliminate use of USE_64_BIT_IDX_T
John W. Eaton <jwe@octave.org>
parents:
21110
diff
changeset
|
47 #if defined (ENABLE_64) |
21200
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21140
diff
changeset
|
48 # define CCOLAMD_NAME(name) ccolamd_l ## name |
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21140
diff
changeset
|
49 # define CSYMAMD_NAME(name) csymamd_l ## name |
5451 | 50 #else |
21200
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21140
diff
changeset
|
51 # define CCOLAMD_NAME(name) ccolamd ## name |
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21140
diff
changeset
|
52 # define CSYMAMD_NAME(name) csymamd ## name |
5451 | 53 #endif |
54 | |
55 DEFUN_DLD (ccolamd, args, nargout, | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
56 "-*- 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
|
57 @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
|
58 @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
|
59 @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
|
60 @deftypefnx {} {[@var{p}, @var{stats}] =} ccolamd (@dots{})\n\ |
5451 | 61 \n\ |
10840 | 62 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
|
63 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
64 @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
|
65 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
|
66 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
|
67 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
|
68 @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
|
69 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
|
70 @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
|
71 @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
|
72 elimination tree post-ordering.\n\ |
5451 | 73 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
74 @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
|
75 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
|
76 present are set to their defaults.\n\ |
5451 | 77 \n\ |
78 @table @code\n\ | |
79 @item @var{knobs}(1)\n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
80 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
|
81 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
|
82 This is the most important knob for ccolamd.\n\ |
5451 | 83 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
84 @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
|
85 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
|
86 @code{max (16, @var{knobs}(2) * sqrt (n))} entries are ignored.\n\ |
5451 | 87 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
88 @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
|
89 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
|
90 @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
|
91 ignored and ordered last in the output permutation\n\ |
7107 | 92 (subject to the cmember constraints).\n\ |
5451 | 93 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
94 @item @var{knobs}(4)\n\ |
5451 | 95 if nonzero, aggressive absorption is performed.\n\ |
96 \n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
97 @item @var{knobs}(5)\n\ |
5451 | 98 if nonzero, statistics and knobs are printed.\n\ |
99 \n\ | |
100 @end table\n\ | |
101 \n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
102 @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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 @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
|
108 @code{ccolamd (@var{S}, [], 1 : n)} returns @code{1 : n}\n\ |
5451 | 109 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
110 @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
|
111 @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
|
112 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
|
113 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
|
114 (@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
|
115 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
|
116 @code{ccolamd (@var{S}, 1)} can.\n\ |
5451 | 117 \n\ |
118 @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
|
119 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
|
120 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
|
121 @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
|
122 ignored by @sc{ccolamd} and @code{@var{stats}(3)} is the number of garbage\n\ |
10840 | 123 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
|
124 (roughly of size @code{2.2 * nnz (@var{S}) + 4 * @var{m} + 7 * @var{n}}\n\ |
5451 | 125 integers).\n\ |
126 \n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
127 @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
|
128 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
|
129 invalid. @code{@var{stats}(5)} is the rightmost column index that is\n\ |
5451 | 130 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
|
131 @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
|
132 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
|
133 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
|
134 or out-of-order row indices. @code{@var{stats}(8 : 20)} is always zero in\n\ |
10840 | 135 the current version of @sc{ccolamd} (reserved for future use).\n\ |
5451 | 136 \n\ |
19040
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
137 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
|
138 (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
|
139 @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
|
140 @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
|
141 @nospell{Sandia} National Lab.\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
142 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
|
143 ccolamd, csymamd, amd, colamd, symamd, and other related orderings.\n\ |
5642 | 144 @seealso{colamd, csymamd}\n\ |
145 @end deftypefn") | |
5451 | 146 { |
147 #ifdef HAVE_CCOLAMD | |
5771 | 148 |
5451 | 149 int nargin = args.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
150 |
20909
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
151 if (nargin < 1 || nargin > 3) |
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
152 print_usage (); |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
153 |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
154 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
|
155 int spumoni = 0; |
5451 | 156 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
157 // Get knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
158 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
159 CCOLAMD_NAME (_set_defaults) (knobs); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
160 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
161 // Check for user-passed knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
162 if (nargin > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
163 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
164 NDArray User_knobs = args(1).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
165 int nel_User_knobs = User_knobs.numel (); |
5451 | 166 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
167 if (nel_User_knobs > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
168 knobs[CCOLAMD_LU] = (User_knobs(0) != 0); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
169 if (nel_User_knobs > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
170 knobs[CCOLAMD_DENSE_ROW] = User_knobs(1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
171 if (nel_User_knobs > 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
172 knobs[CCOLAMD_DENSE_COL] = User_knobs(2); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
173 if (nel_User_knobs > 3) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
174 knobs[CCOLAMD_AGGRESSIVE] = (User_knobs(3) != 0); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
175 if (nel_User_knobs > 4) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
176 spumoni = (User_knobs(4) != 0); |
5451 | 177 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
178 // print knob settings if spumoni is set |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
179 if (spumoni) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
180 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
181 octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "." |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
182 << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
183 << ":\nknobs(1): " << User_knobs(0) << ", order for "; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
184 if (knobs[CCOLAMD_LU] != 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
185 octave_stdout << "lu (A)\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
186 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
187 octave_stdout << "chol (A'*A)\n"; |
5451 | 188 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
189 if (knobs[CCOLAMD_DENSE_ROW] >= 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
190 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
191 << ", rows with > max (16," |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
192 << knobs[CCOLAMD_DENSE_ROW] |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
193 << "*sqrt (size(A,2)))" |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
194 << " entries removed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
195 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
196 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
197 << ", no dense rows removed\n"; |
5451 | 198 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
199 if (knobs[CCOLAMD_DENSE_COL] >= 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
200 octave_stdout << "knobs(3): " << User_knobs(2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
201 << ", cols with > max (16," |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
202 << knobs[CCOLAMD_DENSE_COL] << "*sqrt (size(A)))" |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
203 << " entries removed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
204 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
205 octave_stdout << "knobs(3): " << User_knobs(2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
206 << ", no dense columns removed\n"; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
207 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
208 if (knobs[CCOLAMD_AGGRESSIVE] != 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
209 octave_stdout << "knobs(4): " << User_knobs(3) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
210 << ", aggressive absorption: yes"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
211 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
212 octave_stdout << "knobs(4): " << User_knobs(3) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
213 << ", aggressive absorption: no"; |
5451 | 214 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
215 octave_stdout << "knobs(5): " << User_knobs(4) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
216 << ", statistics and knobs printed\n"; |
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 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
220 octave_idx_type n_row, n_col, nnz; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
221 octave_idx_type *ridx, *cidx; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
222 SparseComplexMatrix scm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
223 SparseMatrix sm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
224 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
225 if (args(0).is_sparse_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
226 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
227 if (args(0).is_complex_type ()) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
228 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
229 scm = args(0). sparse_complex_matrix_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
230 n_row = scm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
231 n_col = scm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
232 nnz = scm.nnz (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
233 ridx = scm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
234 cidx = scm.xcidx (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
235 } |
5451 | 236 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
237 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
238 sm = args(0).sparse_matrix_value (); |
5451 | 239 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
240 n_row = sm.rows (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
241 n_col = sm.cols (); |
10527
b4d2080b6df7
Replace nzmax by nnz as needed
David Bateman <dbateman@free.fr>
parents:
10282
diff
changeset
|
242 nnz = sm.nnz (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
243 ridx = sm.xridx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
244 cidx = sm.xcidx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
245 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
246 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
247 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
248 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
249 if (args(0).is_complex_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
250 sm = SparseMatrix (real (args(0).complex_matrix_value ())); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
251 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
252 sm = SparseMatrix (args(0).matrix_value ()); |
5451 | 253 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
254 n_row = sm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
255 n_col = sm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
256 nnz = sm.nnz (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
257 ridx = sm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
258 cidx = sm.xcidx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
259 } |
5451 | 260 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
261 // Allocate workspace for ccolamd |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
262 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
|
263 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
|
264 p[i] = cidx[i]; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
265 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
266 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
|
267 OCTAVE_LOCAL_BUFFER (octave_idx_type, A, Alen); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
268 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
|
269 A[i] = ridx[i]; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
270 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
271 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
|
272 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
273 if (nargin > 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
274 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
275 NDArray in_cmember = args(2).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
276 octave_idx_type cslen = in_cmember.numel (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
277 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
278 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
|
279 // convert cmember from 1-based to 0-based |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
280 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
|
281 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
282 if (cslen != n_col) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
283 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
|
284 |
21055
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
285 // Order the columns (destroys A) |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
286 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
|
287 { |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
288 CCOLAMD_NAME (_report) (stats) ; |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
289 |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
290 error ("ccolamd: internal error!"); |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
291 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
292 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
293 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
294 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
295 // Order the columns (destroys A) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
296 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
|
297 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
298 CCOLAMD_NAME (_report) (stats) ; |
5451 | 299 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
300 error ("ccolamd: internal error!"); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
301 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
302 } |
5451 | 303 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
304 // return the permutation vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
305 NDArray out_perm (dim_vector (1, n_col)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
306 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
|
307 out_perm(i) = p[i] + 1; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
308 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
309 retval(0) = out_perm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
310 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
311 // print stats if spumoni > 0 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
312 if (spumoni > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
313 CCOLAMD_NAME (_report) (stats) ; |
5451 | 314 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
315 // Return the stats vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
316 if (nargout == 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
317 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
318 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
319 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
|
320 out_stats(i) = stats[i] ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
321 retval(1) = out_stats; |
5451 | 322 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
323 // 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
|
324 // jumbled matrix. note that this correction doesn't |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
325 // occur if symamd returns FALSE |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
326 out_stats (CCOLAMD_INFO1) ++ ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
327 out_stats (CCOLAMD_INFO2) ++ ; |
5451 | 328 } |
329 | |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
330 return retval; |
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
331 |
5451 | 332 #else |
21109
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
333 err_disabled_feature ("ccolamd", "CCOLAMD"); |
5451 | 334 #endif |
335 } | |
336 | |
337 DEFUN_DLD (csymamd, args, nargout, | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
338 "-*- 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
|
339 @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
|
340 @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
|
341 @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
|
342 @deftypefnx {} {[@var{p}, @var{stats}] =} csymamd (@dots{})\n\ |
5451 | 343 \n\ |
20163
075a5e2e1ba5
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
344 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
|
345 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
|
346 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
|
347 \n\ |
20181
aa36fb998a4d
maint: Remove unnecessary whitespace at end of lines.
Rik <rik@octave.org>
parents:
20163
diff
changeset
|
348 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
|
349 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
|
350 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
|
351 followed by an elimination tree post-ordering.\n\ |
5451 | 352 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
353 @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
|
354 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
|
355 defaults.\n\ |
5451 | 356 \n\ |
357 @table @code\n\ | |
358 @item @var{knobs}(1)\n\ | |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
359 If @var{S} is n-by-n, then rows and columns with more than\n\ |
5451 | 360 @code{max(16,@var{knobs}(1)*sqrt(n))} entries are ignored, and ordered\n\ |
361 last in the output permutation (subject to the cmember constraints).\n\ | |
362 \n\ | |
363 @item @var{knobs}(2)\n\ | |
364 If nonzero, aggressive absorption is performed.\n\ | |
365 \n\ | |
366 @item @var{knobs}(3)\n\ | |
367 If nonzero, statistics and knobs are printed.\n\ | |
368 \n\ | |
369 @end table\n\ | |
370 \n\ | |
371 @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
|
372 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
|
373 in constraint set @var{c} (@var{c} must be in the range 1 to n). In the\n\ |
5451 | 374 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
|
375 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
|
376 if not present or empty. @code{csymamd (@var{S},[],1:n)} returns @code{1:n}.\n\ |
5451 | 377 \n\ |
20163
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} = 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
|
379 @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
|
380 differ.\n\ |
5451 | 381 \n\ |
11553
01f703952eff
Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
382 @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
|
383 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
|
384 invalid. @code{@var{stats}(5)} is the rightmost column index that is\n\ |
5451 | 385 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
|
386 @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
|
387 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
|
388 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
|
389 or out-of-order row indices. @code{@var{stats}(8:20)} is always zero in\n\ |
10840 | 390 the current version of @sc{ccolamd} (reserved for future use).\n\ |
5451 | 391 \n\ |
19040
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
392 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
|
393 (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
|
394 @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
|
395 @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
|
396 @nospell{Sandia} National Lab.\n\ |
0850b5212619
doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents:
18679
diff
changeset
|
397 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
|
398 ccolamd, csymamd, amd, colamd, symamd, and other related orderings.\n\ |
5642 | 399 @seealso{symamd, ccolamd}\n\ |
400 @end deftypefn") | |
5451 | 401 { |
21211
2cf8bc5c7017
use "#if defined (HAVE_FOO)" instead of "#if HAVE_FOO" for feature tests
John W. Eaton <jwe@octave.org>
parents:
21200
diff
changeset
|
402 #if defined (HAVE_CCOLAMD) |
5771 | 403 |
5451 | 404 int nargin = args.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
405 |
20909
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
406 if (nargin < 1 || nargin > 3) |
03e4ddd49396
omit unnecessary nargout checks
John W. Eaton <jwe@octave.org>
parents:
20898
diff
changeset
|
407 print_usage (); |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
408 |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
409 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
|
410 int spumoni = 0; |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
411 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
412 // Get knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
413 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
414 CCOLAMD_NAME (_set_defaults) (knobs); |
5451 | 415 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
416 // Check for user-passed knobs |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
417 if (nargin > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
418 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
419 NDArray User_knobs = args(1).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
420 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
|
421 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
422 if (nel_User_knobs > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
423 knobs[CCOLAMD_DENSE_ROW] = User_knobs(0); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
424 if (nel_User_knobs > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
425 knobs[CCOLAMD_AGGRESSIVE] = User_knobs(1); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
426 if (nel_User_knobs > 1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
427 spumoni = static_cast<int> (User_knobs(2)); |
5451 | 428 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
429 // print knob settings if spumoni is set |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
430 if (spumoni) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
431 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
432 octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
433 << "." << CCOLAMD_SUB_VERSION |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
434 << ", " << CCOLAMD_DATE << "\n"; |
5451 | 435 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
436 if (knobs[CCOLAMD_DENSE_ROW] >= 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
437 octave_stdout << "knobs(1): " << User_knobs(0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
438 << ", rows/cols with > max (16," |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
439 << knobs[CCOLAMD_DENSE_ROW] |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
440 << "*sqrt (size(A,2)))" |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
441 << " entries removed\n"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
442 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
443 octave_stdout << "knobs(1): " << User_knobs(0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
444 << ", no dense rows/cols removed\n"; |
5451 | 445 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
446 if (knobs[CCOLAMD_AGGRESSIVE] != 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
447 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
448 << ", aggressive absorption: yes"; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
449 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
450 octave_stdout << "knobs(2): " << User_knobs(1) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
451 << ", aggressive absorption: no"; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
452 |
5451 | 453 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
454 octave_stdout << "knobs(3): " << User_knobs(2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
455 << ", statistics and knobs printed\n"; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
456 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
457 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
458 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
459 octave_idx_type n_row, n_col; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
460 octave_idx_type *ridx, *cidx; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
461 SparseMatrix sm; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
462 SparseComplexMatrix scm; |
5451 | 463 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
464 if (args(0).is_sparse_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
465 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
466 if (args(0).is_complex_type ()) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
467 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
468 scm = args(0).sparse_complex_matrix_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
469 n_row = scm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
470 n_col = scm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
471 ridx = scm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
472 cidx = scm.xcidx (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
473 } |
5451 | 474 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
475 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
476 sm = args(0).sparse_matrix_value (); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
477 n_row = sm.rows (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
478 n_col = sm.cols (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
479 ridx = sm.xridx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
480 cidx = sm.xcidx (); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
481 } |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
482 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
483 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
484 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
485 if (args(0).is_complex_type ()) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
486 sm = SparseMatrix (real (args(0).complex_matrix_value ())); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
487 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
488 sm = SparseMatrix (args(0).matrix_value ()); |
5451 | 489 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
490 n_row = sm.rows (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
491 n_col = sm.cols (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
492 ridx = sm.xridx (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
493 cidx = sm.xcidx (); |
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 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
496 if (n_row != n_col) |
21110
3d0d84305600
Use err_square_matrix_required more widely.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
497 err_square_matrix_required ("csymamd", "S"); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
498 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
499 // Allocate workspace for symamd |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
500 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
|
501 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
|
502 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
503 if (nargin > 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
504 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
505 NDArray in_cmember = args(2).array_value (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
506 octave_idx_type cslen = in_cmember.numel (); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
507 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
508 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
|
509 // convert cmember from 1-based to 0-based |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
510 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
|
511 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
512 if (cslen != n_col) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
513 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
|
514 |
5e00ed38a58b
maint: Replace if/error/else paradigm with just if/error.
Rik <rik@octave.org>
parents:
20955
diff
changeset
|
515 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
|
516 &calloc, &free, cmember, -1)) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9064
diff
changeset
|
517 { |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
518 CSYMAMD_NAME (_report) (stats) ; |
5451 | 519 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
520 error ("csymamd: internal error!") ; |
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 } |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
523 else |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
524 { |
20955
77f5591878bf
maint: Use '! expr' rather than '!expr' to conform to coding guidelines.
Rik <rik@octave.org>
parents:
20909
diff
changeset
|
525 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
|
526 &calloc, &free, 0, -1)) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
527 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
528 CSYMAMD_NAME (_report) (stats) ; |
5451 | 529 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
530 error ("csymamd: internal error!") ; |
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 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
534 // return the permutation vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
535 NDArray out_perm (dim_vector (1, n_col)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
536 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
|
537 out_perm(i) = perm[i] + 1; |
5451 | 538 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
539 retval(0) = out_perm; |
5451 | 540 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
541 // print stats if spumoni > 0 |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
542 if (spumoni > 0) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
543 CSYMAMD_NAME (_report) (stats) ; |
5451 | 544 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
545 // Return the stats vector |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
546 if (nargout == 2) |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
547 { |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
548 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
549 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
|
550 out_stats(i) = stats[i] ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
551 retval(1) = out_stats; |
5451 | 552 |
20864
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
553 // 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
|
554 // jumbled matrix. note that this correction doesn't |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
555 // occur if symamd returns FALSE |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
556 out_stats (CCOLAMD_INFO1) ++ ; |
4c9df9f444db
2015 Code Sprint: ccolamd.cc: use ovl().
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
557 out_stats (CCOLAMD_INFO2) ++ ; |
5451 | 558 } |
559 | |
20898
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
560 return retval; |
8da80da1ac37
maint: Use ovl() more places in the code.
Rik <rik@octave.org>
parents:
20864
diff
changeset
|
561 |
5451 | 562 #else |
21109
bd1752782e56
Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents:
21055
diff
changeset
|
563 err_disabled_feature ("csymamd", "CCOLAMD"); |
5451 | 564 #endif |
565 } |