code-loader 1.0.77.1__tar.gz → 1.0.78__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.
- {code_loader-1.0.77.1 → code_loader-1.0.78}/PKG-INFO +1 -1
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/contract/datasetclasses.py +5 -2
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/inner_leap_binder/leapbinder.py +51 -18
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/inner_leap_binder/leapbinder_decorators.py +5 -4
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/leaploader.py +25 -13
- {code_loader-1.0.77.1 → code_loader-1.0.78}/pyproject.toml +1 -1
- {code_loader-1.0.77.1 → code_loader-1.0.78}/LICENSE +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/README.md +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/__init__.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/contract/__init__.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/contract/enums.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/contract/exceptions.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/contract/responsedataclasses.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/contract/visualizer_classes.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/default_losses.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/default_metrics.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/__init__.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/api.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/cli_config_utils.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/client.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/epoch.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/experiment.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/experiment_context.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/types.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/utils.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/inner_leap_binder/__init__.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/leaploaderbase.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/utils.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/visualizers/__init__.py +0 -0
- {code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/visualizers/default_visualizers.py +0 -0
@@ -4,7 +4,8 @@ import re
|
|
4
4
|
import numpy as np
|
5
5
|
import numpy.typing as npt
|
6
6
|
|
7
|
-
from code_loader.contract.enums import DataStateType, DataStateEnum, LeapDataType, ConfusionMatrixValue,
|
7
|
+
from code_loader.contract.enums import DataStateType, DataStateEnum, LeapDataType, ConfusionMatrixValue, \
|
8
|
+
MetricDirection, DatasetMetadataType
|
8
9
|
from code_loader.contract.visualizer_classes import LeapImage, LeapText, LeapGraph, LeapHorizontalBar, \
|
9
10
|
LeapTextMask, LeapImageMask, LeapImageWithBBox, LeapImageWithHeatmap
|
10
11
|
|
@@ -196,6 +197,7 @@ class GroundTruthHandler(DatasetBaseHandler):
|
|
196
197
|
class MetadataHandler:
|
197
198
|
name: str
|
198
199
|
function: MetadataSectionCallableInterface
|
200
|
+
metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None
|
199
201
|
|
200
202
|
|
201
203
|
@dataclass
|
@@ -232,6 +234,7 @@ class DatasetIntegrationSetup:
|
|
232
234
|
class DatasetSample:
|
233
235
|
inputs: Dict[str, npt.NDArray[np.float32]]
|
234
236
|
gt: Optional[Dict[str, npt.NDArray[np.float32]]]
|
235
|
-
metadata: Dict[str, Union[str, int, bool, float]]
|
237
|
+
metadata: Dict[str, Union[Optional[str], int, bool, Optional[float]]]
|
238
|
+
metadata_is_none: Dict[str, bool]
|
236
239
|
index: Union[int, str]
|
237
240
|
state: DataStateEnum
|
@@ -11,7 +11,7 @@ from code_loader.contract.datasetclasses import SectionCallableInterface, InputH
|
|
11
11
|
CustomCallableInterfaceMultiArgs, ConfusionMatrixCallableInterfaceMultiArgs, LeapData, \
|
12
12
|
CustomMultipleReturnCallableInterfaceMultiArgs, DatasetBaseHandler, custom_latent_space_attribute, \
|
13
13
|
RawInputsForHeatmap, VisualizerHandlerData, MetricHandlerData, CustomLossHandlerData, SamplePreprocessResponse
|
14
|
-
from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection
|
14
|
+
from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection, DatasetMetadataType
|
15
15
|
from code_loader.contract.responsedataclasses import DatasetTestResultPayload
|
16
16
|
from code_loader.contract.visualizer_classes import map_leap_data_type_to_visualizer_class
|
17
17
|
from code_loader.default_losses import loss_name_to_function
|
@@ -333,7 +333,8 @@ class LeapBinder:
|
|
333
333
|
|
334
334
|
self._encoder_names.append(name)
|
335
335
|
|
336
|
-
def set_metadata(self, function: MetadataSectionCallableInterface, name: str
|
336
|
+
def set_metadata(self, function: MetadataSectionCallableInterface, name: str,
|
337
|
+
metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None) -> None:
|
337
338
|
"""
|
338
339
|
Set the metadata handler function. This function is used for measuring and analyzing external variable values per sample, which is recommended for analysis within the Tensorleap platform.
|
339
340
|
|
@@ -368,7 +369,7 @@ class LeapBinder:
|
|
368
369
|
leap_binder.set_metadata(metadata_handler_index, name='metadata_index')
|
369
370
|
leap_binder.set_metadata(metadata_handler_image_mean, name='metadata_image_mean')
|
370
371
|
"""
|
371
|
-
self.setup_container.metadata.append(MetadataHandler(name, function))
|
372
|
+
self.setup_container.metadata.append(MetadataHandler(name, function, metadata_type))
|
372
373
|
|
373
374
|
def set_custom_layer(self, custom_layer: Type[Any], name: str, inspect_layer: bool = False,
|
374
375
|
kernel_index: Optional[int] = None, use_custom_latent_space: bool = False) -> None:
|
@@ -465,23 +466,55 @@ class LeapBinder:
|
|
465
466
|
@staticmethod
|
466
467
|
def check_handler(
|
467
468
|
preprocess_response: PreprocessResponse, test_result: List[DatasetTestResultPayload],
|
468
|
-
dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler]) -> List[DatasetTestResultPayload]:
|
469
|
+
dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler], state: DataStateEnum) -> List[DatasetTestResultPayload]:
|
469
470
|
assert preprocess_response.sample_ids is not None
|
470
471
|
raw_result = dataset_base_handler.function(preprocess_response.sample_ids[0], preprocess_response)
|
471
472
|
handler_type = 'metadata' if isinstance(dataset_base_handler, MetadataHandler) else None
|
472
|
-
if isinstance(dataset_base_handler, MetadataHandler)
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
473
|
+
if isinstance(dataset_base_handler, MetadataHandler):
|
474
|
+
if isinstance(raw_result, dict):
|
475
|
+
metadata_test_result_payloads = [
|
476
|
+
DatasetTestResultPayload(f'{dataset_base_handler.name}_{single_metadata_name}')
|
477
|
+
for single_metadata_name, single_metadata_result in raw_result.items()
|
478
|
+
]
|
479
|
+
for i, (single_metadata_name, single_metadata_result) in enumerate(raw_result.items()):
|
480
|
+
metadata_test_result = metadata_test_result_payloads[i]
|
481
|
+
|
482
|
+
metadata_type = None
|
483
|
+
if single_metadata_result is None:
|
484
|
+
if state != DataStateEnum.training and test_result[i].name == f'{dataset_base_handler.name}_{single_metadata_name}':
|
485
|
+
metadata_test_result_payloads[i] = test_result[i]
|
486
|
+
continue
|
487
|
+
|
488
|
+
if dataset_base_handler.metadata_type is None:
|
489
|
+
raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
|
490
|
+
elif isinstance(dataset_base_handler.metadata_type, dict):
|
491
|
+
if single_metadata_name not in dataset_base_handler.metadata_type:
|
492
|
+
raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
|
493
|
+
metadata_type = dataset_base_handler.metadata_type[single_metadata_name]
|
494
|
+
else:
|
495
|
+
raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
|
496
|
+
|
497
|
+
result_shape = get_shape(single_metadata_result)
|
498
|
+
metadata_test_result.shape = result_shape
|
499
|
+
metadata_test_result.raw_result = (
|
500
|
+
single_metadata_result) if single_metadata_result is not None else metadata_type
|
501
|
+
metadata_test_result.handler_type = handler_type
|
502
|
+
test_result = metadata_test_result_payloads
|
503
|
+
else:
|
504
|
+
if raw_result is None:
|
505
|
+
if state != DataStateEnum.training:
|
506
|
+
return test_result
|
507
|
+
|
508
|
+
if dataset_base_handler.metadata_type is None:
|
509
|
+
raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
|
510
|
+
elif isinstance(dataset_base_handler.metadata_type, dict):
|
511
|
+
raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
|
512
|
+
metadata_type = dataset_base_handler.metadata_type
|
513
|
+
|
514
|
+
result_shape = get_shape(raw_result)
|
515
|
+
test_result[0].shape = result_shape
|
516
|
+
test_result[0].raw_result = raw_result if raw_result is not None else metadata_type
|
517
|
+
test_result[0].handler_type = handler_type
|
485
518
|
else:
|
486
519
|
result_shape = get_shape(raw_result)
|
487
520
|
test_result[0].shape = result_shape
|
@@ -500,7 +533,7 @@ class LeapBinder:
|
|
500
533
|
for state, preprocess_response in preprocess_result.items():
|
501
534
|
if state == DataStateEnum.unlabeled and isinstance(dataset_base_handler, GroundTruthHandler):
|
502
535
|
continue
|
503
|
-
self.check_handler(preprocess_response, test_result, dataset_base_handler)
|
536
|
+
self.check_handler(preprocess_response, test_result, dataset_base_handler, state)
|
504
537
|
|
505
538
|
def check(self) -> None:
|
506
539
|
preprocess_result = self.get_preprocess_result()
|
{code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/inner_leap_binder/leapbinder_decorators.py
RENAMED
@@ -9,7 +9,7 @@ from code_loader.contract.datasetclasses import CustomCallableInterfaceMultiArgs
|
|
9
9
|
CustomMultipleReturnCallableInterfaceMultiArgs, ConfusionMatrixCallableInterfaceMultiArgs, CustomCallableInterface, \
|
10
10
|
VisualizerCallableInterface, MetadataSectionCallableInterface, PreprocessResponse, SectionCallableInterface, \
|
11
11
|
ConfusionMatrixElement, SamplePreprocessResponse
|
12
|
-
from code_loader.contract.enums import MetricDirection, LeapDataType
|
12
|
+
from code_loader.contract.enums import MetricDirection, LeapDataType, DatasetMetadataType
|
13
13
|
from code_loader import leap_binder
|
14
14
|
from code_loader.contract.visualizer_classes import LeapImage, LeapImageMask, LeapTextMask, LeapText, LeapGraph, \
|
15
15
|
LeapHorizontalBar, LeapImageWithBBox, LeapImageWithHeatmap
|
@@ -160,14 +160,15 @@ def tensorleap_custom_visualizer(name: str, visualizer_type: LeapDataType,
|
|
160
160
|
return decorating_function
|
161
161
|
|
162
162
|
|
163
|
-
def tensorleap_metadata(
|
163
|
+
def tensorleap_metadata(
|
164
|
+
name: str, metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None):
|
164
165
|
def decorating_function(user_function: MetadataSectionCallableInterface):
|
165
166
|
for metadata_handler in leap_binder.setup_container.metadata:
|
166
167
|
if metadata_handler.name == name:
|
167
168
|
raise Exception(f'Metadata with name {name} already exists. '
|
168
169
|
f'Please choose another')
|
169
170
|
|
170
|
-
leap_binder.set_metadata(user_function, name)
|
171
|
+
leap_binder.set_metadata(user_function, name, metadata_type)
|
171
172
|
|
172
173
|
def _validate_input_args(sample_id: Union[int, str], preprocess_response: PreprocessResponse):
|
173
174
|
assert isinstance(sample_id, (int, str)), \
|
@@ -182,7 +183,7 @@ def tensorleap_metadata(name: str):
|
|
182
183
|
f'{preprocess_response.sample_id_type}. Got {type(sample_id)}.')
|
183
184
|
|
184
185
|
def _validate_result(result):
|
185
|
-
supported_result_types = (int, str, bool, float, dict, np.floating,
|
186
|
+
supported_result_types = (type(None), int, str, bool, float, dict, np.floating,
|
186
187
|
np.bool_, np.unsignedinteger, np.signedinteger, np.integer)
|
187
188
|
assert isinstance(result, supported_result_types), \
|
188
189
|
(f'tensorleap_metadata validation failed: '
|
@@ -6,7 +6,7 @@ import sys
|
|
6
6
|
from contextlib import redirect_stdout
|
7
7
|
from functools import lru_cache
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import Dict, List, Iterable, Union, Any, Type, Optional, Callable
|
9
|
+
from typing import Dict, List, Iterable, Union, Any, Type, Optional, Callable, Tuple
|
10
10
|
|
11
11
|
import numpy as np
|
12
12
|
import numpy.typing as npt
|
@@ -140,9 +140,11 @@ class LeapLoader(LeapLoaderBase):
|
|
140
140
|
if state == DataStateEnum.unlabeled and sample_id not in preprocess_result[state].sample_ids:
|
141
141
|
self._preprocess_result(update_unlabeled_preprocess=True)
|
142
142
|
|
143
|
+
metadata, metadata_is_none = self._get_metadata(state, sample_id)
|
143
144
|
sample = DatasetSample(inputs=self._get_inputs(state, sample_id),
|
144
145
|
gt=None if state == DataStateEnum.unlabeled else self._get_gt(state, sample_id),
|
145
|
-
metadata=
|
146
|
+
metadata=metadata,
|
147
|
+
metadata_is_none=metadata_is_none,
|
146
148
|
index=sample_id,
|
147
149
|
state=state)
|
148
150
|
return sample
|
@@ -210,7 +212,7 @@ class LeapLoader(LeapLoaderBase):
|
|
210
212
|
state_name = state.name
|
211
213
|
try:
|
212
214
|
test_result = global_leap_binder.check_handler(
|
213
|
-
preprocess_response, test_result, dataset_base_handler)
|
215
|
+
preprocess_response, test_result, dataset_base_handler, state)
|
214
216
|
except Exception as e:
|
215
217
|
line_number, file_name, stacktrace = get_root_exception_file_and_line_number()
|
216
218
|
test_result[0].display[
|
@@ -339,6 +341,11 @@ class LeapLoader(LeapLoaderBase):
|
|
339
341
|
continue
|
340
342
|
if hasattr(handler_test_payload.raw_result, 'tolist'):
|
341
343
|
handler_test_payload.raw_result = handler_test_payload.raw_result.tolist()
|
344
|
+
if isinstance(handler_test_payload.raw_result, DatasetMetadataType):
|
345
|
+
dataset_metadata_type = handler_test_payload.raw_result
|
346
|
+
metadata_instances.append(DatasetMetadataInstance(name=handler_test_payload.name,
|
347
|
+
type=dataset_metadata_type))
|
348
|
+
continue
|
342
349
|
metadata_type = type(handler_test_payload.raw_result)
|
343
350
|
if metadata_type == int or isinstance(handler_test_payload.raw_result,
|
344
351
|
(np.unsignedinteger, np.signedinteger)):
|
@@ -438,7 +445,7 @@ class LeapLoader(LeapLoaderBase):
|
|
438
445
|
}
|
439
446
|
return metadata_name_to_type
|
440
447
|
|
441
|
-
def _convert_metadata_to_correct_type(self, metadata_name: str, value: Any) -> Any:
|
448
|
+
def _convert_metadata_to_correct_type(self, metadata_name: str, value: Any) -> Tuple[Any, bool]:
|
442
449
|
metadata_name_to_type = self._metadata_name_to_type()
|
443
450
|
metadata_type_to_python_type = {
|
444
451
|
DatasetMetadataType.float: float,
|
@@ -447,22 +454,26 @@ class LeapLoader(LeapLoaderBase):
|
|
447
454
|
DatasetMetadataType.int: int
|
448
455
|
}
|
449
456
|
metadata_type_to_default_value = {
|
450
|
-
DatasetMetadataType.float: -1,
|
451
|
-
DatasetMetadataType.string:
|
457
|
+
DatasetMetadataType.float: -1.0,
|
458
|
+
DatasetMetadataType.string: 'None',
|
452
459
|
DatasetMetadataType.boolean: False,
|
453
460
|
DatasetMetadataType.int: -1
|
454
461
|
}
|
455
462
|
|
456
463
|
try:
|
464
|
+
is_none = False
|
465
|
+
if value is None:
|
466
|
+
raise ValueError()
|
457
467
|
converted_value = metadata_type_to_python_type[metadata_name_to_type[metadata_name]](value)
|
458
468
|
except ValueError:
|
469
|
+
is_none = True
|
459
470
|
converted_value = metadata_type_to_default_value[metadata_name_to_type[metadata_name]]
|
460
471
|
|
461
|
-
return converted_value
|
472
|
+
return converted_value, is_none
|
462
473
|
|
463
|
-
def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Dict[
|
464
|
-
str, Union[str, int, bool, float]]:
|
474
|
+
def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
|
465
475
|
result_agg = {}
|
476
|
+
is_none = {}
|
466
477
|
preprocess_result = self._preprocess_result()
|
467
478
|
preprocess_state = preprocess_result[state]
|
468
479
|
for handler in global_leap_binder.setup_container.metadata:
|
@@ -470,13 +481,14 @@ class LeapLoader(LeapLoaderBase):
|
|
470
481
|
if isinstance(handler_result, dict):
|
471
482
|
for single_metadata_name, single_metadata_result in handler_result.items():
|
472
483
|
handler_name = f'{handler.name}_{single_metadata_name}'
|
473
|
-
result_agg[handler_name] = self._convert_metadata_to_correct_type(
|
474
|
-
|
484
|
+
result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
|
485
|
+
handler_name, single_metadata_result)
|
475
486
|
else:
|
476
487
|
handler_name = handler.name
|
477
|
-
result_agg[handler_name] = self._convert_metadata_to_correct_type(
|
488
|
+
result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
|
489
|
+
handler_name, handler_result)
|
478
490
|
|
479
|
-
return result_agg
|
491
|
+
return result_agg, is_none
|
480
492
|
|
481
493
|
@lru_cache()
|
482
494
|
def get_sample_id_type(self) -> Type:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/experiment_context.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{code_loader-1.0.77.1 → code_loader-1.0.78}/code_loader/experiment_api/workingspace_config_utils.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|