code-loader 1.0.166.dev2__tar.gz → 1.0.169__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.169}/PKG-INFO +1 -1
  2. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/inner_leap_binder/leapbinder_decorators.py +31 -26
  3. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/pyproject.toml +3 -1
  4. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/LICENSE +0 -0
  5. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/README.md +0 -0
  6. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/__init__.py +0 -0
  7. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/__init__.py +0 -0
  8. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/datasetclasses.py +0 -0
  9. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/enums.py +0 -0
  10. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/exceptions.py +0 -0
  11. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/mapping.py +0 -0
  12. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/responsedataclasses.py +0 -0
  13. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/contract/visualizer_classes.py +0 -0
  14. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/default_losses.py +0 -0
  15. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/default_metrics.py +0 -0
  16. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/__init__.py +0 -0
  17. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/api.py +0 -0
  18. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/cli_config_utils.py +0 -0
  19. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/client.py +0 -0
  20. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/epoch.py +0 -0
  21. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/experiment.py +0 -0
  22. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/experiment_context.py +0 -0
  23. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/types.py +0 -0
  24. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/utils.py +0 -0
  25. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  26. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/inner_leap_binder/__init__.py +0 -0
  27. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  28. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/leaploader.py +0 -0
  29. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/leaploaderbase.py +0 -0
  30. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/mixpanel_tracker.py +0 -0
  31. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/plot_functions/__init__.py +0 -0
  32. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/plot_functions/plot_functions.py +0 -0
  33. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/plot_functions/visualize.py +0 -0
  34. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/utils.py +0 -0
  35. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/code_loader/visualizers/__init__.py +0 -0
  36. {code_loader-1.0.166.dev2 → code_loader-1.0.169}/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.169
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
@@ -952,8 +961,6 @@ def tensorleap_metadata(
952
961
  def _validate_result(result):
953
962
  supported_result_types = (type(None), int, str, bool, float, dict, np.floating,
954
963
  np.bool_, np.unsignedinteger, np.signedinteger, np.integer)
955
- validate_output_structure(result, func_name=user_function.__name__,
956
- expected_type_name=supported_result_types)
957
964
  assert isinstance(result, supported_result_types), \
958
965
  (f'{user_function.__name__}() validation failed: '
959
966
  f'Unsupported return type. Got {type(result)}. should be any of {str(supported_result_types)}')
@@ -1067,10 +1074,16 @@ def tensorleap_preprocess():
1067
1074
  else f"{user_function.__name__}() validation failed: expected to return a single list[{PreprocessResponse.__name__}] object, "
1068
1075
  f"but returned {len(result)} objects instead."
1069
1076
  )
1077
+ assert len(result) >= 2, \
1078
+ (f'{user_function.__name__}() validation failed: '
1079
+ f'Expected at least 2 PreprocessResponse objects (training and validation), but got {len(result)}.')
1070
1080
  for i, response in enumerate(result):
1071
1081
  assert isinstance(response, PreprocessResponse), \
1072
1082
  (f'{user_function.__name__}() validation failed: '
1073
1083
  f'Element #{i} in the return list should be a PreprocessResponse. Got {type(response)}.')
1084
+ assert len(response) > 0, \
1085
+ (f'{user_function.__name__}() validation failed: '
1086
+ f'PreprocessResponse #{i} has length 0. Each PreprocessResponse must have at least one sample.')
1074
1087
  assert len(set(result)) == len(result), \
1075
1088
  (f'{user_function.__name__}() validation failed: '
1076
1089
  f'The return list should not contain duplicate PreprocessResponse objects.')
@@ -1389,11 +1402,7 @@ def tensorleap_input_encoder(name: str, channel_dim=_UNSET, model_input_index=No
1389
1402
 
1390
1403
  def mapping_inner(*args, **kwargs):
1391
1404
  class TempMapping:
1392
- def __getitem__(self, key):
1393
- return self
1394
-
1395
- def __iter__(self):
1396
- return iter([])
1405
+ pass
1397
1406
 
1398
1407
  ret = TempMapping()
1399
1408
  ret.node_mapping = mapping_inner.node_mapping
@@ -1643,8 +1652,8 @@ def tensorleap_status_table():
1643
1652
  code_mapping_failure = [0]
1644
1653
 
1645
1654
  table = [
1646
- {"name": "tensorleap_preprocess", "Added to integration": UNKNOWN},
1647
1655
  {"name": "tensorleap_integration_test", "Added to integration": UNKNOWN},
1656
+ {"name": "tensorleap_preprocess", "Added to integration": UNKNOWN},
1648
1657
  {"name": "tensorleap_input_encoder", "Added to integration": UNKNOWN},
1649
1658
  {"name": "tensorleap_gt_encoder", "Added to integration": UNKNOWN},
1650
1659
  {"name": "tensorleap_load_model", "Added to integration": UNKNOWN},
@@ -1728,12 +1737,8 @@ def tensorleap_status_table():
1728
1737
  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
1738
  code_mapping_failure_mes = "Tensorleap_integration_test code flow failed, check raised exception."
1730
1739
 
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)
1740
+ name_width = max(len(row["name"]) for row in table)
1741
+ status_width = max(len(row["Added to integration"]) for row in table)
1737
1742
 
1738
1743
  header = f"{'Decorator Name'.ljust(name_width)} | {'Added to integration'.ljust(status_width)}"
1739
1744
  sep = "-" * len(header)
@@ -1741,7 +1746,7 @@ def tensorleap_status_table():
1741
1746
  print("\n" + header)
1742
1747
  print(sep)
1743
1748
 
1744
- for row in sorted_table:
1749
+ for row in table:
1745
1750
  print(f"{row['name'].ljust(name_width)} | {row['Added to integration'].ljust(status_width)}")
1746
1751
 
1747
1752
  # 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.169"
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"]