Skip to content

Commit 17db292

Browse files
committed
more on matrix variant of aggregate()
1 parent e1c633c commit 17db292

File tree

1 file changed

+54
-27
lines changed

1 file changed

+54
-27
lines changed

lib/src/genfuncs.c

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
75687596
gretl_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

Comments
 (0)