scilens 0.5.2__py3-none-any.whl → 0.5.4__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.
@@ -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(A,test_vector,reference_vector,group,info_vector=_A):
34
- R='ignore';M=info_vector;L='RIAE_trapezoid';H=group;F=reference_vector;B=test_vector
35
- if len(B)!=len(F):raise Exception('Vectors have different lengths')
36
- N=0;G=_B;E=A.thresholds.vectors.ponderation_method if A.thresholds.vectors else _A
37
- if E=='RIAE':E=L
38
- if E:logging.debug(f"Using ponderation method: {E} with reduction_method {A.thresholds.vectors.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 A.thresholds.vectors and E in[L,'RIAE_midpoint']:
43
- K=CheckVectors.relative_integral_absolute_error_trapezoid(F,B,range(len(B)))if E==L else CheckVectors.relative_integral_absolute_error_midpoint(F,B,range(len(B)))
44
- if K is _A:logging.warning('RIAE calculation returned None. This may indicate an issue with the vectors.')
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
- J=A.thresholds.vectors.reduction_method
47
- if K>A.thresholds.vectors.riae_threshold:T=CompareFloatsErr(is_relative=_B,value=K);D=Compare2ValuesResults(SEVERITY_ERROR,f"RIAE ({E}) > {A.thresholds.vectors.riae_threshold}",T);G=A.compare_errors.add(H,D)
48
- U=len(B)
49
- for C in range(U):
50
- if B[C]is _A and F[C]is _A:continue
51
- P=B[C]-F[C]
52
- if P==0:continue
53
- else:N+=1;H.incr(_C)
54
- if G:continue
55
- if J==R:continue
56
- if I is not _A and abs(P)<I:
57
- if O==R:continue
58
- elif O=='soften':
59
- D=A.compare_2_values(B[C],F[C])
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=A.compare_2_values(B[C],F[C])
63
- if D and J:D.severity=SEVERITY_WARNING
62
+ D=G.compare_2_values(A[C],F[C])
63
+ if D and K:D.severity=SEVERITY_WARNING
64
64
  if D:
65
- Q={'index':C}
66
- if M:Q['info']=M[C]
67
- G=A.compare_errors.add(H,D,info=Q)
68
- return G,N
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
@@ -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.')
@@ -69,21 +69,24 @@ 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
- O='Errors limit reached';F=reader_ref;D=group;C=cols_curve;A=reader_test;logging.debug(f"compare cols: {D.name}")
73
- if len(A.numeric_col_indexes)!=len(F.numeric_col_indexes):D.error=f"Number Float columns indexes are different: {len(A.numeric_col_indexes)} != {len(F.numeric_col_indexes)}";return
74
- E=[''for A in range(A.cols_count)];I=_A;G=_A
75
- if C and C.type==ReaderCurveParserNameConfig.COL_X:J=C.info[_D];I=A.data[J];G=A.names[J]
76
- K=False
72
+ R='Errors limit reached';F=reader_ref;E=compare_floats;D=cols_curve;C=group;A=reader_test;logging.debug(f"compare cols: {C.name}")
73
+ if F.names!=A.names:C.error=f"Columns of datasets are different : {F.names} {A.names}";return
74
+ if len(A.numeric_col_indexes)!=len(F.numeric_col_indexes):C.error=f"Number Float columns indexes are different: {len(A.numeric_col_indexes)} != {len(F.numeric_col_indexes)}";return
75
+ G=[''for A in range(A.cols_count)];K=_A;H=_A
76
+ if D and D.type==ReaderCurveParserNameConfig.COL_X:L=D.info[_D];K=A.data[L];H=A.names[L]
77
+ M=False
77
78
  for B in range(A.cols_count):
78
79
  if B not in A.numeric_col_indexes:continue
79
- P=A.data[B];Q=F.data[B];logging.debug(f"compare cols: {A.names[B]}");L,R,T=compare_floats.add_group_and_compare_vectors(A.names[B],D,{'info_prefix':G}if G else _A,P,Q,info_vector=I)
80
- if R:K=True;E[B]=O;continue
81
- if L.total_errors>0:E[B]=f"{L.total_errors} comparison errors"
82
- if C:
83
- for M in C.curves[_E]:
84
- N=0
85
- for S in M[_B]:
86
- H=C.curves[_B][S]
87
- if E[H[_C]]:H['comparison_error']=E[H[_C]];N+=1
88
- M['comparison']={'curves_nb_with_error':N}
89
- D.error=O if K else _A;D.info={'cols_has_error':E}
80
+ S=A.data[B];T=F.data[B];I=A.names[B];logging.debug(f"compare vector colum: {I}");N=E.thresholds.vectors
81
+ if E.thresholds.vectors_columns and I in E.thresholds.vectors_columns:N=E.thresholds.vectors_columns[I]
82
+ O,U,W=E.add_group_and_compare_vectors(A.names[B],C,{'info_prefix':H}if H else _A,N,S,T,info_vector=K)
83
+ if U:M=True;G[B]=R;continue
84
+ if O.total_errors>0:G[B]=f"{O.total_errors} comparison errors"
85
+ if D:
86
+ for P in D.curves[_E]:
87
+ Q=0
88
+ for V in P[_B]:
89
+ J=D.curves[_B][V]
90
+ if G[J[_C]]:J['comparison_error']=G[J[_C]];Q+=1
91
+ P['comparison']={'curves_nb_with_error':Q}
92
+ C.error=R if M else _A;C.info={'cols_has_error':G}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scilens
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: A CesGensLaB framework for data collecting and deep analysis
5
5
  Home-page: https://scilens.dev
6
6
  License: Proprietary
@@ -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=g6tD8QodXdz3kcgMW1-ccZp6A4bFia3xll8mPQ0rlg8,4685
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=lTpDxeSVAGOJtH9MFg25yh0vwwf3VdMFlhdbrhgkk6o,776
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=AvGJEsmYLRlvM766Z9IxfmBqXiHxVXFYnIJoU39xQgI,2398
27
- scilens/config/models/compare_float_thresholds.py,sha256=4l-AMfzpOUnBYU9hsSFAmIL-B6OyfQeVnsiAhRZSYsQ,2153
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=Gqb_uE3bUOJKBs3LpEWghhT6bBB0I0BIKT0mUQCDpf4,4084
54
+ scilens/readers/cols_dataset.py,sha256=KC0EEJaVlMjXH7H7irgWa80tcKcGXsmZSrQVdjtNcGE,4328
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.2.dist-info/METADATA,sha256=LivGLk121VECrhRXLow1b07GIeE1yHgySBIj4lyYhZU,1405
126
- scilens-0.5.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
127
- scilens-0.5.2.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
128
- scilens-0.5.2.dist-info/RECORD,,
125
+ scilens-0.5.4.dist-info/METADATA,sha256=fEncH81h03c7n54j7NjsLy8ujvqsEWFxXrZBXyeuNz4,1405
126
+ scilens-0.5.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
127
+ scilens-0.5.4.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
128
+ scilens-0.5.4.dist-info/RECORD,,