#pragma once #include #include #include "core/circuit.h" #include "maths/vector.h" #define PSI_PARALLEL_THRESHOLD 8 struct PsiRuntimeConfig { bool parallel; bool simd; bool batched; bool structure_aware; size_t parallel_threshold; }; enum PsiRuntime { PSI_RUNTIME_BASIC, PSI_RUNTIME_BASIC_MT, PSI_RUNTIME_BATCHED, PSI_RUNTIME_BATCHED_MT, PSI_RUNTIME_SIMD, PSI_RUNTIME_SIMD_MT, PSI_RUNTIME_STRUCTURE_AWARE, PSI_RUNTIME_STRUCTURE_AWARE_MT, }; struct PsiRuntimeConfig psi_new_runtime_config(void); struct PsiRuntimeConfig psi_optimal_runtime_config(void); struct PsiRuntimeConfig psi_runtime_to_config(enum PsiRuntime runtime); struct PsiVector psi_compute_runtime_config(struct PsiRuntimeConfig config, size_t num_qubits, const struct PsiGateOp *operations, size_t op_count); struct PsiVector psi_compute_runtime(enum PsiRuntime runtime, size_t num_qubits, const struct PsiGateOp *operations, size_t op_count); const struct PsiVector *psi_compute_circuit(struct PsiQuantumCircuit *circuit); const struct PsiVector *psi_compute_circuit_with(struct PsiQuantumCircuit *circuit, enum PsiRuntime runtime); const struct PsiVector *psi_compute_circuit_with_config(struct PsiQuantumCircuit *circuit, struct PsiRuntimeConfig config); double psi_circuit_probability(struct PsiQuantumCircuit *circuit, size_t state_index); void psi_circuit_probabilities(struct PsiQuantumCircuit *circuit, double *out);