Skip to content

Commit 97ba22a

Browse files
committed
version of 2009.05.07.12.55.00 (now is 06 Sep 2018).
1 parent d6250d8 commit 97ba22a

File tree

1 file changed

+67
-82
lines changed

1 file changed

+67
-82
lines changed

src/fdhess.c

+67-82
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
#endif
2222

2323
/* called from R : */
24+
void fdhpq(double *h, int *lh, double *w);
2425

2526
void fdcov(double *x, double *d__, double *hh,
2627
double *hd, double *cov, int *lcov, double *cor,
2728
int *lcor, double *se, double *w, int *info);
29+
/*-----------------------------------------------------------
2830
29-
void fdhpq(/*double *x, */double *h__, int *lh, double *w);
30-
31-
/* local to this file: */
31+
* local to this file: */
3232
static
3333
void hesdpq(double *, double, double *, double *, double *);
3434
static
@@ -45,86 +45,82 @@ void gradpq(double *g, double a[], double ajac[], int l_ajac);
4545

4646
/* Common Block Declarations --- included as "extern" */
4747
#define FD_EXTERNAL extern
48-
4948
#include "mach_comm.h"
49+
/*-> machfd_ */
5050
#include "maux_comm.h"
51-
51+
/*-> mauxfd_ */
5252
#include "gamm_comm.h"
53+
/*-> gammfd_ */
5354
#include "hess_comm.h"
55+
/*-> Dims, filtfd_, hessfd_, w_fil, w_opt */
56+
5457

5558

5659
/* Table of constant values */
5760
static int c__0 = 0;
5861
static int c__1 = 1;
5962
static int c__2 = 2;
60-
static int c__11 = 11;
6163

6264
static double c_0d = 0.;
6365
static double c_m1 = -1.;
6466

6567
/*******************************************************************************
6668
*******************************************************************************/
6769

68-
void fdhpq(/*double *x, */double *h__, int *lh, double *w)
70+
/* Called from R: Analytic Hessian with respect to p and q variables : */
71+
void fdhpq(double *h, int *lh, double *w)
6972
{
7073
/* double precision H(lH, pq1)
71-
*/
7274
73-
/* copyright 1991 Department of Statistics, University of Washington
75+
copyright 1991 Department of Statistics, University of Washington
7476
written by Chris Fraley
7577
-----------------------------------------------------------------------------
7678
Parameter adjustments */
7779
--w;
7880

79-
/* Function Body */
8081
hesspq_(&w[w_opt.lqp], &w[w_opt.la], &w[w_opt.lajac], &Dims.nm,
81-
h__, lh, &w[w_opt.lwa4], &w[w_opt.lwa1]);
82+
h, lh, &w[w_opt.lwa4], &w[w_opt.lwa1]);
8283
/* call dcopy( pq1, zero, 0, H(1,1), lH) */
8384
/* call dcopy( pq , zero, 0, H(2,1), 1) */
8485
return;
8586
} /* fdhpq */
8687

8788
/*******************************************************************************
88-
****************************************************************************** */
89+
*******************************************************************************/
8990

9091
void fdcov(double *x, double *d__, double *hh,
9192
double *hd, double *cov, int *lcov, double *cor,
9293
int *lcor, double *se, double *w, int *info)
9394
{
94-
/* System generated locals */
95-
int cov_dim1, cov_offset, cor_dim1, cor_offset, pq1, i2;
96-
double d__1;
97-
98-
/* Local variables */
99-
int i, j, k, le, ls, lu, lv, lwork;
100-
double temp;
95+
/* float x(n)
96+
double precision d, hh, hd(pq1), cov(lcov,pq1), cor(lcor,pq1),
97+
se(pq1), w(*)
10198
102-
/* float x(n)
103-
double precision d, hh, hd(pq1), cov(lcov,pq1),
104-
* cor(lcor,pq1), se(pq1)
10599
copyright 1991 Department of Statistics, University of Washington
106100
written by Chris Fraley
107101
----------------------------------------------------------------------------*/
108102

103+
const int c__11 = 11;
104+
int i, j, k, le, ls, lu, lv, lwork, pq1 = Dims.pq1;
105+
double temp;
106+
109107
/* Parameter adjustments */
108+
int cov_dim1, cov_offset, cor_dim1, cor_offset;
110109
cov_dim1 = *lcov; cov_offset = 1 + cov_dim1; cov -= cov_offset;
111110
cor_dim1 = *lcor; cor_offset = 1 + cor_dim1; cor -= cor_offset;
112111
--se;
113112
--w;
114113

115-
/* Function Body */
116-
pq1 = Dims.pq1;
117-
118114
hesdpq(x, *d__, hh, hd, &w[1]);
115+
/* ====== ^^ */
119116
F77_CALL(dcopy)(&pq1, hd, &c__1, &cov[cov_offset], lcov);
120117

121118
gammfd_.igamma = 0;
122119
gammfd_.jgamma = 0;
123-
hessfd_.ksvd = 0;
120+
/* hessfd_.ksvd = 0; */
124121
hessfd_.kcov = 0;
125122
hessfd_.kcor = 0;
126123
*info = 0;
127-
temp = 1.;
128124

129125
for (i = 1; i <= pq1; ++i) {
130126
for (j = i + 1; j <= pq1; ++j) {
@@ -136,17 +132,19 @@ void fdcov(double *x, double *d__, double *hh,
136132
lv = lu + pq1 * pq1;
137133
le = lv + pq1 * pq1;
138134
lwork = le + pq1;
139-
/* lfree = lwork + pq1 */
135+
/* lfree = lwork + pq1 */
136+
137+
/*Linpack: dsvdc(x, ldx, n,p, s, e,u,ldu, v,ldv, work, job,info) */
140138
F77_CALL(dsvdc)(&cov[cov_offset], lcov, &pq1, &pq1, &w[ls],
141139
&w[le], &w[lu], &pq1, &w[lv], &pq1, &w[lwork],
142-
&c__11, info);
140+
(int*)&c__11, info);
143141
if (*info != 0) {
144142
F77_CALL(dcopy)(&pq1, &c_0d, &c__0, &se[1], &c__1);
145143
for (j = 1; j <= pq1; ++j) {
146144
F77_CALL(dcopy)(&pq1, &c_0d, &c__0,
147-
&cov[j * cov_dim1 + 1], & c__1);
145+
&cov[j * cov_dim1 + 1], &c__1);
148146
}
149-
hessfd_.ksvd = 1;
147+
/* hessfd_.ksvd = 1; */
150148
*info = 3;
151149
return;
152150
}
@@ -166,12 +164,13 @@ void fdcov(double *x, double *d__, double *hh,
166164
}
167165
}
168166
if (temp == 1.) {
167+
double d__1;
169168
for (k = 1; k <= pq1; ++k) {
170169
F77_CALL(dcopy)(&k, &cov[k * cov_dim1 + 1], &c__1,
171170
&cor[k * cor_dim1 + 1], &c__1);
172171
}
173172
for (i = 1; i <= pq1; ++i) {
174-
i2 = pq1 - i + 1;
173+
int i2 = pq1 - i + 1;
175174
d__1 = 1. / se[i];
176175
F77_CALL(dscal)(&i2, &d__1, &cor[i + i * cor_dim1], lcor);
177176
}
@@ -192,7 +191,7 @@ void fdcov(double *x, double *d__, double *hh,
192191

193192
if (gammfd_.igamma != 0) *info = 4;
194193
if (gammfd_.jgamma != 0) *info = 1;
195-
if (hessfd_.ksvd != 0) *info = 3;
194+
/* if (hessfd_.ksvd != 0) *info = 3; */
196195
if (hessfd_.kcov != 0) *info = 2;
197196
if (hessfd_.kcor != 0) *info = 3;
198197
return;
@@ -204,7 +203,8 @@ void fdcov(double *x, double *d__, double *hh,
204203
invsvd_(double *s, double *u, int *lu,
205204
double *v, int *lv, double *cov, int *lcov)
206205
{
207-
/* double precision s(pq1), u(lu,pq1), v(lv,pq1), cov(lcov,pq1)
206+
/* double precision s(pq1), u(lu,pq1), v(lv,pq1), cov(lcov,pq1)
207+
208208
copyright 1991 Department of Statistics, University of Washington
209209
written by Chris Fraley
210210
---------------------------------------------------------------------------*/
@@ -271,78 +271,67 @@ invsvd_(double *s, double *u, int *lu,
271271
******************************************************************************
272272
*****************************************************************************/
273273

274-
void hesspq_(double *qp, double *a, double *ajac,
275-
int *lajac, double *h__, int *lh, double *aij, double *g)
274+
/* analytic Hessian with respect to p and q variables */
275+
void hesspq_(double *qp, double *a, double *ajac, int *lajac,
276+
/* output: h[.,.], aij[.], g[.] : */
277+
double *h__, int *lh, double *aij, double *g)
276278
{
277279
/* double precision qp(pq), a(nm), ajac(nm,pq)
278280
double precision H(lH,pq1), aij(nm), g(pq)
279281
280-
analytic Hessian with respect to p and q variables
281282
copyright 1991 Department of Statistics, University of Washington
282283
written by Chris Fraley
283284
----------------------------------------------------------------------------*/
284285

285-
/* System generated locals */
286-
int ajac_dim1 = *lajac, ajac_offset;
287-
int h_dim1 = *lh;
288-
int i1, i2, i3;
289-
290-
/* Local variables */
291286
int i, j, k, l, km;
292287
double s, t, u, fac;
288+
int n = Dims.n, p = Dims.p, q = Dims.q;
293289

294290
/* Parameter adjustments */
291+
int ajac_dim1 = *lajac, ajac_offset;
292+
int h_dim1 = *lh;
295293
--qp;
296294
ajac_offset = 1 + ajac_dim1; ajac -= ajac_offset;
297295
--aij;
298296
--g;
299297

300298
fac = 1. / (filtfd_.wnv * (double) (Dims.nm - 1));
301-
if (Dims.q != 0 && Dims.p != 0) {
299+
if (q != 0 && p != 0) {
302300
for (k = 1; k <= Dims.pq; ++k) {
303301
g[k] = F77_CALL(ddot)(&Dims.nm, a, &c__1,
304302
&ajac[k * ajac_dim1 + 1], &c__1);
305303
}
306-
i1 = Dims.p;
307-
i2 = Dims.q;
308-
i3 = Dims.n;
309-
for (i = 1; i <= i1; ++i) {
310-
int i_aj = (Dims.q + i)* ajac_dim1;
311-
u = g[Dims.q + i];
312-
for (j = 1; j <= i2; ++j) {
304+
for (i = 1; i <= p; ++i) {
305+
int i_aj = (q + i)* ajac_dim1;
306+
u = g[q + i];
307+
for (j = 1; j <= q; ++j) {
313308
u *= g[j];
314-
for (k = Dims.maxpq1; k <= i3; ++k) {
309+
for (k = Dims.maxpq1; k <= n; ++k) {
315310
km = k - Dims.maxpq;
316311
t = 0.;
317-
for (l = 1; l < km && l <= i2; ++l)
312+
for (l = 1; l < km && l <= q; ++l)
318313
t += qp[l] * aij[km - l];
319314

320-
if (km > j)
321-
aij[km] = ajac[km - j + i_aj] + t;
322-
else
323-
aij[km] = t;
315+
aij[km] = (km > j) ? ajac[km - j + i_aj] + t : t;
324316
}
325317
s = F77_CALL(ddot)(&Dims.nm, &ajac[i_aj + 1], &c__1,
326318
&ajac[j * ajac_dim1 + 1], &c__1);
327319
t = F77_CALL(ddot)(&Dims.nm, a, &c__1, &aij[1], &c__1);
328-
h__[i + (Dims.p + j) * h_dim1] =
329-
- Dims.n * (s + t - 2 * fac * u) * fac;
320+
h__[i + (p + j) * h_dim1] = - n * (s + t - 2 * fac * u) * fac;
330321
}
331322
}
332323
}
333-
if (Dims.q != 0) {
334-
i1 = Dims.q;
335-
i3 = Dims.n;
336-
for (i = 1; i <= i1; ++i) {
324+
if (q != 0) {
325+
for (i = 1; i <= q; ++i) {
337326
int i_aj = i * ajac_dim1;
338327
u = g[i];
339-
for (j = i; j <= i1; ++j) {
328+
for (j = i; j <= q; ++j) {
340329
int j_aj = j * ajac_dim1;
341330
u *= g[j];
342-
for (k = Dims.maxpq1; k <= i3; ++k) {
331+
for (k = Dims.maxpq1; k <= n; ++k) {
343332
km = k - Dims.maxpq;
344333
t = 0.;
345-
for (l = 1; l < km && l <= i1; ++l)
334+
for (l = 1; l < km && l <= q; ++l)
346335
t += qp[l] * aij[km - l];
347336

348337
s = 0.;
@@ -354,17 +343,16 @@ void hesspq_(double *qp, double *a, double *ajac,
354343
s = F77_CALL(ddot)(&Dims.nm, &ajac[i_aj + 1], &c__1,
355344
&ajac[j_aj + 1], &c__1);
356345
t = F77_CALL(ddot)(&Dims.nm, a, &c__1, &aij[1], &c__1);
357-
h__[Dims.p + i + (Dims.p + j) * h_dim1] =
358-
-Dims.n * (s + t - 2 * fac * u) * fac;
346+
h__[p + i + (p + j) * h_dim1] =
347+
-n * (s + t - 2 * fac * u) * fac;
359348
}
360349
}
361350
}
362-
if (Dims.p != 0) {
363-
i1 = Dims.p;
364-
for (i = 1; i <= i1; ++i) {
365-
u = g[Dims.q + i];
366-
for (j = i; j <= i1; ++j) {
367-
u = g[Dims.q + j] * u;
351+
if (p != 0) {
352+
for (i = 1; i <= p; ++i) {
353+
u = g[q + i];
354+
for (j = i; j <= p; ++j) {
355+
u = g[q + j] * u;
368356
/* do k = maxpq1, n */
369357
/* km = k - maxpq */
370358
/* t = zero */
@@ -379,12 +367,12 @@ void hesspq_(double *qp, double *a, double *ajac,
379367
/* end do */
380368

381369
/* t = ddot( nm, a , 1, aij , 1) */
382-
s = F77_CALL(ddot)(&Dims.nm, &ajac[(Dims.q+i)*ajac_dim1 + 1],
383-
&c__1, &ajac[(Dims.q + j) * ajac_dim1 + 1],
384-
&c__1);
370+
s = F77_CALL(ddot)(&Dims.nm,
371+
&ajac[(q+ i)*ajac_dim1 + 1], &c__1,
372+
&ajac[(q+ j)*ajac_dim1 + 1], &c__1);
385373

386374
/* H(i+1,j+1) = -dble(n)*((s + t) - two*fac*u)*fac */
387-
h__[i + (j) * h_dim1] = - Dims.n * (s - 2 * fac * u) * fac;
375+
h__[i + (j) * h_dim1] = - n * (s - 2 * fac * u) * fac;
388376
}
389377
}
390378
}
@@ -404,10 +392,7 @@ hesdpq(double *x, double d_, double *hh, double *hd, double *w)
404392
written by Chris Fraley
405393
---------------------------------------------------------------------------*/
406394

407-
/* System generated locals */
408-
double d__1;
409-
/* Local variables */
410-
double fa, fb, slogvk;
395+
double fa, fb, slogvk, d__1;
411396

412397
/* Parameter adjustments */
413398
--w;

0 commit comments

Comments
 (0)