code-loader 1.0.193.dev1__tar.gz → 1.0.193.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 (37) hide show
  1. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/PKG-INFO +1 -1
  2. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/inner_leap_binder/leapbinder_decorators.py +16 -5
  3. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/leaploader.py +22 -3
  4. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/pyproject.toml +1 -1
  5. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/LICENSE +0 -0
  6. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/README.md +0 -0
  7. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/__init__.py +0 -0
  8. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/__init__.py +0 -0
  9. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/datasetclasses.py +0 -0
  10. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/enums.py +0 -0
  11. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/exceptions.py +0 -0
  12. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/mapping.py +0 -0
  13. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/responsedataclasses.py +0 -0
  14. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/sim_config.py +0 -0
  15. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/contract/visualizer_classes.py +0 -0
  16. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/default_losses.py +0 -0
  17. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/default_metrics.py +0 -0
  18. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/__init__.py +0 -0
  19. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/api.py +0 -0
  20. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/cli_config_utils.py +0 -0
  21. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/client.py +0 -0
  22. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/epoch.py +0 -0
  23. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/experiment.py +0 -0
  24. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/experiment_context.py +0 -0
  25. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/types.py +0 -0
  26. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/utils.py +0 -0
  27. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  28. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/inner_leap_binder/__init__.py +0 -0
  29. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  30. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/mixpanel_tracker.py +0 -0
  32. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.193.dev1 → code_loader-1.0.193.dev2}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.193.dev1 → code_loader-1.0.193.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.193.dev1
3
+ Version: 1.0.193.dev2
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -36,6 +36,10 @@ from code_loader.mixpanel_tracker import clear_integration_events, AnalyticsEven
36
36
 
37
37
  _called_from_inside_tl_decorator = 0
38
38
  _called_from_inside_tl_integration_test_decorator = False
39
+ # Whether any integration test wrapper was entered in this process. The crash reporter uses it
40
+ # to tell a raise in the test body (report as code-flow failure) from a module-level crash
41
+ # before any test ran (report as a plain script crash).
42
+ _integration_test_started = False
39
43
  _call_from_tl_platform = os.environ.get('IS_TENSORLEAP_PLATFORM') == 'true'
40
44
 
41
45
  # ---- warnings store (module-level) ----
@@ -299,7 +303,8 @@ def tensorleap_integration_test():
299
303
  func_name='integration_test', expected_names=["idx", "preprocess"], **kwargs)
300
304
  _validate_input_args(*args, **kwargs)
301
305
 
302
- global _called_from_inside_tl_integration_test_decorator
306
+ global _called_from_inside_tl_integration_test_decorator, _integration_test_started
307
+ _integration_test_started = True
303
308
  # Clear integration test events for new test
304
309
  try:
305
310
  clear_integration_events()
@@ -3402,7 +3407,11 @@ def tensorleap_status_table():
3402
3407
  return
3403
3408
 
3404
3409
  if _crashed["value"]:
3405
- print(f"\nScript crashed before completing all steps. crashed at function '{_current_func['name']}'.")
3410
+ crashed_at = _current_func['name']
3411
+ if crashed_at:
3412
+ print(f"\nScript crashed before completing all steps. crashed at function '{crashed_at}'.")
3413
+ else:
3414
+ print("\nScript crashed before completing all steps.")
3406
3415
  return
3407
3416
 
3408
3417
  print(ready_mess) if ready else print(
@@ -3477,9 +3486,11 @@ def tensorleap_status_table():
3477
3486
  row = _find_row(crashed_name)
3478
3487
  if row:
3479
3488
  row["Added to integration"] = CROSS
3480
- elif not crashed_name:
3481
- # Crash with no decorator currently running = the integration-test body /
3482
- # code flow itself failed; report that rather than blaming a decorator.
3489
+ elif not crashed_name and _integration_test_started:
3490
+ # Crash with no decorator currently running while an integration test has been
3491
+ # entered = the test body / code flow itself failed; report that rather than
3492
+ # blaming a decorator. Without a started test (a module-level crash between
3493
+ # decorator registrations) the plain script-crash message is the truthful one.
3483
3494
  code_mapping_failure[0] = 1
3484
3495
 
3485
3496
  traceback.print_exception(exc_type, exc_value, exc_traceback)
@@ -545,21 +545,39 @@ class LeapLoader(LeapLoaderBase):
545
545
  test_result.is_passed = False
546
546
  return test_result
547
547
 
548
+ @staticmethod
549
+ def _validate_autoregressive_step_inputs(step_inputs: Dict[str, Any],
550
+ sample_id: Union[int, str]) -> None:
551
+ # The parse-time check only covers the first sample of each state; the engine runtime
552
+ # paths must enforce the same key/value contract for every sample they touch.
553
+ for key, value in step_inputs.items():
554
+ if key.startswith('_'):
555
+ raise Exception(f'The autoregressive step hook returned model input key "{key}" '
556
+ f'for sample {sample_id} — underscore passthrough keys were '
557
+ 'replaced by the explicit state channel; move passthrough values '
558
+ 'into the returned state.')
559
+ if not isinstance(value, np.ndarray):
560
+ raise Exception('The autoregressive step hook returned a non-numpy value for '
561
+ f'model input "{key}" ({type(value).__name__}) for sample '
562
+ f'{sample_id}.')
563
+
548
564
  def _ensure_autoregressive_input_shapes(self) -> Dict[str, List[int]]:
549
565
  handler = global_leap_binder.setup_container.autoregressive_step
550
566
  assert handler is not None
551
567
  if handler.input_shapes is None:
552
568
  preprocess_result = self._preprocess_result()
553
569
  first_state_response = next(iter(preprocess_result.values()))
554
- first_result = handler.function(first_state_response.sample_ids[0], None, None, None,
570
+ first_sample_id = first_state_response.sample_ids[0]
571
+ first_result = handler.function(first_sample_id, None, None, None,
555
572
  first_state_response)
556
573
  if not isinstance(first_result, tuple) or len(first_result) != 2 or \
557
574
  not isinstance(first_result[0], dict):
558
575
  raise Exception('The autoregressive step hook must return a (next_inputs, state) '
559
576
  'tuple with a dict of initial model inputs on its first call, '
560
577
  f'got {type(first_result)}.')
561
- handler.input_shapes = {key: list(value.shape) for key, value in first_result[0].items()
562
- if isinstance(value, np.ndarray)}
578
+ self._validate_autoregressive_step_inputs(first_result[0], first_sample_id)
579
+ handler.input_shapes = {key: list(value.shape)
580
+ for key, value in first_result[0].items()}
563
581
  return handler.input_shapes
564
582
 
565
583
  def run_simulation(self, sim_name, params=None, n_samples=1, seed=0,
@@ -897,6 +915,7 @@ class LeapLoader(LeapLoaderBase):
897
915
  'The autoregressive step hook must return a (next_inputs, state) tuple with a '
898
916
  f'dict of initial model inputs on its first call, got {type(step_zero_result)} '
899
917
  f'for sample {sample_id}.')
918
+ self._validate_autoregressive_step_inputs(step_zero_result[0], sample_id)
900
919
  inputs.update(step_zero_result[0])
901
920
  return inputs
902
921
 
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
3
 
4
- version = "1.0.193.dev1"
4
+ version = "1.0.193.dev2"
5
5
  description = ""
6
6
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
7
7
  license = "MIT"