code-loader 1.0.77.1__py3-none-any.whl → 1.0.78__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.
@@ -4,7 +4,8 @@ import re
4
4
  import numpy as np
5
5
  import numpy.typing as npt
6
6
 
7
- from code_loader.contract.enums import DataStateType, DataStateEnum, LeapDataType, ConfusionMatrixValue, MetricDirection
7
+ from code_loader.contract.enums import DataStateType, DataStateEnum, LeapDataType, ConfusionMatrixValue, \
8
+ MetricDirection, DatasetMetadataType
8
9
  from code_loader.contract.visualizer_classes import LeapImage, LeapText, LeapGraph, LeapHorizontalBar, \
9
10
  LeapTextMask, LeapImageMask, LeapImageWithBBox, LeapImageWithHeatmap
10
11
 
@@ -196,6 +197,7 @@ class GroundTruthHandler(DatasetBaseHandler):
196
197
  class MetadataHandler:
197
198
  name: str
198
199
  function: MetadataSectionCallableInterface
200
+ metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None
199
201
 
200
202
 
201
203
  @dataclass
@@ -232,6 +234,7 @@ class DatasetIntegrationSetup:
232
234
  class DatasetSample:
233
235
  inputs: Dict[str, npt.NDArray[np.float32]]
234
236
  gt: Optional[Dict[str, npt.NDArray[np.float32]]]
235
- metadata: Dict[str, Union[str, int, bool, float]]
237
+ metadata: Dict[str, Union[Optional[str], int, bool, Optional[float]]]
238
+ metadata_is_none: Dict[str, bool]
236
239
  index: Union[int, str]
237
240
  state: DataStateEnum
@@ -11,7 +11,7 @@ from code_loader.contract.datasetclasses import SectionCallableInterface, InputH
11
11
  CustomCallableInterfaceMultiArgs, ConfusionMatrixCallableInterfaceMultiArgs, LeapData, \
12
12
  CustomMultipleReturnCallableInterfaceMultiArgs, DatasetBaseHandler, custom_latent_space_attribute, \
13
13
  RawInputsForHeatmap, VisualizerHandlerData, MetricHandlerData, CustomLossHandlerData, SamplePreprocessResponse
14
- from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection
14
+ from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection, DatasetMetadataType
15
15
  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
@@ -333,7 +333,8 @@ class LeapBinder:
333
333
 
334
334
  self._encoder_names.append(name)
335
335
 
336
- def set_metadata(self, function: MetadataSectionCallableInterface, name: str) -> None:
336
+ def set_metadata(self, function: MetadataSectionCallableInterface, name: str,
337
+ metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None) -> None:
337
338
  """
338
339
  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.
339
340
 
@@ -368,7 +369,7 @@ class LeapBinder:
368
369
  leap_binder.set_metadata(metadata_handler_index, name='metadata_index')
369
370
  leap_binder.set_metadata(metadata_handler_image_mean, name='metadata_image_mean')
370
371
  """
371
- self.setup_container.metadata.append(MetadataHandler(name, function))
372
+ self.setup_container.metadata.append(MetadataHandler(name, function, metadata_type))
372
373
 
373
374
  def set_custom_layer(self, custom_layer: Type[Any], name: str, inspect_layer: bool = False,
374
375
  kernel_index: Optional[int] = None, use_custom_latent_space: bool = False) -> None:
@@ -465,23 +466,55 @@ class LeapBinder:
465
466
  @staticmethod
466
467
  def check_handler(
467
468
  preprocess_response: PreprocessResponse, test_result: List[DatasetTestResultPayload],
468
- dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler]) -> List[DatasetTestResultPayload]:
469
+ dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler], state: DataStateEnum) -> List[DatasetTestResultPayload]:
469
470
  assert preprocess_response.sample_ids is not None
470
471
  raw_result = dataset_base_handler.function(preprocess_response.sample_ids[0], preprocess_response)
471
472
  handler_type = 'metadata' if isinstance(dataset_base_handler, MetadataHandler) else None
472
- if isinstance(dataset_base_handler, MetadataHandler) and isinstance(raw_result, dict):
473
- metadata_test_result_payloads = [
474
- DatasetTestResultPayload(f'{dataset_base_handler.name}_{single_metadata_name}')
475
- for single_metadata_name, single_metadata_result in raw_result.items()
476
- ]
477
- for i, (single_metadata_name, single_metadata_result) in enumerate(raw_result.items()):
478
- metadata_test_result = metadata_test_result_payloads[i]
479
-
480
- result_shape = get_shape(single_metadata_result)
481
- metadata_test_result.shape = result_shape
482
- metadata_test_result.raw_result = single_metadata_result
483
- metadata_test_result.handler_type = handler_type
484
- test_result = metadata_test_result_payloads
473
+ if isinstance(dataset_base_handler, MetadataHandler):
474
+ if isinstance(raw_result, dict):
475
+ metadata_test_result_payloads = [
476
+ DatasetTestResultPayload(f'{dataset_base_handler.name}_{single_metadata_name}')
477
+ for single_metadata_name, single_metadata_result in raw_result.items()
478
+ ]
479
+ for i, (single_metadata_name, single_metadata_result) in enumerate(raw_result.items()):
480
+ metadata_test_result = metadata_test_result_payloads[i]
481
+
482
+ metadata_type = None
483
+ if single_metadata_result is None:
484
+ if state != DataStateEnum.training and test_result[i].name == f'{dataset_base_handler.name}_{single_metadata_name}':
485
+ metadata_test_result_payloads[i] = test_result[i]
486
+ continue
487
+
488
+ if dataset_base_handler.metadata_type is None:
489
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
490
+ elif isinstance(dataset_base_handler.metadata_type, dict):
491
+ if single_metadata_name not in dataset_base_handler.metadata_type:
492
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
493
+ metadata_type = dataset_base_handler.metadata_type[single_metadata_name]
494
+ else:
495
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
496
+
497
+ result_shape = get_shape(single_metadata_result)
498
+ metadata_test_result.shape = result_shape
499
+ metadata_test_result.raw_result = (
500
+ single_metadata_result) if single_metadata_result is not None else metadata_type
501
+ metadata_test_result.handler_type = handler_type
502
+ test_result = metadata_test_result_payloads
503
+ else:
504
+ if raw_result is None:
505
+ if state != DataStateEnum.training:
506
+ return test_result
507
+
508
+ if dataset_base_handler.metadata_type is None:
509
+ raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
510
+ elif isinstance(dataset_base_handler.metadata_type, dict):
511
+ raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
512
+ metadata_type = dataset_base_handler.metadata_type
513
+
514
+ result_shape = get_shape(raw_result)
515
+ test_result[0].shape = result_shape
516
+ test_result[0].raw_result = raw_result if raw_result is not None else metadata_type
517
+ test_result[0].handler_type = handler_type
485
518
  else:
486
519
  result_shape = get_shape(raw_result)
487
520
  test_result[0].shape = result_shape
@@ -500,7 +533,7 @@ class LeapBinder:
500
533
  for state, preprocess_response in preprocess_result.items():
501
534
  if state == DataStateEnum.unlabeled and isinstance(dataset_base_handler, GroundTruthHandler):
502
535
  continue
503
- self.check_handler(preprocess_response, test_result, dataset_base_handler)
536
+ self.check_handler(preprocess_response, test_result, dataset_base_handler, state)
504
537
 
505
538
  def check(self) -> None:
506
539
  preprocess_result = self.get_preprocess_result()
@@ -9,7 +9,7 @@ from code_loader.contract.datasetclasses import CustomCallableInterfaceMultiArgs
9
9
  CustomMultipleReturnCallableInterfaceMultiArgs, ConfusionMatrixCallableInterfaceMultiArgs, CustomCallableInterface, \
10
10
  VisualizerCallableInterface, MetadataSectionCallableInterface, PreprocessResponse, SectionCallableInterface, \
11
11
  ConfusionMatrixElement, SamplePreprocessResponse
12
- from code_loader.contract.enums import MetricDirection, LeapDataType
12
+ from code_loader.contract.enums import MetricDirection, LeapDataType, DatasetMetadataType
13
13
  from code_loader import leap_binder
14
14
  from code_loader.contract.visualizer_classes import LeapImage, LeapImageMask, LeapTextMask, LeapText, LeapGraph, \
15
15
  LeapHorizontalBar, LeapImageWithBBox, LeapImageWithHeatmap
@@ -160,14 +160,15 @@ def tensorleap_custom_visualizer(name: str, visualizer_type: LeapDataType,
160
160
  return decorating_function
161
161
 
162
162
 
163
- def tensorleap_metadata(name: str):
163
+ def tensorleap_metadata(
164
+ name: str, metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None):
164
165
  def decorating_function(user_function: MetadataSectionCallableInterface):
165
166
  for metadata_handler in leap_binder.setup_container.metadata:
166
167
  if metadata_handler.name == name:
167
168
  raise Exception(f'Metadata with name {name} already exists. '
168
169
  f'Please choose another')
169
170
 
170
- leap_binder.set_metadata(user_function, name)
171
+ leap_binder.set_metadata(user_function, name, metadata_type)
171
172
 
172
173
  def _validate_input_args(sample_id: Union[int, str], preprocess_response: PreprocessResponse):
173
174
  assert isinstance(sample_id, (int, str)), \
@@ -182,7 +183,7 @@ def tensorleap_metadata(name: str):
182
183
  f'{preprocess_response.sample_id_type}. Got {type(sample_id)}.')
183
184
 
184
185
  def _validate_result(result):
185
- supported_result_types = (int, str, bool, float, dict, np.floating,
186
+ supported_result_types = (type(None), int, str, bool, float, dict, np.floating,
186
187
  np.bool_, np.unsignedinteger, np.signedinteger, np.integer)
187
188
  assert isinstance(result, supported_result_types), \
188
189
  (f'tensorleap_metadata validation failed: '
code_loader/leaploader.py CHANGED
@@ -6,7 +6,7 @@ import sys
6
6
  from contextlib import redirect_stdout
7
7
  from functools import lru_cache
8
8
  from pathlib import Path
9
- from typing import Dict, List, Iterable, Union, Any, Type, Optional, Callable
9
+ from typing import Dict, List, Iterable, Union, Any, Type, Optional, Callable, Tuple
10
10
 
11
11
  import numpy as np
12
12
  import numpy.typing as npt
@@ -140,9 +140,11 @@ class LeapLoader(LeapLoaderBase):
140
140
  if state == DataStateEnum.unlabeled and sample_id not in preprocess_result[state].sample_ids:
141
141
  self._preprocess_result(update_unlabeled_preprocess=True)
142
142
 
143
+ metadata, metadata_is_none = self._get_metadata(state, sample_id)
143
144
  sample = DatasetSample(inputs=self._get_inputs(state, sample_id),
144
145
  gt=None if state == DataStateEnum.unlabeled else self._get_gt(state, sample_id),
145
- metadata=self._get_metadata(state, sample_id),
146
+ metadata=metadata,
147
+ metadata_is_none=metadata_is_none,
146
148
  index=sample_id,
147
149
  state=state)
148
150
  return sample
@@ -210,7 +212,7 @@ class LeapLoader(LeapLoaderBase):
210
212
  state_name = state.name
211
213
  try:
212
214
  test_result = global_leap_binder.check_handler(
213
- preprocess_response, test_result, dataset_base_handler)
215
+ preprocess_response, test_result, dataset_base_handler, state)
214
216
  except Exception as e:
215
217
  line_number, file_name, stacktrace = get_root_exception_file_and_line_number()
216
218
  test_result[0].display[
@@ -339,6 +341,11 @@ class LeapLoader(LeapLoaderBase):
339
341
  continue
340
342
  if hasattr(handler_test_payload.raw_result, 'tolist'):
341
343
  handler_test_payload.raw_result = handler_test_payload.raw_result.tolist()
344
+ if isinstance(handler_test_payload.raw_result, DatasetMetadataType):
345
+ dataset_metadata_type = handler_test_payload.raw_result
346
+ metadata_instances.append(DatasetMetadataInstance(name=handler_test_payload.name,
347
+ type=dataset_metadata_type))
348
+ continue
342
349
  metadata_type = type(handler_test_payload.raw_result)
343
350
  if metadata_type == int or isinstance(handler_test_payload.raw_result,
344
351
  (np.unsignedinteger, np.signedinteger)):
@@ -438,7 +445,7 @@ class LeapLoader(LeapLoaderBase):
438
445
  }
439
446
  return metadata_name_to_type
440
447
 
441
- def _convert_metadata_to_correct_type(self, metadata_name: str, value: Any) -> Any:
448
+ def _convert_metadata_to_correct_type(self, metadata_name: str, value: Any) -> Tuple[Any, bool]:
442
449
  metadata_name_to_type = self._metadata_name_to_type()
443
450
  metadata_type_to_python_type = {
444
451
  DatasetMetadataType.float: float,
@@ -447,22 +454,26 @@ class LeapLoader(LeapLoaderBase):
447
454
  DatasetMetadataType.int: int
448
455
  }
449
456
  metadata_type_to_default_value = {
450
- DatasetMetadataType.float: -1,
451
- DatasetMetadataType.string: "",
457
+ DatasetMetadataType.float: -1.0,
458
+ DatasetMetadataType.string: 'None',
452
459
  DatasetMetadataType.boolean: False,
453
460
  DatasetMetadataType.int: -1
454
461
  }
455
462
 
456
463
  try:
464
+ is_none = False
465
+ if value is None:
466
+ raise ValueError()
457
467
  converted_value = metadata_type_to_python_type[metadata_name_to_type[metadata_name]](value)
458
468
  except ValueError:
469
+ is_none = True
459
470
  converted_value = metadata_type_to_default_value[metadata_name_to_type[metadata_name]]
460
471
 
461
- return converted_value
472
+ return converted_value, is_none
462
473
 
463
- def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Dict[
464
- str, Union[str, int, bool, float]]:
474
+ def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
465
475
  result_agg = {}
476
+ is_none = {}
466
477
  preprocess_result = self._preprocess_result()
467
478
  preprocess_state = preprocess_result[state]
468
479
  for handler in global_leap_binder.setup_container.metadata:
@@ -470,13 +481,14 @@ class LeapLoader(LeapLoaderBase):
470
481
  if isinstance(handler_result, dict):
471
482
  for single_metadata_name, single_metadata_result in handler_result.items():
472
483
  handler_name = f'{handler.name}_{single_metadata_name}'
473
- result_agg[handler_name] = self._convert_metadata_to_correct_type(handler_name,
474
- single_metadata_result)
484
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
485
+ handler_name, single_metadata_result)
475
486
  else:
476
487
  handler_name = handler.name
477
- result_agg[handler_name] = self._convert_metadata_to_correct_type(handler_name, handler_result)
488
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
489
+ handler_name, handler_result)
478
490
 
479
- return result_agg
491
+ return result_agg, is_none
480
492
 
481
493
  @lru_cache()
482
494
  def get_sample_id_type(self) -> Type:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: code-loader
3
- Version: 1.0.77.1
3
+ Version: 1.0.78
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=t1pvW68dVIbYB0bllqxHXO6jOgHCJI5NGn9rSrYC6Vw,7722
4
+ code_loader/contract/datasetclasses.py,sha256=BjT7NoOBgWtBXtMRedKwwnC-vbHg-KHKqFL11GdgUx8,7902
5
5
  code_loader/contract/enums.py,sha256=6Lo7p5CUog68Fd31bCozIuOgIp_IhSiPqWWph2k3OGU,1602
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=0l9zjlF27tZwg6SnpyqVoAAgf9QHQcKpR9lg7vho2Xw,27065
23
- code_loader/inner_leap_binder/leapbinder_decorators.py,sha256=mkgQF5YBMlw5_1JXj7LnhDQpRqlq-8kvP7uFvB3DTRo,21904
24
- code_loader/leaploader.py,sha256=KkAPKyzZxZYI135_67q63ICVVERu7WH60liB0pboA-c,24983
22
+ code_loader/inner_leap_binder/leapbinder.py,sha256=3C8Vzk-O2opVQ5FU16uX7GM57RX64mziMiyW6h3fRgo,29367
23
+ code_loader/inner_leap_binder/leapbinder_decorators.py,sha256=HUIVrI-I0aB-nQl7lZErE5vuhml7A8MMGaw_R4U4QCk,22053
24
+ code_loader/leaploader.py,sha256=AUx6iqJK9DzIrdDGvfM3cWNejoK7aDTsU_ShhphVrfM,25679
25
25
  code_loader/leaploaderbase.py,sha256=VH0vddRmkqLtcDlYPCO7hfz1_VbKo43lUdHDAbd4iJc,4198
26
26
  code_loader/utils.py,sha256=aw2i_fqW_ADjLB66FWZd9DfpCQ7mPdMyauROC5Nd51I,2197
27
27
  code_loader/visualizers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  code_loader/visualizers/default_visualizers.py,sha256=Ffx5VHVOe5ujBOsjBSxN_aIEVwFSQ6gbhTMG5aUS-po,2305
29
- code_loader-1.0.77.1.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
30
- code_loader-1.0.77.1.dist-info/METADATA,sha256=ko-pD3mbQoKtxXhbVRaxEsrAOWpqYacD-791pEGkabU,851
31
- code_loader-1.0.77.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
32
- code_loader-1.0.77.1.dist-info/RECORD,,
29
+ code_loader-1.0.78.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
30
+ code_loader-1.0.78.dist-info/METADATA,sha256=EfiPvcKzkE4v7DblDFb6-kpVDBXz_pquAep0j7FTAQ4,849
31
+ code_loader-1.0.78.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
32
+ code_loader-1.0.78.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any