code-loader 1.0.180.dev2__tar.gz → 1.0.180.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.
Files changed (37) hide show
  1. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/PKG-INFO +1 -1
  2. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/datasetclasses.py +4 -3
  3. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/responsedataclasses.py +2 -2
  4. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/inner_leap_binder/leapbinder.py +3 -3
  5. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/inner_leap_binder/leapbinder_decorators.py +43 -5
  6. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/leaploader.py +2 -66
  7. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/leaploaderbase.py +1 -6
  8. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/mixpanel_tracker.py +1 -0
  9. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/pyproject.toml +1 -1
  10. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/LICENSE +0 -0
  11. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/README.md +0 -0
  12. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/__init__.py +0 -0
  13. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/__init__.py +0 -0
  14. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/enums.py +0 -0
  15. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/exceptions.py +0 -0
  16. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/mapping.py +0 -0
  17. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/sim_config.py +0 -0
  18. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/contract/visualizer_classes.py +0 -0
  19. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/default_losses.py +0 -0
  20. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/default_metrics.py +0 -0
  21. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/__init__.py +0 -0
  22. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/api.py +0 -0
  23. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/cli_config_utils.py +0 -0
  24. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/client.py +0 -0
  25. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/epoch.py +0 -0
  26. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/experiment.py +0 -0
  27. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/experiment_context.py +0 -0
  28. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/types.py +0 -0
  29. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/utils.py +0 -0
  30. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  31. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/inner_leap_binder/__init__.py +0 -0
  32. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.180.dev2 → code_loader-1.0.180.dev3}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.180.dev2 → code_loader-1.0.180.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.180.dev2
3
+ Version: 1.0.180.dev3
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -42,6 +42,7 @@ class PreprocessResponse:
42
42
  sample_id_type: Optional[Union[Type[str], Type[int]]] = None
43
43
  sample_ids_to_instance_mappings: Optional[Dict[str, List[str]]] = None # in use only for element instance
44
44
  instance_to_sample_ids_mappings: Optional[Dict[str, str]] = None # in use only for element instance
45
+ tl_generated: bool = False
45
46
 
46
47
  def __post_init__(self) -> None:
47
48
  assert self.sample_ids_to_instance_mappings is None, f"Keep sample_ids_to_instance_mappings None when initializing PreprocessResponse"
@@ -254,9 +255,9 @@ class CustomLayerHandler:
254
255
 
255
256
 
256
257
  @dataclass
257
- class SimulationInstance:
258
+ class SimulationHandler:
258
259
  name: str
259
- function: Callable[..., Any]
260
+ function: Callable[..., PreprocessResponse]
260
261
  sim_config: SimConfig
261
262
 
262
263
 
@@ -275,7 +276,7 @@ class DatasetIntegrationSetup:
275
276
  instance_metrics: List[InstanceMetricHandler] = field(default_factory=list)
276
277
  custom_layers: Dict[str, CustomLayerHandler] = field(default_factory=dict)
277
278
  custom_latent_space: Optional[CustomLatentSpaceHandler] = None
278
- simulations: List[SimulationInstance] = field(default_factory=list)
279
+ simulations: List[SimulationHandler] = field(default_factory=list)
279
280
 
280
281
 
281
282
  @dataclass
@@ -70,7 +70,7 @@ class PredictionTypeInstance:
70
70
 
71
71
 
72
72
  @dataclass
73
- class SimulationSetupInstance:
73
+ class SimulationInstance:
74
74
  name: str
75
75
  sim_config: Dict[str, Any]
76
76
 
@@ -85,7 +85,7 @@ class DatasetSetup:
85
85
  prediction_types: List[PredictionTypeInstance]
86
86
  custom_losses: List[CustomLossInstance]
87
87
  metrics: List[MetricInstance] = field(default_factory=list)
88
- simulations: List[SimulationSetupInstance] = field(default_factory=list)
88
+ simulations: List[SimulationInstance] = field(default_factory=list)
89
89
 
90
90
 
91
91
  @dataclass
@@ -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
- SimulationInstance
16
+ SimulationHandler
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
@@ -221,7 +221,7 @@ class LeapBinder:
221
221
  """
222
222
  self.setup_container.unlabeled_data_preprocess = UnlabeledDataPreprocessHandler(function)
223
223
 
224
- def set_simulation(self, function: Callable[..., Any], name: str, sim_config_raw: Dict[str, Any]) -> None:
224
+ def set_simulation(self, function: Callable[..., PreprocessResponse], name: str, sim_config_raw: Dict[str, Any]) -> None:
225
225
  for sim in self.setup_container.simulations:
226
226
  if sim.name == name:
227
227
  raise Exception(
@@ -229,7 +229,7 @@ class LeapBinder:
229
229
  )
230
230
  sim_config = parse_sim_config(sim_config_raw)
231
231
  self.setup_container.simulations.append(
232
- SimulationInstance(name=name, function=function, sim_config=sim_config)
232
+ SimulationHandler(name=name, function=function, sim_config=sim_config)
233
233
  )
234
234
 
235
235
  def set_input(self, function: SectionCallableInterface, name: str, channel_dim: int = -1) -> None:
@@ -1400,7 +1400,7 @@ def tensorleap_preprocess():
1400
1400
 
1401
1401
 
1402
1402
  def tensorleap_simulation(name: str, sim_params: dict):
1403
- def decorating_function(user_function: Callable):
1403
+ def decorating_function(user_function: Callable[..., PreprocessResponse]):
1404
1404
  sig = inspect.signature(user_function)
1405
1405
  func_params = set(sig.parameters.keys())
1406
1406
  expected_params = set(sim_params.keys()) | {"N"}
@@ -1423,12 +1423,47 @@ def tensorleap_simulation(name: str, sim_params: dict):
1423
1423
 
1424
1424
  leap_binder.set_simulation(user_function, name, sim_params)
1425
1425
 
1426
- def inner(*args, **kwargs):
1427
- result = user_function(*args, **kwargs)
1426
+ if not _call_from_tl_platform:
1427
+ add_table_row(f"tensorleap_simulation:{name} (optional)")
1428
+
1429
+ def _validate_input_args(*args, **kwargs):
1430
+ assert len(args) == 0, (
1431
+ f"{user_function.__name__}() validation failed: "
1432
+ f"Simulation functions must be called with keyword arguments only. Got positional args: {args}."
1433
+ )
1434
+ missing = expected_params - set(kwargs.keys())
1435
+ assert not missing, (
1436
+ f"{user_function.__name__}() validation failed: "
1437
+ f"Missing required keyword arguments: {missing}."
1438
+ )
1439
+
1440
+ def _validate_result(result):
1428
1441
  assert isinstance(result, PreprocessResponse), (
1429
1442
  f"{user_function.__name__}() validation failed: "
1430
1443
  f"Expected return type PreprocessResponse. Got {type(result).__name__}."
1431
1444
  )
1445
+ assert result.state == DataStateType.additional, (
1446
+ f"{user_function.__name__}() validation failed: "
1447
+ f"Simulation must return a PreprocessResponse with state=DataStateType.additional. "
1448
+ f"Got state={result.state!r}."
1449
+ )
1450
+
1451
+ def inner(*args, **kwargs):
1452
+ if not _call_from_tl_platform:
1453
+ set_current('tensorleap_simulation')
1454
+ _validate_input_args(*args, **kwargs)
1455
+ result = user_function(*args, **kwargs)
1456
+ _validate_result(result)
1457
+ result.tl_generated = True
1458
+ if not _call_from_tl_platform:
1459
+ update_env_params_func(f"tensorleap_simulation:{name}", "v")
1460
+ try:
1461
+ emit_integration_event_once(AnalyticsEvent.SIMULATION_INTEGRATION_TEST, {
1462
+ 'simulation_name': name,
1463
+ 'sim_params_count': len(sim_params)
1464
+ })
1465
+ except Exception as e:
1466
+ logger.debug(f"Failed to emit simulation integration test event: {e}")
1432
1467
  return result
1433
1468
 
1434
1469
  return inner
@@ -2129,14 +2164,17 @@ def tensorleap_status_table():
2129
2164
  traceback.print_exception(exc_type, exc_value, exc_traceback)
2130
2165
  run_on_exit()
2131
2166
 
2167
+ def add_table_row(name: str):
2168
+ table.append({"name": name, "Added to integration": UNKNOWN})
2169
+
2132
2170
  atexit.register(run_on_exit)
2133
2171
  sys.excepthook = handle_exception
2134
2172
 
2135
- return set_current, update_env_params
2173
+ return set_current, update_env_params, add_table_row
2136
2174
 
2137
2175
 
2138
2176
  if not _call_from_tl_platform:
2139
- set_current, update_env_params_func = tensorleap_status_table()
2177
+ set_current, update_env_params_func, add_table_row = tensorleap_status_table()
2140
2178
 
2141
2179
 
2142
2180
 
@@ -22,7 +22,7 @@ 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
- EngineFileContract, SimulationSetupInstance
25
+ EngineFileContract, SimulationInstance
26
26
  from code_loader.contract.sim_config import FloatBounds, IntBounds, CategoricalBounds
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
@@ -38,20 +38,6 @@ def _serialize_sim_bounds(bounds) -> dict:
38
38
  raise ValueError(f"Unknown bounds type: {type(bounds)}")
39
39
 
40
40
 
41
- def _sample_sim_params(sim_config):
42
- # type: (Dict[str, Any]) -> Dict[str, Any]
43
- params = {}
44
- for name, param_config in sim_config.items():
45
- bounds = param_config.bounds
46
- if isinstance(bounds, FloatBounds):
47
- params[name] = (bounds.min + bounds.max) / 2.0
48
- elif isinstance(bounds, IntBounds):
49
- params[name] = int((bounds.min + bounds.max) / 2)
50
- else: # CategoricalBounds
51
- params[name] = bounds.values[0]
52
- return params
53
-
54
-
55
41
  class LeapLoader(LeapLoaderBase):
56
42
  def __init__(self, code_path: str, code_entry_name: str):
57
43
  super().__init__(code_path, code_entry_name)
@@ -237,8 +223,6 @@ class LeapLoader(LeapLoaderBase):
237
223
  test_payloads.append(preprocess_test_payload)
238
224
  handlers_test_payloads = self._check_handlers()
239
225
  test_payloads.extend(handlers_test_payloads)
240
- simulation_test_payloads = self._check_simulations()
241
- test_payloads.extend(simulation_test_payloads)
242
226
  is_valid = all([payload.is_passed for payload in test_payloads])
243
227
  setup_response = self.get_dataset_setup_response(handlers_test_payloads)
244
228
 
@@ -315,54 +299,6 @@ class LeapLoader(LeapLoaderBase):
315
299
  result_payloads.extend(test_result)
316
300
  return result_payloads
317
301
 
318
- def _check_simulations(self):
319
- # type: () -> List[DatasetTestResultPayload]
320
- result_payloads = []
321
- for sim in global_leap_binder.setup_container.simulations:
322
- test_result = DatasetTestResultPayload(sim.name)
323
- try:
324
- kwargs = _sample_sim_params(sim.sim_config)
325
- kwargs["N"] = 1
326
- if "seed" in inspect.signature(sim.function).parameters:
327
- kwargs["seed"] = 0
328
- preprocess_response = sim.function(**kwargs)
329
- if not isinstance(preprocess_response, PreprocessResponse):
330
- raise TypeError(
331
- "Expected PreprocessResponse, got {}".format(type(preprocess_response).__name__)
332
- )
333
- if preprocess_response.length < 1:
334
- raise ValueError("Simulation returned PreprocessResponse with length < 1")
335
- except Exception as e:
336
- line_number, file_name, stacktrace = get_root_exception_file_and_line_number()
337
- test_result.display[TestingSectionEnum.Errors.name] = (
338
- "{} in file {}, line_number: {}\nStacktrace:\n{}".format(
339
- repr(e), file_name, line_number, stacktrace
340
- )
341
- )
342
- test_result.is_passed = False
343
- result_payloads.append(test_result)
344
- return result_payloads
345
-
346
- def run_simulation_check(self, sim_name):
347
- # type: (str) -> Dict[str, npt.NDArray[np.float32]]
348
- self.exec_script()
349
- sim = next(
350
- (s for s in global_leap_binder.setup_container.simulations if s.name == sim_name),
351
- None,
352
- )
353
- if sim is None:
354
- raise ValueError("No simulation registered with name '{}'".format(sim_name))
355
- kwargs = _sample_sim_params(sim.sim_config)
356
- kwargs["N"] = 1
357
- if "seed" in inspect.signature(sim.function).parameters:
358
- kwargs["seed"] = 0
359
- sim_preprocess = sim.function(**kwargs)
360
- sim_preprocess.state = DataStateType.additional
361
- result = {}
362
- for handler in global_leap_binder.setup_container.inputs:
363
- result[handler.name] = handler.function(0, sim_preprocess)
364
- return result
365
-
366
302
  @staticmethod
367
303
  def _get_all_dataset_base_handlers() -> List[Union[DatasetBaseHandler, MetadataHandler]]:
368
304
  all_dataset_base_handlers: List[Union[DatasetBaseHandler, MetadataHandler]] = []
@@ -536,7 +472,7 @@ class LeapLoader(LeapLoaderBase):
536
472
  }
537
473
  for name, param in sim.sim_config.items()
538
474
  }
539
- simulations.append(SimulationSetupInstance(name=sim.name, sim_config=sim_config_serialized))
475
+ simulations.append(SimulationInstance(name=sim.name, sim_config=sim_config_serialized))
540
476
 
541
477
  return DatasetSetup(preprocess=dataset_preprocess, inputs=inputs, outputs=ground_truths,
542
478
  metadata=metadata_instances, visualizers=visualizers, prediction_types=prediction_types,
@@ -2,7 +2,7 @@
2
2
 
3
3
  from abc import abstractmethod
4
4
 
5
- from typing import Any, Dict, List, Union, Type, Optional, Tuple
5
+ from typing import Dict, List, Union, Type, Optional, Tuple
6
6
 
7
7
  import numpy as np
8
8
  import numpy.typing as npt
@@ -153,11 +153,6 @@ 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
-
161
156
  def is_custom_latent_space(self) -> bool:
162
157
  if not self.code_entry_name or not self.code_path:
163
158
  return False
@@ -23,6 +23,7 @@ class AnalyticsEvent(str, Enum):
23
23
  PREPROCESS_INTEGRATION_TEST = "preprocess_integration_test"
24
24
  INPUT_ENCODER_INTEGRATION_TEST = "input_encoder_integration_test"
25
25
  GT_ENCODER_INTEGRATION_TEST = "gt_encoder_integration_test"
26
+ SIMULATION_INTEGRATION_TEST = "simulation_integration_test"
26
27
 
27
28
 
28
29
  class CodeLoaderLoadedProps(TypedDict, total=False):
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.180.dev2"
3
+ version = "1.0.180.dev3"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"