252 lines
8.0 KiB
C++
252 lines
8.0 KiB
C++
//
|
|
// php-armadillo/dense_resizable_matrix.cc
|
|
//
|
|
// @Author CismonX
|
|
//
|
|
|
|
#include "dense_resizable_matrix.hh"
|
|
#include "constants.hh"
|
|
#include "dense_matrix.hh"
|
|
#include "resizable_matrix.hh"
|
|
#include "mat.hh"
|
|
#include "subview_mat.hh"
|
|
|
|
#include <armadillo>
|
|
|
|
namespace php_arma
|
|
{
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, ones, T, T1)
|
|
{
|
|
zend_long n_rows = 0;
|
|
zend_long n_cols = 0;
|
|
ZEND_PARSE_PARAMETERS_START(0, 2)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_LONG(n_rows)
|
|
Z_PARAM_LONG(n_cols)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
native->ones(n_rows, n_cols);
|
|
RETVAL_THIS();
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, randu, T, T1)
|
|
{
|
|
zend_long n_rows = 0;
|
|
zend_long n_cols = 0;
|
|
ZEND_PARSE_PARAMETERS_START(0, 2)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_LONG(n_rows)
|
|
Z_PARAM_LONG(n_cols)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
native->randu(n_rows, n_cols);
|
|
RETVAL_THIS();
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, randn, T, T1)
|
|
{
|
|
zend_long n_rows = 0;
|
|
zend_long n_cols = 0;
|
|
ZEND_PARSE_PARAMETERS_START(0, 2)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_LONG(n_rows)
|
|
Z_PARAM_LONG(n_cols)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
native->randn(n_rows, n_cols);
|
|
RETVAL_THIS();
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, insertRows, T, ChildT)
|
|
{
|
|
zend_long row_idx;
|
|
zval *rows;
|
|
zend_bool set_to_zero = true;
|
|
ZEND_PARSE_PARAMETERS_START(2, 3)
|
|
Z_PARAM_LONG(row_idx)
|
|
Z_PARAM_ZVAL(rows)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_BOOL(set_to_zero)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
try {
|
|
if (Z_TYPE_P(rows) == IS_LONG) {
|
|
native->insert_rows(row_idx, Z_LVAL_P(rows), set_to_zero);
|
|
} else if (Z_TYPE_P(rows) == IS_OBJECT) {
|
|
if (Z_OBJCE_P(rows) == ChildT::ce) {
|
|
auto rows_obj = to_native_object<typename ChildT::native_t>(Z_OBJ_P(rows));
|
|
native->insert_rows(row_idx, *rows_obj);
|
|
} else if (Z_OBJCE_P(rows) == ChildT::subview_t::ce) {
|
|
auto rows_obj = to_native_object<typename ChildT::subview_t::native_t>(Z_OBJ_P(rows));
|
|
native->insert_rows(row_idx, *rows_obj);
|
|
} else {
|
|
ex_bad_type(ZSTR_VAL(dense_matrix_ce->name), zval_get_type_name(rows));
|
|
}
|
|
} else {
|
|
ex_bad_type("int or object", zval_get_type_name(rows));
|
|
}
|
|
} catch (const std::logic_error& err) {
|
|
throw_error(err.what());
|
|
}
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, insertCols, T, ChildT)
|
|
{
|
|
zend_long col_idx;
|
|
zval *cols;
|
|
zend_bool set_to_zero = true;
|
|
ZEND_PARSE_PARAMETERS_START(2, 3)
|
|
Z_PARAM_LONG(col_idx)
|
|
Z_PARAM_ZVAL(cols)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_BOOL(set_to_zero)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
try {
|
|
if (Z_TYPE_P(cols) == IS_LONG) {
|
|
native->insert_cols(col_idx, Z_LVAL_P(cols), set_to_zero);
|
|
} else if (Z_TYPE_P(cols) == IS_OBJECT) {
|
|
if (Z_OBJCE_P(cols) == ChildT::ce) {
|
|
auto cols_obj = to_native_object<typename ChildT::native_t>(Z_OBJ_P(cols));
|
|
native->insert_cols(col_idx, *cols_obj);
|
|
} else if (Z_OBJCE_P(cols) == ChildT::subview_t::ce) {
|
|
auto cols_obj = to_native_object<typename ChildT::subview_t::native_t>(Z_OBJ_P(cols));
|
|
native->insert_cols(col_idx, *cols_obj);
|
|
} else {
|
|
ex_bad_type(ZSTR_VAL(dense_matrix_ce->name), zval_get_type_name(cols));
|
|
}
|
|
} else {
|
|
ex_bad_type("int or object", zval_get_type_name(cols));
|
|
}
|
|
} catch (const std::logic_error& err) {
|
|
throw_error(err.what());
|
|
}
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, swap, T, ChildT)
|
|
{
|
|
zval *other;
|
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
|
Z_PARAM_OBJECT(other)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
|
|
if (UNEXPECTED(ChildT::ce != Z_OBJCE_P(other))) {
|
|
ex_bad_type(zval_get_type_name(&EX(This)), zval_get_type_name(other));
|
|
return;
|
|
}
|
|
|
|
native->swap(*Z_NATIVE_OBJ_P(other));
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, isSorted, T, T1)
|
|
{
|
|
zend_long sort_direction = sort_direction::ascend;
|
|
zend_long dim = 0;
|
|
ZEND_PARSE_PARAMETERS_START(0, 2)
|
|
Z_PARAM_OPTIONAL
|
|
Z_PARAM_LONG(sort_direction)
|
|
Z_PARAM_LONG(dim)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
auto native = THIS_NATIVE;
|
|
RETVAL_BOOL(native->is_sorted(sort_direction::native(sort_direction), dim));
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, headCols, T, ChildT)
|
|
{
|
|
zend_long n_cols;
|
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
|
Z_PARAM_LONG(n_cols)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
using ret_t = typename ChildT::subview_t;
|
|
|
|
auto native = THIS_NATIVE;
|
|
auto zobj = ret_t::create(std::move(native->head_cols(n_cols)));
|
|
RETVAL_OBJ(zobj);
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, headRows, T, ChildT)
|
|
{
|
|
zend_long n_rows;
|
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
|
Z_PARAM_LONG(n_rows)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
using ret_t = typename ChildT::subview_t;
|
|
|
|
auto native = THIS_NATIVE;
|
|
auto zobj = ret_t::create(std::move(native->head_rows(n_rows)));
|
|
RETVAL_OBJ(zobj);
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, tailCols, T, ChildT)
|
|
{
|
|
zend_long n_cols;
|
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
|
Z_PARAM_LONG(n_cols)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
using ret_t = typename ChildT::subview_t;
|
|
|
|
auto native = THIS_NATIVE;
|
|
auto zobj = ret_t::create(std::move(native->tail_cols(n_cols)));
|
|
RETVAL_OBJ(zobj);
|
|
}
|
|
|
|
template <typename T, typename ChildT>
|
|
PHP_ARMA_METHOD(dense_resizable_matrix, tailRows, T, ChildT)
|
|
{
|
|
zend_long n_rows;
|
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
|
Z_PARAM_LONG(n_rows)
|
|
ZEND_PARSE_PARAMETERS_END();
|
|
|
|
using ret_t = typename ChildT::subview_t;
|
|
|
|
auto native = THIS_NATIVE;
|
|
auto zobj = ret_t::create(std::move(native->tail_rows(n_rows)));
|
|
RETVAL_OBJ(zobj);
|
|
}
|
|
|
|
template <typename T, typename T1>
|
|
PHP_ARMA_START_ME(dense_resizable_matrix, T, T1)
|
|
PHP_ARMA_ME(ones, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(randu, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(randn, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(insertRows, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(insertCols, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(swap, ZEND_ACC_PUBLIC)
|
|
PHP_ARMA_ME(isSorted, 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_END_ME();
|
|
|
|
void dense_resizable_matrix_init()
|
|
{
|
|
dense_resizable_matrix_ce = interface_register<dense_resizable_matrix_php_name>(
|
|
dense_matrix_ce, resizable_matrix_ce);
|
|
}
|
|
|
|
PHP_ARMA_INSTANTIATE(dense_resizable_matrix, mat);
|
|
}
|