This repository has been archived on 2020-06-07. You can view files and clone it, but cannot push or open issues or pull requests.
php-armadillo/src/dense_resizable_matrix.cc

269 lines
8.6 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"
namespace php_arma
{
template <typename T, typename ChildT>
PHP_ARMA_METHOD(dense_resizable_matrix, init, T, ChildT)
{
zend_long n_rows = 0;
zend_long n_cols = 0;
zend_long fill = fill::none;
ZEND_PARSE_PARAMETERS_START(0, 3)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(n_rows)
Z_PARAM_LONG(n_cols)
Z_PARAM_LONG(fill)
ZEND_PARSE_PARAMETERS_END();
auto zobj = ChildT::create(n_rows, n_cols);
fill::invoke(ZOBJ_NATIVE(zobj), fill);
RETVAL_OBJ(zobj);
}
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();
if (UNEXPECTED(ChildT::ce != Z_OBJCE_P(other))) {
ex_bad_type(get_type_name<ChildT>(), zval_get_type_name(other));
return;
}
auto native = THIS_NATIVE;
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(&EX(This), 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(&EX(This), 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(&EX(This), 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(&EX(This), 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(init, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
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);
}