Skip to content

Commit 52d0140

Browse files
committed
MAINT generalize flow, fix severe bug
OpenMLFlow parameters and components attribute are now of type OrderedDict, with keys being the name of the parameter/component and value the either the default value of the hyperparameter or the actual component. This makes creating OpenMLFlows easier. They can still be nicely uploaded. Also, there was a bug in the deserialization, which returned always the model of the serialized flow.
1 parent 6a1660b commit 52d0140

6 files changed

Lines changed: 488 additions & 430 deletions

File tree

openml/flows/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from .flow import OpenMLFlow
1+
from .flow import OpenMLFlow, create_flow_from_model
22

3-
__all__ = ['OpenMLFlow']
3+
__all__ = ['OpenMLFlow', 'create_flow_from_model']

openml/flows/flow.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from collections import OrderedDict
22
import xmltodict
3-
import sklearn
43

54
from .._api_calls import _perform_api_call
65
from .functions import _check_flow_exists
@@ -28,30 +27,31 @@ class OpenMLFlow(object):
2827
2928
3029
"""
31-
def __init__(self, model, flow_id=None, uploader=None,
32-
description=None, creator=None, components=None,
33-
parameters=None, contributor=None, tag=None):
34-
self.flow_id = flow_id
35-
self.upoader = uploader
30+
def __init__(self, name, description=None, model=None, components=None,
31+
parameters=None, external_version=None, creator=None,
32+
uploader=None, tag=None, flow_id=None):
33+
self.name = name
3634
self.description = description
37-
self.creator = creator
38-
self.tag = tag
3935
self.model = model
4036

41-
# TODO update these - the sklearn transformation class should be able
42-
# to do this!
43-
self.source = "FIXME DEFINE PYTHON FLOW"
44-
self.name = (model.__module__ + "." +
45-
model.__class__.__name__)
46-
self.external_version = 'sklearn_' + sklearn.__version__
47-
4837
if components is None:
49-
components = []
38+
components = OrderedDict()
39+
elif not isinstance(components, OrderedDict):
40+
raise TypeError('Components must be of type OrderedDict, but are %s.' %
41+
type(components))
5042
self.components = components
5143
if parameters is None:
52-
parameters = []
44+
parameters = OrderedDict()
45+
elif not isinstance(parameters, OrderedDict):
46+
raise TypeError('Parameters must be of type OrderedDict, but are %s.' %
47+
type(parameters))
5348
self.parameters = parameters
5449

50+
self.external_version = external_version
51+
self.creator = creator
52+
self.upoader = uploader
53+
self.tag = tag
54+
self.flow_id = flow_id
5555

5656
def _generate_flow_xml(self):
5757
"""Generate xml representation of self for upload to server.
@@ -133,3 +133,12 @@ def _get_name(self):
133133
return self.name
134134

135135

136+
def create_flow_from_model(model, converter, description=None):
137+
flow = converter.serialize_object(model)
138+
if not isinstance(flow, OpenMLFlow):
139+
raise ValueError('Converter %s did return %s, not OpenMLFlow!' %
140+
(str(converter), type(flow)))
141+
if description is not None:
142+
flow.description = description
143+
144+
return flow

0 commit comments

Comments
 (0)