Skip to content

Commit 97e0e82

Browse files
authored
Merge pull request #2801 from jerneju/new-signals-trees
[ENH] New signals: Trees, Forest
2 parents 06db21c + b6cb734 commit 97e0e82

File tree

6 files changed

+126
-118
lines changed

6 files changed

+126
-118
lines changed

Orange/widgets/visualize/owpythagorastree.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88

99
from Orange.base import TreeModel, SklModel
1010
from Orange.data.table import Table
11-
from Orange.widgets import gui, settings, widget
11+
from Orange.widgets import gui, settings
1212
from Orange.widgets.utils.annotated_data import (
1313
create_annotated_table,
1414
ANNOTATED_DATA_SIGNAL_NAME
1515
)
16+
from Orange.widgets.utils.signals import Input, Output
1617
from Orange.widgets.visualize.pythagorastreeviewer import (
1718
PythagorasTreeViewer,
1819
SquareGraphicsItem,
@@ -43,9 +44,12 @@ class OWPythagorasTree(OWWidget):
4344

4445
priority = 1000
4546

46-
inputs = [('Tree', TreeModel, 'set_tree')]
47-
outputs = [('Selected Data', Table, widget.Default),
48-
(ANNOTATED_DATA_SIGNAL_NAME, Table)]
47+
class Inputs:
48+
tree = Input("Tree", TreeModel)
49+
50+
class Outputs:
51+
selected_data = Output("Selected Data", Table, default=True)
52+
annotated_data = Output(ANNOTATED_DATA_SIGNAL_NAME, Table)
4953

5054
# Enable the save as feature
5155
graph_name = 'scene'
@@ -136,6 +140,7 @@ def __init__(self):
136140
# Clear the widget to correctly set the intial values
137141
self.clear()
138142

143+
@Inputs.tree
139144
def set_tree(self, model=None):
140145
"""When a different tree is given."""
141146
self.clear()
@@ -185,8 +190,7 @@ def set_tree(self, model=None):
185190
# self.depth_limit = model.meta_depth_limit
186191
# self.update_depth()
187192

188-
self.send(ANNOTATED_DATA_SIGNAL_NAME,
189-
create_annotated_table(self.instances, None))
193+
self.Outputs.annotated_data.send(create_annotated_table(self.instances, None))
190194

191195
def clear(self):
192196
"""Clear all relevant data from the widget."""
@@ -296,16 +300,15 @@ def onDeleteWidget(self):
296300
def commit(self):
297301
"""Commit the selected data to output."""
298302
if self.instances is None:
299-
self.send('Selected Data', None)
300-
self.send(ANNOTATED_DATA_SIGNAL_NAME, None)
303+
self.Outputs.selected_data.send(None)
304+
self.Outputs.annotated_data.send(None)
301305
return
302306
nodes = [i.tree_node.label for i in self.scene.selectedItems()
303307
if isinstance(i, SquareGraphicsItem)]
304308
data = self.tree_adapter.get_instances_in_nodes(nodes)
305-
self.send('Selected Data', data)
309+
self.Outputs.selected_data.send(data)
306310
selected_indices = self.tree_adapter.get_indices(nodes)
307-
self.send(ANNOTATED_DATA_SIGNAL_NAME,
308-
create_annotated_table(self.instances, selected_indices))
311+
self.Outputs.annotated_data.send(create_annotated_table(self.instances, selected_indices))
309312

310313
def send_report(self):
311314
"""Send report."""

Orange/widgets/visualize/owpythagoreanforest.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from Orange.base import RandomForestModel, TreeModel
1010
from Orange.data import Table
1111
from Orange.widgets import gui, settings
12+
from Orange.widgets.utils.signals import Input, Output
1213
from Orange.widgets.visualize.pythagorastreeviewer import (
1314
PythagorasTreeViewer,
1415
ContinuousTreeNode,
@@ -30,8 +31,11 @@ class OWPythagoreanForest(OWWidget):
3031

3132
priority = 1001
3233

33-
inputs = [('Random forest', RandomForestModel, 'set_rf')]
34-
outputs = [('Tree', TreeModel)]
34+
class Inputs:
35+
random_forest = Input("Random forest", RandomForestModel)
36+
37+
class Outputs:
38+
tree = Output("Tree", TreeModel)
3539

3640
# Enable the save as feature
3741
graph_name = 'scene'
@@ -110,6 +114,7 @@ def __init__(self):
110114

111115
self.clear()
112116

117+
@Inputs.random_forest
113118
def set_rf(self, model=None):
114119
"""When a different forest is given."""
115120
self.clear()
@@ -273,7 +278,7 @@ def commit(self):
273278
return
274279

275280
if not self.scene.selectedItems():
276-
self.send('Tree', None)
281+
self.Outputs.tree.send(None)
277282
# The selected tree index should only reset when model changes
278283
if self.model is None:
279284
self.selected_tree_index = -1
@@ -287,7 +292,7 @@ def commit(self):
287292
tree.meta_size_calc_idx = self.size_calc_idx
288293
tree.meta_depth_limit = self.depth_limit
289294

290-
self.send('Tree', tree)
295+
self.Outputs.tree.send(tree)
291296

292297
def send_report(self):
293298
"""Send report."""

Orange/widgets/visualize/owtreeviewer.py

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99
from AnyQt.QtCore import Qt, QPointF, QSizeF, QRectF
1010

1111
from Orange.base import TreeModel, SklModel
12+
from Orange.widgets.utils.signals import Input, Output
1213
from Orange.widgets.visualize.owtreeviewer2d import \
1314
GraphicsNode, GraphicsEdge, OWTreeViewer2D
1415
from Orange.widgets.utils import to_html
1516
from Orange.data import Table
1617

1718
from Orange.widgets.settings import ContextSetting, ClassValuesContextHandler, \
1819
Setting
19-
from Orange.widgets import gui, widget
20+
from Orange.widgets import gui
2021
from Orange.widgets.utils.colorpalette import ContinuousPaletteGenerator
2122
from Orange.widgets.utils.annotated_data import (create_annotated_table,
2223
ANNOTATED_DATA_SIGNAL_NAME)
@@ -158,21 +159,15 @@ class OWTreeGraph(OWTreeViewer2D):
158159
name = "Tree Viewer"
159160
icon = "icons/TreeViewer.svg"
160161
priority = 35
161-
inputs = [
162-
widget.InputSignal(
163-
"Tree", TreeModel, "ctree",
164-
# Had different input names before merging from
165-
# Classification/Regression tree variants
166-
replaces=["Classification Tree", "Regression Tree"])
167-
]
168-
outputs = [
169-
widget.OutputSignal(
170-
"Selected Data", Table, widget.Default, id="selected-data",
171-
),
172-
widget.OutputSignal(
173-
ANNOTATED_DATA_SIGNAL_NAME, Table, id="annotated-data")
174-
]
175162

163+
class Inputs:
164+
# Had different input names before merging from
165+
# Classification/Regression tree variants
166+
tree = Input("Tree", TreeModel, replaces=["Classification Tree", "Regression Tree"])
167+
168+
class Outputs:
169+
selected_data = Output("Selected Data", Table, default=True, id="selected-data")
170+
annotated_data = Output(ANNOTATED_DATA_SIGNAL_NAME, Table, id="annotated-data")
176171

177172
settingsHandler = ClassValuesContextHandler()
178173
target_class_index = ContextSetting(0)
@@ -257,6 +252,7 @@ def toggle_color_reg(self):
257252
self.set_node_info()
258253
self.scene.update()
259254

255+
@Inputs.tree
260256
def ctree(self, model=None):
261257
"""Input signal handler"""
262258
self.clear_scene()
@@ -297,9 +293,8 @@ def ctree(self, model=None):
297293
self.tree_adapter.num_nodes,
298294
len(self.tree_adapter.leaves(self.tree_adapter.root))))
299295
self.setup_scene()
300-
self.send("Selected Data", None)
301-
self.send(ANNOTATED_DATA_SIGNAL_NAME,
302-
create_annotated_table(self.dataset, []))
296+
self.Outputs.selected_data.send(None)
297+
self.Outputs.annotated_data.send(create_annotated_table(self.dataset, []))
303298

304299
def walkcreate(self, node, parent=None):
305300
"""Create a structure of tree nodes from the given model"""
@@ -324,10 +319,9 @@ def update_selection(self):
324319
nodes = [item.node_inst for item in self.scene.selectedItems()
325320
if isinstance(item, TreeNode)]
326321
data = self.tree_adapter.get_instances_in_nodes(nodes)
327-
self.send("Selected Data", data)
328-
self.send(ANNOTATED_DATA_SIGNAL_NAME, create_annotated_table(
329-
self.dataset,
330-
self.tree_adapter.get_indices(nodes)))
322+
self.Outputs.selected_data.send(data)
323+
self.Outputs.annotated_data.send(create_annotated_table(
324+
self.dataset, self.tree_adapter.get_indices(nodes)))
331325

332326
def send_report(self):
333327
if not self.model:

0 commit comments

Comments
 (0)