Skip to content

Commit 0afdc4d

Browse files
get, exists setup migration
1 parent 846026a commit 0afdc4d

3 files changed

Lines changed: 46 additions & 23 deletions

File tree

openml/_api/resources/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from abc import ABC, abstractmethod
44
from collections.abc import Iterable
5-
from typing import TYPE_CHECKING
5+
from typing import TYPE_CHECKING, Any
66

77
if TYPE_CHECKING:
88
from requests import Response
@@ -49,7 +49,7 @@ def list(
4949
def _create_setup(self, result_dict: dict) -> OpenMLSetup: ...
5050

5151
@abstractmethod
52-
def get(self, setup_id: int) -> OpenMLSetup: ...
52+
def get(self, setup_id: int) -> tuple[str, OpenMLSetup]: ...
5353

5454
@abstractmethod
55-
def exists(self) -> int: ...
55+
def exists(self, file_elements: dict[str, Any]) -> int: ...

openml/_api/resources/setups.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from collections.abc import Iterable
4+
from typing import Any
45

56
import xmltodict
67

@@ -156,7 +157,7 @@ def _create_setup_parameter_from_xml(self, result_dict: dict[str, str]) -> OpenM
156157
value=result_dict["oml:value"],
157158
)
158159

159-
def get(self, setup_id: int) -> OpenMLSetup:
160+
def get(self, setup_id: int) -> tuple[str, OpenMLSetup]:
160161
"""
161162
Downloads the setup (configuration) description from OpenML
162163
and returns a structured object
@@ -168,11 +169,40 @@ def get(self, setup_id: int) -> OpenMLSetup:
168169
169170
Returns
170171
-------
171-
OpenMLSetup (an initialized openml setup object)
172+
tuple[str, OpenMLSetup]
173+
A tuple containing:
174+
- xml_content: The raw XML response from the server
175+
- setup: An initialized OpenMLSetup object parsed from the XML
172176
"""
177+
url_suffix = f"/setup/{setup_id}"
178+
setup_response = self._http.get(url_suffix)
179+
xml_content = setup_response.text
180+
result_dict = xmltodict.parse(xml_content)
181+
182+
setup = self._create_setup(result_dict)
183+
return xml_content, setup
184+
185+
def exists(self, file_elements: dict[str, Any]) -> int:
186+
"""
187+
Checks whether a hyperparameter configuration already exists on the server.
188+
189+
Parameters
190+
----------
191+
file_elements : dict
192+
Dictionary containing file data for the API request
193+
194+
Returns
195+
-------
196+
setup_id : int
197+
setup id iff exists, False otherwise
198+
"""
199+
api_call = "/setup/exists/"
200+
setup_response = self._http.post(api_call, files=file_elements)
201+
xml_content = setup_response.text
202+
result_dict = xmltodict.parse(xml_content)
173203

174-
def exists(self) -> int:
175-
pass
204+
setup_id = int(result_dict["oml:setup_exists"]["oml:id"])
205+
return setup_id if setup_id > 0 else False
176206

177207

178208
class SetupsV2(SetupsAPI):
@@ -192,8 +222,8 @@ def list(
192222
def _create_setup(self, result_dict: dict) -> OpenMLSetup:
193223
raise NotImplementedError("V2 API implementation is not yet available")
194224

195-
def get(self, setup_id: int) -> OpenMLSetup:
225+
def get(self, setup_id: int) -> tuple[str, OpenMLSetup]:
196226
raise NotImplementedError("V2 API implementation is not yet available")
197227

198-
def exists(self) -> int:
228+
def exists(self, file_elements: dict[str, Any]) -> int:
199229
raise NotImplementedError("V2 API implementation is not yet available")

openml/setups/functions.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,8 @@ def setup_exists(flow: OpenMLFlow) -> int:
5858
file_elements = {
5959
"description": ("description.arff", description),
6060
} # type: openml._api_calls.FILE_ELEMENTS_TYPE
61-
result = openml._api_calls._perform_api_call(
62-
"/setup/exists/",
63-
"post",
64-
file_elements=file_elements,
65-
)
66-
result_dict = xmltodict.parse(result)
67-
setup_id = int(result_dict["oml:setup_exists"]["oml:id"])
68-
return setup_id if setup_id > 0 else False
61+
62+
return api_context.backend.setups.exists(file_elements=file_elements)
6963

7064

7165
def _get_cached_setup(setup_id: int) -> OpenMLSetup:
@@ -92,7 +86,7 @@ def _get_cached_setup(setup_id: int) -> OpenMLSetup:
9286
setup_file = setup_cache_dir / "description.xml"
9387
with setup_file.open(encoding="utf8") as fh:
9488
setup_xml = xmltodict.parse(fh.read())
95-
return _create_setup_from_xml(setup_xml)
89+
return _create_setup(setup_xml)
9690

9791
except OSError as e:
9892
raise openml.exceptions.OpenMLCacheException(
@@ -122,13 +116,12 @@ def get_setup(setup_id: int) -> OpenMLSetup:
122116
try:
123117
return _get_cached_setup(setup_id)
124118
except openml.exceptions.OpenMLCacheException:
125-
url_suffix = f"/setup/{setup_id}"
126-
setup_xml = openml._api_calls._perform_api_call(url_suffix, "get")
119+
result: tuple[str, OpenMLSetup] = api_context.backend.setups.get(setup_id=setup_id)
120+
setup_xml, setup = result
127121
with setup_file.open("w", encoding="utf8") as fh:
128122
fh.write(setup_xml)
129123

130-
result_dict = xmltodict.parse(setup_xml)
131-
return _create_setup_from_xml(result_dict)
124+
return setup
132125

133126

134127
def list_setups( # noqa: PLR0913
@@ -238,6 +231,6 @@ def _to_dict(flow_id: int, openml_parameter_settings: list[dict[str, Any]]) -> O
238231
return xml
239232

240233

241-
def _create_setup_from_xml(result_dict: dict) -> OpenMLSetup:
234+
def _create_setup(result_dict: dict) -> OpenMLSetup:
242235
"""Turns an API xml result into a OpenMLSetup object (or dict)"""
243236
return api_context.backend.setups._create_setup(result_dict)

0 commit comments

Comments
 (0)