tests/testthat/test_tn.R

context("Truncated Newton")

# Numbers from Octave minfunc with settings:
# options.c1 = 1e-10, options.c2 = 1e-9, options.Method = 'newton0'
# options.maxFunEvals = 31
res <- mize(c(0, 0), rosenbrock_fg,
  method = "TN", c1 = 1e-10, c2 = 1e-9,
  store_progress = TRUE, max_fn = 27, try_newton_step = FALSE
)

expect_equal(res$nf, 27)
expect_equal(res$ng, 34)
expect_equal(res$f, 0.35, tol = 1e-3)
expect_equal(res$par, c(0.4446, 0.1772), tol = 1e-3)

expect_equal(res$progress$alpha,
  c(
    0, 1.61262e-01, 1.00000e+00, 1.79967e-01, 1.00453e+00,
    2.73325e-01
  ),
  tol = 1e-5
)
expect_equal(res$progress$f,
  c(
    1, 7.71110e-01, 7.03481e-01, 5.24969e-01, 4.81177e-01,
    3.50106e-01
  ),
  tol = 1e-5
)

res <- mize(c(0, 0), rosenbrock_fg,
  method = "TN", c1 = 1e-10, c2 = 1e-9,
  store_progress = TRUE, max_fn = 30, preconditioner = "L-BFGS"
)

expect_equal(res$nf, 30)
expect_equal(res$ng, 38)
expect_equal(res$f, 0.136, tol = 1e-3)
expect_equal(res$par, c(0.680, 0.444), tol = 1e-3)

expect_equal(res$progress$alpha,
  c(
    0, 1.61262e-01, 1.52249e+00, 1.00440e+00, 1.58637e-01,
    1.56767e+00
  ),
  tol = 1e-5
)
expect_equal(res$progress$f,
  c(
    1, 7.71110e-01, 4.83501e-01, 3.92254e-01, 2.70259e-01,
    1.36470e-01
  ),
  tol = 1e-5
)


res <- mize(c(0, 0), rosenbrock_fg,
  method = "TN", c1 = 1e-4, c2 = 0.1,
  store_progress = TRUE, max_iter = 5, tn_init = "prev"
)
expect_equal(res$nf, 21)
expect_equal(res$ng, 31)
expect_equal(res$f, 0.0134, tol = 1e-4)
expect_equal(res$par, c(0.919, 0.836), tol = 1e-3)
expect_equal(res$progress$alpha,
  c(0, 0.1585, 1.385, 2.048, 2.323, 1.718),
  tol = 1e-3
)
expect_equal(res$progress$f,
  c(1, 0.771, 0.497, 0.226, 0.0603, 0.0134),
  tol = 1e-3
)

res <- mize(c(0, 0), rosenbrock_fg,
  method = "TN", c1 = 1e-4, c2 = 0.1,
  store_progress = TRUE, max_iter = 5, tn_init = 0, tn_exit = "strong"
)
expect_equal(res$nf, 15)
expect_equal(res$ng, 22)
expect_equal(res$f, 0.352, tol = 1e-3)
expect_equal(res$par, c(0.444, 0.177), tol = 1e-3)
expect_equal(res$progress$alpha,
  c(0, 0.1585, 1.000, 0.175, 1.000, 0.279),
  tol = 1e-3
)
expect_equal(res$progress$f,
  c(1, 0.771, 0.707, 0.528, 0.483, 0.352),
  tol = 1e-3
)
jlmelville/mizer documentation built on Jan. 17, 2022, 8:47 a.m.