#' Load an mx.nd.array object on disk
#'
#' @param filename the filename (including the path)
#'
#' @examples
#' mat = mx.nd.array(1:3)
#' mx.nd.save(mat, 'temp.mat')
#' mat2 = mx.nd.load('temp.mat')
#' as.array(mat)
#' as.array(mat2)
#'
#' @export
mx.nd.load <- function(filename) {
  filename <- path.expand(filename)
  return(mx.nd.internal.load(filename))
}

#' Save an mx.nd.array object
#'
#' @param ndarray the \code{mx.nd.array} object
#' @param filename the filename (including the path)
#'
#' @examples
#' mat = mx.nd.array(1:3)
#' mx.nd.save(mat, 'temp.mat')
#' mat2 = mx.nd.load('temp.mat')
#' as.array(mat)
#' as.array(mat2[[1]])
#'
#' @export
mx.nd.save <- function(ndarray, filename) {
  filename <- path.expand(filename)
  if (!is.list(ndarray)) {
    mx.nd.internal.save(list(ndarray), filename)
  } else {
    mx.nd.internal.save(ndarray, filename)
  }
}

mx.nd.internal.empty <- function(shape, ctx=NULL) {
  if (is.null(ctx)) ctx <- mx.ctx.default()
  if (!is.mx.context(ctx)) stop("wrong mx.context object, please specify with mx.cpu() or mx.gpu()")
  return (mx.nd.internal.empty.array(shape, ctx))
}

#' Generate an mx.nd.array object with zeros
#'
#' @param shape the dimension of the \code{mx.nd.array}
#' @param ctx optional The context device of the array. mx.ctx.default() will be used in default.
#'
#' @examples
#' mat = mx.nd.zeros(10)
#' as.array(mat)
#' mat2 = mx.nd.zeros(c(5,5))
#' as.array(mat)
#' mat3 = mx.nd.zeroes(c(3,3,3))
#' as.array(mat3)
#'
#' @export
mx.nd.zeros <- function(shape, ctx=NULL) {
  ret <- mx.nd.internal.empty(shape, ctx)
  return (mx.nd.internal.set.value(0.0, out=ret))
}

#' Generate an mx.ndarray object with ones
#'
#' @param shape the dimension of the \code{mx.ndarray}
#' @param ctx optional The context device of the array. mx.ctx.default() will be used in default.
#'
#' @examples
#' mat = mx.nd.ones(10)
#' as.array(mat)
#' mat2 = mx.nd.ones(c(5,5))
#' as.array(mat)
#' mat3 = mx.nd.ones(c(3,3,3))
#' as.array(mat3)
#'
#' @export
mx.nd.ones <- function(shape, ctx=NULL) {
  ret <- mx.nd.internal.empty(shape, ctx)
  return (mx.nd.internal.set.value(1.0, out=ret))
}

#' Generate an mx.ndarray object on ctx, with data copied from src
#'
#' @param src The source mx.ndarray object.
#' @param ctx The target context.
#'
#' @export
mx.nd.copyto <- function(src, ctx) {
  ret <- mx.nd.internal.empty(dim(src), ctx)
  return (mx.nd.internal.copyto(src, out=ret))
}

#' Create a new \code{mx.ndarray} that copies the content from src on ctx.
#'
#' @param src.array Source array data of class \code{array}, \code{vector} or \code{matrix}.
#' @param ctx optional The context device of the array. mx.ctx.default() will be used in default.
#'
#' @return An \code{mx.ndarray}
#'
#' @rdname mx.nd.array
#' 
#' @return An Rcpp_MXNDArray object
#' 
#' @examples
#' mat = mx.nd.array(x)
#' mat = 1 - mat + (2 * mat)/(mat + 0.5)
#' as.array(mat)
#'
#' @export
mx.nd.array <- function(src.array, ctx=NULL) {
  if (is.null(ctx)) ctx <- mx.ctx.default()
  if (!is.array(src.array)) {
    if (!is.vector(src.array) && !is.matrix(src.array)) {
      stop("mx.nd.array takes an object of class array, vector or matrix only.")
    } else {
      src.array <- as.array(src.array)
    }
  }
  return (mx.nd.internal.array(src.array, ctx))
}

is.MXNDArray <- function(nd) {
  class(nd) == "MXNDArray"
}

#' Check if src.array is mx.ndarray
#'
#' @return Logical indicator
#'
#' @examples
#' mat = mx.nd.array(1:10)
#' is.mx.ndarray(mat)
#' mat2 = 1:10
#' is.mx.ndarray(mat2)
#'
#' @export
is.mx.ndarray <- function(src.array) {
  is.MXNDArray(src.array)
}

#' Binary operator overloading of mx.ndarray
#' @param e1 The first operand
#' @param e1 The second operand
#' @export
Ops.MXNDArray <- function(e1, e2) {
  mx.nd.internal.dispatch.Ops(.Generic, e1, e2)
}

#' Dimension operator overload of mx.ndarray
#' @param nd The mx.ndarray
#' @export
dim.MXNDArray <- function(nd) {
  mx.nd.internal.dim(nd)
}

#' Length operator overload of mx.ndarray
#' @param nd The mx.ndarray
#' @export
length.MXNDArray <- function(nd) {
  mx.nd.internal.length(nd)
}

#' as.array operator overload of mx.ndarray
#' @param nd The mx.ndarray
#' @export
as.array.MXNDArray <- function(nd) {
  mx.nd.internal.as.array(nd)
}

#' as.matrix operator overload of mx.ndarray
#' @param nd The mx.ndarray
#' @export
as.matrix.MXNDArray <- function(nd) {
  if (length(dim(nd)) != 2) {
    stop("The input argument is not two dimensional matrix.")
  }
  as.matrix(as.array(nd))
}

#' print operator overload of mx.ndarray
#' @param nd The mx.ndarray
#' @export
print.MXNDArray <- function(nd) {
  print(as.array(nd))
}

# TODO(KK) use generics?

#' Get the context of mx.ndarray
#' @param nd The mx.ndarray
#' @export
ctx <-function(nd) {
  mx.nd.internal.ctx(nd)
}
