diff options
author | Pjotr Prins | 2017-11-15 15:59:31 +0000 |
---|---|---|
committer | Pjotr Prins | 2017-11-15 15:59:31 +0000 |
commit | 262af77b80267d65324d9a2de395022b9bbcb9d1 (patch) | |
tree | 8db0264a1c32fd5f4405e5f05f3f7c8c9f3fc97f /src/debug.cpp | |
parent | c1bbd92c621f63ae8a051d51a224dad93061108e (diff) | |
download | pangemma-262af77b80267d65324d9a2de395022b9bbcb9d1.tar.gz |
Nans: introducing checking on mem free
Diffstat (limited to 'src/debug.cpp')
-rw-r--r-- | src/debug.cpp | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/src/debug.cpp b/src/debug.cpp index d133344..a00190d 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -56,6 +56,55 @@ gsl_matrix *gsl_matrix_safe_alloc(size_t rows,size_t cols) { return m; } +int gsl_matrix_safe_memcpy (gsl_matrix *dest, const gsl_matrix *src) { + enforce(dest->size1 == src->size1); + enforce(dest->size2 == src->size2); + return gsl_matrix_memcpy(dest,src); +} + +void do_gsl_matrix_safe_free (gsl_matrix *m, const char *__pretty_function, const char *__file, int __line) { + enforce(m); + if (is_check_mode() && is_debug_mode()) { + bool has_NaN = has_nan(m); + bool has_Inf = has_inf(m); + if (has_NaN || has_Inf) { + std::string msg = "Matrix (size "; + msg += std::to_string(m->size1); + msg += "x"; + msg += std::to_string(m->size2); + msg += ")"; + if (has_Inf) + warnfail_at_msg(is_strict_mode(),__pretty_function,__file,__line,(msg+" contains Infinite on free!").c_str()); + if (has_NaN) + warnfail_at_msg(is_strict_mode(),__pretty_function,__file,__line,(msg+" contains NaN on free!").c_str()); + } + } + return gsl_matrix_free(m); +} + +int gsl_vector_safe_memcpy (gsl_vector *dest, const gsl_vector *src) { + enforce(dest->size == src->size); + return gsl_vector_memcpy(dest,src); +} + +void do_gsl_vector_safe_free (gsl_vector *v, const char *__pretty_function, const char *__file, int __line) { + enforce(v); + if (is_check_mode() && is_debug_mode()) { + bool has_NaN = has_nan(v); + bool has_Inf = has_inf(v); + if (has_NaN || has_Inf) { + std::string msg = "Vector (size "; + msg += std::to_string(v->size); + msg += ")"; + if (has_Inf) + warnfail_at_msg(is_strict_mode(),__pretty_function,__file,__line,(msg+" contains Infinite on free!").c_str()); + if (has_NaN) + warnfail_at_msg(is_strict_mode(),__pretty_function,__file,__line,(msg+" contains NaN on free!").c_str()); + } + } + return gsl_vector_free(v); +} + /* Helper function to make sure gsl allocations do their job because gsl_vector_alloc does not initiatize values (behaviour that changed @@ -81,7 +130,7 @@ char *do_strtok_safe(char *tokenize, const char *delimiters, const char *__prett // Helper function called by macro validate_K(K, check). K is validated // unless -no-check option is used. -void do_validate_K(const gsl_matrix *K, const char *__file, int __line) { +void do_validate_K(const gsl_matrix *K, const char *__pretty_function, const char *__file, int __line) { if (is_check_mode()) { // debug_msg("Validating K"); auto eigenvalues = getEigenValues(K); @@ -95,13 +144,13 @@ void do_validate_K(const gsl_matrix *K, const char *__file, int __line) { if (!isMatrixIllConditioned(eigenvalues)) warning_at_msg(__file,__line,"K is ill conditioned!"); if (!isMatrixSymmetric(K)) - warnfail_at_msg(is_strict_mode(),__file,__line,"K is not symmetric!" ); + warnfail_at_msg(is_strict_mode(),__pretty_function,__file,__line,"K is not symmetric!" ); const bool negative_values = has_negative_values_but_one(eigenvalues); if (negative_values) { warning_at_msg(__file,__line,"K has more than one negative eigenvalues!"); } if (count_small>1 && negative_values && !isMatrixPositiveDefinite(K)) - warnfail_at_msg(is_strict_mode(),__file,__line,"K is not positive definite!"); + warnfail_at_msg(is_strict_mode(),__pretty_function,__file,__line,"K is not positive definite!"); gsl_vector_free(eigenvalues); } } |