Make clang build as silent as possible
[fvs_assignment_project.git] / test_main.c
blobfb05436d7c788d3b9d35a11cf78682fce2ce8d68
1 #include "fvs.h"
2 #include <sys/types.h>
3 #include <dirent.h>
4 #include <string.h>
5 /* For doing time calculations */
6 #include <time.h>
7 #include <sys/time.h>
8 #include <sys/resource.h>
10 static float subtractTimeval(struct timeval value1, struct timeval value2)
12 long time1 = value1.tv_sec * 1000000 + value1.tv_usec;
13 long time2 = value2.tv_sec * 1000000 + value2.tv_usec;
14 return (float)(time1 - time2) / 1000000;
17 static float subtractTimeSpec(struct timespec value1, struct timespec value2)
19 long time1 = value1.tv_sec * 1000000000 + value1.tv_nsec;
20 long time2 = value2.tv_sec * 1000000000 + value2.tv_nsec;
21 return (float)(time1 - time2) / 1000000000;
24 /* reverse 'arr', which has 'narr' elements */
25 static void reverse(FvsMinutiaSet_t *arr, size_t narr)
27 size_t i;
29 for (i=0; i < narr / 2; ++i) {
30 FvsMinutiaSet_t *tmp = arr[i];
31 arr[i] = arr[narr-i-1];
32 arr[narr-i-1] = tmp;
36 /* rotate 'arr' of size 'narr' by 'shift' */
37 static void rotate(FvsMinutiaSet_t *arr, size_t narr, unsigned long shift)
39 reverse(arr, shift);
40 reverse(arr + shift, narr - shift);
41 reverse(arr, narr);
44 static int compareFloats(float a, float b)
46 float diff = fmaxf(a, b) - fminf(a, b);
47 if (diff < 0.015) {
48 return 1;
50 return 0;
53 int main(int argc, const char *argv[])
55 int numberOfFiles = argc - 1;
56 const char **testFiles = argv + 1;
57 float *expectedResults = (float*)malloc(numberOfFiles * sizeof(float));
58 struct timespec time1, time2;
59 struct rusage usage1, usage2;
60 float elaspedTime, cpuTime, averageWallTime;
61 float *results;
63 /* check if all parameters are there */
64 if (argc < 3)
66 printf("Usage:\n %s image1 image2...\n", argv[0]);
67 return -1;
69 memset(expectedResults, 0, numberOfFiles);
70 expectedResults[0] = 1;
71 FvsMinutiaSet_t *minutiaArray = loadMinutiaSetsFromFiles(numberOfFiles, testFiles);
73 getrusage(RUSAGE_SELF, &usage1);
74 clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
76 for (int j = 0; j < numberOfFiles; ++j)
78 results = compareMinutiaSets(numberOfFiles, minutiaArray);
79 for (int i = 0; i < numberOfFiles; ++i)
80 if (!compareFloats(expectedResults[i], results[i]))
81 printf("ERROR: %d %d %s %s %.2f %.2f\n", j, i, testFiles [0], testFiles[i], expectedResults[i], results[i]);
82 free(results);
83 rotate(minutiaArray, numberOfFiles, 1);
86 getrusage(RUSAGE_SELF, &usage2);
87 clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
89 elaspedTime = subtractTimeSpec(time2, time1);
90 averageWallTime = elaspedTime / numberOfFiles;
91 cpuTime = subtractTimeval(usage2.ru_utime, usage1.ru_utime);
92 printf("Compare %d files : %02.3fsec = %02.3fsec/file, cpu time: %02.3fsec, speedup: %02.2fx\n",
93 numberOfFiles, elaspedTime, averageWallTime, cpuTime, cpuTime / elaspedTime);
95 cleanupMinutiaSetArray(numberOfFiles, minutiaArray);
96 free(expectedResults);
97 return 0;