187 lines
7.2 KiB
Python
187 lines
7.2 KiB
Python
"""
|
|
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()
|