supervisely 6.73.410__py3-none-any.whl → 6.73.470__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.

Potentially problematic release.


This version of supervisely might be problematic. Click here for more details.

Files changed (190) hide show
  1. supervisely/__init__.py +136 -1
  2. supervisely/_utils.py +81 -0
  3. supervisely/annotation/json_geometries_map.py +2 -0
  4. supervisely/annotation/label.py +80 -3
  5. supervisely/api/annotation_api.py +9 -9
  6. supervisely/api/api.py +67 -43
  7. supervisely/api/app_api.py +72 -5
  8. supervisely/api/dataset_api.py +108 -33
  9. supervisely/api/entity_annotation/figure_api.py +113 -49
  10. supervisely/api/image_api.py +82 -0
  11. supervisely/api/module_api.py +10 -0
  12. supervisely/api/nn/deploy_api.py +15 -9
  13. supervisely/api/nn/ecosystem_models_api.py +201 -0
  14. supervisely/api/nn/neural_network_api.py +12 -3
  15. supervisely/api/pointcloud/pointcloud_api.py +38 -0
  16. supervisely/api/pointcloud/pointcloud_episode_annotation_api.py +3 -0
  17. supervisely/api/project_api.py +213 -6
  18. supervisely/api/task_api.py +11 -1
  19. supervisely/api/video/video_annotation_api.py +4 -2
  20. supervisely/api/video/video_api.py +79 -1
  21. supervisely/api/video/video_figure_api.py +24 -11
  22. supervisely/api/volume/volume_api.py +38 -0
  23. supervisely/app/__init__.py +1 -1
  24. supervisely/app/content.py +14 -6
  25. supervisely/app/fastapi/__init__.py +1 -0
  26. supervisely/app/fastapi/custom_static_files.py +1 -1
  27. supervisely/app/fastapi/multi_user.py +88 -0
  28. supervisely/app/fastapi/subapp.py +175 -42
  29. supervisely/app/fastapi/templating.py +1 -1
  30. supervisely/app/fastapi/websocket.py +77 -9
  31. supervisely/app/singleton.py +21 -0
  32. supervisely/app/v1/app_service.py +18 -2
  33. supervisely/app/v1/constants.py +7 -1
  34. supervisely/app/widgets/__init__.py +11 -1
  35. supervisely/app/widgets/agent_selector/template.html +1 -0
  36. supervisely/app/widgets/card/card.py +20 -0
  37. supervisely/app/widgets/dataset_thumbnail/dataset_thumbnail.py +11 -2
  38. supervisely/app/widgets/dataset_thumbnail/template.html +3 -1
  39. supervisely/app/widgets/deploy_model/deploy_model.py +750 -0
  40. supervisely/app/widgets/dialog/dialog.py +12 -0
  41. supervisely/app/widgets/dialog/template.html +2 -1
  42. supervisely/app/widgets/dropdown_checkbox_selector/__init__.py +0 -0
  43. supervisely/app/widgets/dropdown_checkbox_selector/dropdown_checkbox_selector.py +87 -0
  44. supervisely/app/widgets/dropdown_checkbox_selector/template.html +12 -0
  45. supervisely/app/widgets/ecosystem_model_selector/__init__.py +0 -0
  46. supervisely/app/widgets/ecosystem_model_selector/ecosystem_model_selector.py +195 -0
  47. supervisely/app/widgets/experiment_selector/experiment_selector.py +454 -263
  48. supervisely/app/widgets/fast_table/fast_table.py +713 -126
  49. supervisely/app/widgets/fast_table/script.js +492 -95
  50. supervisely/app/widgets/fast_table/style.css +54 -0
  51. supervisely/app/widgets/fast_table/template.html +45 -5
  52. supervisely/app/widgets/heatmap/__init__.py +0 -0
  53. supervisely/app/widgets/heatmap/heatmap.py +523 -0
  54. supervisely/app/widgets/heatmap/script.js +378 -0
  55. supervisely/app/widgets/heatmap/style.css +227 -0
  56. supervisely/app/widgets/heatmap/template.html +21 -0
  57. supervisely/app/widgets/input_tag/input_tag.py +102 -15
  58. supervisely/app/widgets/input_tag_list/__init__.py +0 -0
  59. supervisely/app/widgets/input_tag_list/input_tag_list.py +274 -0
  60. supervisely/app/widgets/input_tag_list/template.html +70 -0
  61. supervisely/app/widgets/radio_table/radio_table.py +10 -2
  62. supervisely/app/widgets/radio_tabs/radio_tabs.py +18 -2
  63. supervisely/app/widgets/radio_tabs/template.html +1 -0
  64. supervisely/app/widgets/select/select.py +6 -4
  65. supervisely/app/widgets/select_dataset/select_dataset.py +6 -0
  66. supervisely/app/widgets/select_dataset_tree/select_dataset_tree.py +83 -7
  67. supervisely/app/widgets/table/table.py +68 -13
  68. supervisely/app/widgets/tabs/tabs.py +22 -6
  69. supervisely/app/widgets/tabs/template.html +5 -1
  70. supervisely/app/widgets/transfer/style.css +3 -0
  71. supervisely/app/widgets/transfer/template.html +3 -1
  72. supervisely/app/widgets/transfer/transfer.py +48 -45
  73. supervisely/app/widgets/tree_select/tree_select.py +2 -0
  74. supervisely/convert/image/csv/csv_converter.py +24 -15
  75. supervisely/convert/pointcloud/nuscenes_conv/nuscenes_converter.py +43 -41
  76. supervisely/convert/pointcloud_episodes/nuscenes_conv/nuscenes_converter.py +75 -51
  77. supervisely/convert/pointcloud_episodes/nuscenes_conv/nuscenes_helper.py +137 -124
  78. supervisely/convert/video/video_converter.py +2 -2
  79. supervisely/geometry/polyline_3d.py +110 -0
  80. supervisely/io/env.py +161 -1
  81. supervisely/nn/artifacts/__init__.py +1 -1
  82. supervisely/nn/artifacts/artifacts.py +10 -2
  83. supervisely/nn/artifacts/detectron2.py +1 -0
  84. supervisely/nn/artifacts/hrda.py +1 -0
  85. supervisely/nn/artifacts/mmclassification.py +20 -0
  86. supervisely/nn/artifacts/mmdetection.py +5 -3
  87. supervisely/nn/artifacts/mmsegmentation.py +1 -0
  88. supervisely/nn/artifacts/ritm.py +1 -0
  89. supervisely/nn/artifacts/rtdetr.py +1 -0
  90. supervisely/nn/artifacts/unet.py +1 -0
  91. supervisely/nn/artifacts/utils.py +3 -0
  92. supervisely/nn/artifacts/yolov5.py +2 -0
  93. supervisely/nn/artifacts/yolov8.py +1 -0
  94. supervisely/nn/benchmark/semantic_segmentation/metric_provider.py +18 -18
  95. supervisely/nn/experiments.py +9 -0
  96. supervisely/nn/inference/cache.py +37 -17
  97. supervisely/nn/inference/gui/serving_gui_template.py +39 -13
  98. supervisely/nn/inference/inference.py +953 -211
  99. supervisely/nn/inference/inference_request.py +15 -8
  100. supervisely/nn/inference/instance_segmentation/instance_segmentation.py +1 -0
  101. supervisely/nn/inference/object_detection/object_detection.py +1 -0
  102. supervisely/nn/inference/predict_app/__init__.py +0 -0
  103. supervisely/nn/inference/predict_app/gui/__init__.py +0 -0
  104. supervisely/nn/inference/predict_app/gui/classes_selector.py +160 -0
  105. supervisely/nn/inference/predict_app/gui/gui.py +915 -0
  106. supervisely/nn/inference/predict_app/gui/input_selector.py +344 -0
  107. supervisely/nn/inference/predict_app/gui/model_selector.py +77 -0
  108. supervisely/nn/inference/predict_app/gui/output_selector.py +179 -0
  109. supervisely/nn/inference/predict_app/gui/preview.py +93 -0
  110. supervisely/nn/inference/predict_app/gui/settings_selector.py +881 -0
  111. supervisely/nn/inference/predict_app/gui/tags_selector.py +110 -0
  112. supervisely/nn/inference/predict_app/gui/utils.py +399 -0
  113. supervisely/nn/inference/predict_app/predict_app.py +176 -0
  114. supervisely/nn/inference/session.py +47 -39
  115. supervisely/nn/inference/tracking/bbox_tracking.py +5 -1
  116. supervisely/nn/inference/tracking/point_tracking.py +5 -1
  117. supervisely/nn/inference/tracking/tracker_interface.py +4 -0
  118. supervisely/nn/inference/uploader.py +9 -5
  119. supervisely/nn/model/model_api.py +44 -22
  120. supervisely/nn/model/prediction.py +15 -1
  121. supervisely/nn/model/prediction_session.py +70 -14
  122. supervisely/nn/prediction_dto.py +7 -0
  123. supervisely/nn/tracker/__init__.py +6 -8
  124. supervisely/nn/tracker/base_tracker.py +54 -0
  125. supervisely/nn/tracker/botsort/__init__.py +1 -0
  126. supervisely/nn/tracker/botsort/botsort_config.yaml +30 -0
  127. supervisely/nn/tracker/botsort/osnet_reid/__init__.py +0 -0
  128. supervisely/nn/tracker/botsort/osnet_reid/osnet.py +566 -0
  129. supervisely/nn/tracker/botsort/osnet_reid/osnet_reid_interface.py +88 -0
  130. supervisely/nn/tracker/botsort/tracker/__init__.py +0 -0
  131. supervisely/nn/tracker/{bot_sort → botsort/tracker}/basetrack.py +1 -2
  132. supervisely/nn/tracker/{utils → botsort/tracker}/gmc.py +51 -59
  133. supervisely/nn/tracker/{deep_sort/deep_sort → botsort/tracker}/kalman_filter.py +71 -33
  134. supervisely/nn/tracker/botsort/tracker/matching.py +202 -0
  135. supervisely/nn/tracker/{bot_sort/bot_sort.py → botsort/tracker/mc_bot_sort.py} +68 -81
  136. supervisely/nn/tracker/botsort_tracker.py +273 -0
  137. supervisely/nn/tracker/calculate_metrics.py +264 -0
  138. supervisely/nn/tracker/utils.py +273 -0
  139. supervisely/nn/tracker/visualize.py +520 -0
  140. supervisely/nn/training/gui/gui.py +152 -49
  141. supervisely/nn/training/gui/hyperparameters_selector.py +1 -1
  142. supervisely/nn/training/gui/model_selector.py +8 -6
  143. supervisely/nn/training/gui/train_val_splits_selector.py +144 -71
  144. supervisely/nn/training/gui/training_artifacts.py +3 -1
  145. supervisely/nn/training/train_app.py +225 -46
  146. supervisely/project/pointcloud_episode_project.py +12 -8
  147. supervisely/project/pointcloud_project.py +12 -8
  148. supervisely/project/project.py +221 -75
  149. supervisely/template/experiment/experiment.html.jinja +105 -55
  150. supervisely/template/experiment/experiment_generator.py +258 -112
  151. supervisely/template/experiment/header.html.jinja +31 -13
  152. supervisely/template/experiment/sly-style.css +7 -2
  153. supervisely/versions.json +3 -1
  154. supervisely/video/sampling.py +42 -20
  155. supervisely/video/video.py +41 -12
  156. supervisely/video_annotation/video_figure.py +38 -4
  157. supervisely/volume/stl_converter.py +2 -0
  158. supervisely/worker_api/agent_rpc.py +24 -1
  159. supervisely/worker_api/rpc_servicer.py +31 -7
  160. {supervisely-6.73.410.dist-info → supervisely-6.73.470.dist-info}/METADATA +22 -14
  161. {supervisely-6.73.410.dist-info → supervisely-6.73.470.dist-info}/RECORD +167 -148
  162. supervisely_lib/__init__.py +6 -1
  163. supervisely/app/widgets/experiment_selector/style.css +0 -27
  164. supervisely/app/widgets/experiment_selector/template.html +0 -61
  165. supervisely/nn/tracker/bot_sort/__init__.py +0 -21
  166. supervisely/nn/tracker/bot_sort/fast_reid_interface.py +0 -152
  167. supervisely/nn/tracker/bot_sort/matching.py +0 -127
  168. supervisely/nn/tracker/bot_sort/sly_tracker.py +0 -401
  169. supervisely/nn/tracker/deep_sort/__init__.py +0 -6
  170. supervisely/nn/tracker/deep_sort/deep_sort/__init__.py +0 -1
  171. supervisely/nn/tracker/deep_sort/deep_sort/detection.py +0 -49
  172. supervisely/nn/tracker/deep_sort/deep_sort/iou_matching.py +0 -81
  173. supervisely/nn/tracker/deep_sort/deep_sort/linear_assignment.py +0 -202
  174. supervisely/nn/tracker/deep_sort/deep_sort/nn_matching.py +0 -176
  175. supervisely/nn/tracker/deep_sort/deep_sort/track.py +0 -166
  176. supervisely/nn/tracker/deep_sort/deep_sort/tracker.py +0 -145
  177. supervisely/nn/tracker/deep_sort/deep_sort.py +0 -301
  178. supervisely/nn/tracker/deep_sort/generate_clip_detections.py +0 -90
  179. supervisely/nn/tracker/deep_sort/preprocessing.py +0 -70
  180. supervisely/nn/tracker/deep_sort/sly_tracker.py +0 -273
  181. supervisely/nn/tracker/tracker.py +0 -285
  182. supervisely/nn/tracker/utils/kalman_filter.py +0 -492
  183. supervisely/nn/tracking/__init__.py +0 -1
  184. supervisely/nn/tracking/boxmot.py +0 -114
  185. supervisely/nn/tracking/tracking.py +0 -24
  186. /supervisely/{nn/tracker/utils → app/widgets/deploy_model}/__init__.py +0 -0
  187. {supervisely-6.73.410.dist-info → supervisely-6.73.470.dist-info}/LICENSE +0 -0
  188. {supervisely-6.73.410.dist-info → supervisely-6.73.470.dist-info}/WHEEL +0 -0
  189. {supervisely-6.73.410.dist-info → supervisely-6.73.470.dist-info}/entry_points.txt +0 -0
  190. {supervisely-6.73.410.dist-info → supervisely-6.73.470.dist-info}/top_level.txt +0 -0
@@ -28,6 +28,8 @@ class Dialog(Widget):
28
28
  dialog = Dialog(title="Dialog title", content=Input("Input"), size="large")
29
29
  dialog.show()
30
30
  """
31
+ class Routes:
32
+ ON_CLOSE = "close_cb"
31
33
 
32
34
  def __init__(
33
35
  self,
@@ -41,6 +43,16 @@ class Dialog(Widget):
41
43
  self._size = size
42
44
  super().__init__(widget_id=widget_id, file_path=__file__)
43
45
 
46
+ server = self._sly_app.get_server()
47
+ route = self.get_route_path(Dialog.Routes.ON_CLOSE)
48
+ @server.post(route)
49
+ def _on_close():
50
+ # * Change visibility state to False when dialog is closed on client side
51
+ visible = StateJson()[self.widget_id]["visible"]
52
+ if visible is True:
53
+ StateJson()[self.widget_id]["visible"] = False
54
+ # * no need to call send_changes(), as it is already changed on client side
55
+
44
56
  def get_json_data(self) -> Dict[str, str]:
45
57
  """Returns dictionary with widget data, which defines the appearance and behavior of the widget.
46
58
 
@@ -2,8 +2,9 @@
2
2
  :title=data.{{{widget.widget_id}}}.title
3
3
  :size=data.{{{widget.widget_id}}}.size
4
4
  :visible.sync="state.{{{widget.widget_id}}}.visible"
5
+ @close="post('/{{{widget.widget_id}}}/close_cb');"
5
6
  >
6
7
  <div>
7
8
  {{{widget._content}}}
8
9
  </div>
9
- </el-dialog>
10
+ </el-dialog>
@@ -0,0 +1,87 @@
1
+ from typing import List
2
+
3
+ from supervisely.app.content import DataJson, StateJson
4
+ from supervisely.app.widgets.widget import Widget
5
+
6
+
7
+ class DropdownCheckboxSelector(Widget):
8
+ class Routes:
9
+ VALUE_CHANGED = "value_changed"
10
+
11
+ class Item:
12
+ def __init__(self, id: str, name: str = None, description: str = None):
13
+ self.id = id
14
+ if name is None:
15
+ name = id
16
+ self.name = name
17
+ self.description = description
18
+
19
+ def to_json(self):
20
+ return {
21
+ "id": self.id,
22
+ "name": self.name,
23
+ "description": self.description,
24
+ }
25
+
26
+ @classmethod
27
+ def from_json(cls, data):
28
+ return cls(
29
+ id=data["id"],
30
+ name=data["name"],
31
+ description=data.get("description", None),
32
+ )
33
+
34
+ def __init__(
35
+ self, items: List[Item], label: str = None, widget_id: str = None, multiple: bool = True
36
+ ):
37
+ self._items = items
38
+ self._label = label
39
+ self._multiple = multiple
40
+ self._changes_handled = False
41
+
42
+ super().__init__(widget_id=widget_id, file_path=__file__)
43
+
44
+ def get_json_data(self):
45
+ return {
46
+ "items": [item.to_json() for item in self._items],
47
+ "label": self._label,
48
+ }
49
+
50
+ def get_json_state(self):
51
+ return {
52
+ "selected": [],
53
+ }
54
+
55
+ def set(self, items: List[Item]):
56
+ self._items = items
57
+ DataJson()[self.widget_id]["items"] = [
58
+ item.to_json() for item in self._items
59
+ ]
60
+ DataJson().send_changes()
61
+
62
+ def get_selected(self) -> List[Item]:
63
+ selected = StateJson()[self.widget_id].get("selected", [])
64
+ return [item for item in self._items if item.id in selected]
65
+
66
+ def select(self, ids: List[str]):
67
+ selected = [item for item in self._items if item.id in ids]
68
+ StateJson()[self.widget_id]["selected"] = [item.to_json() for item in selected]
69
+ StateJson().send_changes()
70
+
71
+ def value_changed(self, func):
72
+ """
73
+ Decorator to handle value changes.
74
+ :param func: function to call when value changes
75
+ """
76
+
77
+ route_path = self.get_route_path(self.Routes.VALUE_CHANGED)
78
+ server = self._sly_app.get_server()
79
+
80
+ @server.post(route_path)
81
+ def on_value_changed():
82
+ selected_items = self.get_selected()
83
+ return func(selected_items)
84
+
85
+ self._changes_handled = True
86
+
87
+ return on_value_changed
@@ -0,0 +1,12 @@
1
+ <sly-dropdown-checkbox-selection
2
+ :label="data.{{{widget.widget_id}}}.label"
3
+ class="mr5"
4
+ :items="data.{{{widget.widget_id}}}.items"
5
+ :selected="state.{{{widget.widget_id}}}.selected"
6
+ options="{multipleSelection: {{{widget._multiple}}}}"
7
+ {% if widget._changes_handled == true %}
8
+ @update:selected="state.{{{widget.widget_id}}}.selected = $event; post('/{{{widget.widget_id}}}/value_changed')"
9
+ {% else %}
10
+ @update:selected="state.{{{widget.widget_id}}}.selected = $event"
11
+ {% endif %}
12
+ />
@@ -0,0 +1,195 @@
1
+ from typing import Dict, List, Tuple
2
+
3
+ import pandas as pd
4
+
5
+ from supervisely._utils import logger
6
+ from supervisely.api.api import Api
7
+ from supervisely.app.exceptions import show_dialog
8
+ from supervisely.app.widgets import Widget
9
+ from supervisely.app.widgets.container.container import Container
10
+ from supervisely.app.widgets.dropdown_checkbox_selector.dropdown_checkbox_selector import (
11
+ DropdownCheckboxSelector,
12
+ )
13
+ from supervisely.app.widgets.fast_table.fast_table import FastTable
14
+
15
+
16
+ class EcosystemModelSelector(Widget):
17
+ class COLUMN:
18
+ MODEL_NAME = "name"
19
+ FRAMEWORK = "framework"
20
+ TASK_TYPE = "task"
21
+ PARAMETERS = "params (M)"
22
+ # TODO: support metrics for different tasks
23
+ MAP = "mAP"
24
+
25
+ COLUMNS = [
26
+ str(COLUMN.MODEL_NAME),
27
+ str(COLUMN.FRAMEWORK),
28
+ str(COLUMN.TASK_TYPE),
29
+ str(COLUMN.PARAMETERS),
30
+ str(COLUMN.MAP),
31
+ ]
32
+
33
+ def __init__(self, frameworks: List[str] = None, task_types: List[str] = None, models: List[Dict] = None, api: Api = None, widget_id: str = None):
34
+ if api is None:
35
+ api = Api()
36
+ self.api = api
37
+ self.frameworks = None
38
+ self.task_types = None
39
+ self.models = None
40
+
41
+ self.set(frameworks, task_types, models)
42
+
43
+ self.framework_filter = DropdownCheckboxSelector(items=[], label="Frameworks")
44
+ self.task_filter = DropdownCheckboxSelector(items=[], label="Task Types")
45
+ self.table = FastTable(columns=self.COLUMNS, page_size=10, is_radio=True, header_right_content=Container(widgets=[self.framework_filter, self.task_filter], direction="horizontal"))
46
+ self.refresh_table()
47
+ self.table.set_filter(self._filter_function)
48
+
49
+ @self.framework_filter.value_changed
50
+ def _framework_filter_changed(frameworks: List[DropdownCheckboxSelector.Item]):
51
+ self.frameworks = [f.id for f in frameworks] if frameworks else None
52
+ task_types = [t.id for t in self.task_filter.get_selected()]
53
+ self.task_types = task_types if task_types else None
54
+ self.table.filter((self.frameworks, self.task_types))
55
+
56
+ @self.task_filter.value_changed
57
+ def _task_filter_changed(task_types: List[DropdownCheckboxSelector.Item]):
58
+ self.task_types = [t.id for t in task_types] if task_types else None
59
+ frameworks = [f.id for f in self.framework_filter.get_selected()]
60
+ self.frameworks = frameworks if frameworks else None
61
+ self.table.filter((self.frameworks, self.task_types))
62
+
63
+ super().__init__(widget_id=widget_id, file_path=__file__)
64
+
65
+ def _filter_function(
66
+ self, data: pd.DataFrame, filter_value: Tuple[List[str], List[str]]
67
+ ) -> pd.DataFrame:
68
+ try:
69
+ frameworks, task_types = filter_value
70
+ if not frameworks and not task_types:
71
+ return data
72
+ filtered_models = set()
73
+ for idx, model in enumerate(self.models):
74
+ should_add = True
75
+ if frameworks and model["framework"] not in frameworks:
76
+ should_add = False
77
+ if task_types and model["task"] not in task_types:
78
+ should_add = False
79
+ if should_add:
80
+ filtered_models.add(idx)
81
+
82
+ filtered_data = data.iloc[sorted(filtered_models)]
83
+ filtered_data.reset_index(inplace=True, drop=True)
84
+ except Exception as e:
85
+ logger.error(f"Error during filtering: {e}", exc_info=True)
86
+ show_dialog(title="Filtering Error", description=str(e), status="error")
87
+ return data
88
+ return filtered_data
89
+
90
+ def _filter_models(self, models: List[Dict], frameworks: List[str], task_types: List[str]) -> List[Dict]:
91
+ if frameworks is None and task_types is None:
92
+ return models
93
+
94
+ filtered_models = []
95
+ for model in models:
96
+ if frameworks and model["framework"] not in frameworks:
97
+ continue
98
+ if task_types and model["model"]["task"] not in task_types:
99
+ continue
100
+ filtered_models.append(model)
101
+ return filtered_models
102
+
103
+ def set(self, frameworks: List[str] = None, task_types: List[str] = None, models: List[Dict] = None):
104
+ self.frameworks = frameworks
105
+ self.task_types = task_types
106
+ if models is None:
107
+ models = self.api.nn.ecosystem_models_api.list_models()
108
+ self.models = models
109
+ self.models = self._filter_models(self.models, self.frameworks, self.task_types)
110
+
111
+ def _map_from_model(self, model: Dict):
112
+ try:
113
+ map = model.get("evaluation", {}).get("metrics", {}).get("mAP", None)
114
+ if map is None:
115
+ return None
116
+ return float(map)
117
+ except:
118
+ return None
119
+
120
+ def _params_from_model(self, model: Dict):
121
+ try:
122
+ params = model.get("paramsM", None)
123
+ if params is None:
124
+ return None
125
+ return float(params)
126
+ except:
127
+ return None
128
+
129
+ def _get_table_data(self, models: List[Dict] = None) -> List[Dict]:
130
+ if models is None:
131
+ models = self.models
132
+ data = [
133
+ {
134
+ self.COLUMN.FRAMEWORK: model_data["framework"],
135
+ self.COLUMN.MODEL_NAME: model_data["name"],
136
+ self.COLUMN.TASK_TYPE: model_data["task"],
137
+ self.COLUMN.PARAMETERS: self._params_from_model(model_data),
138
+ self.COLUMN.MAP: self._map_from_model(model_data),
139
+ }
140
+ for model_data in models
141
+ ]
142
+ return data
143
+
144
+ def refresh_table(self):
145
+ data = self._get_table_data()
146
+ df = pd.DataFrame.from_records(data=data, columns=self.COLUMNS)
147
+ self.table.read_pandas(df)
148
+ unique_frameworks = df[self.COLUMN.FRAMEWORK].unique().tolist()
149
+ self.framework_filter.set(items=[DropdownCheckboxSelector.Item(id=f, name=f) for f in unique_frameworks])
150
+ unique_task_types = df[self.COLUMN.TASK_TYPE].unique().tolist()
151
+ self.task_filter.set(items=[DropdownCheckboxSelector.Item(id=t, name=t) for t in unique_task_types])
152
+
153
+ def get_selected(self):
154
+ idx = self.table.get_selected_row().row_index
155
+ models = self._filter_models(self.models, self.frameworks, self.task_types)
156
+ return models[idx]
157
+
158
+ def select(self, index: int):
159
+ self.table.select_row(index)
160
+
161
+ def select_framework_and_model_name(self, framework: str, model_name: str):
162
+ for idx, model in enumerate(self.models):
163
+ if model["name"] == model_name and model["framework"] == framework:
164
+ self.table.select_row(idx)
165
+ return
166
+ raise ValueError(f"Model with framework `{framework}` and name '{model_name}' not found.")
167
+
168
+ def get_json_data(self):
169
+ return {}
170
+
171
+ def get_json_state(self):
172
+ return {}
173
+
174
+ def to_html(self):
175
+ return self.table.to_html()
176
+
177
+ def disable(self):
178
+ return self.table.disable()
179
+
180
+ def enable(self):
181
+ return self.table.enable()
182
+
183
+ def hide(self):
184
+ return self.table.hide()
185
+
186
+ def show(self):
187
+ return self.table.show()
188
+
189
+ @property
190
+ def loading(self):
191
+ return self.table.loading
192
+
193
+ @loading.setter
194
+ def loading(self, value: bool):
195
+ self.table.loading = value