import numpy as np
from bitpolar_embeddings import compress_embeddings, BitPolarEncoder
print("=== Method 1: compress_embeddings() ===\n")
embeddings = np.random.randn(1000, 384).astype(np.float32)
compressed = compress_embeddings(embeddings, bits=4)
print(f"Compressed {compressed.n_vectors} vectors")
print(f"Compression ratio: {compressed.compression_ratio:.1f}x")
print(f"Memory: {compressed.memory_bytes:,} bytes (vs {1000*384*4:,} original)")
query = np.random.randn(384).astype(np.float32)
ids, scores = compressed.search(query, top_k=5)
print(f"\nTop 5 results: {ids.tolist()}")
print(f"Scores: {scores.tolist()}")
decoded = compressed.decompress(ids)
print(f"Decompressed top results: shape={decoded.shape}")
compressed.save("/tmp/embeddings.bp")
loaded = type(compressed).load("/tmp/embeddings.bp")
print(f"Loaded from disk: {loaded.n_vectors} vectors")
print("\n=== Method 2: BitPolarEncoder (wraps sentence-transformers) ===\n")
try:
encoder = BitPolarEncoder("all-MiniLM-L6-v2", bits=4)
compressed = encoder.encode(["Hello world", "Semantic search is powerful", "BitPolar compresses vectors"])
print(f"Encoded {compressed.n_vectors} sentences → {compressed.compression_ratio:.1f}x compression")
query_compressed = encoder.encode(["How does search work?"])
query_vec = query_compressed.decompress()[0]
ids, scores = compressed.search(query_vec, top_k=2)
print(f"Most similar to 'How does search work?': indices {ids.tolist()}")
except ImportError:
print("sentence-transformers not installed — skipping BitPolarEncoder demo")
print("Install with: pip install sentence-transformers")