R/krylov_subspace.R

Defines functions KrylovSubspace

KrylovSubspace <- function(point.container,
                           k){
  # Computes Krylov subspace of dimension k.
  # Args:
  #   point.container: point and function.
  #   k: Krylov subspace dimension.

  subspace <- vector(length = point.container$input.dimension)
  subspace.multiplied.by.hessian <- vector(length = point.container$input.dimension)

  g <- - NumericGradient(point.container)
  v <- g / sqrt(sum(g * g))

  subspace <- rbind(subspace, v)
  subspace.multiplied.by.hessian <- rbind(subspace.multiplied.by.hessian, MultiplyHessianVector(point.container, v))
  beta <- 0
  for (i in 2:k){
    w <- MultiplyHessianVector(point.container, v)
    alpha <- sum(w * v)
    w <- w - alpha * subspace[i,] - beta * subspace[i - 1,]
    beta <- sqrt(sum(w * w))
    v <- w / sqrt(sum(w * w))
    subspace <- rbind(subspace, v)
    subspace.multiplied.by.hessian <- rbind(subspace.multiplied.by.hessian, MultiplyHessianVector(point.container, v))
  }
  res <- KrylovContainer(subspace = subspace[-1,],
                         subspace.multiplied.by.hessian = subspace.multiplied.by.hessian[-1,])
  return(res)
}
smdrozdov/saddle_free_newton documentation built on May 20, 2019, 9:42 a.m.