#pragma once #include #include "maths/matrix.h" #include "maths/vector.h" struct PsiVector psi_new_state_0(void); struct PsiVector psi_new_state_1(void); struct PsiQuantumGate { const char *name; struct PsiMatrix matrix; size_t num_qubits; }; struct PsiQuantumGate psi_new_quantum_gate(const char *name, struct PsiMatrix matrix, size_t num_qubits); struct PsiQuantumGate psi_new_quantum_gate_from_matrix(const char *name, struct PsiMatrix matrix); void psi_free_quantum_gate(struct PsiQuantumGate *gate); struct PsiQuantumBit { const char *name; struct PsiVector state; }; struct PsiQuantumBit psi_new_quantum_bit(const char *name, struct PsiVector state); void psi_free_quantum_bit(struct PsiQuantumBit *bit); struct PsiQuantumRegister { const char *name; struct PsiVector state_vector; struct PsiQuantumBit *qubits; size_t num_qubits; }; struct PsiQuantumRegister psi_new_quantum_register(const char *name, const char **names, size_t count); struct PsiQuantumRegister psi_new_quantum_register_from(const char *name, const struct PsiQuantumBit *bits, size_t count); void psi_free_quantum_register(struct PsiQuantumRegister *reg); void psi_apply_gate(struct PsiQuantumRegister *reg, struct PsiQuantumGate gate, const size_t *targets, size_t target_count);