Examples for 'nloptr::check.derivatives'


Check analytic gradients of a function using finite difference approximations

Aliases: check.derivatives

Keywords: interface optimize

### ** Examples


library('nloptr')

# example with correct gradient
f <- function( x, a ) {
        return( sum( ( x - a )^2 ) )
}

f_grad <- function( x, a ) {
        return( 2*( x - a ) )
}

check.derivatives( .x=1:10, func=f, func_grad=f_grad,
    check_derivatives_print='none', a=runif(10) )
Derivative checker results: 0 error(s) detected.
$analytic
 [1]  0.1613065  2.2635577  4.6319542  6.2664238  8.9317980 11.0216127
 [7] 13.6312413 15.4049306 16.6889910 19.0104791

$finite_difference
 [1]  0.1613083  2.2635574  4.6319542  6.2664242  8.9317978 11.0216128
 [7] 13.6312414 15.4049306 16.6889911 19.0104794

$relative_error
 [1] 1.099285e-05 9.936324e-08 8.143121e-09 5.662462e-08 2.198021e-08
 [6] 1.277353e-08 4.519055e-09 3.657596e-09 7.639031e-09 1.139506e-08

$flag_derivative_warning
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# example with incorrect gradient
f_grad <- function( x, a ) {
        return( 2*( x - a ) + c(0,.1,rep(0,8)) )
}

check.derivatives( .x=1:10, func=f, func_grad=f_grad,
    check_derivatives_print='errors', a=runif(10) )
Derivative checker results: 1 error(s) detected.
* grad_f[  2 ] = 2.638483e+00 ~ 2.538485e+00   [3.939293e-02]
$analytic
 [1]  0.7819333  2.6384829  4.4793969  7.7746663  9.0447241 11.3201656
 [7] 13.3047417 15.5656195 16.3296241 19.5519917

$finite_difference
 [1]  0.7819366  2.5384846  4.4793981  7.7746668  9.0447243 11.3201656
 [7] 13.3047420 15.5656199 16.3296246 19.5519920

$relative_error
 [1] 4.285979e-06 3.939293e-02 2.751375e-07 6.869921e-08 1.953314e-08
 [6] 4.483775e-09 2.024980e-08 3.174089e-08 2.829456e-08 1.459479e-08

$flag_derivative_warning
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# example with incorrect gradient of vector-valued function
g <- function( x, a ) {
        return( c( sum(x-a), sum( (x-a)^2 ) ) )
}

g_grad <- function( x, a ) {
        return( rbind( rep(1,length(x)) + c(0,.01,rep(0,8)), 2*(x-a) + c(0,.1,rep(0,8)) ) )
}

check.derivatives( .x=1:10, func=g, func_grad=g_grad,
    check_derivatives_print='all', a=runif(10) )
Derivative checker results: 2 error(s) detected.
  grad_f[ 1,  1 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  1 ] = 6.167866e-01 ~ 6.167870e-01   [6.575868e-07]
* grad_f[ 1,  2 ] = 1.010000e+00 ~ 1.000000e+00   [1.000000e-02]
* grad_f[ 2,  2 ] = 2.532124e+00 ~ 2.432123e+00   [4.111662e-02]
  grad_f[ 1,  3 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  3 ] = 4.749818e+00 ~ 4.749818e+00   [6.473757e-08]
  grad_f[ 1,  4 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  4 ] = 6.402690e+00 ~ 6.402690e+00   [2.080050e-08]
  grad_f[ 1,  5 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  5 ] = 8.783182e+00 ~ 8.783182e+00   [3.712277e-08]
  grad_f[ 1,  6 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  6 ] = 1.048305e+01 ~ 1.048305e+01   [2.483101e-08]
  grad_f[ 1,  7 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  7 ] = 1.217313e+01 ~ 1.217313e+01   [8.962179e-10]
  grad_f[ 1,  8 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  8 ] = 1.576808e+01 ~ 1.576807e+01   [2.805531e-09]
  grad_f[ 1,  9 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2,  9 ] = 1.614638e+01 ~ 1.614638e+01   [2.723775e-10]
  grad_f[ 1, 10 ] = 1.000000e+00 ~ 1.000000e+00   [0.000000e+00]
  grad_f[ 2, 10 ] = 1.958529e+01 ~ 1.958529e+01   [1.583486e-09]
$analytic
          [,1]     [,2]     [,3]    [,4]     [,5]     [,6]     [,7]     [,8]
[1,] 1.0000000 1.010000 1.000000 1.00000 1.000000  1.00000  1.00000  1.00000
[2,] 0.6167866 2.532124 4.749818 6.40269 8.783182 10.48305 12.17313 15.76808
         [,9]    [,10]
[1,]  1.00000  1.00000
[2,] 16.14638 19.58529

$finite_difference
         [,1]     [,2]     [,3]    [,4]     [,5]     [,6]     [,7]     [,8]
[1,] 1.000000 1.000000 1.000000 1.00000 1.000000  1.00000  1.00000  1.00000
[2,] 0.616787 2.432123 4.749818 6.40269 8.783182 10.48305 12.17313 15.76807
         [,9]    [,10]
[1,]  1.00000  1.00000
[2,] 16.14638 19.58529

$relative_error
             [,1]       [,2]         [,3]        [,4]         [,5]         [,6]
[1,] 0.000000e+00 0.01000000 0.000000e+00 0.00000e+00 0.000000e+00 0.000000e+00
[2,] 6.575868e-07 0.04111662 6.473757e-08 2.08005e-08 3.712277e-08 2.483101e-08
             [,7]         [,8]         [,9]        [,10]
[1,] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
[2,] 8.962179e-10 2.805531e-09 2.723775e-10 1.583486e-09

$flag_derivative_warning
      [,1] [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
[1,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[Package nloptr version 2.0.3 Index]