scilens 0.5.2__py3-none-any.whl → 0.5.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scilens/components/compare_floats.py +33 -33
- scilens/config/models/__init__.py +1 -1
- scilens/config/models/compare.py +1 -1
- scilens/config/models/compare_float_thresholds.py +1 -1
- scilens/readers/cols_dataset.py +17 -15
- {scilens-0.5.2.dist-info → scilens-0.5.3.dist-info}/METADATA +1 -1
- {scilens-0.5.2.dist-info → scilens-0.5.3.dist-info}/RECORD +9 -9
- {scilens-0.5.2.dist-info → scilens-0.5.3.dist-info}/WHEEL +0 -0
- {scilens-0.5.2.dist-info → scilens-0.5.3.dist-info}/entry_points.txt +0 -0
|
@@ -5,7 +5,7 @@ _A=None
|
|
|
5
5
|
import logging
|
|
6
6
|
from scilens.components.compare_models import SEVERITY_ERROR,SEVERITY_WARNING,CompareGroup,CompareFloatsErr,Compare2ValuesResults
|
|
7
7
|
from scilens.components.compare_errors import CompareErrors
|
|
8
|
-
from scilens.config.models import CompareFloatThresholdsConfig
|
|
8
|
+
from scilens.config.models import CompareFloatThresholdsConfig,CompareFloatVectorsConfig
|
|
9
9
|
from scilens.components.num import vectors as CheckVectors
|
|
10
10
|
def vector_get_amplitude(vector):A=vector;B=min(A);C=max(A);return{'min':B,'max':C,_D:abs(C-B)}
|
|
11
11
|
class CompareFloats:
|
|
@@ -30,43 +30,43 @@ class CompareFloats:
|
|
|
30
30
|
if H:B=D.compare_errors.add(F,H,info={'key':C});G+=1;F.incr(_C)
|
|
31
31
|
if B:break
|
|
32
32
|
return B,G
|
|
33
|
-
def compare_vectors(
|
|
34
|
-
|
|
35
|
-
if len(
|
|
36
|
-
|
|
37
|
-
if E=='RIAE':E=
|
|
38
|
-
if E:logging.debug(f"Using ponderation method: {E} with reduction_method {
|
|
39
|
-
I=_A
|
|
40
|
-
if A.thresholds.vectors and E=='amplitude_moderation':S=vector_get_amplitude(B)[_D];I=S*A.thresholds.vectors.amplitude_moderation_multiplier;O=A.thresholds.vectors.reduction_method
|
|
33
|
+
def compare_vectors(G,vectors_config,test_vector,reference_vector,group,info_vector=_A):
|
|
34
|
+
S='ignore';N=info_vector;M='RIAE_trapezoid';I=group;F=reference_vector;B=vectors_config;A=test_vector
|
|
35
|
+
if len(A)!=len(F):raise Exception('Vectors have different lengths')
|
|
36
|
+
O=0;H=_B;E=B.ponderation_method if B else _A
|
|
37
|
+
if E=='RIAE':E=M
|
|
38
|
+
if E:logging.debug(f"Using ponderation method: {E} with reduction_method {B.reduction_method}")
|
|
41
39
|
J=_A
|
|
42
|
-
if
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
if B and E=='amplitude_moderation':T=vector_get_amplitude(A)[_D];J=T*B.amplitude_moderation_multiplier;P=B.reduction_method
|
|
41
|
+
K=_A
|
|
42
|
+
if B and E in[M,'RIAE_midpoint']:
|
|
43
|
+
L=CheckVectors.relative_integral_absolute_error_trapezoid(F,A,range(len(A)))if E==M else CheckVectors.relative_integral_absolute_error_midpoint(F,A,range(len(A)))
|
|
44
|
+
if L is _A:logging.warning('RIAE calculation returned None. This may indicate an issue with the vectors.')
|
|
45
45
|
else:
|
|
46
|
-
|
|
47
|
-
if
|
|
48
|
-
|
|
49
|
-
for C in range(
|
|
50
|
-
if
|
|
51
|
-
|
|
52
|
-
if
|
|
53
|
-
else:
|
|
54
|
-
if
|
|
55
|
-
if
|
|
56
|
-
if
|
|
57
|
-
if
|
|
58
|
-
elif
|
|
59
|
-
D=
|
|
46
|
+
K=B.reduction_method
|
|
47
|
+
if L>B.riae_threshold:U=CompareFloatsErr(is_relative=_B,value=L);D=Compare2ValuesResults(SEVERITY_ERROR,f"RIAE ({E}) > {B.riae_threshold}",U);H=G.compare_errors.add(I,D)
|
|
48
|
+
V=len(A)
|
|
49
|
+
for C in range(V):
|
|
50
|
+
if A[C]is _A and F[C]is _A:continue
|
|
51
|
+
Q=A[C]-F[C]
|
|
52
|
+
if Q==0:continue
|
|
53
|
+
else:O+=1;I.incr(_C)
|
|
54
|
+
if H:continue
|
|
55
|
+
if K==S:continue
|
|
56
|
+
if J is not _A and abs(Q)<J:
|
|
57
|
+
if P==S:continue
|
|
58
|
+
elif P=='soften':
|
|
59
|
+
D=G.compare_2_values(A[C],F[C])
|
|
60
60
|
if D:D.severity=SEVERITY_WARNING
|
|
61
61
|
else:
|
|
62
|
-
D=
|
|
63
|
-
if D and
|
|
62
|
+
D=G.compare_2_values(A[C],F[C])
|
|
63
|
+
if D and K:D.severity=SEVERITY_WARNING
|
|
64
64
|
if D:
|
|
65
|
-
|
|
66
|
-
if
|
|
67
|
-
G
|
|
68
|
-
return
|
|
69
|
-
def add_group_and_compare_vectors(A,group_name,parent_group,group_data,test_vector,reference_vector,info_vector=_A):C,B=A.compare_errors.add_group('vectors',group_name,parent=parent_group,data=group_data);return(B,)+A.compare_vectors(test_vector,reference_vector,B,info_vector=info_vector)
|
|
65
|
+
R={'index':C}
|
|
66
|
+
if N:R['info']=N[C]
|
|
67
|
+
H=G.compare_errors.add(I,D,info=R)
|
|
68
|
+
return H,O
|
|
69
|
+
def add_group_and_compare_vectors(A,group_name,parent_group,group_data,vectors_config,test_vector,reference_vector,info_vector=_A):C,B=A.compare_errors.add_group('vectors',group_name,parent=parent_group,data=group_data);return(B,)+A.compare_vectors(vectors_config,test_vector,reference_vector,B,info_vector=info_vector)
|
|
70
70
|
def compare_matrices(H,test_mat,ref_mat,group,x_vector=_A,y_vector=_A):
|
|
71
71
|
K=y_vector;J=x_vector;I=group;D=ref_mat;C=test_mat;L=0;E=_B;F=len(C);M=len(C[0])if F>0 else 0;N=len(D);P=len(D[0])if N>0 else 0
|
|
72
72
|
if F!=N or M!=P:raise Exception('Matrices have different dimensions')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from.app import AppConfig
|
|
2
2
|
from.compare import CompareConfig
|
|
3
|
-
from.compare_float_thresholds import CompareFloatThresholdsConfig
|
|
3
|
+
from.compare_float_thresholds import CompareFloatThresholdsConfig,CompareFloatVectorsConfig
|
|
4
4
|
from.execute_and_compare import ExecuteAndCompareConfig
|
|
5
5
|
from.execute import ExecuteConfig
|
|
6
6
|
from.reader_format_txt import ReaderTxtIgnoreConfig,ReaderTxtConfig
|
scilens/config/models/compare.py
CHANGED
|
@@ -3,4 +3,4 @@ _A=None
|
|
|
3
3
|
from pydantic import BaseModel,Field
|
|
4
4
|
from scilens.config.models.compare_float_thresholds import CompareFloatThresholdsConfig
|
|
5
5
|
class CompareSourceFoldersConfig(BaseModel,extra=_B):not_matching_source_ignore_pattern:str|_A=Field(default=_A,description="Ignore les fichiers de test et de référence qui ne correspondent pas selon l'expression régulière défini (si = `*` ignore tout).");recursive:bool=Field(default=False,description='Recherche récursive dans les répertoires de test et de référence.');additional_path_suffixes:list[str]|_A=Field(default=_A,description='Additionals paths to add after test and reference folders.');test_folder_relative_path:str=Field(default='test',description='Relative path to the working directory for the test folder.');reference_folder_relative_path:str=Field(default='reference',description='Relative path to the working directory for the reference folder.');test_filename_match_ignore:str|_A=Field(default=_A,description='Chaîne spécifique dans le nom de fichier test à ignorer pour matcher les noms. Ex : `.test` or `test_`');reference_filename_match_ignore:str|_A=Field(default=_A,description='Chaîne spécifique dans le nom de fichier référence à ignorer pour matcher les noms. Ex : `.ref` or `ref_`')
|
|
6
|
-
class CompareConfig(BaseModel,extra=_B):sources:CompareSourceFoldersConfig=Field(default=CompareSourceFoldersConfig(),description='Configuration pour les sources des données de test et de référence.');float_thresholds:CompareFloatThresholdsConfig=Field(default=CompareFloatThresholdsConfig(),description='Seuils de comparaison pour les valeurs flottantes.');ignore_warnings:bool=Field(default=False,description='Si `true`, ne lève pas les erreurs de sévérité `warning`.');errors_limit:int=Field(default=1000,description="Limite d'erreurs à atteindre avant de s'arrêter (Sévérité `warning` et `error`).");metrics_compare:bool=Field(default=True,description='Si `true`, compare les métriques entre les données de test et de référence.');metrics_thresholds:CompareFloatThresholdsConfig|_A=Field(default=_A,description='Seuils de comparaison pour les métriques.');name_patterns_thresholds:dict[str,CompareFloatThresholdsConfig]|_A=Field(default=_A,description='Mapping de patterns des datasets (Unix shell-style wildcards) (ex: data*.csv) et seuils de comparaison pour les comparaison de valeurs flottantes ')
|
|
6
|
+
class CompareConfig(BaseModel,extra=_B):sources:CompareSourceFoldersConfig=Field(default=CompareSourceFoldersConfig(),description='Configuration pour les sources des données de test et de référence.');float_thresholds:CompareFloatThresholdsConfig=Field(default=CompareFloatThresholdsConfig(),description='Seuils de comparaison pour les valeurs flottantes.');ignore_warnings:bool=Field(default=False,description='Si `true`, ne lève pas les erreurs de sévérité `warning`.');errors_limit:int=Field(default=1000,description="Limite d'erreurs à atteindre avant de s'arrêter (Sévérité `warning` et `error`).");metrics_compare:bool=Field(default=True,description='Si `true`, compare les métriques entre les données de test et de référence.');metrics_thresholds:CompareFloatThresholdsConfig|_A=Field(default=_A,description='Seuils de comparaison pour les métriques.');name_patterns_thresholds:dict[str,CompareFloatThresholdsConfig]|_A=Field(default=_A,description='Mapping de patterns sur les noms des datasets (Unix shell-style wildcards) (ex: data*.csv) et seuils de comparaison pour les comparaison de valeurs flottantes ')
|
|
@@ -8,4 +8,4 @@ class CompareFloatVectorsConfig(BaseModel,extra=_B):
|
|
|
8
8
|
A=self
|
|
9
9
|
if A.ponderation_method.startswith('RIAE')and not A.riae_threshold:raise ValueError('riae_threshold is required when ponderation_method is "RIAE"')
|
|
10
10
|
return A
|
|
11
|
-
class CompareFloatThresholdsConfig(BaseModel,extra=_B):relative_vs_absolute_min:float=Field(default=1e-12,description="Si la valeur de test est inférieure à ce seuil, calcul de l'erreur absolue.");relative_error_min:float=Field(default=.001,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `warning`.");relative_error_max:float=Field(default=.01,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `error`.");absolute_error_min:float=Field(default=1e-07,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `warning`.");absolute_error_max:float=Field(default=1e-06,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `error`.");vectors:CompareFloatVectorsConfig|_A=Field(default=_A,description='Paramètres pour la comparaison de vecteurs de flottants (csv, nc, ...).')
|
|
11
|
+
class CompareFloatThresholdsConfig(BaseModel,extra=_B):relative_vs_absolute_min:float=Field(default=1e-12,description="Si la valeur de test est inférieure à ce seuil, calcul de l'erreur absolue.");relative_error_min:float=Field(default=.001,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `warning`.");relative_error_max:float=Field(default=.01,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `error`.");absolute_error_min:float=Field(default=1e-07,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `warning`.");absolute_error_max:float=Field(default=1e-06,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `error`.");vectors:CompareFloatVectorsConfig|_A=Field(default=_A,description='Paramètres pour la comparaison de vecteurs de flottants (csv, nc, ...).');vectors_columns:dict[str,CompareFloatVectorsConfig|_A]|_A=Field(default=_A,description='Mapping de Colonne => Paramètres (ou `null`) pour la comparaison de vecteurs de flottants.')
|
scilens/readers/cols_dataset.py
CHANGED
|
@@ -69,21 +69,23 @@ class ColsDataset:
|
|
|
69
69
|
@dataclass
|
|
70
70
|
class ColsCurves:type:str;info:dict;curves:dict
|
|
71
71
|
def compare(group,compare_floats,reader_test,reader_ref,cols_curve):
|
|
72
|
-
|
|
73
|
-
if len(A.numeric_col_indexes)!=len(
|
|
74
|
-
|
|
75
|
-
if C and C.type==ReaderCurveParserNameConfig.COL_X:
|
|
76
|
-
|
|
72
|
+
R='Errors limit reached';G=reader_ref;E=compare_floats;D=group;C=cols_curve;A=reader_test;logging.debug(f"compare cols: {D.name}")
|
|
73
|
+
if len(A.numeric_col_indexes)!=len(G.numeric_col_indexes):D.error=f"Number Float columns indexes are different: {len(A.numeric_col_indexes)} != {len(G.numeric_col_indexes)}";return
|
|
74
|
+
F=[''for A in range(A.cols_count)];K=_A;H=_A
|
|
75
|
+
if C and C.type==ReaderCurveParserNameConfig.COL_X:L=C.info[_D];K=A.data[L];H=A.names[L]
|
|
76
|
+
M=False
|
|
77
77
|
for B in range(A.cols_count):
|
|
78
78
|
if B not in A.numeric_col_indexes:continue
|
|
79
|
-
|
|
80
|
-
if
|
|
81
|
-
|
|
79
|
+
S=A.data[B];T=G.data[B];I=A.names[B];logging.debug(f"compare vector colum: {I}");N=E.thresholds.vectors
|
|
80
|
+
if E.thresholds.vectors_columns and I in E.thresholds.vectors_columns:N=E.thresholds.vectors_columns[I]
|
|
81
|
+
O,U,W=E.add_group_and_compare_vectors(A.names[B],D,{'info_prefix':H}if H else _A,N,S,T,info_vector=K)
|
|
82
|
+
if U:M=True;F[B]=R;continue
|
|
83
|
+
if O.total_errors>0:F[B]=f"{O.total_errors} comparison errors"
|
|
82
84
|
if C:
|
|
83
|
-
for
|
|
84
|
-
|
|
85
|
-
for
|
|
86
|
-
|
|
87
|
-
if
|
|
88
|
-
|
|
89
|
-
D.error=
|
|
85
|
+
for P in C.curves[_E]:
|
|
86
|
+
Q=0
|
|
87
|
+
for V in P[_B]:
|
|
88
|
+
J=C.curves[_B][V]
|
|
89
|
+
if F[J[_C]]:J['comparison_error']=F[J[_C]];Q+=1
|
|
90
|
+
P['comparison']={'curves_nb_with_error':Q}
|
|
91
|
+
D.error=R if M else _A;D.info={'cols_has_error':F}
|
|
@@ -10,7 +10,7 @@ scilens/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
10
10
|
scilens/components/analyse_folder.py,sha256=yqc-dscKaHLZJCYeXGak2v0c3F2aeX0E11AFPfya6r0,208
|
|
11
11
|
scilens/components/compare_2_files.py,sha256=hpLvlsDeifeZ0SbYBLSFpelLc9nQ02LMaYjxkg6dDPw,2417
|
|
12
12
|
scilens/components/compare_errors.py,sha256=vGb4DWP89HMIeBm0dZU2nt-ksppAs_37xtCHaPd0w5Y,1640
|
|
13
|
-
scilens/components/compare_floats.py,sha256=
|
|
13
|
+
scilens/components/compare_floats.py,sha256=w8zY8BJIxtg9zbPwNx4MqEB2jYrN9q_--r8AObA9zNA,4583
|
|
14
14
|
scilens/components/compare_folders.py,sha256=s7cgo2JhZi8F7tt3lGbPhkaO2726Lz3c4LYGP2HbWtA,2773
|
|
15
15
|
scilens/components/compare_models.py,sha256=EvxBZ1hPhqViCiTx7pfVIcwllkHjCjuc0mNEVa0Yqw0,941
|
|
16
16
|
scilens/components/executor.py,sha256=PLeKolzPd4wPX8e6DdfOb0uHGky3DxTcKN9QtB6oe3Q,3712
|
|
@@ -20,11 +20,11 @@ scilens/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
20
20
|
scilens/config/cli_run_options.py,sha256=Ls7yK5QDUPFbk73nbjGuPvuRbBRYw4Miag5ISpu3prg,281
|
|
21
21
|
scilens/config/env_var.py,sha256=NqNBoIfngJEXaGEm7jGqre5pmkJ9eUjiWzbDrTVfi2c,292
|
|
22
22
|
scilens/config/load.py,sha256=ltcv90GlsMJR2FE2ZL_jDscL7k5aGoHoMatWw61lrTw,1672
|
|
23
|
-
scilens/config/models/__init__.py,sha256=
|
|
23
|
+
scilens/config/models/__init__.py,sha256=JZ8fVq6A0EaPz24gKYdtaNZMD2OmhsgblRHvB2tcwiA,802
|
|
24
24
|
scilens/config/models/app.py,sha256=UCC7Be6gOwvxQpM5Wl1HIf2Xb61CmslFzXvj_50eqsQ,1558
|
|
25
25
|
scilens/config/models/base.py,sha256=k92CR8TA5L8dZJtg28c8albk16AK9-3umdosA7aYsxw,499
|
|
26
|
-
scilens/config/models/compare.py,sha256=
|
|
27
|
-
scilens/config/models/compare_float_thresholds.py,sha256=
|
|
26
|
+
scilens/config/models/compare.py,sha256=HmEmw9b0F_xo4D_Y3nC0t2oeKh9wSLJX8bxg23aFX58,2411
|
|
27
|
+
scilens/config/models/compare_float_thresholds.py,sha256=x7UHmwnSXpq1c4IBbMB7HQdEAzrJ_NmtNRSiMxNAD5c,2335
|
|
28
28
|
scilens/config/models/execute.py,sha256=yF_q8swd4-s2KyT_RwtSzOW41AY5GiEZaLhGUGJBU0Y,2340
|
|
29
29
|
scilens/config/models/execute_and_compare.py,sha256=aIWF1NIgdq5USS9ZVWOKgpEyMagCvqYYWYSXWvBBgjg,597
|
|
30
30
|
scilens/config/models/file_reader.py,sha256=uQrrwJZLlhgrEvEcYBAZijWtS01ob66fhtP_ipknAMo,1925
|
|
@@ -51,7 +51,7 @@ scilens/processors/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
51
51
|
scilens/processors/models/results.py,sha256=KoWxh13Zgi7PuPql8hkf4VjCis42ZxAuzIgJxBWVaX8,119
|
|
52
52
|
scilens/processors/processor_interface.py,sha256=jzMp1529JXnMGTJijVy6b_1zmARAMNv70f2lgys7vn4,452
|
|
53
53
|
scilens/readers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
54
|
-
scilens/readers/cols_dataset.py,sha256=
|
|
54
|
+
scilens/readers/cols_dataset.py,sha256=6F39F7ZjfyTl-Vh57ZLiyHPVMIPPiNdZQ3_KKw1QGpE,4233
|
|
55
55
|
scilens/readers/exceptions.py,sha256=JzmxcjnR5sH-IOWVeCC5A1bSwxv-jCAtIJvDjzx1CTI,32
|
|
56
56
|
scilens/readers/mat_dataset.py,sha256=Z9TYDWaH2aqdniLNDjlpR6VVNHMSARjh52clhdMyOn4,1496
|
|
57
57
|
scilens/readers/reader_csv.py,sha256=ISEjLjMFcRziryZTYyH-Jg4vOtgPVwAH1kgfEQBHVAA,5619
|
|
@@ -122,7 +122,7 @@ scilens/utils/time_tracker.py,sha256=DdVBoMpVLXrX0qZZXyLm4g38EwDVLlRcBqcpNex1mYY
|
|
|
122
122
|
scilens/utils/vectors.py,sha256=4N2BZSC5n3HgZqPujDGF5NdjVmSL1rOHb_qw4OoABQY,103
|
|
123
123
|
scilens/utils/web.py,sha256=MAFWpIFOKz7QhqDoFh-Qwstvc76KpcxstSgHFT8FOL4,901
|
|
124
124
|
scilens/utils/xml.py,sha256=HcB-ymJy8o4lsczHpXznGrbYahq_3cnnkPOdRfWdHfg,461
|
|
125
|
-
scilens-0.5.
|
|
126
|
-
scilens-0.5.
|
|
127
|
-
scilens-0.5.
|
|
128
|
-
scilens-0.5.
|
|
125
|
+
scilens-0.5.3.dist-info/METADATA,sha256=o7eu816V4IYfq-KJH6Z8kj1JQ_NfLGlCVvQ0xBCt5PA,1405
|
|
126
|
+
scilens-0.5.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
127
|
+
scilens-0.5.3.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
|
|
128
|
+
scilens-0.5.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|