/ani/mrses

To get this branch, use:
bzr branch http://suren.me/webbzr/ani/mrses
1 by Suren A. Chilingaryan
Initial import
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <errno.h>
4
#include <string.h>
5
#include <assert.h>
6
7
#include "mrses.h"
8
9
#define ITERATIONS 5000
10
11
#define PROPERTIES 2048
12
#define SAMPLES1 50
13
#define SAMPLES2 40
14
15
#define WIDTH 5
16
#define TESTS 10000
17
18
//#define SINGULAR
19
20
//#define SINGLE_MODE 1
21
typedef uint32_t *uint32_p;
22
23
int ptr_compare(void *a, void *b) {
24
    return **(uint32_t**)b - **(uint32_t**)a;
25
}
26
27
int main() {
28
    MRSESContext ctx;
29
    MRSESDataType a[SAMPLES1 * PROPERTIES];
30
    MRSESDataType b[SAMPLES2 * PROPERTIES];
31
    
32
    MRSESDataType a_mean[PROPERTIES];
33
    MRSESDataType b_mean[PROPERTIES];
34
35
#ifdef SINGLE_MODE
36
    MRSESIntType tests[TESTS * WIDTH];
37
    MRSESDataType results[TESTS];
38
#else
39
    uint32_t hist[PROPERTIES];
40
    uint32_p sort[PROPERTIES];
41
    float sum;
42
#endif /* SINGLE_MODE */
43
    
44
    MRSESDataType val;
45
46
    int i,j;    
47
    int max_mode;
48
    
49
    for (i = 0; i < PROPERTIES; i++) {
50
	if ((i>3)&&(i<13)&&((i%2)==0)) max_mode = 1;
51
	else max_mode = 0;
52
53
	a_mean[i] = 0;
54
	for (j = 0; j < SAMPLES1; j++) {
55
#ifdef SINGULAR
56
	    if (i == 20) val = 0;
57
	    else val = ((MRSESDataType)random()) / RAND_MAX;
58
59
	    if (max_mode) {
60
		if ((i == 6)||(i == 8)) val = 9;
61
		else val += 9;
62
	    }
63
#else /* SINGULAR */
64
	    val = ((MRSESDataType)random()) / RAND_MAX;
65
	    if (max_mode) val += 9;
66
#endif /* SINGULAR */
67
68
	    a [ i * SAMPLES1 + j ] = val;
69
	    a_mean[i] += val; 
70
	}
71
	a_mean[i] /= SAMPLES1;
72
73
	a_mean[i] = 0;
74
	for (j = 0; j < SAMPLES2; j++) {
75
	    val = ((MRSESDataType)random()) / RAND_MAX;
76
	    b [ i * SAMPLES2 + j ] = val;
77
	    b_mean[i] += val; 
78
	}
79
	b_mean[i] /= SAMPLES2;
80
    }
81
82
    
83
    ctx = mrses_create_context();
84
    mrses_init_context(ctx, PROPERTIES, SAMPLES1, a, SAMPLES2, b);
85
    mrses_set_distance_mode(ctx, 0);
86
    mrses_prepare(ctx, WIDTH, TESTS);
87
88
#ifdef SINGLE_MODE
89
    assert((TESTS + WIDTH) < PROPERTIES);
90
    
91
    for (i = 1 ; i < TESTS ; i ++ ) {
92
	for (j = 0; j < WIDTH ; j ++) {
93
	    tests[i * WIDTH + j] = i + j;
94
	}
95
    }
96
    
97
    assert((4 + 2 * WIDTH) < PROPERTIES);
98
    
99
    for (j = 0; j < WIDTH ; j ++) {
100
	tests[j] = 4 + j * 2;
101
    }
102
103
    for (i = 0; i < ITERATIONS; i++) {    
104
	mrses_compute(ctx, TESTS, tests, results);
105
    }
106
    //mrses_compute(ctx, 1, tests, results);
107
#else /* SINGLE_MODE */
108
    mrses_iterate(ctx, ITERATIONS, TESTS, NULL);
109
    
110
    mrses_get_results(ctx, hist);
111
    
112
    for (i = 0, sum = 0; i < PROPERTIES; i++) {
113
	sort[i] = hist + i;
114
	sum += hist[i];
115
    }
116
/*    
117
    printf("%f\n", sum);
118
    for (i = 4; i < 13; i+=2) {
119
	printf("%i - %i\n", i+1, hist[i]);
120
    }
121
*/    
122
    qsort(sort, PROPERTIES, sizeof(uint32_t*), (int (*)(const void*,const void*))ptr_compare);
123
    
124
    for (i = 0; i < WIDTH; i++) {
125
	j = sort[i] - hist;
126
	printf("%6i  ", j + 1);
127
    }
128
    printf("\n");
129
    for (i = 0; i < WIDTH; i++) {
130
	printf("%6.2f%% ", 100*WIDTH*(*sort[i])/sum);
131
    }
132
    printf("\n");
133
#endif /* SINGLE_MODE */
134
135
    mrses_destroy_context(ctx);
136
137
    return (0);
138
}