code-loader 1.0.87a2__py3-none-any.whl → 1.0.87.dev1__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.
@@ -7,7 +7,7 @@ import numpy.typing as npt
7
7
  from code_loader.contract.enums import DataStateType, DataStateEnum, LeapDataType, ConfusionMatrixValue, \
8
8
  MetricDirection, DatasetMetadataType
9
9
  from code_loader.contract.visualizer_classes import LeapImage, LeapText, LeapGraph, LeapHorizontalBar, \
10
- LeapTextMask, LeapImageMask, LeapImageWithBBox, LeapImageWithHeatmap
10
+ LeapTextMask, LeapImageMask, LeapImageWithBBox, LeapImageWithHeatmap, LeapVideo
11
11
 
12
12
  custom_latent_space_attribute = "custom_latent_space"
13
13
 
@@ -94,6 +94,7 @@ class UnlabeledDataPreprocessHandler:
94
94
 
95
95
  VisualizerCallableInterface = Union[
96
96
  Callable[..., LeapImage],
97
+ Callable[..., LeapVideo],
97
98
  Callable[..., LeapText],
98
99
  Callable[..., LeapGraph],
99
100
  Callable[..., LeapHorizontalBar],
@@ -104,7 +105,7 @@ VisualizerCallableInterface = Union[
104
105
  ]
105
106
 
106
107
  LeapData = Union[LeapImage, LeapText, LeapGraph, LeapHorizontalBar, LeapImageMask, LeapTextMask, LeapImageWithBBox,
107
- LeapImageWithHeatmap]
108
+ LeapImageWithHeatmap, LeapVideo]
108
109
 
109
110
  CustomCallableInterface = Callable[..., Any]
110
111
 
@@ -0,0 +1,42 @@
1
+ from enum import Enum
2
+
3
+ from typing import Optional, Dict, Any, List
4
+ from dataclasses import dataclass
5
+
6
+
7
+
8
+ class NodeMappingType(Enum):
9
+ Visualizer = 'Visualizer'
10
+ Metric = 'Metric'
11
+ GroundTruth = 'GroundTruth'
12
+ Input = 'Input'
13
+ Layer = 'Layer'
14
+ Loss = 'Loss'
15
+ CustomLoss = 'CustomLoss'
16
+ Optimizer = 'Optimizer'
17
+ Prediction0 = 'Prediction0'
18
+ Prediction1 = 'Prediction1'
19
+ Prediction2 = 'Prediction2'
20
+ Prediction3 = 'Prediction3'
21
+ Input0 = 'Input0'
22
+ Input1 = 'Input1'
23
+ Input2 = 'Input2'
24
+ Input3 = 'Input3'
25
+ Input4 = 'Input4'
26
+ Input5 = 'Input5'
27
+
28
+
29
+ @dataclass
30
+ class NodeMapping:
31
+ name: str
32
+ type: NodeMappingType
33
+ user_unique_name: Optional[str] = None
34
+ sub_type: Optional[str] = None
35
+ arg_names: Optional[List[str]] = None
36
+
37
+
38
+ @dataclass
39
+ class NodeConnection:
40
+ node: NodeMapping
41
+ node_inputs: Optional[Dict[str, NodeMapping]]
42
+ prediction_type_name: Optional[str] = None
@@ -12,15 +12,16 @@ from code_loader.contract.datasetclasses import SectionCallableInterface, InputH
12
12
  CustomMultipleReturnCallableInterfaceMultiArgs, DatasetBaseHandler, custom_latent_space_attribute, \
13
13
  RawInputsForHeatmap, VisualizerHandlerData, MetricHandlerData, CustomLossHandlerData, SamplePreprocessResponse
14
14
  from code_loader.contract.enums import LeapDataType, DataStateEnum, DataStateType, MetricDirection, DatasetMetadataType
15
+ from code_loader.contract.mapping import NodeConnection
15
16
  from code_loader.contract.responsedataclasses import DatasetTestResultPayload
16
17
  from code_loader.contract.visualizer_classes import map_leap_data_type_to_visualizer_class
17
18
  from code_loader.default_losses import loss_name_to_function
18
19
  from code_loader.default_metrics import metrics_names_to_functions_and_direction
19
- from code_loader.utils import to_numpy_return_wrapper, get_shape, flatten
20
+ from code_loader.utils import to_numpy_return_wrapper, get_shape
20
21
  from code_loader.visualizers.default_visualizers import DefaultVisualizer, \
21
22
  default_graph_visualizer, \
22
23
  default_image_visualizer, default_horizontal_bar_visualizer, default_word_visualizer, \
23
- default_image_mask_visualizer, default_text_mask_visualizer, default_raw_data_visualizer
24
+ default_image_mask_visualizer, default_text_mask_visualizer, default_raw_data_visualizer, default_video_visualizer
24
25
 
25
26
 
26
27
  class LeapBinder:
@@ -43,11 +44,15 @@ class LeapBinder:
43
44
  self._extend_with_default_metrics()
44
45
  self._extend_with_default_losses()
45
46
 
47
+ self.mapping_connections: List[NodeConnection] = []
48
+
46
49
  self.batch_size_to_validate: Optional[int] = None
47
50
 
48
51
  def _extend_with_default_visualizers(self) -> None:
49
52
  self.set_visualizer(function=default_image_visualizer, name=DefaultVisualizer.Image.value,
50
53
  visualizer_type=LeapDataType.Image)
54
+ self.set_visualizer(function=default_video_visualizer, name=DefaultVisualizer.Video.value,
55
+ visualizer_type=LeapDataType.Video)
51
56
  self.set_visualizer(function=default_graph_visualizer, name=DefaultVisualizer.Graph.value,
52
57
  visualizer_type=LeapDataType.Graph)
53
58
  self.set_visualizer(function=default_raw_data_visualizer, name=DefaultVisualizer.RawData.value,
@@ -353,8 +358,7 @@ class LeapBinder:
353
358
  self._encoder_names.append(name)
354
359
 
355
360
  def set_metadata(self, function: MetadataSectionCallableInterface, name: str,
356
- metadata_type: Optional[
357
- Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None) -> None:
361
+ metadata_type: Optional[Union[DatasetMetadataType, Dict[str, DatasetMetadataType]]] = None) -> None:
358
362
  """
359
363
  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.
360
364
 
@@ -491,41 +495,39 @@ class LeapBinder:
491
495
  @staticmethod
492
496
  def check_handler(
493
497
  preprocess_response: PreprocessResponse, test_result: List[DatasetTestResultPayload],
494
- dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler], state: DataStateEnum) -> List[
495
- DatasetTestResultPayload]:
498
+ dataset_base_handler: Union[DatasetBaseHandler, MetadataHandler], state: DataStateEnum) -> List[DatasetTestResultPayload]:
496
499
  assert preprocess_response.sample_ids is not None
497
500
  raw_result = dataset_base_handler.function(preprocess_response.sample_ids[0], preprocess_response)
498
501
  handler_type = 'metadata' if isinstance(dataset_base_handler, MetadataHandler) else None
499
502
  if isinstance(dataset_base_handler, MetadataHandler):
500
503
  if isinstance(raw_result, dict):
501
- metadata_test_result_payloads = []
502
- for i, (flat_name, flat_result) in enumerate(flatten(raw_result, prefix=dataset_base_handler.name)):
503
- result_payload = DatasetTestResultPayload(flat_name)
504
+ metadata_test_result_payloads = [
505
+ DatasetTestResultPayload(f'{dataset_base_handler.name}_{single_metadata_name}')
506
+ for single_metadata_name, single_metadata_result in raw_result.items()
507
+ ]
508
+ for i, (single_metadata_name, single_metadata_result) in enumerate(raw_result.items()):
509
+ metadata_test_result = metadata_test_result_payloads[i]
504
510
 
505
511
  metadata_type = None
506
- if flat_result is None:
507
- if state != DataStateEnum.training and test_result[i].name == flat_name:
508
- result_payload = test_result[i]
509
- metadata_test_result_payloads.append(result_payload)
512
+ if single_metadata_result is None:
513
+ if state != DataStateEnum.training and test_result[i].name == f'{dataset_base_handler.name}_{single_metadata_name}':
514
+ metadata_test_result_payloads[i] = test_result[i]
510
515
  continue
511
516
 
512
517
  if dataset_base_handler.metadata_type is None:
513
- raise Exception(f"Metadata {flat_name} is None and no metadata type is provided")
518
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
514
519
  elif isinstance(dataset_base_handler.metadata_type, dict):
515
- if flat_name not in dataset_base_handler.metadata_type:
516
- raise Exception(
517
- f"Metadata {flat_name} is None and was not found in the provided metadata type")
518
- metadata_type = dataset_base_handler.metadata_type[flat_name]
520
+ if single_metadata_name not in dataset_base_handler.metadata_type:
521
+ raise Exception(f"Metadata {single_metadata_name} is None and no metadata type is provided")
522
+ metadata_type = dataset_base_handler.metadata_type[single_metadata_name]
519
523
  else:
520
- raise Exception(f"Metadata {flat_name} is None and was not found in the provided metadata "
521
- f"type, metadata_type: {dataset_base_handler.metadata_type}")
522
-
523
- result_shape = get_shape(flat_result)
524
- result_payload.shape = result_shape
525
- result_payload.raw_result = flat_result if flat_result is not None else metadata_type
526
- result_payload.handler_type = handler_type
527
- metadata_test_result_payloads.append(result_payload)
524
+ raise Exception(f"Metadata {single_metadata_name} is None and metadata type is not a dict")
528
525
 
526
+ result_shape = get_shape(single_metadata_result)
527
+ metadata_test_result.shape = result_shape
528
+ metadata_test_result.raw_result = (
529
+ single_metadata_result) if single_metadata_result is not None else metadata_type
530
+ metadata_test_result.handler_type = handler_type
529
531
  test_result = metadata_test_result_payloads
530
532
  else:
531
533
  if raw_result is None:
@@ -533,11 +535,9 @@ class LeapBinder:
533
535
  return test_result
534
536
 
535
537
  if dataset_base_handler.metadata_type is None:
536
- raise Exception(
537
- f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
538
+ raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
538
539
  elif isinstance(dataset_base_handler.metadata_type, dict):
539
- raise Exception(
540
- f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
540
+ raise Exception(f"Metadata {dataset_base_handler.name} is None and no metadata type is provided")
541
541
  metadata_type = dataset_base_handler.metadata_type
542
542
 
543
543
  result_shape = get_shape(raw_result)
@@ -11,13 +11,15 @@ from code_loader.contract.datasetclasses import CustomCallableInterfaceMultiArgs
11
11
  ConfusionMatrixElement, SamplePreprocessResponse
12
12
  from code_loader.contract.enums import MetricDirection, LeapDataType, DatasetMetadataType
13
13
  from code_loader import leap_binder
14
+ from code_loader.contract.mapping import NodeMapping, NodeMappingType, NodeConnection
14
15
  from code_loader.contract.visualizer_classes import LeapImage, LeapImageMask, LeapTextMask, LeapText, LeapGraph, \
15
16
  LeapHorizontalBar, LeapImageWithBBox, LeapImageWithHeatmap
16
17
 
17
18
 
18
19
  def tensorleap_custom_metric(name: str,
19
20
  direction: Union[MetricDirection, Dict[str, MetricDirection]] = MetricDirection.Downward,
20
- compute_insights: Optional[Union[bool, Dict[str, bool]]] = None):
21
+ compute_insights: Optional[Union[bool, Dict[str, bool]]] = None,
22
+ connects_to=None):
21
23
  def decorating_function(user_function: Union[CustomCallableInterfaceMultiArgs,
22
24
  CustomMultipleReturnCallableInterfaceMultiArgs,
23
25
  ConfusionMatrixCallableInterfaceMultiArgs]):
@@ -28,6 +30,18 @@ def tensorleap_custom_metric(name: str,
28
30
 
29
31
  leap_binder.add_custom_metric(user_function, name, direction, compute_insights)
30
32
 
33
+ if connects_to is not None:
34
+ arg_names = leap_binder.setup_container.metrics[-1].metric_handler_data.arg_names
35
+ for user_unique_name, connection_destinations in connects_to.items():
36
+ main_node_mapping = NodeMapping(name, NodeMappingType.Metric, user_unique_name, arg_names=arg_names)
37
+ node_inputs = {}
38
+ for arg_name, destination in zip(arg_names, connection_destinations):
39
+ node_inputs[arg_name] = destination.node_mapping
40
+
41
+ leap_binder.mapping_connections.append(NodeConnection(main_node_mapping, node_inputs))
42
+
43
+
44
+
31
45
  def _validate_input_args(*args, **kwargs) -> None:
32
46
  for i, arg in enumerate(args):
33
47
  assert isinstance(arg, (np.ndarray, SamplePreprocessResponse)), (
@@ -354,8 +368,12 @@ def tensorleap_gt_encoder(name: str):
354
368
  _validate_result(result)
355
369
  return result
356
370
 
371
+ inner.node_mapping = NodeMapping(name, NodeMappingType.GroundTruth)
372
+
357
373
  return inner
358
374
 
375
+
376
+
359
377
  return decorating_function
360
378
 
361
379
 
code_loader/leaploader.py CHANGED
@@ -22,7 +22,7 @@ from code_loader.contract.responsedataclasses import DatasetIntegParseResult, Da
22
22
  VisualizerInstance, PredictionTypeInstance, ModelSetup, CustomLayerInstance, MetricInstance, CustomLossInstance
23
23
  from code_loader.inner_leap_binder import global_leap_binder
24
24
  from code_loader.leaploaderbase import LeapLoaderBase
25
- from code_loader.utils import get_root_exception_file_and_line_number, flatten
25
+ from code_loader.utils import get_root_exception_file_and_line_number
26
26
 
27
27
 
28
28
  class LeapLoader(LeapLoaderBase):
@@ -447,10 +447,6 @@ class LeapLoader(LeapLoaderBase):
447
447
 
448
448
  def _convert_metadata_to_correct_type(self, metadata_name: str, value: Any) -> Tuple[Any, bool]:
449
449
  metadata_name_to_type = self._metadata_name_to_type()
450
- if metadata_name not in metadata_name_to_type:
451
- raise Exception(f"metadata {metadata_name} not found in metadata type map, "
452
- f"metadata_name_to_type:{metadata_name_to_type}")
453
-
454
450
  metadata_type_to_python_type = {
455
451
  DatasetMetadataType.float: float,
456
452
  DatasetMetadataType.string: str,
@@ -475,18 +471,22 @@ class LeapLoader(LeapLoaderBase):
475
471
 
476
472
  return converted_value, is_none
477
473
 
478
- def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[
479
- Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
474
+ def _get_metadata(self, state: DataStateEnum, sample_id: Union[int, str]) -> Tuple[Dict[str, Union[str, int, bool, float]], Dict[str, bool]]:
480
475
  result_agg = {}
481
476
  is_none = {}
482
477
  preprocess_result = self._preprocess_result()
483
478
  preprocess_state = preprocess_result[state]
484
479
  for handler in global_leap_binder.setup_container.metadata:
485
480
  handler_result = handler.function(sample_id, preprocess_state)
486
-
487
- for flat_name, flat_result in flatten(handler_result, prefix=handler.name):
488
- result_agg[flat_name], is_none[flat_name] = self._convert_metadata_to_correct_type(
489
- flat_name, flat_result)
481
+ if isinstance(handler_result, dict):
482
+ for single_metadata_name, single_metadata_result in handler_result.items():
483
+ handler_name = f'{handler.name}_{single_metadata_name}'
484
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
485
+ handler_name, single_metadata_result)
486
+ else:
487
+ handler_name = handler.name
488
+ result_agg[handler_name], is_none[handler_name] = self._convert_metadata_to_correct_type(
489
+ handler_name, handler_result)
490
490
 
491
491
  return result_agg, is_none
492
492
 
code_loader/utils.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import sys
2
2
  from pathlib import Path
3
3
  from types import TracebackType
4
- from typing import List, Union, Tuple, Any, Iterator
4
+ from typing import List, Union, Tuple, Any
5
5
  import traceback
6
6
  import numpy as np
7
7
  import numpy.typing as npt
@@ -66,28 +66,3 @@ def rescale_min_max(image: npt.NDArray[np.float32]) -> npt.NDArray[np.float32]:
66
66
  return image
67
67
 
68
68
 
69
- def flatten(
70
- value: Any,
71
- *,
72
- prefix: str = "",
73
- list_token: str = "e",
74
- ) -> Iterator[Tuple[str, Any]]:
75
- """
76
- Recursively walk `value` and yield (flat_key, leaf_value) pairs.
77
-
78
- • Dicts → descend with new_prefix = f"{prefix}_{key}" (or just key if top level)
79
- • Sequences → descend with new_prefix = f"{prefix}_{list_token}{idx}"
80
- • Leaf scalars → yield the accumulated flat key and the scalar itself
81
- """
82
- if isinstance(value, dict):
83
- for k, v in value.items():
84
- new_prefix = f"{prefix}_{k}" if prefix else k
85
- yield from flatten(v, prefix=new_prefix, list_token=list_token)
86
-
87
- elif isinstance(value, (list, tuple)):
88
- for idx, v in enumerate(value):
89
- new_prefix = f"{prefix}_{list_token}{idx}"
90
- yield from flatten(v, prefix=new_prefix, list_token=list_token)
91
-
92
- else: # primitive leaf (str, int, float, bool, None…)
93
- yield prefix, value
@@ -4,12 +4,13 @@ import numpy as np
4
4
  import numpy.typing as npt
5
5
 
6
6
  from code_loader.contract.visualizer_classes import LeapImage, LeapGraph, LeapHorizontalBar, LeapText, \
7
- LeapImageMask, LeapTextMask
7
+ LeapImageMask, LeapTextMask, LeapVideo
8
8
  from code_loader.utils import rescale_min_max
9
9
 
10
10
 
11
11
  class DefaultVisualizer(Enum):
12
12
  Image = 'Image'
13
+ Video = 'Video'
13
14
  Graph = 'Graph'
14
15
  HorizontalBar = 'HorizontalBar'
15
16
  Text = 'Text'
@@ -23,6 +24,10 @@ def default_image_visualizer(data: npt.NDArray[np.float32]) -> LeapImage:
23
24
  return LeapImage(rescaled_data)
24
25
 
25
26
 
27
+ def default_video_visualizer(data: npt.NDArray[np.float32]) -> LeapVideo:
28
+ return LeapVideo(data)
29
+
30
+
26
31
  def default_graph_visualizer(data: npt.NDArray[np.float32]) -> LeapGraph:
27
32
  return LeapGraph(data)
28
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: code-loader
3
- Version: 1.0.87a2
3
+ Version: 1.0.87.dev1
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -1,9 +1,10 @@
1
1
  LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
2
2
  code_loader/__init__.py,sha256=6MMWr0ObOU7hkqQKgOqp4Zp3I28L7joGC9iCbQYtAJg,241
3
3
  code_loader/contract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- code_loader/contract/datasetclasses.py,sha256=rpsccWddYksLQhB0fDZKZsiuclb32wtAraLtvXZ0teM,7912
4
+ code_loader/contract/datasetclasses.py,sha256=ZN6XC-tg0qaT-GF4YiV2SsM2dUQW4fc1akLF-J4YT0w,7964
5
5
  code_loader/contract/enums.py,sha256=GEFkvUMXnCNt-GOoz7NJ9ecQZ2PPDettJNOsxsiM0wk,1622
6
6
  code_loader/contract/exceptions.py,sha256=jWqu5i7t-0IG0jGRsKF4DjJdrsdpJjIYpUkN1F4RiyQ,51
7
+ code_loader/contract/mapping.py,sha256=j9xqgnDrQJZtNG00a3JnpoSEm2ezMCgE4TQdZC-NwkE,939
7
8
  code_loader/contract/responsedataclasses.py,sha256=RSx9m_R3LawhK5o1nAcO3hfp2F9oJYtxZr_bpP3bTmw,4005
8
9
  code_loader/contract/visualizer_classes.py,sha256=_nlukRfW8QeQaQG7G5HfAUSeCuoqslB4xJS2AGI_Nz8,15156
9
10
  code_loader/default_losses.py,sha256=NoOQym1106bDN5dcIk56Elr7ZG5quUHArqfP5-Nyxyo,1139
@@ -19,14 +20,14 @@ code_loader/experiment_api/types.py,sha256=MY8xFARHwdVA7p4dxyhD60ShmttgTvb4qdp1o
19
20
  code_loader/experiment_api/utils.py,sha256=XZHtxge12TS4H4-8PjV3sKuhp8Ud6ojAiIzTZJEqBqc,3304
20
21
  code_loader/experiment_api/workingspace_config_utils.py,sha256=DLzXQCg4dgTV_YgaSbeTVzq-2ja_SQw4zi7LXwKL9cY,990
21
22
  code_loader/inner_leap_binder/__init__.py,sha256=koOlJyMNYzGbEsoIbXathSmQ-L38N_pEXH_HvL7beXU,99
22
- code_loader/inner_leap_binder/leapbinder.py,sha256=cHGIHySEnQZ2U9iN-MyZM05FSQLPYNA79GcuE7ZmFVg,30648
23
- code_loader/inner_leap_binder/leapbinder_decorators.py,sha256=qcYyekpIN1hgbmSqTrN7o6IMpfu8ZWp2J_lhMEoV8I8,22598
24
- code_loader/leaploader.py,sha256=y1lY1jtwpVNA8TGsJYbS50hXePvUsn9YiLvf2aE_pJI,25635
23
+ code_loader/inner_leap_binder/leapbinder.py,sha256=4mC6wvSKwfarDQbdSrISBG3uvDUIus_laXh1LlyCgK8,30932
24
+ code_loader/inner_leap_binder/leapbinder_decorators.py,sha256=6HRHVgLZuYBBssF_nreehaqKeB6V8gwvENBXHexpj4I,23434
25
+ code_loader/leaploader.py,sha256=QPBG7xrNdzhnOiRtwUlVosyYcFNC_ivWgoS8nWOZ_5M,25768
25
26
  code_loader/leaploaderbase.py,sha256=VH0vddRmkqLtcDlYPCO7hfz1_VbKo43lUdHDAbd4iJc,4198
26
- code_loader/utils.py,sha256=4tXLum2AT3Z1ldD6BeYScNg0ATyE4oM8cuIGQxrXyjM,3163
27
+ code_loader/utils.py,sha256=aw2i_fqW_ADjLB66FWZd9DfpCQ7mPdMyauROC5Nd51I,2197
27
28
  code_loader/visualizers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- code_loader/visualizers/default_visualizers.py,sha256=Ffx5VHVOe5ujBOsjBSxN_aIEVwFSQ6gbhTMG5aUS-po,2305
29
- code_loader-1.0.87a2.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
30
- code_loader-1.0.87a2.dist-info/METADATA,sha256=2VfDx4tdSnheLNY1yYKhNYjXBoQYZYbPgYh8Vk4PLrE,851
31
- code_loader-1.0.87a2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
32
- code_loader-1.0.87a2.dist-info/RECORD,,
29
+ code_loader/visualizers/default_visualizers.py,sha256=f95WzLYO2KU8endWxrmtwjHx7diDfm8AaWjucYHT7GI,2439
30
+ code_loader-1.0.87.dev1.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
31
+ code_loader-1.0.87.dev1.dist-info/METADATA,sha256=w9bosTgQZfkgg7SUfGLk8thr6vZM9glFr-LCYqOkvJc,854
32
+ code_loader-1.0.87.dev1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
33
+ code_loader-1.0.87.dev1.dist-info/RECORD,,