#' vector nromalisation
#'
#' applies vector normalisation
#' @export vec_norm
#' @import pmp
vec_norm<-setClass(
  "vec_norm",
  contains = c('method'),
  slots=c(outputs.normalised='entity',
          outputs.coeff='entity'
  ),
  prototype=list(name = 'Vector normalisation',
                 description = 'Normalises each row such that the sum of squares is equal to 1',
                 type = 'normalisation',
                 predicted = 'normalised',
                 outputs=c('normalised','coeff'),

                 outputs.normalised=entity(name = 'Normalised dataset',
                                           description = 'A dataset object containing the normalised data.',
                                           type='dataset',
                                           value=dataset()
                 ),
                 outputs.flags=entity(name = 'Normalisation coefficients',
                                      description = 'The normalisation coefficients calculated by PQN',
                                      type='data.frame',
                                      value=data.frame()
                 )
  )
)

#' @export
setMethod(f="method.apply",
          signature=c("vec_norm","dataset"),
          definition=function(M,D)
          {
            smeta=dataset.sample_meta(D)
            x=dataset.data(D)

            coeff = apply(x,MARGIN = 2,FUN = function(z) sqrt(sum(z, na.rm = TRUE)))
            normalised = apply(x,MARGIN = 2,FUN = function(z) z/sqrt(sum(z, na.rm=TRUE)))
            dataset.data(D) = as.data.frame(normalised)

            output.value(M,'normalised') = D
            output.value(M,'coeff') = data.frame('coeff'=coeff)

            return(M)
          }
)