#pragma once #include #include #include "maths/matrix.h" #include "maths/vector.h" enum PsiGateType { PSI_GATE_TYPE_DIAGONAL, PSI_GATE_TYPE_NON_DIAGONAL, PSI_GATE_TYPE_CONTROLLED, }; struct PsiKernel { struct PsiMatrix matrix; size_t* targets; size_t target_count; char* name; enum PsiGateType gate_type; }; struct PsiKernel psi_new_kernel(const char* name, struct PsiMatrix matrix, const size_t* targets, size_t target_count); struct PsiKernel psi_clone_kernel(struct PsiKernel kernel); void psi_free_kernel(struct PsiKernel* kernel); bool psi_kernels_share_qubits(struct PsiKernel a, struct PsiKernel b); bool psi_kernels_commute(struct PsiKernel a, struct PsiKernel b); bool psi_kernels_can_fuse(struct PsiKernel a, struct PsiKernel b); bool psi_fuse_kernels(struct PsiKernel a, struct PsiKernel b, struct PsiKernel* out); struct PsiKernelBatch { struct PsiKernel* kernels; size_t count; size_t capacity; size_t num_qubits; }; struct PsiKernelBatch psi_new_kernel_batch(size_t num_qubits); void psi_free_kernel_batch(struct PsiKernelBatch* batch); void psi_add_kernel(struct PsiKernelBatch* batch, struct PsiKernel kernel); void psi_optimize_kernel_batch(struct PsiKernelBatch* batch); void psi_execute_kernel_batch(struct PsiKernelBatch batch, struct PsiVector* state); void psi_apply_kernel(struct PsiVector* state, struct PsiKernel kernel, size_t num_qubits); void psi_apply_kernel_parallel(struct PsiVector* state, struct PsiKernel kernel, size_t num_qubits); struct PsiExecutionLayer { struct PsiKernel* kernels; size_t count; size_t capacity; }; struct PsiKernelStats { size_t total_kernels; size_t single_qubit; size_t two_qubit; size_t multi_qubit; size_t diagonal; size_t execution_layers; }; struct PsiStructureAwareBatch { struct PsiKernel* kernels; size_t count; size_t capacity; struct PsiExecutionLayer* layers; size_t layer_count; size_t layer_capacity; size_t num_qubits; bool optimised; }; struct PsiStructureAwareBatch psi_new_structure_aware_batch(size_t num_qubits); void psi_free_structure_aware_batch(struct PsiStructureAwareBatch* batch); void psi_add_structure_aware_kernel(struct PsiStructureAwareBatch* batch, struct PsiKernel kernel); void psi_optimize_structure_aware_batch(struct PsiStructureAwareBatch* batch); void psi_execute_structure_aware_batch(struct PsiStructureAwareBatch batch, struct PsiVector* state); void psi_execute_structure_aware_batch_layered(struct PsiStructureAwareBatch batch, struct PsiVector* state); struct PsiKernelStats psi_structure_aware_batch_stats(struct PsiStructureAwareBatch batch);