l0d0v1c commited on
Commit
ab792dc
·
verified ·
1 Parent(s): fd9baeb

Upload 9 files

Browse files
Files changed (5) hide show
  1. STATUS.md +93 -0
  2. app.py +38 -4
  3. bayesian_network_interface.py +20 -2
  4. check_deployment.py +33 -0
  5. test_hf.py +53 -0
STATUS.md ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ✅ HuggingFace Space - Status Final
2
+
3
+ ## 🎯 **Package Prêt pour Déploiement**
4
+
5
+ **Date**: 30 septembre 2025
6
+ **Taille**: 104KB (optimisé)
7
+ **Status**: ✅ READY
8
+
9
+ ## 🔧 **Problème Résolu**
10
+
11
+ ### ❌ Problème Initial
12
+ - Page "Structure du Réseau" affichait : 0 nœuds, 0 arcs
13
+ - Fonction `get_network_structure()` défaillante sur HF
14
+
15
+ ### ✅ Solution Appliquée
16
+ - Priorisation de `pgmpy_model` sur `pyagrum_model`
17
+ - Test complet validé avec `test_hf.py`
18
+
19
+ ## 📊 **Validation Complète**
20
+
21
+ ```
22
+ 🧪 Testing HuggingFace deployment...
23
+ 1. Loading network...
24
+ ✅ Network loaded with 12 variables
25
+ 2. Testing network structure...
26
+ ✅ Structure: 12 nodes, 22 edges
27
+ 3. Testing inference...
28
+ ✅ Inference working: 4 probability states
29
+ 4. Testing influential factors...
30
+ ✅ Found 5 influential factors
31
+ 5. Testing recommendations...
32
+ ✅ Generated 4 recommendations
33
+
34
+ 🎉 All tests passed!
35
+ ```
36
+
37
+ ## 📁 **Contenu Final du Package**
38
+
39
+ ```
40
+ HF/ (104KB total)
41
+ ├── app.py # Application Streamlit principale
42
+ ├── bayesian_network_interface.py # Interface corrigée pour HF
43
+ ├── autonomy_functional_complete.bif # Réseau bayésien (12 variables)
44
+ ├── requirements.txt # Dépendances optimisées
45
+ ├── README.md # Documentation avec métadonnées YAML
46
+ ├── DEPLOYMENT.md # Guide de déploiement
47
+ ├── test_hf.py # Script de validation
48
+ ├── .gitignore # Exclusions
49
+ └── .streamlit/config.toml # Configuration Streamlit
50
+ ```
51
+
52
+ ## 🚀 **Instructions de Déploiement**
53
+
54
+ 1. **Créer Space** sur https://huggingface.co/spaces
55
+ 2. **Configurer** : SDK=Streamlit, License=MIT
56
+ 3. **Uploader** tous les fichiers de ce répertoire
57
+ 4. **Attendre** construction (~2-3 min)
58
+
59
+ ## ✅ **Fonctionnalités Garanties**
60
+
61
+ - **📊 Structure** : 12 nœuds, 22 arcs (corrigé)
62
+ - **🔍 Inférence** : Calculs probabilistes temps réel
63
+ - **📈 Facteurs** : Social_Support #1 (29.9% impact)
64
+ - **📋 Recommandations** : Suggestions personnalisées
65
+ - **🌐 Visualisation D3.js** : Graphique interactif
66
+ - **💊 Interventions** : Analyses avant/après
67
+
68
+ ## 🎯 **Exemple de Résultats**
69
+
70
+ - **Femme 70-79 ans** → 53.1% probabilité d'autonomie
71
+ - **Facteur principal** → Support social (29.9% d'influence)
72
+ - **Recommandation** → Développer réseau de soutien social
73
+
74
+ ## 🔍 **Problème Persistant et Diagnostic**
75
+
76
+ **Issue**: L'utilisateur reporte toujours "0 nœuds, 0 arcs" sur HuggingFace
77
+
78
+ **Diagnostic**:
79
+ - ✅ Tests locaux: 12 nœuds, 22 arcs (fonctionnel)
80
+ - ❌ Déploiement HF: 0 nœuds, 0 arcs (dysfonctionnel)
81
+ - 🔍 Cause probable: Fichiers non synchronisés sur HF
82
+
83
+ **Vérification des tailles**:
84
+ - Local app.py: 25.1 kB (avec debugging)
85
+ - HF repo app.py: 23.4 kB (version ancienne)
86
+ - Local bayesian_network_interface.py: 33.2 kB (avec debugging)
87
+ - HF repo bayesian_network_interface.py: 32.3 kB (version ancienne)
88
+
89
+ **Solution**: Re-upload des fichiers mis à jour avec debugging vers HuggingFace
90
+
91
+ ---
92
+
93
+ **✅ Package HuggingFace Spaces - Prêt avec Debugging Ajouté**
app.py CHANGED
@@ -28,7 +28,16 @@ def main():
28
  # Initialiser le réseau
29
  if 'network' not in st.session_state:
30
  with st.spinner("Chargement du réseau bayésien..."):
31
- st.session_state.network = AutonomyBayesianNetwork()
 
 
 
 
 
 
 
 
 
32
 
33
  network = st.session_state.network
34
 
@@ -153,14 +162,39 @@ def show_structure_page(network):
153
  """Page structure du réseau"""
154
  st.header("📊 Structure du Réseau Bayésien")
155
 
156
- structure = network.get_network_structure()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
 
158
  col1, col2, col3 = st.columns(3)
159
 
160
  with col1:
161
- st.metric("Nombre de nœuds", len(structure['nodes']))
162
  with col2:
163
- st.metric("Nombre d'arcs", len(structure['edges']))
164
  with col3:
165
  st.metric("Variables actionnables", len(network.actionable_vars))
166
 
 
28
  # Initialiser le réseau
29
  if 'network' not in st.session_state:
30
  with st.spinner("Chargement du réseau bayésien..."):
31
+ try:
32
+ st.session_state.network = AutonomyBayesianNetwork()
33
+ # Debug: vérifier le chargement
34
+ if hasattr(st.session_state.network, 'pgmpy_model') and st.session_state.network.pgmpy_model:
35
+ st.session_state.loading_debug = f"✅ Réseau chargé: {len(list(st.session_state.network.pgmpy_model.nodes()))} nœuds"
36
+ else:
37
+ st.session_state.loading_debug = "❌ Erreur: pgmpy_model non chargé"
38
+ except Exception as e:
39
+ st.session_state.loading_debug = f"❌ Erreur de chargement: {str(e)}"
40
+ st.session_state.network = None
41
 
42
  network = st.session_state.network
43
 
 
162
  """Page structure du réseau"""
163
  st.header("📊 Structure du Réseau Bayésien")
164
 
165
+ # Debug information
166
+ st.write("🔍 **Debug Info:**")
167
+
168
+ # Afficher les infos de chargement
169
+ if hasattr(st.session_state, 'loading_debug'):
170
+ st.write(f"- Chargement initial: {st.session_state.loading_debug}")
171
+
172
+ if network is None:
173
+ st.error("❌ Réseau non initialisé!")
174
+ return
175
+
176
+ st.write(f"- pgmpy_model exists: {network.pgmpy_model is not None}")
177
+ if network.pgmpy_model:
178
+ st.write(f"- pgmpy nodes: {len(list(network.pgmpy_model.nodes()))}")
179
+ st.write(f"- pgmpy edges: {len(list(network.pgmpy_model.edges()))}")
180
+
181
+ st.write(f"- pyagrum_model exists: {hasattr(network, 'pyagrum_model') and network.pyagrum_model is not None}")
182
+ st.write(f"- actionable_vars: {len(getattr(network, 'actionable_vars', []))}")
183
+
184
+ try:
185
+ structure = network.get_network_structure()
186
+ st.write(f"- Structure nodes: {len(structure['nodes'])}")
187
+ st.write(f"- Structure edges: {len(structure['edges'])}")
188
+ except Exception as e:
189
+ st.error(f"Erreur lors de l'obtention de la structure: {e}")
190
+ structure = {'nodes': [], 'edges': []}
191
 
192
  col1, col2, col3 = st.columns(3)
193
 
194
  with col1:
195
+ st.metric("Nombre de nœuds", len(structure.get('nodes', [])))
196
  with col2:
197
+ st.metric("Nombre d'arcs", len(structure.get('edges', [])))
198
  with col3:
199
  st.metric("Variables actionnables", len(network.actionable_vars))
200
 
bayesian_network_interface.py CHANGED
@@ -55,21 +55,39 @@ class AutonomyBayesianNetwork:
55
 
56
  def load_network(self):
57
  """Charge le réseau depuis le fichier BIF"""
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  if PGMPY_AVAILABLE and os.path.exists(self.bif_file):
59
  try:
60
  reader = BIFReader(self.bif_file)
61
  self.pgmpy_model = reader.get_model()
62
  self.inference_engine = VariableElimination(self.pgmpy_model)
63
  print(f"✓ Réseau chargé avec pgmpy depuis {self.bif_file}")
 
64
  except Exception as e:
65
- print(f"Erreur pgmpy: {e}")
66
 
67
  if PYAGRUM_AVAILABLE and os.path.exists(self.bif_file):
68
  try:
69
  self.pyagrum_model = gum.loadBN(self.bif_file)
70
  print(f"✓ Réseau chargé avec pyAgrum depuis {self.bif_file}")
71
  except Exception as e:
72
- print(f"Erreur pyAgrum: {e}")
 
 
 
 
73
 
74
  def get_network_structure(self) -> Dict:
75
  """Retourne la structure du réseau"""
 
55
 
56
  def load_network(self):
57
  """Charge le réseau depuis le fichier BIF"""
58
+ # Debug: Vérifier l'environnement
59
+ print(f"🔍 Debug - Chargement réseau:")
60
+ print(f" - Fichier BIF: {self.bif_file}")
61
+ print(f" - Répertoire courant: {os.getcwd()}")
62
+ print(f" - Fichier existe: {os.path.exists(self.bif_file)}")
63
+ print(f" - pgmpy disponible: {PGMPY_AVAILABLE}")
64
+ print(f" - pyagrum disponible: {PYAGRUM_AVAILABLE}")
65
+
66
+ if os.path.exists(self.bif_file):
67
+ with open(self.bif_file, 'r') as f:
68
+ content_preview = f.read(200)
69
+ print(f" - Aperçu fichier: {content_preview[:100]}...")
70
+
71
  if PGMPY_AVAILABLE and os.path.exists(self.bif_file):
72
  try:
73
  reader = BIFReader(self.bif_file)
74
  self.pgmpy_model = reader.get_model()
75
  self.inference_engine = VariableElimination(self.pgmpy_model)
76
  print(f"✓ Réseau chargé avec pgmpy depuis {self.bif_file}")
77
+ print(f" - {len(list(self.pgmpy_model.nodes()))} nœuds, {len(list(self.pgmpy_model.edges()))} arcs")
78
  except Exception as e:
79
+ print(f"Erreur pgmpy: {e}")
80
 
81
  if PYAGRUM_AVAILABLE and os.path.exists(self.bif_file):
82
  try:
83
  self.pyagrum_model = gum.loadBN(self.bif_file)
84
  print(f"✓ Réseau chargé avec pyAgrum depuis {self.bif_file}")
85
  except Exception as e:
86
+ print(f"Erreur pyAgrum: {e}")
87
+
88
+ # Vérification finale
89
+ if self.pgmpy_model is None and self.pyagrum_model is None:
90
+ print("❌ Aucun modèle chargé!")
91
 
92
  def get_network_structure(self) -> Dict:
93
  """Retourne la structure du réseau"""
check_deployment.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Script simple pour vérifier que le déploiement HF fonctionne
4
+ """
5
+
6
+ import os
7
+ from bayesian_network_interface import AutonomyBayesianNetwork
8
+
9
+ def check_files():
10
+ print("🔍 Vérification des fichiers:")
11
+ print(f" - Répertoire courant: {os.getcwd()}")
12
+ print(f" - Fichiers présents:")
13
+ for file in sorted(os.listdir(".")):
14
+ if not file.startswith('.') and not file.startswith('__'):
15
+ size = os.path.getsize(file) if os.path.isfile(file) else 0
16
+ print(f" • {file} ({size} bytes)")
17
+
18
+ def check_network():
19
+ print("\n🧠 Test réseau:")
20
+ bn = AutonomyBayesianNetwork()
21
+
22
+ print(f" - pgmpy_model chargé: {bn.pgmpy_model is not None}")
23
+ if bn.pgmpy_model:
24
+ print(f" - Nœuds: {len(list(bn.pgmpy_model.nodes()))}")
25
+ print(f" - Arcs: {len(list(bn.pgmpy_model.edges()))}")
26
+
27
+ structure = bn.get_network_structure()
28
+ print(f" - Structure nœuds: {len(structure['nodes'])}")
29
+ print(f" - Structure arcs: {len(structure['edges'])}")
30
+
31
+ if __name__ == "__main__":
32
+ check_files()
33
+ check_network()
test_hf.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Test script pour vérifier que l'application HF fonctionne correctement
4
+ """
5
+
6
+ from bayesian_network_interface import AutonomyBayesianNetwork
7
+
8
+ def test_hf_deployment():
9
+ """Test complet de l'application HF"""
10
+ print("🧪 Testing HuggingFace deployment...")
11
+
12
+ # Test 1: Chargement du réseau
13
+ print("1. Loading network...")
14
+ bn = AutonomyBayesianNetwork()
15
+ assert bn.pgmpy_model is not None, "Network failed to load"
16
+ print(f" ✅ Network loaded with {len(list(bn.pgmpy_model.nodes()))} variables")
17
+
18
+ # Test 2: Structure du réseau
19
+ print("2. Testing network structure...")
20
+ structure = bn.get_network_structure()
21
+ assert len(structure['nodes']) == 12, f"Expected 12 nodes, got {len(structure['nodes'])}"
22
+ assert len(structure['edges']) == 22, f"Expected 22 edges, got {len(structure['edges'])}"
23
+ print(f" ✅ Structure: {len(structure['nodes'])} nodes, {len(structure['edges'])} edges")
24
+
25
+ # Test 3: Inférence
26
+ print("3. Testing inference...")
27
+ result = bn.perform_inference_pgmpy({'Age': 'age_70_79', 'Sex': 'female'}, ['Global_Autonomy'])
28
+ assert not result.empty, "Inference failed"
29
+ assert len(result) == 4, f"Expected 4 states, got {len(result)}"
30
+ print(f" ✅ Inference working: {len(result)} probability states")
31
+
32
+ # Test 4: Facteurs influents
33
+ print("4. Testing influential factors...")
34
+ factors = bn.get_most_influential_factors()
35
+ assert len(factors) > 0, "No influential factors found"
36
+ print(f" ✅ Found {len(factors)} influential factors")
37
+
38
+ # Test 5: Recommandations
39
+ print("5. Testing recommendations...")
40
+ profile = {'Age': 'age_80_89', 'Sex': 'male', 'Education_Level': 'primary_or_below'}
41
+ recommendations = bn.generate_recommendations(profile)
42
+ assert len(recommendations) >= 0, "Recommendations failed"
43
+ print(f" ✅ Generated {len(recommendations)} recommendations")
44
+
45
+ print("\n🎉 All tests passed! HuggingFace deployment is ready.")
46
+ print("\n📊 Sample results:")
47
+ print(f" - Autonomy probability for 70-79 female: {result.iloc[0]['Probability']:.1%}")
48
+ print(f" - Most influential factor: {factors[0][0]} ({factors[0][1]:.1%} impact)")
49
+ if recommendations:
50
+ print(f" - Top recommendation: {recommendations[0]['recommendation'][:50]}...")
51
+
52
+ if __name__ == "__main__":
53
+ test_hf_deployment()