/ani/mrses

To get this branch, use:
bzr branch http://suren.me/webbzr/ani/mrses

« back to all changes in this revision

Viewing changes to cell/test.c

  • Committer: Suren A. Chilingaryan
  • Date: 2010-04-28 04:30:08 UTC
  • Revision ID: csa@dside.dyndns.org-20100428043008-vd9z0nso9axezvlp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}