dtlpy 1.113.10__py3-none-any.whl → 1.114.13__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.
- dtlpy/__init__.py +488 -488
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/__pycache__/__init__.cpython-38.pyc +0 -0
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +311 -311
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +296 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +442 -442
- dtlpy/entities/dataset.py +1285 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +222 -222
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +641 -641
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +953 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +694 -691
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +803 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +290 -267
- dtlpy/entities/pipeline.py +593 -593
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +499 -499
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +958 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +491 -491
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +945 -940
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -348
- dtlpy/repositories/commands.py +158 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +434 -406
- dtlpy/repositories/datasets.py +1291 -1291
- dtlpy/repositories/downloader.py +895 -895
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +266 -266
- dtlpy/repositories/executions.py +817 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +238 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +909 -915
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +877 -867
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +448 -448
- dtlpy/repositories/pipelines.py +642 -642
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +399 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1124 -1124
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +651 -651
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1782 -1782
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +264 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp +1 -1
- dtlpy-1.114.13.data/scripts/dlp.bat +2 -0
- {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp.py +128 -128
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/LICENSE +200 -200
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/METADATA +172 -172
- dtlpy-1.114.13.dist-info/RECORD +240 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/WHEEL +1 -1
- tests/features/environment.py +551 -550
- dtlpy-1.113.10.data/scripts/dlp.bat +0 -2
- dtlpy-1.113.10.dist-info/RECORD +0 -244
- tests/assets/__init__.py +0 -0
- tests/assets/models_flow/__init__.py +0 -0
- tests/assets/models_flow/failedmain.py +0 -52
- tests/assets/models_flow/main.py +0 -62
- tests/assets/models_flow/main_model.py +0 -54
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/top_level.txt +0 -0
|
@@ -1,226 +1,226 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from .. import exceptions, entities, miscellaneous, _api_reference, repositories
|
|
3
|
-
from ..services.api_client import ApiClient
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(name='dtlpy')
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class FeatureSets:
|
|
9
|
-
"""
|
|
10
|
-
Feature Sets repository
|
|
11
|
-
"""
|
|
12
|
-
URL = '/features/sets'
|
|
13
|
-
|
|
14
|
-
def __init__(self,
|
|
15
|
-
client_api: ApiClient,
|
|
16
|
-
project_id: str = None,
|
|
17
|
-
project: entities.Project = None,
|
|
18
|
-
model_id: str = None,
|
|
19
|
-
model: entities.Model = None):
|
|
20
|
-
self._project = project
|
|
21
|
-
self._project_id = project_id
|
|
22
|
-
self._model = model
|
|
23
|
-
self._model_id = model_id
|
|
24
|
-
self._client_api = client_api
|
|
25
|
-
|
|
26
|
-
############
|
|
27
|
-
# entities #
|
|
28
|
-
############
|
|
29
|
-
@property
|
|
30
|
-
def project(self) -> entities.Project:
|
|
31
|
-
if self._project is None and self._project_id is not None:
|
|
32
|
-
# get from id
|
|
33
|
-
self._project = repositories.Projects(client_api=self._client_api).get(project_id=self._project_id)
|
|
34
|
-
if self._project is None:
|
|
35
|
-
# try get checkout
|
|
36
|
-
project = self._client_api.state_io.get('project')
|
|
37
|
-
if project is not None:
|
|
38
|
-
self._project = entities.Project.from_json(_json=project, client_api=self._client_api)
|
|
39
|
-
if self._project is None:
|
|
40
|
-
raise exceptions.PlatformException(
|
|
41
|
-
error='2001',
|
|
42
|
-
message='Cannot perform action WITHOUT Project entity in FeatureSets repository.'
|
|
43
|
-
' Please checkout or set a project')
|
|
44
|
-
assert isinstance(self._project, entities.Project)
|
|
45
|
-
return self._project
|
|
46
|
-
|
|
47
|
-
@property
|
|
48
|
-
def model(self) -> entities.Model:
|
|
49
|
-
if self._model is None and self._model_id is not None:
|
|
50
|
-
# get from id
|
|
51
|
-
self._model = repositories.Models(client_api=self._client_api).get(model_id=self._model_id)
|
|
52
|
-
if self._model is None:
|
|
53
|
-
raise exceptions.PlatformException(
|
|
54
|
-
error='2001',
|
|
55
|
-
message='Cannot perform action WITHOUT Model entity in FeatureSets repository.')
|
|
56
|
-
assert isinstance(self._model, entities.Model)
|
|
57
|
-
return self._model
|
|
58
|
-
|
|
59
|
-
###########
|
|
60
|
-
# methods #
|
|
61
|
-
###########
|
|
62
|
-
|
|
63
|
-
def _list(self, filters: entities.Filters):
|
|
64
|
-
# request
|
|
65
|
-
success, response = self._client_api.gen_request(req_type='POST',
|
|
66
|
-
path='/features/sets/query',
|
|
67
|
-
json_req=filters.prepare())
|
|
68
|
-
if not success:
|
|
69
|
-
raise exceptions.PlatformException(response)
|
|
70
|
-
return response.json()
|
|
71
|
-
|
|
72
|
-
@_api_reference.add(path='/features/sets/query', method='post')
|
|
73
|
-
def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
|
|
74
|
-
"""
|
|
75
|
-
List Feature Sets
|
|
76
|
-
|
|
77
|
-
:param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
|
|
78
|
-
:return: Paged entity
|
|
79
|
-
:rtype: dtlpy.entities.paged_entities.PagedEntities
|
|
80
|
-
"""
|
|
81
|
-
# default filters
|
|
82
|
-
if filters is None:
|
|
83
|
-
filters = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
|
|
84
|
-
if self._project is not None:
|
|
85
|
-
filters.context = {'projects': [self._project.id]}
|
|
86
|
-
|
|
87
|
-
# assert type filters
|
|
88
|
-
if not isinstance(filters, entities.Filters):
|
|
89
|
-
raise exceptions.PlatformException(error='400',
|
|
90
|
-
message='Unknown filters type: {!r}'.format(type(filters)))
|
|
91
|
-
|
|
92
|
-
if filters.resource != entities.FiltersResource.FEATURE_SET:
|
|
93
|
-
raise exceptions.PlatformException(
|
|
94
|
-
error='400',
|
|
95
|
-
message='Filters resource must to be FiltersResource.FEATURE_SET. Got: {!r}'.format(filters.resource))
|
|
96
|
-
|
|
97
|
-
paged = entities.PagedEntities(items_repository=self,
|
|
98
|
-
filters=filters,
|
|
99
|
-
page_offset=filters.page,
|
|
100
|
-
page_size=filters.page_size,
|
|
101
|
-
client_api=self._client_api)
|
|
102
|
-
paged.get_page()
|
|
103
|
-
return paged
|
|
104
|
-
|
|
105
|
-
@_api_reference.add(path='/features/sets/{id}', method='get')
|
|
106
|
-
def get(self, feature_set_name: str = None, feature_set_id: str = None) -> entities.Feature:
|
|
107
|
-
"""
|
|
108
|
-
Get Feature Set object
|
|
109
|
-
|
|
110
|
-
:param str feature_set_name: name of the feature set
|
|
111
|
-
:param str feature_set_id: id of the feature set
|
|
112
|
-
:return: Feature object
|
|
113
|
-
"""
|
|
114
|
-
if feature_set_id is not None:
|
|
115
|
-
success, response = self._client_api.gen_request(req_type="GET",
|
|
116
|
-
path="{}/{}".format(self.URL, feature_set_id))
|
|
117
|
-
if not success:
|
|
118
|
-
raise exceptions.PlatformException(response)
|
|
119
|
-
feature_set = entities.FeatureSet.from_json(client_api=self._client_api,
|
|
120
|
-
_json=response.json())
|
|
121
|
-
elif feature_set_name is not None:
|
|
122
|
-
if not isinstance(feature_set_name, str):
|
|
123
|
-
raise exceptions.PlatformException(
|
|
124
|
-
error='400',
|
|
125
|
-
message='feature_set_name must be string')
|
|
126
|
-
filters = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
|
|
127
|
-
filters.add(field='name', values=feature_set_name)
|
|
128
|
-
feature_sets = self.list(filters=filters)
|
|
129
|
-
if feature_sets.items_count == 0:
|
|
130
|
-
raise exceptions.PlatformException(
|
|
131
|
-
error='404',
|
|
132
|
-
message='Feature set not found. name: {!r}'.format(feature_set_name))
|
|
133
|
-
elif feature_sets.items_count > 1:
|
|
134
|
-
# more than one matching project
|
|
135
|
-
raise exceptions.PlatformException(
|
|
136
|
-
error='404',
|
|
137
|
-
message='More than one feature_set with same name. Please "get" by id')
|
|
138
|
-
else:
|
|
139
|
-
feature_set = feature_sets.items[0]
|
|
140
|
-
else:
|
|
141
|
-
raise exceptions.PlatformException(
|
|
142
|
-
error='400',
|
|
143
|
-
message='Must provide an identifier in inputs, feature_set_name or feature_set_id')
|
|
144
|
-
return feature_set
|
|
145
|
-
|
|
146
|
-
@_api_reference.add(path='/features/sets', method='post')
|
|
147
|
-
def create(self, name: str,
|
|
148
|
-
size: int,
|
|
149
|
-
set_type: str,
|
|
150
|
-
entity_type: entities.FeatureEntityType,
|
|
151
|
-
project_id: str = None,
|
|
152
|
-
model_id: set = None,
|
|
153
|
-
org_id: str = None):
|
|
154
|
-
"""
|
|
155
|
-
Create a new Feature Set
|
|
156
|
-
|
|
157
|
-
:param str name: the Feature name
|
|
158
|
-
:param int size: the length of a single vector in the set
|
|
159
|
-
:param str set_type: string of the feature type: 2d, 3d, modelFC, TSNE,PCA,FFT
|
|
160
|
-
:param entity_type: the entity that feature vector is linked to. Use the enum dl.FeatureEntityType
|
|
161
|
-
:param str project_id: the ID of the project where feature set will be created
|
|
162
|
-
:param str model_id: the ID of the model that creates the vectors
|
|
163
|
-
:param str org_id: the ID of the org where feature set will be created
|
|
164
|
-
:return: Feature Set object
|
|
165
|
-
"""
|
|
166
|
-
if project_id is None:
|
|
167
|
-
if self._project is None:
|
|
168
|
-
raise ValueError('Must input a project id')
|
|
169
|
-
else:
|
|
170
|
-
project_id = self._project.id
|
|
171
|
-
|
|
172
|
-
payload = {'name': name,
|
|
173
|
-
'size': size,
|
|
174
|
-
'type': set_type,
|
|
175
|
-
'project': project_id,
|
|
176
|
-
'modelId': model_id,
|
|
177
|
-
'entityType': entity_type}
|
|
178
|
-
if org_id is not None:
|
|
179
|
-
payload['org'] = org_id
|
|
180
|
-
success, response = self._client_api.gen_request(req_type="post",
|
|
181
|
-
json_req=payload,
|
|
182
|
-
path=self.URL)
|
|
183
|
-
|
|
184
|
-
# exception handling
|
|
185
|
-
if not success:
|
|
186
|
-
raise exceptions.PlatformException(response)
|
|
187
|
-
|
|
188
|
-
# return entity
|
|
189
|
-
return entities.FeatureSet.from_json(client_api=self._client_api,
|
|
190
|
-
_json=response.json()[0])
|
|
191
|
-
|
|
192
|
-
@_api_reference.add(path='/features/sets/{id}', method='delete')
|
|
193
|
-
def delete(self, feature_set_id: str):
|
|
194
|
-
"""
|
|
195
|
-
Delete feature vector
|
|
196
|
-
|
|
197
|
-
:param str feature_set_id: feature set id to delete
|
|
198
|
-
:return: success
|
|
199
|
-
:rtype: bool
|
|
200
|
-
"""
|
|
201
|
-
|
|
202
|
-
success, response = self._client_api.gen_request(req_type="delete",
|
|
203
|
-
path="{}/{}".format(self.URL, feature_set_id))
|
|
204
|
-
|
|
205
|
-
# check response
|
|
206
|
-
if success:
|
|
207
|
-
logger.debug("Feature Set deleted successfully")
|
|
208
|
-
return success
|
|
209
|
-
else:
|
|
210
|
-
raise exceptions.PlatformException(response)
|
|
211
|
-
|
|
212
|
-
def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Item]:
|
|
213
|
-
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
214
|
-
jobs = [None for _ in range(len(response_items))]
|
|
215
|
-
# return triggers list
|
|
216
|
-
for i_item, item in enumerate(response_items):
|
|
217
|
-
jobs[i_item] = pool.submit(entities.FeatureSet._protected_from_json,
|
|
218
|
-
**{'client_api': self._client_api,
|
|
219
|
-
'_json': item})
|
|
220
|
-
# get all results
|
|
221
|
-
results = [j.result() for j in jobs]
|
|
222
|
-
# log errors
|
|
223
|
-
_ = [logger.warning(r[1]) for r in results if r[0] is False]
|
|
224
|
-
# return good jobs
|
|
225
|
-
items = miscellaneous.List([r[1] for r in results if r[0] is True])
|
|
226
|
-
return items
|
|
1
|
+
import logging
|
|
2
|
+
from .. import exceptions, entities, miscellaneous, _api_reference, repositories
|
|
3
|
+
from ..services.api_client import ApiClient
|
|
4
|
+
|
|
5
|
+
logger = logging.getLogger(name='dtlpy')
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class FeatureSets:
|
|
9
|
+
"""
|
|
10
|
+
Feature Sets repository
|
|
11
|
+
"""
|
|
12
|
+
URL = '/features/sets'
|
|
13
|
+
|
|
14
|
+
def __init__(self,
|
|
15
|
+
client_api: ApiClient,
|
|
16
|
+
project_id: str = None,
|
|
17
|
+
project: entities.Project = None,
|
|
18
|
+
model_id: str = None,
|
|
19
|
+
model: entities.Model = None):
|
|
20
|
+
self._project = project
|
|
21
|
+
self._project_id = project_id
|
|
22
|
+
self._model = model
|
|
23
|
+
self._model_id = model_id
|
|
24
|
+
self._client_api = client_api
|
|
25
|
+
|
|
26
|
+
############
|
|
27
|
+
# entities #
|
|
28
|
+
############
|
|
29
|
+
@property
|
|
30
|
+
def project(self) -> entities.Project:
|
|
31
|
+
if self._project is None and self._project_id is not None:
|
|
32
|
+
# get from id
|
|
33
|
+
self._project = repositories.Projects(client_api=self._client_api).get(project_id=self._project_id)
|
|
34
|
+
if self._project is None:
|
|
35
|
+
# try get checkout
|
|
36
|
+
project = self._client_api.state_io.get('project')
|
|
37
|
+
if project is not None:
|
|
38
|
+
self._project = entities.Project.from_json(_json=project, client_api=self._client_api)
|
|
39
|
+
if self._project is None:
|
|
40
|
+
raise exceptions.PlatformException(
|
|
41
|
+
error='2001',
|
|
42
|
+
message='Cannot perform action WITHOUT Project entity in FeatureSets repository.'
|
|
43
|
+
' Please checkout or set a project')
|
|
44
|
+
assert isinstance(self._project, entities.Project)
|
|
45
|
+
return self._project
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def model(self) -> entities.Model:
|
|
49
|
+
if self._model is None and self._model_id is not None:
|
|
50
|
+
# get from id
|
|
51
|
+
self._model = repositories.Models(client_api=self._client_api).get(model_id=self._model_id)
|
|
52
|
+
if self._model is None:
|
|
53
|
+
raise exceptions.PlatformException(
|
|
54
|
+
error='2001',
|
|
55
|
+
message='Cannot perform action WITHOUT Model entity in FeatureSets repository.')
|
|
56
|
+
assert isinstance(self._model, entities.Model)
|
|
57
|
+
return self._model
|
|
58
|
+
|
|
59
|
+
###########
|
|
60
|
+
# methods #
|
|
61
|
+
###########
|
|
62
|
+
|
|
63
|
+
def _list(self, filters: entities.Filters):
|
|
64
|
+
# request
|
|
65
|
+
success, response = self._client_api.gen_request(req_type='POST',
|
|
66
|
+
path='/features/sets/query',
|
|
67
|
+
json_req=filters.prepare())
|
|
68
|
+
if not success:
|
|
69
|
+
raise exceptions.PlatformException(response)
|
|
70
|
+
return response.json()
|
|
71
|
+
|
|
72
|
+
@_api_reference.add(path='/features/sets/query', method='post')
|
|
73
|
+
def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
|
|
74
|
+
"""
|
|
75
|
+
List Feature Sets
|
|
76
|
+
|
|
77
|
+
:param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
|
|
78
|
+
:return: Paged entity
|
|
79
|
+
:rtype: dtlpy.entities.paged_entities.PagedEntities
|
|
80
|
+
"""
|
|
81
|
+
# default filters
|
|
82
|
+
if filters is None:
|
|
83
|
+
filters = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
|
|
84
|
+
if self._project is not None:
|
|
85
|
+
filters.context = {'projects': [self._project.id]}
|
|
86
|
+
|
|
87
|
+
# assert type filters
|
|
88
|
+
if not isinstance(filters, entities.Filters):
|
|
89
|
+
raise exceptions.PlatformException(error='400',
|
|
90
|
+
message='Unknown filters type: {!r}'.format(type(filters)))
|
|
91
|
+
|
|
92
|
+
if filters.resource != entities.FiltersResource.FEATURE_SET:
|
|
93
|
+
raise exceptions.PlatformException(
|
|
94
|
+
error='400',
|
|
95
|
+
message='Filters resource must to be FiltersResource.FEATURE_SET. Got: {!r}'.format(filters.resource))
|
|
96
|
+
|
|
97
|
+
paged = entities.PagedEntities(items_repository=self,
|
|
98
|
+
filters=filters,
|
|
99
|
+
page_offset=filters.page,
|
|
100
|
+
page_size=filters.page_size,
|
|
101
|
+
client_api=self._client_api)
|
|
102
|
+
paged.get_page()
|
|
103
|
+
return paged
|
|
104
|
+
|
|
105
|
+
@_api_reference.add(path='/features/sets/{id}', method='get')
|
|
106
|
+
def get(self, feature_set_name: str = None, feature_set_id: str = None) -> entities.Feature:
|
|
107
|
+
"""
|
|
108
|
+
Get Feature Set object
|
|
109
|
+
|
|
110
|
+
:param str feature_set_name: name of the feature set
|
|
111
|
+
:param str feature_set_id: id of the feature set
|
|
112
|
+
:return: Feature object
|
|
113
|
+
"""
|
|
114
|
+
if feature_set_id is not None:
|
|
115
|
+
success, response = self._client_api.gen_request(req_type="GET",
|
|
116
|
+
path="{}/{}".format(self.URL, feature_set_id))
|
|
117
|
+
if not success:
|
|
118
|
+
raise exceptions.PlatformException(response)
|
|
119
|
+
feature_set = entities.FeatureSet.from_json(client_api=self._client_api,
|
|
120
|
+
_json=response.json())
|
|
121
|
+
elif feature_set_name is not None:
|
|
122
|
+
if not isinstance(feature_set_name, str):
|
|
123
|
+
raise exceptions.PlatformException(
|
|
124
|
+
error='400',
|
|
125
|
+
message='feature_set_name must be string')
|
|
126
|
+
filters = entities.Filters(resource=entities.FiltersResource.FEATURE_SET)
|
|
127
|
+
filters.add(field='name', values=feature_set_name)
|
|
128
|
+
feature_sets = self.list(filters=filters)
|
|
129
|
+
if feature_sets.items_count == 0:
|
|
130
|
+
raise exceptions.PlatformException(
|
|
131
|
+
error='404',
|
|
132
|
+
message='Feature set not found. name: {!r}'.format(feature_set_name))
|
|
133
|
+
elif feature_sets.items_count > 1:
|
|
134
|
+
# more than one matching project
|
|
135
|
+
raise exceptions.PlatformException(
|
|
136
|
+
error='404',
|
|
137
|
+
message='More than one feature_set with same name. Please "get" by id')
|
|
138
|
+
else:
|
|
139
|
+
feature_set = feature_sets.items[0]
|
|
140
|
+
else:
|
|
141
|
+
raise exceptions.PlatformException(
|
|
142
|
+
error='400',
|
|
143
|
+
message='Must provide an identifier in inputs, feature_set_name or feature_set_id')
|
|
144
|
+
return feature_set
|
|
145
|
+
|
|
146
|
+
@_api_reference.add(path='/features/sets', method='post')
|
|
147
|
+
def create(self, name: str,
|
|
148
|
+
size: int,
|
|
149
|
+
set_type: str,
|
|
150
|
+
entity_type: entities.FeatureEntityType,
|
|
151
|
+
project_id: str = None,
|
|
152
|
+
model_id: set = None,
|
|
153
|
+
org_id: str = None):
|
|
154
|
+
"""
|
|
155
|
+
Create a new Feature Set
|
|
156
|
+
|
|
157
|
+
:param str name: the Feature name
|
|
158
|
+
:param int size: the length of a single vector in the set
|
|
159
|
+
:param str set_type: string of the feature type: 2d, 3d, modelFC, TSNE,PCA,FFT
|
|
160
|
+
:param entity_type: the entity that feature vector is linked to. Use the enum dl.FeatureEntityType
|
|
161
|
+
:param str project_id: the ID of the project where feature set will be created
|
|
162
|
+
:param str model_id: the ID of the model that creates the vectors
|
|
163
|
+
:param str org_id: the ID of the org where feature set will be created
|
|
164
|
+
:return: Feature Set object
|
|
165
|
+
"""
|
|
166
|
+
if project_id is None:
|
|
167
|
+
if self._project is None:
|
|
168
|
+
raise ValueError('Must input a project id')
|
|
169
|
+
else:
|
|
170
|
+
project_id = self._project.id
|
|
171
|
+
|
|
172
|
+
payload = {'name': name,
|
|
173
|
+
'size': size,
|
|
174
|
+
'type': set_type,
|
|
175
|
+
'project': project_id,
|
|
176
|
+
'modelId': model_id,
|
|
177
|
+
'entityType': entity_type}
|
|
178
|
+
if org_id is not None:
|
|
179
|
+
payload['org'] = org_id
|
|
180
|
+
success, response = self._client_api.gen_request(req_type="post",
|
|
181
|
+
json_req=payload,
|
|
182
|
+
path=self.URL)
|
|
183
|
+
|
|
184
|
+
# exception handling
|
|
185
|
+
if not success:
|
|
186
|
+
raise exceptions.PlatformException(response)
|
|
187
|
+
|
|
188
|
+
# return entity
|
|
189
|
+
return entities.FeatureSet.from_json(client_api=self._client_api,
|
|
190
|
+
_json=response.json()[0])
|
|
191
|
+
|
|
192
|
+
@_api_reference.add(path='/features/sets/{id}', method='delete')
|
|
193
|
+
def delete(self, feature_set_id: str):
|
|
194
|
+
"""
|
|
195
|
+
Delete feature vector
|
|
196
|
+
|
|
197
|
+
:param str feature_set_id: feature set id to delete
|
|
198
|
+
:return: success
|
|
199
|
+
:rtype: bool
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
success, response = self._client_api.gen_request(req_type="delete",
|
|
203
|
+
path="{}/{}".format(self.URL, feature_set_id))
|
|
204
|
+
|
|
205
|
+
# check response
|
|
206
|
+
if success:
|
|
207
|
+
logger.debug("Feature Set deleted successfully")
|
|
208
|
+
return success
|
|
209
|
+
else:
|
|
210
|
+
raise exceptions.PlatformException(response)
|
|
211
|
+
|
|
212
|
+
def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Item]:
|
|
213
|
+
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
214
|
+
jobs = [None for _ in range(len(response_items))]
|
|
215
|
+
# return triggers list
|
|
216
|
+
for i_item, item in enumerate(response_items):
|
|
217
|
+
jobs[i_item] = pool.submit(entities.FeatureSet._protected_from_json,
|
|
218
|
+
**{'client_api': self._client_api,
|
|
219
|
+
'_json': item})
|
|
220
|
+
# get all results
|
|
221
|
+
results = [j.result() for j in jobs]
|
|
222
|
+
# log errors
|
|
223
|
+
_ = [logger.warning(r[1]) for r in results if r[0] is False]
|
|
224
|
+
# return good jobs
|
|
225
|
+
items = miscellaneous.List([r[1] for r in results if r[0] is True])
|
|
226
|
+
return items
|