projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Test individual-cell summary functions for scale varaibles.
[pspp]
/
src
/
data
/
casereader-translator.c
diff --git
a/src/data/casereader-translator.c
b/src/data/casereader-translator.c
index fc823049d570df34863291ab4b0650f2cba6d26b..996dc24f5a55a6bcdf94a526bca2744c42d6fe23 100644
(file)
--- a/
src/data/casereader-translator.c
+++ b/
src/data/casereader-translator.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2007, 2009
, 2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@
-15,15
+15,16
@@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
-#include <data/val-type.h>
-#include <data/casereader.h>
+
#include <stdlib.h>
#include <stdlib.h>
-#include <data/variable.h>
-#include <data/casereader-provider.h>
-#include <libpspp/taint.h>
+#include "data/casereader-provider.h"
+#include "data/casereader.h"
+#include "data/val-type.h"
+#include "data/variable.h"
+#include "libpspp/taint.h"
-#include "xalloc.h"
+#include "
gl/
xalloc.h"
/* Casereader that applies a user-supplied function to translate
each case into another in an arbitrary fashion. */
/* Casereader that applies a user-supplied function to translate
each case into another in an arbitrary fashion. */
@@
-74,7
+75,7
@@
casereader_create_translator (struct casereader *subreader,
ct->destroy = destroy;
ct->aux = aux;
reader = casereader_create_sequential (
ct->destroy = destroy;
ct->aux = aux;
reader = casereader_create_sequential (
- NULL, output_proto, casereader_get_
case_cnt
(ct->subreader),
+ NULL, output_proto, casereader_get_
n_cases
(ct->subreader),
&casereader_translator_class, ct);
taint_propagate (casereader_get_taint (ct->subreader),
casereader_get_taint (reader));
&casereader_translator_class, ct);
taint_propagate (casereader_get_taint (ct->subreader),
casereader_get_taint (reader));
@@
-169,7
+170,7
@@
casereader_translate_stateless (
cst->destroy = destroy;
cst->aux = aux;
reader = casereader_create_random (
cst->destroy = destroy;
cst->aux = aux;
reader = casereader_create_random (
- output_proto, casereader_get_
case_cnt
(cst->subreader),
+ output_proto, casereader_get_
n_cases
(cst->subreader),
&casereader_stateless_translator_class, cst);
taint_propagate (casereader_get_taint (cst->subreader),
casereader_get_taint (reader));
&casereader_stateless_translator_class, cst);
taint_propagate (casereader_get_taint (cst->subreader),
casereader_get_taint (reader));
@@
-201,10
+202,10
@@
casereader_stateless_translator_destroy (struct casereader *reader UNUSED,
static void
casereader_stateless_translator_advance (struct casereader *reader UNUSED,
static void
casereader_stateless_translator_advance (struct casereader *reader UNUSED,
- void *cst_, casenumber
cnt
)
+ void *cst_, casenumber
n
)
{
struct casereader_stateless_translator *cst = cst_;
{
struct casereader_stateless_translator *cst = cst_;
- cst->case_offset += casereader_advance (cst->subreader,
cnt
);
+ cst->case_offset += casereader_advance (cst->subreader,
n
);
}
/* Casereader class for stateless translating casereader. */
}
/* Casereader class for stateless translating casereader. */
@@
-263,7
+264,7
@@
can_translate (struct ccase *c, void *can_)
struct casereader_append_numeric *can = can_;
double new_value = can->func (c, can->n++, can->aux);
c = case_unshare_and_resize (c, can->proto);
struct casereader_append_numeric *can = can_;
double new_value = can->func (c, can->n++, can->aux);
c = case_unshare_and_resize (c, can->proto);
-
case_data_rw_idx (c, caseproto_get_n_widths (can->proto) - 1)->f
= new_value;
+
*case_num_rw_idx (c, caseproto_get_n_widths (can->proto) - 1)
= new_value;
return c;
}
return c;
}
@@
-308,7
+309,7
@@
struct casereader *
casereader_create_arithmetic_sequence (struct casereader *subreader,
double first, double increment)
{
casereader_create_arithmetic_sequence (struct casereader *subreader,
double first, double increment)
{
- struct arithmetic_sequence *as =
xzalloc (sizeof *as
);
+ struct arithmetic_sequence *as =
XZALLOC (struct arithmetic_sequence
);
as->first = first;
as->increment = increment;
return casereader_create_append_numeric (subreader, next_arithmetic,
as->first = first;
as->increment = increment;
return casereader_create_append_numeric (subreader, next_arithmetic,
@@
-356,7
+357,7
@@
static struct ccase *car_translate (struct ccase *input, void *car_);
If DISTINCT_CALLBACK is non-null, then it will be called exactly
once for every case containing a distinct value of V. AUX is
If DISTINCT_CALLBACK is non-null, then it will be called exactly
once for every case containing a distinct value of V. AUX is
- an auxil
l
iary pointer passed to DISTINCT_CALLBACK.
+ an auxiliary pointer passed to DISTINCT_CALLBACK.
After this function is called, SUBREADER must not ever again
be referenced directly. It will be destroyed automatically
After this function is called, SUBREADER must not ever again
be referenced directly. It will be destroyed automatically
@@
-368,7
+369,7
@@
casereader_create_append_rank (struct casereader *subreader,
enum rank_error *err,
distinct_func *distinct_callback,
void *aux
enum rank_error *err,
distinct_func *distinct_callback,
void *aux
-
)
+ )
{
struct casereader_append_rank *car = xmalloc (sizeof *car);
car->proto = caseproto_ref (casereader_get_proto (subreader));
{
struct casereader_append_rank *car = xmalloc (sizeof *car);
car->proto = caseproto_ref (casereader_get_proto (subreader));
@@
-404,23
+405,23
@@
car_translate (struct ccase *input, void *car_)
{
struct casereader_append_rank *car = car_;
{
struct casereader_append_rank *car = car_;
- const double value = case_
data (input, car->var)->f
;
+ const double value = case_
num (input, car->var)
;
- if (
car->prev_value != SYSMIS)
+ if (car->prev_value != SYSMIS)
{
if (car->err && value < car->prev_value)
*car->err |= RANK_ERR_UNSORTED;
}
{
if (car->err && value < car->prev_value)
*car->err |= RANK_ERR_UNSORTED;
}
- if (
car->n_common == 1)
+ if (car->n_common == 1)
{
double vxx = SYSMIS;
casenumber k = 0;
double weight = 1.0;
if (car->weight)
{
{
double vxx = SYSMIS;
casenumber k = 0;
double weight = 1.0;
if (car->weight)
{
- weight = case_
data (input, car->weight)->f
;
- if (
car->err && weight < 0
)
+ weight = case_
num (input, car->weight)
;
+ if (
car->err && weight < 0
)
*car->err |= RANK_ERR_NEGATIVE_WEIGHT;
}
*car->err |= RANK_ERR_NEGATIVE_WEIGHT;
}
@@
-429,15
+430,15
@@
car_translate (struct ccase *input, void *car_)
struct ccase *c = casereader_peek (car->clone, car->n + ++k);
if (c == NULL)
break;
struct ccase *c = casereader_peek (car->clone, car->n + ++k);
if (c == NULL)
break;
- vxx = case_
data (c, car->var)->f
;
+ vxx = case_
num (c, car->var)
;
- if (
vxx == value)
+ if (vxx == value)
{
if (car->weight)
{
{
if (car->weight)
{
- double w = case_
data (c, car->weight)->f
;
+ double w = case_
num (c, car->weight)
;
- if (
car->err && w < 0
)
+ if (
car->err && w < 0
)
*car->err |= RANK_ERR_NEGATIVE_WEIGHT;
weight += w;
*car->err |= RANK_ERR_NEGATIVE_WEIGHT;
weight += w;
@@
-461,7
+462,7
@@
car_translate (struct ccase *input, void *car_)
car->n++;
input = case_unshare_and_resize (input, car->proto);
car->n++;
input = case_unshare_and_resize (input, car->proto);
- case_data_rw_idx (input, caseproto_get_n_widths (car->proto) - 1)->f
+ *case_num_rw_idx (input, caseproto_get_n_widths (car->proto) - 1)
= car->mean_rank;
car->prev_value = value;
return input;
= car->mean_rank;
car->prev_value = value;
return input;
@@
-489,27
+490,32
@@
uniquify (const struct ccase *c, void *aux)
struct consolidator *cdr = aux;
const union value *current_value = case_data (c, cdr->key);
const int key_width = var_get_width (cdr->key);
struct consolidator *cdr = aux;
const union value *current_value = case_data (c, cdr->key);
const int key_width = var_get_width (cdr->key);
- const double weight = cdr->weight ? case_
data (c, cdr->weight)->f
: 1.0;
+ const double weight = cdr->weight ? case_
num (c, cdr->weight)
: 1.0;
struct ccase *next_case = casereader_peek (cdr->clone, cdr->n + 1);
int dir = 0;
cdr->n ++;
cdr->cc += weight;
struct ccase *next_case = casereader_peek (cdr->clone, cdr->n + 1);
int dir = 0;
cdr->n ++;
cdr->cc += weight;
- if (
NULL == next_case)
+ if (NULL == next_case)
goto end;
goto end;
-
+
dir = value_compare_3way (case_data (next_case, cdr->key),
current_value, key_width);
dir = value_compare_3way (case_data (next_case, cdr->key),
current_value, key_width);
+ if (dir > 0)
+ dir = 1;
+ if (dir < 0)
+ dir = -1;
+
case_unref (next_case);
case_unref (next_case);
- if (
dir != 0
)
+ if (
dir != 0
)
{
/* Insist that the data are sorted */
assert (cdr->direction == 0 || dir == cdr->direction);
cdr->direction = dir;
goto end;
}
{
/* Insist that the data are sorted */
assert (cdr->direction == 0 || dir == cdr->direction);
cdr->direction = dir;
goto end;
}
-
+
return false;
end:
return false;
end:
@@
-529,12
+535,12
@@
consolodate_weight (struct ccase *input, void *aux)
if (cdr->weight)
{
c = case_unshare (input);
if (cdr->weight)
{
c = case_unshare (input);
-
case_data_rw (c, cdr->weight)->f
= cdr->prev_cc;
+
*case_num_rw (c, cdr->weight)
= cdr->prev_cc;
}
else
{
c = case_unshare_and_resize (input, cdr->proto);
}
else
{
c = case_unshare_and_resize (input, cdr->proto);
- case_data_rw_idx (c, caseproto_get_n_widths (cdr->proto) - 1)->f = cdr->prev_cc;
+ *case_num_rw_idx (c, caseproto_get_n_widths (cdr->proto) - 1) = cdr->prev_cc;
}
return c;
}
return c;
@@
-555,7
+561,7
@@
uniquify_destroy (void *aux)
-/* Returns a new casereader which is based upon INPUT, but which contains a maximum
+/* Returns a new casereader which is based upon INPUT, but which contains a maximum
of one case for each distinct value of KEY.
If WEIGHT is non-null, then the new casereader's values for this variable
will be the sum of all values matching KEY.
of one case for each distinct value of KEY.
If WEIGHT is non-null, then the new casereader's values for this variable
will be the sum of all values matching KEY.
@@
-581,7
+587,7
@@
casereader_create_distinct (struct casereader *input,
cdr->clone = casereader_clone (input);
cdr->direction = 0;
cdr->clone = casereader_clone (input);
cdr->direction = 0;
- if (
NULL == cdr->weight
)
+ if (
NULL == cdr->weight
)
output_proto = caseproto_add_width (output_proto, 0);
cdr->proto = output_proto;
output_proto = caseproto_add_width (output_proto, 0);
cdr->proto = output_proto;