@@ -1062,6 +1062,13 @@ PHP_METHOD(CArray, det)
1062
1062
RETURN_MEMORYPOINTER (return_value , & rtn_ptr );
1063
1063
}
1064
1064
}
1065
+ PHP_METHOD (CArray , matrix_rank )
1066
+ {
1067
+ zval * a ;
1068
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1069
+ Z_PARAM_ZVAL (a )
1070
+ ZEND_PARSE_PARAMETERS_END ();
1071
+ }
1065
1072
PHP_METHOD (CArray , vdot )
1066
1073
{
1067
1074
MemoryPointer a_ptr , b_ptr , rtn_ptr ;
@@ -1088,6 +1095,34 @@ PHP_METHOD(CArray, vdot)
1088
1095
1089
1096
RETURN_MEMORYPOINTER (return_value , & rtn_ptr );
1090
1097
}
1098
+ PHP_METHOD (CArray , inner )
1099
+ {
1100
+ zval * a ;
1101
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1102
+ Z_PARAM_ZVAL (a )
1103
+ ZEND_PARSE_PARAMETERS_END ();
1104
+ }
1105
+ PHP_METHOD (CArray , outer )
1106
+ {
1107
+ zval * a ;
1108
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1109
+ Z_PARAM_ZVAL (a )
1110
+ ZEND_PARSE_PARAMETERS_END ();
1111
+ }
1112
+ PHP_METHOD (CArray , eig )
1113
+ {
1114
+ zval * a ;
1115
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1116
+ Z_PARAM_ZVAL (a )
1117
+ ZEND_PARSE_PARAMETERS_END ();
1118
+ }
1119
+ PHP_METHOD (CArray , eigvals )
1120
+ {
1121
+ zval * a ;
1122
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1123
+ Z_PARAM_ZVAL (a )
1124
+ ZEND_PARSE_PARAMETERS_END ();
1125
+ }
1091
1126
PHP_METHOD (CArray , svd )
1092
1127
{
1093
1128
int full_matrices_int = 1 , compute_uv_int = 1 , i = 0 ;
@@ -1137,6 +1172,23 @@ PHP_METHOD(CArray, svd)
1137
1172
efree (out_ptr );
1138
1173
efree (rtn );
1139
1174
}
1175
+ PHP_METHOD (CArray , qr )
1176
+ {
1177
+ zval * a ;
1178
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1179
+ Z_PARAM_ZVAL (a )
1180
+ ZEND_PARSE_PARAMETERS_END ();
1181
+
1182
+
1183
+ }
1184
+ PHP_METHOD (CArray , cholesky )
1185
+ {
1186
+ zval * a ;
1187
+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1188
+ Z_PARAM_ZVAL (a )
1189
+ ZEND_PARSE_PARAMETERS_END ();
1190
+
1191
+ }
1140
1192
1141
1193
1142
1194
@@ -2556,12 +2608,23 @@ static zend_function_entry carray_class_methods[] =
2556
2608
// LINEAR ALGEBRA
2557
2609
PHP_ME (CArray , matmul , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2558
2610
PHP_ME (CArray , inv , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2611
+ PHP_ME (CArray , vdot , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2612
+ PHP_ME (CArray , inner , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2613
+ PHP_ME (CArray , outer , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2614
+
2615
+ // EIGNVALUES
2616
+ PHP_ME (CArray , eig , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2617
+ PHP_ME (CArray , eigvals , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2618
+
2619
+ // NORMS
2559
2620
PHP_ME (CArray , norm , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2560
2621
PHP_ME (CArray , det , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2561
- PHP_ME (CArray , vdot , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2622
+ PHP_ME (CArray , matrix_rank , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2562
2623
2563
2624
// DECOMPOSITIONS
2564
2625
PHP_ME (CArray , svd , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2626
+ PHP_ME (CArray , cholesky , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2627
+ PHP_ME (CArray , qr , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
2565
2628
2566
2629
// ARITHMETIC
2567
2630
PHP_ME (CArray , add , NULL , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
@@ -2701,6 +2764,36 @@ static int carray_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zv
2701
2764
}
2702
2765
}
2703
2766
2767
+ static int carray_compare (zval * object1 , zval * object2 TSRMLS_DC ) /* {{{ */
2768
+ {
2769
+ CArray * a , * b ;
2770
+ MemoryPointer ptr1 , ptr2 ;
2771
+ ZVAL_TO_MEMORYPOINTER (object1 , & ptr1 , NULL );
2772
+ ZVAL_TO_MEMORYPOINTER (object2 , & ptr2 , NULL );
2773
+
2774
+ a = CArray_FromMemoryPointer (& ptr1 );
2775
+ b = CArray_FromMemoryPointer (& ptr2 );
2776
+
2777
+ if (CArray_DATA (a ) == CArray_DATA (b )) {
2778
+ return SUCCESS ;
2779
+ }
2780
+ return FAILURE ;
2781
+ }
2782
+
2783
+ int
2784
+ carray_count (zval * object , long * count TSRMLS_DC ) {
2785
+ MemoryPointer ptr ;
2786
+ CArray * target ;
2787
+ ZVAL_TO_MEMORYPOINTER (object , & ptr , NULL );
2788
+ target = CArray_FromMemoryPointer (& ptr );
2789
+ if (CArray_NDIM (target ) > 0 ) {
2790
+ * count = (long )CArray_DIMS (target )[0 ];
2791
+ } else {
2792
+ * count = (long )1 ;
2793
+ }
2794
+ return SUCCESS ;
2795
+ }
2796
+
2704
2797
static int carray_do_operation (zend_uchar opcode , zval * result , zval * op1 , zval * op2 ) /* {{{ */
2705
2798
{
2706
2799
zval op1_copy ;
@@ -2720,6 +2813,12 @@ static int carray_do_operation(zend_uchar opcode, zval *result, zval *op1, zval
2720
2813
return retval ;
2721
2814
}
2722
2815
2816
+ static int
2817
+ carray_cast (zval * readobj , zval * retval , int type ) {
2818
+ throw_valueerror_exception ("Use astype() for casting" );
2819
+ return FAILURE ;
2820
+ }
2821
+
2723
2822
/**
2724
2823
* MINIT
2725
2824
*/
@@ -2730,10 +2829,11 @@ static PHP_MINIT_FUNCTION(carray)
2730
2829
carray_sc_entry = zend_register_internal_class (& ce );
2731
2830
carray_sc_entry -> create_object = carray_create_object ;
2732
2831
2733
-
2734
2832
memcpy (& carray_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
2735
2833
carray_object_handlers .do_operation = carray_do_operation ;
2736
-
2834
+ carray_object_handlers .compare_objects = carray_compare ;
2835
+ carray_object_handlers .cast_object = carray_cast ;
2836
+ carray_object_handlers .count_elements = carray_count ;
2737
2837
2738
2838
zend_class_implements (carray_sc_entry , 1 , zend_ce_arrayaccess );
2739
2839
0 commit comments