Skip to content

Commit 021fa53

Browse files
committed
stat_diff_calculs_{Cas-tests,Conc} se lisent un Run otfa
1 parent 82e1772 commit 021fa53

File tree

5 files changed

+146
-80
lines changed

5 files changed

+146
-80
lines changed

crue10/campagne_otfa.py

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
from crue10.etude import Etude
77
from crue10.utils import check_isinstance, get_optional_commentaire, PREFIX
88

9-
from snippets._params import ETATREF_SCENARIO_PAR_AMENAGEMENT
10-
119

1210
DOSSIER_REF = os.path.join('..', '..', 'SHY_C10_Crue10_Cas-tests_gprec', 'Conc')
1311
DOSSIER_CIBLE = os.path.join('..', '..', 'SHY_C10_Crue10_Cas-tests', 'Conc')
@@ -94,32 +92,35 @@ def write_otfa(self, folder):
9492
)
9593

9694

97-
# Cas-tests.otfa.xml
98-
otfa = FichierOtfa('Cas-tests', mode='w', files={'otfa': '../../../SHY_C10_Crue10_Cas-tests/OTFA/Cas-tests_avec_gprec.otfa.xml'},
99-
metadata={'Commentaire': "Campagne complète : lancement de toutes les lignes OTFA pour les cas-tests fonctionnels"})
100-
otfa.read_otfa()
101-
for campagne in otfa.campagnes:
102-
campagne.nom_scenario_cible = campagne.nom_scenario_ref
103-
campagne.chemin_etude_cible = campagne.chemin_etude_ref
104-
campagne.chemin_etude_ref = campagne.chemin_etude_cible.replace('..\Cas-tests',
105-
'..\..\SHY_C10_Crue10_Cas-tests_gprec\Cas-tests')
106-
otfa.write_otfa('../../../SHY_C10_Crue10_Cas-tests/OTFA')
107-
108-
109-
# Conc.otfa.xml
110-
otfa = FichierOtfa('Conc', mode='w', files={'otfa': '../../../SHY_C10_Crue10_Cas-tests/Conc_avec_gprec.otfa.xml'},
111-
metadata={'Commentaire': "OTFA pour les derniers modèles de concession"})
112-
for etude_dossier, nom_scenario in ETATREF_SCENARIO_PAR_AMENAGEMENT.items():
113-
for etu_path in glob(os.path.join('..', DOSSIER_REF, etude_dossier, '*.etu.xml')): # FIXME: only one etu.xml should be found by folder!
114-
etude = Etude(etu_path)
115-
if nom_scenario is None:
116-
nom_scenario = etude.get_scenario_courant().id
117-
campagne = Campagne(os.path.relpath(os.path.join(DOSSIER_REF, etude_dossier, os.path.basename(etu_path)),
118-
start=os.path.join(DOSSIER_CIBLE, '..', 'OTFA')),
119-
nom_scenario,
120-
os.path.relpath(os.path.join(DOSSIER_CIBLE, etude_dossier, os.path.basename(etu_path)),
121-
start=os.path.join(DOSSIER_CIBLE, '..', 'OTFA')),
122-
nom_scenario)
123-
otfa.ajouter_campagne(campagne)
124-
125-
otfa.write_otfa('../../../SHY_C10_Crue10_Cas-tests/OTFA')
95+
if __name__ == "__main__":
96+
from snippets._params import ETATREF_SCENARIO_PAR_AMENAGEMENT
97+
98+
# Cas-tests.otfa.xml
99+
otfa = FichierOtfa('Cas-tests', mode='w', files={'otfa': '../../../SHY_C10_Crue10_Cas-tests/OTFA/Cas-tests_avec_gprec.otfa.xml'},
100+
metadata={'Commentaire': "Campagne complète : lancement de toutes les lignes OTFA pour les cas-tests fonctionnels"})
101+
otfa.read_otfa()
102+
for campagne in otfa.campagnes:
103+
campagne.nom_scenario_cible = campagne.nom_scenario_ref
104+
campagne.chemin_etude_cible = campagne.chemin_etude_ref
105+
campagne.chemin_etude_ref = campagne.chemin_etude_cible.replace('..\Cas-tests',
106+
'..\..\SHY_C10_Crue10_Cas-tests_gprec\Cas-tests')
107+
otfa.write_otfa('../../../SHY_C10_Crue10_Cas-tests/OTFA')
108+
109+
110+
# Conc.otfa.xml
111+
otfa = FichierOtfa('Conc', mode='w', files={'otfa': '../../../SHY_C10_Crue10_Cas-tests/Conc_avec_gprec.otfa.xml'},
112+
metadata={'Commentaire': "OTFA pour les derniers modèles de concession"})
113+
for etude_dossier, nom_scenario in ETATREF_SCENARIO_PAR_AMENAGEMENT.items():
114+
for etu_path in glob(os.path.join('..', DOSSIER_REF, etude_dossier, '*.etu.xml')): # FIXME: only one etu.xml should be found by folder!
115+
etude = Etude(etu_path)
116+
if nom_scenario is None:
117+
nom_scenario = etude.get_scenario_courant().id
118+
campagne = Campagne(os.path.relpath(os.path.join(DOSSIER_REF, etude_dossier, os.path.basename(etu_path)),
119+
start=os.path.join(DOSSIER_CIBLE, '..', 'OTFA')),
120+
nom_scenario,
121+
os.path.relpath(os.path.join(DOSSIER_CIBLE, etude_dossier, os.path.basename(etu_path)),
122+
start=os.path.join(DOSSIER_CIBLE, '..', 'OTFA')),
123+
nom_scenario)
124+
otfa.ajouter_campagne(campagne)
125+
126+
otfa.write_otfa('../../../SHY_C10_Crue10_Cas-tests/OTFA')

crue10/utils/multiple_runs.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from crue10.etude import Etude
1111
from crue10.utils import ExceptionCrue10, logger
1212
from crue10.utils.settings import CRUE10_EXE_PATH, NCSIZE
13+
from snippets._params import COEUR_REFERENCE, COEUR_CIBLE
1314

1415

1516
def launch_scenario_modifications(function, modifications_liste, ncsize=NCSIZE):
@@ -18,6 +19,80 @@ def launch_scenario_modifications(function, modifications_liste, ncsize=NCSIZE):
1819
return pool.map(function, modifications_liste)
1920

2021

22+
def parse_otfa_runs(fichier_otfa):
23+
"""
24+
:param fichier_otfa: fichier OTFA en lecture (et qui est déjà parsé)
25+
:vartype fichier_otfa: FichierOtfa
26+
:rtype: pd.DataFrame
27+
"""
28+
df_runs = pd.DataFrame({'etude_dossier': [], 'etude_basename': [], 'scenario': [], 'exe_id': [],
29+
'run_idx': [], 'run_id': [],
30+
'variable': [], 'value': []})
31+
for campagne in fichier_otfa.campagnes: # (1) reference = old_c10m10, (2) cible = c10m10
32+
dossier_otfa = os.path.dirname(fichier_otfa.files['otfa'])
33+
34+
assert campagne.chemin_etude_ref == campagne.chemin_etude_cible
35+
assert campagne.nom_scenario_ref == campagne.nom_scenario_cible
36+
37+
etude_dossier = os.path.basename(os.path.dirname(campagne.chemin_etude_ref))
38+
logger.info(">>>>>>>>>> Dossier étude: %s <<<<<<<<<<" % etude_dossier)
39+
40+
for run_idx, exe_id in enumerate((COEUR_REFERENCE, COEUR_CIBLE)):
41+
try:
42+
if run_idx == 0:
43+
etude = Etude(os.path.normpath(os.path.join(dossier_otfa, campagne.chemin_etude_ref)))
44+
scenario = etude.get_scenario(campagne.nom_scenario_ref)
45+
scenario.read_all(ignore_shp=True)
46+
run = scenario.get_run(list(scenario.runs.keys())[0]) # old_c10m10
47+
elif run_idx == 1:
48+
etude = Etude(os.path.normpath(os.path.join(dossier_otfa, campagne.chemin_etude_cible)))
49+
scenario = etude.get_scenario(campagne.nom_scenario_cible)
50+
scenario.read_all(ignore_shp=True)
51+
run = scenario.get_run(list(scenario.runs.keys())[-1]) # c10m10
52+
else:
53+
raise NotImplementedError
54+
55+
logger.info(run)
56+
values = OrderedDict()
57+
58+
# Get nb_calc_perm
59+
try:
60+
resultats = run.get_resultats_calcul()
61+
values['nb_calc_perm'] = len(resultats.res_calc_pseudoperm)
62+
except IOError as e:
63+
logger.warning("Aucun résultat trouvé (fichier rcal manquant) pour le Run #%s" % run.id)
64+
values['nb_calc_perm'] = 0
65+
66+
# Compute nb_services_ok
67+
nb_services_ok = 0
68+
for service, traces in run.traces.items():
69+
if traces and run.nb_erreurs_bloquantes([service]) == 0:
70+
if service == 'r':
71+
# Display a message to check Crue10 version
72+
logger.debug("%s: %s" % (exe_id, traces[0].get_message()))
73+
nb_services_ok += 1
74+
75+
# Save criteria in values and append them in df_runs
76+
values.update(OrderedDict([
77+
('nb_services_ok', nb_services_ok),
78+
('nb_erreurs_calcul', run.nb_erreurs_calcul()),
79+
('nb_avertissements_calcul', run.nb_avertissements_calcul()),
80+
]))
81+
for var, value in values.items():
82+
serie = pd.Series({
83+
'etude_dossier': etude_dossier, 'etude_basename': os.path.basename(etude.etu_path),
84+
'scenario': scenario.id, 'exe_id': exe_id,
85+
'run_idx': run_idx, 'run_id': run.id,
86+
'variable': var, 'value': value
87+
})
88+
df_runs.loc[len(df_runs)] = serie
89+
90+
except ExceptionCrue10 as e:
91+
logger.critical("ERREUR CRITIQUE :\n%s" % e)
92+
93+
return df_runs
94+
95+
2196
def launch_runs(dossier, scenarios_dict=None, crue_exe_dict={'prod': CRUE10_EXE_PATH}, overwrite=True):
2297
"""
2398
:param dossier: dossier contenant des sous-dossiers avec un ou plusieurs .etu.xml
@@ -189,7 +264,7 @@ def get_run_steady_results(dossier, df_runs_unique, reference, out_csv_diff_by_c
189264
diff = res_perm_curr - res_perm_ref
190265
diff_abs = np.abs(diff)
191266

192-
if out_csv_diff_by_calc is not None and row['exe_id'] == 'qualif':
267+
if out_csv_diff_by_calc is not None and row['exe_id'] == COEUR_CIBLE:
193268
df_diff = pd.DataFrame({
194269
'id_calcul': np.repeat(np.arange(nb_common_calc, dtype=int) + 1, diff.shape[1]),
195270
'emh': resultats.emh[emh_type] * diff.shape[0],

snippets/_params.py

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,21 @@
11
# coding: utf-8
2-
"""
3-
Les versions des différents exécutables Crue10 :
4-
* 'qualif_c10m9': '10.1.12'
5-
* 'prod': '10.2.0'
6-
* 'local_v10.2': '10.2.0' # Branche v10.2 créée le 04/07/2017 (source non précisé)
7-
* 'qualif_old_c10m10': '10.2.0'
8-
* 'qualif_c10m10v111': '10.3.0'
9-
* 'qualif': '10.3.2' # Branche v10.3 (VS2017) créée le 20/03/2018 (à partir de v10.3)
10-
* 'local_v10.3': '10.3.2' # Branche v10.3 créée le 25/01/2018 (à partir de DEV)
11-
"""
122
from collections import OrderedDict
13-
from os import sep
3+
import os
144

155
from crue10.utils import logger
166

177

188
CSV_DELIMITER = ';'
199

10+
COEUR_REFERENCE = 'v10.5.0.0-VS2017'
11+
COEUR_CIBLE = 'v10.5.0.0-VS2022'
2012

21-
CRUE10_EXE_REFERENCE = 'prod'
22-
13+
DOSSIER_FUDAACRUE = 'C:/softs/FudaaCrue-1.4.3-20231201_Coeur-%s-%s' % (COEUR_CIBLE, COEUR_REFERENCE)
2314

2415
CRUE10_EXE = OrderedDict([
25-
# Liste des exécutables Crue10 à comparer
26-
('prod', 'P:/FudaaCrue/etc/coeurs/c10m10/exe/crue10.exe'.replace('/', sep)),
27-
('qualif', 'Q:/Qualif_Exec/FudaaCrue/etc/coeurs/c10m10/exe/crue10.exe'.replace('/', sep)),
28-
29-
# Référence utilisée pour les calculs de différences
30-
# ('prod', 'P:/FudaaCrue/etc/coeurs/c10m10/exe/crue10.exe'.replace('/', sep)),
31-
32-
# Calculs à comparer à la référence
33-
# failed .STO/.STR missing: ('qualif_c10m9', 'Q:/Qualif_Exec/FudaaCrue/etc/coeurs/c10m9/exe/crue10.exe'.replace('/', sep)),
34-
# same as prod: ('qualif_old_c10m10', 'Q:/Qualif_Exec/FudaaCrue/etc/coeurs/old_c10m10/exe/crue10.exe'.replace('/', sep)),
35-
# ('qualif_c10m10v111', 'Q:/Qualif_Exec/FudaaCrue/etc/coeurs/c10m10v111/exe/crue10.exe'.replace('/', os.sep)),
36-
# ('qualif', 'Q:/Qualif_Exec/FudaaCrue/etc/coeurs/c10m10/exe/crue10.exe'.replace('/', sep)),
16+
# Les 2 exécutables Crue10 à comparer (ordre : old_c10m10 puis c10m10)
17+
(COEUR_REFERENCE, os.path.join(DOSSIER_FUDAACRUE, 'etc/coeurs/old_c10m10/exe/crue10.exe'.replace('/', os.sep))),
18+
(COEUR_CIBLE, os.path.join(DOSSIER_FUDAACRUE, 'etc/coeurs/c10m10/exe/crue10.exe'.replace('/', os.sep))),
3719
])
3820

3921

snippets/stat_diff_calculs_Cas-tests.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# coding: utf-8
22
"""
3-
Statistiques sur les résulats des cas de validation du code Crue10 (tous les scénarios)
3+
Statistiques sur les résultats des cas de validation du code Crue10 (tous les scénarios)
44
55
Beware: compatibility with Python 2 is not tested for figures (at least you have to replace `height` argument by `size`)
66
"""
@@ -13,15 +13,16 @@
1313
import seaborn as sns
1414
from time import time
1515

16+
from crue10.campagne_otfa import FichierOtfa
1617
from crue10.utils import logger
17-
from crue10.utils.multiple_runs import get_run_steady_results, launch_runs
18-
from _params import CRUE10_EXE, CRUE10_EXE_REFERENCE, CSV_DELIMITER, write_csv
18+
from crue10.utils.multiple_runs import get_run_steady_results, parse_otfa_runs
19+
from _params import CRUE10_EXE, COEUR_CIBLE, COEUR_REFERENCE, CSV_DELIMITER, write_csv
1920

2021

21-
DOSSIER_IN = os.path.join('..', '..', '..', 'SHY_C10_Crue10_Cas-tests_gprec', 'Cas-tests')
22-
RUN_CALCULATIONS, WRITE_DIFF_DATAFRAME, PLOT_RUN_BARPLOT, PLOT_DIFF_BARPLOT, PLOT_DIFF_HEATMAP = \
22+
DOSSIER = "C:/PROJETS/Cas-tests_v10.5.0.0-VS2022/"
23+
PARSE_OTFA, WRITE_DIFF_DATAFRAME, PLOT_RUN_BARPLOT, PLOT_DIFF_BARPLOT, PLOT_DIFF_HEATMAP = \
2324
True, True, True, True, True
24-
CRUE10_EXE_HEATMAP = 'qualif'
25+
CRUE10_EXE_HEATMAP = COEUR_CIBLE
2526

2627
# Nommage des fichiers de sortie du script
2728
DOSSIER_OUT = os.path.join('..', 'tmp', 'stat_calculs_Cas-tests')
@@ -34,16 +35,19 @@
3435
t1 = time()
3536

3637

37-
if RUN_CALCULATIONS:
38-
df_runs = launch_runs(DOSSIER_IN, None, CRUE10_EXE, overwrite=True)
38+
if PARSE_OTFA:
39+
fichier_otfa = FichierOtfa('Cas-tests', mode='r',
40+
files={'otfa': os.path.join(DOSSIER, 'OTFA', 'Cas-tests.otfa.xml')})
41+
fichier_otfa.read_otfa()
42+
df_runs = parse_otfa_runs(fichier_otfa)
3943
write_csv(df_runs, OUT_CSV_RUNS_FILE)
4044

4145

4246
if WRITE_DIFF_DATAFRAME:
4347
df_runs = pd.read_csv(OUT_CSV_RUNS_FILE, delimiter=CSV_DELIMITER)
4448
cols = ['etude_dossier', 'etude_basename', 'scenario', 'run_idx', 'run_id', 'exe_id']
4549
df_runs_unique = df_runs[cols].drop_duplicates()
46-
df_diff_stat = get_run_steady_results(DOSSIER_IN, df_runs_unique, CRUE10_EXE_REFERENCE)
50+
df_diff_stat = get_run_steady_results(os.path.join(DOSSIER, 'Cas-tests'), df_runs_unique, COEUR_REFERENCE)
4751
write_csv(df_diff_stat, OUT_CSV_DIFF_FILE)
4852

4953

@@ -87,7 +91,7 @@
8791
if PLOT_DIFF_BARPLOT:
8892
# Read data to plot
8993
df_diff_stat = pd.read_csv(OUT_CSV_DIFF_FILE, delimiter=CSV_DELIMITER)
90-
df_diff_stat = df_diff_stat[df_diff_stat['exe_id'] != CRUE10_EXE_REFERENCE]
94+
df_diff_stat = df_diff_stat[df_diff_stat['exe_id'] != COEUR_REFERENCE]
9195
# df_diff_stat = df_diff_stat[df_diff_stat['scenario'] != 'Sc_AV2011_c10']
9296
# df_diff_stat = df_diff_stat[df_diff_stat['scenario'] != 'Sc_M31-4_c10']
9397
df_diff_stat = df_diff_stat.sort_values(by='scenario')

snippets/stat_diff_calculs_Conc.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@
1111
import seaborn as sns
1212
from time import time
1313

14+
from crue10.campagne_otfa import FichierOtfa
1415
from crue10.utils import logger
15-
from crue10.utils.multiple_runs import get_run_steady_results, launch_runs
16-
from _params import CRUE10_EXE, CRUE10_EXE_REFERENCE, CSV_DELIMITER, \
16+
from crue10.utils.multiple_runs import get_run_steady_results, parse_otfa_runs
17+
from _params import CRUE10_EXE, COEUR_REFERENCE, CSV_DELIMITER, \
1718
ETATREF_SCENARIO_PAR_AMENAGEMENT, write_csv
1819

1920

20-
DOSSIER_IN = os.path.join('..', '..', '..', 'SHY_C10_Crue10_Cas-tests_gprec', 'Conc')
21-
RUN_CALCULATIONS, WRITE_DIFF_DATAFRAME, PLOT_RUN_BARPLOT, PLOT_DIFF_BARPLOT, PLOT_BOXPLOT = \
21+
DOSSIER = "C:/PROJETS/Cas-tests_v10.5.0.0-VS2022/"
22+
PARSE_OTFA, WRITE_DIFF_DATAFRAME, PLOT_RUN_BARPLOT, PLOT_DIFF_BARPLOT, PLOT_BOXPLOT = \
2223
True, True, True, True, True
2324
REFERENCE = list(CRUE10_EXE.keys())[0]
2425

2526
# Nommage des fichiers de sortie du script
2627
DOSSIER_OUT = os.path.join('..', 'tmp', 'stat_calculs_Conc')
27-
os.makedirs(DOSSIER_OUT)
28+
os.makedirs(DOSSIER_OUT, exist_ok=True)
2829
OUT_CSV_RUNS_FILE = os.path.join(DOSSIER_OUT, 'bilan_runs.csv')
2930
OUT_CSV_DIFF_FILE = os.path.join(DOSSIER_OUT, 'bilan_stat_diff.csv')
3031
OUT_CSV_DIFF_BY_CALC = os.path.join(DOSSIER_OUT, '%s_diff_qualif-prod.csv') # %s = etude_dossier
@@ -34,17 +35,19 @@
3435
t1 = time()
3536

3637

37-
if RUN_CALCULATIONS:
38-
df_runs = launch_runs(DOSSIER_IN, ETATREF_SCENARIO_PAR_AMENAGEMENT,
39-
CRUE10_EXE, overwrite=True)
38+
if PARSE_OTFA:
39+
fichier_otfa = FichierOtfa('Conc', mode='r',
40+
files={'otfa': os.path.join(DOSSIER, 'OTFA', 'Conc.otfa.xml')})
41+
fichier_otfa.read_otfa()
42+
df_runs = parse_otfa_runs(fichier_otfa, ETATREF_SCENARIO_PAR_AMENAGEMENT)
4043
write_csv(df_runs, OUT_CSV_RUNS_FILE)
4144

4245

4346
if WRITE_DIFF_DATAFRAME:
4447
df_runs = pd.read_csv(OUT_CSV_RUNS_FILE, delimiter=CSV_DELIMITER)
4548
cols = ['etude_dossier', 'etude_basename', 'scenario', 'run_idx', 'run_id', 'exe_id']
4649
df_runs_unique = df_runs[cols].drop_duplicates()
47-
df_diff_stat = get_run_steady_results(DOSSIER_IN, df_runs_unique, CRUE10_EXE_REFERENCE,
50+
df_diff_stat = get_run_steady_results(os.path.join(DOSSIER, 'Conc'), df_runs_unique, COEUR_REFERENCE,
4851
out_csv_diff_by_calc=OUT_CSV_DIFF_BY_CALC)
4952
write_csv(df_diff_stat, OUT_CSV_DIFF_FILE)
5053

@@ -57,8 +60,10 @@
5760
# Build a FacetGrid object with barplots
5861
sns.set_context('notebook', font_scale=1.5, rc={'lines.linewidth': 2.5})
5962
g = sns.FacetGrid(df_runs, row='variable', sharey='row', height=4, aspect=3)
60-
g = g.map(sns.barplot, 'etude_dossier', 'value', 'exe_id', order=ETATREF_SCENARIO_PAR_AMENAGEMENT.keys(),
61-
hue_order=CRUE10_EXE.keys(), palette="husl", errorbar=None)
63+
g = g.map(sns.barplot, 'etude_dossier', 'value', 'exe_id',
64+
# order=ETATREF_SCENARIO_PAR_AMENAGEMENT.keys(),
65+
# hue_order=CRUE10_EXE.keys(),
66+
palette="husl", errorbar=None)
6267

6368
# Sets xlabels and ylabels from titles
6469
for i, axes in enumerate(g.axes[:, :]):
@@ -83,7 +88,7 @@
8388
if PLOT_DIFF_BARPLOT:
8489
# Read data to plot
8590
df_diff_stat = pd.read_csv(OUT_CSV_DIFF_FILE, delimiter=CSV_DELIMITER)
86-
df_diff_stat = df_diff_stat[df_diff_stat['exe_id'] != CRUE10_EXE_REFERENCE]
91+
df_diff_stat = df_diff_stat[df_diff_stat['exe_id'] != COEUR_REFERENCE]
8792

8893
# Build a FacetGrid object with barplots
8994
g = sns.FacetGrid(df_diff_stat, row='variable', sharey='row', height=4, aspect=3)
@@ -128,6 +133,5 @@
128133
fig.savefig(csv_path.replace('.csv', '.png'))
129134
plt.close()
130135

131-
132136
t2 = time()
133137
logger.info("=> Temps d'exécution = {}s".format(t2 - t1))

0 commit comments

Comments
 (0)