#ifndef SEMQ_H
#define SEMQ_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_WIN32)
#define SEMQ_API __declspec(dllexport)
#else
#define SEMQ_API __attribute__((visibility("default")))
#endif
#define SEMQ_FILE_VERSION 2u
#define SEMQ_RULE_REVISION 0u
#define SEMQ_CONFIG_BYTES 13u
#define SEMQ_DIGEST_BYTES 32u
#define SEMQ_MAX_DIM 65536u
#define SEMQ_ID_MAX_BYTES 4096u
#define SEMQ_MANIFEST_MAX_PAIRS 4096u
#define SEMQ_MANIFEST_KEY_MAX 256u
#define SEMQ_MANIFEST_VALUE_MAX 65536u
#define SEMQ_MANIFEST_SECTION_MAX (16u * 1024u * 1024u)
#define SEMQ_NONE UINT64_MAX
typedef enum {
SEMQ_ORBIT = 0,
SEMQ_PHASE = 1,
SEMQ_QUANT = 2
} semq_operator_t;
typedef enum {
SEMQ_ID_U64 = 0,
SEMQ_ID_UTF8 = 1
} semq_id_kind_t;
typedef enum {
SEMQ_OK = 0,
SEMQ_ERR_INVALID_INPUT = 1,
SEMQ_ERR_INCOMPATIBLE = 2,
SEMQ_ERR_FORMAT = 3,
SEMQ_ERR_INTEGRITY = 4,
SEMQ_ERR_UNSUPPORTED = 5,
SEMQ_ERR_NOMEM = 6,
SEMQ_ERR_INTERNAL = 7
} semq_status_t;
typedef enum {
SEMQ_WHICH_NONE = 0,
SEMQ_WHICH_CONTENT = 1,
SEMQ_WHICH_STATE = 2
} semq_which_t;
typedef enum {
SEMQ_SECTION_FRAMING = 0,
SEMQ_SECTION_CONFIG = 1,
SEMQ_SECTION_SIZES = 2,
SEMQ_SECTION_IDS = 3,
SEMQ_SECTION_MANIFEST = 4,
SEMQ_SECTION_FOOTER = 5,
SEMQ_SECTION_ROWS = 6
} semq_section_t;
typedef enum {
SEMQ_FIELD_OPERATOR = 0,
SEMQ_FIELD_DIM = 1,
SEMQ_FIELD_P1 = 2,
SEMQ_FIELD_P2 = 3
} semq_config_field_t;
typedef struct {
uint32_t status;
uint32_t which;
uint64_t row;
uint64_t field;
char message[128];
} semq_error_t;
typedef struct {
uint32_t op;
uint32_t dim;
uint32_t p1;
uint32_t p2;
} semq_config_t;
SEMQ_API semq_status_t semq_config_orbit(uint32_t dim, uint32_t scale,
semq_config_t* out, semq_error_t* err);
SEMQ_API semq_status_t semq_config_phase(uint32_t dim, uint32_t sectors,
semq_config_t* out, semq_error_t* err);
SEMQ_API semq_status_t semq_config_quant(uint32_t dim, uint32_t bins,
semq_config_t* out, semq_error_t* err);
SEMQ_API semq_status_t semq_config_validate(const semq_config_t* cfg, semq_error_t* err);
SEMQ_API void semq_config_to_bytes(const semq_config_t* cfg, uint8_t out[13]);
SEMQ_API semq_status_t semq_config_from_bytes(const uint8_t in[13], semq_config_t* out,
semq_error_t* err);
SEMQ_API uint32_t semq_config_bytes_per_vector(const semq_config_t* cfg);
SEMQ_API uint32_t semq_config_units_per_row(const semq_config_t* cfg);
SEMQ_API float semq_config_max_magnitude(const semq_config_t* cfg);
SEMQ_API int semq_config_equal(const semq_config_t* a, const semq_config_t* b);
typedef struct semq_codec semq_codec_t;
typedef struct semq_encoding semq_encoding_t;
typedef struct semq_diff semq_diff_t;
typedef struct {
const uint8_t* key;
uint32_t key_len;
const uint8_t* value;
uint32_t value_len;
} semq_pair_t;
typedef struct {
uint32_t kind;
uint64_t n;
const uint64_t* u64;
const uint64_t* utf8_offsets;
const uint8_t* utf8_bytes;
} semq_ids_t;
SEMQ_API semq_status_t semq_codec_create(const semq_config_t* cfg, semq_codec_t** out,
semq_error_t* err);
SEMQ_API void semq_codec_free(semq_codec_t* codec);
SEMQ_API const semq_config_t* semq_codec_config(const semq_codec_t* codec);
SEMQ_API const char* semq_codec_backend(const semq_codec_t* codec);
SEMQ_API semq_status_t semq_codec_encode(const semq_codec_t* codec, const semq_ids_t* ids,
const float* vectors, const semq_pair_t* manifest,
uint32_t n_pairs, semq_encoding_t** out,
semq_error_t* err);
SEMQ_API semq_status_t semq_codec_decode(const semq_codec_t* codec, const semq_encoding_t* enc,
float* out, semq_error_t* err);
SEMQ_API semq_status_t semq_codec_unpack(const semq_codec_t* codec, const semq_encoding_t* enc,
uint8_t* out, semq_error_t* err);
SEMQ_API semq_status_t semq_encoding_create(const semq_config_t* cfg, const semq_ids_t* ids,
const uint8_t* rows, const semq_pair_t* manifest,
uint32_t n_pairs, semq_encoding_t** out,
semq_error_t* err);
SEMQ_API void semq_encoding_free(semq_encoding_t* enc);
SEMQ_API const semq_config_t* semq_encoding_config(const semq_encoding_t* enc);
SEMQ_API uint32_t semq_encoding_id_kind(const semq_encoding_t* enc);
SEMQ_API uint64_t semq_encoding_len(const semq_encoding_t* enc);
SEMQ_API const uint8_t* semq_encoding_rows(const semq_encoding_t* enc, uint64_t* len);
SEMQ_API const uint64_t* semq_encoding_ids_u64(const semq_encoding_t* enc);
SEMQ_API const uint64_t* semq_encoding_ids_utf8_offsets(const semq_encoding_t* enc);
SEMQ_API const uint8_t* semq_encoding_ids_utf8_bytes(const semq_encoding_t* enc, uint64_t* len);
SEMQ_API uint32_t semq_encoding_manifest_len(const semq_encoding_t* enc);
SEMQ_API semq_status_t semq_encoding_manifest_pair(const semq_encoding_t* enc, uint32_t i,
semq_pair_t* out, semq_error_t* err);
SEMQ_API void semq_encoding_content_digest(const semq_encoding_t* enc, uint8_t out[32]);
SEMQ_API void semq_encoding_state_id(const semq_encoding_t* enc, uint8_t out[32]);
SEMQ_API semq_status_t semq_encoding_find_u64(const semq_encoding_t* enc, uint64_t id,
uint64_t* index, semq_error_t* err);
SEMQ_API semq_status_t semq_encoding_find_utf8(const semq_encoding_t* enc, const uint8_t* id,
uint64_t len, uint64_t* index, semq_error_t* err);
typedef struct {
const uint8_t* ptr;
uint64_t len;
} semq_part_t;
SEMQ_API uint64_t semq_encoding_file_size(const semq_encoding_t* enc);
SEMQ_API uint32_t semq_encoding_save_parts(const semq_encoding_t* enc, semq_part_t parts[5]);
SEMQ_API semq_status_t semq_encoding_save(const semq_encoding_t* enc, uint8_t* out, uint64_t cap,
semq_error_t* err);
SEMQ_API semq_status_t semq_encoding_load(const uint8_t* buf, uint64_t len, semq_encoding_t** out,
semq_error_t* err);
SEMQ_API semq_status_t semq_encoding_concat(const semq_encoding_t* const* parts, uint32_t k,
semq_encoding_t** out, semq_error_t* err);
SEMQ_API semq_status_t semq_encoding_diff(const semq_encoding_t* reference,
const semq_encoding_t* candidate, semq_diff_t** out,
semq_error_t* err);
typedef enum {
SEMQ_LIST_ADDED = 0,
SEMQ_LIST_REMOVED = 1,
SEMQ_LIST_CHANGED = 2
} semq_list_t;
typedef struct {
const uint8_t* key;
uint32_t key_len;
int has_before;
const uint8_t* before;
uint32_t before_len;
int has_after;
const uint8_t* after;
uint32_t after_len;
} semq_manifest_change_t;
SEMQ_API void semq_diff_free(semq_diff_t* diff);
SEMQ_API const semq_config_t* semq_diff_config(const semq_diff_t* diff);
SEMQ_API uint32_t semq_diff_id_kind(const semq_diff_t* diff);
SEMQ_API void semq_diff_reference_id(const semq_diff_t* diff, uint8_t out[32]);
SEMQ_API void semq_diff_candidate_id(const semq_diff_t* diff, uint8_t out[32]);
SEMQ_API uint64_t semq_diff_count(const semq_diff_t* diff, uint32_t list);
SEMQ_API uint64_t semq_diff_n_unchanged(const semq_diff_t* diff);
SEMQ_API semq_status_t semq_diff_id(const semq_diff_t* diff, uint32_t list, uint64_t i,
uint64_t* u64, const uint8_t** bytes, uint64_t* len,
semq_error_t* err);
SEMQ_API semq_status_t semq_diff_hamming(const semq_diff_t* diff, uint64_t i, uint64_t* out,
semq_error_t* err);
SEMQ_API uint32_t semq_diff_manifest_changes(const semq_diff_t* diff);
SEMQ_API semq_status_t semq_diff_manifest_change(const semq_diff_t* diff, uint32_t i,
semq_manifest_change_t* out, semq_error_t* err);
SEMQ_API semq_status_t semq_diff_units_u64(const semq_diff_t* diff, uint64_t id, uint32_t* units,
uint8_t* ref_symbols, uint8_t* cand_symbols,
uint64_t cap, uint64_t* count, semq_error_t* err);
SEMQ_API semq_status_t semq_diff_units_utf8(const semq_diff_t* diff, const uint8_t* id,
uint64_t len, uint32_t* units, uint8_t* ref_symbols,
uint8_t* cand_symbols, uint64_t cap, uint64_t* count,
semq_error_t* err);
typedef struct semq_floor semq_floor_t;
SEMQ_API semq_status_t semq_floor_create(const semq_config_t* config, uint32_t id_kind,
const uint8_t reference_id[32], uint64_t nulls,
uint64_t changed_rows, uint64_t total_rows,
uint64_t hamming, semq_floor_t** out,
semq_error_t* err);
SEMQ_API void semq_floor_free(semq_floor_t* floor);
SEMQ_API semq_status_t semq_floor_measure(const semq_diff_t* const* nulls, uint32_t k,
semq_floor_t** out, semq_error_t* err);
SEMQ_API const semq_config_t* semq_floor_config(const semq_floor_t* floor);
SEMQ_API uint32_t semq_floor_id_kind(const semq_floor_t* floor);
SEMQ_API void semq_floor_reference_id(const semq_floor_t* floor, uint8_t out[32]);
SEMQ_API uint64_t semq_floor_nulls(const semq_floor_t* floor);
SEMQ_API uint64_t semq_floor_changed_rows(const semq_floor_t* floor);
SEMQ_API uint64_t semq_floor_total_rows(const semq_floor_t* floor);
SEMQ_API uint64_t semq_floor_hamming(const semq_floor_t* floor);
SEMQ_API semq_status_t semq_diff_within(const semq_diff_t* diff, const semq_floor_t* floor,
int* out, semq_error_t* err);
SEMQ_API const char* semq_core_version(void);
SEMQ_API const char* semq_build_id(void);
SEMQ_API const char* semq_backend_name(uint32_t op);
SEMQ_API const char* semq_status_name(uint32_t status);
SEMQ_API void semq_sha256(const uint8_t* data, uint64_t len, uint8_t out[32]);
#ifdef __cplusplus
}
#endif
#endif