# tests/test_encode.py import numpy as np from fractus_vorax.compiler.atoms import Atom from fractus_vorax.compiler.encode import ( char_ngrams, encode_atom, normalize, slot_hv, text_hv, tokenize, ) from fractus_vorax.hv import sim def test_normalize(): assert normalize(" What IS The Capital? ") == "what is the capital" def test_tokenize(): assert tokenize("What is the capital of France?") == ["what", "is", "the", "capital", "of", "france"] def test_text_hv_identical_sentences(): a = text_hv("what is the capital of france") b = text_hv("What IS the capital of France?") assert np.array_equal(a, b) def test_related_more_similar_than_unrelated(): q1 = text_hv("what is the capital of france") q2 = text_hv("what is the capital of spain") far = text_hv("quantum entanglement violates locality") assert sim(q1, q2) > 0.3 # 5 tokens partagés sur 6 assert sim(q1, far) < 0.2 # quasi-orthogonal assert sim(q1, q2) > sim(q1, far) def test_encode_atom_deterministic(): atom = Atom("what is the capital of france", "paris", "cap.csv:2") a1, v1 = encode_atom(atom) a2, v2 = encode_atom(atom) assert np.array_equal(a1, a2) and np.array_equal(v1, v2) def test_encode_atom_addr_is_statement(): atom = Atom("who wrote hamlet", "william shakespeare", "s:1") addr, value = encode_atom(atom) assert np.array_equal(addr, text_hv("who wrote hamlet")) assert not np.array_equal(value, addr) # le contexte change la valeur def test_encode_atom_no_context_value_equals_addr(): atom = Atom("un fait nu", "", "s:1") addr, value = encode_atom(atom) assert np.array_equal(value, addr) def test_char_ngrams_padded(): assert char_ngrams("ab") == ["#ab", "ab#"] def test_char_ngrams_length_three(): assert char_ngrams("abcd") == ["#ab", "abc", "bcd", "cd#"] def test_slot_hv_typo_similarity(): a = slot_hv("france", D=4096) b = slot_hv("franca", D=4096) c = slot_hv("japan", D=4096) assert sim(a, b) > 0.4 # 3-grammes partagés assert sim(a, c) < 0.2 # quasi-orthogonal def test_slot_hv_deterministic(): assert np.array_equal(slot_hv("spain", D=2048), slot_hv("spain", D=2048))