@@ -7565,6 +7565,34 @@ gretl_matrix *aggregate_by (const double *x,
75657565 return m ;
75667566}
75677567
7568+ /* Remedial function for the case where we try the matrix variant
7569+ of aggregate but the aggregator function turns out not to be
7570+ a built-in: we fall back to the "convert to series" case.
7571+ */
7572+
7573+ static gretl_matrix * series_aggregate (const gretl_matrix * X ,
7574+ const gretl_matrix * y ,
7575+ const char * func ,
7576+ int * err )
7577+ {
7578+ gretl_matrix * A = NULL ;
7579+ DATASET * dset = NULL ;
7580+ int * xlist = NULL ;
7581+ int * ylist = NULL ;
7582+
7583+ dset = matrix_dset_plus_lists (X , y , & xlist , & ylist , err );
7584+
7585+ if (!* err ) {
7586+ A = aggregate_by (NULL , NULL , xlist , ylist , func , dset , err );
7587+ }
7588+
7589+ destroy_dataset (dset );
7590+ free (xlist );
7591+ free (ylist );
7592+
7593+ return A ;
7594+ }
7595+
75687596gretl_matrix * matrix_aggregate (const gretl_matrix * X ,
75697597 const gretl_matrix * y ,
75707598 const char * func ,
@@ -7586,8 +7614,8 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
75867614 if (X == NULL || y == NULL || X -> rows != y -> rows ) {
75877615 * err = E_INVARG ;
75887616 } else if (!get_aggregator (func , & dbuiltin , & ibuiltin )) {
7589- // fc = get_user_aggrby_call(func, 3, NULL, err);
7590- * err = E_INVARG ;
7617+ /* can't handle a user-defined function here */
7618+ return series_aggregate ( X , y , func , err ) ;
75917619 }
75927620
75937621 if (* err ) {
@@ -7623,37 +7651,36 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
76237651 ret = gretl_zero_matrix_new (nby , 2 + nx );
76247652
76257653 z = M -> val + M -> rows ;
7654+ by = M -> val [0 ];
76267655 t2 = t1 = 0 ;
76277656 k = 0 ;
76287657
7629- for (i = 0 ; i < M -> rows ; i ++ ) {
7658+ for (i = 1 ; i < M -> rows ; i ++ ) {
76307659 by = M -> val [i ];
7631- if (i > 0 ) {
7632- if (by > M -> val [i - 1 ] || i == M -> rows - 1 ) {
7633- if (i == M -> rows - 1 ) {
7634- t2 ++ ;
7635- }
7636- /* calculate */
7637- gretl_matrix_set (ret , k , 0 , M -> val [t1 ]);
7638- count = t2 - t1 + 1 ;
7639- gretl_matrix_set (ret , k , 1 , count );
7640- zsave = z ;
7641- for (j = 0 ; j < nx ; j ++ ) {
7642- if (dbuiltin ) {
7643- rkj = (* dbuiltin )(t1 , t2 , z );
7644- } else {
7645- rkj = (double ) (* ibuiltin )(t1 , t2 , z );
7646- }
7647- gretl_matrix_set (ret , k , j + 2 , rkj );
7648- z += M -> rows ;
7649- }
7650- z = zsave + count ;
7651- k ++ ;
7652- t1 = t2 = 0 ;
7653- } else {
7654- /* increment sample range */
7660+ if (by > M -> val [i - 1 ] || i == M -> rows - 1 ) {
7661+ if (i == M -> rows - 1 ) {
76557662 t2 ++ ;
76567663 }
7664+ /* calculate */
7665+ gretl_matrix_set (ret , k , 0 , M -> val [t1 ]);
7666+ count = t2 - t1 + 1 ;
7667+ gretl_matrix_set (ret , k , 1 , count );
7668+ zsave = z ;
7669+ for (j = 0 ; j < nx ; j ++ ) {
7670+ if (dbuiltin ) {
7671+ rkj = (* dbuiltin )(t1 , t2 , z );
7672+ } else {
7673+ rkj = (double ) (* ibuiltin )(t1 , t2 , z );
7674+ }
7675+ gretl_matrix_set (ret , k , j + 2 , rkj );
7676+ z += M -> rows ;
7677+ }
7678+ z = zsave + count ;
7679+ k ++ ;
7680+ t1 = t2 = 0 ;
7681+ } else {
7682+ /* increment sample range */
7683+ t2 ++ ;
76577684 }
76587685 }
76597686
0 commit comments