Skip to content

Commit fac3281

Browse files
committed
more on aggregate() experiment: fix singleton case
1 parent 17db292 commit fac3281

File tree

1 file changed

+116
-4
lines changed

1 file changed

+116
-4
lines changed

lib/src/genfuncs.c

+116-4
Original file line numberDiff line numberDiff line change
@@ -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+
75967600
gretl_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+
76927804
static int monthly_or_quarterly_dates (const DATASET *dset,
76937805
int pd, double sd0, int T,
76947806
double *x)

0 commit comments

Comments
 (0)