    Program g13amfe

!     G13AMF Example Program Text

!     Mark 24 Release. NAG Copyright 2012.

!     .. Use Statements ..
      Use nag_library, Only: g13amf, nag_wp
!     .. Implicit None Statement ..
      Implicit None
!     .. Parameters ..
      Integer, Parameter               :: nin = 5, nout = 6
!     .. Local Scalars ..
      Real (Kind=nag_wp)               :: ad, dv
      Integer                          :: i, ifail, itype, ival, k, mode, n,   &
                                          nf, p
!     .. Local Arrays ..
      Real (Kind=nag_wp), Allocatable  :: fse(:), fv(:), init(:), param(:),    &
                                          r(:), res(:), y(:), yhat(:)
!     .. Executable Statements ..
      Write (nout,*) 'G13AMF Example Program Results'
      Write (nout,*)

!     Skip headings in data file
      Read (nin,*)

!     Read in the initial arguments and check array sizes
      Read (nin,*) mode, itype, n, nf

      Allocate (y(n),fv(nf),fse(nf),yhat(n),res(n))

!     Read in data
      Read (nin,*) y(1:n)

!     Read in the ITYPE dependent arguments (skipping headings)
      Select Case (itype)
      Case (1)
!       Single exponential smoothing
        Allocate (param(1))
        Read (nin,*) param(1)
        p = 0
        ival = 1

      Case (2)
!       Brown double exponential smoothing
        Allocate (param(2))
        Read (nin,*) param(1), param(2)
        p = 0
        ival = 2

      Case (3)
!       Linear holt smoothing
        Allocate (param(3))
        Read (nin,*) param(1), param(2), param(3)
        p = 0
        ival = 2

      Case Default
!       Additive or multiplicative Holt-Winter smoothing
        Allocate (param(4))
        Read (nin,*) param(1), param(2), param(3), param(4), p
        ival = p + 2
      End Select

      Allocate (init(ival),r(p+13))

!     Read in the MODE dependent arguments (skipping headings)
      Select Case (mode)
      Case (0)
!       User supplied initial values
        Read (nin,*) init(1:ival)
      Case (1)
!       Continuing from a previously saved R
        Read (nin,*) r(1:(p+13))
      Case (2)
!       Initial values calculated from first K observations
        Read (nin,*) k
      End Select

!     Call the library routine
      ifail = 0
      Call g13amf(mode,itype,p,param,n,y,k,init,nf,fv,fse,yhat,res,dv,ad,r, &
        ifail)

!     Display output
      Write (nout,*) 'Initial values used:'
      Write (nout,99997)(i,init(i),i=1,ival)
      Write (nout,*)
      Write (nout,99999) 'Mean Deviation     = ', dv
      Write (nout,99999) 'Absolute Deviation = ', ad
      Write (nout,*)
      Write (nout,*) '         Observed      1-Step'
      Write (nout,*) ' Period   Values      Forecast      Residual'
      Write (nout,*)
      Write (nout,99998)(i,y(i),yhat(i),res(i),i=1,n)
      Write (nout,*)
      Write (nout,*) '         Forecast     Standard'
      Write (nout,*) ' Period   Values       Errors'
      Write (nout,*)
      Write (nout,99996)(n+i,fv(i),fse(i),i=1,nf)

99999 Format (A,E12.4)
99998 Format (I4,1X,F12.3,1X,F12.3,1X,F12.3)
99997 Format (I4,1X,F12.3)
99996 Format (I4,1X,F12.3,1X,F12.3)
    End Program g13amfe
