Mercurial > hg > octave-nkf
comparison liboctave/SparseQR.cc @ 14846:460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Example: func() => func ()
* dynamic.txi, func.txi, oop.txi, var.txi, embedded.cc, fortdemo.cc,
funcdemo.cc, paramdemo.cc, stringdemo.cc, unwinddemo.cc, Array.cc, Array.h,
CColVector.cc, CDiagMatrix.h, CMatrix.cc, CNDArray.cc, CRowVector.cc,
CSparse.cc, CmplxGEPBAL.cc, EIG.cc, MSparse.cc, MatrixType.cc,
Sparse-op-defs.h, Sparse-perm-op-defs.h, Sparse.cc, Sparse.h,
SparseCmplxCHOL.cc, SparseCmplxCHOL.h, SparseCmplxLU.cc, SparseCmplxQR.cc,
SparseCmplxQR.h, SparseQR.cc, SparseQR.h, SparsedbleCHOL.cc, SparsedbleCHOL.h,
SparsedbleLU.cc, SparsedbleLU.h, base-lu.cc, cmd-hist.cc, dColVector.cc,
dDiagMatrix.h, dMatrix.cc, dNDArray.cc, dRowVector.cc, dSparse.cc, dbleCHOL.cc,
dbleGEPBAL.cc, dim-vector.cc, eigs-base.cc, f2c-main.c, fCColVector.cc,
fCDiagMatrix.h, fCMatrix.cc, fCNDArray.cc, fCRowVector.cc, fCmplxGEPBAL.cc,
fColVector.cc, fDiagMatrix.h, fEIG.cc, fMatrix.cc, fNDArray.cc, fRowVector.cc,
file-ops.cc, file-stat.cc, floatCHOL.cc, floatGEPBAL.cc, idx-vector.h,
lo-specfun.cc, lo-sysdep.cc, mx-inlines.cc, oct-binmap.h, oct-convn.cc,
oct-md5.cc, oct-mem.h, oct-rand.cc, oct-syscalls.cc, randgamma.c, randmtzig.c,
sparse-base-chol.cc, sparse-base-chol.h, sparse-base-lu.cc, sparse-dmsolve.cc,
tempname.c, curl.m, divergence.m, randi.m, dlmwrite.m, edit.m, getappdata.m,
what.m, getarchdir.m, install.m, installed_packages.m, repackage.m,
unload_packages.m, colorbar.m, figure.m, isosurface.m, legend.m, loglog.m,
plot.m, plot3.m, plotyy.m, polar.m, __errplot__.m, __ghostscript__.m,
__marching_cube__.m, __plt__.m, __scatter__.m, semilogx.m, semilogy.m,
trimesh.m, trisurf.m, demo.m, test.m, datetick.m, __delaunayn__.cc,
__dsearchn__.cc, __fltk_uigetfile__.cc, __glpk__.cc, __init_fltk__.cc,
__lin_interpn__.cc, __magick_read__.cc, __pchip_deriv__.cc, balance.cc,
bsxfun.cc, ccolamd.cc, cellfun.cc, chol.cc, daspk.cc, dasrt.cc, dassl.cc,
dmperm.cc, eig.cc, eigs.cc, fftw.cc, filter.cc, find.cc, kron.cc, lookup.cc,
lsode.cc, matrix_type.cc, md5sum.cc, mgorth.cc, qr.cc, quad.cc, rand.cc,
regexp.cc, symbfact.cc, tril.cc, urlwrite.cc, op-bm-bm.cc, op-cdm-cdm.cc,
op-cell.cc, op-chm.cc, op-cm-cm.cc, op-cm-scm.cc, op-cm-sm.cc, op-cs-scm.cc,
op-cs-sm.cc, op-dm-dm.cc, op-dm-scm.cc, op-dm-sm.cc, op-fcdm-fcdm.cc,
op-fcm-fcm.cc, op-fdm-fdm.cc, op-fm-fm.cc, op-int.h, op-m-m.cc, op-m-scm.cc,
op-m-sm.cc, op-pm-pm.cc, op-pm-scm.cc, op-pm-sm.cc, op-range.cc, op-s-scm.cc,
op-s-sm.cc, op-sbm-sbm.cc, op-scm-cm.cc, op-scm-cs.cc, op-scm-m.cc,
op-scm-s.cc, op-scm-scm.cc, op-scm-sm.cc, op-sm-cm.cc, op-sm-cs.cc, op-sm-m.cc,
op-sm-s.cc, op-sm-scm.cc, op-sm-sm.cc, op-str-str.cc, op-struct.cc, bitfcns.cc,
data.cc, debug.cc, dynamic-ld.cc, error.cc, gl-render.cc, graphics.cc,
graphics.in.h, load-path.cc, ls-hdf5.cc, ls-mat5.cc, ls-mat5.h,
ls-oct-ascii.cc, ls-oct-ascii.h, mex.cc, mk-errno-list, oct-map.cc, oct-obj.h,
oct-parse.yy, octave-config.in.cc, ov-base-int.cc, ov-base-mat.cc, ov-base.cc,
ov-bool-mat.cc, ov-bool-sparse.cc, ov-bool.cc, ov-cell.cc, ov-class.cc,
ov-class.h, ov-cx-mat.cc, ov-cx-sparse.cc, ov-fcn-handle.cc, ov-flt-cx-mat.cc,
ov-flt-re-mat.cc, ov-intx.h, ov-range.h, ov-re-mat.cc, ov-re-sparse.cc,
ov-str-mat.cc, ov-struct.cc, ov-usr-fcn.h, ov.h, pr-output.cc, pt-id.cc,
pt-id.h, pt-mat.cc, pt-select.cc, sparse.cc, symtab.cc, symtab.h, syscalls.cc,
toplev.cc, txt-eng-ft.cc, variables.cc, zfstream.cc, zfstream.h, Dork.m,
getStash.m, myStash.m, Gork.m, Pork.m, myStash.m, getStash.m, myStash.m,
getStash.m, myStash.m, fntests.m: Use Octave coding convention for
cuddled parenthis in function calls with empty argument lists.
author | Rik <octave@nomad.inbox5.com> |
---|---|
date | Sun, 08 Jul 2012 11:28:50 -0700 |
parents | 72c96de7a403 |
children | 3d8ace26c5b4 |
comparison
equal
deleted
inserted
replaced
14844:5bc9b9cb4362 | 14846:460a3c6d8bf1 |
---|---|
172 | 172 |
173 Matrix | 173 Matrix |
174 SparseQR::SparseQR_rep::C (const Matrix &b) const | 174 SparseQR::SparseQR_rep::C (const Matrix &b) const |
175 { | 175 { |
176 #ifdef HAVE_CXSPARSE | 176 #ifdef HAVE_CXSPARSE |
177 octave_idx_type b_nr = b.rows(); | 177 octave_idx_type b_nr = b.rows (); |
178 octave_idx_type b_nc = b.cols(); | 178 octave_idx_type b_nc = b.cols (); |
179 octave_idx_type nc = N->L->n; | 179 octave_idx_type nc = N->L->n; |
180 octave_idx_type nr = nrows; | 180 octave_idx_type nr = nrows; |
181 const double *bvec = b.fortran_vec(); | 181 const double *bvec = b.fortran_vec (); |
182 Matrix ret (b_nr, b_nc); | 182 Matrix ret (b_nr, b_nc); |
183 double *vec = ret.fortran_vec(); | 183 double *vec = ret.fortran_vec (); |
184 if (nr < 0 || nc < 0 || nr != b_nr) | 184 if (nr < 0 || nc < 0 || nr != b_nr) |
185 (*current_liboctave_error_handler) ("matrix dimension mismatch"); | 185 (*current_liboctave_error_handler) ("matrix dimension mismatch"); |
186 else if (nr == 0 || nc == 0 || b_nc == 0) | 186 else if (nr == 0 || nc == 0 || b_nc == 0) |
187 ret = Matrix (nc, b_nc, 0.0); | 187 ret = Matrix (nc, b_nc, 0.0); |
188 else | 188 else |
224 { | 224 { |
225 #ifdef HAVE_CXSPARSE | 225 #ifdef HAVE_CXSPARSE |
226 octave_idx_type nc = N->L->n; | 226 octave_idx_type nc = N->L->n; |
227 octave_idx_type nr = nrows; | 227 octave_idx_type nr = nrows; |
228 Matrix ret (nr, nr); | 228 Matrix ret (nr, nr); |
229 double *vec = ret.fortran_vec(); | 229 double *vec = ret.fortran_vec (); |
230 if (nr < 0 || nc < 0) | 230 if (nr < 0 || nc < 0) |
231 (*current_liboctave_error_handler) ("matrix dimension mismatch"); | 231 (*current_liboctave_error_handler) ("matrix dimension mismatch"); |
232 else if (nr == 0 || nc == 0) | 232 else if (nr == 0 || nc == 0) |
233 ret = Matrix (nc, nr, 0.0); | 233 ret = Matrix (nc, nr, 0.0); |
234 else | 234 else |
273 Matrix | 273 Matrix |
274 qrsolve(const SparseMatrix&a, const Matrix &b, octave_idx_type& info) | 274 qrsolve(const SparseMatrix&a, const Matrix &b, octave_idx_type& info) |
275 { | 275 { |
276 info = -1; | 276 info = -1; |
277 #ifdef HAVE_CXSPARSE | 277 #ifdef HAVE_CXSPARSE |
278 octave_idx_type nr = a.rows(); | 278 octave_idx_type nr = a.rows (); |
279 octave_idx_type nc = a.cols(); | 279 octave_idx_type nc = a.cols (); |
280 octave_idx_type b_nc = b.cols(); | 280 octave_idx_type b_nc = b.cols (); |
281 octave_idx_type b_nr = b.rows(); | 281 octave_idx_type b_nr = b.rows (); |
282 const double *bvec = b.fortran_vec(); | 282 const double *bvec = b.fortran_vec (); |
283 Matrix x; | 283 Matrix x; |
284 | 284 |
285 if (nr < 0 || nc < 0 || nr != b_nr) | 285 if (nr < 0 || nc < 0 || nr != b_nr) |
286 (*current_liboctave_error_handler) | 286 (*current_liboctave_error_handler) |
287 ("matrix dimension mismatch in solution of minimum norm problem"); | 287 ("matrix dimension mismatch in solution of minimum norm problem"); |
289 x = Matrix (nc, b_nc, 0.0); | 289 x = Matrix (nc, b_nc, 0.0); |
290 else if (nr >= nc) | 290 else if (nr >= nc) |
291 { | 291 { |
292 SparseQR q (a, 3); | 292 SparseQR q (a, 3); |
293 if (! q.ok ()) | 293 if (! q.ok ()) |
294 return Matrix(); | 294 return Matrix (); |
295 x.resize(nc, b_nc); | 295 x.resize(nc, b_nc); |
296 double *vec = x.fortran_vec(); | 296 double *vec = x.fortran_vec (); |
297 OCTAVE_LOCAL_BUFFER (double, buf, q.S()->m2); | 297 OCTAVE_LOCAL_BUFFER (double, buf, q.S ()->m2); |
298 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; | 298 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; |
299 i++, idx+=nc, bidx+=b_nr) | 299 i++, idx+=nc, bidx+=b_nr) |
300 { | 300 { |
301 octave_quit (); | 301 octave_quit (); |
302 for (octave_idx_type j = nr; j < q.S()->m2; j++) | 302 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
303 buf[j] = 0.; | 303 buf[j] = 0.; |
304 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 304 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
305 #if defined(CS_VER) && (CS_VER >= 2) | 305 #if defined(CS_VER) && (CS_VER >= 2) |
306 CXSPARSE_DNAME (_ipvec) (q.S()->pinv, bvec + bidx, buf, nr); | 306 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, bvec + bidx, buf, nr); |
307 #else | 307 #else |
308 CXSPARSE_DNAME (_ipvec) (nr, q.S()->Pinv, bvec + bidx, buf); | 308 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, bvec + bidx, buf); |
309 #endif | 309 #endif |
310 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 310 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
311 for (volatile octave_idx_type j = 0; j < nc; j++) | 311 for (volatile octave_idx_type j = 0; j < nc; j++) |
312 { | 312 { |
313 octave_quit (); | 313 octave_quit (); |
314 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 314 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
315 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 315 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
316 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 316 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
317 } | 317 } |
318 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 318 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
319 CXSPARSE_DNAME (_usolve) (q.N()->U, buf); | 319 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
320 #if defined(CS_VER) && (CS_VER >= 2) | 320 #if defined(CS_VER) && (CS_VER >= 2) |
321 CXSPARSE_DNAME (_ipvec) (q.S()->q, buf, vec + idx, nc); | 321 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, vec + idx, nc); |
322 #else | 322 #else |
323 CXSPARSE_DNAME (_ipvec) (nc, q.S()->Q, buf, vec + idx); | 323 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, vec + idx); |
324 #endif | 324 #endif |
325 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 325 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
326 } | 326 } |
327 info = 0; | 327 info = 0; |
328 } | 328 } |
329 else | 329 else |
330 { | 330 { |
331 SparseMatrix at = a.hermitian(); | 331 SparseMatrix at = a.hermitian (); |
332 SparseQR q (at, 3); | 332 SparseQR q (at, 3); |
333 if (! q.ok ()) | 333 if (! q.ok ()) |
334 return Matrix(); | 334 return Matrix (); |
335 x.resize(nc, b_nc); | 335 x.resize(nc, b_nc); |
336 double *vec = x.fortran_vec(); | 336 double *vec = x.fortran_vec (); |
337 volatile octave_idx_type nbuf = (nc > q.S()->m2 ? nc : q.S()->m2); | 337 volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2); |
338 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); | 338 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
339 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; | 339 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; |
340 i++, idx+=nc, bidx+=b_nr) | 340 i++, idx+=nc, bidx+=b_nr) |
341 { | 341 { |
342 octave_quit (); | 342 octave_quit (); |
343 for (octave_idx_type j = nr; j < nbuf; j++) | 343 for (octave_idx_type j = nr; j < nbuf; j++) |
344 buf[j] = 0.; | 344 buf[j] = 0.; |
345 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 345 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
346 #if defined(CS_VER) && (CS_VER >= 2) | 346 #if defined(CS_VER) && (CS_VER >= 2) |
347 CXSPARSE_DNAME (_pvec) (q.S()->q, bvec + bidx, buf, nr); | 347 CXSPARSE_DNAME (_pvec) (q.S ()->q, bvec + bidx, buf, nr); |
348 #else | 348 #else |
349 CXSPARSE_DNAME (_pvec) (nr, q.S()->Q, bvec + bidx, buf); | 349 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, bvec + bidx, buf); |
350 #endif | 350 #endif |
351 CXSPARSE_DNAME (_utsolve) (q.N()->U, buf); | 351 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
352 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 352 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
353 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 353 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
354 { | 354 { |
355 octave_quit (); | 355 octave_quit (); |
356 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 356 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
357 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 357 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
358 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 358 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
359 } | 359 } |
360 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 360 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
361 #if defined(CS_VER) && (CS_VER >= 2) | 361 #if defined(CS_VER) && (CS_VER >= 2) |
362 CXSPARSE_DNAME (_pvec) (q.S()->pinv, buf, vec + idx, nc); | 362 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, vec + idx, nc); |
363 #else | 363 #else |
364 CXSPARSE_DNAME (_pvec) (nc, q.S()->Pinv, buf, vec + idx); | 364 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, vec + idx); |
365 #endif | 365 #endif |
366 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 366 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
367 } | 367 } |
368 info = 0; | 368 info = 0; |
369 } | 369 } |
377 SparseMatrix | 377 SparseMatrix |
378 qrsolve(const SparseMatrix&a, const SparseMatrix &b, octave_idx_type &info) | 378 qrsolve(const SparseMatrix&a, const SparseMatrix &b, octave_idx_type &info) |
379 { | 379 { |
380 info = -1; | 380 info = -1; |
381 #ifdef HAVE_CXSPARSE | 381 #ifdef HAVE_CXSPARSE |
382 octave_idx_type nr = a.rows(); | 382 octave_idx_type nr = a.rows (); |
383 octave_idx_type nc = a.cols(); | 383 octave_idx_type nc = a.cols (); |
384 octave_idx_type b_nr = b.rows(); | 384 octave_idx_type b_nr = b.rows (); |
385 octave_idx_type b_nc = b.cols(); | 385 octave_idx_type b_nc = b.cols (); |
386 SparseMatrix x; | 386 SparseMatrix x; |
387 volatile octave_idx_type ii, x_nz; | 387 volatile octave_idx_type ii, x_nz; |
388 | 388 |
389 if (nr < 0 || nc < 0 || nr != b_nr) | 389 if (nr < 0 || nc < 0 || nr != b_nr) |
390 (*current_liboctave_error_handler) | 390 (*current_liboctave_error_handler) |
393 x = SparseMatrix (nc, b_nc); | 393 x = SparseMatrix (nc, b_nc); |
394 else if (nr >= nc) | 394 else if (nr >= nc) |
395 { | 395 { |
396 SparseQR q (a, 3); | 396 SparseQR q (a, 3); |
397 if (! q.ok ()) | 397 if (! q.ok ()) |
398 return SparseMatrix(); | 398 return SparseMatrix (); |
399 x = SparseMatrix (nc, b_nc, b.nnz()); | 399 x = SparseMatrix (nc, b_nc, b.nnz ()); |
400 x.xcidx(0) = 0; | 400 x.xcidx(0) = 0; |
401 x_nz = b.nnz(); | 401 x_nz = b.nnz (); |
402 ii = 0; | 402 ii = 0; |
403 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); | 403 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
404 OCTAVE_LOCAL_BUFFER (double, buf, q.S()->m2); | 404 OCTAVE_LOCAL_BUFFER (double, buf, q.S ()->m2); |
405 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) | 405 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
406 { | 406 { |
407 octave_quit (); | 407 octave_quit (); |
408 for (octave_idx_type j = 0; j < b_nr; j++) | 408 for (octave_idx_type j = 0; j < b_nr; j++) |
409 Xx[j] = b.xelem(j,i); | 409 Xx[j] = b.xelem(j,i); |
410 for (octave_idx_type j = nr; j < q.S()->m2; j++) | 410 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
411 buf[j] = 0.; | 411 buf[j] = 0.; |
412 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 412 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
413 #if defined(CS_VER) && (CS_VER >= 2) | 413 #if defined(CS_VER) && (CS_VER >= 2) |
414 CXSPARSE_DNAME (_ipvec) (q.S()->pinv, Xx, buf, nr); | 414 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); |
415 #else | 415 #else |
416 CXSPARSE_DNAME (_ipvec) (nr, q.S()->Pinv, Xx, buf); | 416 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf); |
417 #endif | 417 #endif |
418 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 418 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
419 for (volatile octave_idx_type j = 0; j < nc; j++) | 419 for (volatile octave_idx_type j = 0; j < nc; j++) |
420 { | 420 { |
421 octave_quit (); | 421 octave_quit (); |
422 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 422 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
423 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 423 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
424 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 424 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
425 } | 425 } |
426 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 426 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
427 CXSPARSE_DNAME (_usolve) (q.N()->U, buf); | 427 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
428 #if defined(CS_VER) && (CS_VER >= 2) | 428 #if defined(CS_VER) && (CS_VER >= 2) |
429 CXSPARSE_DNAME (_ipvec) (q.S()->q, buf, Xx, nc); | 429 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); |
430 #else | 430 #else |
431 CXSPARSE_DNAME (_ipvec) (nc, q.S()->Q, buf, Xx); | 431 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx); |
432 #endif | 432 #endif |
433 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 433 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
434 | 434 |
435 for (octave_idx_type j = 0; j < nc; j++) | 435 for (octave_idx_type j = 0; j < nc; j++) |
436 { | 436 { |
453 } | 453 } |
454 info = 0; | 454 info = 0; |
455 } | 455 } |
456 else | 456 else |
457 { | 457 { |
458 SparseMatrix at = a.hermitian(); | 458 SparseMatrix at = a.hermitian (); |
459 SparseQR q (at, 3); | 459 SparseQR q (at, 3); |
460 if (! q.ok ()) | 460 if (! q.ok ()) |
461 return SparseMatrix(); | 461 return SparseMatrix (); |
462 x = SparseMatrix (nc, b_nc, b.nnz()); | 462 x = SparseMatrix (nc, b_nc, b.nnz ()); |
463 x.xcidx(0) = 0; | 463 x.xcidx(0) = 0; |
464 x_nz = b.nnz(); | 464 x_nz = b.nnz (); |
465 ii = 0; | 465 ii = 0; |
466 volatile octave_idx_type nbuf = (nc > q.S()->m2 ? nc : q.S()->m2); | 466 volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2); |
467 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); | 467 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
468 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); | 468 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
469 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) | 469 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
470 { | 470 { |
471 octave_quit (); | 471 octave_quit (); |
473 Xx[j] = b.xelem(j,i); | 473 Xx[j] = b.xelem(j,i); |
474 for (octave_idx_type j = nr; j < nbuf; j++) | 474 for (octave_idx_type j = nr; j < nbuf; j++) |
475 buf[j] = 0.; | 475 buf[j] = 0.; |
476 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 476 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
477 #if defined(CS_VER) && (CS_VER >= 2) | 477 #if defined(CS_VER) && (CS_VER >= 2) |
478 CXSPARSE_DNAME (_pvec) (q.S()->q, Xx, buf, nr); | 478 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); |
479 #else | 479 #else |
480 CXSPARSE_DNAME (_pvec) (nr, q.S()->Q, Xx, buf); | 480 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf); |
481 #endif | 481 #endif |
482 CXSPARSE_DNAME (_utsolve) (q.N()->U, buf); | 482 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
483 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 483 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
484 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 484 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
485 { | 485 { |
486 octave_quit (); | 486 octave_quit (); |
487 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 487 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
488 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 488 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
489 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 489 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
490 } | 490 } |
491 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 491 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
492 #if defined(CS_VER) && (CS_VER >= 2) | 492 #if defined(CS_VER) && (CS_VER >= 2) |
493 CXSPARSE_DNAME (_pvec) (q.S()->pinv, buf, Xx, nc); | 493 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); |
494 #else | 494 #else |
495 CXSPARSE_DNAME (_pvec) (nc, q.S()->Pinv, buf, Xx); | 495 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx); |
496 #endif | 496 #endif |
497 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 497 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
498 | 498 |
499 for (octave_idx_type j = 0; j < nc; j++) | 499 for (octave_idx_type j = 0; j < nc; j++) |
500 { | 500 { |
528 ComplexMatrix | 528 ComplexMatrix |
529 qrsolve(const SparseMatrix&a, const ComplexMatrix &b, octave_idx_type &info) | 529 qrsolve(const SparseMatrix&a, const ComplexMatrix &b, octave_idx_type &info) |
530 { | 530 { |
531 info = -1; | 531 info = -1; |
532 #ifdef HAVE_CXSPARSE | 532 #ifdef HAVE_CXSPARSE |
533 octave_idx_type nr = a.rows(); | 533 octave_idx_type nr = a.rows (); |
534 octave_idx_type nc = a.cols(); | 534 octave_idx_type nc = a.cols (); |
535 octave_idx_type b_nc = b.cols(); | 535 octave_idx_type b_nc = b.cols (); |
536 octave_idx_type b_nr = b.rows(); | 536 octave_idx_type b_nr = b.rows (); |
537 ComplexMatrix x; | 537 ComplexMatrix x; |
538 | 538 |
539 if (nr < 0 || nc < 0 || nr != b_nr) | 539 if (nr < 0 || nc < 0 || nr != b_nr) |
540 (*current_liboctave_error_handler) | 540 (*current_liboctave_error_handler) |
541 ("matrix dimension mismatch in solution of minimum norm problem"); | 541 ("matrix dimension mismatch in solution of minimum norm problem"); |
543 x = ComplexMatrix (nc, b_nc, Complex (0.0, 0.0)); | 543 x = ComplexMatrix (nc, b_nc, Complex (0.0, 0.0)); |
544 else if (nr >= nc) | 544 else if (nr >= nc) |
545 { | 545 { |
546 SparseQR q (a, 3); | 546 SparseQR q (a, 3); |
547 if (! q.ok ()) | 547 if (! q.ok ()) |
548 return ComplexMatrix(); | 548 return ComplexMatrix (); |
549 x.resize(nc, b_nc); | 549 x.resize(nc, b_nc); |
550 Complex *vec = x.fortran_vec(); | 550 Complex *vec = x.fortran_vec (); |
551 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); | 551 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
552 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); | 552 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
553 OCTAVE_LOCAL_BUFFER (double, buf, q.S()->m2); | 553 OCTAVE_LOCAL_BUFFER (double, buf, q.S ()->m2); |
554 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) | 554 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
555 { | 555 { |
556 octave_quit (); | 556 octave_quit (); |
557 for (octave_idx_type j = 0; j < b_nr; j++) | 557 for (octave_idx_type j = 0; j < b_nr; j++) |
558 { | 558 { |
559 Complex c = b.xelem (j,i); | 559 Complex c = b.xelem (j,i); |
560 Xx[j] = std::real (c); | 560 Xx[j] = std::real (c); |
561 Xz[j] = std::imag (c); | 561 Xz[j] = std::imag (c); |
562 } | 562 } |
563 for (octave_idx_type j = nr; j < q.S()->m2; j++) | 563 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
564 buf[j] = 0.; | 564 buf[j] = 0.; |
565 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 565 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
566 #if defined(CS_VER) && (CS_VER >= 2) | 566 #if defined(CS_VER) && (CS_VER >= 2) |
567 CXSPARSE_DNAME (_ipvec) (q.S()->pinv, Xx, buf, nr); | 567 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); |
568 #else | 568 #else |
569 CXSPARSE_DNAME (_ipvec) (nr, q.S()->Pinv, Xx, buf); | 569 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf); |
570 #endif | 570 #endif |
571 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 571 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
572 for (volatile octave_idx_type j = 0; j < nc; j++) | 572 for (volatile octave_idx_type j = 0; j < nc; j++) |
573 { | 573 { |
574 octave_quit (); | 574 octave_quit (); |
575 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 575 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
576 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 576 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
577 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 577 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
578 } | 578 } |
579 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 579 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
580 CXSPARSE_DNAME (_usolve) (q.N()->U, buf); | 580 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
581 #if defined(CS_VER) && (CS_VER >= 2) | 581 #if defined(CS_VER) && (CS_VER >= 2) |
582 CXSPARSE_DNAME (_ipvec) (q.S()->q, buf, Xx, nc); | 582 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); |
583 #else | 583 #else |
584 CXSPARSE_DNAME (_ipvec) (nc, q.S()->Q, buf, Xx); | 584 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx); |
585 #endif | 585 #endif |
586 for (octave_idx_type j = nr; j < q.S()->m2; j++) | 586 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
587 buf[j] = 0.; | 587 buf[j] = 0.; |
588 #if defined(CS_VER) && (CS_VER >= 2) | 588 #if defined(CS_VER) && (CS_VER >= 2) |
589 CXSPARSE_DNAME (_ipvec) (q.S()->pinv, Xz, buf, nr); | 589 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr); |
590 #else | 590 #else |
591 CXSPARSE_DNAME (_ipvec) (nr, q.S()->Pinv, Xz, buf); | 591 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xz, buf); |
592 #endif | 592 #endif |
593 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 593 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
594 for (volatile octave_idx_type j = 0; j < nc; j++) | 594 for (volatile octave_idx_type j = 0; j < nc; j++) |
595 { | 595 { |
596 octave_quit (); | 596 octave_quit (); |
597 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 597 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
598 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 598 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
599 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 599 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
600 } | 600 } |
601 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 601 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
602 CXSPARSE_DNAME (_usolve) (q.N()->U, buf); | 602 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
603 #if defined(CS_VER) && (CS_VER >= 2) | 603 #if defined(CS_VER) && (CS_VER >= 2) |
604 CXSPARSE_DNAME (_ipvec) (q.S()->q, buf, Xz, nc); | 604 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc); |
605 #else | 605 #else |
606 CXSPARSE_DNAME (_ipvec) (nc, q.S()->Q, buf, Xz); | 606 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xz); |
607 #endif | 607 #endif |
608 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 608 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
609 for (octave_idx_type j = 0; j < nc; j++) | 609 for (octave_idx_type j = 0; j < nc; j++) |
610 vec[j+idx] = Complex (Xx[j], Xz[j]); | 610 vec[j+idx] = Complex (Xx[j], Xz[j]); |
611 } | 611 } |
612 info = 0; | 612 info = 0; |
613 } | 613 } |
614 else | 614 else |
615 { | 615 { |
616 SparseMatrix at = a.hermitian(); | 616 SparseMatrix at = a.hermitian (); |
617 SparseQR q (at, 3); | 617 SparseQR q (at, 3); |
618 if (! q.ok ()) | 618 if (! q.ok ()) |
619 return ComplexMatrix(); | 619 return ComplexMatrix (); |
620 x.resize(nc, b_nc); | 620 x.resize(nc, b_nc); |
621 Complex *vec = x.fortran_vec(); | 621 Complex *vec = x.fortran_vec (); |
622 volatile octave_idx_type nbuf = (nc > q.S()->m2 ? nc : q.S()->m2); | 622 volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2); |
623 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); | 623 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
624 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); | 624 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
625 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); | 625 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
626 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) | 626 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
627 { | 627 { |
634 } | 634 } |
635 for (octave_idx_type j = nr; j < nbuf; j++) | 635 for (octave_idx_type j = nr; j < nbuf; j++) |
636 buf[j] = 0.; | 636 buf[j] = 0.; |
637 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 637 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
638 #if defined(CS_VER) && (CS_VER >= 2) | 638 #if defined(CS_VER) && (CS_VER >= 2) |
639 CXSPARSE_DNAME (_pvec) (q.S()->q, Xx, buf, nr); | 639 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); |
640 #else | 640 #else |
641 CXSPARSE_DNAME (_pvec) (nr, q.S()->Q, Xx, buf); | 641 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf); |
642 #endif | 642 #endif |
643 CXSPARSE_DNAME (_utsolve) (q.N()->U, buf); | 643 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
644 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 644 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
645 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 645 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
646 { | 646 { |
647 octave_quit (); | 647 octave_quit (); |
648 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 648 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
649 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 649 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
650 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 650 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
651 } | 651 } |
652 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 652 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
653 #if defined(CS_VER) && (CS_VER >= 2) | 653 #if defined(CS_VER) && (CS_VER >= 2) |
654 CXSPARSE_DNAME (_pvec) (q.S()->pinv, buf, Xx, nc); | 654 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); |
655 #else | 655 #else |
656 CXSPARSE_DNAME (_pvec) (nc, q.S()->Pinv, buf, Xx); | 656 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx); |
657 #endif | 657 #endif |
658 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 658 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
659 for (octave_idx_type j = nr; j < nbuf; j++) | 659 for (octave_idx_type j = nr; j < nbuf; j++) |
660 buf[j] = 0.; | 660 buf[j] = 0.; |
661 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 661 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
662 #if defined(CS_VER) && (CS_VER >= 2) | 662 #if defined(CS_VER) && (CS_VER >= 2) |
663 CXSPARSE_DNAME (_pvec) (q.S()->q, Xz, buf, nr); | 663 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr); |
664 #else | 664 #else |
665 CXSPARSE_DNAME (_pvec) (nr, q.S()->Q, Xz, buf); | 665 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xz, buf); |
666 #endif | 666 #endif |
667 CXSPARSE_DNAME (_utsolve) (q.N()->U, buf); | 667 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
668 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 668 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
669 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 669 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
670 { | 670 { |
671 octave_quit (); | 671 octave_quit (); |
672 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 672 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
673 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 673 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
674 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 674 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
675 } | 675 } |
676 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 676 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
677 #if defined(CS_VER) && (CS_VER >= 2) | 677 #if defined(CS_VER) && (CS_VER >= 2) |
678 CXSPARSE_DNAME (_pvec) (q.S()->pinv, buf, Xz, nc); | 678 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc); |
679 #else | 679 #else |
680 CXSPARSE_DNAME (_pvec) (nc, q.S()->Pinv, buf, Xz); | 680 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xz); |
681 #endif | 681 #endif |
682 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 682 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
683 for (octave_idx_type j = 0; j < nc; j++) | 683 for (octave_idx_type j = 0; j < nc; j++) |
684 vec[j+idx] = Complex (Xx[j], Xz[j]); | 684 vec[j+idx] = Complex (Xx[j], Xz[j]); |
685 } | 685 } |
695 SparseComplexMatrix | 695 SparseComplexMatrix |
696 qrsolve(const SparseMatrix&a, const SparseComplexMatrix &b, octave_idx_type &info) | 696 qrsolve(const SparseMatrix&a, const SparseComplexMatrix &b, octave_idx_type &info) |
697 { | 697 { |
698 info = -1; | 698 info = -1; |
699 #ifdef HAVE_CXSPARSE | 699 #ifdef HAVE_CXSPARSE |
700 octave_idx_type nr = a.rows(); | 700 octave_idx_type nr = a.rows (); |
701 octave_idx_type nc = a.cols(); | 701 octave_idx_type nc = a.cols (); |
702 octave_idx_type b_nr = b.rows(); | 702 octave_idx_type b_nr = b.rows (); |
703 octave_idx_type b_nc = b.cols(); | 703 octave_idx_type b_nc = b.cols (); |
704 SparseComplexMatrix x; | 704 SparseComplexMatrix x; |
705 volatile octave_idx_type ii, x_nz; | 705 volatile octave_idx_type ii, x_nz; |
706 | 706 |
707 if (nr < 0 || nc < 0 || nr != b_nr) | 707 if (nr < 0 || nc < 0 || nr != b_nr) |
708 (*current_liboctave_error_handler) | 708 (*current_liboctave_error_handler) |
711 x = SparseComplexMatrix (nc, b_nc); | 711 x = SparseComplexMatrix (nc, b_nc); |
712 else if (nr >= nc) | 712 else if (nr >= nc) |
713 { | 713 { |
714 SparseQR q (a, 3); | 714 SparseQR q (a, 3); |
715 if (! q.ok ()) | 715 if (! q.ok ()) |
716 return SparseComplexMatrix(); | 716 return SparseComplexMatrix (); |
717 x = SparseComplexMatrix (nc, b_nc, b.nnz()); | 717 x = SparseComplexMatrix (nc, b_nc, b.nnz ()); |
718 x.xcidx(0) = 0; | 718 x.xcidx(0) = 0; |
719 x_nz = b.nnz(); | 719 x_nz = b.nnz (); |
720 ii = 0; | 720 ii = 0; |
721 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); | 721 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
722 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); | 722 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
723 OCTAVE_LOCAL_BUFFER (double, buf, q.S()->m2); | 723 OCTAVE_LOCAL_BUFFER (double, buf, q.S ()->m2); |
724 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) | 724 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
725 { | 725 { |
726 octave_quit (); | 726 octave_quit (); |
727 for (octave_idx_type j = 0; j < b_nr; j++) | 727 for (octave_idx_type j = 0; j < b_nr; j++) |
728 { | 728 { |
729 Complex c = b.xelem (j,i); | 729 Complex c = b.xelem (j,i); |
730 Xx[j] = std::real (c); | 730 Xx[j] = std::real (c); |
731 Xz[j] = std::imag (c); | 731 Xz[j] = std::imag (c); |
732 } | 732 } |
733 for (octave_idx_type j = nr; j < q.S()->m2; j++) | 733 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
734 buf[j] = 0.; | 734 buf[j] = 0.; |
735 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 735 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
736 #if defined(CS_VER) && (CS_VER >= 2) | 736 #if defined(CS_VER) && (CS_VER >= 2) |
737 CXSPARSE_DNAME (_ipvec) (q.S()->pinv, Xx, buf, nr); | 737 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); |
738 #else | 738 #else |
739 CXSPARSE_DNAME (_ipvec) (nr, q.S()->Pinv, Xx, buf); | 739 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf); |
740 #endif | 740 #endif |
741 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 741 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
742 for (volatile octave_idx_type j = 0; j < nc; j++) | 742 for (volatile octave_idx_type j = 0; j < nc; j++) |
743 { | 743 { |
744 octave_quit (); | 744 octave_quit (); |
745 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 745 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
746 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 746 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
747 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 747 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
748 } | 748 } |
749 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 749 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
750 CXSPARSE_DNAME (_usolve) (q.N()->U, buf); | 750 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
751 #if defined(CS_VER) && (CS_VER >= 2) | 751 #if defined(CS_VER) && (CS_VER >= 2) |
752 CXSPARSE_DNAME (_ipvec) (q.S()->q, buf, Xx, nc); | 752 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); |
753 #else | 753 #else |
754 CXSPARSE_DNAME (_ipvec) (nc, q.S()->Q, buf, Xx); | 754 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx); |
755 #endif | 755 #endif |
756 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 756 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
757 for (octave_idx_type j = nr; j < q.S()->m2; j++) | 757 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
758 buf[j] = 0.; | 758 buf[j] = 0.; |
759 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 759 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
760 #if defined(CS_VER) && (CS_VER >= 2) | 760 #if defined(CS_VER) && (CS_VER >= 2) |
761 CXSPARSE_DNAME (_ipvec) (q.S()->pinv, Xz, buf, nr); | 761 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr); |
762 #else | 762 #else |
763 CXSPARSE_DNAME (_ipvec) (nr, q.S()->Pinv, Xz, buf); | 763 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xz, buf); |
764 #endif | 764 #endif |
765 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 765 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
766 for (volatile octave_idx_type j = 0; j < nc; j++) | 766 for (volatile octave_idx_type j = 0; j < nc; j++) |
767 { | 767 { |
768 octave_quit (); | 768 octave_quit (); |
769 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 769 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
770 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 770 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
771 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 771 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
772 } | 772 } |
773 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 773 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
774 CXSPARSE_DNAME (_usolve) (q.N()->U, buf); | 774 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
775 #if defined(CS_VER) && (CS_VER >= 2) | 775 #if defined(CS_VER) && (CS_VER >= 2) |
776 CXSPARSE_DNAME (_ipvec) (q.S()->q, buf, Xz, nc); | 776 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc); |
777 #else | 777 #else |
778 CXSPARSE_DNAME (_ipvec) (nc, q.S()->Q, buf, Xz); | 778 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xz); |
779 #endif | 779 #endif |
780 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 780 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
781 | 781 |
782 for (octave_idx_type j = 0; j < nc; j++) | 782 for (octave_idx_type j = 0; j < nc; j++) |
783 { | 783 { |
800 } | 800 } |
801 info = 0; | 801 info = 0; |
802 } | 802 } |
803 else | 803 else |
804 { | 804 { |
805 SparseMatrix at = a.hermitian(); | 805 SparseMatrix at = a.hermitian (); |
806 SparseQR q (at, 3); | 806 SparseQR q (at, 3); |
807 if (! q.ok ()) | 807 if (! q.ok ()) |
808 return SparseComplexMatrix(); | 808 return SparseComplexMatrix (); |
809 x = SparseComplexMatrix (nc, b_nc, b.nnz()); | 809 x = SparseComplexMatrix (nc, b_nc, b.nnz ()); |
810 x.xcidx(0) = 0; | 810 x.xcidx(0) = 0; |
811 x_nz = b.nnz(); | 811 x_nz = b.nnz (); |
812 ii = 0; | 812 ii = 0; |
813 volatile octave_idx_type nbuf = (nc > q.S()->m2 ? nc : q.S()->m2); | 813 volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2); |
814 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); | 814 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
815 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); | 815 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
816 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); | 816 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
817 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) | 817 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
818 { | 818 { |
825 } | 825 } |
826 for (octave_idx_type j = nr; j < nbuf; j++) | 826 for (octave_idx_type j = nr; j < nbuf; j++) |
827 buf[j] = 0.; | 827 buf[j] = 0.; |
828 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 828 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
829 #if defined(CS_VER) && (CS_VER >= 2) | 829 #if defined(CS_VER) && (CS_VER >= 2) |
830 CXSPARSE_DNAME (_pvec) (q.S()->q, Xx, buf, nr); | 830 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); |
831 #else | 831 #else |
832 CXSPARSE_DNAME (_pvec) (nr, q.S()->Q, Xx, buf); | 832 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf); |
833 #endif | 833 #endif |
834 CXSPARSE_DNAME (_utsolve) (q.N()->U, buf); | 834 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
835 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 835 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
836 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 836 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
837 { | 837 { |
838 octave_quit (); | 838 octave_quit (); |
839 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 839 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
840 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 840 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
841 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 841 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
842 } | 842 } |
843 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 843 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
844 #if defined(CS_VER) && (CS_VER >= 2) | 844 #if defined(CS_VER) && (CS_VER >= 2) |
845 CXSPARSE_DNAME (_pvec) (q.S()->pinv, buf, Xx, nc); | 845 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); |
846 #else | 846 #else |
847 CXSPARSE_DNAME (_pvec) (nc, q.S()->Pinv, buf, Xx); | 847 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx); |
848 #endif | 848 #endif |
849 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 849 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
850 for (octave_idx_type j = nr; j < nbuf; j++) | 850 for (octave_idx_type j = nr; j < nbuf; j++) |
851 buf[j] = 0.; | 851 buf[j] = 0.; |
852 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 852 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
853 #if defined(CS_VER) && (CS_VER >= 2) | 853 #if defined(CS_VER) && (CS_VER >= 2) |
854 CXSPARSE_DNAME (_pvec) (q.S()->q, Xz, buf, nr); | 854 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr); |
855 #else | 855 #else |
856 CXSPARSE_DNAME (_pvec) (nr, q.S()->Q, Xz, buf); | 856 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xz, buf); |
857 #endif | 857 #endif |
858 CXSPARSE_DNAME (_utsolve) (q.N()->U, buf); | 858 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
859 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 859 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
860 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 860 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
861 { | 861 { |
862 octave_quit (); | 862 octave_quit (); |
863 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 863 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
864 CXSPARSE_DNAME (_happly) (q.N()->L, j, q.N()->B[j], buf); | 864 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
865 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 865 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
866 } | 866 } |
867 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 867 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
868 #if defined(CS_VER) && (CS_VER >= 2) | 868 #if defined(CS_VER) && (CS_VER >= 2) |
869 CXSPARSE_DNAME (_pvec) (q.S()->pinv, buf, Xz, nc); | 869 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc); |
870 #else | 870 #else |
871 CXSPARSE_DNAME (_pvec) (nc, q.S()->Pinv, buf, Xz); | 871 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xz); |
872 #endif | 872 #endif |
873 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 873 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
874 | 874 |
875 for (octave_idx_type j = 0; j < nc; j++) | 875 for (octave_idx_type j = 0; j < nc; j++) |
876 { | 876 { |