/* nag_partial_corr (g02byc) Example Program.
 *
 * Copyright 2014 Numerical Algorithms Group.
 *
 * Mark 6, 2000.
 */

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

#define X(I, J) x[((I) -1)*m + ((J) -1)]
#define R(I, J) r[((I) -1)*m + ((J) -1)]
int main(void)
{

  Integer  exit_status = 0, j, k, m, n, nx, ny, *sz = 0;
  NagError fail;
  double   *r = 0, *std = 0, sw, *v = 0, *x = 0, *xbar = 0;

  INIT_FAIL(fail);

  printf("nag_partial_corr (g02byc) Example Program Results\n");

  /* Skip heading in data file */
  scanf("%*[^\n]");
  scanf("%ld %ld", &n, &m);
  if (!(r = NAG_ALLOC(m*m, double))
     || !(std = NAG_ALLOC(m, double))
     || !(v = NAG_ALLOC(m*m, double))
     || !(x = NAG_ALLOC(n*m, double))
     || !(xbar = NAG_ALLOC(m, double))
     || !(sz = NAG_ALLOC(m, Integer)))
    {
      printf("Allocation failure\n");
      exit_status = -1;
      goto END;
    }
  for (j = 1; j <= n; ++j)
    for (k = 1; k <= m; ++k)
      scanf("%lf", &X(j, k));

  /* Calculate correlation matrix */
  /* nag_corr_cov (g02bxc).
   * Product-moment correlation, unweighted/weighted
   * correlation and covariance matrix, allows variables to be
   * disregarded
   */
  nag_corr_cov(n, m, x, m, 0, 0, &sw, xbar, std, r, m, v, m,
               &fail);
  if (fail.code == NE_NOERROR)
    {
      /* Print the correlation matrix */
      printf("\nCorrelation Matrix\n\n");
      for (j = 1; j <= m; j++)
        {
          for (k = 1; k <= m; k++)
            if (j > k)
              printf("%11s", "");
            else
              printf("%7.4f%4s", R(j, k), "");
          printf("\n");
        }
      scanf("%ld %ld", &ny, &nx);
      for (j = 1; j <= m; ++j)
        scanf("%ld", &sz[j - 1]);

      /* Calculate partial correlation matrix */
      /* nag_partial_corr (g02byc).
       * Computes partial correlation/variance-covariance matrix
       * from correlation/variance-covariance matrix computed by
       * nag_corr_cov (g02bxc)
       */
      nag_partial_corr(m, ny, nx, sz, v, m, r, m, &fail);
      if (fail.code != NE_NOERROR)
        {
          printf("Error from nag_partial_corr (g02byc).\n%s\n",
                  fail.message);
          exit_status = 1;
          goto END;
        }
      /* Print partial correlation matrix */
      printf("\n");
      printf("\nPartial Correlation Matrix\n\n");
      for (j = 1; j <= ny; j++)
        {
          for (k = 1; k <= ny; k++)
            {
              if (j > k)
                printf("%11s", "");
              else if (j == k)
                printf("%7.4f%4s", 1.0, "");
              else
                printf("%7.4f%4s", R(j, k), "");
            }
          printf("\n");
        }
    }
  else
    {
      printf("Error from nag_corr_cov (g02bxc).\n%s\n", fail.message);
      exit_status = 1;
      goto END;
    }
 END:
  NAG_FREE(r);
  NAG_FREE(std);
  NAG_FREE(v);
  NAG_FREE(x);
  NAG_FREE(xbar);
  NAG_FREE(sz);
  return exit_status;
}