Mercurial > octave-antonio
comparison src/DLD-FUNCTIONS/ccolamd.cc @ 10154:40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 20 Jan 2010 17:33:41 -0500 |
parents | 7c02ec148a3c |
children | d0ce5e973937 |
comparison
equal
deleted
inserted
replaced
10153:2c28f9d0360f | 10154:40dfc0c99116 |
---|---|
153 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); | 153 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); |
154 CCOLAMD_NAME (_set_defaults) (knobs); | 154 CCOLAMD_NAME (_set_defaults) (knobs); |
155 | 155 |
156 // Check for user-passed knobs | 156 // Check for user-passed knobs |
157 if (nargin > 1) | 157 if (nargin > 1) |
158 { | 158 { |
159 NDArray User_knobs = args(1).array_value (); | 159 NDArray User_knobs = args(1).array_value (); |
160 int nel_User_knobs = User_knobs.length (); | 160 int nel_User_knobs = User_knobs.length (); |
161 | 161 |
162 if (nel_User_knobs > 0) | 162 if (nel_User_knobs > 0) |
163 knobs [CCOLAMD_LU] = (User_knobs (0) != 0); | 163 knobs [CCOLAMD_LU] = (User_knobs (0) != 0); |
164 if (nel_User_knobs > 1) | 164 if (nel_User_knobs > 1) |
165 knobs [CCOLAMD_DENSE_ROW] = User_knobs (1); | 165 knobs [CCOLAMD_DENSE_ROW] = User_knobs (1); |
166 if (nel_User_knobs > 2) | 166 if (nel_User_knobs > 2) |
167 knobs [CCOLAMD_DENSE_COL] = User_knobs (2); | 167 knobs [CCOLAMD_DENSE_COL] = User_knobs (2); |
168 if (nel_User_knobs > 3) | 168 if (nel_User_knobs > 3) |
169 knobs [CCOLAMD_AGGRESSIVE] = (User_knobs (3) != 0); | 169 knobs [CCOLAMD_AGGRESSIVE] = (User_knobs (3) != 0); |
170 if (nel_User_knobs > 4) | 170 if (nel_User_knobs > 4) |
171 spumoni = (User_knobs (4) != 0); | 171 spumoni = (User_knobs (4) != 0); |
172 | 172 |
173 // print knob settings if spumoni is set | 173 // print knob settings if spumoni is set |
174 if (spumoni) | 174 if (spumoni) |
175 { | 175 { |
176 octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "." | 176 octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "." |
177 << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE | 177 << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE |
178 << ":\nknobs(1): " << User_knobs (0) << ", order for "; | 178 << ":\nknobs(1): " << User_knobs (0) << ", order for "; |
179 if ( knobs [CCOLAMD_LU] != 0) | 179 if ( knobs [CCOLAMD_LU] != 0) |
180 octave_stdout << "lu(A)\n"; | 180 octave_stdout << "lu(A)\n"; |
181 else | 181 else |
182 octave_stdout << "chol(A'*A)\n"; | 182 octave_stdout << "chol(A'*A)\n"; |
183 | 183 |
184 if (knobs [CCOLAMD_DENSE_ROW] >= 0) | 184 if (knobs [CCOLAMD_DENSE_ROW] >= 0) |
185 octave_stdout << "knobs(2): " << User_knobs (1) | 185 octave_stdout << "knobs(2): " << User_knobs (1) |
186 << ", rows with > max(16," | 186 << ", rows with > max(16," |
187 << knobs [CCOLAMD_DENSE_ROW] << "*sqrt(size(A,2)))" | 187 << knobs [CCOLAMD_DENSE_ROW] << "*sqrt(size(A,2)))" |
188 << " entries removed\n"; | 188 << " entries removed\n"; |
189 else | 189 else |
190 octave_stdout << "knobs(2): " << User_knobs (1) | 190 octave_stdout << "knobs(2): " << User_knobs (1) |
191 << ", no dense rows removed\n"; | 191 << ", no dense rows removed\n"; |
192 | 192 |
193 if (knobs [CCOLAMD_DENSE_COL] >= 0) | 193 if (knobs [CCOLAMD_DENSE_COL] >= 0) |
194 octave_stdout << "knobs(3): " << User_knobs (2) | 194 octave_stdout << "knobs(3): " << User_knobs (2) |
195 << ", cols with > max(16," | 195 << ", cols with > max(16," |
196 << knobs [CCOLAMD_DENSE_COL] << "*sqrt(size(A)))" | 196 << knobs [CCOLAMD_DENSE_COL] << "*sqrt(size(A)))" |
197 << " entries removed\n"; | 197 << " entries removed\n"; |
198 else | 198 else |
199 octave_stdout << "knobs(3): " << User_knobs (2) | 199 octave_stdout << "knobs(3): " << User_knobs (2) |
200 << ", no dense columns removed\n"; | 200 << ", no dense columns removed\n"; |
201 | 201 |
202 if (knobs [CCOLAMD_AGGRESSIVE] != 0) | 202 if (knobs [CCOLAMD_AGGRESSIVE] != 0) |
203 octave_stdout << "knobs(4): " << User_knobs(3) | 203 octave_stdout << "knobs(4): " << User_knobs(3) |
204 << ", aggressive absorption: yes"; | 204 << ", aggressive absorption: yes"; |
205 else | 205 else |
206 octave_stdout << "knobs(4): " << User_knobs(3) | 206 octave_stdout << "knobs(4): " << User_knobs(3) |
207 << ", aggressive absorption: no"; | 207 << ", aggressive absorption: no"; |
208 | 208 |
209 octave_stdout << "knobs(5): " << User_knobs (4) | 209 octave_stdout << "knobs(5): " << User_knobs (4) |
210 << ", statistics and knobs printed\n"; | 210 << ", statistics and knobs printed\n"; |
211 } | 211 } |
212 } | 212 } |
213 | 213 |
214 octave_idx_type n_row, n_col, nnz; | 214 octave_idx_type n_row, n_col, nnz; |
215 octave_idx_type *ridx, *cidx; | 215 octave_idx_type *ridx, *cidx; |
216 SparseComplexMatrix scm; | 216 SparseComplexMatrix scm; |
217 SparseMatrix sm; | 217 SparseMatrix sm; |
218 | 218 |
219 if (args(0).is_sparse_type ()) | 219 if (args(0).is_sparse_type ()) |
220 { | 220 { |
221 if (args(0).is_complex_type ()) | 221 if (args(0).is_complex_type ()) |
222 { | 222 { |
223 scm = args(0). sparse_complex_matrix_value (); | 223 scm = args(0). sparse_complex_matrix_value (); |
224 n_row = scm.rows (); | 224 n_row = scm.rows (); |
225 n_col = scm.cols (); | 225 n_col = scm.cols (); |
226 nnz = scm.nzmax (); | 226 nnz = scm.nzmax (); |
227 ridx = scm.xridx (); | 227 ridx = scm.xridx (); |
228 cidx = scm.xcidx (); | 228 cidx = scm.xcidx (); |
229 } | 229 } |
230 else | 230 else |
231 { | 231 { |
232 sm = args(0).sparse_matrix_value (); | 232 sm = args(0).sparse_matrix_value (); |
233 | 233 |
234 n_row = sm.rows (); | 234 n_row = sm.rows (); |
235 n_col = sm.cols (); | 235 n_col = sm.cols (); |
236 nnz = sm.nzmax (); | 236 nnz = sm.nzmax (); |
237 ridx = sm.xridx (); | 237 ridx = sm.xridx (); |
238 cidx = sm.xcidx (); | 238 cidx = sm.xcidx (); |
239 } | 239 } |
240 } | 240 } |
241 else | 241 else |
242 { | 242 { |
243 if (args(0).is_complex_type ()) | 243 if (args(0).is_complex_type ()) |
244 sm = SparseMatrix (real (args(0).complex_matrix_value ())); | 244 sm = SparseMatrix (real (args(0).complex_matrix_value ())); |
245 else | 245 else |
246 sm = SparseMatrix (args(0).matrix_value ()); | 246 sm = SparseMatrix (args(0).matrix_value ()); |
247 | 247 |
248 n_row = sm.rows (); | 248 n_row = sm.rows (); |
249 n_col = sm.cols (); | 249 n_col = sm.cols (); |
250 nnz = sm.nzmax (); | 250 nnz = sm.nzmax (); |
251 ridx = sm.xridx (); | 251 ridx = sm.xridx (); |
252 cidx = sm.xcidx (); | 252 cidx = sm.xcidx (); |
253 } | 253 } |
254 | 254 |
255 // Allocate workspace for ccolamd | 255 // Allocate workspace for ccolamd |
256 OCTAVE_LOCAL_BUFFER (octave_idx_type, p, n_col+1); | 256 OCTAVE_LOCAL_BUFFER (octave_idx_type, p, n_col+1); |
257 for (octave_idx_type i = 0; i < n_col+1; i++) | 257 for (octave_idx_type i = 0; i < n_col+1; i++) |
258 p[i] = cidx [i]; | 258 p[i] = cidx [i]; |
259 | 259 |
260 octave_idx_type Alen = CCOLAMD_NAME (_recommended) (nnz, n_row, n_col); | 260 octave_idx_type Alen = CCOLAMD_NAME (_recommended) (nnz, n_row, n_col); |
261 OCTAVE_LOCAL_BUFFER (octave_idx_type, A, Alen); | 261 OCTAVE_LOCAL_BUFFER (octave_idx_type, A, Alen); |
262 for (octave_idx_type i = 0; i < nnz; i++) | 262 for (octave_idx_type i = 0; i < nnz; i++) |
263 A[i] = ridx [i]; | 263 A[i] = ridx [i]; |
264 | 264 |
265 OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS); | 265 OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS); |
266 | 266 |
267 if (nargin > 2) | 267 if (nargin > 2) |
268 { | 268 { |
269 NDArray in_cmember = args(2).array_value(); | 269 NDArray in_cmember = args(2).array_value(); |
270 octave_idx_type cslen = in_cmember.length(); | 270 octave_idx_type cslen = in_cmember.length(); |
271 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); | 271 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); |
272 for (octave_idx_type i = 0; i < cslen; i++) | 272 for (octave_idx_type i = 0; i < cslen; i++) |
273 // convert cmember from 1-based to 0-based | 273 // convert cmember from 1-based to 0-based |
274 cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1); | 274 cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1); |
275 | 275 |
276 if (cslen != n_col) | 276 if (cslen != n_col) |
277 error ("ccolamd: cmember must be of length equal to #cols of A"); | 277 error ("ccolamd: cmember must be of length equal to #cols of A"); |
278 else | 278 else |
279 // Order the columns (destroys A) | 279 // Order the columns (destroys A) |
280 if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, cmember)) | 280 if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, cmember)) |
281 { | 281 { |
282 CCOLAMD_NAME (_report) (stats) ; | 282 CCOLAMD_NAME (_report) (stats) ; |
283 error ("ccolamd: internal error!"); | 283 error ("ccolamd: internal error!"); |
284 return retval; | 284 return retval; |
285 } | 285 } |
286 } | 286 } |
287 else | 287 else |
288 { | 288 { |
289 // Order the columns (destroys A) | 289 // Order the columns (destroys A) |
290 if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, 0)) | 290 if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, 0)) |
291 { | 291 { |
292 CCOLAMD_NAME (_report) (stats) ; | 292 CCOLAMD_NAME (_report) (stats) ; |
293 error ("ccolamd: internal error!"); | 293 error ("ccolamd: internal error!"); |
294 return retval; | 294 return retval; |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 // return the permutation vector | 298 // return the permutation vector |
299 NDArray out_perm (dim_vector (1, n_col)); | 299 NDArray out_perm (dim_vector (1, n_col)); |
300 for (octave_idx_type i = 0; i < n_col; i++) | 300 for (octave_idx_type i = 0; i < n_col; i++) |
301 out_perm(i) = p [i] + 1; | 301 out_perm(i) = p [i] + 1; |
302 | 302 |
303 retval (0) = out_perm; | 303 retval (0) = out_perm; |
304 | 304 |
305 // print stats if spumoni > 0 | 305 // print stats if spumoni > 0 |
306 if (spumoni > 0) | 306 if (spumoni > 0) |
307 CCOLAMD_NAME (_report) (stats) ; | 307 CCOLAMD_NAME (_report) (stats) ; |
308 | 308 |
309 // Return the stats vector | 309 // Return the stats vector |
310 if (nargout == 2) | 310 if (nargout == 2) |
311 { | 311 { |
312 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); | 312 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
313 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) | 313 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) |
314 out_stats (i) = stats [i] ; | 314 out_stats (i) = stats [i] ; |
315 retval(1) = out_stats; | 315 retval(1) = out_stats; |
316 | 316 |
317 // fix stats (5) and (6), for 1-based information on | 317 // fix stats (5) and (6), for 1-based information on |
318 // jumbled matrix. note that this correction doesn't | 318 // jumbled matrix. note that this correction doesn't |
319 // occur if symamd returns FALSE | 319 // occur if symamd returns FALSE |
320 out_stats (CCOLAMD_INFO1) ++ ; | 320 out_stats (CCOLAMD_INFO1) ++ ; |
321 out_stats (CCOLAMD_INFO2) ++ ; | 321 out_stats (CCOLAMD_INFO2) ++ ; |
322 } | 322 } |
323 } | 323 } |
324 | 324 |
325 #else | 325 #else |
326 | 326 |
327 error ("ccolamd: not available in this version of Octave"); | 327 error ("ccolamd: not available in this version of Octave"); |
408 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); | 408 OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS); |
409 CCOLAMD_NAME (_set_defaults) (knobs); | 409 CCOLAMD_NAME (_set_defaults) (knobs); |
410 | 410 |
411 // Check for user-passed knobs | 411 // Check for user-passed knobs |
412 if (nargin > 1) | 412 if (nargin > 1) |
413 { | 413 { |
414 NDArray User_knobs = args(1).array_value (); | 414 NDArray User_knobs = args(1).array_value (); |
415 int nel_User_knobs = User_knobs.length (); | 415 int nel_User_knobs = User_knobs.length (); |
416 | 416 |
417 if (nel_User_knobs > 0) | 417 if (nel_User_knobs > 0) |
418 knobs [CCOLAMD_DENSE_ROW] = User_knobs (0); | 418 knobs [CCOLAMD_DENSE_ROW] = User_knobs (0); |
419 if (nel_User_knobs > 0) | 419 if (nel_User_knobs > 0) |
420 knobs [CCOLAMD_AGGRESSIVE] = User_knobs (1); | 420 knobs [CCOLAMD_AGGRESSIVE] = User_knobs (1); |
421 if (nel_User_knobs > 1) | 421 if (nel_User_knobs > 1) |
422 spumoni = static_cast<int> (User_knobs (2)); | 422 spumoni = static_cast<int> (User_knobs (2)); |
423 | 423 |
424 // print knob settings if spumoni is set | 424 // print knob settings if spumoni is set |
425 if (spumoni) | 425 if (spumoni) |
426 { | 426 { |
427 octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION << "." | 427 octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION << "." |
428 << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE << "\n"; | 428 << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE << "\n"; |
429 | 429 |
430 if (knobs [CCOLAMD_DENSE_ROW] >= 0) | 430 if (knobs [CCOLAMD_DENSE_ROW] >= 0) |
431 octave_stdout << "knobs(1): " << User_knobs (0) | 431 octave_stdout << "knobs(1): " << User_knobs (0) |
432 << ", rows/cols with > max(16," | 432 << ", rows/cols with > max(16," |
433 << knobs [CCOLAMD_DENSE_ROW] << "*sqrt(size(A,2)))" | 433 << knobs [CCOLAMD_DENSE_ROW] << "*sqrt(size(A,2)))" |
434 << " entries removed\n"; | 434 << " entries removed\n"; |
435 else | 435 else |
436 octave_stdout << "knobs(1): " << User_knobs (0) | 436 octave_stdout << "knobs(1): " << User_knobs (0) |
437 << ", no dense rows/cols removed\n"; | 437 << ", no dense rows/cols removed\n"; |
438 | 438 |
439 if (knobs [CCOLAMD_AGGRESSIVE] != 0) | 439 if (knobs [CCOLAMD_AGGRESSIVE] != 0) |
440 octave_stdout << "knobs(2): " << User_knobs(1) | 440 octave_stdout << "knobs(2): " << User_knobs(1) |
441 << ", aggressive absorption: yes"; | 441 << ", aggressive absorption: yes"; |
442 else | 442 else |
443 octave_stdout << "knobs(2): " << User_knobs(1) | 443 octave_stdout << "knobs(2): " << User_knobs(1) |
444 << ", aggressive absorption: no"; | 444 << ", aggressive absorption: no"; |
445 | 445 |
446 | 446 |
447 octave_stdout << "knobs(3): " << User_knobs (2) | 447 octave_stdout << "knobs(3): " << User_knobs (2) |
448 << ", statistics and knobs printed\n"; | 448 << ", statistics and knobs printed\n"; |
449 } | 449 } |
450 } | 450 } |
451 | 451 |
452 octave_idx_type n_row, n_col, nnz; | 452 octave_idx_type n_row, n_col, nnz; |
453 octave_idx_type *ridx, *cidx; | 453 octave_idx_type *ridx, *cidx; |
454 SparseMatrix sm; | 454 SparseMatrix sm; |
455 SparseComplexMatrix scm; | 455 SparseComplexMatrix scm; |
456 | 456 |
457 if (args(0).is_sparse_type ()) | 457 if (args(0).is_sparse_type ()) |
458 { | 458 { |
459 if (args(0).is_complex_type ()) | 459 if (args(0).is_complex_type ()) |
460 { | 460 { |
461 scm = args(0).sparse_complex_matrix_value (); | 461 scm = args(0).sparse_complex_matrix_value (); |
462 n_row = scm.rows (); | 462 n_row = scm.rows (); |
463 n_col = scm.cols (); | 463 n_col = scm.cols (); |
464 nnz = scm.nzmax (); | 464 nnz = scm.nzmax (); |
465 ridx = scm.xridx (); | 465 ridx = scm.xridx (); |
466 cidx = scm.xcidx (); | 466 cidx = scm.xcidx (); |
467 } | 467 } |
468 else | 468 else |
469 { | 469 { |
470 sm = args(0).sparse_matrix_value (); | 470 sm = args(0).sparse_matrix_value (); |
471 n_row = sm.rows (); | 471 n_row = sm.rows (); |
472 n_col = sm.cols (); | 472 n_col = sm.cols (); |
473 nnz = sm.nzmax (); | 473 nnz = sm.nzmax (); |
474 ridx = sm.xridx (); | 474 ridx = sm.xridx (); |
475 cidx = sm.xcidx (); | 475 cidx = sm.xcidx (); |
476 } | 476 } |
477 } | 477 } |
478 else | 478 else |
479 { | 479 { |
480 if (args(0).is_complex_type ()) | 480 if (args(0).is_complex_type ()) |
481 sm = SparseMatrix (real (args(0).complex_matrix_value ())); | 481 sm = SparseMatrix (real (args(0).complex_matrix_value ())); |
482 else | 482 else |
483 sm = SparseMatrix (args(0).matrix_value ()); | 483 sm = SparseMatrix (args(0).matrix_value ()); |
484 | 484 |
485 n_row = sm.rows (); | 485 n_row = sm.rows (); |
486 n_col = sm.cols (); | 486 n_col = sm.cols (); |
487 nnz = sm.nzmax (); | 487 nnz = sm.nzmax (); |
488 ridx = sm.xridx (); | 488 ridx = sm.xridx (); |
489 cidx = sm.xcidx (); | 489 cidx = sm.xcidx (); |
490 } | 490 } |
491 | 491 |
492 if (n_row != n_col) | 492 if (n_row != n_col) |
493 { | 493 { |
494 error ("symamd: matrix must be square"); | 494 error ("symamd: matrix must be square"); |
495 return retval; | 495 return retval; |
496 } | 496 } |
497 | 497 |
498 // Allocate workspace for symamd | 498 // Allocate workspace for symamd |
499 OCTAVE_LOCAL_BUFFER (octave_idx_type, perm, n_col+1); | 499 OCTAVE_LOCAL_BUFFER (octave_idx_type, perm, n_col+1); |
500 OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS); | 500 OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS); |
501 | 501 |
502 if (nargin > 2) | 502 if (nargin > 2) |
503 { | 503 { |
504 NDArray in_cmember = args(2).array_value(); | 504 NDArray in_cmember = args(2).array_value(); |
505 octave_idx_type cslen = in_cmember.length(); | 505 octave_idx_type cslen = in_cmember.length(); |
506 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); | 506 OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen); |
507 for (octave_idx_type i = 0; i < cslen; i++) | 507 for (octave_idx_type i = 0; i < cslen; i++) |
508 // convert cmember from 1-based to 0-based | 508 // convert cmember from 1-based to 0-based |
509 cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1); | 509 cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1); |
510 | 510 |
511 if (cslen != n_col) | 511 if (cslen != n_col) |
512 error ("ccolamd: cmember must be of length equal to #cols of A"); | 512 error ("ccolamd: cmember must be of length equal to #cols of A"); |
513 else | 513 else |
514 if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats, | 514 if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats, |
515 &calloc, &free, cmember, -1)) | 515 &calloc, &free, cmember, -1)) |
516 { | 516 { |
517 CSYMAMD_NAME (_report) (stats) ; | 517 CSYMAMD_NAME (_report) (stats) ; |
518 error ("symamd: internal error!") ; | 518 error ("symamd: internal error!") ; |
519 return retval; | 519 return retval; |
520 } | 520 } |
521 } | 521 } |
522 else | 522 else |
523 { | 523 { |
524 if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats, | 524 if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats, |
525 &calloc, &free, 0, -1)) | 525 &calloc, &free, 0, -1)) |
526 { | 526 { |
527 CSYMAMD_NAME (_report) (stats) ; | 527 CSYMAMD_NAME (_report) (stats) ; |
528 error ("symamd: internal error!") ; | 528 error ("symamd: internal error!") ; |
529 return retval; | 529 return retval; |
530 } | 530 } |
531 } | 531 } |
532 | 532 |
533 // return the permutation vector | 533 // return the permutation vector |
534 NDArray out_perm (dim_vector (1, n_col)); | 534 NDArray out_perm (dim_vector (1, n_col)); |
535 for (octave_idx_type i = 0; i < n_col; i++) | 535 for (octave_idx_type i = 0; i < n_col; i++) |
536 out_perm(i) = perm [i] + 1; | 536 out_perm(i) = perm [i] + 1; |
537 | 537 |
538 retval (0) = out_perm; | 538 retval (0) = out_perm; |
539 | 539 |
540 // Return the stats vector | 540 // Return the stats vector |
541 if (nargout == 2) | 541 if (nargout == 2) |
542 { | 542 { |
543 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); | 543 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
544 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) | 544 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) |
545 out_stats (i) = stats [i] ; | 545 out_stats (i) = stats [i] ; |
546 retval(1) = out_stats; | 546 retval(1) = out_stats; |
547 | 547 |
548 // fix stats (5) and (6), for 1-based information on | 548 // fix stats (5) and (6), for 1-based information on |
549 // jumbled matrix. note that this correction doesn't | 549 // jumbled matrix. note that this correction doesn't |
550 // occur if symamd returns FALSE | 550 // occur if symamd returns FALSE |
551 out_stats (CCOLAMD_INFO1) ++ ; | 551 out_stats (CCOLAMD_INFO1) ++ ; |
552 out_stats (CCOLAMD_INFO2) ++ ; | 552 out_stats (CCOLAMD_INFO2) ++ ; |
553 } | 553 } |
554 | 554 |
555 // print stats if spumoni > 0 | 555 // print stats if spumoni > 0 |
556 if (spumoni > 0) | 556 if (spumoni > 0) |
557 CSYMAMD_NAME (_report) (stats) ; | 557 CSYMAMD_NAME (_report) (stats) ; |
558 | 558 |
559 // Return the stats vector | 559 // Return the stats vector |
560 if (nargout == 2) | 560 if (nargout == 2) |
561 { | 561 { |
562 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); | 562 NDArray out_stats (dim_vector (1, CCOLAMD_STATS)); |
563 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) | 563 for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++) |
564 out_stats (i) = stats [i] ; | 564 out_stats (i) = stats [i] ; |
565 retval(1) = out_stats; | 565 retval(1) = out_stats; |
566 | 566 |
567 // fix stats (5) and (6), for 1-based information on | 567 // fix stats (5) and (6), for 1-based information on |
568 // jumbled matrix. note that this correction doesn't | 568 // jumbled matrix. note that this correction doesn't |
569 // occur if symamd returns FALSE | 569 // occur if symamd returns FALSE |
570 out_stats (CCOLAMD_INFO1) ++ ; | 570 out_stats (CCOLAMD_INFO1) ++ ; |
571 out_stats (CCOLAMD_INFO2) ++ ; | 571 out_stats (CCOLAMD_INFO2) ++ ; |
572 } | 572 } |
573 } | 573 } |
574 | 574 |
575 #else | 575 #else |
576 | 576 |
577 error ("csymamd: not available in this version of Octave"); | 577 error ("csymamd: not available in this version of Octave"); |