1 # ifndef CPPAD_UTILITY_LU_SOLVE_HPP 
    2 # define CPPAD_UTILITY_LU_SOLVE_HPP 
  256 template <
typename Float>
 
  258 {    
return x <= Float(0); }
 
  259 inline bool LeqZero( 
const std::complex<double> &x )
 
  260 {    
return x == std::complex<double>(0); }
 
  261 inline bool LeqZero( 
const std::complex<float> &x )
 
  262 {    
return x == std::complex<float>(0); }
 
  265 template <
typename Float, 
typename FloatVector>
 
  269      const FloatVector &A      ,
 
  270      const FloatVector &B      ,
 
  275      CheckNumericType<Float>();
 
  278      CheckSimpleVector<Float, FloatVector>();
 
  288      std::vector<size_t> ip(n);
 
  289      std::vector<size_t> jp(n);
 
  293           size_t(A.size()) == n * n,
 
  294           "Error in LuSolve: A must have size equal to n * n" 
  297           size_t(B.size()) == n * m,
 
  298           "Error in LuSolve: B must have size equal to n * m" 
  301           size_t(X.size()) == n * m,
 
  302           "Error in LuSolve: X must have size equal to n * m" 
  317      for(p = 0; p < n; p++)
 
  319           pivot   = Lu[ ip[p] * n + jp[p] ];
 
  330           {    logdet += 
log( - pivot );
 
  333           else logdet += 
log( pivot );
 
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution. 
int LuSolve(size_t n, size_t m, const FloatVector &A, const FloatVector &B, FloatVector &X, Float &logdet)
AD< Base > log(const AD< Base > &x)
Define the CppAD error checking macros (all of which begin with CPPAD_ASSERT_) 
void LuInvert(const SizeVector &ip, const SizeVector &jp, const FloatVector &LU, FloatVector &B)
int LuFactor(SizeVector &ip, SizeVector &jp, FloatVector &LU)
bool LeqZero(const Float &x)