mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
- Robust ID extraction in CentralityCalculator, CommunityDetector, and ConnectivityAnalyzer - Support for direct Entity objects and dictionaries as node identifiers - Improved Entity hashability in utils/types.py - Added integration test to verify fix and prevent regression
136 lines
5.7 KiB
Python
136 lines
5.7 KiB
Python
import unittest
|
|
import sys
|
|
import os
|
|
import numpy as np
|
|
|
|
import pytest
|
|
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
|
|
pytestmark = pytest.mark.integration
|
|
|
|
class TestNotebooks(unittest.TestCase):
|
|
|
|
def test_12_embedding_generation(self):
|
|
print("\nTesting 12_Embedding_Generation.ipynb logic...")
|
|
try:
|
|
from semantica.embeddings import EmbeddingGenerator, TextEmbedder
|
|
|
|
# Test EmbeddingGenerator
|
|
generator = EmbeddingGenerator()
|
|
texts = [
|
|
"Apple Inc. is a technology company.",
|
|
"Microsoft Corporation develops software.",
|
|
"Amazon provides cloud services."
|
|
]
|
|
embeddings = generator.generate_embeddings(texts, data_type="text")
|
|
|
|
self.assertEqual(len(embeddings), 3)
|
|
# Assuming default dimension is not 0
|
|
self.assertTrue(len(embeddings[0]) > 0)
|
|
print("EmbeddingGenerator: OK")
|
|
|
|
# Test TextEmbedder
|
|
text_embedder = TextEmbedder()
|
|
text = "Semantic knowledge graphs enable intelligent data processing."
|
|
embedding = text_embedder.embed_text(text)
|
|
|
|
self.assertTrue(len(embedding) > 0)
|
|
print("TextEmbedder: OK")
|
|
|
|
except Exception as e:
|
|
self.fail(f"12_Embedding_Generation.ipynb failed: {e}")
|
|
|
|
def test_13_vector_store_basic(self):
|
|
print("\nTesting 13_Vector_Store.ipynb logic...")
|
|
try:
|
|
from semantica.vector_store import VectorStore
|
|
|
|
# Initialize
|
|
store = VectorStore(backend="faiss", dimension=768)
|
|
|
|
# Store vectors
|
|
vectors = [np.random.rand(768).astype('float32') for _ in range(10)]
|
|
metadata = [{"id": i, "text": f"doc_{i}"} for i in range(10)]
|
|
|
|
vector_ids = store.store_vectors(vectors, metadata=metadata)
|
|
self.assertEqual(len(vector_ids), 10)
|
|
|
|
# Search
|
|
query = np.random.rand(768).astype('float32')
|
|
results = store.search_vectors(query, k=5)
|
|
self.assertEqual(len(results), 5)
|
|
print("VectorStore Basic: OK")
|
|
|
|
except Exception as e:
|
|
self.fail(f"13_Vector_Store.ipynb failed: {e}")
|
|
|
|
def test_advanced_vector_store(self):
|
|
print("\nTesting Advanced_Vector_Store_and_Search.ipynb logic...")
|
|
try:
|
|
from semantica.vector_store import FAISSStore, HybridSearch, MetadataFilter, SearchRanker, NamespaceManager
|
|
|
|
# Part 1: FAISSStore
|
|
store = FAISSStore(dimension=768)
|
|
index = store.create_index(index_type="hnsw", metric="L2", m=16)
|
|
vectors = np.random.rand(100, 768).astype('float32')
|
|
ids = [f"doc_{i}" for i in range(len(vectors))]
|
|
store.add_vectors(vectors, ids=ids)
|
|
|
|
query = np.random.rand(768).astype('float32')
|
|
results = store.search_similar(query, k=5)
|
|
# Check results structure
|
|
self.assertEqual(len(results), 5)
|
|
self.assertTrue(isinstance(results[0], dict))
|
|
self.assertIn("id", results[0])
|
|
print("FAISSStore: OK")
|
|
|
|
# Part 2: Hybrid Search
|
|
search = HybridSearch()
|
|
# Mock data for hybrid search
|
|
docs = [
|
|
{"id": 0, "category": "Tech", "year": 2024},
|
|
{"id": 1, "category": "Tech", "year": 2023},
|
|
{"id": 2, "category": "Biz", "year": 2024}
|
|
]
|
|
vecs = [np.random.rand(768).astype('float32') for _ in docs]
|
|
meta = [{"category": d["category"], "year": d["year"]} for d in docs]
|
|
v_ids = [f"doc_{d['id']}" for d in docs]
|
|
|
|
# Filter
|
|
filt = MetadataFilter().eq("category", "Tech").eq("year", 2024)
|
|
# Note: search signature might vary, adapting to notebook usage
|
|
# search.search(query, vectors, metadata, vector_ids, filter=filter1, k=10)
|
|
results = search.search(query, vecs, meta, v_ids, filter=filt, k=10)
|
|
# Should find doc 0
|
|
found_ids = [r['id'] for r in results]
|
|
self.assertIn("doc_0", found_ids)
|
|
print("HybridSearch: OK")
|
|
|
|
# Part 3: SearchRanker
|
|
ranker = SearchRanker(strategy="reciprocal_rank_fusion")
|
|
res1 = [{"id": "doc_1", "score": 0.9}, {"id": "doc_2", "score": 0.8}]
|
|
res2 = [{"id": "doc_2", "score": 0.85}, {"id": "doc_3", "score": 0.7}]
|
|
combined = ranker.rank([res1, res2])
|
|
self.assertTrue(len(combined) > 0)
|
|
print("SearchRanker: OK")
|
|
|
|
# Part 4: NamespaceManager
|
|
manager = NamespaceManager()
|
|
ns_a = manager.create_namespace("ns_a", "Namespace A")
|
|
manager.add_vector_to_namespace("doc_1", "ns_a")
|
|
vecs_a = manager.get_namespace_vectors("ns_a")
|
|
# Note: add_vector_to_namespace might need actual vector storage or just ID tracking depending on implementation
|
|
# Notebook says: manager.add_vector_to_namespace(f"company_a_doc_{i}", "company_a")
|
|
# And then: a_docs = manager.get_namespace_vectors("company_a")
|
|
# Checking if it returns the list of IDs or vectors.
|
|
# Assuming it tracks IDs based on notebook context.
|
|
self.assertTrue(len(vecs_a) > 0)
|
|
print("NamespaceManager: OK")
|
|
|
|
except Exception as e:
|
|
self.fail(f"Advanced_Vector_Store_and_Search.ipynb failed: {e}")
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|