-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathsort_example.c
More file actions
67 lines (59 loc) · 2.03 KB
/
sort_example.c
File metadata and controls
67 lines (59 loc) · 2.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#ifdef Datadir
#define DATADIR Datadir
#else
#define DATADIR "."
#endif
#include <apop.h>
#include <unistd.h>
#ifdef Testing
#include "sort_tests.c" //For Apophenia's test suite, some tedious checks that the sorts worked
#endif
//get_distance is for the sort-by-Euclidian distance example below.
double get_distance(gsl_vector *v) {return apop_vector_distance(v);}
int main(){
apop_text_to_db( DATADIR "/" "amash_vote_analysis.csv" );
apop_data *d = apop_query_to_mixed_data("mntmtm", "select 1,id,party,contribs/1000.0,vote,ideology from amash_vote_analysis " );
//use the default order of columns for sorting
apop_data *sorted = apop_data_sort(d, .inplace='n');
#ifndef Testing
apop_data_print(sorted);
#else
check_sorting1(sorted);
#endif
//set up a specific column order
apop_data *perm = apop_data_copy(Apop_r(d, 0));
perm->vector = NULL;
apop_data_fill(perm, 5, 3, 4);
apop_text_set(perm, 0, 0, "2");
apop_text_set(perm, 0, 1, "1");
apop_data_sort(d, perm);
#ifndef Testing
apop_data_print(d);
#else
check_sorting2(d);
#endif
//sort a list of names
apop_data *blank = apop_data_alloc();
apop_data_add_names(blank, 'r', "C", "E", "A");
apop_data_sort(blank);
assert(*blank->names->row[0] == 'A');
assert(*blank->names->row[1] == 'C');
assert(*blank->names->row[2] == 'E');
//take each row of the matrix as a vector; store the Euclidian distance to the origin in the vector;
//sort in descending order.
apop_data *rowvectors = apop_text_to_data( DATADIR "/" "test_data" );
apop_map(rowvectors, .fn_v=get_distance, .part='r', .inplace='y');
apop_data *arow = apop_data_copy(Apop_r(rowvectors, 0));
arow->matrix=NULL; //sort only by the distance vector
apop_data_sort(rowvectors, arow, .asc='d');
#ifndef Testing
apop_data_print(rowvectors);
#else
double prev = INFINITY;
for (int i=0; i< rowvectors->vector->size; i++){
double this = apop_data_get(rowvectors, i, -1);
assert(this < prev);
prev = this;
}
#endif
}