From 43f06890e2689af2ef54c4480fe5790692a24f65 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Wed, 11 Oct 2023 10:04:04 -0600 Subject: deprecate common lisp solutions and write c; it's too much effort to keep up with the requirements for an archive. --- inc/lizfcm.h | 30 ++++++++++++++++++++++++++++++ inc/macros.h | 41 +++++++++++++++++++++++++++++++++++++++++ inc/types.h | 18 ++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 inc/lizfcm.h create mode 100644 inc/macros.h create mode 100644 inc/types.h (limited to 'inc') diff --git a/inc/lizfcm.h b/inc/lizfcm.h new file mode 100644 index 0000000..b390394 --- /dev/null +++ b/inc/lizfcm.h @@ -0,0 +1,30 @@ +#include "macros.h" +#include "types.h" + +#ifndef LIZFCM_H +#define LIZFCM_H + +extern float smaceps(); +extern double dmaceps(); + +extern double central_derivative_at(double (*f)(double), double a, double h); +extern double forward_derivative_at(double (*f)(double), double a, double h); +extern double backward_derivative_at(double (*f)(double), double a, double h); + +extern double sum_v(Array_double *v); +extern Array_double *add_v(Array_double *v1, Array_double *v2); +extern Array_double *minus_v(Array_double *v1, Array_double *v2); +extern double dot_v(Array_double *v1, Array_double *v2); +extern double l2_norm(Array_double *v); +extern double l1_norm(Array_double *v); +extern double linf_norm(Array_double *v); + +extern double l2_distance(Array_double *v1, Array_double *v2); +extern double l1_distance(Array_double *v1, Array_double *v2); +extern double linf_distance(Array_double *v1, Array_double *v2); + +extern void format_vector_into(Array_double *v, char *s); + +extern Line *least_squares_lin_reg(Array_double *x, Array_double *y); + +#endif // LIZFCM_H diff --git a/inc/macros.h b/inc/macros.h new file mode 100644 index 0000000..841084d --- /dev/null +++ b/inc/macros.h @@ -0,0 +1,41 @@ +#include +#include +#include + +#ifndef MACROS_H +#define MACROS_H + +#define DEFINE_ARRAY(TYPE) \ + typedef struct { \ + TYPE *data; \ + size_t size; \ + } Array_##TYPE + +#define InitArray(TYPE, ...) \ + ({ \ + TYPE temp[] = __VA_ARGS__; \ + Array_##TYPE *arr = malloc(sizeof(Array_##TYPE)); \ + arr->size = sizeof(temp) / sizeof(temp[0]); \ + arr->data = malloc(arr->size * sizeof(TYPE)); \ + if (arr->data) { \ + memcpy(arr->data, temp, arr->size * sizeof(TYPE)); \ + } \ + arr; \ + }) + +#define InitArrayWithSize(TYPE, SIZE, INIT_VALUE) \ + ({ \ + Array_##TYPE *arr = malloc(sizeof(Array_##TYPE)); \ + arr->size = SIZE; \ + arr->data = malloc(arr->size * sizeof(TYPE)); \ + if (arr->data) { \ + for (size_t i = 0; i < arr->size; i++) \ + arr->data[i] = INIT_VALUE; \ + } \ + arr; \ + }) + +#define c_max(x, y) (((x) >= (y)) ? (x) : (y)) +#define c_min(x, y) (((x) <= (y)) ? (x) : (y)) + +#endif // MACROS_H diff --git a/inc/types.h b/inc/types.h new file mode 100644 index 0000000..4af17db --- /dev/null +++ b/inc/types.h @@ -0,0 +1,18 @@ +#include "macros.h" +#include + +#ifndef TYPES_H +#define TYPES_H + +DEFINE_ARRAY(int); +DEFINE_ARRAY(uint32_t); +DEFINE_ARRAY(int32_t); +DEFINE_ARRAY(float); +DEFINE_ARRAY(double); + +typedef struct Line { + double m; + double a; +} Line; + +#endif // TYPES_H -- cgit v1.2.3-70-g09d2