@@ -7593,6 +7593,10 @@ static gretl_matrix *series_aggregate (const gretl_matrix *X,
75937593 return A ;
75947594}
75957595
7596+ #define AGGR_SORT_ALL 1
7597+
7598+ #if AGGR_SORT_ALL
7599+
75967600gretl_matrix * matrix_aggregate (const gretl_matrix * X ,
75977601 const gretl_matrix * y ,
75987602 const char * func ,
@@ -7608,11 +7612,12 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
76087612 double rkj ;
76097613 int nx = X -> cols ;
76107614 int nby = 0 ;
7615+ int do_final = 0 ;
76117616 int t1 , t2 , count ;
76127617 int i , j , k ;
76137618
76147619 if (X == NULL || y == NULL || X -> rows != y -> rows ) {
7615- * err = E_INVARG ;
7620+ * err = E_NONCONF ;
76167621 } else if (!get_aggregator (func , & dbuiltin , & ibuiltin )) {
76177622 /* can't handle a user-defined function here */
76187623 return series_aggregate (X , y , func , err );
@@ -7657,14 +7662,17 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
76577662
76587663 for (i = 1 ; i < M -> rows ; i ++ ) {
76597664 by = M -> val [i ];
7665+ if (by > M -> val [i - 1 ] && i == M -> rows - 1 ) {
7666+ do_final = 1 ;
7667+ }
76607668 if (by > M -> val [i - 1 ] || i == M -> rows - 1 ) {
7661- if (i == M -> rows - 1 ) {
7669+ if (i == M -> rows - 1 && by == M -> val [ i - 1 ] ) {
76627670 t2 ++ ;
76637671 }
76647672 /* calculate */
7665- gretl_matrix_set (ret , k , 0 , M -> val [t1 ]);
7673+ gretl_matrix_set (ret , k , 0 , M -> val [i - 1 ]);
76667674 count = t2 - t1 + 1 ;
7667- gretl_matrix_set (ret , k , 1 , count );
7675+ gretl_matrix_set (ret , k , 1 , ( double ) count );
76687676 zsave = z ;
76697677 for (j = 0 ; j < nx ; j ++ ) {
76707678 if (dbuiltin ) {
@@ -7684,11 +7692,115 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
76847692 }
76857693 }
76867694
7695+ if (do_final ) {
7696+ /* handle singleton final row */
7697+ by = M -> val [M -> rows - 1 ];
7698+ t1 = t2 = 0 ;
7699+ count = 1 ;
7700+ gretl_matrix_set (ret , k , 0 , by );
7701+ gretl_matrix_set (ret , k , 1 , (double ) count );
7702+ zsave = z ;
7703+ for (j = 0 ; j < nx ; j ++ ) {
7704+ if (dbuiltin ) {
7705+ rkj = (* dbuiltin )(t1 , t2 , z );
7706+ } else {
7707+ rkj = (double ) (* ibuiltin )(t1 , t2 , z );
7708+ }
7709+ gretl_matrix_set (ret , k , j + 2 , rkj );
7710+ z += M -> rows ;
7711+ }
7712+ }
7713+
76877714 gretl_matrix_free (M );
76887715
76897716 return ret ;
76907717}
76917718
7719+ #else /* not AGGR_SORT_ALL */
7720+
7721+ gretl_matrix * matrix_aggregate (const gretl_matrix * X ,
7722+ const gretl_matrix * y ,
7723+ const char * func ,
7724+ int * err )
7725+ {
7726+ double (* dbuiltin ) (int , int , const double * ) = NULL ;
7727+ int (* ibuiltin ) (int , int , const double * ) = NULL ;
7728+ gretl_matrix * yvals = NULL ;
7729+ gretl_matrix * sel = NULL ;
7730+ gretl_matrix * xi = NULL ;
7731+ gretl_matrix * ret = NULL ;
7732+ double by , rkj ;
7733+ double * z ;
7734+ int n , ni , nx , nby ;
7735+ int i , j , k ;
7736+
7737+ if (X == NULL || y == NULL || X -> rows != y -> rows ) {
7738+ * err = E_NONCONF ;
7739+ } else if (!get_aggregator (func , & dbuiltin , & ibuiltin )) {
7740+ /* can't handle a user-defined function here */
7741+ return series_aggregate (X , y , func , err );
7742+ }
7743+ if (!* err ) {
7744+ yvals = gretl_matrix_values (y -> val , y -> rows , OPT_S , err );
7745+ }
7746+
7747+ if (* err ) {
7748+ return NULL ;
7749+ }
7750+
7751+ n = y -> rows ;
7752+ nby = yvals -> rows ;
7753+ nx = X -> cols ;
7754+
7755+ ret = gretl_matrix_alloc (nby , 2 + nx );
7756+ sel = gretl_matrix_alloc (n , 1 );
7757+
7758+ if (ret == NULL || sel == NULL ) {
7759+ * err = E_ALLOC ;
7760+ gretl_matrix_free (yvals );
7761+ gretl_matrix_free (ret );
7762+ gretl_matrix_free (sel );
7763+ return NULL ;
7764+ }
7765+
7766+ for (i = 0 ; i < nby && !* err ; i ++ ) {
7767+ by = yvals -> val [i ];
7768+ ni = 0 ;
7769+ for (k = 0 ; k < n ; k ++ ) {
7770+ if (y -> val [k ] == by ) {
7771+ sel -> val [k ] = 1.0 ;
7772+ ni ++ ;
7773+ } else {
7774+ sel -> val [k ] = 0.0 ;
7775+ }
7776+ }
7777+ xi = gretl_matrix_bool_sel (X , sel , 1 , err );
7778+ if (* err ) {
7779+ break ;
7780+ }
7781+ gretl_matrix_set (ret , i , 0 , by );
7782+ gretl_matrix_set (ret , i , 1 , (double ) ni );
7783+ z = xi -> val ;
7784+ for (j = 0 ; j < nx ; j ++ ) {
7785+ if (dbuiltin ) {
7786+ rkj = (* dbuiltin )(0 , ni - 1 , z );
7787+ } else {
7788+ rkj = (double ) (* ibuiltin )(0 , ni - 1 , z );
7789+ }
7790+ gretl_matrix_set (ret , i , j + 2 , rkj );
7791+ z += ni ;
7792+ }
7793+ gretl_matrix_free (xi );
7794+ }
7795+
7796+ gretl_matrix_free (yvals );
7797+ gretl_matrix_free (sel );
7798+
7799+ return ret ;
7800+ }
7801+
7802+ #endif /* AGGR_SORT_ALL or not */
7803+
76927804static int monthly_or_quarterly_dates (const DATASET * dset ,
76937805 int pd , double sd0 , int T ,
76947806 double * x )
0 commit comments