Ejemplo n.º 1
0
Archivo: _acep.c Proyecto: celsius/sptk
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);
}
Ejemplo n.º 2
0
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);
}