bzr branch
http://darksoft.org/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 |
}
|