NAG Library Manual, Mark 29.3
Interfaces:  FL   CL   CPP   AD 

NAG CL Interface Introduction
Example description
/* nag_tsa_multi_autocorr_part (g13dbc) Example Program.
 *
 * Copyright 2023 Numerical Algorithms Group.
 *
 * Mark 29.3, 2023.
 */

#include <nag.h>
#include <stdio.h>

int main(void) {
  /* Scalars */
  double v0;
  Integer exit_status, i1, i, j, j1, k, nk, nl, ns, nvp, pdc0, pddb;
  NagError fail;

  /* Arrays */
  double *c0 = 0, *c = 0, *d = 0, *db = 0, *p = 0, *v = 0, *w = 0, *wb = 0;

#define C(I, J, K) c[((K - 1) * ns + (J - 1)) * ns + I - 1]
#define D(I, J, K) d[((K - 1) * ns + (J - 1)) * ns + I - 1]
#define W(I, J, K) w[((K - 1) * ns + (J - 1)) * ns + I - 1]
#define WB(I, J, K) wb[((K - 1) * ns + (J - 1)) * ns + I - 1]

#ifdef NAG_COLUMN_MAJOR
#define C0(I, J) c0[(J - 1) * pdc0 + I - 1]
#define DB(I, J) db[(J - 1) * pddb + I - 1]
#else
#define C0(I, J) c0[(I - 1) * pdc0 + J - 1]
#define DB(I, J) db[(I - 1) * pddb + J - 1]
#endif

  INIT_FAIL(fail);

  exit_status = 0;

  printf("nag_tsa_multi_autocorr_part (g13dbc) Example Program Results\n");

  /* Skip heading in data file */
  scanf("%*[^\n] ");

  /* Read series length, and numbers of lags */
  scanf("%" NAG_IFMT "%" NAG_IFMT "%" NAG_IFMT "%*[^\n] ", &ns, &nl, &nk);

  if (ns > 0 && nl > 0 && nk > 0) {
    /* Allocate arrays */
    if (!(c0 = NAG_ALLOC(ns * ns, double)) ||
        !(c = NAG_ALLOC(ns * ns * nl, double)) ||
        !(d = NAG_ALLOC(ns * ns * nk, double)) ||
        !(db = NAG_ALLOC(ns * ns, double)) || !(p = NAG_ALLOC(nk, double)) ||
        !(v = NAG_ALLOC(nk, double)) ||
        !(w = NAG_ALLOC(ns * ns * nk, double)) ||
        !(wb = NAG_ALLOC(ns * ns * nk, double))) {
      printf("Allocation failure\n");
      exit_status = -1;
      goto END;
    }

    pdc0 = ns;
    pddb = ns;

    /* Read autocovariances */
    for (i = 1; i <= ns; ++i) {
      for (j = 1; j <= ns; ++j)
        scanf("%lf", &C0(i, j));
    }
    scanf("%*[^\n] ");

    for (k = 1; k <= nl; ++k) {
      for (i = 1; i <= ns; ++i) {
        for (j = 1; j <= ns; ++j)
          scanf("%lf", &C(i, j, k));
      }
    }
    scanf("%*[^\n] ");

    /* Call routine to calculate multivariate partial
       autocorrelation function */

    /* nag_tsa_multi_autocorr_part (g13dbc).
     * Multivariate time series, multiple squared partial
     * autocorrelations
     */
    nag_tsa_multi_autocorr_part(c0, c, ns, nl, nk, p, &v0, v, d, db, w, wb,
                                &nvp, &fail);
    if (fail.code != NE_NOERROR) {
      printf("Error from nag_tsa_multi_autocorr_part (g13dbc).\n%s\n",
             fail.message);
      exit_status = 1;
      goto END;
    }

    if (fail.code == NE_NOERROR || fail.code == NE_POS_DEF) {
      printf("\n");
      printf("Number of valid parameters =%10" NAG_IFMT "\n", nvp);

      printf("\n");
      printf("Multivariate partial autocorrelations\n");

      for (i1 = 1; i1 <= nk; ++i1) {
        printf("%13.5f", p[i1 - 1]);
        if (i1 % 5 == 0 || i1 == nk)
          printf("\n");
      }

      printf("\n");
      printf("Zero lag predictor error variance determinant\n");
      printf("followed by error variance ratios\n");
      printf("%12.5f", v0);

      for (i1 = 1; i1 <= nk; ++i1) {
        printf("%13.5f", v[i1 - 1]);
        if (i1 % 5 == 0 || i1 == nk)
          printf("\n");
      }

      printf("\n");
      printf("Prediction error variances\n");
      printf("\n");

      for (k = 1; k <= nk; ++k) {
        printf("Lag =%5" NAG_IFMT "\n", k);
        for (i = 1; i <= ns; ++i) {
          for (j1 = 1; j1 <= ns; ++j1) {
            printf("%13.5f", D(i, j1, k));
            if (j1 % 5 == 0 || j1 == ns)
              printf("\n");
          }
        }
        printf("\n");
      }

      printf("Last backward prediction error variances\n");
      printf("\n");
      printf("Lag =%5" NAG_IFMT "\n", nvp);

      for (i = 1; i <= ns; ++i) {
        for (j1 = 1; j1 <= ns; ++j1) {
          printf("%13.5f", DB(i, j1));
          if (j1 % 5 == 0 || j1 == ns)
            printf("\n");
        }
      }

      printf("\n");
      printf("Prediction coefficients\n");
      printf("\n");

      for (k = 1; k <= nk; ++k) {
        printf("Lag =%5" NAG_IFMT "\n", k);
        for (i = 1; i <= ns; ++i) {
          for (j1 = 1; j1 <= ns; ++j1) {
            printf("%13.5f", W(i, j1, k));
            if (j1 % 5 == 0 || j1 == ns)
              printf("\n");
          }
        }
        printf("\n");
      }
      printf("Backward prediction coefficients\n");
      printf("\n");

      for (k = 1; k <= nk; ++k) {
        printf("Lag =%5" NAG_IFMT "\n", k);
        for (i = 1; i <= ns; ++i) {
          for (j1 = 1; j1 <= ns; ++j1) {
            printf("%13.5f", WB(i, j1, k));
            if (j1 % 5 == 0 || j1 == ns)
              printf("\n");
          }
        }
        printf("\n");
      }
    }
  }

END:
  NAG_FREE(c0);
  NAG_FREE(c);
  NAG_FREE(d);
  NAG_FREE(db);
  NAG_FREE(p);
  NAG_FREE(v);
  NAG_FREE(w);
  NAG_FREE(wb);

  return exit_status;
}