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");