diff options
| author | hachem <im@hachem.wtf> | 2026-09-14 12:20:52 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-14 12:20:52 +0200 |
| commit | ee14ad272e68d9363202d7f668e0b20302827209 (patch) | |
| tree | 88dd1012ad7f9d6ac7abeb7562dac2194794b823 /include/maths | |
| parent | ae07aab1442a45bbddb79e066f15eaf252a4254a (diff) | |
feat: simd + testing + formatting
Diffstat (limited to 'include/maths')
| -rw-r--r-- | include/maths/format.h | 4 | ||||
| -rw-r--r-- | include/maths/matrix.h | 10 | ||||
| -rw-r--r-- | include/maths/simd.h | 22 | ||||
| -rw-r--r-- | include/maths/vector.h | 25 |
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); |
