code-loader 1.0.183.dev0__py3-none-any.whl → 1.0.184__py3-none-any.whl
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.
- code_loader/leaploader.py +122 -37
- code_loader/leaploaderbase.py +2 -2
- {code_loader-1.0.183.dev0.dist-info → code_loader-1.0.184.dist-info}/METADATA +1 -1
- {code_loader-1.0.183.dev0.dist-info → code_loader-1.0.184.dist-info}/RECORD +6 -6
- {code_loader-1.0.183.dev0.dist-info → code_loader-1.0.184.dist-info}/LICENSE +0 -0
- {code_loader-1.0.183.dev0.dist-info → code_loader-1.0.184.dist-info}/WHEEL +0 -0
code_loader/leaploader.py
CHANGED
|
@@ -7,7 +7,7 @@ import sys
|
|
|
7
7
|
from contextlib import redirect_stdout
|
|
8
8
|
from functools import lru_cache
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Dict, List, Iterable, Union, Any, Type, Optional, Callable, Tuple
|
|
10
|
+
from typing import Dict, List, Iterable, Set, Union, Any, Type, Optional, Callable, Tuple
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
import numpy.typing as npt
|
|
@@ -44,7 +44,8 @@ class LeapLoader(LeapLoaderBase):
|
|
|
44
44
|
super().__init__(code_path, code_entry_name)
|
|
45
45
|
|
|
46
46
|
self._preprocess_result_cached = None
|
|
47
|
-
self.
|
|
47
|
+
self._synthetic_lookup: Dict[str, Tuple[PreprocessResponse, Any]] = {}
|
|
48
|
+
self._synthetic_populator: Optional[Callable[[str], None]] = None
|
|
48
49
|
|
|
49
50
|
try:
|
|
50
51
|
from code_loader.mixpanel_tracker import track_code_loader_loaded
|
|
@@ -188,25 +189,61 @@ class LeapLoader(LeapLoaderBase):
|
|
|
188
189
|
for prediction_type in setup.prediction_types
|
|
189
190
|
}
|
|
190
191
|
|
|
192
|
+
def set_synthetic_populator(self, populator: Optional[Callable[[str], None]]) -> None:
|
|
193
|
+
# Hook called by `_resolve_synthetic` when a synthetic sample_id is requested
|
|
194
|
+
# but not yet in `_synthetic_lookup`. The populator should call `run_simulation`
|
|
195
|
+
# for the recipe that produced sample_id, or raise if the recipe can't be
|
|
196
|
+
# resolved. After the call, the entire batch the recipe produced is in
|
|
197
|
+
# `_synthetic_lookup`, so subsequent lookups for sibling sample_ids skip the hook.
|
|
198
|
+
self._synthetic_populator = populator
|
|
199
|
+
|
|
200
|
+
def _user_additional_ids_set(self) -> Set[str]:
|
|
201
|
+
# Membership-test helper for distinguishing user-defined additional samples
|
|
202
|
+
# from synthetic ones. In consumer pods, the populator passes
|
|
203
|
+
# extend_preprocess=False to run_simulation, so additional.sample_ids stays
|
|
204
|
+
# uncontaminated and direct membership check is reliable.
|
|
205
|
+
additional = self._preprocess_result().get(DataStateEnum.additional)
|
|
206
|
+
if additional is None:
|
|
207
|
+
return set()
|
|
208
|
+
return set(additional.sample_ids)
|
|
209
|
+
|
|
210
|
+
def _resolve_synthetic(self, sample_id: Union[int, str],
|
|
211
|
+
state: Optional[DataStateEnum] = None
|
|
212
|
+
) -> Optional[Tuple[PreprocessResponse, Any]]:
|
|
213
|
+
# Resolution flow for state==additional:
|
|
214
|
+
# 1. already-replayed synthetic ID (member of _synthetic_lookup) → cached synthetic flow
|
|
215
|
+
# 2. user-defined ID (member of preprocess[additional].sample_ids) → return None
|
|
216
|
+
# so caller falls through to normal preprocess flow (no recipe lookup built)
|
|
217
|
+
# 3. populator: builds recipe index lazily on first call, replays the missing
|
|
218
|
+
# recipe, populates _synthetic_lookup. Loud-raises on unresolvable IDs.
|
|
219
|
+
#
|
|
220
|
+
# Order rationale: _synthetic_lookup check sits before the user-response check
|
|
221
|
+
# to be robust against `_extend_additional_preprocess` mutation (producer side
|
|
222
|
+
# calls run_simulation with extend_preprocess=True, which appends synthetic IDs
|
|
223
|
+
# into preprocess[additional]). Once an ID is in _synthetic_lookup, that wins
|
|
224
|
+
# regardless of contamination in the preprocess response.
|
|
225
|
+
if not isinstance(sample_id, str):
|
|
226
|
+
return None
|
|
227
|
+
if state != DataStateEnum.additional:
|
|
228
|
+
return None
|
|
229
|
+
if sample_id in self._synthetic_lookup:
|
|
230
|
+
return self._synthetic_lookup[sample_id]
|
|
231
|
+
if sample_id in self._user_additional_ids_set():
|
|
232
|
+
return None
|
|
233
|
+
if self._synthetic_populator is None:
|
|
234
|
+
return None
|
|
235
|
+
self._synthetic_populator(sample_id)
|
|
236
|
+
return self._synthetic_lookup.get(sample_id)
|
|
237
|
+
|
|
191
238
|
def get_sample(self, state: DataStateEnum, sample_id: Union[int, str], instance_id: int = None) -> DatasetSample:
|
|
192
239
|
self.exec_script()
|
|
193
240
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
if sim_preprocess is not None:
|
|
201
|
-
try:
|
|
202
|
-
local_idx = int(local_idx_str)
|
|
203
|
-
original_sample_id = sim_preprocess.sample_ids[local_idx]
|
|
204
|
-
except (ValueError, IndexError):
|
|
205
|
-
pass
|
|
206
|
-
else:
|
|
207
|
-
return self._get_sample_from_preprocess(
|
|
208
|
-
sim_preprocess, original_sample_id, synthetic_index=sample_id
|
|
209
|
-
)
|
|
241
|
+
resolved = self._resolve_synthetic(sample_id, state=state)
|
|
242
|
+
if resolved is not None:
|
|
243
|
+
sim_preprocess, original_local_id = resolved
|
|
244
|
+
return self._get_sample_from_preprocess(
|
|
245
|
+
sim_preprocess, original_local_id, synthetic_index=sample_id
|
|
246
|
+
)
|
|
210
247
|
|
|
211
248
|
preprocess_result = self._preprocess_result()
|
|
212
249
|
if state == DataStateEnum.unlabeled and sample_id not in preprocess_result[state].sample_ids:
|
|
@@ -408,8 +445,13 @@ class LeapLoader(LeapLoaderBase):
|
|
|
408
445
|
result_payloads.append(test_result)
|
|
409
446
|
return result_payloads
|
|
410
447
|
|
|
411
|
-
def run_simulation(self, sim_name, params=None, n_samples=1, seed=0,
|
|
412
|
-
|
|
448
|
+
def run_simulation(self, sim_name, params=None, n_samples=1, seed=0,
|
|
449
|
+
sample_ids=None, extend_preprocess=True):
|
|
450
|
+
# type: (str, Optional[Dict[str, Any]], int, int, Optional[List[str]], bool) -> Dict[str, Any]
|
|
451
|
+
# extend_preprocess=True (default): also extend preprocess_result[additional] with the
|
|
452
|
+
# new synthetic sample_ids (producer-side behavior — synthetic worker needs this for
|
|
453
|
+
# enumeration / data_length tracking). Pass False from consumer-side populators that
|
|
454
|
+
# only need _synthetic_lookup filled, so user's additional response stays uncontaminated.
|
|
413
455
|
self.exec_script()
|
|
414
456
|
sim = next(
|
|
415
457
|
(s for s in global_leap_binder.setup_container.simulations if s.name == sim_name),
|
|
@@ -433,13 +475,46 @@ class LeapLoader(LeapLoaderBase):
|
|
|
433
475
|
for handler in global_leap_binder.setup_container.inputs:
|
|
434
476
|
per_encoder[handler.name].append(handler.function(sample_id, sim_preprocess))
|
|
435
477
|
encoded = {name: np.stack(arrays) for name, arrays in per_encoder.items()}
|
|
436
|
-
if
|
|
437
|
-
|
|
438
|
-
|
|
478
|
+
if sample_ids is not None:
|
|
479
|
+
if len(sample_ids) != len(original_sample_ids):
|
|
480
|
+
raise ValueError(
|
|
481
|
+
"sample_ids length ({}) does not match simulation output length ({})".format(
|
|
482
|
+
len(sample_ids), len(original_sample_ids)
|
|
483
|
+
)
|
|
484
|
+
)
|
|
485
|
+
for sid in sample_ids:
|
|
486
|
+
if not isinstance(sid, str):
|
|
487
|
+
raise TypeError(
|
|
488
|
+
"All sample_ids must be of type str. Got: {}".format(type(sid))
|
|
489
|
+
)
|
|
490
|
+
for synth_id, original_local_id in zip(sample_ids, original_sample_ids):
|
|
491
|
+
self._synthetic_lookup[synth_id] = (sim_preprocess, original_local_id)
|
|
492
|
+
if extend_preprocess:
|
|
493
|
+
self._extend_additional_preprocess(list(sample_ids))
|
|
494
|
+
returned_sample_ids = list(sample_ids)
|
|
439
495
|
else:
|
|
440
496
|
returned_sample_ids = original_sample_ids
|
|
441
497
|
return {"encoded": encoded, "sample_ids": returned_sample_ids}
|
|
442
498
|
|
|
499
|
+
def _extend_additional_preprocess(self, new_sample_ids: List[str]) -> None:
|
|
500
|
+
if self._preprocess_result_cached is None:
|
|
501
|
+
self._preprocess_result()
|
|
502
|
+
additional = self._preprocess_result_cached.get(DataStateEnum.additional)
|
|
503
|
+
if additional is None:
|
|
504
|
+
placeholder = PreprocessResponse(
|
|
505
|
+
sample_ids=list(new_sample_ids),
|
|
506
|
+
data={},
|
|
507
|
+
state=DataStateType.additional,
|
|
508
|
+
sample_id_type=str,
|
|
509
|
+
tl_generated=True,
|
|
510
|
+
)
|
|
511
|
+
self._preprocess_result_cached[DataStateEnum.additional] = placeholder
|
|
512
|
+
global_leap_binder.setup_container.preprocess.data_length[DataStateType.additional] = placeholder.length
|
|
513
|
+
else:
|
|
514
|
+
additional.sample_ids = list(additional.sample_ids) + list(new_sample_ids)
|
|
515
|
+
additional.length = len(additional.sample_ids)
|
|
516
|
+
global_leap_binder.setup_container.preprocess.data_length[DataStateType.additional] = additional.length
|
|
517
|
+
|
|
443
518
|
@staticmethod
|
|
444
519
|
def _get_all_dataset_base_handlers() -> List[Union[DatasetBaseHandler, MetadataHandler]]:
|
|
445
520
|
all_dataset_base_handlers: List[Union[DatasetBaseHandler, MetadataHandler]] = []
|
|
@@ -653,7 +728,13 @@ class LeapLoader(LeapLoaderBase):
|
|
|
653
728
|
state: DataStateEnum, sample_id: Union[int, str]) -> Dict[str, npt.NDArray[np.float32]]:
|
|
654
729
|
result_agg = {}
|
|
655
730
|
preprocess_result = self._preprocess_result()
|
|
656
|
-
|
|
731
|
+
resolved = self._resolve_synthetic(sample_id, state=state)
|
|
732
|
+
if resolved is not None:
|
|
733
|
+
sim_preprocess, original_local_id = resolved
|
|
734
|
+
preprocess_state = sim_preprocess
|
|
735
|
+
sample_id = original_local_id
|
|
736
|
+
else:
|
|
737
|
+
preprocess_state = preprocess_result[state]
|
|
657
738
|
for handler in handlers:
|
|
658
739
|
handler_result = handler.function(sample_id, preprocess_state)
|
|
659
740
|
handler_name = handler.name
|
|
@@ -667,7 +748,13 @@ class LeapLoader(LeapLoaderBase):
|
|
|
667
748
|
if instance_id is None:
|
|
668
749
|
return None
|
|
669
750
|
preprocess_result = self._preprocess_result()
|
|
670
|
-
|
|
751
|
+
resolved = self._resolve_synthetic(sample_id, state=state)
|
|
752
|
+
if resolved is not None:
|
|
753
|
+
sim_preprocess, original_local_id = resolved
|
|
754
|
+
preprocess_state = sim_preprocess
|
|
755
|
+
sample_id = original_local_id
|
|
756
|
+
else:
|
|
757
|
+
preprocess_state = preprocess_result[state]
|
|
671
758
|
result_agg = {}
|
|
672
759
|
for handler in global_leap_binder.setup_container.instance_masks:
|
|
673
760
|
handler_result = handler.function(sample_id, preprocess_state, instance_id)
|
|
@@ -727,7 +814,13 @@ class LeapLoader(LeapLoaderBase):
|
|
|
727
814
|
result_agg = {}
|
|
728
815
|
is_none = {}
|
|
729
816
|
preprocess_result = self._preprocess_result()
|
|
730
|
-
|
|
817
|
+
resolved = self._resolve_synthetic(sample_id, state=state)
|
|
818
|
+
if resolved is not None:
|
|
819
|
+
sim_preprocess, original_local_id = resolved
|
|
820
|
+
preprocess_state = sim_preprocess
|
|
821
|
+
sample_id = original_local_id
|
|
822
|
+
else:
|
|
823
|
+
preprocess_state = preprocess_result[state]
|
|
731
824
|
for handler in global_leap_binder.setup_container.metadata:
|
|
732
825
|
if requested_metadata_names:
|
|
733
826
|
if not is_metadata_name_starts_with_handler_name(handler):
|
|
@@ -768,17 +861,9 @@ class LeapLoader(LeapLoaderBase):
|
|
|
768
861
|
return global_leap_binder.setup_container.custom_latent_space is not None
|
|
769
862
|
|
|
770
863
|
def get_instances_data(self, state: DataStateEnum) -> Tuple[Dict[str, List[str]], Dict[str, str]]:
|
|
771
|
-
"""
|
|
772
|
-
This Method get the data state and returns two dictionaries that holds the mapping of the sample ids to their
|
|
773
|
-
instances and the other way around and the sample ids array.
|
|
774
|
-
Args:
|
|
775
|
-
state: DataStateEnum state
|
|
776
|
-
Returns:
|
|
777
|
-
sample_ids_to_instance_mappings: sample id to instance mappings
|
|
778
|
-
instance_to_sample_ids_mappings: instance to sample ids mappings
|
|
779
|
-
sample_ids: sample ids array
|
|
780
|
-
"""
|
|
781
864
|
preprocess_result = self._preprocess_result()
|
|
782
|
-
preprocess_state = preprocess_result
|
|
865
|
+
preprocess_state = preprocess_result.get(state)
|
|
866
|
+
if preprocess_state is None:
|
|
867
|
+
return None, None
|
|
783
868
|
return preprocess_state.sample_ids_to_instance_mappings, preprocess_state.instance_to_sample_ids_mappings
|
|
784
869
|
|
code_loader/leaploaderbase.py
CHANGED
|
@@ -154,8 +154,8 @@ class LeapLoaderBase:
|
|
|
154
154
|
pass
|
|
155
155
|
|
|
156
156
|
@abstractmethod
|
|
157
|
-
def run_simulation(self, sim_name, params=None, n_samples=1, seed=0,
|
|
158
|
-
# type: (str, Optional[Dict[str, Any]], int, int, Optional[str]) -> Dict[str, Any]
|
|
157
|
+
def run_simulation(self, sim_name, params=None, n_samples=1, seed=0, sample_ids=None):
|
|
158
|
+
# type: (str, Optional[Dict[str, Any]], int, int, Optional[List[str]]) -> Dict[str, Any]
|
|
159
159
|
pass
|
|
160
160
|
|
|
161
161
|
def is_custom_latent_space(self) -> bool:
|
|
@@ -23,8 +23,8 @@ code_loader/experiment_api/workingspace_config_utils.py,sha256=DLzXQCg4dgTV_YgaS
|
|
|
23
23
|
code_loader/inner_leap_binder/__init__.py,sha256=koOlJyMNYzGbEsoIbXathSmQ-L38N_pEXH_HvL7beXU,99
|
|
24
24
|
code_loader/inner_leap_binder/leapbinder.py,sha256=XLYYcV50qjMvoC1S6WW0tLBch_0g5gl1UyHiVSWYbvg,40491
|
|
25
25
|
code_loader/inner_leap_binder/leapbinder_decorators.py,sha256=YlK51b5Ryo396f7tOA7Ole3vYCLs3f5ZLm2qDQ9K1NE,105781
|
|
26
|
-
code_loader/leaploader.py,sha256=
|
|
27
|
-
code_loader/leaploaderbase.py,sha256=
|
|
26
|
+
code_loader/leaploader.py,sha256=K9Q5kiCZ_A2GkS5qOEantAMvWGaz3bmO1X8buXDSpgg,44682
|
|
27
|
+
code_loader/leaploaderbase.py,sha256=l36qDA00GhZEG5NLKpEtAXgWJA-UQQIhNFGxywK7mUA,6530
|
|
28
28
|
code_loader/mixpanel_tracker.py,sha256=rNwRmFifNbdUoqLQvvhhgpKczWpWiEmd8MfyJe27sxw,9131
|
|
29
29
|
code_loader/plot_functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
30
|
code_loader/plot_functions/plot_functions.py,sha256=6Q7VWGxetL2W0EK2QeCdObVATvBuHs3YBA09H4uoIk0,14996
|
|
@@ -32,7 +32,7 @@ code_loader/plot_functions/visualize.py,sha256=gsBAYYkwMh7jIpJeDMPS8G4CW-pxwx6Lz
|
|
|
32
32
|
code_loader/utils.py,sha256=YecipkdTA-VcE9F0RQcY9cFnY8P3AksPnHM2Db7xUSk,3972
|
|
33
33
|
code_loader/visualizers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
code_loader/visualizers/default_visualizers.py,sha256=onRnLE_TXfgLN4o52hQIOOhUcFexGlqJ3xSpQDVLuZM,2604
|
|
35
|
-
code_loader-1.0.
|
|
36
|
-
code_loader-1.0.
|
|
37
|
-
code_loader-1.0.
|
|
38
|
-
code_loader-1.0.
|
|
35
|
+
code_loader-1.0.184.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
|
|
36
|
+
code_loader-1.0.184.dist-info/METADATA,sha256=iOj4cFbRfozrJ0PW7vnYNeTHxqDkT5F0IJHW8kbkrX4,1090
|
|
37
|
+
code_loader-1.0.184.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
38
|
+
code_loader-1.0.184.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|