aboutsummaryrefslogtreecommitdiff
path: root/include/maths
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-14 12:20:52 +0200
committerhachem <im@hachem.wtf>2026-09-14 12:20:52 +0200
commitee14ad272e68d9363202d7f668e0b20302827209 (patch)
tree88dd1012ad7f9d6ac7abeb7562dac2194794b823 /include/maths
parentae07aab1442a45bbddb79e066f15eaf252a4254a (diff)
feat: simd + testing + formatting
Diffstat (limited to 'include/maths')
-rw-r--r--include/maths/format.h4
-rw-r--r--include/maths/matrix.h10
-rw-r--r--include/maths/simd.h22
-rw-r--r--include/maths/vector.h25
4 files changed, 42 insertions, 19 deletions
diff --git a/include/maths/format.h b/include/maths/format.h
index 65c1680..a11e3be 100644
--- a/include/maths/format.h
+++ b/include/maths/format.h
@@ -4,5 +4,5 @@
#include "maths/complex.h"
-char *psi_format_amplitude(struct PsiComplex c, char *out, size_t cap);
-char *psi_format_probability(double p, char *out, size_t cap);
+char* psi_format_amplitude(struct PsiComplex c, char* out, size_t cap);
+char* psi_format_probability(double p, char* out, size_t cap);
diff --git a/include/maths/matrix.h b/include/maths/matrix.h
index c4e5530..ff996d6 100644
--- a/include/maths/matrix.h
+++ b/include/maths/matrix.h
@@ -7,22 +7,22 @@
struct PsiMatrix
{
- struct PsiComplex *data;
+ 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_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);
+void psi_free_matrix(struct PsiMatrix* m);
-#define psi_matrix(rows, cols, ...) \
+#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);
+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);
diff --git a/include/maths/simd.h b/include/maths/simd.h
new file mode 100644
index 0000000..38d0171
--- /dev/null
+++ b/include/maths/simd.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <stddef.h>
+
+#include "maths/complex.h"
+
+enum PsiSimdCapability
+{
+ PSI_SIMD_NONE,
+ PSI_SIMD_AVX2,
+ PSI_SIMD_AVX512,
+ PSI_SIMD_NEON,
+};
+
+enum PsiSimdCapability psi_detect_simd(void);
+const char* psi_simd_name(enum PsiSimdCapability cap);
+
+void psi_apply_single_qubit_gate_simd(struct PsiComplex* state, const struct PsiComplex gate[2][2],
+ size_t target, size_t num_qubits);
+void psi_apply_single_qubit_gate_simd_parallel(struct PsiComplex* state,
+ const struct PsiComplex gate[2][2], size_t target,
+ size_t num_qubits);
diff --git a/include/maths/vector.h b/include/maths/vector.h
index d452ef1..0136715 100644
--- a/include/maths/vector.h
+++ b/include/maths/vector.h
@@ -12,27 +12,28 @@ enum PsiVectorKind
struct PsiVector
{
- struct PsiComplex *data;
+ 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_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);
+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)
+#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);
+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);