@@ -7593,6 +7593,10 @@ static gretl_matrix *series_aggregate (const gretl_matrix *X,
7593
7593
return A ;
7594
7594
}
7595
7595
7596
+ #define AGGR_SORT_ALL 1
7597
+
7598
+ #if AGGR_SORT_ALL
7599
+
7596
7600
gretl_matrix * matrix_aggregate (const gretl_matrix * X ,
7597
7601
const gretl_matrix * y ,
7598
7602
const char * func ,
@@ -7608,11 +7612,12 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
7608
7612
double rkj ;
7609
7613
int nx = X -> cols ;
7610
7614
int nby = 0 ;
7615
+ int do_final = 0 ;
7611
7616
int t1 , t2 , count ;
7612
7617
int i , j , k ;
7613
7618
7614
7619
if (X == NULL || y == NULL || X -> rows != y -> rows ) {
7615
- * err = E_INVARG ;
7620
+ * err = E_NONCONF ;
7616
7621
} else if (!get_aggregator (func , & dbuiltin , & ibuiltin )) {
7617
7622
/* can't handle a user-defined function here */
7618
7623
return series_aggregate (X , y , func , err );
@@ -7657,14 +7662,17 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
7657
7662
7658
7663
for (i = 1 ; i < M -> rows ; i ++ ) {
7659
7664
by = M -> val [i ];
7665
+ if (by > M -> val [i - 1 ] && i == M -> rows - 1 ) {
7666
+ do_final = 1 ;
7667
+ }
7660
7668
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 ] ) {
7662
7670
t2 ++ ;
7663
7671
}
7664
7672
/* calculate */
7665
- gretl_matrix_set (ret , k , 0 , M -> val [t1 ]);
7673
+ gretl_matrix_set (ret , k , 0 , M -> val [i - 1 ]);
7666
7674
count = t2 - t1 + 1 ;
7667
- gretl_matrix_set (ret , k , 1 , count );
7675
+ gretl_matrix_set (ret , k , 1 , ( double ) count );
7668
7676
zsave = z ;
7669
7677
for (j = 0 ; j < nx ; j ++ ) {
7670
7678
if (dbuiltin ) {
@@ -7684,11 +7692,115 @@ gretl_matrix *matrix_aggregate (const gretl_matrix *X,
7684
7692
}
7685
7693
}
7686
7694
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
+
7687
7714
gretl_matrix_free (M );
7688
7715
7689
7716
return ret ;
7690
7717
}
7691
7718
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
+
7692
7804
static int monthly_or_quarterly_dates (const DATASET * dset ,
7693
7805
int pd , double sd0 , int T ,
7694
7806
double * x )
0 commit comments