Skip to content

Commit c0c6643

Browse files
committed
initial commit for setup list
1 parent ccd0912 commit c0c6643

File tree

5 files changed

+104
-6
lines changed

5 files changed

+104
-6
lines changed

openml/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from . import runs
2323
from . import flows
2424
from . import setups
25+
from . import evaluations
2526
from .runs import OpenMLRun
2627
from .tasks import OpenMLTask, OpenMLSplit
2728
from .flows import OpenMLFlow
@@ -66,5 +67,6 @@ def populate_cache(task_ids=None, dataset_ids=None, flow_ids=None,
6667

6768

6869
__all__ = ['OpenMLDataset', 'OpenMLDataFeature', 'OpenMLRun',
69-
'OpenMLSplit', 'datasets', 'OpenMLTask', 'OpenMLFlow',
70+
'OpenMLSplit', 'OpenMLEvaluation', 'OpenMLSetup',
71+
'OpenMLTask', 'OpenMLFlow', 'datasets', 'evaluations',
7072
'config', 'runs', 'flows', 'tasks', 'setups']

openml/setups/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
from .functions import get_setup, setup_exists, initialize_model
1+
from .setup import OpenMLSetup
2+
from .functions import get_setup, setup_list, setup_exists, initialize_model
23

3-
__all__ = ['get_setup', 'setup_exists', 'initialize_model']
4+
__all__ = ['get_setup', 'setup_list', 'setup_exists', 'initialize_model']

openml/setups/functions.py

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,76 @@ def get_setup(setup_id):
7474
return _create_setup_from_xml(result_dict)
7575

7676

77+
def setup_list(flow=None, tag=None, offset=None, size=None):
78+
"""List all setups matching all of the given filters.
79+
80+
Perform API call `/setup/list/{filters}
81+
82+
Parameters
83+
----------
84+
flow : int, optional
85+
86+
tag : str, optional
87+
88+
offset : int, optional
89+
90+
size : int, optional
91+
92+
Returns
93+
-------
94+
list
95+
List of found setups.
96+
"""
97+
98+
api_call = "setup/list"
99+
if offset is not None:
100+
api_call += "/offset/%d" % int(offset)
101+
if size is not None:
102+
api_call += "/limit/%d" % int(size)
103+
if flow is not None:
104+
api_call += "/flow/%s" % flow
105+
if tag is not None:
106+
api_call += "/tag/%s" % tag
107+
108+
return _list_setups(api_call)
109+
110+
111+
def _list_setups(api_call):
112+
"""Helper function to parse API calls which are lists of setups"""
113+
114+
xml_string = openml._api_calls._perform_api_call(api_call)
115+
116+
setups_dict = xmltodict.parse(xml_string)
117+
# Minimalistic check if the XML is useful
118+
if 'oml:setups' not in setups_dict:
119+
raise ValueError('Error in return XML, does not contain "oml:setups": %s'
120+
% str(setups_dict))
121+
elif '@xmlns:oml' not in setups_dict['oml:setups']:
122+
raise ValueError('Error in return XML, does not contain '
123+
'"oml:runs"/@xmlns:oml: %s'
124+
% str(setups_dict))
125+
elif setups_dict['oml:setups']['@xmlns:oml'] != 'http://openml.org/openml':
126+
raise ValueError('Error in return XML, value of '
127+
'"oml:runs"/@xmlns:oml is not '
128+
'"http://openml.org/openml": %s'
129+
% str(setups_dict))
130+
131+
if isinstance(setups_dict['oml:setups']['oml:setup'], list):
132+
setups_list = setups_dict['oml:setups']['oml:setup']
133+
elif isinstance(setups_dict['oml:setups']['oml:setup'], dict):
134+
setups_list = [setups_dict['oml:setups']['oml:setup']]
135+
else:
136+
raise TypeError()
137+
138+
setups = dict()
139+
for setup_ in setups_list:
140+
# making it a dict to give it the right format
141+
current = _create_setup_from_xml({'oml:setup_parameters': setup_})
142+
setups[current.setup_id] = current
143+
144+
return setups
145+
146+
77147
def initialize_model(setup_id):
78148
'''
79149
Initialized a model based on a setup_id (i.e., using the exact
@@ -147,6 +217,7 @@ def _create_setup_from_xml(result_dict):
147217
'''
148218
Turns an API xml result into a OpenMLSetup object
149219
'''
220+
setup_id = int(result_dict['oml:setup_parameters']['oml:setup_id'])
150221
flow_id = int(result_dict['oml:setup_parameters']['oml:flow_id'])
151222
parameters = {}
152223
if 'oml:parameter' not in result_dict['oml:setup_parameters']:
@@ -164,7 +235,7 @@ def _create_setup_from_xml(result_dict):
164235
else:
165236
raise ValueError('Expected None, list or dict, received someting else: %s' %str(type(xml_parameters)))
166237

167-
return OpenMLSetup(flow_id, parameters)
238+
return OpenMLSetup(setup_id, flow_id, parameters)
168239

169240
def _create_setup_parameter_from_xml(result_dict):
170241
return OpenMLParameter(int(result_dict['oml:id']),
@@ -173,4 +244,4 @@ def _create_setup_parameter_from_xml(result_dict):
173244
result_dict['oml:parameter_name'],
174245
result_dict['oml:data_type'],
175246
result_dict['oml:default_value'],
176-
result_dict['oml:value'])
247+
result_dict['oml:value'])

openml/setups/setup.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@ class OpenMLSetup(object):
44
55
Parameters
66
----------
7+
setup_id : int
8+
The OpenML setup id
79
flow_id : int
810
The flow that it is build upon
911
parameters : dict
1012
The setting of the parameters
1113
"""
1214

13-
def __init__(self, flow_id, parameters):
15+
def __init__(self, setup_id, flow_id, parameters):
16+
if not isinstance(setup_id, int):
17+
raise ValueError('setup id should be int')
18+
if not isinstance(flow_id, int):
19+
raise ValueError('flow id should be int')
20+
if parameters is not None:
21+
if not isinstance(parameters, dict):
22+
raise ValueError('parameters should be dict')
23+
24+
self.setup_id = setup_id
1425
self.flow_id = flow_id
1526
self.parameters = parameters
1627

tests/test_setups/test_setup_functions.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,16 @@ def test_get_setup(self):
117117
self.assertIsNone(current.parameters)
118118
else:
119119
self.assertEquals(len(current.parameters), num_params[idx])
120+
121+
122+
def test_setup_list_filter_flow(self):
123+
# TODO: please remove for better test
124+
# openml.config.server = self.production_server
125+
126+
flow_id = 31 # TODO please change
127+
128+
setups = openml.setups.setup_list(flow=31)
129+
130+
self.assertGreater(len(setups), 0) # TODO: please adjust 0
131+
for setup_id in setups.keys():
132+
self.assertEquals(setups[setup_id].flow_id, flow_id)

0 commit comments

Comments
 (0)