code-loader 1.0.93.dev0__tar.gz → 1.0.93.dev3__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.

Potentially problematic release.


This version of code-loader might be problematic. Click here for more details.

Files changed (32) hide show
  1. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/PKG-INFO +1 -1
  2. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/datasetclasses.py +6 -1
  3. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/inner_leap_binder/leapbinder_decorators.py +156 -15
  4. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/leaploader.py +11 -7
  5. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/utils.py +1 -26
  6. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/pyproject.toml +1 -1
  7. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/LICENSE +0 -0
  8. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/README.md +0 -0
  9. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/__init__.py +0 -0
  10. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/__init__.py +0 -0
  11. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/enums.py +0 -0
  12. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/exceptions.py +0 -0
  13. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/mapping.py +0 -0
  14. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/responsedataclasses.py +0 -0
  15. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/contract/visualizer_classes.py +0 -0
  16. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/default_losses.py +0 -0
  17. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/default_metrics.py +0 -0
  18. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/__init__.py +0 -0
  19. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/api.py +0 -0
  20. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/cli_config_utils.py +0 -0
  21. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/client.py +0 -0
  22. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/epoch.py +0 -0
  23. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/experiment.py +0 -0
  24. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/experiment_context.py +0 -0
  25. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/types.py +0 -0
  26. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/utils.py +0 -0
  27. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  28. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/inner_leap_binder/__init__.py +0 -0
  29. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  30. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/code_loader/visualizers/__init__.py +0 -0
  32. {code_loader-1.0.93.dev0 → code_loader-1.0.93.dev3}/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.93.dev0
3
+ Version: 1.0.93.dev3
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -40,6 +40,9 @@ class PreprocessResponse:
40
40
  sample_id_type: Optional[Union[Type[str], Type[int]]] = None
41
41
 
42
42
  def __post_init__(self) -> None:
43
+ def is_valid_string(s: str) -> bool:
44
+ return bool(re.match(r'^[A-Za-z0-9_]+$', s))
45
+
43
46
  if self.length is not None and self.sample_ids is None:
44
47
  self.sample_ids = [i for i in range(self.length)]
45
48
  self.sample_id_type = int
@@ -50,6 +53,8 @@ class PreprocessResponse:
50
53
  if self.sample_id_type == str:
51
54
  for sample_id in self.sample_ids:
52
55
  assert isinstance(sample_id, str), f"Sample id should be of type str. Got: {type(sample_id)}"
56
+ if not is_valid_string(sample_id):
57
+ raise Exception(f"Sample id should contain only letters (A-Z, a-z), numbers or '_'. Got: {sample_id}")
53
58
  else:
54
59
  raise Exception("length is deprecated.")
55
60
 
@@ -200,7 +205,7 @@ class MetadataHandler:
200
205
  class PredictionTypeHandler:
201
206
  name: str
202
207
  labels: List[str]
203
- channel_dim: int
208
+ channel_dim: int = -1
204
209
 
205
210
 
206
211
  @dataclass
@@ -1,5 +1,5 @@
1
1
  # mypy: ignore-errors
2
-
2
+ import os
3
3
  from typing import Optional, Union, Callable, List, Dict
4
4
 
5
5
  import numpy as np
@@ -8,7 +8,7 @@ import numpy.typing as npt
8
8
  from code_loader.contract.datasetclasses import CustomCallableInterfaceMultiArgs, \
9
9
  CustomMultipleReturnCallableInterfaceMultiArgs, ConfusionMatrixCallableInterfaceMultiArgs, CustomCallableInterface, \
10
10
  VisualizerCallableInterface, MetadataSectionCallableInterface, PreprocessResponse, SectionCallableInterface, \
11
- ConfusionMatrixElement, SamplePreprocessResponse
11
+ ConfusionMatrixElement, SamplePreprocessResponse, PredictionTypeHandler
12
12
  from code_loader.contract.enums import MetricDirection, LeapDataType, DatasetMetadataType
13
13
  from code_loader import leap_binder
14
14
  from code_loader.contract.mapping import NodeMapping, NodeMappingType, NodeConnection
@@ -16,14 +16,77 @@ from code_loader.contract.visualizer_classes import LeapImage, LeapImageMask, Le
16
16
  LeapHorizontalBar, LeapImageWithBBox, LeapImageWithHeatmap
17
17
 
18
18
 
19
+ mapping_runtime_mode_env_var_mame = '__mapping_runtime_mode__'
20
+
21
+
22
+ def _add_mapping_connection(user_unique_name, connection_destinations, arg_names, name, node_mapping_type):
23
+ main_node_mapping = NodeMapping(name, node_mapping_type, user_unique_name, arg_names=arg_names)
24
+ node_inputs = {}
25
+ for arg_name, destination in zip(arg_names, connection_destinations):
26
+ node_inputs[arg_name] = destination.node_mapping
27
+
28
+ leap_binder.mapping_connections.append(NodeConnection(main_node_mapping, node_inputs))
29
+
30
+
19
31
  def _add_mapping_connections(connects_to, arg_names, node_mapping_type, name):
20
32
  for user_unique_name, connection_destinations in connects_to.items():
21
- main_node_mapping = NodeMapping(name, node_mapping_type, user_unique_name, arg_names=arg_names)
22
- node_inputs = {}
23
- for arg_name, destination in zip(arg_names, connection_destinations):
24
- node_inputs[arg_name] = destination.node_mapping
33
+ _add_mapping_connection(user_unique_name, connection_destinations, arg_names, name, node_mapping_type)
34
+
35
+
36
+
37
+
38
+ def tensorleap_load_model(prediction_types: Optional[List[PredictionTypeHandler]] = None):
39
+ for i, prediction_type in enumerate(prediction_types):
40
+ leap_binder.add_prediction(prediction_type.name, prediction_type.labels, prediction_type.channel_dim, i)
41
+
42
+ def decorating_function(load_model_func):
43
+ class TempMapping:
44
+ pass
45
+
46
+ def mapping_inner():
47
+ class ModelOutputPlaceholder:
48
+ def __init__(self):
49
+ self.node_mapping = NodeMapping('', NodeMappingType.Prediction0)
50
+
51
+ def __getitem__(self, key):
52
+ assert isinstance(key, int), \
53
+ f'Expected key to be an int, got {type(key)} instead.'
54
+
55
+ ret = TempMapping()
56
+ ret.node_mapping = NodeMapping('', NodeMappingType(f'Prediction{str(key)}'))
57
+ return ret
58
+
59
+ class ModelPlaceholder:
60
+ #keras interface
61
+ def __call__(self, arg):
62
+ if isinstance(arg, list):
63
+ for i, elem in enumerate(arg):
64
+ elem.node_mapping.type = NodeMappingType[f'Input{str(i)}']
65
+ else:
66
+ arg.node_mapping.type = NodeMappingType.Input0
67
+
68
+ return ModelOutputPlaceholder()
69
+
70
+ # onnx runtime interface
71
+ def run(self, output_names, input_dict):
72
+ assert output_names is None
73
+ assert isinstance(input_dict, dict), \
74
+ f'Expected input_dict to be a dict, got {type(input_dict)} instead.'
75
+ for i, elem in enumerate(input_dict.values()):
76
+ elem.node_mapping.type = NodeMappingType[f'Input{str(i)}']
77
+
78
+ return ModelOutputPlaceholder()
79
+
80
+ return ModelPlaceholder()
81
+
82
+
83
+ if os.environ[mapping_runtime_mode_env_var_mame]:
84
+ return mapping_inner
85
+ else:
86
+ return load_model_func
87
+
88
+ return decorating_function
25
89
 
26
- leap_binder.mapping_connections.append(NodeConnection(main_node_mapping, node_inputs))
27
90
 
28
91
 
29
92
  def tensorleap_custom_metric(name: str,
@@ -31,8 +94,8 @@ def tensorleap_custom_metric(name: str,
31
94
  compute_insights: Optional[Union[bool, Dict[str, bool]]] = None,
32
95
  connects_to=None):
33
96
  def decorating_function(user_function: Union[CustomCallableInterfaceMultiArgs,
34
- CustomMultipleReturnCallableInterfaceMultiArgs,
35
- ConfusionMatrixCallableInterfaceMultiArgs]):
97
+ CustomMultipleReturnCallableInterfaceMultiArgs,
98
+ ConfusionMatrixCallableInterfaceMultiArgs]):
36
99
  for metric_handler in leap_binder.setup_container.metrics:
37
100
  if metric_handler.metric_handler_data.name == name:
38
101
  raise Exception(f'Metric with name {name} already exists. '
@@ -119,14 +182,31 @@ def tensorleap_custom_metric(name: str,
119
182
  (f'tensorleap_custom_metric validation failed: '
120
183
  f'compute_insights should be boolean. Got {type(compute_insights)}.')
121
184
 
122
-
123
185
  def inner(*args, **kwargs):
124
186
  _validate_input_args(*args, **kwargs)
125
187
  result = user_function(*args, **kwargs)
126
188
  _validate_result(result)
127
189
  return result
128
190
 
129
- return inner
191
+ def mapping_inner(*args, **kwargs):
192
+ user_unique_name = mapping_inner.name
193
+ if 'user_unique_name' in kwargs:
194
+ user_unique_name = kwargs['user_unique_name']
195
+
196
+ ordered_connections = [kwargs[n] for n in mapping_inner.arg_names if n in kwargs]
197
+ ordered_connections = list(args) + ordered_connections
198
+ _add_mapping_connection(user_unique_name, ordered_connections, mapping_inner.arg_names,
199
+ mapping_inner.name, NodeMappingType.Metric)
200
+
201
+ return None
202
+
203
+ mapping_inner.arg_names = leap_binder.setup_container.metrics[-1].metric_handler_data.arg_names
204
+ mapping_inner.name = name
205
+
206
+ if os.environ[mapping_runtime_mode_env_var_mame]:
207
+ return mapping_inner
208
+ else:
209
+ return inner
130
210
 
131
211
  return decorating_function
132
212
 
@@ -186,7 +266,25 @@ def tensorleap_custom_visualizer(name: str, visualizer_type: LeapDataType,
186
266
  _validate_result(result)
187
267
  return result
188
268
 
189
- return inner
269
+ def mapping_inner(*args, **kwargs):
270
+ user_unique_name = mapping_inner.name
271
+ if 'user_unique_name' in kwargs:
272
+ user_unique_name = kwargs['user_unique_name']
273
+
274
+ ordered_connections = [kwargs[n] for n in mapping_inner.arg_names if n in kwargs]
275
+ ordered_connections = list(args) + ordered_connections
276
+ _add_mapping_connection(user_unique_name, ordered_connections, mapping_inner.arg_names,
277
+ mapping_inner.name, NodeMappingType.Visualizer)
278
+
279
+ return None
280
+
281
+ mapping_inner.arg_names = leap_binder.setup_container.visualizers[-1].visualizer_handler_data.arg_names
282
+ mapping_inner.name = name
283
+
284
+ if os.environ[mapping_runtime_mode_env_var_mame]:
285
+ return mapping_inner
286
+ else:
287
+ return inner
190
288
 
191
289
  return decorating_function
192
290
 
@@ -340,7 +438,21 @@ def tensorleap_input_encoder(name: str, channel_dim=-1, model_input_index=None):
340
438
  node_mapping_type = NodeMappingType(f'Input{str(model_input_index)}')
341
439
  inner.node_mapping = NodeMapping(name, node_mapping_type)
342
440
 
343
- return inner
441
+
442
+ def mapping_inner(*args, **kwargs):
443
+ class TempMapping:
444
+ pass
445
+ ret = TempMapping()
446
+ ret.node_mapping = mapping_inner.node_mapping
447
+
448
+ return ret
449
+
450
+ mapping_inner.node_mapping = NodeMapping(name, node_mapping_type)
451
+
452
+ if os.environ[mapping_runtime_mode_env_var_mame]:
453
+ return mapping_inner
454
+ else:
455
+ return inner
344
456
 
345
457
  return decorating_function
346
458
 
@@ -382,9 +494,20 @@ def tensorleap_gt_encoder(name: str):
382
494
 
383
495
  inner.node_mapping = NodeMapping(name, NodeMappingType.GroundTruth)
384
496
 
385
- return inner
497
+ def mapping_inner(*args, **kwargs):
498
+ class TempMapping:
499
+ pass
500
+ ret = TempMapping()
501
+ ret.node_mapping = mapping_inner.node_mapping
502
+
503
+ return ret
386
504
 
505
+ mapping_inner.node_mapping = NodeMapping(name, NodeMappingType.GroundTruth)
387
506
 
507
+ if os.environ[mapping_runtime_mode_env_var_mame]:
508
+ return mapping_inner
509
+ else:
510
+ return inner
388
511
 
389
512
  return decorating_function
390
513
 
@@ -440,7 +563,25 @@ def tensorleap_custom_loss(name: str, connects_to=None):
440
563
  _validate_result(result)
441
564
  return result
442
565
 
443
- return inner
566
+ def mapping_inner(*args, **kwargs):
567
+ user_unique_name = mapping_inner.name
568
+ if 'user_unique_name' in kwargs:
569
+ user_unique_name = kwargs['user_unique_name']
570
+
571
+ ordered_connections = [kwargs[n] for n in mapping_inner.arg_names if n in kwargs]
572
+ ordered_connections = list(args) + ordered_connections
573
+ _add_mapping_connection(user_unique_name, ordered_connections, mapping_inner.arg_names,
574
+ mapping_inner.name, NodeMappingType.CustomLoss)
575
+
576
+ return None
577
+
578
+ mapping_inner.arg_names = leap_binder.setup_container.custom_loss_handlers[-1].custom_loss_handler_data.arg_names
579
+ mapping_inner.name = name
580
+
581
+ if os.environ[mapping_runtime_mode_env_var_mame]:
582
+ return mapping_inner
583
+ else:
584
+ return inner
444
585
 
445
586
  return decorating_function
446
587
 
@@ -23,7 +23,7 @@ from code_loader.contract.responsedataclasses import DatasetIntegParseResult, Da
23
23
  EngineFileContract
24
24
  from code_loader.inner_leap_binder import global_leap_binder
25
25
  from code_loader.leaploaderbase import LeapLoaderBase
26
- from code_loader.utils import get_root_exception_file_and_line_number, flatten
26
+ from code_loader.utils import get_root_exception_file_and_line_number
27
27
 
28
28
 
29
29
  class LeapLoader(LeapLoaderBase):
@@ -477,18 +477,22 @@ class LeapLoader(LeapLoaderBase):
477
477
 
478
478
  return converted_value, is_none
479
479
 
480
- def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[
481
- Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
480
+ def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
482
481
  result_agg = {}
483
482
  is_none = {}
484
483
  preprocess_result = self._preprocess_result()
485
484
  preprocess_state = preprocess_result[state]
486
485
  for handler in global_leap_binder.setup_container.metadata:
487
486
  handler_result = handler.function(sample_id, preprocess_state)
488
-
489
- for flat_name, flat_result in flatten(handler_result, prefix=handler.name):
490
- result_agg[flat_name], is_none[flat_name] = self._convert_metadata_to_correct_type(
491
- flat_name, flat_result)
487
+ if isinstance(handler_result, dict):
488
+ for single_metadata_name, single_metadata_result in handler_result.items():
489
+ handler_name = f'{handler.name}_{single_metadata_name}'
490
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
491
+ handler_name, single_metadata_result)
492
+ else:
493
+ handler_name = handler.name
494
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
495
+ handler_name, handler_result)
492
496
 
493
497
  return result_agg, is_none
494
498
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.93.dev0"
3
+ version = "1.0.93.dev3"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"