scilens 0.3.4__py3-none-any.whl → 0.3.5__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.
@@ -1,4 +1,4 @@
1
- import os
1
+ import os,re
2
2
  from scilens.run.task_context import TaskContext
3
3
  from scilens.readers.reader_interface import ReaderInterface
4
4
  from scilens.components.file_reader import FileReader
@@ -8,19 +8,25 @@ from scilens.components.compare_floats import CompareFloats
8
8
  class Compare2Files:
9
9
  def __init__(A,context):A.context=context
10
10
  def compare(B,path_test,path_ref):
11
- R='comparison_errors';Q='comparison';N='reader';L='error';K='ref';J='test';F='path';A={J:{},K:{},Q:None,R:None};D={J:{F:path_test},K:{F:path_ref}}
12
- for(M,G)in D.items():
13
- if not G.get(F)or not os.path.exists(G[F]):A[L]=f"file {M} does not exist";return A
14
- S=FileReader(B.context.working_dir,B.context.config.file_reader,B.context.config.readers,config_alternate_path=B.context.origin_working_dir)
15
- for(M,G)in D.items():D[M][N]=S.read(G[F])
16
- C=D[J][N];H=D[K][N]
17
- if not C or not H:A['skipped']=True;return A
18
- A[J]=C.info();A[K]=H.info()
19
- if C.read_error:A[L]=C.read_error;return A
20
- I=CompareErrors(B.context.config.compare.errors_limit,B.context.config.compare.ignore_warnings);T=CompareFloats(I,B.context.config.compare.float_thresholds);C.compare(T,H,param_is_ref=True);E=I.root_group;O={'total_diffs':E.total_diffs}
21
- if E.info:O.update(E.info)
22
- A[Q]=O;A[R]=I.get_data()
23
- if E.error:A[L]=E.error;return A
24
- C.close();H.close();P=len(I.errors[SEVERITY_ERROR])
25
- if P>0:U=f"{P} comparison errors";A[L]=U
11
+ W='comparison_errors';V='comparison';S=path_ref;R=path_test;Q='reader';P='skipped';N='error';M=True;L='ref';G='path';F='test';A={F:{},L:{},V:None,W:None};D={F:{G:R},L:{G:S}};O=B.context.config.compare.sources.not_matching_source_ignore_pattern
12
+ for(H,I)in D.items():
13
+ if not I.get(G)or not os.path.exists(I[G]):
14
+ if O:
15
+ if O=='*':A[P]=M;return A
16
+ else:
17
+ X=os.path.basename(S if H==F else R);Y=re.search(O,X)
18
+ if Y:A[P]=M;return A
19
+ A[N]=f"file {H} does not exist";return A
20
+ Z=FileReader(B.context.working_dir,B.context.config.file_reader,B.context.config.readers,config_alternate_path=B.context.origin_working_dir)
21
+ for(H,I)in D.items():D[H][Q]=Z.read(I[G])
22
+ C=D[F][Q];J=D[L][Q]
23
+ if not C or not J:A[P]=M;return A
24
+ A[F]=C.info();A[L]=J.info()
25
+ if C.read_error:A[N]=C.read_error;return A
26
+ K=CompareErrors(B.context.config.compare.errors_limit,B.context.config.compare.ignore_warnings);a=CompareFloats(K,B.context.config.compare.float_thresholds);C.compare(a,J,param_is_ref=M);E=K.root_group;T={'total_diffs':E.total_diffs}
27
+ if E.info:T.update(E.info)
28
+ A[V]=T;A[W]=K.get_data()
29
+ if E.error:A[N]=E.error;return A
30
+ C.close();J.close();U=len(K.errors[SEVERITY_ERROR])
31
+ if U>0:b=f"{U} comparison errors";A[N]=b
26
32
  return A
@@ -1,5 +1,5 @@
1
1
  _A=None
2
2
  from pydantic import BaseModel,Field
3
3
  from scilens.config.models.compare_float_thresholds import CompareFloatThresholdsConfig
4
- class CompareSourceFoldersConfig(BaseModel):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.');additional_path_suffix:str=Field(default='',description='Additional path to add after test and reference folders.');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_`');recursive:bool=Field(default=False,description='Recherche récursive dans les répertoires de test et de référence.')
4
+ class CompareSourceFoldersConfig(BaseModel):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.');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.');additional_path_suffix:str=Field(default='',description='Additional path to add after test and reference folders.');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_`')
5
5
  class CompareConfig(BaseModel):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='Seuil 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`).")
@@ -1,5 +1,6 @@
1
+ _B=False
1
2
  _A=None
2
3
  from pydantic import BaseModel,Field
3
4
  from scilens.config.models.reader_format_cols_curve import ReaderColsCurveParserConfig
4
- class ReaderCsvMatrixConfig(BaseModel):x_value_line:int|_A=Field(default=_A,description="Indique la ligne des valeurs x si applicable. Peut être la ligne d'en-tête (=1).");has_y:bool=Field(default=False,description='Indique si la première colonne est ma colonne des valeurs y.')
5
- class ReaderCsvConfig(BaseModel):delimiter:str|_A=Field(default=',',description='Délimiteur de colonnes.');quotechar:str|_A=Field(default='"',description='Délimiteur de texte.');has_header:bool|_A=Field(default=_A,description="Indique si la 1ère ligne est une ligne d'en-tête. Si non spécifié, il y aura une détection automatique.");is_matrix:bool=Field(default=False,description='Indique si le fichier est une matrice.');ignore_columns:list[str]|_A=Field(default=_A,description='Liste des noms des colonnes à ignorer. (Valide seulement si la première ligne est une ligne en-têtes et non matrice)');curve_parser:ReaderColsCurveParserConfig|_A=Field(default=_A,description='Parseur de courbe à utiliser.');matrix:ReaderCsvMatrixConfig|_A=Field(default=_A,description='Configuration de la matrice. (Valide seulement si `is_matrix` est vrai)')
5
+ class ReaderCsvMatrixConfig(BaseModel):x_value_line:int|_A=Field(default=_A,description="Indique la ligne des valeurs x si applicable. Peut être la ligne d'en-tête (=1).");has_y:bool=Field(default=_B,description='Indique si la première colonne est la colonne des valeurs y.');display_spectrogram:bool=Field(default=_B,description='Indique si la matrice doit être affichée en mode spectrogramme.');display_frameseries:bool=Field(default=_B,description='Indique si la matrice doit être affichée en mode frameseries.')
6
+ class ReaderCsvConfig(BaseModel):delimiter:str|_A=Field(default=',',description='Délimiteur de colonnes.');quotechar:str|_A=Field(default='"',description='Délimiteur de texte.');has_header:bool|_A=Field(default=_A,description="Indique si la 1ère ligne est une ligne d'en-tête. Si non spécifié, il y aura une détection automatique.");is_matrix:bool=Field(default=_B,description='Indique si le fichier est une matrice.');ignore_columns:list[str]|_A=Field(default=_A,description='Liste des noms des colonnes à ignorer. (Valide seulement si la première ligne est une ligne en-têtes et non matrice)');curve_parser:ReaderColsCurveParserConfig|_A=Field(default=_A,description='Parseur de courbe à utiliser.');matrix:ReaderCsvMatrixConfig|_A=Field(default=_A,description='Configuration de la matrice. (Valide seulement si `is_matrix` est vrai)')
@@ -1,5 +1,6 @@
1
+ _B=False
1
2
  _A=None
2
3
  from typing import Literal
3
4
  from pydantic import BaseModel,Field
4
5
  CurveParser=Literal['simple_1D','frameseries_2D']
5
- class ReaderNetcdfConfig(BaseModel):groups_depth:int|_A=Field(default=_A,description='Définit la profondeur de recherche des groupes. Si vide prendra tous les groupes.');units_attributes:list[str]|_A=Field(default=_A,description='Noms des attributs de variable qui spécifient les unités.');curve_parser:CurveParser|_A=Field(default=_A,description='Parser de courbes: `simple_1D` or `frameseries_2D`.');curve_x_variable:str|_A=Field(default=_A,description='Nom de variable pour les axes X (`simple_1D` et `frameseries_2D`).');curve_step_variable:str|_A=Field(default=_A,description='Nom de variable `Step` (`1D`) (seulement pour `frameseries_2D`).');compare_1D:bool=Field(default=False,description='Pour les processeurs qui comparent, compare les variables vecteurs (`1D`).');compare_2D:bool=Field(default=False,description='Pour les processeurs qui comparent, compare les variables matrices (`2D`).')
6
+ class ReaderNetcdfConfig(BaseModel):groups_depth:int|_A=Field(default=_A,description='Définit la profondeur de recherche des groupes. Si vide prendra tous les groupes.');units_attributes:list[str]|_A=Field(default=_A,description='Noms des attributs de variable qui spécifient les unités.');curve_parser:CurveParser|_A=Field(default=_A,description='Parser de courbes: `simple_1D` or `frameseries_2D`.');matrices_display_spectrogram:bool=Field(default=_B,description='Parseur de courbes les variables matricielles (`2D`).');curve_x_variable:str|_A=Field(default=_A,description='Nom de variable (`1D`) pour les axes X (tout parseur).');curve_y_variable:str|_A=Field(default=_A,description='Nom de variable (`1D`) pour les axes Y (`curve_parser_frameseries`).');curve_step_variable:str|_A=Field(default=_A,description='Nom de variable `Step` (`1D`) (`curve_parser_frameseries`).');compare_1D:bool=Field(default=_B,description='Pour les processeurs qui comparent, compare les variables vecteurs (`1D`).');compare_2D:bool=Field(default=_B,description='Pour les processeurs qui comparent, compare les variables matrices (`2D`).')
@@ -1,12 +1,13 @@
1
+ _B=False
1
2
  _A=None
2
3
  import csv
3
4
  from collections.abc import Iterator
4
- from dataclasses import dataclass,field
5
+ from dataclasses import dataclass,field,asdict
5
6
  from scilens.components.compare_models import CompareGroup
6
7
  from scilens.components.compare_floats import CompareFloats
7
8
  @dataclass
8
9
  class MatDataset:nb_lines:int=0;nb_columns:int=0;data:list[list[float]]=field(default_factory=lambda:[]);x_values:list[float]|_A=_A;y_values:list[float]|_A=_A
9
- def from_reader(reader,x_value_line=_A,has_header=False,has_y=False):
10
+ def from_reader(reader,x_value_line=_A,has_header=_B,has_y=_B):
10
11
  E=has_y;D=x_value_line;B=reader;H=_A;I=[]if E else _A;A=[];F=0
11
12
  if D:
12
13
  J=1 if E else 0
@@ -19,4 +20,13 @@ def from_reader(reader,x_value_line=_A,has_header=False,has_y=False):
19
20
  else:
20
21
  for C in B:G=[float(A)for A in C];A.append(G)
21
22
  return MatDataset(nb_lines=len(A),nb_columns=len(A[0])if len(A)>0 else 0,data=A,x_values=H,y_values=I)
22
- def compare(parent_group,compare_floats,test,ref,group_name=''):B=parent_group;A=test;D,C,E=compare_floats.add_group_and_compare_matrices(group_name,B,group_data=_A,test_mat=A.data,ref_mat=ref.data,x_vector=A.x_values,y_vector=A.y_values);B.error='Errors limit reached'if C else _A
23
+ def compare(parent_group,compare_floats,test,ref,group_name=''):B=parent_group;A=test;D,C,E=compare_floats.add_group_and_compare_matrices(group_name,B,group_data=_A,test_mat=A.data,ref_mat=ref.data,x_vector=A.x_values,y_vector=A.y_values);B.error='Errors limit reached'if C else _A
24
+ def get_data(datasets,names,display_spectrograms=_B,display_frameseries=_B,frameseries_steps_data=_A,frameseries_steps_name=_A):
25
+ F='frameseries';E='display';D=frameseries_steps_data;C=names;B=datasets
26
+ if len(B)!=len(C):raise ValueError('Datasets and names must have the same length')
27
+ A={'datasets':[asdict(A)for A in B],'names':C}
28
+ if display_spectrograms:A['spectrograms']={E:1}
29
+ if display_frameseries:
30
+ A[F]={E:1}
31
+ if D:A[F]['steps']={'name':frameseries_steps_name,'data':D}
32
+ return A
@@ -2,7 +2,7 @@ _A=None
2
2
  import logging,csv
3
3
  from scilens.readers.reader_interface import ReaderInterface
4
4
  from scilens.readers.cols_dataset import ColsDataset,ColsCurves,cols_dataset_get_curves_col_x,compare as cols_compare
5
- from scilens.readers.mat_dataset import MatDataset,from_reader as mat_from_reader,compare as mat_compare
5
+ from scilens.readers.mat_dataset import MatDataset,from_reader as mat_from_reader,compare as mat_compare,get_data
6
6
  from scilens.config.models.reader_format_csv import ReaderCsvConfig,ReaderCsvMatrixConfig
7
7
  from scilens.config.models.reader_format_cols_curve import ReaderCurveParserNameConfig
8
8
  from scilens.components.compare_models import CompareGroup
@@ -20,20 +20,23 @@ def csv_detect(path,delimiter,quotechar,encoding):
20
20
  class ReaderCsv(ReaderInterface):
21
21
  configuration_type_code='csv';category='datalines';extensions=['CSV']
22
22
  def read(A,reader_options):
23
- B=reader_options;A.reader_options=B;A.raw_lines_number=_A;A.curves=_A;D,E,M=csv_detect(A.origin.path,A.reader_options.delimiter,A.reader_options.quotechar,encoding=A.encoding);A.has_header=D;A.cols=E;A.numeric_col_indexes=M;H=open(A.origin.path,'r',encoding=A.encoding);I=csv.reader(H,delimiter=A.reader_options.delimiter,quotechar=A.reader_options.quotechar)
24
- if B.is_matrix:J=B.matrix or ReaderCsvMatrixConfig();N=mat_from_reader(I,has_header=D,x_value_line=J.x_value_line,has_y=J.has_y);A.mat_dataset=N
23
+ B=reader_options;A.reader_options=B;A.raw_lines_number=_A;A.curves=_A;A.report_matrices=_A;D,F,N=csv_detect(A.origin.path,A.reader_options.delimiter,A.reader_options.quotechar,encoding=A.encoding);A.has_header=D;A.cols=F;A.numeric_col_indexes=N;J=open(A.origin.path,'r',encoding=A.encoding);K=csv.reader(J,delimiter=A.reader_options.delimiter,quotechar=A.reader_options.quotechar)
24
+ if B.is_matrix:
25
+ E=B.matrix or ReaderCsvMatrixConfig();G=mat_from_reader(K,has_header=D,x_value_line=E.x_value_line,has_y=E.has_y)
26
+ if E.display_spectrogram or E.display_frameseries:A.report_matrices=get_data([G],['csv'],E.display_spectrogram,E.display_frameseries)
27
+ A.mat_dataset=G;A.raw_lines_number=G.nb_lines+(1 if D else 0)
25
28
  else:
26
29
  if B.ignore_columns:
27
30
  if not D:raise Exception('Ignore columns is not supported without header.')
28
31
  A.numeric_col_indexes=[C for C in A.numeric_col_indexes if A.cols[C]not in B.ignore_columns]
29
- K=len(E);C=ColsDataset(cols_count=K,names=E,numeric_col_indexes=A.numeric_col_indexes,data=[[]for A in range(K)]);F=0
30
- for O in I:
31
- F+=1
32
- if D and F==1:continue
33
- for(L,G)in enumerate(O):
34
- if L in C.numeric_col_indexes:G=float(G)
35
- C.data[L].append(G)
36
- C.origin_line_nb.append(F)
32
+ L=len(F);C=ColsDataset(cols_count=L,names=F,numeric_col_indexes=A.numeric_col_indexes,data=[[]for A in range(L)]);H=0
33
+ for O in K:
34
+ H+=1
35
+ if D and H==1:continue
36
+ for(M,I)in enumerate(O):
37
+ if M in C.numeric_col_indexes:I=float(I)
38
+ C.data[M].append(I)
39
+ C.origin_line_nb.append(H)
37
40
  C.rows_count=len(C.origin_line_nb);A.cols_dataset=C;A.raw_lines_number=C.rows_count+(1 if D else 0)
38
41
  if B.curve_parser:
39
42
  if B.curve_parser.name==ReaderCurveParserNameConfig.COL_X:
@@ -41,9 +44,9 @@ class ReaderCsv(ReaderInterface):
41
44
  if A.curves:A.cols_curve=ColsCurves(type=ReaderCurveParserNameConfig.COL_X,info=P,curves=A.curves)
42
45
  elif B.curve_parser.name==ReaderCurveParserNameConfig.COLS_COUPLE:raise NotImplementedError('cols_couple not implemented')
43
46
  else:raise Exception('Curve parser not supported.')
44
- H.close()
47
+ J.close()
45
48
  def compare(A,compare_floats,param_reader,param_is_ref=True):
46
49
  H='node';D=param_is_ref;C=param_reader;B=compare_floats;I=A.reader_options
47
50
  if I.is_matrix:E=A.mat_dataset if D else C.mat_dataset;F=A.mat_dataset if not D else C.mat_dataset;J,G=B.compare_errors.add_group(H,'csv matrix');mat_compare(G,B,E,F)
48
51
  else:E=A.cols_dataset if D else C.cols_dataset;F=A.cols_dataset if not D else C.cols_dataset;K=A.cols_curve if hasattr(A,'cols_curve')else _A;J,G=B.compare_errors.add_group(H,'csv cols');cols_compare(G,B,E,F,K)
49
- def class_info(A):return{'cols':A.cols,'raw_lines_number':A.raw_lines_number,'curves':A.curves}
52
+ def class_info(A):return{'cols':A.cols,'raw_lines_number':A.raw_lines_number,'curves':A.curves,'matrices':A.report_matrices}
@@ -1,20 +1,23 @@
1
1
  {% for file in data.files %}
2
+
3
+ {% set file_index = loop.index %}
4
+
2
5
  {% if not file.skipped %}
3
6
 
4
7
 
5
- <section id="section_{{ loop.index }}" style="display: none;">
8
+ <section id="section_{{ file_index }}" style="display: none;">
6
9
  <!-- TITLE -->
7
10
  <h2>
8
11
  {{ file.name }}
9
- <span class="{{ ns.statuses[loop.index] }}">{{ ns.statuses[loop.index] }}</span>
10
- <span style="font-size:0.9rem;color:#666;">(#{{ loop.index }})</span>
12
+ <span class="{{ ns.statuses[file_index] }}">{{ ns.statuses[file_index] }}</span>
13
+ <span style="font-size:0.9rem;color:#666;">(#{{ file_index }})</span>
11
14
  <!-- actions -->
12
- <action data-command="toogle" data-args="file_content_{{ loop.index|string }}"></action>
15
+ <action data-command="toogle" data-args="file_content_{{ file_index|string }}"></action>
13
16
  {% if file.test.origin and file.test.origin.path %}<action data-command="open_file" data-args="{{ file.test.origin.path.replace(meta.execution_dir, "") }}" data-label="Open Test"></action>{% endif %}
14
17
  {% if file.ref.origin and file.ref.origin.path %}<action data-command="open_file" data-args="{{ file.ref.origin.path.replace(meta.execution_dir, "") }}" data-label="Open Ref."></action>{% endif %}
15
18
  </h2>
16
19
  <!-- CONTENT -->
17
- <div id="file_content_{{ loop.index }}" style="{% if not file.error and meta.config.collapse_if_successful %} display:none;{% endif %}">
20
+ <div id="file_content_{{ file_index }}" style="{% if not file.error and meta.config.collapse_if_successful %} display:none;{% endif %}">
18
21
 
19
22
  <!--GENERAL ERROR-->
20
23
  {% if file.error %}
@@ -27,14 +30,14 @@
27
30
 
28
31
 
29
32
 
30
- <h3>Informations <action data-command="toogle" data-args="info_{{ (loop.index-1)|string }}"></action></h3>
31
- <div id="info_{{ loop.index-1 }}">
33
+ <h3>Informations <action data-command="toogle" data-args="info_{{ (file_index-1)|string }}"></action></h3>
34
+ <div id="info_{{ file_index-1 }}">
32
35
 
33
36
  <!--error_rule_patterns-->
34
37
  {% if file.test.read_data and file.test.read_data.error_rule_patterns %}
35
38
  <div>
36
- <h4>Error pattern<action data-command="toogle" data-args="info_error_pattern_{{ (loop.index-1)|string }}"></action></h4>
37
- <div id="info_error_pattern_{{ loop.index-1 }}">
39
+ <h4>Error pattern<action data-command="toogle" data-args="info_error_pattern_{{ (file_index-1)|string }}"></action></h4>
40
+ <div id="info_error_pattern_{{ file_index-1 }}">
38
41
  <table>
39
42
  <tr>
40
43
  <th>Pattern</th>
@@ -54,8 +57,8 @@
54
57
  <!--ignore_lines-->
55
58
  {% if file.test.ignore_lines or file.ref.ignore_lines %}
56
59
  <div>
57
- <h4>Ignoring lines <action data-command="toogle" data-args="info_ignore_{{ (loop.index-1)|string }}"></action></h4>
58
- <div id="info_ignore_{{ loop.index-1 }}">
60
+ <h4>Ignoring lines <action data-command="toogle" data-args="info_ignore_{{ (file_index-1)|string }}"></action></h4>
61
+ <div id="info_ignore_{{ file_index-1 }}">
59
62
  <table>
60
63
  <tr>
61
64
  <th>File</th>
@@ -81,8 +84,8 @@
81
84
  {% endif %}
82
85
 
83
86
  {% if file.float_thresholds %}
84
- <h4>Float Thresholds <action data-command="toogle" data-args="info_thresholds_{{ (loop.index-1)|string }}"></action></h4>
85
- <div id="info_thresholds_{{ loop.index-1 }}">
87
+ <h4>Float Thresholds <action data-command="toogle" data-args="info_thresholds_{{ (file_index-1)|string }}"></action></h4>
88
+ <div id="info_thresholds_{{ file_index-1 }}">
86
89
  <table>
87
90
  <tr>
88
91
  <th>Variable</th>
@@ -105,14 +108,14 @@
105
108
 
106
109
  <!--CURVES-->
107
110
  {% if file.test.curves %}
108
- <h3>Curves <action data-command="toogle" data-args="curves_{{ (loop.index-1)|string }}"></action></h3>
109
- <div id="curves_{{ loop.index-1 }}"></div>
111
+ <h3>Curves <action data-command="toogle" data-args="curves_{{ (file_index-1)|string }}"></action></h3>
112
+ <div id="curves_{{ file_index-1 }}"></div>
110
113
  {% endif %}
111
114
 
112
115
  <!--ANIMATIONS-->
113
116
  {% if file.test.animations %}
114
- <h3>Animations <action data-command="toogle" data-args="animations_{{ loop.index|string }}"></action></h3>
115
- <div id="animations_{{ loop.index }}" ></div>
117
+ <h3>Animations <action data-command="toogle" data-args="animations_{{ file_index|string }}"></action></h3>
118
+ <div id="animations_{{ file_index }}" ></div>
116
119
  {% endif %}
117
120
 
118
121
  <!--img-->
@@ -126,14 +129,21 @@
126
129
 
127
130
  <!--FRAMESSERIES-->
128
131
  {% if file.test.framesseries %}
129
- <h3>Frames Series <action data-command="toogle" data-args="framesseries_{{ loop.index|string }}"></action></h3>
130
- <div id="framesseries_{{ loop.index }}" ></div>
132
+ <h3>Frames Series <action data-command="toogle" data-args="framesseries_{{ file_index|string }}"></action></h3>
133
+ <div id="framesseries_{{ file_index }}" ></div>
131
134
  {% endif %}
132
135
 
136
+ {% for item in [{"id": "spectrograms", "label": "Spectrograms"}, {"id": "frameseries", "label": "Frameseries"}] %}
137
+
138
+ <h3>{{ item.label }} <action data-command="toogle" data-args="{{ item.id }}_{{ file_index|string }}"></action></h3>
139
+ <div id="{{ item.id }}_{{ file_index }}" ></div>
140
+ {% endfor %}
141
+
142
+
133
143
  <!--COMPARISONS ERRORS AND WARNINGS-->
134
144
  {% if file.comparison_errors and (file.comparison_errors.error_nb or file.comparison_errors.warning_nb) %}
135
- <h3>Number Comparison Errors or Warnings <action data-command="toogle" data-args="numbers_errors_{{ loop.index|string }}"></action></h3>
136
- <div id="numbers_errors_{{ loop.index }}" >
145
+ <h3>Number Comparison Errors or Warnings <action data-command="toogle" data-args="numbers_errors_{{ file_index|string }}"></action></h3>
146
+ <div id="numbers_errors_{{ file_index }}" >
137
147
  {% with file=file %}
138
148
  {% include 'compare_13_section_numbers.html' %}
139
149
  {% endwith %}
@@ -8,9 +8,14 @@
8
8
  {{ content }}
9
9
  </button>
10
10
  {% endmacro %}
11
- {% set ns = namespace(statuses=['']) %}
11
+ {% set ns = namespace(statuses=[''], has_matrices=false, has_spectrograms=false, has_frameseries=false) %}
12
12
  {% for file in data.files %}
13
13
  {% set ns.statuses = ns.statuses + ['SKIPPED' if file.skipped else ('ERROR' if file.error else ('WARNING' if file.comparison_errors and file.comparison_errors.error_nb > 0 else 'SUCCESS'))] %}
14
+ {% if file.test.matrices %}
15
+ {% set ns.has_matrices = true %}
16
+ {% if file.test.matrices.spectrograms %}{% set ns.has_spectrograms = true %}{% endif %}
17
+ {% if file.test.matrices.frameseries %}{% set ns.has_frameseries = true %}{% endif %}
18
+ {% endif %}
14
19
  {% endfor %}
15
20
  <html>
16
21
  <head>
@@ -20,8 +25,10 @@
20
25
  <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
21
26
  <script src="https://cdn.plot.ly/plotly-2.34.0.min.js" charset="utf-8"></script>
22
27
 
23
- <script>{% include 'js_com_dom.js' %}</script>
24
- <script>{% include 'js_com_palette.js' %}</script>
28
+ <script>
29
+ {% include 'js_dom.js' %}
30
+ {% include 'js_palette.js' %}
31
+ </script>
25
32
  <script>{% include 'js_com_page.js' with context %}</script>
26
33
  <script>{% include 'js_chartlibs_plotly.js' %}</script>
27
34
  <script>{% include 'js_chartlibs_echarts.js' %}</script>
@@ -29,6 +36,10 @@
29
36
  <script>{% include 'utils_compare_report_anim.js' %}</script>
30
37
  <script>{% include 'utils_compare_report_framesseries.js' %}</script>
31
38
  <script>
39
+ {% if ns.has_spectrograms %}{% include 'uti_spectrograms.js' %}{% endif %}
40
+ {% if ns.has_matrices %}{% include 'uti_matrix.js' %}{% endif %}
41
+ </script>
42
+ <script>
32
43
  function load_animations(){
33
44
  // console.log(global_animations)
34
45
  for (i in global_animations.test) {
@@ -59,6 +70,15 @@ function load_framesseries(){
59
70
  }
60
71
  }
61
72
  }
73
+ function load_file_section(global_var, section_prefix, cls) {
74
+ for (i in global_var.test) {
75
+ const data_test = global_var.test[i]
76
+ const data_ref = global_var.reference[i]
77
+ const parent = dom.get(section_prefix+"_"+(1+parseInt(i)))
78
+ if (data_test) { cls.create(parent, data_test, data_ref) }
79
+ }
80
+ }
81
+
62
82
  </script>
63
83
  <style type="text/css">{% include 'style.css' %}</style>
64
84
  <style type="text/css">
@@ -77,6 +97,7 @@ function load_framesseries(){
77
97
 
78
98
  {% include 'body_99_footer.html' with context %}
79
99
  <script type="text/javascript">
100
+ const GLOBAL_VARS = {};
80
101
  const GLOBAL_CONFIG = {{ meta.config_json }};
81
102
  actions.init_page();
82
103
  </script>
@@ -94,5 +115,14 @@ function load_framesseries(){
94
115
  };
95
116
  load_framesseries();
96
117
  </script>
118
+ {% if ns.has_matrices %}
119
+ <script type="text/javascript">
120
+ GLOBAL_VARS.matrices = {
121
+ test : [ {% for file in data.files %} {{ file.test.matrices or 'null' }} , {% endfor %} ],
122
+ reference : [ {% for file in data.files %} {{ file.ref.matrices or 'null' }} , {% endfor %} ],
123
+ };
124
+ MatrixMgmt.loadGlobal();
125
+ </script>
126
+ {% endif %}
97
127
  </body>
98
128
  </html>
@@ -245,7 +245,7 @@ CurvesBlock.prototype = {
245
245
  resize: function(direction) {
246
246
  const mult = (1 + direction * 0.1);
247
247
  this.eContainer.dataset.zoom = this.zoom * mult;
248
- const curves = dom.qc(this.eContainer, ".js-plotly-plot");
248
+ const curves = dom.q(this.eContainer, ".js-plotly-plot");
249
249
  curves.forEach((e) => {
250
250
  const w = parseFloat(e.style.width) * mult;
251
251
  const h = parseFloat(e.style.height) * mult;
@@ -1,7 +1,7 @@
1
1
  const dom = {
2
2
  get: function(id) { return document.getElementById(id) },
3
- q(sel) { return document.querySelectorAll(sel); },
4
- qc(e, sel) { return e.querySelectorAll(sel); },
3
+ qd(sel) { return document.querySelectorAll(sel); },
4
+ q(e, sel) { return e.querySelectorAll(sel); },
5
5
  elt(tag,style,attrs,html) { const e = document.createElement(tag); e.style.cssText = style; if (attrs) { for (const k in attrs) { e.setAttribute(k, attrs[k]);}}; if (html) e.innerHTML=html; return e; },
6
6
  elt_p(parent,tag,style,attrs,html) { const e = this.elt(tag,style,attrs,html); if (parent) parent.appendChild(e); return e; },
7
7
  div(style,attrs,html) { return this.elt('div',style,attrs,html); },
@@ -18,4 +18,4 @@ tree(parent, data, out) {
18
18
  tree_o(parent, data) { const out={} ; this.tree(parent, data, out); return out; },
19
19
  getRadio(form,name) { return document.forms[form].elements[name].value },
20
20
  toogle(e) { e.style.display = (e.style.display === "none") ? "" : "none" },
21
- }
21
+ };
@@ -0,0 +1,7 @@
1
+ ((w_1, undef) => {
2
+ const a = ['#845ec2','#d65db1','#ff6f91','#ff9671','#ffc75f','#f9f871'];
3
+ w_1.palette = {
4
+ get: function(n) { return a[n % a.length]; },
5
+ get1: function(n) { return this.get(n-1); },
6
+ };
7
+ })(window);
@@ -0,0 +1,90 @@
1
+ ((w_1, undef) => {
2
+ //
3
+ // {
4
+ // "datasets": [
5
+ // {
6
+ // "nb_lines": 8,
7
+ // "nb_columns": 3,
8
+ // "data": [...],
9
+ // "x_values": [...],
10
+ // "y_values": [...]
11
+ // }
12
+ // ],
13
+ // "names": ["csv"],
14
+ // "spectrograms": {"display": 1},
15
+ // "frameseries": {"display": 1}
16
+ // }
17
+ //
18
+ function subtractMatrices(A, B) {
19
+ // // check dimensions
20
+ return A.map((row, i) =>
21
+ row.map((v, j) => v - B[i][j])
22
+ );
23
+ }
24
+ //
25
+ class Matrix {
26
+ constructor(data, x, y, name, ref) {
27
+ this.data = data; // Matrix data array[array[float]]
28
+ this.x = x; // X-axis values array[float]
29
+ this.y = y; // Y-axis values array[float]
30
+ this.name = name; // string
31
+ this.ref = ref; // Reference matrix data (optional) array[array[float]]
32
+ // // Check if the matrix is valid (rectangular)
33
+ // const rowLength = data[0].length;
34
+ // if (!data.every(row => row.length === rowLength)) {
35
+ // throw new Error("All rows must have the same number of columns.");
36
+ // }
37
+ // // Check if x and y dimensions match the data
38
+ // // check if ref has the same dimensions
39
+ }
40
+ subtract(other, name) {
41
+ // // check dimensions
42
+ // if (
43
+ // this.data.length !== other.data.length ||
44
+ // this.data[0].length !== other.data[0].length
45
+ // ) { throw new Error("Matrices must have the same dimensions."); }
46
+ return new Matrix(subtractMatrices(this.data, other.data), this.x, this.y, name);
47
+ }
48
+ ref_diff_data() {
49
+ return subtractMatrices(this.data, this.ref);
50
+ }
51
+ }
52
+ class MatrixGroup {
53
+ constructor(arr, is_spectro, is_frameseries, has_ref) {
54
+ this.arr = arr; // array of Matrix objects
55
+ this.is_spectro = is_spectro;
56
+ this.is_frameseries = is_frameseries;
57
+ this.has_ref = has_ref;
58
+ }
59
+ }
60
+ const MatrixMgmt = {
61
+ groups: [],
62
+ loadGlobal: function() {
63
+ // load loop GLOBAL_VARS groups
64
+ const g = GLOBAL_VARS.matrices;
65
+ g.test.forEach((data, i) => {
66
+ const group_data = [];
67
+ const ref = g.reference[i];
68
+ data.datasets.forEach((dataset, j) => {
69
+ const mat = new Matrix(dataset.data, dataset.x_values, dataset.y_values, data.names[j], ref.datasets[j].data);
70
+ group_data.push(mat);
71
+ });
72
+ const group = new MatrixGroup(group_data, Boolean(data.spectrograms), Boolean(data.frameseries), true);
73
+ this.groups.push(group);
74
+ });
75
+ // IMPORTANT
76
+ // Release Global
77
+ delete GLOBAL_VARS.matrices;
78
+ // Init
79
+ this.groups.forEach((group, i) => {
80
+ // Init Spectrograms
81
+ if (group.is_spectro) {
82
+ const spec = new Spectrograms(i, group.arr);
83
+ }
84
+ // Init Frameseries
85
+ }
86
+ );
87
+ },
88
+ };
89
+ w_1.MatrixMgmt = MatrixMgmt;
90
+ })(window);
@@ -0,0 +1,110 @@
1
+ ((w_1, undef) => {
2
+ //
3
+ // tmp
4
+ //
5
+ function resize22(obj, parent, dir) { // ASSUMPTIONS : obj.size int, "js-plotly-plot"
6
+ // size
7
+ const size = obj.size + (dir * obj.size * 0.1); // new size
8
+ obj.size = obj.size + (dir * obj.size * 0.1); // save
9
+ // update widgets
10
+ const update = { width: size, height: size };
11
+ const nodes = dom.q(parent, ".js-plotly-plot");
12
+ nodes.forEach((node) => {
13
+ node.style.width = size + "px";
14
+ node.style.height = size + "px";
15
+ Plotly.relayout(node, update); // update plotly
16
+ });
17
+ }
18
+ //
19
+ //
20
+ //
21
+ const PREFIX = "spectrograms_"; // section prefix
22
+ const DEFAULT_SIZE = 300;
23
+ const COLORSCALE = "Viridis"; // plotly
24
+ const COLORSCALE_DIFF = "RdBu"; // plotly
25
+ //
26
+ class Spectrograms {
27
+ constructor(index, arr_mat) {
28
+ console.log("index data", index);
29
+ // data
30
+ this.size = DEFAULT_SIZE;
31
+ this.arr_mat = arr_mat;
32
+ this.elt = dom.get(PREFIX+(1+index));
33
+ // init
34
+ this.init();
35
+ }
36
+ init() {
37
+ // resize
38
+ const that = this;
39
+ //
40
+ const tmpls = []
41
+ this.arr_mat.forEach((mat, i) => { tmpls.push({tag:"button", html: mat.name, click: function() { that.var_toogle(i); } }) });
42
+ //
43
+ dom.tree(
44
+ this.elt,
45
+ {tag:"div", children: [
46
+ {tag:"div", attrs:{class:"py-2"}, children: [
47
+ {tag:"button", html: '+ Increase', click: function() { resize22(that, that.elt, 1); }},
48
+ {tag:"button", html: '- Decrease', click: function() { resize22(that, that.elt, -1); }},
49
+ ]},
50
+ {tag:"div", attrs:{class:"py-2"}, children: tmpls},
51
+ ]},
52
+ );
53
+ // toogle
54
+ // Show all
55
+ this.arr_mat.forEach((mat, i) => { this.var_add(i); });
56
+ }
57
+ var_get_id(idx) {
58
+ return PREFIX+"block_"+idx;
59
+ }
60
+ var_toogle(idx) {
61
+ if (dom.get(this.var_get_id(idx))) { this.var_rmv(idx); }
62
+ else { this.var_add(idx); }
63
+ }
64
+ var_add(idx) {
65
+ const mat = this.arr_mat[idx];
66
+ //
67
+ const style = "width:"+this.size+"px;height:"+this.size+"px;";
68
+ const attrs = { class: "m-1 shadow-lg" };
69
+ //
70
+ const templs = [{out:"var_"+i, tag:"div", attrs: attrs, style:style} ];
71
+ if (mat.ref) {
72
+ templs.push({out:"ref_"+i, tag:"div", attrs: attrs, style:style});
73
+ templs.push({out:"dif_"+i, tag:"div", attrs: attrs, style:style});
74
+ }
75
+ const e = {};
76
+ dom.tree(
77
+ this.elt,
78
+ {tag:"div", attrs: {id: this.var_get_id(idx)}, children: [
79
+ {tag:"div", style:"display: flex; flex-wrap: wrap;", children: templs},
80
+ ]},
81
+ e
82
+ );
83
+
84
+ this.add_widget(e["var_"+idx], mat.data);
85
+ if (mat.ref) {
86
+ this.add_widget(e["ref_"+idx], mat.ref);
87
+ this.add_widget(e["dif_"+idx], mat.ref_diff_data(), COLORSCALE_DIFF);
88
+ }
89
+ }
90
+ var_rmv(idx) {
91
+ dom.get(this.var_get_id(idx)).remove();
92
+ }
93
+ add_widget(elt, mat, colorscale=COLORSCALE) {
94
+ const data = [{
95
+ z: mat,
96
+ type: 'heatmap',
97
+ colorscale: colorscale,
98
+ }];
99
+
100
+ const layout = {
101
+ // title: mat.name,
102
+ xaxis: { title: 'X' },
103
+ yaxis: { title: 'Y' }
104
+ };
105
+
106
+ Plotly.newPlot(elt, data, layout);
107
+ }
108
+ }
109
+ w_1.Spectrograms = Spectrograms;
110
+ })(window);
@@ -41,8 +41,7 @@ const Framesseries = function (elt, data, data_ref) {
41
41
  divs.push({tag:"div", style:"display: inline-block;"+m+"width: "+(100*(stop-start)/(this.frame_max-this.frame_min))+"%; height: 15px; background-color: "+s.color+";"});
42
42
  });
43
43
 
44
- dom_steps = {tag:"div", style:"", children: [
45
- // {tag:"div", style:"", html: "ttiti"},
44
+ dom_steps = {tag:"div", children: [
46
45
  {out:"step_label", tag:"div", style:"text-align: center;"},
47
46
  {tag:"div", style:"height:15px;background-color:#eee;", children: divs},
48
47
  ]}
@@ -51,7 +50,7 @@ const Framesseries = function (elt, data, data_ref) {
51
50
  dom.tree(
52
51
  null,
53
52
  {out:"root", tag:"div", children: [
54
- {tag:"div", style:"", children: [
53
+ {tag:"div", children: [
55
54
  {out:"plus", tag:"button", html: '+ Increase' },
56
55
  {out:"minus", tag:"button", html: '- Decrease' },
57
56
  ]},
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scilens
3
- Version: 0.3.4
3
+ Version: 0.3.5
4
4
  Summary: A CesGensLaB framework for data collecting and deep analysis
5
5
  Home-page: https://scilens.dev
6
6
  License: Proprietary
@@ -8,7 +8,7 @@ scilens/cli/info.py,sha256=xE7q9epjrCQRL6Agi3nhKsG6Mr3B8HSUFMti-epMoXA,1929
8
8
  scilens/cli/main.py,sha256=LljcS0s2E35y4YZpV01GhMhMK9HyRRHYmxc_q_kSurI,6004
9
9
  scilens/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  scilens/components/analyse_folder.py,sha256=yqc-dscKaHLZJCYeXGak2v0c3F2aeX0E11AFPfya6r0,208
11
- scilens/components/compare_2_files.py,sha256=U4xumE28ijFbnrTPH8FgRyR_b5f04jOjaCmegJvCvSE,1483
11
+ scilens/components/compare_2_files.py,sha256=jbZNLbRj3x8TxUADM5QC2u_TGl4I7u5OdaEMh-gMBUk,1713
12
12
  scilens/components/compare_errors.py,sha256=vGb4DWP89HMIeBm0dZU2nt-ksppAs_37xtCHaPd0w5Y,1640
13
13
  scilens/components/compare_floats.py,sha256=p1lnnwkGJXIsb6Y5psQc_5FcOuB2vP_cIQHXhZjWPXc,5617
14
14
  scilens/components/compare_folders.py,sha256=LZ1AuYxLVHMNbtXWXQrdms4vZgOQthvDy-8NFD_EFjc,2617
@@ -21,14 +21,14 @@ scilens/config/env_var.py,sha256=NqNBoIfngJEXaGEm7jGqre5pmkJ9eUjiWzbDrTVfi2c,292
21
21
  scilens/config/load.py,sha256=4U51o4cJfqhSuRIHKUDIsDQA0C4wv6SzTkVmInGDJdI,1647
22
22
  scilens/config/models/__init__.py,sha256=eLCW1OLVINewGFy5GXSrOk8Rab_QsgKAuoErBjphHRs,673
23
23
  scilens/config/models/app.py,sha256=JltWRjjqXYkH6rg3OHYhMfkBqHFhZEZdthqES3LxvzY,1453
24
- scilens/config/models/compare.py,sha256=_SLMxf81fpuod8izZm72Jn12euRPxB0wHJSfUuIANbE,1639
24
+ scilens/config/models/compare.py,sha256=esRqW3PNVOqkA_mt4_qbS7dVCLulUrZTBUhANQOHoqE,1847
25
25
  scilens/config/models/compare_float_thresholds.py,sha256=J5XBK1dAnmU-i2uA2bsaHnTM_m07_i17wsO8UiCw46o,1844
26
26
  scilens/config/models/execute.py,sha256=8issd_hg49SdVkDq2TLDB1vBJY4M1t279XERNUd3VVs,2142
27
27
  scilens/config/models/execute_and_compare.py,sha256=TWL6yXGvQSaaV6nhHqWLvtr3v396APIoDNt0U1TbMro,582
28
28
  scilens/config/models/file_reader.py,sha256=c18vKhVcBX4ufpbnCBJyVyAsQtlxpwx0lGVuf1i8EGA,1176
29
29
  scilens/config/models/reader_format_cols_curve.py,sha256=eKLvifq1xuN8sPds9ijfru3vgMZ3Odv5tGfeiK4Sfk4,1860
30
- scilens/config/models/reader_format_csv.py,sha256=cxvkVbBF5DtrbRCIppjDUC2EIkb-GIe9qou3TGrihxU,1265
31
- scilens/config/models/reader_format_netcdf.py,sha256=nbfTB3avO0DidbNa1dCZGFZmmQvzTYhpe6mqfAanaOA,1025
30
+ scilens/config/models/reader_format_csv.py,sha256=si422pyd3kwxXWb4u_L-0dsBxTouHDu2AWdh2a5OfD4,1512
31
+ scilens/config/models/reader_format_netcdf.py,sha256=k-AMdm239T6I42R8jzyRlPKKJ8zkRrN8XS8yU6ZkFu0,1256
32
32
  scilens/config/models/reader_format_txt.py,sha256=eHg90gwEI_VpqwqEjMRhwlS8dHcl5G4ow-37HjQq_zY,1168
33
33
  scilens/config/models/reader_format_txt_fixed_cols.py,sha256=xHD1_JOoRZow8lSNaDSYFeNckojctkT4C61mbBcjeKg,1079
34
34
  scilens/config/models/readers.py,sha256=Pq5kOGW3b6g1x5cp_BbwUF7LUB_P3m9bHDYLSTVXNBY,1769
@@ -49,8 +49,8 @@ scilens/processors/processor_interface.py,sha256=jzMp1529JXnMGTJijVy6b_1zmARAMNv
49
49
  scilens/readers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  scilens/readers/cols_dataset.py,sha256=C4N030_Iqq5KZVpQ0NVjAw4DctALuz_YBb6f6yi35Jk,2452
51
51
  scilens/readers/exceptions.py,sha256=JzmxcjnR5sH-IOWVeCC5A1bSwxv-jCAtIJvDjzx1CTI,32
52
- scilens/readers/mat_dataset.py,sha256=-2NJJxOu8qEMhni-kGT9F-MwDA98_Nrt2cC0TYMUNvw,1180
53
- scilens/readers/reader_csv.py,sha256=aPd2IxFiUXYmH_EpNZkCHV1oMWctZW7YSPwC8q75SIo,3490
52
+ scilens/readers/mat_dataset.py,sha256=6hmXIdGCfQrd4Y2_v-p65VmrO4I2J8ZddGBy-AgYLX0,1683
53
+ scilens/readers/reader_csv.py,sha256=LFjbTv2CLungV8UwXzob5o_9G2c4cLEUCMoRXAyErKQ,3739
54
54
  scilens/readers/reader_interface.py,sha256=nnttHL7wt4MOXpi-SBkk8DYxVWscOPG8JFl_z12mIAo,922
55
55
  scilens/readers/reader_manager.py,sha256=DFinxIk3IIIcB6JxybGcv-mXt3jhXgCwUtzR0TqhB2Q,2684
56
56
  scilens/readers/reader_txt.py,sha256=WPsFunEA_idzAKkD3UJQbLnaOzG2U03P3gY4gphuIw0,3868
@@ -66,20 +66,22 @@ scilens/report/template.py,sha256=cPs5gd3uEwb-6JgitGQD_i4IiUxigBTlZLNRS9KVuos,58
66
66
  scilens/report/templates/body_01_title.html,sha256=0mrMM62TSBdPOpPNCcam0bZsZtM0GjoMQ-jrSqI8HCw,2173
67
67
  scilens/report/templates/body_99_footer.html,sha256=8cWebeWfZwZ-9bYAMZkZj8rbCWq3BLIMjKQThWQxoQM,362
68
68
  scilens/report/templates/compare_11_summary.html,sha256=4rxBlOxTcn59ztYtqDbi6SRQXlaz30HkVl7dJpzCmZE,3776
69
- scilens/report/templates/compare_12_sections.html,sha256=HWsfCmfdleyRK6IHJeMEheenOuyA0mLzOZ-0qLcuzJU,5952
69
+ scilens/report/templates/compare_12_sections.html,sha256=Sm5NtOkGhkm0Eo-H2R-97mNDjuuw84NLdcZntevzEVQ,6304
70
70
  scilens/report/templates/compare_13_section_numbers copy.html,sha256=0PWK_I2kNX3LjPLkkY4eSYIeB7YFkA28nk-PPLDhnaY,1753
71
71
  scilens/report/templates/compare_13_section_numbers.html,sha256=9etEMSqwrDyJIn_nMbKEVaDgnFL_hBxSjPR-hU2wgDI,851
72
72
  scilens/report/templates/compare_13_section_numbers_table.html,sha256=sJy6ZYtjl80vM1b3oqZSXawZWp7KNIwLI_wCnvBwYPE,3270
73
- scilens/report/templates/index.html,sha256=mNTu-CAzEJ2rhz81cHAdmT_KcQeOQ3b_FSC73NPEi0U,3670
73
+ scilens/report/templates/index.html,sha256=YRWtim7ZGmDEojD4fx_jqyiGqsPi1LqvF5P4qj5aZmk,4862
74
74
  scilens/report/templates/js_chartlibs_echarts.js,sha256=6YicVhTNIBmmBpV31XCVN5oBeiD0t29JIosJZRUv01M,907
75
75
  scilens/report/templates/js_chartlibs_plotly.js,sha256=uVAOKUB5XE33-r04phR-LlRkFoaHEIXyQ3jXT5r97Rc,1521
76
- scilens/report/templates/js_com_dom.js,sha256=YAJNGmgq2YbF9D3TqB7YSms67-xB88Molp9cKhWlqsI,1228
77
76
  scilens/report/templates/js_com_page.js,sha256=ZxYHR-KGQRH726rPOXrEgyzBKM9NtGH3_APvcawKxQw,6862
78
- scilens/report/templates/js_com_palette.js,sha256=3aZVDxBmz6cxp0plcTsQO03SrcsXg5Cn5COyeHmVO1g,242
79
- scilens/report/templates/js_curvemgr.js,sha256=uBLiWzAcg4kOm3KpFFlLPiPzZ30yzAAVebwKVbufmvw,10799
77
+ scilens/report/templates/js_curvemgr.js,sha256=Kmn2o9mKctKEXkIYOzWxqh2IVRtrpKcZvdBl8QmzdJ0,10798
78
+ scilens/report/templates/js_dom.js,sha256=XnxgdB0x-Xtt0eQFrwjcFO1cb_KPsTImpJBB6m_y8FI,1229
79
+ scilens/report/templates/js_palette.js,sha256=HeewAmkR67QiqXSanJS3cCgp6IPKomlULUTKt55F6es,218
80
80
  scilens/report/templates/style.css,sha256=thZ_LZonmY9qH9oBie1BcK2H2FPPqik11YFr1hyo6ng,4071
81
+ scilens/report/templates/uti_matrix.js,sha256=L2NqR9fu1075JGStWy6yS7EX4pHGAcBrhfR_cAL4VYw,2675
82
+ scilens/report/templates/uti_spectrograms.js,sha256=z-LNIdgqH2aN6iXARJ6xO8imBlZtwnBMIfJvHvNTGcI,3090
81
83
  scilens/report/templates/utils_compare_report_anim.js,sha256=a7FHRco17BmgOAHb9kiDsFcSoxbmTGqjBbXBprf3hnU,2923
82
- scilens/report/templates/utils_compare_report_framesseries.js,sha256=y2y73nNilmCXcHqJH47oc0iDrYKaLDOn3j8f4muWYxc,5770
84
+ scilens/report/templates/utils_compare_report_framesseries.js,sha256=su4zy29yZMqBlL213B1oLFpzBrmwta5jlc96fN_pphc,5697
83
85
  scilens/report/vendors/tailwindcss_3_4_15.js,sha256=niHw6Rf0uS2pE5_8h-E18NI24o1urZL5Ac31_n9htKE,407279
84
86
  scilens/report/vendors/tailwindcss_min_4.0.0-beta.4.js,sha256=fy2LOvMX7m4b1V9WdtWC0dCPNIYhE2cLkFiD3JNcYhI,177617
85
87
  scilens/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -97,7 +99,7 @@ scilens/utils/template.py,sha256=9dlXX3nmfzDRUwzPJOkoxk15UXivZ2SW-McdCwokFa4,443
97
99
  scilens/utils/time_tracker.py,sha256=DdVBoMpVLXrX0qZZXyLm4g38EwDVLlRcBqcpNex1mYY,545
98
100
  scilens/utils/vectors.py,sha256=4N2BZSC5n3HgZqPujDGF5NdjVmSL1rOHb_qw4OoABQY,103
99
101
  scilens/utils/web.py,sha256=MAFWpIFOKz7QhqDoFh-Qwstvc76KpcxstSgHFT8FOL4,901
100
- scilens-0.3.4.dist-info/METADATA,sha256=rLCgHhgfF0utkAo-hIq5y2IBXTV_GcLjdcQLSeqpnh0,1367
101
- scilens-0.3.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
102
- scilens-0.3.4.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
103
- scilens-0.3.4.dist-info/RECORD,,
102
+ scilens-0.3.5.dist-info/METADATA,sha256=MAh2EUUaJAmB3cdkYutRwGiAdGil9i_w9eANAVN0Hxc,1367
103
+ scilens-0.3.5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
104
+ scilens-0.3.5.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
105
+ scilens-0.3.5.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- ((w_1, undef) => {
2
- const a = ['#845ec2','#d65db1','#ff6f91','#ff9671','#ffc75f','#f9f871'];
3
- w_1.palette = {
4
- get: function(n) { return a[n % a.length]; },
5
- get1: function(n) { return this.get(n-1); },
6
- };
7
- })(window);