code-loader 1.0.180.dev5__tar.gz → 1.0.181__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 (37) hide show
  1. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/PKG-INFO +1 -1
  2. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/datasetclasses.py +1 -1
  3. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/sim_config.py +13 -0
  4. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/inner_leap_binder/leapbinder.py +38 -2
  5. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/inner_leap_binder/leapbinder_decorators.py +6 -4
  6. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/leaploader.py +73 -2
  7. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/leaploaderbase.py +6 -1
  8. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/pyproject.toml +2 -1
  9. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/LICENSE +0 -0
  10. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/README.md +0 -0
  11. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/__init__.py +0 -0
  12. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/__init__.py +0 -0
  13. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/enums.py +0 -0
  14. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/exceptions.py +0 -0
  15. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/mapping.py +0 -0
  16. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/responsedataclasses.py +0 -0
  17. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/contract/visualizer_classes.py +0 -0
  18. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/default_losses.py +0 -0
  19. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/default_metrics.py +0 -0
  20. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/__init__.py +0 -0
  21. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/api.py +0 -0
  22. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/cli_config_utils.py +0 -0
  23. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/client.py +0 -0
  24. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/epoch.py +0 -0
  25. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/experiment.py +0 -0
  26. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/experiment_context.py +0 -0
  27. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/types.py +0 -0
  28. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/utils.py +0 -0
  29. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  30. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/inner_leap_binder/__init__.py +0 -0
  31. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/mixpanel_tracker.py +0 -0
  32. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.180.dev5 → code_loader-1.0.181}/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.180.dev5
3
+ Version: 1.0.181
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -13,7 +13,7 @@ from code_loader.contract.sim_config import SimConfig
13
13
 
14
14
  custom_latent_space_attribute = "custom_latent_space"
15
15
 
16
- _simulation_context: dict = {"active": False}
16
+ _simulation_context: Dict[str, bool] = {"active": False}
17
17
 
18
18
 
19
19
  @dataclass
@@ -66,6 +66,19 @@ def _parse_bounds(name: str, metadata_type: DatasetMetadataType, bounds_raw: Dic
66
66
  raise ValueError(f"Parameter '{name}' has unsupported metadata type: {metadata_type}.")
67
67
 
68
68
 
69
+ def sample_sim_params(sim_config: SimConfig) -> Dict[str, Any]:
70
+ params: Dict[str, Any] = {}
71
+ for name, param_config in sim_config.items():
72
+ bounds = param_config.bounds
73
+ if isinstance(bounds, FloatBounds):
74
+ params[name] = (bounds.min + bounds.max) / 2.0
75
+ elif isinstance(bounds, IntBounds):
76
+ params[name] = int((bounds.min + bounds.max) / 2)
77
+ else: # CategoricalBounds
78
+ params[name] = bounds.values[0]
79
+ return params
80
+
81
+
69
82
  def parse_sim_config(raw: Dict[str, Any]) -> SimConfig:
70
83
  if not raw:
71
84
  raise ValueError("sim_config must have at least one parameter.")
@@ -13,7 +13,7 @@ from code_loader.contract.datasetclasses import SectionCallableInterface, InputH
13
13
  CustomMultipleReturnCallableInterfaceMultiArgs, DatasetBaseHandler, custom_latent_space_attribute, \
14
14
  RawInputsForHeatmap, VisualizerHandlerData, MetricHandlerData, CustomLossHandlerData, SamplePreprocessResponse, \
15
15
  ElementInstanceMasksHandler, InstanceCallableInterface, CustomLatentSpaceHandler, InstanceMetricHandler, \
16
- SimulationHandler
16
+ SimulationHandler, _simulation_context
17
17
  from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection, DatasetMetadataType
18
18
  from code_loader.contract.mapping import NodeConnection, NodeMapping, NodeMappingType
19
19
  from code_loader.contract.responsedataclasses import DatasetTestResultPayload, LeapAnalysisConfiguration
@@ -21,7 +21,7 @@ from code_loader.contract.visualizer_classes import map_leap_data_type_to_visual
21
21
  from code_loader.default_losses import loss_name_to_function
22
22
  from code_loader.default_metrics import metrics_names_to_functions_and_direction
23
23
  from code_loader.utils import to_numpy_return_wrapper, get_shape, to_numpy_return_masks_wrapper
24
- from code_loader.contract.sim_config import parse_sim_config
24
+ from code_loader.contract.sim_config import parse_sim_config, sample_sim_params
25
25
  from code_loader.visualizers.default_visualizers import DefaultVisualizer, \
26
26
  default_graph_visualizer, \
27
27
  default_image_visualizer, default_horizontal_bar_visualizer, default_word_visualizer, \
@@ -666,10 +666,46 @@ class LeapBinder:
666
666
  continue
667
667
  test_result = self.check_handler(preprocess_response, test_result, dataset_base_handler, state)
668
668
 
669
+ def check_simulations(self) -> None:
670
+ from code_loader.inner_leap_binder.leapbinder_decorators import _call_from_tl_platform
671
+ if not _call_from_tl_platform:
672
+ from code_loader.inner_leap_binder.leapbinder_decorators import set_current
673
+ set_current("tensorleap simulation")
674
+ for sim in self.setup_container.simulations:
675
+ kwargs = sample_sim_params(sim.sim_config)
676
+ kwargs["N"] = 1
677
+ kwargs["seed"] = 0
678
+ _simulation_context["active"] = True
679
+ try:
680
+ preprocess_response = sim.function(**kwargs)
681
+ finally:
682
+ _simulation_context["active"] = False
683
+ if not isinstance(preprocess_response, PreprocessResponse):
684
+ raise Exception(
685
+ "Simulation '{}' returned {} instead of PreprocessResponse".format(
686
+ sim.name, type(preprocess_response).__name__
687
+ )
688
+ )
689
+ preprocess_response.state = DataStateType.additional
690
+ preprocess_response.tl_generated = True
691
+ if not preprocess_response.length or preprocess_response.length < 1:
692
+ raise Exception("Simulation '{}' returned PreprocessResponse with length < 1".format(sim.name))
693
+ preprocess_response.sample_ids = [0]
694
+ for handler in self.setup_container.inputs:
695
+ out1 = handler.function(preprocess_response.sample_ids[0], preprocess_response)
696
+ out2 = handler.function(preprocess_response.sample_ids[0], preprocess_response)
697
+ if not np.array_equal(out1, out2):
698
+ raise Exception(
699
+ "Simulation '{}': encoder '{}' is non-deterministic — consecutive calls with seed=0 returned different outputs".format(
700
+ sim.name, handler.name
701
+ )
702
+ )
703
+
669
704
  def check(self) -> None:
670
705
  preprocess_result = self.get_preprocess_result()
671
706
  self.check_preprocess(preprocess_result)
672
707
  self.check_handlers(preprocess_result)
708
+ self.check_simulations()
673
709
  self.validate_ignore_latent_spaces()
674
710
  print("Successful!")
675
711
 
@@ -1403,22 +1403,22 @@ def tensorleap_simulation(name: str, sim_params: dict):
1403
1403
  def decorating_function(user_function: Callable[..., PreprocessResponse]):
1404
1404
  sig = inspect.signature(user_function)
1405
1405
  func_params = set(sig.parameters.keys())
1406
- expected_params = set(sim_params.keys()) | {"N"}
1406
+ expected_params = set(sim_params.keys()) | {"N", "seed"}
1407
1407
 
1408
1408
  missing = expected_params - func_params
1409
1409
  if missing:
1410
1410
  raise Exception(
1411
1411
  f"{user_function.__name__}() registration failed: "
1412
1412
  f"Missing required parameters: {missing}. "
1413
- f"Function must accept all sim_params params plus 'N'."
1413
+ f"Function must accept all sim_params params plus 'N' and 'seed'."
1414
1414
  )
1415
1415
 
1416
- extra = func_params - expected_params - {"seed"}
1416
+ extra = func_params - expected_params
1417
1417
  if extra:
1418
1418
  raise Exception(
1419
1419
  f"{user_function.__name__}() registration failed: "
1420
1420
  f"Unexpected parameters: {extra}. "
1421
- f"Function must only accept sim_params params plus 'N' and optionally 'seed'."
1421
+ f"Function must only accept sim_params params plus 'N' and 'seed'."
1422
1422
  )
1423
1423
 
1424
1424
  leap_binder.set_simulation(user_function, name, sim_params)
@@ -2175,6 +2175,8 @@ def tensorleap_status_table():
2175
2175
  row = _find_row("tensorleap simulation")
2176
2176
  if not row:
2177
2177
  return
2178
+ if _crashed["value"]:
2179
+ return
2178
2180
  failed = [n for n, s in _sim_tracking.items() if s == "failed"]
2179
2181
  not_called = [n for n, s in _sim_tracking.items() if s == "registered"]
2180
2182
  if failed:
@@ -16,14 +16,14 @@ from code_loader.contract.datasetclasses import DatasetSample, DatasetBaseHandle
16
16
  PreprocessResponse, VisualizerHandler, LeapData, \
17
17
  PredictionTypeHandler, MetadataHandler, CustomLayerHandler, MetricHandler, VisualizerHandlerData, MetricHandlerData, \
18
18
  MetricCallableReturnType, CustomLossHandlerData, CustomLossHandler, RawInputsForHeatmap, SamplePreprocessResponse, \
19
- ElementInstance, custom_latent_space_attribute, DatasetIntegrationSetup, InstanceMetricHandler
19
+ ElementInstance, custom_latent_space_attribute, DatasetIntegrationSetup, InstanceMetricHandler, _simulation_context
20
20
  from code_loader.contract.enums import DataStateEnum, TestingSectionEnum, DataStateType, DatasetMetadataType
21
21
  from code_loader.contract.exceptions import DatasetScriptException
22
22
  from code_loader.contract.responsedataclasses import DatasetIntegParseResult, DatasetTestResultPayload, \
23
23
  DatasetPreprocess, DatasetSetup, DatasetInputInstance, DatasetOutputInstance, DatasetMetadataInstance, \
24
24
  VisualizerInstance, PredictionTypeInstance, ModelSetup, CustomLayerInstance, MetricInstance, CustomLossInstance, \
25
25
  EngineFileContract, SimulationInstance
26
- from code_loader.contract.sim_config import FloatBounds, IntBounds, CategoricalBounds
26
+ from code_loader.contract.sim_config import FloatBounds, IntBounds, CategoricalBounds, sample_sim_params
27
27
  from code_loader.inner_leap_binder import global_leap_binder
28
28
  from code_loader.inner_leap_binder.leapbinder import mapping_runtime_mode_env_var_mame
29
29
  from code_loader.leaploaderbase import LeapLoaderBase
@@ -38,6 +38,7 @@ def _serialize_sim_bounds(bounds) -> dict:
38
38
  raise ValueError(f"Unknown bounds type: {type(bounds)}")
39
39
 
40
40
 
41
+
41
42
  class LeapLoader(LeapLoaderBase):
42
43
  def __init__(self, code_path: str, code_entry_name: str):
43
44
  super().__init__(code_path, code_entry_name)
@@ -223,6 +224,8 @@ class LeapLoader(LeapLoaderBase):
223
224
  test_payloads.append(preprocess_test_payload)
224
225
  handlers_test_payloads = self._check_handlers()
225
226
  test_payloads.extend(handlers_test_payloads)
227
+ simulation_test_payloads = self._check_simulations()
228
+ test_payloads.extend(simulation_test_payloads)
226
229
  is_valid = all([payload.is_passed for payload in test_payloads])
227
230
  setup_response = self.get_dataset_setup_response(handlers_test_payloads)
228
231
 
@@ -299,6 +302,74 @@ class LeapLoader(LeapLoaderBase):
299
302
  result_payloads.extend(test_result)
300
303
  return result_payloads
301
304
 
305
+ def _check_simulations(self):
306
+ # type: () -> List[DatasetTestResultPayload]
307
+ result_payloads = []
308
+ for sim in global_leap_binder.setup_container.simulations:
309
+ test_result = DatasetTestResultPayload(sim.name)
310
+ try:
311
+ kwargs = sample_sim_params(sim.sim_config)
312
+ kwargs["N"] = 1
313
+ kwargs["seed"] = 0
314
+ _simulation_context["active"] = True
315
+ try:
316
+ preprocess_response = sim.function(**kwargs)
317
+ finally:
318
+ _simulation_context["active"] = False
319
+ if not isinstance(preprocess_response, PreprocessResponse):
320
+ raise TypeError(
321
+ "Expected PreprocessResponse, got {}".format(type(preprocess_response).__name__)
322
+ )
323
+ preprocess_response.state = DataStateType.additional
324
+ preprocess_response.tl_generated = True
325
+ if preprocess_response.length < 1:
326
+ raise ValueError("Simulation returned PreprocessResponse with length < 1")
327
+ preprocess_response.sample_ids = [0]
328
+ for handler in global_leap_binder.setup_container.inputs:
329
+ out1 = handler.function(preprocess_response.sample_ids[0], preprocess_response)
330
+ out2 = handler.function(preprocess_response.sample_ids[0], preprocess_response)
331
+ if not np.array_equal(out1, out2):
332
+ raise ValueError(
333
+ "Encoder '{}' is non-deterministic: consecutive calls with seed=0 returned different outputs".format(
334
+ handler.name
335
+ )
336
+ )
337
+ except Exception as e:
338
+ line_number, file_name, stacktrace = get_root_exception_file_and_line_number()
339
+ test_result.display[TestingSectionEnum.Errors.name] = (
340
+ "{} in file {}, line_number: {}\nStacktrace:\n{}".format(
341
+ repr(e), file_name, line_number, stacktrace
342
+ )
343
+ )
344
+ test_result.is_passed = False
345
+ result_payloads.append(test_result)
346
+ return result_payloads
347
+
348
+ def run_simulation_check(self, sim_name):
349
+ # type: (str) -> Dict[str, npt.NDArray[np.float32]]
350
+ self.exec_script()
351
+ sim = next(
352
+ (s for s in global_leap_binder.setup_container.simulations if s.name == sim_name),
353
+ None,
354
+ )
355
+ if sim is None:
356
+ raise ValueError("No simulation registered with name '{}'".format(sim_name))
357
+ kwargs = sample_sim_params(sim.sim_config)
358
+ kwargs["N"] = 1
359
+ kwargs["seed"] = 0
360
+ _simulation_context["active"] = True
361
+ try:
362
+ sim_preprocess = sim.function(**kwargs)
363
+ finally:
364
+ _simulation_context["active"] = False
365
+ sim_preprocess.state = DataStateType.additional
366
+ sim_preprocess.tl_generated = True
367
+ sim_preprocess.sample_ids = [0]
368
+ result = {}
369
+ for handler in global_leap_binder.setup_container.inputs:
370
+ result[handler.name] = handler.function(sim_preprocess.sample_ids[0], sim_preprocess)
371
+ return result
372
+
302
373
  @staticmethod
303
374
  def _get_all_dataset_base_handlers() -> List[Union[DatasetBaseHandler, MetadataHandler]]:
304
375
  all_dataset_base_handlers: List[Union[DatasetBaseHandler, MetadataHandler]] = []
@@ -2,7 +2,7 @@
2
2
 
3
3
  from abc import abstractmethod
4
4
 
5
- from typing import Dict, List, Union, Type, Optional, Tuple
5
+ from typing import Any, Dict, List, Union, Type, Optional, Tuple
6
6
 
7
7
  import numpy as np
8
8
  import numpy.typing as npt
@@ -153,6 +153,11 @@ class LeapLoaderBase:
153
153
  def get_heatmap_visualizer_raw_vis_input_arg_name(self, visualizer_name: str) -> Optional[str]:
154
154
  pass
155
155
 
156
+ @abstractmethod
157
+ def run_simulation_check(self, sim_name):
158
+ # type: (str) -> Dict[str, Any]
159
+ pass
160
+
156
161
  def is_custom_latent_space(self) -> bool:
157
162
  if not self.code_entry_name or not self.code_path:
158
163
  return False
@@ -1,6 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.180.dev5"
3
+
4
+ version = "1.0.181"
4
5
  description = ""
5
6
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
7
  license = "MIT"