|
Prev | Next | sparse_hes_pattern_xam.m | Headings |
function ok = sparse_hes_pattern_xam()
%
% load the Cppad Swig library
m_cppad
%
% initialize return variable
ok = true;
% -----------------------------------------------------------------------
% number of dependent and independent variables
n = 3;
%
% create the independent variables ax
x = m_cppad.vec_double(n);
for i = [ 0 :(n -1) ]
x(i) = i + 2.0;
end
ax = m_cppad.independent(x);
%
% create dependent variables ay with ay[i] = ax[j] * ax[i]
% where i = mod(j + 1, n)
ay = m_cppad.vec_a_double(n);
for j = [ 0 :(n -1) ]
i = j+1;
if( i >= n )
i = i - n;
end
ay_i = ax(i) * ax(j);
ay(i) = ay_i;
end
%
% define af corresponding to f(x)
af = m_cppad.a_fun(ax, ay);
%
% Set select_d (domain) to all true, initial select_r (range) to all false
select_d = m_cppad.vec_bool(n);
select_r = m_cppad.vec_bool(n);
for i = [ 0 :(n-1) ]
select_d(i) = true;
select_r(i) = false;
end
%
% 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 = [ 0 :(2-1) ]
pat_out = m_cppad.sparse_rc();
if( mode == 0 )
af.for_hes_sparsity(select_d, select_r, pat_out);
end
if( mode == 1 )
af.rev_hes_sparsity(select_d, select_r, pat_out);
end
%
% check that result is sparsity pattern for Hessian of f_0 (x)
ok = ok && pat_out.nnz() == 2 ;
row = pat_out.row();
col = pat_out.col();
for k = [ 0 :(2-1) ]
r = row(k);
c = col(k);
if( r <= c )
ok = ok && r == 0;
ok = ok && c == n-1;
end
if( r >= c )
ok = ok && r == n-1;
ok = ok && c == 0;
end
end
end
%
return;
end