Prev Next fadbad_det_lu.cpp

Fadbad Speed: Gradient of Determinant Using Lu Factorization

Operation Sequence
Note that the Lu factorization operation sequence depends on the matrix being factored. Hence we use a different DAG for each matrix.

compute_det_lu
Routine that computes the gradient of determinant using Fadbad:
 
# include <FADBAD++/badiff.h>
# include <cppad/speed/det_by_lu.hpp>
# include <cppad/speed/uniform_01.hpp>
# include <cppad/vector.hpp>

void compute_det_lu(
	size_t                     size     , 
	size_t                     repeat   , 
	CppAD::vector<double>      &matrix   ,
	CppAD::vector<double>      &gradient )
{
	// -----------------------------------------------------
	// setup

	// object for computing determinant
	typedef B<double>             ADScalar; 
	typedef CppAD::vector<ADScalar> ADVector; 
	CppAD::det_by_lu<ADScalar>    Det(size);

	size_t i;                // temporary index
	size_t m = 1;            // number of dependent variables
	size_t n = size * size;  // number of independent variables
	ADScalar   detA;         // AD value of the determinant
	ADVector   A(n);         // AD version of matrix 
	
	// ------------------------------------------------------
	while(repeat--)
       {	// get the next matrix
		CppAD::uniform_01(n, matrix);

		// set independent variable values
		for(i = 0; i < n; i++)
			A[i] = matrix[i];

		// compute the determinant
		detA = Det(A);

		// create function object f : A -> detA
		detA.diff(0, m);  // index 0 of m dependent variables

		// evaluate and return gradient using reverse mode
		for(i =0; i < n; i++)
			gradient[i] = A[i].d(0); // partial detA w.r.t A[i]
	}
	// ---------------------------------------------------------
	return;
}

Input File: speed/fadbad/det_lu.cpp