code-loader 1.0.170__tar.gz → 1.0.172.dev1__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 (36) hide show
  1. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/PKG-INFO +1 -1
  2. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/datasetclasses.py +31 -2
  3. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/inner_leap_binder/leapbinder_decorators.py +2 -3
  4. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/mixpanel_tracker.py +20 -0
  5. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/pyproject.toml +1 -1
  6. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/LICENSE +0 -0
  7. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/README.md +0 -0
  8. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/__init__.py +0 -0
  9. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/__init__.py +0 -0
  10. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/enums.py +0 -0
  11. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/exceptions.py +0 -0
  12. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/mapping.py +0 -0
  13. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/responsedataclasses.py +0 -0
  14. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/contract/visualizer_classes.py +0 -0
  15. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/default_losses.py +0 -0
  16. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/default_metrics.py +0 -0
  17. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/__init__.py +0 -0
  18. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/api.py +0 -0
  19. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/cli_config_utils.py +0 -0
  20. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/client.py +0 -0
  21. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/epoch.py +0 -0
  22. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/experiment.py +0 -0
  23. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/experiment_context.py +0 -0
  24. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/types.py +0 -0
  25. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/utils.py +0 -0
  26. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  27. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/inner_leap_binder/__init__.py +0 -0
  28. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  29. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/leaploader.py +0 -0
  30. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/plot_functions/__init__.py +0 -0
  32. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/plot_functions/plot_functions.py +0 -0
  33. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/plot_functions/visualize.py +0 -0
  34. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/utils.py +0 -0
  35. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/code_loader/visualizers/__init__.py +0 -0
  36. {code_loader-1.0.170 → code_loader-1.0.172.dev1}/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.170
3
+ Version: 1.0.172.dev1
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  import warnings
2
2
  from dataclasses import dataclass, field
3
- from typing import Any, Callable, List, Optional, Dict, Union, Type, Literal
3
+ from typing import Any, Callable, Iterable, List, Optional, Dict, Union, Type, Literal, Tuple
4
4
  import re
5
5
  import numpy as np
6
6
  import numpy.typing as npt
@@ -165,6 +165,36 @@ class MetricHandlerData:
165
165
  compute_insights: Optional[Union[bool, Dict[str, bool]]] = None
166
166
 
167
167
 
168
+ def normalize_metric_handler_settings(
169
+ direction: Union[None, MetricDirection, Dict[str, MetricDirection]],
170
+ compute_insights: Optional[Union[bool, Dict[str, bool]]],
171
+ result_keys: Iterable[str],
172
+ ) -> Tuple[Union[None, MetricDirection, Dict[str, MetricDirection]], Optional[Union[bool, Dict[str, bool]]]]:
173
+ ordered_result_keys = list(result_keys)
174
+ if not ordered_result_keys:
175
+ return direction, compute_insights
176
+
177
+ normalized_direction = direction
178
+ if isinstance(direction, MetricDirection):
179
+ normalized_direction = {key: direction for key in ordered_result_keys}
180
+ elif isinstance(direction, dict):
181
+ normalized_direction = {
182
+ key: direction.get(key, MetricDirection.Downward)
183
+ for key in ordered_result_keys
184
+ }
185
+
186
+ normalized_compute_insights = compute_insights
187
+ if isinstance(compute_insights, bool):
188
+ normalized_compute_insights = {key: compute_insights for key in ordered_result_keys}
189
+ elif isinstance(compute_insights, dict):
190
+ normalized_compute_insights = {
191
+ key: compute_insights.get(key, True)
192
+ for key in ordered_result_keys
193
+ }
194
+
195
+ return normalized_direction, normalized_compute_insights
196
+
197
+
168
198
  @dataclass
169
199
  class MetricHandler:
170
200
  metric_handler_data: MetricHandlerData
@@ -272,4 +302,3 @@ class DatasetSample:
272
302
  state: DataStateEnum
273
303
  custom_latent_space: Optional[npt.NDArray[np.float32]] = None
274
304
  instance_masks: Optional[Dict[str, ElementInstance]] = None
275
-
@@ -961,9 +961,8 @@ def tensorleap_metadata(
961
961
  def _validate_result(result):
962
962
  supported_result_types = (type(None), int, str, bool, float, dict, np.floating,
963
963
  np.bool_, np.unsignedinteger, np.signedinteger, np.integer)
964
- if isinstance(result, tuple):
965
- validate_output_structure(result, func_name=user_function.__name__,
966
- expected_type_name=supported_result_types)
964
+ validate_output_structure(result, func_name=user_function.__name__,
965
+ expected_type_name=supported_result_types)
967
966
  assert isinstance(result, supported_result_types), \
968
967
  (f'{user_function.__name__}() validation failed: '
969
968
  f'Unsupported return type. Got {type(result)}. should be any of {str(supported_result_types)}')
@@ -13,6 +13,7 @@ import mixpanel # type: ignore[import]
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
15
  TRACKING_VERSION = '1'
16
+ TL_DISABLE_ANALYTICS_ENV_VAR = 'TL_DISABLE_ANALYTICS'
16
17
 
17
18
 
18
19
  class AnalyticsEvent(str, Enum):
@@ -143,6 +144,10 @@ class MixpanelTracker:
143
144
  # Skip tracking if IS_TENSORLEAP_PLATFORM environment variable is set to 'true'
144
145
  if os.environ.get('IS_TENSORLEAP_PLATFORM') == 'true':
145
146
  return
147
+
148
+ # Skip tracking if TL_DISABLE_ANALYTICS environment variable is set
149
+ if os.environ.get(TL_DISABLE_ANALYTICS_ENV_VAR):
150
+ return
146
151
 
147
152
  try:
148
153
  distinct_id = self._get_distinct_id()
@@ -199,11 +204,24 @@ def get_tracker() -> MixpanelTracker:
199
204
  return _tracker
200
205
 
201
206
 
207
+ def _is_analytics_disabled() -> bool:
208
+ return bool(os.environ.get(TL_DISABLE_ANALYTICS_ENV_VAR))
209
+
210
+
211
+ def disable_analytics() -> None:
212
+ """Programmatically disable all analytics/Mixpanel tracking."""
213
+ os.environ[TL_DISABLE_ANALYTICS_ENV_VAR] = 'true'
214
+
215
+
202
216
  def track_code_loader_loaded(event_properties: Optional[Dict[str, Any]] = None) -> None:
217
+ if _is_analytics_disabled():
218
+ return
203
219
  get_tracker().track_code_loader_loaded(event_properties)
204
220
 
205
221
 
206
222
  def track_integration_test_event(event_name: Union[str, AnalyticsEvent], event_properties: Optional[Dict[str, Any]] = None) -> None:
223
+ if _is_analytics_disabled():
224
+ return
207
225
  get_tracker().track_integration_test_event(event_name, event_properties)
208
226
 
209
227
 
@@ -213,6 +231,8 @@ _integration_events_emitted: Set[str] = set()
213
231
 
214
232
  def emit_integration_event_once(event_name: Union[str, AnalyticsEvent], props: Dict[str, Any]) -> None:
215
233
  """Emit an integration test event only once per test run."""
234
+ if _is_analytics_disabled():
235
+ return
216
236
  event_name_str = str(event_name)
217
237
  if event_name_str in _integration_events_emitted:
218
238
  return
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.170"
3
+ version = "1.0.172.dev1"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"