C API Reference — libtrinity-vsa
SIMD-accelerated ternary VSA library for C, C++, Python, Swift, Go, and any FFI-capable language.
Header: trinity_vsa.h
Library: libtrinity-vsa.dylib (macOS) / libtrinity-vsa.so (Linux)
Source: src/c_api.zig
Build
# Build shared + static library
zig build libvsa
# Outputs:
# zig-out/lib/libtrinity-vsa.dylib (70 KB)
# zig-out/lib/libtrinity-vsa-static.a (128 KB)
# zig-out/include/trinity_vsa.h
# Compile C program against the library
cc -I zig-out/include -L zig-out/lib -ltrinity-vsa my_app.c -o my_app
# Run (macOS needs library path)
DYLD_LIBRARY_PATH=zig-out/lib ./my_app
Design
All vectors are opaque handles (void*). The library allocates vectors on the heap internally. Every vector returned by a create/operation function must be freed with trinity_vsa_vector_free().
NULL-safe: all functions handle NULL gracefully (return 0/NULL, no crash).
Thread-safe: each vector is independent, no global state.
Library Info
trinity_vsa_version
const char* trinity_vsa_version(void);
Returns null-terminated version string (e.g. "0.2.0").
trinity_vsa_max_dim
size_t trinity_vsa_max_dim(void);
Returns maximum supported dimension: 59049 (3^10).
Vector Lifecycle
trinity_vsa_vector_zeros
trinity_vsa_vector_t trinity_vsa_vector_zeros(size_t dim);
Create a zero vector with given dimension (max 59049). Returns NULL on failure.
trinity_vsa_vector_random
trinity_vsa_vector_t trinity_vsa_vector_random(size_t dim, uint64_t seed);
Create a random hypervector. Deterministic: same seed produces the same vector.
trinity_vsa_vector_t apple = trinity_vsa_vector_random(10000, 42);
trinity_vsa_vector_t red = trinity_vsa_vector_random(10000, 123);
// apple and red are quasi-orthogonal (~0 similarity)
trinity_vsa_from_array
trinity_vsa_vector_t trinity_vsa_from_array(const int8_t* data, size_t dim);
Create vector from int8 array. Values are clamped to {-1, 0, +1}.
trinity_vsa_vector_clone
trinity_vsa_vector_t trinity_vsa_vector_clone(trinity_vsa_vector_t v);
Deep copy. Returns new handle.
trinity_vsa_vector_free
void trinity_vsa_vector_free(trinity_vsa_vector_t v);
Free a vector. NULL-safe (no-op on NULL). Must be called for every created vector.
VSA Operations
trinity_vsa_bind
trinity_vsa_vector_t trinity_vsa_bind(trinity_vsa_vector_t a, trinity_vsa_vector_t b);
Element-wise multiplication. Creates associations.
Properties:
bind(a, a)= all +1 (self-inverse)bind(bind(a, b), b)= a (unbinding)- Commutative:
bind(a, b)=bind(b, a)
// Create association: country -> capital
trinity_vsa_vector_t france = trinity_vsa_encode_text_words("france", 6);
trinity_vsa_vector_t paris = trinity_vsa_encode_text_words("paris", 5);
trinity_vsa_vector_t pair = trinity_vsa_bind(france, paris);
trinity_vsa_unbind
trinity_vsa_vector_t trinity_vsa_unbind(trinity_vsa_vector_t a, trinity_vsa_vector_t b);
Inverse of bind (same operation for balanced ternary). Retrieves one vector from a binding.
// Query: what is the capital of France?
trinity_vsa_vector_t result = trinity_vsa_unbind(pair, france);
// result ~ paris (similarity > 0.8)
trinity_vsa_bundle2
trinity_vsa_vector_t trinity_vsa_bundle2(trinity_vsa_vector_t a, trinity_vsa_vector_t b);
Majority voting of 2 vectors. Result is similar to both inputs.
trinity_vsa_vector_t fruits = trinity_vsa_bundle2(apple, orange);
// similarity(fruits, apple) > 0.5
// similarity(fruits, orange) > 0.5
trinity_vsa_bundle3
trinity_vsa_vector_t trinity_vsa_bundle3(
trinity_vsa_vector_t a, trinity_vsa_vector_t b, trinity_vsa_vector_t c);
True majority voting of 3 vectors.
trinity_vsa_permute
trinity_vsa_vector_t trinity_vsa_permute(trinity_vsa_vector_t v, size_t k);
Cyclic shift by k positions. Used for sequence/position encoding.
Similarity Measures
trinity_vsa_cosine_similarity
double trinity_vsa_cosine_similarity(trinity_vsa_vector_t a, trinity_vsa_vector_t b);
Returns similarity in [-1.0, 1.0]:
1.0— identical0.0— orthogonal (unrelated)-1.0— opposite
Performance: ~0.05 ms per call (SIMD-accelerated).
trinity_vsa_hamming_distance
size_t trinity_vsa_hamming_distance(trinity_vsa_vector_t a, trinity_vsa_vector_t b);
Number of positions where trits differ.
trinity_vsa_dot_product
int64_t trinity_vsa_dot_product(trinity_vsa_vector_t a, trinity_vsa_vector_t b);
Sum of element-wise products.
Text Encoding
trinity_vsa_encode_text
trinity_vsa_vector_t trinity_vsa_encode_text(const char* text, size_t len);
Character-level positional encoding. Good for exact/near-exact string matching.
trinity_vsa_encode_text_words
trinity_vsa_vector_t trinity_vsa_encode_text_words(const char* text, size_t len);
Word-level bag-of-words encoding. Splits text into words, encodes each independently, bundles via majority vote. Texts sharing words have high similarity regardless of word order.
This is the recommended function for semantic search.
trinity_vsa_vector_t q = trinity_vsa_encode_text_words("machine learning", 16);
trinity_vsa_vector_t d = trinity_vsa_encode_text_words(
"machine learning algorithms for classification", 47);
double sim = trinity_vsa_cosine_similarity(q, d);
// sim = 0.5317 (strong match — shared words)
Performance: ~1.4 ms per call.
trinity_vsa_decode_text
size_t trinity_vsa_decode_text(trinity_vsa_vector_t v, char* buf, size_t buf_len);
Decode hypervector back to text (character-level). Returns number of decoded characters.
Vector Access
trinity_vsa_get_dim
size_t trinity_vsa_get_dim(trinity_vsa_vector_t v);
Get vector dimension (number of trits).
trinity_vsa_get_trit / trinity_vsa_set_trit
int8_t trinity_vsa_get_trit(trinity_vsa_vector_t v, size_t index);
void trinity_vsa_set_trit(trinity_vsa_vector_t v, size_t index, int8_t value);
Read/write individual trit values. Values are clamped to {-1, 0, +1}.
trinity_vsa_to_array
size_t trinity_vsa_to_array(trinity_vsa_vector_t v, int8_t* out, size_t max_len);
Export trit data to array. Returns number of trits copied.
Complete Example
#include <stdio.h>
#include <string.h>
#include "trinity_vsa.h"
int main(void) {
printf("Trinity VSA v%s\n", trinity_vsa_version());
// Encode texts
const char* texts[] = {
"machine learning algorithms",
"database query optimization",
"ternary computing balanced"
};
trinity_vsa_vector_t vecs[3];
for (int i = 0; i < 3; i++) {
vecs[i] = trinity_vsa_encode_text_words(texts[i], strlen(texts[i]));
}
// Search
const char* query = "machine learning";
trinity_vsa_vector_t q = trinity_vsa_encode_text_words(query, strlen(query));
for (int i = 0; i < 3; i++) {
double sim = trinity_vsa_cosine_similarity(q, vecs[i]);
printf(" [%.4f] %s\n", sim, texts[i]);
}
// Cleanup
trinity_vsa_vector_free(q);
for (int i = 0; i < 3; i++) trinity_vsa_vector_free(vecs[i]);
return 0;
}
Test Coverage
213 tests passing across the C API and underlying VSA core:
- Null safety for all functions
- Bind self-inverse property
- Bind/unbind roundtrip (similarity > 0.7)
- Clone equality (similarity = 1.0)
- From_array / to_array roundtrip
- Text encode similarity (identical = 1.0)
- Bundle2 similarity to both inputs
- Permute dissimilarity
- Hamming distance (identical = 0)