from typing import Dict, Any, List import json from utils import ( call_llm, safe_json_loads, validate_ir ) # ===================================================== # FALLBACK # ===================================================== def fallback_patterns( num_proposals: int ): return [ { "name": f"Pattern {i+1}", "description": "Pattern détecté automatiquement" } for i in range(num_proposals) ] # ===================================================== # PATTERN DETECTION # ===================================================== def detect_patterns( ir: Dict[str, Any], num_proposals: int = 3, provider: str = "openai" ) -> List[Dict[str, str]]: if not validate_ir(ir): return fallback_patterns(num_proposals) ir_text = json.dumps( ir, indent=2, ensure_ascii=False ) prompt = f""" Tu es un expert en graphes mathématiques et compilation scientifique. Analyse cette IR. Détecte EXACTEMENT {num_proposals} patterns mathématiques importants. Exemples possibles : - produit scalaire - convolution - pipeline tensoriel - réduction - propagation - matrice creuse - calcul distribué - accumulation - normalisation - opération SIMD IMPORTANT : - retourne UNIQUEMENT du JSON valide - aucune balise markdown - aucun texte hors JSON FORMAT STRICT : [ {{ "name": "Convolution", "description": "Détection d'un motif convolutionnel" }} ] IR : {ir_text} """ response = call_llm( prompt, provider=provider, max_tokens=1800 ) parsed = safe_json_loads(response) valid_patterns = [] if isinstance(parsed, list): for item in parsed: if not isinstance(item, dict): continue name = item.get( "name", "Unknown Pattern" ) description = item.get( "description", "Description indisponible" ) valid_patterns.append({ "name": str(name), "description": str(description) }) if len(valid_patterns) > 0: return valid_patterns[:num_proposals] return fallback_patterns(num_proposals)