code-loader 1.0.205.dev0__tar.gz → 1.0.205.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.205.dev0 → code_loader-1.0.205.dev2}/PKG-INFO +1 -1
  2. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/responsedataclasses.py +2 -0
  3. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/inner_leap_binder/leapbinder.py +10 -24
  4. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/leaploader.py +17 -1
  5. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/pyproject.toml +1 -1
  6. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/LICENSE +0 -0
  7. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/README.md +0 -0
  8. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/__init__.py +0 -0
  9. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/__init__.py +0 -0
  10. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/datasetclasses.py +0 -0
  11. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/enums.py +0 -0
  12. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/exceptions.py +0 -0
  13. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/mapping.py +0 -0
  14. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/sim_config.py +0 -0
  15. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/contract/visualizer_classes.py +0 -0
  16. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/default_losses.py +0 -0
  17. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/default_metrics.py +0 -0
  18. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/__init__.py +0 -0
  19. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/api.py +0 -0
  20. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/cli_config_utils.py +0 -0
  21. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/client.py +0 -0
  22. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/epoch.py +0 -0
  23. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/experiment.py +0 -0
  24. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/experiment_context.py +0 -0
  25. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/types.py +0 -0
  26. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/utils.py +0 -0
  27. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  28. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/inner_leap_binder/__init__.py +0 -0
  29. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/inner_leap_binder/leapbinder_decorators.py +0 -0
  30. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/mixpanel_tracker.py +0 -0
  32. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.205.dev0 → code_loader-1.0.205.dev2}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.205.dev0 → code_loader-1.0.205.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.205.dev0
3
+ Version: 1.0.205.dev2
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -86,6 +86,8 @@ class DatasetSetup:
86
86
  custom_losses: List[CustomLossInstance]
87
87
  metrics: List[MetricInstance] = field(default_factory=list)
88
88
  simulations: List[SimulationInstance] = field(default_factory=list)
89
+ # Structural: the integration registered an element-instance mask encoder.
90
+ has_element_instances: bool = False
89
91
 
90
92
 
91
93
  @dataclass
@@ -1032,18 +1032,17 @@ class LeapBinder:
1032
1032
 
1033
1033
  Each entry must be one of:
1034
1034
  - "foreground" (the friendly name for the max-pooled default LS)
1035
- - "balanced" (the friendly name for the universal fallback default LS),
1036
- allowed only when a custom latent space is registered with
1037
- use_ls_for_analysis=True — that flagged LS is what replaces it
1038
1035
  - An input name registered via set_input(name=...)
1039
1036
  - A prediction name registered via add_prediction(name=...)
1040
1037
 
1041
1038
  Forbidden tokens (raise with a clear message):
1039
+ - "balanced" — the friendly name for the universal fallback default
1040
+ LS; cannot be disabled.
1042
1041
  - "user_custom" — populated by set_custom_latent_space; if the user
1043
1042
  registered a custom LS they should use it, not ignore it.
1044
1043
 
1045
- Order-independent: this runs after all set_input / add_prediction /
1046
- set_custom_latent_space calls because it consults setup_container.
1044
+ Order-independent: this runs after all set_input / add_prediction calls
1045
+ because it consults setup_container.inputs and prediction_types.
1047
1046
  """
1048
1047
  if not self.leap_analysis_configuration:
1049
1048
  return
@@ -1051,37 +1050,24 @@ class LeapBinder:
1051
1050
  if not names:
1052
1051
  return
1053
1052
 
1054
- forbidden = {"user_custom"}
1053
+ forbidden = {"balanced", "user_custom"}
1055
1054
  input_names = {h.name for h in self.setup_container.inputs}
1056
1055
  prediction_names = {h.name for h in self.setup_container.prediction_types}
1057
- allowed_tokens = {"foreground", "balanced"} | input_names | prediction_names
1058
- analysis_ls_names = [
1059
- ls_name
1060
- for ls_name, handler in self.setup_container.custom_latent_spaces.items()
1061
- if handler.use_ls_for_analysis
1062
- ]
1056
+ allowed_tokens = {"foreground"} | input_names | prediction_names
1063
1057
 
1064
1058
  for name in names:
1065
1059
  if name in forbidden:
1066
1060
  raise Exception(
1067
- f"Latent space '{name}' cannot be ignored. 'user_custom' is reserved "
1068
- f"for set_custom_latent_space."
1069
- )
1070
- if name == "balanced" and not analysis_ls_names:
1071
- raise Exception(
1072
- "Latent space 'balanced' (the model-derived default latent space) can "
1073
- "only be ignored when a replacement is registered. Add "
1074
- "@tensorleap_custom_latent_space(..., use_ls_for_analysis=True) to the "
1075
- "latent space that should be analyzed instead, or drop 'balanced' from "
1076
- "ignore_latent_spaces — ignoring it with nothing in its place would "
1077
- "leave the analyses with no latent space."
1061
+ f"Latent space '{name}' cannot be ignored. "
1062
+ f"'balanced' is the universal fallback default LS and 'user_custom' is "
1063
+ f"reserved for set_custom_latent_space."
1078
1064
  )
1079
1065
  if name not in allowed_tokens:
1080
1066
  raise Exception(
1081
1067
  f"Latent space name '{name}' in ignore_latent_spaces did not match "
1082
1068
  f"any registered input or prediction. Available names: "
1083
1069
  f"inputs={sorted(input_names)}, predictions={sorted(prediction_names)}, "
1084
- f"tokens=['foreground', 'balanced']."
1070
+ f"tokens=['foreground']."
1085
1071
  )
1086
1072
 
1087
1073
  def set_batch_size_to_validate(self, batch_size: int) -> None:
@@ -935,7 +935,23 @@ class LeapLoader(LeapLoaderBase):
935
935
 
936
936
  return DatasetSetup(preprocess=dataset_preprocess, inputs=inputs, outputs=ground_truths,
937
937
  metadata=metadata_instances, visualizers=visualizers, prediction_types=prediction_types,
938
- custom_losses=custom_losses, metrics=metrics, simulations=simulations)
938
+ custom_losses=custom_losses, metrics=metrics, simulations=simulations,
939
+ has_element_instances=self._has_element_instances())
940
+
941
+ def _has_element_instances(self) -> bool:
942
+ """Does this dataset have element instances? Both halves, because either alone lies.
943
+
944
+ A registered mask encoder without instance mappings is an integration that declares
945
+ instances and produces none: the engine would take the pooling path with nothing to pool,
946
+ and ask the UI to visualize an instance population that does not exist. Mappings without an
947
+ encoder cannot be masked. Preprocessing has already run by the time this is called (the
948
+ lengths above come from it), so reading the mappings costs nothing extra.
949
+ """
950
+ setup = global_leap_binder.setup_container
951
+ if not setup.instance_masks:
952
+ return False
953
+ return any(response.instance_to_sample_ids_mappings
954
+ for response in self._preprocess_result().values())
939
955
 
940
956
  def get_model_setup_response(self) -> ModelSetup:
941
957
  setup = global_leap_binder.setup_container
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.205.dev0"
3
+ version = "1.0.205.dev2"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"