|
Prev | Next | sparse_hes_pattern_xam.py | Headings |
def sparse_hes_pattern_xam() :
#
# load the Cppad Swig library
import py_cppad
#
# initialize return variable
ok = True
# ---------------------------------------------------------------------
# number of dependent and independent variables
n = 3
#
# create the independent variables ax
x = py_cppad.vec_double(n)
for i in range( n ) :
x[i] = i + 2.0
#
ax = py_cppad.independent(x)
#
# create dependent variables ay with ay[i] = ax[j] * ax[i]
# where i = mod(j + 1, n)
ay = py_cppad.vec_a_double(n)
for j in range( n ) :
i = j+1
if i >= n :
i = i - n
#
ay_i = ax[i] * ax[j]
ay[i] = ay_i
#
#
# define af corresponding to f(x)
af = py_cppad.a_fun(ax, ay)
#
# Set select_d (domain) to all true, initial select_r (range) to all false
select_d = py_cppad.vec_bool(n)
select_r = py_cppad.vec_bool(n)
for i in range( n ) :
select_d[i] = True
select_r[i] = False
#
#
# only select component 0 of the range function
# f_0 (x) = x_0 * x_{n-1}
select_r[0] = True
#
# loop over forward and reverse mode
for mode in range( 2 ) :
pat_out = py_cppad.sparse_rc()
if mode == 0 :
af.for_hes_sparsity(select_d, select_r, pat_out)
#
if mode == 1 :
af.rev_hes_sparsity(select_d, select_r, pat_out)
#
#
# check that result is sparsity pattern for Hessian of f_0 (x)
ok = ok and pat_out.nnz() == 2
row = pat_out.row()
col = pat_out.col()
for k in range( 2 ) :
r = row[k]
c = col[k]
if r <= c :
ok = ok and r == 0
ok = ok and c == n-1
#
if r >= c :
ok = ok and r == n-1
ok = ok and c == 0
#
#
#
#
return( ok )
#