code-loader 1.0.87a2__py3-none-any.whl → 1.0.87.dev0__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.
@@ -7,7 +7,7 @@ import numpy.typing as npt
7
7
  from code_loader.contract.enums import DataStateType, DataStateEnum, LeapDataType, ConfusionMatrixValue, \
8
8
  MetricDirection, DatasetMetadataType
9
9
  from code_loader.contract.visualizer_classes import LeapImage, LeapText, LeapGraph, LeapHorizontalBar, \
10
- LeapTextMask, LeapImageMask, LeapImageWithBBox, LeapImageWithHeatmap
10
+ LeapTextMask, LeapImageMask, LeapImageWithBBox, LeapImageWithHeatmap, LeapVideo
11
11
 
12
12
  custom_latent_space_attribute = "custom_latent_space"
13
13
 
@@ -94,6 +94,7 @@ class UnlabeledDataPreprocessHandler:
94
94
 
95
95
  VisualizerCallableInterface = Union[
96
96
  Callable[..., LeapImage],
97
+ Callable[..., LeapVideo],
97
98
  Callable[..., LeapText],
98
99
  Callable[..., LeapGraph],
99
100
  Callable[..., LeapHorizontalBar],
@@ -104,7 +105,7 @@ VisualizerCallableInterface = Union[
104
105
  ]
105
106
 
106
107
  LeapData = Union[LeapImage, LeapText, LeapGraph, LeapHorizontalBar, LeapImageMask, LeapTextMask, LeapImageWithBBox,
107
- LeapImageWithHeatmap]
108
+ LeapImageWithHeatmap, LeapVideo]
108
109
 
109
110
  CustomCallableInterface = Callable[..., Any]
110
111
 
@@ -16,11 +16,11 @@ from code_loader.contract.responsedataclasses import DatasetTestResultPayload
16
16
  from code_loader.contract.visualizer_classes import map_leap_data_type_to_visualizer_class
17
17
  from code_loader.default_losses import loss_name_to_function
18
18
  from code_loader.default_metrics import metrics_names_to_functions_and_direction
19
- from code_loader.utils import to_numpy_return_wrapper, get_shape, flatten
19
+ from code_loader.utils import to_numpy_return_wrapper, get_shape
20
20
  from code_loader.visualizers.default_visualizers import DefaultVisualizer, \
21
21
  default_graph_visualizer, \
22
22
  default_image_visualizer, default_horizontal_bar_visualizer, default_word_visualizer, \
23
- default_image_mask_visualizer, default_text_mask_visualizer, default_raw_data_visualizer
23
+ default_image_mask_visualizer, default_text_mask_visualizer, default_raw_data_visualizer, default_video_visualizer
24
24
 
25
25
 
26
26
  class LeapBinder:
@@ -48,6 +48,8 @@ class LeapBinder:
48
48
  def _extend_with_default_visualizers(self) -> None:
49
49
  self.set_visualizer(function=default_image_visualizer, name=DefaultVisualizer.Image.value,
50
50
  visualizer_type=LeapDataType.Image)
51
+ self.set_visualizer(function=default_video_visualizer, name=DefaultVisualizer.Video.value,
52
+ visualizer_type=LeapDataType.Video)
51
53
  self.set_visualizer(function=default_graph_visualizer, name=DefaultVisualizer.Graph.value,
52
54
  visualizer_type=LeapDataType.Graph)
53
55
  self.set_visualizer(function=default_raw_data_visualizer, name=DefaultVisualizer.RawData.value,
@@ -353,8 +355,7 @@ class LeapBinder:
353
355
  self._encoder_names.append(name)
354
356
 
355
357
  def set_metadata(self, function: MetadataSectionCallableInterface, name: str,
356
- metadata_type: Optional[
357
- Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None) -> None:
358
+ metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None) -> None:
358
359
  """
359
360
  Set the metadata handler function. This function is used for measuring and analyzing external variable values per sample, which is recommended for analysis within the Tensorleap platform.
360
361
 
@@ -491,41 +492,43 @@ class LeapBinder:
491
492
  @staticmethod
492
493
  def check_handler(
493
494
  preprocess_response: PreprocessResponse, test_result: List[DatasetTestResultPayload],
494
- dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler], state: DataStateEnum) -> List[
495
- DatasetTestResultPayload]:
495
+ dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler], state: DataStateEnum) -> List[DatasetTestResultPayload]:
496
496
  assert preprocess_response.sample_ids is not None
497
497
  raw_result = dataset_base_handler.function(preprocess_response.sample_ids[0], preprocess_response)
498
498
  handler_type = 'metadata' if isinstance(dataset_base_handler, MetadataHandler) else None
499
499
  if isinstance(dataset_base_handler, MetadataHandler):
500
500
  if isinstance(raw_result, dict):
501
- metadata_test_result_payloads = []
502
- for i, (flat_name, flat_result) in enumerate(flatten(raw_result, prefix=dataset_base_handler.name)):
503
- result_payload = DatasetTestResultPayload(flat_name)
501
+ metadata_test_result_payloads = [
502
+ DatasetTestResultPayload(f'{dataset_base_handler.name}_{single_metadata_name}')
503
+ for single_metadata_name, single_metadata_result in raw_result.items()
504
+ ]
505
+ for i, (single_metadata_name, single_metadata_result) in enumerate(raw_result.items()):
506
+ metadata_test_result = metadata_test_result_payloads[i]
507
+
508
+ if not isinstance(single_metadata_result, (int, str, bool, float, np.unsignedinteger, np.signedinteger, np.bool_, np.floating)):
509
+ raise Exception(f"Unsupported return type of metadata {single_metadata_name}."
510
+ f"The return type should be one of [int, float, str, bool]. Got {type(single_metadata_result)}")
504
511
 
505
512
  metadata_type = None
506
- if flat_result is None:
507
- if state != DataStateEnum.training and test_result[i].name == flat_name:
508
- result_payload = test_result[i]
509
- metadata_test_result_payloads.append(result_payload)
513
+ if single_metadata_result is None:
514
+ if state != DataStateEnum.training and test_result[i].name == f'{dataset_base_handler.name}_{single_metadata_name}':
515
+ metadata_test_result_payloads[i] = test_result[i]
510
516
  continue
511
517
 
512
518
  if dataset_base_handler.metadata_type is None:
513
- raise Exception(f"Metadata {flat_name} is None and no metadata type is provided")
519
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
514
520
  elif isinstance(dataset_base_handler.metadata_type, dict):
515
- if flat_name not in dataset_base_handler.metadata_type:
516
- raise Exception(
517
- f"Metadata {flat_name} is None and was not found in the provided metadata type")
518
- metadata_type = dataset_base_handler.metadata_type[flat_name]
521
+ if single_metadata_name not in dataset_base_handler.metadata_type:
522
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
523
+ metadata_type = dataset_base_handler.metadata_type[single_metadata_name]
519
524
  else:
520
- raise Exception(f"Metadata {flat_name} is None and was not found in the provided metadata "
521
- f"type, metadata_type: {dataset_base_handler.metadata_type}")
522
-
523
- result_shape = get_shape(flat_result)
524
- result_payload.shape = result_shape
525
- result_payload.raw_result = flat_result if flat_result is not None else metadata_type
526
- result_payload.handler_type = handler_type
527
- metadata_test_result_payloads.append(result_payload)
525
+ raise Exception(f"Metadata {single_metadata_name} is None and metadata type is not a dict")
528
526
 
527
+ result_shape = get_shape(single_metadata_result)
528
+ metadata_test_result.shape = result_shape
529
+ metadata_test_result.raw_result = (
530
+ single_metadata_result) if single_metadata_result is not None else metadata_type
531
+ metadata_test_result.handler_type = handler_type
529
532
  test_result = metadata_test_result_payloads
530
533
  else:
531
534
  if raw_result is None:
@@ -533,11 +536,9 @@ class LeapBinder:
533
536
  return test_result
534
537
 
535
538
  if dataset_base_handler.metadata_type is None:
536
- raise Exception(
537
- f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
539
+ raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
538
540
  elif isinstance(dataset_base_handler.metadata_type, dict):
539
- raise Exception(
540
- f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
541
+ raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
541
542
  metadata_type = dataset_base_handler.metadata_type
542
543
 
543
544
  result_shape = get_shape(raw_result)
code_loader/leaploader.py CHANGED
@@ -22,7 +22,7 @@ from code_loader.contract.responsedataclasses import DatasetIntegParseResult, Da
22
22
  VisualizerInstance, PredictionTypeInstance, ModelSetup, CustomLayerInstance, MetricInstance, CustomLossInstance
23
23
  from code_loader.inner_leap_binder import global_leap_binder
24
24
  from code_loader.leaploaderbase import LeapLoaderBase
25
- from code_loader.utils import get_root_exception_file_and_line_number, flatten
25
+ from code_loader.utils import get_root_exception_file_and_line_number
26
26
 
27
27
 
28
28
  class LeapLoader(LeapLoaderBase):
@@ -204,6 +204,9 @@ class LeapLoader(LeapLoaderBase):
204
204
  preprocess_result = self._preprocess_result()
205
205
  result_payloads: List[DatasetTestResultPayload] = []
206
206
  dataset_base_handlers: List[Union[DatasetBaseHandler, MetadataHandler]] = self._get_all_dataset_base_handlers()
207
+ metadata_handlers_num = sum(isinstance(x, MetadataHandler) for x in dataset_base_handlers)
208
+ assert metadata_handlers_num < 100, f"More than 100 metadata function are not allowed, current metadata function discovered: {metadata_handlers_num}"
209
+ metadata_param_count = 0
207
210
  for dataset_base_handler in dataset_base_handlers:
208
211
  test_result = [DatasetTestResultPayload(dataset_base_handler.name)]
209
212
  for state, preprocess_response in preprocess_result.items():
@@ -218,9 +221,10 @@ class LeapLoader(LeapLoaderBase):
218
221
  test_result[0].display[
219
222
  state_name] = f"{repr(e)} in file {file_name}, line_number: {line_number}\nStacktrace:\n{stacktrace}"
220
223
  test_result[0].is_passed = False
221
-
224
+ if isinstance(dataset_base_handler, MetadataHandler):
225
+ metadata_param_count += len(test_result)
226
+ assert metadata_param_count < 800, f"More than 800 metadata keys are not allowed, current metadata keys discovered: {metadata_param_count}"
222
227
  result_payloads.extend(test_result)
223
-
224
228
  return result_payloads
225
229
 
226
230
  @staticmethod
@@ -447,10 +451,6 @@ class LeapLoader(LeapLoaderBase):
447
451
 
448
452
  def _convert_metadata_to_correct_type(self, metadata_name: str, value: Any) -> Tuple[Any, bool]:
449
453
  metadata_name_to_type = self._metadata_name_to_type()
450
- if metadata_name not in metadata_name_to_type:
451
- raise Exception(f"metadata {metadata_name} not found in metadata type map, "
452
- f"metadata_name_to_type:{metadata_name_to_type}")
453
-
454
454
  metadata_type_to_python_type = {
455
455
  DatasetMetadataType.float: float,
456
456
  DatasetMetadataType.string: str,
@@ -475,18 +475,22 @@ class LeapLoader(LeapLoaderBase):
475
475
 
476
476
  return converted_value, is_none
477
477
 
478
- def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[
479
- Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
478
+ def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
480
479
  result_agg = {}
481
480
  is_none = {}
482
481
  preprocess_result = self._preprocess_result()
483
482
  preprocess_state = preprocess_result[state]
484
483
  for handler in global_leap_binder.setup_container.metadata:
485
484
  handler_result = handler.function(sample_id, preprocess_state)
486
-
487
- for flat_name, flat_result in flatten(handler_result, prefix=handler.name):
488
- result_agg[flat_name], is_none[flat_name] = self._convert_metadata_to_correct_type(
489
- flat_name, flat_result)
485
+ if isinstance(handler_result, dict):
486
+ for single_metadata_name, single_metadata_result in handler_result.items():
487
+ handler_name = f'{handler.name}_{single_metadata_name}'
488
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
489
+ handler_name, single_metadata_result)
490
+ else:
491
+ handler_name = handler.name
492
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
493
+ handler_name, handler_result)
490
494
 
491
495
  return result_agg, is_none
492
496
 
code_loader/utils.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import sys
2
2
  from pathlib import Path
3
3
  from types import TracebackType
4
- from typing import List, Union, Tuple, Any, Iterator
4
+ from typing import List, Union, Tuple, Any
5
5
  import traceback
6
6
  import numpy as np
7
7
  import numpy.typing as npt
@@ -66,28 +66,3 @@ def rescale_min_max(image: npt.NDArray[np.float32]) -> npt.NDArray[np.float32]:
66
66
  return image
67
67
 
68
68
 
69
- def flatten(
70
- value: Any,
71
- *,
72
- prefix: str = "",
73
- list_token: str = "e",
74
- ) -> Iterator[Tuple[str, Any]]:
75
- """
76
- Recursively walk `value` and yield (flat_key, leaf_value) pairs.
77
-
78
- • Dicts → descend with new_prefix = f"{prefix}_{key}" (or just key if top level)
79
- • Sequences → descend with new_prefix = f"{prefix}_{list_token}{idx}"
80
- • Leaf scalars → yield the accumulated flat key and the scalar itself
81
- """
82
- if isinstance(value, dict):
83
- for k, v in value.items():
84
- new_prefix = f"{prefix}_{k}" if prefix else k
85
- yield from flatten(v, prefix=new_prefix, list_token=list_token)
86
-
87
- elif isinstance(value, (list, tuple)):
88
- for idx, v in enumerate(value):
89
- new_prefix = f"{prefix}_{list_token}{idx}"
90
- yield from flatten(v, prefix=new_prefix, list_token=list_token)
91
-
92
- else: # primitive leaf (str, int, float, bool, None…)
93
- yield prefix, value
@@ -4,12 +4,13 @@ import numpy as np
4
4
  import numpy.typing as npt
5
5
 
6
6
  from code_loader.contract.visualizer_classes import LeapImage, LeapGraph, LeapHorizontalBar, LeapText, \
7
- LeapImageMask, LeapTextMask
7
+ LeapImageMask, LeapTextMask, LeapVideo
8
8
  from code_loader.utils import rescale_min_max
9
9
 
10
10
 
11
11
  class DefaultVisualizer(Enum):
12
12
  Image = 'Image'
13
+ Video = 'Video'
13
14
  Graph = 'Graph'
14
15
  HorizontalBar = 'HorizontalBar'
15
16
  Text = 'Text'
@@ -23,6 +24,10 @@ def default_image_visualizer(data: npt.NDArray[np.float32]) -> LeapImage:
23
24
  return LeapImage(rescaled_data)
24
25
 
25
26
 
27
+ def default_video_visualizer(data: npt.NDArray[np.float32]) -> LeapVideo:
28
+ return LeapVideo(data)
29
+
30
+
26
31
  def default_graph_visualizer(data: npt.NDArray[np.float32]) -> LeapGraph:
27
32
  return LeapGraph(data)
28
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: code-loader
3
- Version: 1.0.87a2
3
+ Version: 1.0.87.dev0
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -1,7 +1,7 @@
1
1
  LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
2
2
  code_loader/__init__.py,sha256=6MMWr0ObOU7hkqQKgOqp4Zp3I28L7joGC9iCbQYtAJg,241
3
3
  code_loader/contract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- code_loader/contract/datasetclasses.py,sha256=rpsccWddYksLQhB0fDZKZsiuclb32wtAraLtvXZ0teM,7912
4
+ code_loader/contract/datasetclasses.py,sha256=ZN6XC-tg0qaT-GF4YiV2SsM2dUQW4fc1akLF-J4YT0w,7964
5
5
  code_loader/contract/enums.py,sha256=GEFkvUMXnCNt-GOoz7NJ9ecQZ2PPDettJNOsxsiM0wk,1622
6
6
  code_loader/contract/exceptions.py,sha256=jWqu5i7t-0IG0jGRsKF4DjJdrsdpJjIYpUkN1F4RiyQ,51
7
7
  code_loader/contract/responsedataclasses.py,sha256=RSx9m_R3LawhK5o1nAcO3hfp2F9oJYtxZr_bpP3bTmw,4005
@@ -19,14 +19,14 @@ code_loader/experiment_api/types.py,sha256=MY8xFARHwdVA7p4dxyhD60ShmttgTvb4qdp1o
19
19
  code_loader/experiment_api/utils.py,sha256=XZHtxge12TS4H4-8PjV3sKuhp8Ud6ojAiIzTZJEqBqc,3304
20
20
  code_loader/experiment_api/workingspace_config_utils.py,sha256=DLzXQCg4dgTV_YgaSbeTVzq-2ja_SQw4zi7LXwKL9cY,990
21
21
  code_loader/inner_leap_binder/__init__.py,sha256=koOlJyMNYzGbEsoIbXathSmQ-L38N_pEXH_HvL7beXU,99
22
- code_loader/inner_leap_binder/leapbinder.py,sha256=cHGIHySEnQZ2U9iN-MyZM05FSQLPYNA79GcuE7ZmFVg,30648
22
+ code_loader/inner_leap_binder/leapbinder.py,sha256=1zPMMmpbdATQbWrEiLdHYrmfTgLqz-aOXWTJAup-pWw,31205
23
23
  code_loader/inner_leap_binder/leapbinder_decorators.py,sha256=qcYyekpIN1hgbmSqTrN7o6IMpfu8ZWp2J_lhMEoV8I8,22598
24
- code_loader/leaploader.py,sha256=y1lY1jtwpVNA8TGsJYbS50hXePvUsn9YiLvf2aE_pJI,25635
24
+ code_loader/leaploader.py,sha256=puboAweNAreN0nJ7hJG86ZE13hBYlw4pn_ilZ9PJbPU,26335
25
25
  code_loader/leaploaderbase.py,sha256=VH0vddRmkqLtcDlYPCO7hfz1_VbKo43lUdHDAbd4iJc,4198
26
- code_loader/utils.py,sha256=4tXLum2AT3Z1ldD6BeYScNg0ATyE4oM8cuIGQxrXyjM,3163
26
+ code_loader/utils.py,sha256=aw2i_fqW_ADjLB66FWZd9DfpCQ7mPdMyauROC5Nd51I,2197
27
27
  code_loader/visualizers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- code_loader/visualizers/default_visualizers.py,sha256=Ffx5VHVOe5ujBOsjBSxN_aIEVwFSQ6gbhTMG5aUS-po,2305
29
- code_loader-1.0.87a2.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
30
- code_loader-1.0.87a2.dist-info/METADATA,sha256=2VfDx4tdSnheLNY1yYKhNYjXBoQYZYbPgYh8Vk4PLrE,851
31
- code_loader-1.0.87a2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
32
- code_loader-1.0.87a2.dist-info/RECORD,,
28
+ code_loader/visualizers/default_visualizers.py,sha256=f95WzLYO2KU8endWxrmtwjHx7diDfm8AaWjucYHT7GI,2439
29
+ code_loader-1.0.87.dev0.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
30
+ code_loader-1.0.87.dev0.dist-info/METADATA,sha256=GWTY4wFgkev5wQldmNXXuwf8FYbChKFSwoqf7PrYa4I,854
31
+ code_loader-1.0.87.dev0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
32
+ code_loader-1.0.87.dev0.dist-info/RECORD,,