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)