packages feed

eigen-1.0.0: eigen-proxy.cpp

#include "eigen-proxy.h"
#include <Eigen/LU>
#include <Eigen/LeastSquares>
#include <stdio.h>
#include <sstream>

struct eigen_assert_exception : std::exception {
	std::string _what;
	eigen_assert_exception(const std::string& what) : _what(what) {}
	~eigen_assert_exception() throw () {}
	const char* what() const throw () { return _what.c_str(); }
};

void eigen_assert_fail(const char* condition, const char* function, const char* file, int line) {
	std::ostringstream os;
    os << "assertion failed: " << condition << " in function " << function << " at " << file << ":" << line << std::endl;
    throw eigen_assert_exception(os.str());
}

MatrixXd* eigen_create(int rows, int cols) { return new MatrixXd(rows, cols); }
MatrixXd* eigen_clone(const MatrixXd& m) { return new MatrixXd(m); }
void eigen_destroy(const MatrixXd* m) { delete m; }
const char* eigen_set(MatrixXd& dst, int row, int col, double val) { GUARD_START dst(row,col) = val; GUARD_END }
const char* eigen_get(double&r, const MatrixXd& m, int row, int col) { GUARD_START r = m(row,col); GUARD_END }
int eigen_rows(const MatrixXd& m) { return m.rows(); } 
int eigen_cols(const MatrixXd& m) { return m.cols(); }
double* eigen_data(MatrixXd& m) { return m.data(); } 
void eigen_copy(MatrixXd& dst, const MatrixXd& src) { dst = src; }
void eigen_resize(MatrixXd& m, int rows, int cols) { m.resize(rows, cols); }
const char* eigen_add(MatrixXd& ret, const MatrixXd& lhs, const MatrixXd& rhs) { GUARD_START ret = lhs + rhs; GUARD_END }
const char* eigen_sub(MatrixXd& ret, const MatrixXd& lhs, const MatrixXd& rhs) { GUARD_START ret = lhs - rhs; GUARD_END }
const char* eigen_mul(MatrixXd& ret, const MatrixXd& lhs, const MatrixXd& rhs) { GUARD_START ret = lhs * rhs; GUARD_END }
double eigen_norm(const MatrixXd& m) { return m.norm(); }
double eigen_squaredNorm(const MatrixXd& m) { return m.squaredNorm(); }
double eigen_blueNorm(const MatrixXd& m) { return m.squaredNorm(); }
// double mstableNorm(const MatrixXd& m) { return m.stableNorm(); }
double eigen_hypotNorm(const MatrixXd& m) { return m.hypotNorm(); }
double eigen_sum(const MatrixXd& m) { return m.sum(); }
double eigen_prod(const MatrixXd& m) { return m.prod(); }
double eigen_mean(const MatrixXd& m) { return m.mean(); }
double eigen_minCoeff(const MatrixXd& m) { return m.minCoeff(); }
double eigen_maxCoeff(const MatrixXd& m) { return m.maxCoeff(); }
double eigen_trace(const MatrixXd& m) { return m.trace(); }

const char* eigen_inverse(MatrixXd& m) { GUARD_START m = m.inverse().eval(); GUARD_END }
const char* eigen_adjoint(MatrixXd& m) { GUARD_START m.adjointInPlace(); GUARD_END }
const char* eigen_transpose(MatrixXd& m) { GUARD_START m.transposeInPlace(); GUARD_END }
const char* eigen_normalize(MatrixXd& m) { GUARD_START m.normalize(); GUARD_END }
const char* eigen_conjugate(MatrixXd& m) { GUARD_START m = m.conjugate().eval(); GUARD_END }


double eigen_determinant(const MatrixXd& m) { return m.determinant(); }

const char* eigen_solve(Decomposition d, MatrixXd& x, const MatrixXd& A, const MatrixXd& b) {
	GUARD_START
	switch (d) {
		case ::PartialPivLU:
			x = A.partialPivLu().solve(b); 
			break;
		case ::FullPivLU:
			x = A.fullPivLu().solve(b); 
			break;
		case ::HouseholderQR:
			x = A.householderQr().solve(b); 
			break;
		case ::ColPivHouseholderQR:
			x = A.colPivHouseholderQr().solve(b); 
			break;
		case ::FullPivHouseholderQR: 
			x = A.fullPivHouseholderQr().solve(b); 
			break;
		case ::LLT:
			x = A.llt().solve(b); 
			break;
		case ::LDLT:
			x = A.ldlt().solve(b); 
			break;
		case ::JacobiSVD:
			x = A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b); 
			break;
	}
	GUARD_END
}

const char* eigen_relativeError(double& e, const MatrixXd& x, const MatrixXd& A, const MatrixXd& b) {
	GUARD_START
	e = (A*x - b).norm() / b.norm();
	GUARD_END
}

void eigen_initParallel() {
	initParallel();
}

void eigen_setNbThreads(int n) {
	setNbThreads(n);
}