Code restyled. Added restyling script. Code for determinant is not working because it gets stuck in an infinite recursion loop.

This commit is contained in:
François Coppens 2021-05-19 15:23:19 +02:00
parent 0e5bbbbffb
commit 17c8a1c7a0
5 changed files with 263 additions and 223 deletions

View File

@ -82,48 +82,97 @@ T1 *outProd(T1 *vec1, T2 *vec2, unsigned int M) {
return C;
}
template <typename T> T matDet(T **A, unsigned int M) {
int det = 0, p, h, k, i, j;
T **temp = new T *[M];
for (int i = 0; i < M; i++)
temp[i] = new T[M];
if (M == 1) {
return A[0][0];
} else if (M == 2) {
det = (A[0][0] * A[1][1] - A[0][1] * A[1][0]);
return det;
} else {
for (p = 0; p < M; p++) {
h = 0;
k = 0;
for (i = 1; i < M; i++) {
for (j = 0; j < M; j++) {
if (j == p) {
continue;
}
temp[h][k] = A[i][j];
k++;
if (k == M - 1) {
h++;
k = 0;
}
}
}
det = det + A[0][p] * pow(-1, p) * matDet(temp, M - 1);
}
return det;
}
delete[] temp;
}
// // This flat version doesn't work. Get's stuck in an infinite recursion loop.
// template <typename T> T determinant(T *A, unsigned int M) {
// std::cout << "determinant() called..." << std::endl;
// T det = 0;
// int p, h, k, i, j;
// T *temp = new T[M * M];
// if (M == 1) {
// return A[0];
// } else if (M == 2) {
// det = (A[0] * A[3] - A[1] * A[2]);
// return det;
// } else {
// for (p = 0; p < M; p++) {
// h = 0;
// k = 0;
// for (i = 1; i < M; i++) {
// for (j = 0; j < M; j++) {
// if (j == p) {
// continue;
// }
// temp[h * M + k] = A[i * M + j];
// k++;
// if (k == M - 1) {
// h++;
// k = 0;
// }
// }
// }
// det = det + A[p] * pow(-1, p) * determinant(temp, M - 1);
// }
// return det;
// }
// delete temp;
// }
// // This version also gets stuck in a recursion loop
// template <typename T> T determinant(T **A, unsigned int M) {
// int p, h, k, i, j;
// T det = 0;
// T **temp = new T *[M];
// for (int i = 0; i < M; i++) {
// temp[i] = new T[M];
// }
// if (M == 1) {
// return A[0][0];
// } else if (M == 2) {
// det = (A[0][0] * A[1][1] - A[0][1] * A[1][0]);
// return det;
// } else {
// for (p = 0; p < M; p++) {
// h = 0;
// k = 0;
// for (i = 1; i < M; i++) {
// for (j = 0; j < M; j++) {
// if (j == p) {
// continue;
// }
// temp[h][k] = A[i][j];
// k++;
// if (k == M - 1) {
// h++;
// k = 0;
// }
// }
// }
// det = det + A[0][p] * pow(-1, p) * determinant(temp, M - 1);
// }
// return det;
// }
// delete[] temp;
// }
template <typename T> bool is_identity(T *A, unsigned int M, double tolerance) {
for (unsigned int i = 0; i < M; i++) {
for (unsigned int j = 0; j < M; j++) {
if (i == j && std::fabs(A[i * M + j] - 1) > tolerance)
return false;
if (i != j && std::fabs(A[i * M + j]) > tolerance)
if (i == j && std::fabs(A[i * M + j] - 1) > tolerance) {
return false;
}
if (i != j && std::fabs(A[i * M + j]) > tolerance) {
return false;
}
}
}
return true;
}
template <typename T>
bool is_identity2(T *A, unsigned int M, double tolerance) {
double det = determinant(A, M);
if (det - 1 > tolerance) {
return false;
}
return true;
}

View File

@ -5,16 +5,14 @@
* Verificarlo test report.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "vfc_hashmap.h"
#define VAR_NAME(var) #var // Simply returns the name of var into a string
/*
* A probe containing a double value as well as its key, which is needed when
* dumping the probes
@ -27,8 +25,6 @@ struct vfc_probe_node {
typedef struct vfc_probe_node vfc_probe_node;
/*
* The probes structure. It simply acts as a wrapper for a Verificarlo hashmap.
*/
@ -39,7 +35,6 @@ struct vfc_probes {
typedef struct vfc_probes vfc_probes;
/*
* Initialize an empty vfc_probes instance
*/
@ -51,8 +46,6 @@ vfc_probes vfc_init_probes() {
return probes;
}
/*
* Free all probes
*/
@ -73,8 +66,6 @@ void vfc_free_probes(vfc_probes * probes) {
vfc_hashmap_free(probes->map);
}
/*
* Helper function to generate the key from test and variable name
*/
@ -88,8 +79,6 @@ char * gen_probe_key(char * testName, char * varName) {
return key;
}
/*
* Helper function to detect forbidden character ',' in the keys
*/
@ -99,29 +88,22 @@ void validate_probe_key(char * str) {
for (unsigned int i = 0; i < len; i++) {
if (str[i] == ',') {
fprintf(
stderr,
fprintf(stderr,
"Error [verificarlo]: One of your probes has a ',' in its test \
or variable name (\"%s\"), which is forbidden\n",
str
);
str);
exit(1);
}
}
}
/*
* Add a new probe. If an issue with the key is detected (forbidden characters or
* a duplicate key), an error will be thrown.
* Add a new probe. If an issue with the key is detected (forbidden characters
* or a duplicate key), an error will be thrown.
*/
int vfc_put_probe(
vfc_probes * probes,
char * testName, char * varName,
double val
) {
int vfc_put_probe(vfc_probes *probes, char *testName, char *varName,
double val) {
if (probes == NULL) {
return 1;
@ -137,17 +119,14 @@ int vfc_put_probe(
// Look for a duplicate key
vfc_probe_node *oldProbe = (vfc_probe_node *)vfc_hashmap_get(
probes->map, vfc_hashmap_str_function(key)
);
probes->map, vfc_hashmap_str_function(key));
if (oldProbe != NULL) {
if (strcmp(key, oldProbe->key) == 0) {
fprintf(
stderr,
fprintf(stderr,
"Error [verificarlo]: you have a duplicate error with one of \
your probes (\"%s\"). Please make sure to use different names.\n",
key
);
key);
exit(1);
}
}
@ -157,15 +136,11 @@ int vfc_put_probe(
newProbe->key = key;
newProbe->value = val;
vfc_hashmap_insert(
probes->map, vfc_hashmap_str_function(key), newProbe
);
vfc_hashmap_insert(probes->map, vfc_hashmap_str_function(key), newProbe);
return 0;
}
/*
* Remove (free) an element from the hash table
*/
@ -184,8 +159,6 @@ int vfc_remove_probe(vfc_probes * probes, char * testName, char * varName) {
return 0;
}
/*
* Return the number of probes stored in the hashmap
*/
@ -194,8 +167,6 @@ unsigned int vfc_num_probes(vfc_probes * probes) {
return vfc_hashmap_num_items(probes->map);
}
/*
* Dump probes in a .csv file (the double values are converted to hex), then
* free it.
@ -210,10 +181,8 @@ int vfc_dump_probes(vfc_probes * probes) {
// Get export path from the VFC_PROBES_OUTPUT env variable
char *exportPath = getenv("VFC_PROBES_OUTPUT");
if (!exportPath) {
printf(
"Warning [verificarlo]: VFC_PROBES_OUTPUT is not set, probes will \
not be dumped\n"
);
printf("Warning [verificarlo]: VFC_PROBES_OUTPUT is not set, probes will \
not be dumped\n");
vfc_free_probes(probes);
return 0;
}
@ -221,12 +190,10 @@ int vfc_dump_probes(vfc_probes * probes) {
FILE *fp = fopen(exportPath, "w");
if (fp == NULL) {
fprintf(
stderr,
fprintf(stderr,
"Error [verificarlo]: impossible to open the CSV file to save your \
probes (\"%s\")\n",
exportPath
);
exportPath);
exit(1);
}
@ -238,11 +205,7 @@ int vfc_dump_probes(vfc_probes * probes) {
for (int i = 0; i < probes->map->capacity; i++) {
probe = (vfc_probe_node *)get_value_at(probes->map->items, i);
if (probe != NULL) {
fprintf(
fp, "%s,%a\n",
probe->key,
probe->value
);
fprintf(fp, "%s,%a\n", probe->key, probe->value);
}
}

View File

@ -100,6 +100,19 @@ int test_cycle(H5File file, int cycle, std::string version, double tolerance) {
double res_max = residual_max(res, dim);
double res2 = residual_frobenius2(res, dim);
// double det;
// double **tmp = new double *[dim];
// for (int i = 0; i < dim; i++) {
// tmp[i] = new double[dim];
// for (int j = 0; j < dim; j++) {
// tmp[i][j] = res[i * dim + j];
// }
// }
// det = determinant(tmp, dim);
// delete[] tmp;
// std::cout << "Residual = " << version << " " << cycle << " " << res_max <<
// " "
// << res2 << " " << det << std::endl;
std::cout << "Residual = " << version << " " << cycle << " " << res_max << " "
<< res2 << std::endl;

15
tools/restyle.sh Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env bash
STYLE='--style=LLVM'
FORMATER='clang-format -i'
if [[ -z $SMVARS ]]
then
echo '$SMVARS is not set. Please source '/path/to/Sherman-Morrison/smvars.sh''
exit 1
fi
for ext in c cpp h hpp
do
find $SMROOT -type f -iname "*.${ext}" -exec echo "$FORMATER $STYLE" {} \;
done