197 lines
4.8 KiB
C++
197 lines
4.8 KiB
C++
//
|
|
// php-armadillo/dense_matrix.cc
|
|
//
|
|
// @Author CismonX
|
|
//
|
|
|
|
#include "dense_matrix.hh"
|
|
#include "dense.hh"
|
|
#include "matrix.hh"
|
|
#include "mapval.hh"
|
|
#include "mat.hh"
|
|
|
|
#include <armadillo>
|
|
|
|
namespace php_arma
|
|
{
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, __invoke, T, T1)
|
|
{
|
|
zend_long i, j;
|
|
ZEND_PARSE_PARAMETERS_START(1, 2)
|
|
Z_PARAM_LONG(i)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_LONG(j)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
|
|
zend_object *zobj;
|
|
try {
|
|
if (EX_NUM_ARGS() == 1) {
|
|
zobj = mapval_dense<T>::create(&native->operator()(i));
|
|
} else {
|
|
zobj = mapval_dense<T>::create(&native->operator()(i, j));
|
|
}
|
|
} catch (const std::logic_error& err) {
|
|
zend_throw_exception(zend_ce_exception, "index out of bounds", 0);
|
|
return;
|
|
}
|
|
|
|
RETVAL_OBJ(zobj);
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, at, T, T1)
|
|
{
|
|
zend_long i, j;
|
|
ZEND_PARSE_PARAMETERS_START(1, 2)
|
|
Z_PARAM_LONG(i)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_LONG(j)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
|
|
zend_object *zobj;
|
|
if (EX_NUM_ARGS() == 1) {
|
|
zobj = mapval_dense<T>::create(&native->at(i));
|
|
} else {
|
|
zobj = mapval_dense<T>::create(&native->at(i, j));
|
|
}
|
|
RETVAL_OBJ(zobj);
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, col, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, row, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, cols, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, rows, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, submat, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, headCols, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, headRows, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, tailCols, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, tailRows, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, diag, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, eachRow, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, eachCol, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, i, T, T1)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_matrix, isSympd, T, T1)
|
|
{
|
|
zval *tol = nullptr;
|
|
ZEND_PARSE_PARAMETERS_START(0, 1)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_ZVAL_DEREF(tol)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
|
|
if constexpr (std::is_same_v<T, zend_long>) {
|
|
zend_throw_exception(zend_ce_error, "Method isSympd() is not supported on IMat.", 0);
|
|
} else {
|
|
if (tol == nullptr) {
|
|
RETURN_BOOL(native->is_sympd());
|
|
}
|
|
|
|
using base_t = typename arma::get_pod_type<T>::result;
|
|
if (!zval_check_scalar<base_t>(tol)) {
|
|
return;
|
|
}
|
|
RETVAL_BOOL(native->is_sympd(zval_get_scalar<base_t>(tol)));
|
|
}
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_START_ME(dense_matrix, T, T1)
|
|
PHP_ARMA_ME(__invoke, ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER)
|
|
PHP_ARMA_ME(at, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(col, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(row, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(cols, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(rows, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(submat, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(headCols, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(headRows, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(tailCols, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(tailRows, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(diag, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(eachRow, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(eachCol, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(i, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(isSympd, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_END_ME();
|
|
|
|
void dense_matrix_init()
|
|
{
|
|
dense_matrix_ce = interface_register<dense_matrix_php_name>(dense_ce, matrix_ce);
|
|
}
|
|
|
|
PHP_ARMA_INSTANTIATE(dense_matrix, mat);
|
|
}
|