#ifndef SEMQ_DISPATCH_H
#define SEMQ_DISPATCH_H
#include <stdint.h>
#include "semq.h"
typedef uint8_t semq_code_t;
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
SEMQ_BACKEND_NONE = 0,
SEMQ_BACKEND_SCALAR = 1,
SEMQ_BACKEND_AVX2 = 2,
SEMQ_BACKEND_AVX512 = 3,
SEMQ_BACKEND_NEON = 4,
SEMQ_BACKEND_SVE = 5
} semq_backend_kind_t;
typedef struct {
semq_status_t (*encode)(
const float* input,
uint32_t dim,
uint32_t scale,
semq_code_t* output);
semq_status_t (*reconstruct)(
const semq_code_t* codes,
uint32_t dim,
uint32_t scale,
double* output);
} semq_backend_t;
typedef struct {
semq_status_t (*encode)(
const float* input,
uint32_t dim,
uint32_t n_bins,
uint32_t packed,
semq_code_t* output);
semq_status_t (*reconstruct)(
const semq_code_t* codes,
uint32_t dim,
uint32_t n_bins,
uint32_t packed,
double* output);
} semq_phase_backend_t;
typedef struct {
semq_status_t (*encode)(
const float* input,
uint32_t dim,
uint32_t n_bins,
float scale_max,
semq_code_t* output);
semq_status_t (*reconstruct)(
const semq_code_t* codes,
uint32_t dim,
uint32_t n_bins,
float scale_max,
double* output);
} semq_quant_backend_t;
uint32_t semq_quant_bin_of_magnitude(
float mag,
float scale_max,
uint32_t n_bins);
semq_backend_kind_t semq_dispatch_select(void);
semq_backend_kind_t semq_dispatch_select_for(uint32_t op);
int semq_dispatch_has_sha256(void);
const semq_backend_t* semq_dispatch_get(semq_backend_kind_t kind);
const semq_phase_backend_t* semq_dispatch_get_phase(semq_backend_kind_t kind);
const semq_quant_backend_t* semq_dispatch_get_quant(semq_backend_kind_t kind);
const char* semq_backend_kind_name(semq_backend_kind_t kind);
extern const semq_backend_t SEMQ_SCALAR_BACKEND;
extern const semq_phase_backend_t SEMQ_PHASE_SCALAR_BACKEND;
void semq_phase_representative(uint32_t n_bins, uint32_t sector, double out[2]);
extern const semq_quant_backend_t SEMQ_QUANT_SCALAR_BACKEND;
#if defined(__aarch64__) || defined(_M_ARM64)
extern const semq_backend_t SEMQ_NEON_BACKEND;
extern const semq_backend_t SEMQ_SVE_BACKEND;
extern const semq_phase_backend_t SEMQ_PHASE_NEON_BACKEND;
extern const semq_quant_backend_t SEMQ_QUANT_NEON_BACKEND;
#endif
#if defined(__x86_64__) || defined(_M_X64)
extern const semq_backend_t SEMQ_AVX2_BACKEND;
extern const semq_backend_t SEMQ_AVX512_BACKEND;
extern const semq_quant_backend_t SEMQ_QUANT_AVX2_BACKEND;
extern const semq_quant_backend_t SEMQ_QUANT_AVX512_BACKEND;
#endif
#ifdef __cplusplus
}
#endif
#endif