2323#include "src/types.h"
2424#include "src/indexing.h"
2525#include "src/ndmath/statistics.h"
26+ #include "src/ndmath/signal.h"
2627
2728#ifdef HAVE_CUBLAS
2829#include <cuda_runtime.h>
@@ -71,7 +72,7 @@ NDArray* ZVAL_TO_NDARRAY(zval* obj) {
7172#ifdef HAVE_GD
7273 /* Check if the zend_object class name is "GdImage" */
7374 if (strcmp (ZSTR_VAL (class_name ), "GdImage" ) == 0 ) {
74- return NDArray_FromGD (obj );
75+ return NDArray_FromGD (obj , false );
7576 }
7677#endif
7778 }
@@ -819,17 +820,17 @@ PHP_METHOD(NDArray, normal) {
819820}
820821
821822/**
822- * NDArray::random_binominal
823+ * NDArray::random_binomial
823824 *
824825 * @param execute_data
825826 * @param return_value
826827 */
827- ZEND_BEGIN_ARG_INFO_EX (arginfo_ndarray_binominal , 0 , 0 , 3 )
828+ ZEND_BEGIN_ARG_INFO_EX (arginfo_ndarray_binomial , 0 , 0 , 3 )
828829 ZEND_ARG_INFO (0 , shape )
829830 ZEND_ARG_INFO (0 , p )
830831 ZEND_ARG_INFO (0 , n )
831832ZEND_END_ARG_INFO ()
832- PHP_METHOD (NDArray , random_binominal ) {
833+ PHP_METHOD (NDArray , random_binomial ) {
833834 NDArray * rtn = NULL ;
834835 int * ishape ;
835836 zval * shape ;
@@ -845,7 +846,7 @@ PHP_METHOD(NDArray, random_binominal) {
845846 for (int i = 0 ; i < NDArray_NUMELEMENTS (nda ); i ++ ) {
846847 ishape [i ] = (int ) NDArray_FDATA (nda )[i ];
847848 }
848- rtn = NDArray_Binominal (ishape , NDArray_NUMELEMENTS (nda ), (int )n , p );
849+ rtn = NDArray_Binomial (ishape , NDArray_NUMELEMENTS (nda ), (int )n , p );
849850 NDArray_FREE (nda );
850851 RETURN_NDARRAY (rtn , return_value );
851852}
@@ -1846,6 +1847,29 @@ PHP_METHOD(NDArray, arccosh) {
18461847 RETURN_NDARRAY (rtn , return_value );
18471848}
18481849
1850+ /**
1851+ * NDArray::fromImage
1852+ *
1853+ * @param execute_data
1854+ * @param return_value
1855+ */
1856+ ZEND_BEGIN_ARG_INFO_EX (arginfo_ndarray_fromimage , 0 , 0 , 1 )
1857+ ZEND_ARG_INFO (0 , image )
1858+ ZEND_ARG_INFO (0 , channelLast )
1859+ ZEND_END_ARG_INFO ()
1860+ PHP_METHOD (NDArray , fromImage ) {
1861+ NDArray * rtn = NULL ;
1862+ zval * image ;
1863+ bool channelLast = true;
1864+ ZEND_PARSE_PARAMETERS_START (1 , 2 )
1865+ Z_PARAM_ZVAL (image )
1866+ Z_PARAM_OPTIONAL
1867+ Z_PARAM_BOOL (channelLast )
1868+ ZEND_PARSE_PARAMETERS_END ();
1869+ rtn = NDArray_FromGD (image , channelLast );
1870+ RETURN_NDARRAY (rtn , return_value );
1871+ }
1872+
18491873/**
18501874 * NDArray::arctanh
18511875 *
@@ -3476,7 +3500,7 @@ PHP_METHOD(NDArray, matrix_rank) {
34763500/**
34773501 * NDArray::convolve2d
34783502 */
3479- ZEND_BEGIN_ARG_INFO (arginfo_ndarray_convolve2d , 0 )
3503+ ZEND_BEGIN_ARG_INFO_EX (arginfo_ndarray_convolve2d , 4 , 0 , 1 )
34803504ZEND_ARG_INFO (0 , a )
34813505ZEND_ARG_INFO (0 , b )
34823506ZEND_ARG_INFO (0 , mode )
@@ -3489,6 +3513,7 @@ PHP_METHOD(NDArray, convolve2d) {
34893513 char * mode , * boundary ;
34903514 double fill_value = 0.0f ;
34913515 size_t size = 1 ;
3516+ int imode = 0 , iboundary = 0 ;
34923517 ZEND_PARSE_PARAMETERS_START (4 , 5 )
34933518 Z_PARAM_ZVAL (a )
34943519 Z_PARAM_ZVAL (b )
@@ -3502,7 +3527,90 @@ PHP_METHOD(NDArray, convolve2d) {
35023527 if (nda == NULL || ndb == NULL ) {
35033528 return ;
35043529 }
3505- rtn = NDArray_Convolve2D (nda , ndb , mode [0 ], boundary [0 ], (float )fill_value );
3530+ switch (mode [0 ]) {
3531+ case 'v' :
3532+ imode = VALID ;
3533+ break ;
3534+ case 's' :
3535+ imode = SAME ;
3536+ break ;
3537+ case 'f' :
3538+ imode = FULL ;
3539+ break ;
3540+ }
3541+ switch (boundary [0 ]) {
3542+ case 'f' :
3543+ iboundary = PAD ;
3544+ break ;
3545+ case 'w' :
3546+ iboundary = CIRCULAR ;
3547+ break ;
3548+ case 's' :
3549+ iboundary = REFLECT ;
3550+ break ;
3551+ }
3552+ rtn = NDArray_Correlate2D (nda , ndb , imode , iboundary , NULL , 1 );
3553+ if (rtn == NULL ) {
3554+ return ;
3555+ }
3556+ CHECK_INPUT_AND_FREE (a , nda );
3557+ CHECK_INPUT_AND_FREE (b , ndb );
3558+ RETURN_NDARRAY (rtn , return_value );
3559+ }
3560+
3561+ /**
3562+ * NDArray::correlate2d
3563+ */
3564+ ZEND_BEGIN_ARG_INFO_EX (arginfo_ndarray_correlate2d , 4 , 0 , 1 )
3565+ ZEND_ARG_INFO (0 , a )
3566+ ZEND_ARG_INFO (0 , b )
3567+ ZEND_ARG_INFO (0 , mode )
3568+ ZEND_ARG_INFO (0 , boundary )
3569+ ZEND_ARG_INFO (0 , fill_value )
3570+ ZEND_END_ARG_INFO ()
3571+ PHP_METHOD (NDArray , correlate2d ) {
3572+ NDArray * rtn ;
3573+ zval * a , * b ;
3574+ char * mode , * boundary ;
3575+ double fill_value = 0.0f ;
3576+ size_t size = 1 ;
3577+ int imode = 0 , iboundary = 0 ;
3578+ ZEND_PARSE_PARAMETERS_START (4 , 5 )
3579+ Z_PARAM_ZVAL (a )
3580+ Z_PARAM_ZVAL (b )
3581+ Z_PARAM_STRING (mode , size )
3582+ Z_PARAM_STRING (boundary , size )
3583+ Z_PARAM_OPTIONAL
3584+ Z_PARAM_DOUBLE (fill_value )
3585+ ZEND_PARSE_PARAMETERS_END ();
3586+ NDArray * nda = ZVAL_TO_NDARRAY (a );
3587+ NDArray * ndb = ZVAL_TO_NDARRAY (b );
3588+ if (nda == NULL || ndb == NULL ) {
3589+ return ;
3590+ }
3591+ switch (mode [0 ]) {
3592+ case 'v' :
3593+ imode = VALID ;
3594+ break ;
3595+ case 's' :
3596+ imode = SAME ;
3597+ break ;
3598+ case 'f' :
3599+ imode = FULL ;
3600+ break ;
3601+ }
3602+ switch (boundary [0 ]) {
3603+ case 'f' :
3604+ iboundary = PAD ;
3605+ break ;
3606+ case 'w' :
3607+ iboundary = CIRCULAR ;
3608+ break ;
3609+ case 's' :
3610+ iboundary = REFLECT ;
3611+ break ;
3612+ }
3613+ rtn = NDArray_Correlate2D (nda , ndb , imode , iboundary , NULL , 0 );
35063614 if (rtn == NULL ) {
35073615 return ;
35083616 }
@@ -4089,13 +4197,14 @@ static const zend_function_entry class_NDArray_methods[] = {
40894197 ZEND_ME (NDArray , full , arginfo_ndarray_full , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
40904198 ZEND_ME (NDArray , fill , arginfo_fill , ZEND_ACC_PUBLIC )
40914199 ZEND_ME (NDArray , array , arginfo_ndarray_array , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
4200+ ZEND_ME (NDArray , fromImage , arginfo_ndarray_fromimage , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
40924201
40934202 // RANDOM
40944203 ZEND_ME (NDArray , normal , arginfo_ndarray_normal , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
40954204 ZEND_ME (NDArray , standard_normal , arginfo_ndarray_standard_normal , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
40964205 ZEND_ME (NDArray , poisson , arginfo_ndarray_poisson , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
40974206 ZEND_ME (NDArray , uniform , arginfo_ndarray_uniform , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
4098- ZEND_ME (NDArray , random_binominal , arginfo_ndarray_binominal , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
4207+ ZEND_ME (NDArray , random_binomial , arginfo_ndarray_binomial , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
40994208
41004209 // LINALG
41014210 ZEND_ME (NDArray , matmul , arginfo_ndarray_matmul , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
@@ -4116,6 +4225,7 @@ static const zend_function_entry class_NDArray_methods[] = {
41164225 ZEND_ME (NDArray , lu , arginfo_ndarray_lu , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
41174226 ZEND_ME (NDArray , matrix_rank , arginfo_ndarray_matrix_rank , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
41184227 ZEND_ME (NDArray , convolve2d , arginfo_ndarray_convolve2d , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
4228+ ZEND_ME (NDArray , correlate2d , arginfo_ndarray_correlate2d , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
41194229
41204230 // LOGIC
41214231 ZEND_ME (NDArray , all , arginfo_ndarray_all , ZEND_ACC_PUBLIC | ZEND_ACC_STATIC )
@@ -4246,9 +4356,9 @@ PHP_MSHUTDOWN_FUNCTION(ndarray) {
42464356}
42474357
42484358PHP_RSHUTDOWN_FUNCTION (ndarray ) {
4249- char * envvar = "NDARRAY_FREEBUFFER " ;
4359+ char * envvar = "NDARRAY_BUFFERLEAK " ;
42504360 char * envvar_vcheck = "NDARRAY_VCHECK" ;
4251- if (getenv (envvar )) {
4361+ if (! getenv (envvar )) {
42524362 buffer_free ();
42534363 }
42544364#ifdef HAVE_CUBLAS
0 commit comments