The R Project SVN R

Rev

Rev 33282 | Rev 36557 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 33282 Rev 33387
Line 65... Line 65...
65
			 &n, &p, xvals, &n, REAL(s),
65
			 &n, &p, xvals, &n, REAL(s),
66
			 REAL(u), INTEGER(getAttrib(u, R_DimSymbol)),
66
			 REAL(u), INTEGER(getAttrib(u, R_DimSymbol)),
67
			 REAL(v), INTEGER(getAttrib(v, R_DimSymbol)),
67
			 REAL(v), INTEGER(getAttrib(v, R_DimSymbol)),
68
			 &tmp, &lwork, &info);
68
			 &tmp, &lwork, &info);
69
	if (info != 0)
69
	if (info != 0)
70
	    error(_("error code %d from Lapack routine %s"), info, "dgesvd");
70
	    error(_("error code %d from Lapack routine '%s'"), info, "dgesvd");
71
	lwork = (int) tmp;
71
	lwork = (int) tmp;
72
 
72
 
73
	work = (double *) R_alloc(lwork, sizeof(double));
73
	work = (double *) R_alloc(lwork, sizeof(double));
74
	F77_CALL(dgesvd)(CHAR(STRING_ELT(jobu, 0)), CHAR(STRING_ELT(jobv, 0)),
74
	F77_CALL(dgesvd)(CHAR(STRING_ELT(jobu, 0)), CHAR(STRING_ELT(jobv, 0)),
75
			 &n, &p, xvals, &n, REAL(s),
75
			 &n, &p, xvals, &n, REAL(s),
76
			 REAL(u), INTEGER(getAttrib(u, R_DimSymbol)),
76
			 REAL(u), INTEGER(getAttrib(u, R_DimSymbol)),
77
			 REAL(v), INTEGER(getAttrib(v, R_DimSymbol)),
77
			 REAL(v), INTEGER(getAttrib(v, R_DimSymbol)),
78
			 work, &lwork, &info);
78
			 work, &lwork, &info);
79
	if (info != 0)
79
	if (info != 0)
80
	    error(_("error code %d from Lapack routine %s"), info, "dgesvd");
80
	    error(_("error code %d from Lapack routine '%s'"), info, "dgesvd");
81
    } else {
81
    } else {
82
	int ldu = INTEGER(getAttrib(u, R_DimSymbol))[0],
82
	int ldu = INTEGER(getAttrib(u, R_DimSymbol))[0],
83
	    ldvt = INTEGER(getAttrib(v, R_DimSymbol))[0];
83
	    ldvt = INTEGER(getAttrib(v, R_DimSymbol))[0];
84
	int *iwork= (int *) R_alloc(8*(n<p ? n : p), sizeof(int));
84
	int *iwork= (int *) R_alloc(8*(n<p ? n : p), sizeof(int));
85
 
85
 
Line 89... Line 89...
89
			 &n, &p, xvals, &n, REAL(s),
89
			 &n, &p, xvals, &n, REAL(s),
90
			 REAL(u), &ldu,
90
			 REAL(u), &ldu,
91
			 REAL(v), &ldvt,
91
			 REAL(v), &ldvt,
92
			 &tmp, &lwork, iwork, &info);
92
			 &tmp, &lwork, iwork, &info);
93
	if (info != 0)
93
	if (info != 0)
94
	    error(_("error code %d from Lapack routine %s"), info, "dgesdd");
94
	    error(_("error code %d from Lapack routine '%s'"), info, "dgesdd");
95
	lwork = (int) tmp;
95
	lwork = (int) tmp;
96
	work = (double *) R_alloc(lwork, sizeof(double));
96
	work = (double *) R_alloc(lwork, sizeof(double));
97
	F77_CALL(dgesdd)(CHAR(STRING_ELT(jobu, 0)),
97
	F77_CALL(dgesdd)(CHAR(STRING_ELT(jobu, 0)),
98
			 &n, &p, xvals, &n, REAL(s),
98
			 &n, &p, xvals, &n, REAL(s),
99
			 REAL(u), &ldu,
99
			 REAL(u), &ldu,
100
			 REAL(v), &ldvt,
100
			 REAL(v), &ldvt,
101
			 work, &lwork, iwork, &info);
101
			 work, &lwork, iwork, &info);
102
	if (info != 0)
102
	if (info != 0)
103
	    error(_("error code %d from Lapack routine %s"), info, "dgesdd");
103
	    error(_("error code %d from Lapack routine '%s'"), info, "dgesdd");
104
    }
104
    }
105
 
105
 
106
    val = PROTECT(allocVector(VECSXP, 3));
106
    val = PROTECT(allocVector(VECSXP, 3));
107
    nm = PROTECT(allocVector(STRSXP, 3));
107
    nm = PROTECT(allocVector(STRSXP, 3));
108
    SET_STRING_ELT(nm, 0, mkChar("d"));
108
    SET_STRING_ELT(nm, 0, mkChar("d"));
Line 153... Line 153...
153
	F77_CALL(dsyev)(jobv, uplo, &n, rx, &n, rvalues, &tmp, &lwork, &info);
153
	F77_CALL(dsyev)(jobv, uplo, &n, rx, &n, rvalues, &tmp, &lwork, &info);
154
#else
154
#else
155
        F77_CALL(rsyev)(jobv, uplo, &n, rx, &n, rvalues, &tmp, &lwork, &info);
155
        F77_CALL(rsyev)(jobv, uplo, &n, rx, &n, rvalues, &tmp, &lwork, &info);
156
#endif
156
#endif
157
	if (info != 0)
157
	if (info != 0)
158
	    error(_("error code %d from Lapack routine %s"), info, "dsyev");
158
	    error(_("error code %d from Lapack routine '%s'"), info, "dsyev");
159
	lwork = (int) tmp;
159
	lwork = (int) tmp;
160
	if (lwork < 3*n-1) lwork = 3*n-1;  /* Sanity check */
160
	if (lwork < 3*n-1) lwork = 3*n-1;  /* Sanity check */
161
	work = (double *) R_alloc(lwork, sizeof(double));
161
	work = (double *) R_alloc(lwork, sizeof(double));
162
#ifdef HAVE_LAPACK
162
#ifdef HAVE_LAPACK
163
	F77_CALL(dsyev)(jobv, uplo, &n, rx, &n, rvalues, work, &lwork, &info);
163
	F77_CALL(dsyev)(jobv, uplo, &n, rx, &n, rvalues, work, &lwork, &info);
164
#else
164
#else
165
        F77_CALL(rsyev)(jobv, uplo, &n, rx, &n, rvalues, work, &lwork, &info);
165
        F77_CALL(rsyev)(jobv, uplo, &n, rx, &n, rvalues, work, &lwork, &info);
166
#endif
166
#endif
167
	if (info != 0)
167
	if (info != 0)
168
	    error(_("error code %d from Lapack routine %s"), info, "dsyev");
168
	    error(_("error code %d from Lapack routine '%s'"), info, "dsyev");
169
    } else {
169
    } else {
170
	int liwork, *iwork, itmp, m;
170
	int liwork, *iwork, itmp, m;
171
	double vl = 0.0, vu = 0.0, abstol = 0.0; 
171
	double vl = 0.0, vu = 0.0, abstol = 0.0; 
172
	/* valgrind seems to think vu should be set, but it is documented 
172
	/* valgrind seems to think vu should be set, but it is documented 
173
	   not to be used if range='a' */
173
	   not to be used if range='a' */
Line 188... Line 188...
188
                         &vl, &vu, &il, &iu, &abstol, &m, rvalues,
188
                         &vl, &vu, &il, &iu, &abstol, &m, rvalues,
189
                         REAL(z), &n, isuppz,
189
                         REAL(z), &n, isuppz,
190
                         &tmp, &lwork, &itmp, &liwork, &info);
190
                         &tmp, &lwork, &itmp, &liwork, &info);
191
#endif
191
#endif
192
	if (info != 0)
192
	if (info != 0)
193
	    error(_("error code %d from Lapack routine %s"), info, "dsyevr");
193
	    error(_("error code %d from Lapack routine '%s'"), info, "dsyevr");
194
	lwork = (int) tmp;
194
	lwork = (int) tmp;
195
	liwork = itmp;
195
	liwork = itmp;
196
 
196
 
197
	work = (double *) R_alloc(lwork, sizeof(double));
197
	work = (double *) R_alloc(lwork, sizeof(double));
198
	iwork = (int *) R_alloc(liwork, sizeof(int));
198
	iwork = (int *) R_alloc(liwork, sizeof(int));
Line 206... Line 206...
206
                         &vl, &vu, &il, &iu, &abstol, &m, rvalues,
206
                         &vl, &vu, &il, &iu, &abstol, &m, rvalues,
207
                         REAL(z), &n, isuppz,
207
                         REAL(z), &n, isuppz,
208
                         work, &lwork, iwork, &liwork, &info);
208
                         work, &lwork, iwork, &liwork, &info);
209
#endif
209
#endif
210
	if (info != 0)
210
	if (info != 0)
211
	    error(_("error code %d from Lapack routine %s"), info, "dsyevr");
211
	    error(_("error code %d from Lapack routine '%s'"), info, "dsyevr");
212
    }
212
    }
213
 
213
 
214
    if (!ov) {
214
    if (!ov) {
215
	ret = PROTECT(allocVector(VECSXP, 2));
215
	ret = PROTECT(allocVector(VECSXP, 2));
216
	nm = PROTECT(allocVector(STRSXP, 2));
216
	nm = PROTECT(allocVector(STRSXP, 2));
Line 291... Line 291...
291
#else
291
#else
292
    F77_CALL(rgeev)(jobVL, jobVR, &n, xvals, &n, wR, wI,
292
    F77_CALL(rgeev)(jobVL, jobVR, &n, xvals, &n, wR, wI,
293
		    left, &n, right, &n, &tmp, &lwork, &info);
293
		    left, &n, right, &n, &tmp, &lwork, &info);
294
#endif
294
#endif
295
    if (info != 0)
295
    if (info != 0)
296
	error(_("error code %d from Lapack routine %s"), info, "dgeev");
296
	error(_("error code %d from Lapack routine '%s'"), info, "dgeev");
297
    lwork = (int) tmp;
297
    lwork = (int) tmp;
298
    work = (double *) R_alloc(lwork, sizeof(double));
298
    work = (double *) R_alloc(lwork, sizeof(double));
299
#ifdef HAVE_LAPACK
299
#ifdef HAVE_LAPACK
300
    F77_CALL(dgeev)(jobVL, jobVR, &n, xvals, &n, wR, wI,
300
    F77_CALL(dgeev)(jobVL, jobVR, &n, xvals, &n, wR, wI,
301
		    left, &n, right, &n, work, &lwork, &info);
301
		    left, &n, right, &n, work, &lwork, &info);
302
#else
302
#else
303
    F77_CALL(rgeev)(jobVL, jobVR, &n, xvals, &n, wR, wI,
303
    F77_CALL(rgeev)(jobVL, jobVR, &n, xvals, &n, wR, wI,
304
		    left, &n, right, &n, work, &lwork, &info);
304
		    left, &n, right, &n, work, &lwork, &info);
305
#endif
305
#endif
306
    if (info != 0)
306
    if (info != 0)
307
	error(_("error code %d from Lapack routine %s"), info, "dgeev");
307
	error(_("error code %d from Lapack routine '%s'"), info, "dgeev");
308
 
308
 
309
    complexValues = FALSE;
309
    complexValues = FALSE;
310
    for (i = 0; i < n; i++)
310
    for (i = 0; i < n; i++)
311
	if (wI[i] != 0.0) { complexValues = TRUE; break; }
311
	if (wI[i] != 0.0) { complexValues = TRUE; break; }
312
    ret = PROTECT(allocVector(VECSXP, 2));
312
    ret = PROTECT(allocVector(VECSXP, 2));
Line 406... Line 406...
406
    tau = PROTECT(allocVector(CPLXSXP, m < n ? m : n));
406
    tau = PROTECT(allocVector(CPLXSXP, m < n ? m : n));
407
    lwork = -1;
407
    lwork = -1;
408
    F77_CALL(zgeqp3)(&m, &n, COMPLEX(A), &m, INTEGER(jpvt), COMPLEX(tau),
408
    F77_CALL(zgeqp3)(&m, &n, COMPLEX(A), &m, INTEGER(jpvt), COMPLEX(tau),
409
		     &tmp, &lwork, rwork, &info);
409
		     &tmp, &lwork, rwork, &info);
410
    if (info != 0)
410
    if (info != 0)
411
	error(_("error code %d from Lapack routine %s"), info, "zgeqp3");
411
	error(_("error code %d from Lapack routine '%s'"), info, "zgeqp3");
412
    lwork = (int) tmp.r;
412
    lwork = (int) tmp.r;
413
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
413
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
414
    F77_CALL(zgeqp3)(&m, &n, COMPLEX(A), &m, INTEGER(jpvt), COMPLEX(tau),
414
    F77_CALL(zgeqp3)(&m, &n, COMPLEX(A), &m, INTEGER(jpvt), COMPLEX(tau),
415
		     work, &lwork, rwork, &info);
415
		     work, &lwork, rwork, &info);
416
    if (info != 0)
416
    if (info != 0)
417
	error(_("error code %d from Lapack routine %s"), info, "zgeqp3");
417
	error(_("error code %d from Lapack routine '%s'"), info, "zgeqp3");
418
    val = PROTECT(allocVector(VECSXP, 4));
418
    val = PROTECT(allocVector(VECSXP, 4));
419
    nm = PROTECT(allocVector(STRSXP, 4));
419
    nm = PROTECT(allocVector(STRSXP, 4));
420
    rank = PROTECT(allocVector(INTSXP, 1));
420
    rank = PROTECT(allocVector(INTSXP, 1));
421
    INTEGER(rank)[0] = m < n ? m : n;
421
    INTEGER(rank)[0] = m < n ? m : n;
422
    SET_STRING_ELT(nm, 0, mkChar("qr"));
422
    SET_STRING_ELT(nm, 0, mkChar("qr"));
Line 457... Line 457...
457
    lwork = -1;
457
    lwork = -1;
458
    F77_CALL(zunmqr)("L", "C", &n, &nrhs, &k,
458
    F77_CALL(zunmqr)("L", "C", &n, &nrhs, &k,
459
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
459
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
460
		     &tmp, &lwork, &info);
460
		     &tmp, &lwork, &info);
461
    if (info != 0)
461
    if (info != 0)
462
	error(_("error code %d from Lapack routine %s"), info, "zunmqr");
462
	error(_("error code %d from Lapack routine '%s'"), info, "zunmqr");
463
    lwork = (int) tmp.r;
463
    lwork = (int) tmp.r;
464
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
464
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
465
    F77_CALL(zunmqr)("L", "C", &n, &nrhs, &k,
465
    F77_CALL(zunmqr)("L", "C", &n, &nrhs, &k,
466
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
466
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
467
		     work, &lwork, &info);
467
		     work, &lwork, &info);
468
    if (info != 0)
468
    if (info != 0)
469
	error(_("error code %d from Lapack routine %s"), info, "zunmqr");
469
	error(_("error code %d from Lapack routine '%s'"), info, "zunmqr");
470
    F77_CALL(ztrtrs)("U", "N", "N", &k, &nrhs,
470
    F77_CALL(ztrtrs)("U", "N", "N", &k, &nrhs,
471
		     COMPLEX(qr), &n, COMPLEX(B), &n, &info);
471
		     COMPLEX(qr), &n, COMPLEX(B), &n, &info);
472
    if (info != 0)
472
    if (info != 0)
473
	error(_("error code %d from Lapack routine %s"), info, "ztrtrs");
473
	error(_("error code %d from Lapack routine '%s'"), info, "ztrtrs");
474
    UNPROTECT(1);
474
    UNPROTECT(1);
475
    return B;
475
    return B;
476
#else
476
#else
477
    error(_("Fortran complex functions are not available on this platform"));
477
    error(_("Fortran complex functions are not available on this platform"));
478
    return R_NilValue; /* -Wall */
478
    return R_NilValue; /* -Wall */
Line 502... Line 502...
502
    lwork = -1;
502
    lwork = -1;
503
    F77_CALL(zunmqr)("L", tr ? "C" : "N", &n, &nrhs, &k,
503
    F77_CALL(zunmqr)("L", tr ? "C" : "N", &n, &nrhs, &k,
504
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
504
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
505
		     &tmp, &lwork, &info);
505
		     &tmp, &lwork, &info);
506
    if (info != 0)
506
    if (info != 0)
507
	error(_("error code %d from Lapack routine %s"), info, "zunmqr");
507
	error(_("error code %d from Lapack routine '%s'"), info, "zunmqr");
508
    lwork = (int) tmp.r;
508
    lwork = (int) tmp.r;
509
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
509
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
510
    F77_CALL(zunmqr)("L", tr ? "C" : "N", &n, &nrhs, &k,
510
    F77_CALL(zunmqr)("L", tr ? "C" : "N", &n, &nrhs, &k,
511
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
511
		     COMPLEX(qr), &n, COMPLEX(tau), COMPLEX(B), &n,
512
		     work, &lwork, &info);
512
		     work, &lwork, &info);
513
    if (info != 0)
513
    if (info != 0)
514
	error(_("error code %d from Lapack routine %s"), info, "zunmqr");
514
	error(_("error code %d from Lapack routine '%s'"), info, "zunmqr");
515
    UNPROTECT(1);
515
    UNPROTECT(1);
516
    return B;
516
    return B;
517
#else
517
#else
518
    error(_("Fortran complex functions are not available on this platform"));
518
    error(_("Fortran complex functions are not available on this platform"));
519
    return R_NilValue; /* -Wall */
519
    return R_NilValue; /* -Wall */
Line 540... Line 540...
540
		     &n, &p, COMPLEX(x), &n, REAL(s),
540
		     &n, &p, COMPLEX(x), &n, REAL(s),
541
		     COMPLEX(u), INTEGER(getAttrib(u, R_DimSymbol)),
541
		     COMPLEX(u), INTEGER(getAttrib(u, R_DimSymbol)),
542
		     COMPLEX(v), INTEGER(getAttrib(v, R_DimSymbol)),
542
		     COMPLEX(v), INTEGER(getAttrib(v, R_DimSymbol)),
543
		     &tmp, &lwork, rwork, &info);
543
		     &tmp, &lwork, rwork, &info);
544
    if (info != 0)
544
    if (info != 0)
545
	error(_("error code %d from Lapack routine %s"), info, "zgesvd");
545
	error(_("error code %d from Lapack routine '%s'"), info, "zgesvd");
546
    lwork = (int) tmp.r;
546
    lwork = (int) tmp.r;
547
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
547
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
548
    F77_CALL(zgesvd)(CHAR(STRING_ELT(jobu, 0)), CHAR(STRING_ELT(jobv, 0)),
548
    F77_CALL(zgesvd)(CHAR(STRING_ELT(jobu, 0)), CHAR(STRING_ELT(jobv, 0)),
549
		     &n, &p, COMPLEX(x), &n, REAL(s),
549
		     &n, &p, COMPLEX(x), &n, REAL(s),
550
		     COMPLEX(u), INTEGER(getAttrib(u, R_DimSymbol)),
550
		     COMPLEX(u), INTEGER(getAttrib(u, R_DimSymbol)),
551
		     COMPLEX(v), INTEGER(getAttrib(v, R_DimSymbol)),
551
		     COMPLEX(v), INTEGER(getAttrib(v, R_DimSymbol)),
552
		     work, &lwork, rwork, &info);
552
		     work, &lwork, rwork, &info);
553
    if (info != 0)
553
    if (info != 0)
554
	error(_("error code %d from Lapack routine %s"), info, "zgesvd");
554
	error(_("error code %d from Lapack routine '%s'"), info, "zgesvd");
555
    val = PROTECT(allocVector(VECSXP, 3));
555
    val = PROTECT(allocVector(VECSXP, 3));
556
    nm = PROTECT(allocVector(STRSXP, 3));
556
    nm = PROTECT(allocVector(STRSXP, 3));
557
    SET_STRING_ELT(nm, 0, mkChar("d"));
557
    SET_STRING_ELT(nm, 0, mkChar("d"));
558
    SET_STRING_ELT(nm, 1, mkChar("u"));
558
    SET_STRING_ELT(nm, 1, mkChar("u"));
559
    SET_STRING_ELT(nm, 2, mkChar("vt"));
559
    SET_STRING_ELT(nm, 2, mkChar("vt"));
Line 595... Line 595...
595
    /* ask for optimal size of work array */
595
    /* ask for optimal size of work array */
596
    lwork = -1;
596
    lwork = -1;
597
    F77_CALL(zheev)(jobv, uplo, &n, rx, &n, rvalues, &tmp, &lwork, rwork,
597
    F77_CALL(zheev)(jobv, uplo, &n, rx, &n, rvalues, &tmp, &lwork, rwork,
598
		    &info);
598
		    &info);
599
    if (info != 0)
599
    if (info != 0)
600
	error(_("error code %d from Lapack routine %s"), info, "zheev");
600
	error(_("error code %d from Lapack routine '%s'"), info, "zheev");
601
    lwork = (int) tmp.r;
601
    lwork = (int) tmp.r;
602
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
602
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
603
    F77_CALL(zheev)(jobv, uplo, &n, rx, &n, rvalues, work, &lwork, rwork,
603
    F77_CALL(zheev)(jobv, uplo, &n, rx, &n, rvalues, work, &lwork, rwork,
604
		    &info);
604
		    &info);
605
    if (info != 0)
605
    if (info != 0)
606
	error(_("error code %d from Lapack routine %s"), info, "zheev");
606
	error(_("error code %d from Lapack routine '%s'"), info, "zheev");
607
    if (!ov) {
607
    if (!ov) {
608
	ret = PROTECT(allocVector(VECSXP, 2));
608
	ret = PROTECT(allocVector(VECSXP, 2));
609
	nm = PROTECT(allocVector(STRSXP, 2));
609
	nm = PROTECT(allocVector(STRSXP, 2));
610
	SET_STRING_ELT(nm, 1, mkChar("vectors"));
610
	SET_STRING_ELT(nm, 1, mkChar("vectors"));
611
	SET_VECTOR_ELT(ret, 1, x);
611
	SET_VECTOR_ELT(ret, 1, x);
Line 656... Line 656...
656
    /* ask for optimal size of work array */
656
    /* ask for optimal size of work array */
657
    lwork = -1;
657
    lwork = -1;
658
    F77_CALL(zgeev)(jobVL, jobVR, &n, xvals, &n, COMPLEX(values),
658
    F77_CALL(zgeev)(jobVL, jobVR, &n, xvals, &n, COMPLEX(values),
659
		    left, &n, right, &n, &tmp, &lwork, rwork, &info);
659
		    left, &n, right, &n, &tmp, &lwork, rwork, &info);
660
    if (info != 0)
660
    if (info != 0)
661
	error(_("error code %d from Lapack routine %s"), info, "zgeev");
661
	error(_("error code %d from Lapack routine '%s'"), info, "zgeev");
662
    lwork = (int) tmp.r;
662
    lwork = (int) tmp.r;
663
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
663
    work = (Rcomplex *) R_alloc(lwork, sizeof(Rcomplex));
664
    F77_CALL(zgeev)(jobVL, jobVR, &n, xvals, &n, COMPLEX(values),
664
    F77_CALL(zgeev)(jobVL, jobVR, &n, xvals, &n, COMPLEX(values),
665
		    left, &n, right, &n, work, &lwork, rwork, &info);
665
		    left, &n, right, &n, work, &lwork, rwork, &info);
666
    if (info != 0)
666
    if (info != 0)
667
	error(_("error code %d from Lapack routine %s"), info, "zgeev");
667
	error(_("error code %d from Lapack routine '%s'"), info, "zgeev");
668
 
668
 
669
    if(!ov){
669
    if(!ov){
670
	ret = PROTECT(allocVector(VECSXP, 2));
670
	ret = PROTECT(allocVector(VECSXP, 2));
671
	nm = PROTECT(allocVector(STRSXP, 2));
671
	nm = PROTECT(allocVector(STRSXP, 2));
672
	SET_STRING_ELT(nm, 1, mkChar("vectors"));
672
	SET_STRING_ELT(nm, 1, mkChar("vectors"));
Line 822... Line 822...
822
    tau = PROTECT(allocVector(REALSXP, m < n ? m : n));
822
    tau = PROTECT(allocVector(REALSXP, m < n ? m : n));
823
    lwork = -1;
823
    lwork = -1;
824
    F77_CALL(dgeqp3)(&m, &n, REAL(A), &m, INTEGER(jpvt), REAL(tau),
824
    F77_CALL(dgeqp3)(&m, &n, REAL(A), &m, INTEGER(jpvt), REAL(tau),
825
		     &tmp, &lwork, &info);
825
		     &tmp, &lwork, &info);
826
    if (info < 0)
826
    if (info < 0)
827
	error(_("error code %d from Lapack routine %s"), info, "dgeqp3");
827
	error(_("error code %d from Lapack routine '%s'"), info, "dgeqp3");
828
    lwork = (int) tmp;
828
    lwork = (int) tmp;
829
    work = (double *) R_alloc(lwork, sizeof(double));
829
    work = (double *) R_alloc(lwork, sizeof(double));
830
    F77_CALL(dgeqp3)(&m, &n, REAL(A), &m, INTEGER(jpvt), REAL(tau),
830
    F77_CALL(dgeqp3)(&m, &n, REAL(A), &m, INTEGER(jpvt), REAL(tau),
831
		     work, &lwork, &info);
831
		     work, &lwork, &info);
832
    if (info < 0)
832
    if (info < 0)
833
	error(_("error code %d from Lapack routine %s"), info, "dgeqp3");
833
	error(_("error code %d from Lapack routine '%s'"), info, "dgeqp3");
834
    val = PROTECT(allocVector(VECSXP, 4));
834
    val = PROTECT(allocVector(VECSXP, 4));
835
    nm = PROTECT(allocVector(STRSXP, 4));
835
    nm = PROTECT(allocVector(STRSXP, 4));
836
    rank = PROTECT(allocVector(INTSXP, 1));
836
    rank = PROTECT(allocVector(INTSXP, 1));
837
    INTEGER(rank)[0] = m < n ? m : n;
837
    INTEGER(rank)[0] = m < n ? m : n;
838
    SET_STRING_ELT(nm, 0, mkChar("qr"));
838
    SET_STRING_ELT(nm, 0, mkChar("qr"));
Line 868... Line 868...
868
    lwork = -1;
868
    lwork = -1;
869
    F77_CALL(dormqr)("L", "T", &n, &nrhs, &k,
869
    F77_CALL(dormqr)("L", "T", &n, &nrhs, &k,
870
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
870
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
871
		     &tmp, &lwork, &info);
871
		     &tmp, &lwork, &info);
872
    if (info != 0)
872
    if (info != 0)
873
	error(_("error code %d from Lapack routine %s"), info, "dormqr");
873
	error(_("error code %d from Lapack routine '%s'"), info, "dormqr");
874
    lwork = (int) tmp;
874
    lwork = (int) tmp;
875
    work = (double *) R_alloc(lwork, sizeof(double));
875
    work = (double *) R_alloc(lwork, sizeof(double));
876
    F77_CALL(dormqr)("L", "T", &n, &nrhs, &k,
876
    F77_CALL(dormqr)("L", "T", &n, &nrhs, &k,
877
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
877
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
878
		     work, &lwork, &info);
878
		     work, &lwork, &info);
879
    if (info != 0)
879
    if (info != 0)
880
	error(_("error code %d from Lapack routine %s"), info, "dormqr");
880
	error(_("error code %d from Lapack routine '%s'"), info, "dormqr");
881
    F77_CALL(dtrtrs)("U", "N", "N", &k, &nrhs,
881
    F77_CALL(dtrtrs)("U", "N", "N", &k, &nrhs,
882
		     REAL(qr), &n, REAL(B), &n, &info);
882
		     REAL(qr), &n, REAL(B), &n, &info);
883
    if (info != 0)
883
    if (info != 0)
884
	error(_("error code %d from Lapack routine %s"), info, "dtrtrs");
884
	error(_("error code %d from Lapack routine '%s'"), info, "dtrtrs");
885
    UNPROTECT(1);
885
    UNPROTECT(1);
886
    return B;
886
    return B;
887
}
887
}
888
 
888
 
889
static SEXP modqr_qy_real(SEXP Q, SEXP Bin, SEXP trans)
889
static SEXP modqr_qy_real(SEXP Q, SEXP Bin, SEXP trans)
Line 908... Line 908...
908
    lwork = -1;
908
    lwork = -1;
909
    F77_CALL(dormqr)("L", tr ? "T" : "N", &n, &nrhs, &k,
909
    F77_CALL(dormqr)("L", tr ? "T" : "N", &n, &nrhs, &k,
910
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
910
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
911
		     &tmp, &lwork, &info);
911
		     &tmp, &lwork, &info);
912
    if (info != 0)
912
    if (info != 0)
913
	error(_("error code %d from Lapack routine %s"), info, "dormqr");
913
	error(_("error code %d from Lapack routine '%s'"), info, "dormqr");
914
    lwork = (int) tmp;
914
    lwork = (int) tmp;
915
    work = (double *) R_alloc(lwork, sizeof(double));
915
    work = (double *) R_alloc(lwork, sizeof(double));
916
    F77_CALL(dormqr)("L", tr ? "T" : "N", &n, &nrhs, &k,
916
    F77_CALL(dormqr)("L", tr ? "T" : "N", &n, &nrhs, &k,
917
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
917
		     REAL(qr), &n, REAL(tau), REAL(B), &n,
918
		     work, &lwork, &info);
918
		     work, &lwork, &info);
919
    if (info != 0)
919
    if (info != 0)
920
	error(_("error code %d from Lapack routine %s"), info, "dormqr");
920
	error(_("error code %d from Lapack routine '%s'"), info, "dormqr");
921
    UNPROTECT(1);
921
    UNPROTECT(1);
922
    return B;
922
    return B;
923
}
923
}
924
 
924
 
925
static SEXP moddet_ge_real(SEXP Ain, SEXP logarithm)
925
static SEXP moddet_ge_real(SEXP Ain, SEXP logarithm)
Line 939... Line 939...
939
	error(_("'A' must be a square matrix"));
939
	error(_("'A' must be a square matrix"));
940
    jpvt = (int *) R_alloc(n, sizeof(int));
940
    jpvt = (int *) R_alloc(n, sizeof(int));
941
    F77_CALL(dgetrf)(&n, &n, REAL(A), &n, jpvt, &info);
941
    F77_CALL(dgetrf)(&n, &n, REAL(A), &n, jpvt, &info);
942
    sign = 1;
942
    sign = 1;
943
    if (info < 0)
943
    if (info < 0)
944
	error(_("error code %d from Lapack routine %s"), info, "dgetrf");
944
	error(_("error code %d from Lapack routine '%s'"), info, "dgetrf");
945
    else if (info > 0) { /* Singular matrix:  U[i,i] (i := info) is 0 */
945
    else if (info > 0) { /* Singular matrix:  U[i,i] (i := info) is 0 */
946
	/*warning("Lapack dgetrf(): singular matrix: U[%d,%d]=0", info,info);*/
946
	/*warning("Lapack dgetrf(): singular matrix: U[%d,%d]=0", info,info);*/
947
	modulus = (useLog ? R_NegInf : 0.);
947
	modulus = (useLog ? R_NegInf : 0.);
948
    }
948
    }
949
    else {
949
    else {