Merge branch 'master' of auder.net:valse
[valse.git] / test / test_utils.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4 #include <string.h>
5 #include "utils.h"
6
7 // Check if array == refArray
8 void compareArray(const char* ID, const void* array, const void* refArray, int size,
9 int isinteger)
10 {
11 Real EPS = 1e-5; //precision
12 printf("Checking %s\n",ID);
13 Real maxError = 0.0;
14 for (int i=0; i<size; i++)
15 {
16 Real error = isinteger
17 ? fabs(((int*)array)[i] - ((int*)refArray)[i])
18 : fabs(((Real*)array)[i] - ((Real*)refArray)[i]);
19 if (error >= maxError)
20 maxError = error;
21 }
22 if (maxError >= EPS)
23 printf(" Inaccuracy: max(abs(error)) = %g >= %g\n",maxError,EPS);
24 else
25 printf(" OK\n");
26 }
27
28 void compareArray_real(const char* ID, const void* array, const void* refArray, int size)
29 {
30 return compareArray(ID, array, refArray, size, 0);
31 }
32
33 void compareArray_int(const char* ID, const void* array, const void* refArray, int size)
34 {
35 return compareArray(ID, array, refArray, size, 1);
36 }
37
38 // Read array by columns (as in MATLAB) and return by-rows encoding
39 void* readArray(const char* fileName, int isinteger)
40 {
41 // need to prepend 'data/' (not really nice code...)
42 char* fullFileName = (char*)calloc(5+strlen(fileName)+1, sizeof(char));
43 strcat(fullFileName, "data/");
44 strcat(fullFileName, fileName);
45
46 // first pass to know how many elements to allocate
47 char* command = (char*)calloc(12+strlen(fullFileName)+8+1, sizeof(char));
48 strcat(command, "wc -l ");
49 strcat(command, fullFileName);
50 FILE *arraySize = popen(command, "r");
51 free(command);
52 char* bufferNum = (char*)calloc(64, sizeof(char));
53 fgets(bufferNum, sizeof(bufferNum), arraySize);
54 int n = atoi(bufferNum);
55 pclose(arraySize);
56
57 // open file for reading
58 FILE* arrayFile = fopen(fullFileName, "r");
59 free(fullFileName);
60
61 // read all values, and convert them to by-rows matrices format
62 size_t elementSize = isinteger ? sizeof(int) : sizeof(Real);
63 void* array = malloc(n*elementSize);
64 for (int i=0; i<n; i++)
65 {
66 fgets(bufferNum, 64, arrayFile);
67 // transform buffer content into Real or int, and store it at appropriate location
68 if (isinteger)
69 ((int*)array)[i] = atoi(bufferNum);
70 else
71 ((Real*)array)[i] = atof(bufferNum);
72 }
73 fclose(arrayFile);
74 free(bufferNum);
75
76 return array;
77 }
78
79 int* readArray_int(const char* fileName)
80 {
81 return (int*)readArray(fileName, 1);
82 }
83
84 Real* readArray_real(const char* fileName)
85 {
86 return (Real*)readArray(fileName, 0);
87 }
88
89 int read_int(const char* fileName)
90 {
91 int* array = readArray_int(fileName);
92 int res = array[0];
93 free(array);
94 return res;
95 }
96
97 Real read_real(const char* fileName)
98 {
99 Real* array = readArray_real(fileName);
100 Real res = array[0];
101 free(array);
102 return res;
103 }