| |
| |
| #if defined(__cplusplus) || defined(__APPLE__) || defined(ENZ_HEADERS) |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <assert.h> |
| #else |
| struct _IO_FILE; |
| extern struct _IO_FILE* stderr; |
| extern int fprintf(struct _IO_FILE *, const char*, ...); |
| extern int fflush(struct _IO_FILE *stream); |
| extern int printf(const char*, ...); |
| extern void abort(); |
| extern void free(void *); |
| extern void* malloc(unsigned long); |
| extern void *realloc( void *ptr, unsigned long new_size ); |
| extern void* memcpy( void* dest, const void* src, unsigned long count ); |
| extern void* memset( void* dest, int, unsigned long count ); |
| #endif |
| |
| extern |
| #ifdef __cplusplus |
| "C" |
| #endif |
| int enzyme_allocated, enzyme_const, enzyme_dup, enzyme_dupnoneed, enzyme_out, |
| enzyme_tape; |
| |
| /* |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| static inline bool approx_fp_equality_float(float f1, float f2, double threshold) { |
| if (fabs(f1-f2) > threshold) return false; |
| return true; |
| } |
| |
| static inline bool approx_fp_equality_double(double f1, double f2, double threshold) { |
| if (fabs(f1-f2) > threshold) return false; |
| return true; |
| } |
| #ifdef __cplusplus |
| } |
| #endif |
| */ |
| |
| #define APPROX_EQ(LHS, RHS, THRES) \ |
| { \ |
| if (__builtin_fabs((LHS) - (RHS)) > THRES) { \ |
| fprintf(stderr, "Assertion Failed: fabs( [%s = %g] - [%s = %g] ) > %g at %s:%d (%s)\n", #LHS, (double)(LHS), #RHS, (double)(RHS), THRES, \ |
| __FILE__, __LINE__, __PRETTY_FUNCTION__); \ |
| abort(); \ |
| } \ |
| }; |
| |
| #define TEST_EQ(LHS, RHS) \ |
| { \ |
| if ((LHS) != (RHS)) {\ |
| fprintf(stderr, "Assertion Failed: [%s = %d] != [%s = %d] at %s:%d (%s)\n", #LHS, (int)(LHS), #RHS, (int)(RHS), \ |
| __FILE__, __LINE__, __PRETTY_FUNCTION__); \ |
| abort(); \ |
| } \ |
| }; |