49 lines
1.6 KiB
R
49 lines
1.6 KiB
R
#' Compute get gradient of `L(V)` given a dataset `X`.
|
|
#'
|
|
#' @param X Data matrix.
|
|
#' @param Y Responce.
|
|
#' @param V Position to compute the gradient at, aka point on Stiefl manifold.
|
|
#' @param h Bandwidth
|
|
#' @param loss.out Iff \code{TRUE} loss will be written to parent environment.
|
|
#' @param loss.only Boolean to only compute the loss, of \code{TRUE} a single
|
|
#' value loss is returned and \code{envir} is ignored.
|
|
#' @param persistent Determines if data indices and dependent calculations shall
|
|
#' be reused from the parent environment. ATTENTION: Do NOT set this flag, only
|
|
#' intended for internal usage by carefully aligned functions!
|
|
#' @keywords internal
|
|
#' @export
|
|
grad <- function(X, Y, V, h,
|
|
loss.out = FALSE,
|
|
loss.only = FALSE,
|
|
persistent = FALSE) {
|
|
# Get number of samples and dimension.
|
|
n <- nrow(X)
|
|
p <- ncol(X)
|
|
|
|
if (!persistent) {
|
|
# Compute lookup indexes for symmetrie, lower/upper
|
|
# triangular parts and vectorization.
|
|
pair.index <- elem.pairs(seq(n))
|
|
i <- pair.index[1, ] # `i` indices of `(i, j)` pairs
|
|
j <- pair.index[2, ] # `j` indices of `(i, j)` pairs
|
|
# Index of vectorized matrix, for lower and upper triangular part.
|
|
lower <- ((i - 1) * n) + j
|
|
upper <- ((j - 1) * n) + i
|
|
|
|
# Create all pairewise differences of rows of `X`.
|
|
X_diff <- X[i, , drop = F] - X[j, , drop = F]
|
|
}
|
|
|
|
out <- .Call("grad_c", PACKAGE = "CVE",
|
|
X, X_diff, as.double(Y), V, as.double(h));
|
|
|
|
if (loss.only) {
|
|
return(out$loss)
|
|
}
|
|
if (loss.out) {
|
|
loss <<- out$loss
|
|
}
|
|
|
|
return(out$G)
|
|
}
|