// // 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 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 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 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 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 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(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(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 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(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(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 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(), zval_get_type_name(other)); return; } auto native = THIS_NATIVE; native->swap(*Z_NATIVE_OBJ_P(other)); } template 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 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 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 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 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 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_matrix_ce, resizable_matrix_ce); } PHP_ARMA_INSTANTIATE(dense_resizable_matrix, mat); }