Mercurial > octave
comparison liboctave/numeric/SparseQR.cc @ 21152:8ad3907b8fad
require CXSparse 2.2 or later
* oct-sparse.h: Require CXSparse 2.2 or later.
* dmperm.cc, SparseCmplxQR.cc, SparseQR.cc, sparse-dmsolve.cc:
Assume CXSparse 2.2 or later.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 29 Jan 2016 14:55:20 -0500 |
parents | 7cac4e7458f2 |
children | 9c61ab1f7588 |
comparison
equal
deleted
inserted
replaced
21151:bfd5e48c41a1 | 21152:8ad3907b8fad |
---|---|
46 A.p = const_cast<octave_idx_type *>(a.cidx ()); | 46 A.p = const_cast<octave_idx_type *>(a.cidx ()); |
47 A.i = const_cast<octave_idx_type *>(a.ridx ()); | 47 A.i = const_cast<octave_idx_type *>(a.ridx ()); |
48 A.x = const_cast<double *>(a.data ()); | 48 A.x = const_cast<double *>(a.data ()); |
49 A.nz = -1; | 49 A.nz = -1; |
50 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 50 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
51 #if defined (CS_VER) && (CS_VER >= 2) | |
52 S = CXSPARSE_DNAME (_sqr) (order, &A, 1); | 51 S = CXSPARSE_DNAME (_sqr) (order, &A, 1); |
53 #else | |
54 S = CXSPARSE_DNAME (_sqr) (&A, order - 1, 1); | |
55 #endif | |
56 | 52 |
57 N = CXSPARSE_DNAME (_qr) (&A, S); | 53 N = CXSPARSE_DNAME (_qr) (&A, S); |
58 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 54 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
59 if (! N) | 55 if (! N) |
60 (*current_liboctave_error_handler) | 56 (*current_liboctave_error_handler) |
110 SparseQR::SparseQR_rep::Pinv (void) const | 106 SparseQR::SparseQR_rep::Pinv (void) const |
111 { | 107 { |
112 #ifdef HAVE_CXSPARSE | 108 #ifdef HAVE_CXSPARSE |
113 ColumnVector ret(N->L->m); | 109 ColumnVector ret(N->L->m); |
114 for (octave_idx_type i = 0; i < N->L->m; i++) | 110 for (octave_idx_type i = 0; i < N->L->m; i++) |
115 #if defined (CS_VER) && (CS_VER >= 2) | |
116 ret.xelem (i) = S->pinv[i]; | 111 ret.xelem (i) = S->pinv[i]; |
117 #else | |
118 ret.xelem (i) = S->Pinv[i]; | |
119 #endif | |
120 return ret; | 112 return ret; |
121 #else | 113 #else |
122 return ColumnVector (); | 114 return ColumnVector (); |
123 #endif | 115 #endif |
124 } | 116 } |
127 SparseQR::SparseQR_rep::P (void) const | 119 SparseQR::SparseQR_rep::P (void) const |
128 { | 120 { |
129 #ifdef HAVE_CXSPARSE | 121 #ifdef HAVE_CXSPARSE |
130 ColumnVector ret(N->L->m); | 122 ColumnVector ret(N->L->m); |
131 for (octave_idx_type i = 0; i < N->L->m; i++) | 123 for (octave_idx_type i = 0; i < N->L->m; i++) |
132 #if defined (CS_VER) && (CS_VER >= 2) | |
133 ret.xelem (S->pinv[i]) = i; | 124 ret.xelem (S->pinv[i]) = i; |
134 #else | |
135 ret.xelem (S->Pinv[i]) = i; | |
136 #endif | |
137 return ret; | 125 return ret; |
138 #else | 126 #else |
139 return ColumnVector (); | 127 return ColumnVector (); |
140 #endif | 128 #endif |
141 } | 129 } |
196 octave_quit (); | 184 octave_quit (); |
197 for (octave_idx_type i = nr; i < S->m2; i++) | 185 for (octave_idx_type i = nr; i < S->m2; i++) |
198 buf[i] = 0.; | 186 buf[i] = 0.; |
199 volatile octave_idx_type nm = (nr < nc ? nr : nc); | 187 volatile octave_idx_type nm = (nr < nc ? nr : nc); |
200 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 188 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
201 #if defined (CS_VER) && (CS_VER >= 2) | |
202 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec + idx, buf, b_nr); | 189 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec + idx, buf, b_nr); |
203 #else | |
204 CXSPARSE_DNAME (_ipvec) (b_nr, S->Pinv, bvec + idx, buf); | |
205 #endif | |
206 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 190 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
207 | 191 |
208 for (volatile octave_idx_type i = 0; i < nm; i++) | 192 for (volatile octave_idx_type i = 0; i < nm; i++) |
209 { | 193 { |
210 octave_quit (); | 194 octave_quit (); |
247 bvec[j] = 1.0; | 231 bvec[j] = 1.0; |
248 for (octave_idx_type i = nr; i < S->m2; i++) | 232 for (octave_idx_type i = nr; i < S->m2; i++) |
249 buf[i] = 0.; | 233 buf[i] = 0.; |
250 volatile octave_idx_type nm = (nr < nc ? nr : nc); | 234 volatile octave_idx_type nm = (nr < nc ? nr : nc); |
251 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 235 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
252 #if defined (CS_VER) && (CS_VER >= 2) | |
253 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec, buf, nr); | 236 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec, buf, nr); |
254 #else | |
255 CXSPARSE_DNAME (_ipvec) (nr, S->Pinv, bvec, buf); | |
256 #endif | |
257 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 237 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
258 | 238 |
259 for (volatile octave_idx_type i = 0; i < nm; i++) | 239 for (volatile octave_idx_type i = 0; i < nm; i++) |
260 { | 240 { |
261 octave_quit (); | 241 octave_quit (); |
305 { | 285 { |
306 octave_quit (); | 286 octave_quit (); |
307 for (octave_idx_type j = nr; j < q.S ()->m2; j++) | 287 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
308 buf[j] = 0.; | 288 buf[j] = 0.; |
309 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 289 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
310 #if defined (CS_VER) && (CS_VER >= 2) | |
311 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, bvec + bidx, buf, nr); | 290 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, bvec + bidx, buf, nr); |
312 #else | |
313 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, bvec + bidx, buf); | |
314 #endif | |
315 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 291 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
316 for (volatile octave_idx_type j = 0; j < nc; j++) | 292 for (volatile octave_idx_type j = 0; j < nc; j++) |
317 { | 293 { |
318 octave_quit (); | 294 octave_quit (); |
319 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 295 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
320 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 296 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
321 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 297 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
322 } | 298 } |
323 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 299 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
324 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); | 300 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
325 #if defined (CS_VER) && (CS_VER >= 2) | |
326 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, vec + idx, nc); | 301 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, vec + idx, nc); |
327 #else | |
328 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, vec + idx); | |
329 #endif | |
330 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 302 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
331 } | 303 } |
332 info = 0; | 304 info = 0; |
333 } | 305 } |
334 else | 306 else |
346 { | 318 { |
347 octave_quit (); | 319 octave_quit (); |
348 for (octave_idx_type j = nr; j < nbuf; j++) | 320 for (octave_idx_type j = nr; j < nbuf; j++) |
349 buf[j] = 0.; | 321 buf[j] = 0.; |
350 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 322 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
351 #if defined (CS_VER) && (CS_VER >= 2) | |
352 CXSPARSE_DNAME (_pvec) (q.S ()->q, bvec + bidx, buf, nr); | 323 CXSPARSE_DNAME (_pvec) (q.S ()->q, bvec + bidx, buf, nr); |
353 #else | |
354 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, bvec + bidx, buf); | |
355 #endif | |
356 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); | 324 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
357 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 325 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
358 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 326 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
359 { | 327 { |
360 octave_quit (); | 328 octave_quit (); |
361 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 329 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
362 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 330 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
363 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 331 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
364 } | 332 } |
365 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 333 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
366 #if defined (CS_VER) && (CS_VER >= 2) | |
367 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, vec + idx, nc); | 334 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, vec + idx, nc); |
368 #else | |
369 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, vec + idx); | |
370 #endif | |
371 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 335 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
372 } | 336 } |
373 info = 0; | 337 info = 0; |
374 } | 338 } |
375 | 339 |
414 for (octave_idx_type j = 0; j < b_nr; j++) | 378 for (octave_idx_type j = 0; j < b_nr; j++) |
415 Xx[j] = b.xelem (j,i); | 379 Xx[j] = b.xelem (j,i); |
416 for (octave_idx_type j = nr; j < q.S ()->m2; j++) | 380 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
417 buf[j] = 0.; | 381 buf[j] = 0.; |
418 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 382 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
419 #if defined (CS_VER) && (CS_VER >= 2) | |
420 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); | 383 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); |
421 #else | |
422 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf); | |
423 #endif | |
424 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 384 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
425 for (volatile octave_idx_type j = 0; j < nc; j++) | 385 for (volatile octave_idx_type j = 0; j < nc; j++) |
426 { | 386 { |
427 octave_quit (); | 387 octave_quit (); |
428 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 388 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
429 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 389 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
430 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 390 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
431 } | 391 } |
432 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 392 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
433 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); | 393 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
434 #if defined (CS_VER) && (CS_VER >= 2) | |
435 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); | 394 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); |
436 #else | |
437 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx); | |
438 #endif | |
439 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 395 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
440 | 396 |
441 for (octave_idx_type j = 0; j < nc; j++) | 397 for (octave_idx_type j = 0; j < nc; j++) |
442 { | 398 { |
443 double tmp = Xx[j]; | 399 double tmp = Xx[j]; |
478 for (octave_idx_type j = 0; j < b_nr; j++) | 434 for (octave_idx_type j = 0; j < b_nr; j++) |
479 Xx[j] = b.xelem (j,i); | 435 Xx[j] = b.xelem (j,i); |
480 for (octave_idx_type j = nr; j < nbuf; j++) | 436 for (octave_idx_type j = nr; j < nbuf; j++) |
481 buf[j] = 0.; | 437 buf[j] = 0.; |
482 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 438 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
483 #if defined (CS_VER) && (CS_VER >= 2) | |
484 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); | 439 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); |
485 #else | |
486 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf); | |
487 #endif | |
488 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); | 440 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
489 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 441 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
490 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 442 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
491 { | 443 { |
492 octave_quit (); | 444 octave_quit (); |
493 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 445 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
494 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 446 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
495 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 447 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
496 } | 448 } |
497 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 449 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
498 #if defined (CS_VER) && (CS_VER >= 2) | |
499 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); | 450 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); |
500 #else | |
501 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx); | |
502 #endif | |
503 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 451 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
504 | 452 |
505 for (octave_idx_type j = 0; j < nc; j++) | 453 for (octave_idx_type j = 0; j < nc; j++) |
506 { | 454 { |
507 double tmp = Xx[j]; | 455 double tmp = Xx[j]; |
568 Xz[j] = std::imag (c); | 516 Xz[j] = std::imag (c); |
569 } | 517 } |
570 for (octave_idx_type j = nr; j < q.S ()->m2; j++) | 518 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
571 buf[j] = 0.; | 519 buf[j] = 0.; |
572 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 520 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
573 #if defined (CS_VER) && (CS_VER >= 2) | |
574 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); | 521 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); |
575 #else | |
576 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf); | |
577 #endif | |
578 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 522 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
579 for (volatile octave_idx_type j = 0; j < nc; j++) | 523 for (volatile octave_idx_type j = 0; j < nc; j++) |
580 { | 524 { |
581 octave_quit (); | 525 octave_quit (); |
582 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 526 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
583 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 527 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
584 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 528 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
585 } | 529 } |
586 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 530 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
587 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); | 531 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
588 #if defined (CS_VER) && (CS_VER >= 2) | |
589 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); | 532 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); |
590 #else | |
591 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx); | |
592 #endif | |
593 for (octave_idx_type j = nr; j < q.S ()->m2; j++) | 533 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
594 buf[j] = 0.; | 534 buf[j] = 0.; |
595 #if defined (CS_VER) && (CS_VER >= 2) | |
596 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr); | 535 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr); |
597 #else | |
598 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xz, buf); | |
599 #endif | |
600 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 536 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
601 for (volatile octave_idx_type j = 0; j < nc; j++) | 537 for (volatile octave_idx_type j = 0; j < nc; j++) |
602 { | 538 { |
603 octave_quit (); | 539 octave_quit (); |
604 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 540 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
605 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 541 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
606 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 542 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
607 } | 543 } |
608 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 544 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
609 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); | 545 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
610 #if defined (CS_VER) && (CS_VER >= 2) | |
611 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc); | 546 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc); |
612 #else | |
613 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xz); | |
614 #endif | |
615 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 547 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
616 for (octave_idx_type j = 0; j < nc; j++) | 548 for (octave_idx_type j = 0; j < nc; j++) |
617 vec[j+idx] = Complex (Xx[j], Xz[j]); | 549 vec[j+idx] = Complex (Xx[j], Xz[j]); |
618 } | 550 } |
619 info = 0; | 551 info = 0; |
640 Xz[j] = std::imag (c); | 572 Xz[j] = std::imag (c); |
641 } | 573 } |
642 for (octave_idx_type j = nr; j < nbuf; j++) | 574 for (octave_idx_type j = nr; j < nbuf; j++) |
643 buf[j] = 0.; | 575 buf[j] = 0.; |
644 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 576 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
645 #if defined (CS_VER) && (CS_VER >= 2) | |
646 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); | 577 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); |
647 #else | |
648 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf); | |
649 #endif | |
650 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); | 578 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
651 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 579 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
652 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 580 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
653 { | 581 { |
654 octave_quit (); | 582 octave_quit (); |
655 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 583 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
656 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 584 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
657 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 585 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
658 } | 586 } |
659 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 587 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
660 #if defined (CS_VER) && (CS_VER >= 2) | |
661 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); | 588 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); |
662 #else | |
663 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx); | |
664 #endif | |
665 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 589 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
666 for (octave_idx_type j = nr; j < nbuf; j++) | 590 for (octave_idx_type j = nr; j < nbuf; j++) |
667 buf[j] = 0.; | 591 buf[j] = 0.; |
668 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 592 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
669 #if defined (CS_VER) && (CS_VER >= 2) | |
670 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr); | 593 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr); |
671 #else | |
672 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xz, buf); | |
673 #endif | |
674 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); | 594 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
675 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 595 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
676 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 596 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
677 { | 597 { |
678 octave_quit (); | 598 octave_quit (); |
679 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 599 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
680 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 600 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
681 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 601 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
682 } | 602 } |
683 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 603 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
684 #if defined (CS_VER) && (CS_VER >= 2) | |
685 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc); | 604 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc); |
686 #else | |
687 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xz); | |
688 #endif | |
689 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 605 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
690 for (octave_idx_type j = 0; j < nc; j++) | 606 for (octave_idx_type j = 0; j < nc; j++) |
691 vec[j+idx] = Complex (Xx[j], Xz[j]); | 607 vec[j+idx] = Complex (Xx[j], Xz[j]); |
692 } | 608 } |
693 info = 0; | 609 info = 0; |
740 Xz[j] = std::imag (c); | 656 Xz[j] = std::imag (c); |
741 } | 657 } |
742 for (octave_idx_type j = nr; j < q.S ()->m2; j++) | 658 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
743 buf[j] = 0.; | 659 buf[j] = 0.; |
744 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 660 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
745 #if defined (CS_VER) && (CS_VER >= 2) | |
746 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); | 661 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr); |
747 #else | |
748 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf); | |
749 #endif | |
750 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 662 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
751 for (volatile octave_idx_type j = 0; j < nc; j++) | 663 for (volatile octave_idx_type j = 0; j < nc; j++) |
752 { | 664 { |
753 octave_quit (); | 665 octave_quit (); |
754 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 666 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
755 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 667 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
756 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 668 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
757 } | 669 } |
758 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 670 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
759 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); | 671 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
760 #if defined (CS_VER) && (CS_VER >= 2) | |
761 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); | 672 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc); |
762 #else | |
763 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx); | |
764 #endif | |
765 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 673 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
766 for (octave_idx_type j = nr; j < q.S ()->m2; j++) | 674 for (octave_idx_type j = nr; j < q.S ()->m2; j++) |
767 buf[j] = 0.; | 675 buf[j] = 0.; |
768 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 676 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
769 #if defined (CS_VER) && (CS_VER >= 2) | |
770 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr); | 677 CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr); |
771 #else | |
772 CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xz, buf); | |
773 #endif | |
774 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 678 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
775 for (volatile octave_idx_type j = 0; j < nc; j++) | 679 for (volatile octave_idx_type j = 0; j < nc; j++) |
776 { | 680 { |
777 octave_quit (); | 681 octave_quit (); |
778 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 682 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
779 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 683 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
780 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 684 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
781 } | 685 } |
782 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 686 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
783 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); | 687 CXSPARSE_DNAME (_usolve) (q.N ()->U, buf); |
784 #if defined (CS_VER) && (CS_VER >= 2) | |
785 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc); | 688 CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc); |
786 #else | |
787 CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xz); | |
788 #endif | |
789 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 689 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
790 | 690 |
791 for (octave_idx_type j = 0; j < nc; j++) | 691 for (octave_idx_type j = 0; j < nc; j++) |
792 { | 692 { |
793 Complex tmp = Complex (Xx[j], Xz[j]); | 693 Complex tmp = Complex (Xx[j], Xz[j]); |
833 Xz[j] = std::imag (c); | 733 Xz[j] = std::imag (c); |
834 } | 734 } |
835 for (octave_idx_type j = nr; j < nbuf; j++) | 735 for (octave_idx_type j = nr; j < nbuf; j++) |
836 buf[j] = 0.; | 736 buf[j] = 0.; |
837 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 737 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
838 #if defined (CS_VER) && (CS_VER >= 2) | |
839 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); | 738 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr); |
840 #else | |
841 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf); | |
842 #endif | |
843 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); | 739 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
844 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 740 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
845 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 741 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
846 { | 742 { |
847 octave_quit (); | 743 octave_quit (); |
848 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 744 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
849 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 745 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
850 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 746 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
851 } | 747 } |
852 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 748 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
853 #if defined (CS_VER) && (CS_VER >= 2) | |
854 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); | 749 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc); |
855 #else | |
856 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx); | |
857 #endif | |
858 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 750 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
859 for (octave_idx_type j = nr; j < nbuf; j++) | 751 for (octave_idx_type j = nr; j < nbuf; j++) |
860 buf[j] = 0.; | 752 buf[j] = 0.; |
861 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 753 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
862 #if defined (CS_VER) && (CS_VER >= 2) | |
863 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr); | 754 CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr); |
864 #else | |
865 CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xz, buf); | |
866 #endif | |
867 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); | 755 CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf); |
868 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 756 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
869 for (volatile octave_idx_type j = nr-1; j >= 0; j--) | 757 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
870 { | 758 { |
871 octave_quit (); | 759 octave_quit (); |
872 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 760 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
873 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); | 761 CXSPARSE_DNAME (_happly) (q.N ()->L, j, q.N ()->B[j], buf); |
874 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 762 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
875 } | 763 } |
876 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 764 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
877 #if defined (CS_VER) && (CS_VER >= 2) | |
878 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc); | 765 CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc); |
879 #else | |
880 CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xz); | |
881 #endif | |
882 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | 766 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
883 | 767 |
884 for (octave_idx_type j = 0; j < nc; j++) | 768 for (octave_idx_type j = 0; j < nc; j++) |
885 { | 769 { |
886 Complex tmp = Complex (Xx[j], Xz[j]); | 770 Complex tmp = Complex (Xx[j], Xz[j]); |