aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/maths/complex.h28
-rw-r--r--include/maths/matrix.h36
-rw-r--r--include/maths/vector.h46
-rw-r--r--include/psi.h7
4 files changed, 117 insertions, 0 deletions
diff --git a/include/maths/complex.h b/include/maths/complex.h
new file mode 100644
index 0000000..c94f64a
--- /dev/null
+++ b/include/maths/complex.h
@@ -0,0 +1,28 @@
+#pragma once
+
+struct PsiComplex
+{
+ double real;
+ double imaginary;
+};
+
+struct PsiComplex psi_new_complex(double real, double imaginary);
+struct PsiComplex psi_new_complex_from_real(double real);
+
+struct PsiComplex psi_conjugate_complex(struct PsiComplex z);
+struct PsiComplex psi_neg_complex(struct PsiComplex z);
+
+double psi_phase_complex(struct PsiComplex z);
+double psi_norm2_complex(struct PsiComplex z);
+double psi_abs_complex(struct PsiComplex z);
+struct PsiComplex psi_sqrt_complex(struct PsiComplex z);
+
+struct PsiComplex psi_add_complex(struct PsiComplex a, struct PsiComplex b);
+struct PsiComplex psi_sub_complex(struct PsiComplex a, struct PsiComplex b);
+struct PsiComplex psi_mul_complex(struct PsiComplex a, struct PsiComplex b);
+struct PsiComplex psi_div_complex(struct PsiComplex a, struct PsiComplex b);
+
+struct PsiComplex psi_add_complex_real(struct PsiComplex a, double b);
+struct PsiComplex psi_sub_complex_real(struct PsiComplex a, double b);
+struct PsiComplex psi_mul_complex_real(struct PsiComplex a, double b);
+struct PsiComplex psi_div_complex_real(struct PsiComplex a, double b);
diff --git a/include/maths/matrix.h b/include/maths/matrix.h
new file mode 100644
index 0000000..c4e5530
--- /dev/null
+++ b/include/maths/matrix.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <stddef.h>
+
+#include "maths/complex.h"
+#include "maths/vector.h"
+
+struct PsiMatrix
+{
+ struct PsiComplex *data;
+ size_t rows;
+ size_t cols;
+};
+
+struct PsiMatrix psi_new_matrix(size_t rows, size_t cols);
+struct PsiMatrix psi_new_matrix_from(const struct PsiComplex *data, size_t rows, size_t cols);
+struct PsiMatrix psi_identity_matrix(size_t size);
+struct PsiMatrix psi_clone_matrix(struct PsiMatrix m);
+void psi_free_matrix(struct PsiMatrix *m);
+
+#define psi_matrix(rows, cols, ...) \
+ psi_new_matrix_from((struct PsiComplex[]){ __VA_ARGS__ }, rows, cols)
+
+struct PsiComplex psi_get_matrix(struct PsiMatrix m, size_t row, size_t col);
+void psi_set_matrix(struct PsiMatrix *m, size_t row, size_t col, struct PsiComplex value);
+
+struct PsiMatrix psi_dot_matrix(struct PsiMatrix a, struct PsiMatrix b);
+struct PsiMatrix psi_kronecker_matrix(struct PsiMatrix a, struct PsiMatrix b);
+struct PsiMatrix psi_transpose_matrix(struct PsiMatrix m);
+struct PsiMatrix psi_add_matrix(struct PsiMatrix a, struct PsiMatrix b);
+struct PsiMatrix psi_sub_matrix(struct PsiMatrix a, struct PsiMatrix b);
+struct PsiMatrix psi_scale_matrix(struct PsiMatrix m, struct PsiComplex scalar);
+
+struct PsiMatrix psi_matrix_from_vector(struct PsiVector v);
+struct PsiVector psi_vector_from_matrix(struct PsiMatrix m, enum PsiVectorKind kind);
+struct PsiVector psi_mul_vector_matrix(struct PsiVector v, struct PsiMatrix m);
diff --git a/include/maths/vector.h b/include/maths/vector.h
new file mode 100644
index 0000000..d452ef1
--- /dev/null
+++ b/include/maths/vector.h
@@ -0,0 +1,46 @@
+#pragma once
+
+#include <stddef.h>
+
+#include "maths/complex.h"
+
+enum PsiVectorKind
+{
+ PSI_ROW_VECTOR,
+ PSI_COLUMN_VECTOR,
+};
+
+struct PsiVector
+{
+ struct PsiComplex *data;
+ size_t size;
+ enum PsiVectorKind kind;
+};
+
+struct PsiVector psi_new_vector(size_t size, enum PsiVectorKind kind);
+struct PsiVector psi_new_vector_from(const struct PsiComplex *data, size_t size, enum PsiVectorKind kind);
+struct PsiVector psi_clone_vector(struct PsiVector v);
+void psi_free_vector(struct PsiVector *v);
+
+#define psi_row_vector(...) \
+ psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \
+ sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \
+ PSI_ROW_VECTOR)
+#define psi_column_vector(...) \
+ psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \
+ sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \
+ PSI_COLUMN_VECTOR)
+
+struct PsiComplex psi_get_vector(struct PsiVector v, size_t index);
+void psi_set_vector(struct PsiVector *v, size_t index, struct PsiComplex value);
+
+struct PsiComplex psi_dot_vector(struct PsiVector a, struct PsiVector b);
+struct PsiComplex psi_norm_vector(struct PsiVector v);
+struct PsiComplex psi_sum_vector(struct PsiVector v);
+struct PsiComplex psi_max_vector(struct PsiVector v);
+struct PsiComplex psi_min_vector(struct PsiVector v);
+
+struct PsiVector psi_add_vector(struct PsiVector a, struct PsiVector b);
+struct PsiVector psi_sub_vector(struct PsiVector a, struct PsiVector b);
+struct PsiVector psi_scale_vector(struct PsiVector v, struct PsiComplex scalar);
+struct PsiVector psi_transpose_vector(struct PsiVector v);
diff --git a/include/psi.h b/include/psi.h
new file mode 100644
index 0000000..8c62319
--- /dev/null
+++ b/include/psi.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#define PSI_VERSION_MAJOR 0
+#define PSI_VERSION_MINOR 1
+#define PSI_VERSION_PATCH 0
+
+const char *psi_version(void);