/* nag_tsa_cp_binary (g13ndc) Example Program.
*
* Copyright 2014 Numerical Algorithms Group.
*
* Mark 25, 2014.
*/
/* Pre-processor includes */
#include <stdio.h>
#include <nag.h>
#include <nag_stdlib.h>
#include <nagg13.h>
int main(void)
{
/* Integer scalar and array declarations */
Integer i, minss, n, ntau, mdepth;
Integer exit_status = 0;
Integer *tau = 0;
/* NAG structures and types */
NagError fail;
Nag_TS_ChangeType ctype;
Nag_Boolean param_supplied;
/* Double scalar and array declarations */
double beta;
double *param=0, *sparam = 0, *y = 0;
/* Character scalar and array declarations */
char cctype[40], cparam_supplied[40];
/* Initialise the error structure */
INIT_FAIL(fail);
printf("nag_tsa_cp_binary (g13ndc) Example Program Results\n\n");
/* Skip heading in data file */
scanf("%*[^\n] ");
/* Read in the problem size */
scanf("%ld%*[^\n] ",&n);
/* Allocate memory to hold the input series */
if (!(y = NAG_ALLOC(n, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read in the input series */
for (i = 0; i < n; i++)
{
scanf("%lf",&y[i]);
}
scanf("%*[^\n] ");
/* Read in the type of change point, penalty, minimum segment size */
/* and maximum depth */
scanf("%39s%39s%lf%ld%ld%*[^\n] ", cctype, cparam_supplied,
&beta, &minss, &mdepth);
ctype = (Nag_TS_ChangeType) nag_enum_name_to_value(cctype);
param_supplied = (Nag_Boolean) nag_enum_name_to_value(cparam_supplied);
/* Read in the distribution parameter (if required) */
if (param_supplied)
{
if (!(param = NAG_ALLOC(1, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
scanf("%lf",¶m[0]);
scanf("%*[^\n] ");
}
/* Allocate output arrays */
if (!(tau = NAG_ALLOC(n, Integer)) ||
!(sparam = NAG_ALLOC(2*n+2,double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Call nag_tsa_cp_binary (g13ndc) to to detect change points */
nag_tsa_cp_binary(ctype,n,y,beta,minss,param,mdepth,&ntau,tau,sparam,&fail);
if (fail.code != NE_NOERROR)
{
if (fail.code != NW_TRUNCATED) {
printf("Error from nag_tsa_cp_binary (g13ndc).\n%s\n",
fail.message);
exit_status = 1;
goto END;
}
}
/* Display the results */
if (ctype == Nag_ExponentialLambda || ctype == Nag_PoissonLambda)
{
/* Exponential or Poisson distribution */
printf(" -- Change Points -- Distribution\n");
printf(" Number Position Parameter\n");
printf(" ======================================\n");
for (i = 0; i < ntau; i++)
{
printf(" %4ld %6ld %12.2f\n",
i+1,tau[i],sparam[i]);
}
}
else
{
/* Normal or Gamma distribution */
printf(" -- Change Points -- --- Distribution ---\n");
printf(" Number Position Parameters\n");
printf(" ==================================================\n");
for (i = 0; i < ntau; i++)
{
printf(" %4ld %6ld %12.2f %12.2f\n",
i+1, tau[i], sparam[2*i], sparam[2*i+1]);
}
}
if (fail.code == NW_TRUNCATED)
{
printf("Some truncation occurred internally to avoid overflow.\n");
}
END:
NAG_FREE(y);
NAG_FREE(param);
NAG_FREE(tau);
NAG_FREE(sparam);
return(exit_status);
}