""" Test simple pour le UIChangeDetector """ import sys import numpy as np from datetime import datetime # Ajouter le chemin du module sys.path.insert(0, 'geniusia2') from core.ui_change_detector import UIChangeDetector from core.embeddings_manager import EmbeddingsManager from core.logger import Logger from core.config import CONFIG def test_ui_change_detector(): """Test basique du UIChangeDetector""" print("=" * 60) print("Test du UIChangeDetector") print("=" * 60) # Initialiser les dépendances print("\n1. Initialisation des composants...") logger = Logger(log_dir="data/logs", encryption_key=None) # Créer un EmbeddingsManager mock (sans modèle réel) class MockEmbeddingsManager: def get_embedding_similarity(self, emb1, emb2): """Calcule la similarité cosinus""" emb1_norm = emb1 / np.linalg.norm(emb1) emb2_norm = emb2 / np.linalg.norm(emb2) similarity = np.dot(emb1_norm, emb2_norm) return (similarity + 1.0) / 2.0 embeddings_manager = MockEmbeddingsManager() # Créer le détecteur detector = UIChangeDetector(embeddings_manager, logger, CONFIG) print(f" ✓ UIChangeDetector initialisé") print(f" - Seuil de similarité UI: {detector.ui_change_threshold}") print(f" - Seuil de delta bbox: {detector.bbox_delta_threshold} pixels") # Test 1: Détection de changement UI (embeddings similaires) print("\n2. Test: UI stable (embeddings similaires)...") current_emb = np.random.rand(512) stored_embs = [ current_emb + np.random.rand(512) * 0.1, # Très similaire current_emb + np.random.rand(512) * 0.15, ] change_detected, similarity = detector.detect_ui_change( current_emb, stored_embs, "test_task_1" ) print(f" - Changement détecté: {change_detected}") print(f" - Similarité max: {similarity:.3f}") print(f" ✓ Test réussi: {'Changement' if change_detected else 'Stable'}") # Test 2: Détection de changement UI (embeddings différents) print("\n3. Test: UI changée (embeddings différents)...") current_emb = np.random.rand(512) stored_embs = [ np.random.rand(512), # Complètement différent np.random.rand(512), ] change_detected, similarity = detector.detect_ui_change( current_emb, stored_embs, "test_task_2" ) print(f" - Changement détecté: {change_detected}") print(f" - Similarité max: {similarity:.3f}") print(f" ✓ Test réussi: {'Changement' if change_detected else 'Stable'}") # Test 3: Calcul de delta bbox (petite différence) print("\n4. Test: Delta bbox (petite différence)...") predicted_bbox = (100, 200, 50, 30) actual_bbox = (105, 203, 50, 30) deltas = detector.calculate_delta(predicted_bbox, actual_bbox) print(f" - Delta X: {deltas['delta_x']:.1f} pixels") print(f" - Delta Y: {deltas['delta_y']:.1f} pixels") print(f" - Delta centre: {deltas['delta_center']:.1f} pixels") print(f" - Delta max: {deltas['max_delta']:.1f} pixels") print(f" ✓ Test réussi") # Test 4: Calcul de delta bbox (grande différence) print("\n5. Test: Delta bbox (grande différence)...") predicted_bbox = (100, 200, 50, 30) actual_bbox = (150, 230, 50, 30) deltas = detector.calculate_delta(predicted_bbox, actual_bbox) print(f" - Delta X: {deltas['delta_x']:.1f} pixels") print(f" - Delta Y: {deltas['delta_y']:.1f} pixels") print(f" - Delta centre: {deltas['delta_center']:.1f} pixels") print(f" - Delta max: {deltas['max_delta']:.1f} pixels") print(f" ✓ Test réussi") # Test 5: Décision de ré-entraînement (pas nécessaire) print("\n6. Test: Décision de ré-entraînement (pas nécessaire)...") deltas = {"max_delta": 5.0} similarity = 0.85 should_retrain = detector.should_trigger_retraining(deltas, similarity) print(f" - Delta max: {deltas['max_delta']} pixels") print(f" - Similarité: {similarity:.2f}") print(f" - Ré-entraînement nécessaire: {should_retrain}") print(f" ✓ Test réussi: {'Oui' if should_retrain else 'Non'}") # Test 6: Décision de ré-entraînement (nécessaire - position) print("\n7. Test: Décision de ré-entraînement (nécessaire - position)...") deltas = {"max_delta": 25.0} similarity = 0.85 should_retrain = detector.should_trigger_retraining(deltas, similarity) print(f" - Delta max: {deltas['max_delta']} pixels") print(f" - Similarité: {similarity:.2f}") print(f" - Ré-entraînement nécessaire: {should_retrain}") print(f" ✓ Test réussi: {'Oui' if should_retrain else 'Non'}") # Test 7: Décision de ré-entraînement (nécessaire - visuel) print("\n8. Test: Décision de ré-entraînement (nécessaire - visuel)...") deltas = {"max_delta": 5.0} similarity = 0.60 should_retrain = detector.should_trigger_retraining(deltas, similarity) print(f" - Delta max: {deltas['max_delta']} pixels") print(f" - Similarité: {similarity:.2f}") print(f" - Ré-entraînement nécessaire: {should_retrain}") print(f" ✓ Test réussi: {'Oui' if should_retrain else 'Non'}") # Test 8: Déclenchement de ré-entraînement print("\n9. Test: Déclenchement de ré-entraînement...") detector.trigger_retraining( "test_task_3", "position_drift", {"delta": 25.0} ) print(f" ✓ Ré-entraînement déclenché") # Test 9: Vérification complète avec déclenchement print("\n10. Test: Vérification complète...") current_emb = np.random.rand(512) stored_embs = [np.random.rand(512)] predicted_bbox = (100, 200, 50, 30) actual_bbox = (150, 230, 50, 30) result = detector.check_and_trigger_retraining( "test_task_4", current_emb, stored_embs, predicted_bbox, actual_bbox ) print(f" - Changement UI détecté: {result['ui_change_detected']}") print(f" - Dérive position détectée: {result['position_drift_detected']}") print(f" - Ré-entraînement déclenché: {result['retraining_triggered']}") print(f" - Similarité: {result['similarity']:.3f}") if result['deltas']: print(f" - Delta max: {result['deltas']['max_delta']:.1f} pixels") print(f" ✓ Test réussi") # Test 10: Statistiques print("\n11. Test: Statistiques...") stats = detector.get_stats() print(f" - Changements détectés: {stats['total_changes_detected']}") print(f" - Ré-entraînements déclenchés: {stats['retraining_triggered_count']}") print(f" - Changements par tâche: {stats['changes_by_task']}") print(f" ✓ Test réussi") # Test 11: Historique print("\n12. Test: Historique des changements...") history = detector.get_change_history() print(f" - Nombre d'entrées: {len(history)}") if history: print(f" - Dernière entrée: {history[-1]['task_id']}") print(f" ✓ Test réussi") print("\n" + "=" * 60) print("✓ Tous les tests réussis!") print("=" * 60) if __name__ == "__main__": test_ui_change_detector()