code-loader 1.0.72__tar.gz → 1.0.72.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.72 → code_loader-1.0.72.dev2}/PKG-INFO +1 -1
  2. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/contract/datasetclasses.py +6 -1
  3. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/inner_leap_binder/leapbinder.py +16 -10
  4. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/inner_leap_binder/leapbinder_decorators.py +2 -16
  5. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/leaploader.py +13 -3
  6. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/leaploaderbase.py +4 -1
  7. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/pyproject.toml +1 -1
  8. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/LICENSE +0 -0
  9. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/README.md +0 -0
  10. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/__init__.py +0 -0
  11. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/contract/__init__.py +0 -0
  12. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/contract/enums.py +0 -0
  13. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/contract/exceptions.py +0 -0
  14. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/contract/responsedataclasses.py +0 -0
  15. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/contract/visualizer_classes.py +0 -0
  16. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/default_losses.py +0 -0
  17. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/default_metrics.py +0 -0
  18. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/__init__.py +0 -0
  19. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/api.py +0 -0
  20. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/cli_config_utils.py +0 -0
  21. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/client.py +0 -0
  22. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/epoch.py +0 -0
  23. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/experiment.py +0 -0
  24. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/experiment_context.py +0 -0
  25. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/types.py +0 -0
  26. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/utils.py +0 -0
  27. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  28. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/inner_leap_binder/__init__.py +0 -0
  29. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/utils.py +0 -0
  30. {code_loader-1.0.72 → code_loader-1.0.72.dev2}/code_loader/visualizers/__init__.py +0 -0
  31. {code_loader-1.0.72 → code_loader-1.0.72.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.72
3
+ Version: 1.0.72.dev2
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -133,7 +133,6 @@ class MetricHandlerData:
133
133
  name: str
134
134
  arg_names: List[str]
135
135
  direction: Union[None, MetricDirection, Dict[str, MetricDirection]] = MetricDirection.Downward
136
- compute_insights: Union[bool, Dict[str, bool]] = True
137
136
 
138
137
 
139
138
  @dataclass
@@ -147,6 +146,12 @@ class RawInputsForHeatmap:
147
146
  raw_input_by_vizualizer_arg_name: Dict[str, npt.NDArray[np.float32]]
148
147
 
149
148
 
149
+ @dataclass
150
+ class SamplePreprocessResponse:
151
+ sample_ids: np.array
152
+ preprocess_response: PreprocessResponse
153
+
154
+
150
155
  @dataclass
151
156
  class VisualizerHandlerData:
152
157
  name: str
@@ -10,7 +10,7 @@ from code_loader.contract.datasetclasses import SectionCallableInterface, InputH
10
10
  MetadataSectionCallableInterface, UnlabeledDataPreprocessHandler, CustomLayerHandler, MetricHandler, \
11
11
  CustomCallableInterfaceMultiArgs, ConfusionMatrixCallableInterfaceMultiArgs, LeapData, \
12
12
  CustomMultipleReturnCallableInterfaceMultiArgs, DatasetBaseHandler, custom_latent_space_attribute, \
13
- RawInputsForHeatmap, VisualizerHandlerData, MetricHandlerData, CustomLossHandlerData
13
+ RawInputsForHeatmap, VisualizerHandlerData, MetricHandlerData, CustomLossHandlerData, SamplePreprocessResponse
14
14
  from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection
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
@@ -239,9 +239,19 @@ class LeapBinder:
239
239
 
240
240
  leap_binder.add_custom_loss(custom_loss_function, name='custom_loss')
241
241
  """
242
- arg_names = inspect.getfullargspec(function)[0]
242
+
243
+ regular_arg_names = []
244
+ preprocess_response_arg_name = None
245
+ for arg_name, arg_type in inspect.getfullargspec(function).annotations.items():
246
+ if arg_type == SamplePreprocessResponse:
247
+ if preprocess_response_arg_name is not None:
248
+ raise Exception("only one argument can be of type SamplePreprocessResponse")
249
+ preprocess_response_arg_name = arg_name
250
+ else:
251
+ regular_arg_names.append(arg_name)
252
+
243
253
  self.setup_container.custom_loss_handlers.append(
244
- CustomLossHandler(CustomLossHandlerData(name, arg_names), function))
254
+ CustomLossHandler(CustomLossHandlerData(name, regular_arg_names), function))
245
255
 
246
256
  def add_custom_metric(self,
247
257
  function: Union[CustomCallableInterfaceMultiArgs,
@@ -249,8 +259,7 @@ class LeapBinder:
249
259
  ConfusionMatrixCallableInterfaceMultiArgs],
250
260
  name: str,
251
261
  direction: Optional[
252
- Union[MetricDirection, Dict[str, MetricDirection]]] = MetricDirection.Downward,
253
- compute_insights: Union[bool, Dict[str, bool]] = True) -> None:
262
+ Union[MetricDirection, Dict[str, MetricDirection]]] = MetricDirection.Downward) -> None:
254
263
  """
255
264
  Add a custom metric to the setup.
256
265
 
@@ -259,11 +268,9 @@ class LeapBinder:
259
268
  name (str): The name of the custom metric.
260
269
  direction (Optional[Union[MetricDirection, Dict[str, MetricDirection]]]): The direction of the metric, either
261
270
  MetricDirection.Upward or MetricDirection.Downward, in case custom metric return a dictionary of metrics we can
262
- supply a dictionary of directions correspondingly.
271
+ supply a dictionary of directions correspondingly
263
272
  - MetricDirection.Upward: Indicates that higher values of the metric are better and should be maximized.
264
273
  - MetricDirection.Downward: Indicates that lower values of the metric are better and should be minimized.
265
- compute_insights (Union[bool, Dict[str, bool]]): Whether to compute insights or not. in case custom metric
266
- return a dictionary of metrics we can supply a dictionary of values correspondingly
267
274
 
268
275
 
269
276
 
@@ -274,8 +281,7 @@ class LeapBinder:
274
281
  leap_binder.add_custom_metric(custom_metric_function, name='custom_metric', direction=MetricDirection.Downward)
275
282
  """
276
283
  arg_names = inspect.getfullargspec(function)[0]
277
- metric_handler_data = MetricHandlerData(name, arg_names, direction, compute_insights)
278
- self.setup_container.metrics.append(MetricHandler(metric_handler_data, function))
284
+ self.setup_container.metrics.append(MetricHandler(MetricHandlerData(name, arg_names, direction), function))
279
285
 
280
286
  def add_prediction(self, name: str, labels: List[str], channel_dim: int = -1) -> None:
281
287
  """
@@ -16,8 +16,7 @@ from code_loader.contract.visualizer_classes import LeapImage, LeapImageMask, Le
16
16
 
17
17
 
18
18
  def tensorleap_custom_metric(name: str,
19
- direction: Union[MetricDirection, Dict[str, MetricDirection]] = MetricDirection.Downward,
20
- compute_insights: Union[bool, Dict[str, bool]] = True):
19
+ direction: Union[MetricDirection, Dict[str, MetricDirection]] = MetricDirection.Downward):
21
20
  def decorating_function(user_function: Union[CustomCallableInterfaceMultiArgs,
22
21
  CustomMultipleReturnCallableInterfaceMultiArgs,
23
22
  ConfusionMatrixCallableInterfaceMultiArgs]):
@@ -26,7 +25,7 @@ def tensorleap_custom_metric(name: str,
26
25
  raise Exception(f'Metric with name {name} already exists. '
27
26
  f'Please choose another')
28
27
 
29
- leap_binder.add_custom_metric(user_function, name, direction, compute_insights)
28
+ leap_binder.add_custom_metric(user_function, name, direction)
30
29
 
31
30
  def _validate_input_args(*args, **kwargs) -> None:
32
31
  for i, arg in enumerate(args):
@@ -76,19 +75,6 @@ def tensorleap_custom_metric(name: str,
76
75
  (f'tensorleap_custom_metric validation failed: '
77
76
  f'Keys in the return dict should be of type str. Got {type(key)}.')
78
77
  _validate_single_metric(value)
79
-
80
- if isinstance(direction, dict):
81
- for direction_key in direction:
82
- assert direction_key in result, \
83
- (f'tensorleap_custom_metric validation failed: '
84
- f'Keys in the direction mapping should be part of result keys. Got key {direction_key}.')
85
-
86
- if isinstance(compute_insights, dict):
87
- for ci_key in compute_insights:
88
- assert ci_key in result, \
89
- (f'tensorleap_custom_metric validation failed: '
90
- f'Keys in the compute_insights mapping should be part of result keys. Got key {ci_key}.')
91
-
92
78
  else:
93
79
  _validate_single_metric(result)
94
80
 
@@ -14,7 +14,7 @@ import numpy.typing as npt
14
14
  from code_loader.contract.datasetclasses import DatasetSample, DatasetBaseHandler, GroundTruthHandler, \
15
15
  PreprocessResponse, VisualizerHandler, LeapData, \
16
16
  PredictionTypeHandler, MetadataHandler, CustomLayerHandler, MetricHandler, VisualizerHandlerData, MetricHandlerData, \
17
- MetricCallableReturnType, CustomLossHandlerData, CustomLossHandler, RawInputsForHeatmap
17
+ MetricCallableReturnType, CustomLossHandlerData, CustomLossHandler, RawInputsForHeatmap, SamplePreprocessResponse
18
18
  from code_loader.contract.enums import DataStateEnum, TestingSectionEnum, DataStateType, DatasetMetadataType
19
19
  from code_loader.contract.exceptions import DatasetScriptException
20
20
  from code_loader.contract.responsedataclasses import DatasetIntegParseResult, DatasetTestResultPayload, \
@@ -233,9 +233,19 @@ class LeapLoader(LeapLoaderBase):
233
233
  self._preprocess_result()
234
234
  return self._metric_handler_by_name()[metric_name].function(**input_tensors_by_arg_name)
235
235
 
236
- def run_custom_loss(self, custom_loss_name: str,
236
+ def run_custom_loss(self, custom_loss_name: str, sample_ids: np.array, state: DataStateEnum,
237
237
  input_tensors_by_arg_name: Dict[str, npt.NDArray[np.float32]]):
238
- return self._custom_loss_handler_by_name()[custom_loss_name].function(**input_tensors_by_arg_name)
238
+
239
+ custom_loss_handler = self._custom_loss_handler_by_name()[custom_loss_name]
240
+ preprocess_response_arg_name = None
241
+ for arg_name, arg_type in inspect.getfullargspec(custom_loss_handler.function).annotations.items():
242
+ if arg_type == SamplePreprocessResponse:
243
+ preprocess_response_arg_name = arg_name
244
+ break
245
+
246
+ if preprocess_response_arg_name is not None:
247
+ input_tensors_by_arg_name[preprocess_response_arg_name] = SamplePreprocessResponse(sample_ids, self._preprocess_result()[state])
248
+ return custom_loss_handler.function(**input_tensors_by_arg_name)
239
249
 
240
250
  def run_visualizer(self, visualizer_name: str, input_tensors_by_arg_name: Dict[str, npt.NDArray[np.float32]]) -> LeapData:
241
251
  # running preprocessing to sync preprocessing in main thread (can be valuable when preprocess is filling a
@@ -20,6 +20,9 @@ class LeapLoaderBase:
20
20
  self.code_entry_name = code_entry_name
21
21
  self.code_path = code_path
22
22
 
23
+ self.current_working_sample_ids: Optional[np.array] = None
24
+ self.current_working_state: Optional[DataStateEnum] = None
25
+
23
26
  @abstractmethod
24
27
  def metric_by_name(self) -> Dict[str, MetricHandlerData]:
25
28
  pass
@@ -58,7 +61,7 @@ class LeapLoaderBase:
58
61
  pass
59
62
 
60
63
  @abstractmethod
61
- def run_custom_loss(self, custom_loss_name: str,
64
+ def run_custom_loss(self, custom_loss_name: str, sample_ids: np.array, state: DataStateEnum,
62
65
  input_tensors_by_arg_name: Dict[str, npt.NDArray[np.float32]]):
63
66
  pass
64
67
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.72"
3
+ version = "1.0.72.dev2"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"
File without changes