code-loader 1.0.166.dev2__tar.gz → 1.0.168__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.166.dev2 → code_loader-1.0.168}/PKG-INFO +1 -1
  2. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/inner_leap_binder/leapbinder_decorators.py +31 -24
  3. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/pyproject.toml +3 -1
  4. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/LICENSE +0 -0
  5. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/README.md +0 -0
  6. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/__init__.py +0 -0
  7. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/__init__.py +0 -0
  8. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/datasetclasses.py +0 -0
  9. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/enums.py +0 -0
  10. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/exceptions.py +0 -0
  11. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/mapping.py +0 -0
  12. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/responsedataclasses.py +0 -0
  13. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/contract/visualizer_classes.py +0 -0
  14. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/default_losses.py +0 -0
  15. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/default_metrics.py +0 -0
  16. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/__init__.py +0 -0
  17. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/api.py +0 -0
  18. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/cli_config_utils.py +0 -0
  19. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/client.py +0 -0
  20. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/epoch.py +0 -0
  21. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/experiment.py +0 -0
  22. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/experiment_context.py +0 -0
  23. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/types.py +0 -0
  24. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/utils.py +0 -0
  25. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  26. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/inner_leap_binder/__init__.py +0 -0
  27. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  28. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/leaploader.py +0 -0
  29. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/leaploaderbase.py +0 -0
  30. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/mixpanel_tracker.py +0 -0
  31. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/plot_functions/__init__.py +0 -0
  32. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/plot_functions/plot_functions.py +0 -0
  33. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/plot_functions/visualize.py +0 -0
  34. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/utils.py +0 -0
  35. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/code_loader/visualizers/__init__.py +0 -0
  36. {code_loader-1.0.166.dev2 → code_loader-1.0.168}/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.166.dev2
3
+ Version: 1.0.168
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -406,12 +406,27 @@ def tensorleap_load_model(prediction_types: Optional[List[PredictionTypeHandler]
406
406
  coerced = {}
407
407
  meta = {i.name: i for i in self.model.get_inputs()}
408
408
 
409
- for name, arr in float_arrays_inputs.items():
410
- if name not in meta:
411
- # Keep as-is unless extra inputs are disallowed
412
- coerced[name] = arr
413
- continue
409
+ unexpected = [n for n in float_arrays_inputs.keys() if n not in meta]
410
+ if unexpected:
411
+ raise ValueError(
412
+ f"Input name(s) {sorted(unexpected)} do not match any ONNX model input. "
413
+ f"Expected input names: {[i.name for i in self.model.get_inputs()]}"
414
+ )
415
+
416
+ missing = [n for n in meta if n not in float_arrays_inputs]
417
+ if missing:
418
+ raise KeyError(f"Missing required input(s): {sorted(missing)}")
414
419
 
420
+ onnx_input_order = [i.name for i in self.model.get_inputs()]
421
+ provided_order = list(float_arrays_inputs.keys())
422
+ if provided_order != onnx_input_order:
423
+ raise ValueError(
424
+ f"Input order mismatch. Provided: {provided_order}, "
425
+ f"expected ONNX order: {onnx_input_order}. "
426
+ f"Reorder your input functions to match the ONNX model's input order."
427
+ )
428
+
429
+ for name, arr in float_arrays_inputs.items():
415
430
  info = meta[name]
416
431
  onnx_type = info.type
417
432
  want_dtype = ONNX_TYPE_TO_NP.get(onnx_type)
@@ -419,17 +434,11 @@ def tensorleap_load_model(prediction_types: Optional[List[PredictionTypeHandler]
419
434
  if want_dtype is None:
420
435
  raise TypeError(f"Unsupported ONNX input type: {onnx_type}")
421
436
 
422
- # Cast dtype if needed
423
437
  if arr.dtype != want_dtype:
424
438
  arr = arr.astype(want_dtype, copy=False)
425
439
 
426
440
  coerced[name] = arr
427
441
 
428
- # Verify required inputs are present
429
- missing = [n for n in meta if n not in coerced]
430
- if missing:
431
- raise KeyError(f"Missing required input(s): {sorted(missing)}")
432
-
433
442
  return coerced
434
443
 
435
444
  # onnx runtime interface
@@ -1067,10 +1076,16 @@ def tensorleap_preprocess():
1067
1076
  else f"{user_function.__name__}() validation failed: expected to return a single list[{PreprocessResponse.__name__}] object, "
1068
1077
  f"but returned {len(result)} objects instead."
1069
1078
  )
1079
+ assert len(result) >= 2, \
1080
+ (f'{user_function.__name__}() validation failed: '
1081
+ f'Expected at least 2 PreprocessResponse objects (training and validation), but got {len(result)}.')
1070
1082
  for i, response in enumerate(result):
1071
1083
  assert isinstance(response, PreprocessResponse), \
1072
1084
  (f'{user_function.__name__}() validation failed: '
1073
1085
  f'Element #{i} in the return list should be a PreprocessResponse. Got {type(response)}.')
1086
+ assert len(response) > 0, \
1087
+ (f'{user_function.__name__}() validation failed: '
1088
+ f'PreprocessResponse #{i} has length 0. Each PreprocessResponse must have at least one sample.')
1074
1089
  assert len(set(result)) == len(result), \
1075
1090
  (f'{user_function.__name__}() validation failed: '
1076
1091
  f'The return list should not contain duplicate PreprocessResponse objects.')
@@ -1389,11 +1404,7 @@ def tensorleap_input_encoder(name: str, channel_dim=_UNSET, model_input_index=No
1389
1404
 
1390
1405
  def mapping_inner(*args, **kwargs):
1391
1406
  class TempMapping:
1392
- def __getitem__(self, key):
1393
- return self
1394
-
1395
- def __iter__(self):
1396
- return iter([])
1407
+ pass
1397
1408
 
1398
1409
  ret = TempMapping()
1399
1410
  ret.node_mapping = mapping_inner.node_mapping
@@ -1643,8 +1654,8 @@ def tensorleap_status_table():
1643
1654
  code_mapping_failure = [0]
1644
1655
 
1645
1656
  table = [
1646
- {"name": "tensorleap_preprocess", "Added to integration": UNKNOWN},
1647
1657
  {"name": "tensorleap_integration_test", "Added to integration": UNKNOWN},
1658
+ {"name": "tensorleap_preprocess", "Added to integration": UNKNOWN},
1648
1659
  {"name": "tensorleap_input_encoder", "Added to integration": UNKNOWN},
1649
1660
  {"name": "tensorleap_gt_encoder", "Added to integration": UNKNOWN},
1650
1661
  {"name": "tensorleap_load_model", "Added to integration": UNKNOWN},
@@ -1728,12 +1739,8 @@ def tensorleap_status_table():
1728
1739
  mandatory_ready_mess = "\nAll mandatory parts have been successfully set. If no errors accured, you can now push the project to the Tensorleap system or continue to the next optional reccomeded interface,adding: "
1729
1740
  code_mapping_failure_mes = "Tensorleap_integration_test code flow failed, check raised exception."
1730
1741
 
1731
- # Sort table: CHECK first, then CROSS, then UNKNOWN
1732
- status_order = {CHECK: 0, CROSS: 1, UNKNOWN: 2}
1733
- sorted_table = sorted(table, key=lambda row: status_order.get(row["Added to integration"], 3))
1734
-
1735
- name_width = max(len(row["name"]) for row in sorted_table)
1736
- status_width = max(len(row["Added to integration"]) for row in sorted_table)
1742
+ name_width = max(len(row["name"]) for row in table)
1743
+ status_width = max(len(row["Added to integration"]) for row in table)
1737
1744
 
1738
1745
  header = f"{'Decorator Name'.ljust(name_width)} | {'Added to integration'.ljust(status_width)}"
1739
1746
  sep = "-" * len(header)
@@ -1741,7 +1748,7 @@ def tensorleap_status_table():
1741
1748
  print("\n" + header)
1742
1749
  print(sep)
1743
1750
 
1744
- for row in sorted_table:
1751
+ for row in table:
1745
1752
  print(f"{row['name'].ljust(name_width)} | {row['Added to integration'].ljust(status_width)}")
1746
1753
 
1747
1754
  # Determine next_step based on original table order (recommended integration order)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.166.dev2"
3
+ version = "1.0.168"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"
@@ -28,6 +28,8 @@ grappa = "^1.0.1"
28
28
  pytest-cov = "^3.0.0"
29
29
  pytest-watch = "^4.2.0"
30
30
  mypy = "1.3.0"
31
+ onnxruntime = {version = ">=1.0.0", python = ">=3.10"}
32
+ onnx = {version = ">=1.0.0", python = ">=3.10"}
31
33
 
32
34
  [build-system]
33
35
  requires = ["poetry-core>=1.0.0"]