double acep(double x, double *c, const int m, const double lambda, const double step, const double tau, const int pd, const double eps) { int i, memory_size; static double *cc = NULL, *e, *ep, *d, gg = 1.0; static int size; double mu, tx; memory_size = m + m + m + 3 + (m + 1) * pd * 2; if (cc == NULL) { cc = dgetmem(memory_size); e = cc + m + 1; ep = e + m + 1; d = ep + m + 1; size = memory_size; } if (memory_size > size) { free(cc); cc = dgetmem(memory_size); e = cc + m + 1; ep = e + m + 1; d = ep + m + 1; size = memory_size; } for (i = 1; i <= m; i++) cc[i] = -c[i]; x = lmadf(x, cc, m, pd, d); for (i = m; i >= 1; i--) e[i] = e[i - 1]; e[0] = x; gg = gg * lambda + (1.0 - lambda) * e[0] * e[0]; c[0] = 0.5 * log(gg); gg = (gg < eps) ? eps : gg; mu = step / (double) m / gg; tx = 2 * (1.0 - tau) * x; for (i = 1; i <= m; i++) { ep[i] = tau * ep[i] - tx * e[i]; c[i] -= mu * ep[i]; } return (x); }
int main(int argc, char **argv) { int m = ORDER, period = PERIOD, i, j, pd = PADEORD; FILE *fp = stdin, *fpe = NULL; Boolean aveflag = AVEFLAG; double lambda = LAMBDA, step = STEP, tau = TAU, eps = EPS, *c, *e, *ep, *cc, *d, *avec, x, ll, gg, tt, mu, ttx; if ((cmnd = strrchr(argv[0], '/')) == NULL) cmnd = argv[0]; else cmnd++; while (--argc) if (**++argv == '-') { switch (*(*argv + 1)) { case 'l': lambda = atof(*++argv); --argc; break; case 't': tau = atof(*++argv); --argc; break; case 'k': step = atof(*++argv); --argc; break; case 'm': m = atoi(*++argv); --argc; break; case 'p': period = atoi(*++argv); --argc; break; case 's': aveflag = 1 - aveflag; break; case 'P': pd = atoi(*++argv); --argc; break; case 'e': eps = atof(*++argv); --argc; break; case 'h': usage(0); default: fprintf(stderr, "%s : Invalid option '%c'!\n", cmnd, *(*argv + 1)); usage(1); } } else fpe = getfp(*argv, "wb"); if ((pd < 4) || (pd > 5)) { fprintf(stderr, "%s : Order of Pade approximation should be 4 or 5!\n", cmnd); return (1); } c = dgetmem(5 * (m + 1) + (m + 1) * pd * 2); cc = c + m + 1; e = cc + m + 1; ep = e + m + 1; avec = ep + m + 1; d = avec + m + 1; j = period; ll = 1.0 - lambda; gg = 1.0; step /= (double) m; tt = 2 * (1.0 - tau); while (freadf(&x, sizeof(x), 1, fp) == 1) { for (i = 1; i <= m; i++) cc[i] = -c[i]; x = lmadf(x, cc, m, pd, d); for (i = m; i >= 1; i--) e[i] = e[i - 1]; e[0] = x; gg = gg * lambda + ll * e[0] * e[0]; c[0] = 0.5 * log(gg); gg = (gg < eps) ? eps : gg; mu = step / gg; ttx = tt * e[0]; for (i = 1; i <= m; i++) { ep[i] = tau * ep[i] - ttx * e[i]; c[i] -= mu * ep[i]; } if (aveflag) for (i = 0; i <= m; i++) avec[i] += c[i]; if (fpe != NULL) fwritef(&x, sizeof(x), 1, fpe); if (--j == 0) { j = period; if (aveflag) { for (i = 0; i <= m; i++) avec[i] /= period; fwritef(avec, sizeof(*avec), m + 1, stdout); fillz(avec, sizeof(*avec), m + 1); } else fwritef(c, sizeof(*c), m + 1, stdout); } } return (0); }