fix generateRunSave_EMGLLF, simplify arrays readings
[valse.git] / src / 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 float EPS = 1e-5; //precision
12 printf("Checking %s\n",ID);
13 float maxError = 0.0;
14 for (int i=0; i<size; i++)
15 {
16 float error = isinteger
17 ? fabs(((int*)array)[i] - ((int*)refArray)[i])
18 : fabs(((float*)array)[i] - ((float*)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 char* bufferNum = (char*)calloc(64, sizeof(char));
52 fgets(bufferNum, sizeof(bufferNum), arraySize);
53 int n = atoi(bufferNum);
54 pclose(arraySize);
55
56 // open file for reading
57 FILE* arrayFile = fopen(fullFileName, "r");
58 free(fullFileName);
59
60 // read all values, and convert them to by-rows matrices format
61 size_t elementSize = isinteger ? sizeof(int) : sizeof(float);
62 void* array = malloc(n*elementSize);
63 for (int i=0; i<n; i++)
64 {
65 fgets(bufferNum, 64, arrayFile);
66 // transform buffer content into float or int, and store it at appropriate location
67 if (isinteger)
68 ((int*)array)[i] = atoi(bufferNum);
69 else
70 ((float*)array)[i] = atof(bufferNum);
71 }
72 fclose(arrayFile);
73 free(bufferNum);
74
75 return array;
76 }
77
78 int* readArray_int(const char* fileName)
79 {
80 return (int*)readArray(fileName, 1);
81 }
82
83 float* readArray_real(const char* fileName)
84 {
85 return (float*)readArray(fileName, 0);
86 }
87
88 int read_int(const char* fileName)
89 {
90 int* array = readArray_int(fileName);
91 int res = array[0];
92 free(array);
93 return res;
94 }
95
96 float read_real(const char* fileName)
97 {
98 Real* array = readArray_real(fileName);
99 Real res = array[0];
100 free(array);
101 return res;
102 }