code-loader 1.0.77__tar.gz → 1.0.77.dev2__tar.gz

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.
Files changed (31) hide show
  1. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/PKG-INFO +1 -1
  2. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/contract/datasetclasses.py +4 -2
  3. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/inner_leap_binder/leapbinder.py +50 -17
  4. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/inner_leap_binder/leapbinder_decorators.py +5 -4
  5. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/leaploader.py +14 -8
  6. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/pyproject.toml +1 -1
  7. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/LICENSE +0 -0
  8. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/README.md +0 -0
  9. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/__init__.py +0 -0
  10. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/contract/__init__.py +0 -0
  11. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/contract/enums.py +0 -0
  12. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/contract/exceptions.py +0 -0
  13. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/contract/responsedataclasses.py +0 -0
  14. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/contract/visualizer_classes.py +0 -0
  15. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/default_losses.py +0 -0
  16. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/default_metrics.py +0 -0
  17. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/__init__.py +0 -0
  18. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/api.py +0 -0
  19. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/cli_config_utils.py +0 -0
  20. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/client.py +0 -0
  21. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/epoch.py +0 -0
  22. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/experiment.py +0 -0
  23. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/experiment_context.py +0 -0
  24. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/types.py +0 -0
  25. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/utils.py +0 -0
  26. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  27. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/inner_leap_binder/__init__.py +0 -0
  28. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/leaploaderbase.py +0 -0
  29. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/utils.py +0 -0
  30. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/visualizers/__init__.py +0 -0
  31. {code_loader-1.0.77 → code_loader-1.0.77.dev2}/code_loader/visualizers/default_visualizers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: code-loader
3
- Version: 1.0.77
3
+ Version: 1.0.77.dev2
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -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,6 @@ 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]]]
236
238
  index: Union[int, str]
237
239
  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
@@ -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: '
@@ -46,7 +46,7 @@ class LeapLoader(LeapLoaderBase):
46
46
 
47
47
  def evaluate_module(self) -> None:
48
48
  def append_path_recursively(full_path: str) -> None:
49
- if self.code_path not in full_path or full_path == '/':
49
+ if '/' not in full_path or full_path == '/':
50
50
  return
51
51
 
52
52
  parent_path = str(Path(full_path).parent)
@@ -210,7 +210,7 @@ class LeapLoader(LeapLoaderBase):
210
210
  state_name = state.name
211
211
  try:
212
212
  test_result = global_leap_binder.check_handler(
213
- preprocess_response, test_result, dataset_base_handler)
213
+ preprocess_response, test_result, dataset_base_handler, state)
214
214
  except Exception as e:
215
215
  line_number, file_name, stacktrace = get_root_exception_file_and_line_number()
216
216
  test_result[0].display[
@@ -339,6 +339,11 @@ class LeapLoader(LeapLoaderBase):
339
339
  continue
340
340
  if hasattr(handler_test_payload.raw_result, 'tolist'):
341
341
  handler_test_payload.raw_result = handler_test_payload.raw_result.tolist()
342
+ if isinstance(handler_test_payload.raw_result, DatasetMetadataType):
343
+ dataset_metadata_type = handler_test_payload.raw_result
344
+ metadata_instances.append(DatasetMetadataInstance(name=handler_test_payload.name,
345
+ type=dataset_metadata_type))
346
+ continue
342
347
  metadata_type = type(handler_test_payload.raw_result)
343
348
  if metadata_type == int or isinstance(handler_test_payload.raw_result,
344
349
  (np.unsignedinteger, np.signedinteger)):
@@ -447,21 +452,22 @@ class LeapLoader(LeapLoaderBase):
447
452
  DatasetMetadataType.int: int
448
453
  }
449
454
  metadata_type_to_default_value = {
450
- DatasetMetadataType.float: -1,
451
- DatasetMetadataType.string: "",
452
- DatasetMetadataType.boolean: False,
453
- DatasetMetadataType.int: -1
455
+ DatasetMetadataType.float: np.nan,
456
+ DatasetMetadataType.string: 'None',
457
+ DatasetMetadataType.boolean: np.nan,
458
+ DatasetMetadataType.int: np.nan
454
459
  }
455
460
 
456
461
  try:
462
+ if value is None:
463
+ raise ValueError()
457
464
  converted_value = metadata_type_to_python_type[metadata_name_to_type[metadata_name]](value)
458
465
  except ValueError:
459
466
  converted_value = metadata_type_to_default_value[metadata_name_to_type[metadata_name]]
460
467
 
461
468
  return converted_value
462
469
 
463
- def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Dict[
464
- str, Union[str, int, bool, float]]:
470
+ def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Dict[str, Union[str, int, bool, float]]:
465
471
  result_agg = {}
466
472
  preprocess_result = self._preprocess_result()
467
473
  preprocess_state = preprocess_result[state]
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.77"
3
+ version = "1.0.77.dev2"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"
File without changes