source: orange/Orange/OrangeWidgets/Prototypes/OWSymMatrixCombine.py @ 10157:1b42fe9bfc70

Revision 10157:1b42fe9bfc70, 3.2 KB checked in by markotoplak, 2 years ago (diff)

data.SymMatrix -> misc.SymMatrix in OWSymMatrixCombine.py

Line 
1"""
2<name>Combine Matrices</name>
3<description>Combine multiple matrices</description>
4
5"""
6
7from OWWidget import *
8import OWGUI
9import Orange
10import numpy
11import math
12
13from Orange.misc import progress_bar_milestones
14
15def mul(values):
16    return reduce(float.__mul__, values, 1.0)
17
18def geometric_mean(vals):
19    prod = mul(vals)
20    return math.pow(abs(prod), 1.0/len(vals))
21
22def harmonic_mean(vals):
23    hsum = sum(map(lambda v: 1.0/(v or 1e-7), vals))
24    return len(vals) / hsum
25
26class OWSymMatrixCombine(OWWidget):
27    METHODS = [("Add", sum),
28               ("Multiply", mul),
29               ("Mean", numpy.mean),
30               ("Median", numpy.median),
31               ("Geometric Mean", geometric_mean),
32               ("Harmonic Mean", harmonic_mean)
33               ]
34   
35    settingsList = ["selected_method"]
36    def __init__(self, parent=None, signalManager=None, title="Combine Matrices"):
37        OWWidget.__init__(self, parent, signalManager, title, wantMainArea=False)
38       
39        self.inputs = [("Matrices", Orange.misc.SymMatrix, self.set_matrix, Multiple)]
40        self.outputs = [("Combined Matrix", Orange.misc.SymMatrix, Multiple)]
41       
42        self.selected_method = 0
43       
44        box = OWGUI.widgetBox(self.controlArea, "Method")
45        OWGUI.comboBox(box, self, "selected_method", 
46                       items=[t[0] for t in self.METHODS],
47                       tooltip="Select the method for combining the matrices",
48                       callback=self.method_changed)
49       
50        OWGUI.rubber(self.controlArea)
51        self.matrices = {}
52        self.resize(150,30)
53       
54    def set_matrix(self, matrix=None, id=None):
55        if id in self.matrices:
56            # A new value on the signal
57            if matrix is None:
58                del self.matrices[id]
59            else:
60                self.matrices[id] = matrix
61        elif matrix is not None:
62            # New signal
63            self.matrices[id] = matrix
64           
65    def handleNewSignals(self):
66        self.compute_combined()
67       
68    def method_changed(self):
69        self.compute_combined()
70       
71    def compute_combined(self):
72        self.error(0)
73        dim = 0
74        matrices = self.matrices.values()
75        new = None
76        if matrices and len(set(m.dim for m in matrices)) != 1:
77            # Do dimensions match
78            self.error(0, "Matrices are of different dimensions.")
79        elif matrices:
80            dim = matrices[0].dim
81            method = self.METHODS[self.selected_method][1]
82            new = Orange.misc.SymMatrix(dim)
83            milestones = progress_bar_milestones(100, dim*(dim + 1) / 2)
84            iter = 0
85            for i in range(dim):
86                for j in range(i, dim):
87                    vals = [m[i, j] for m in matrices]
88                    new[i, j] = method(vals)
89                   
90            items = [getattr(m, "items") for m in matrices]
91            items = filter(None, items)
92            if items:
93                new.setattr("items", items[0])
94           
95        self.send("Combined Matrix", new)
96       
97if __name__ == "__main__":
98    import sys
99    app = QApplication(sys.argv)
100    w = OWSymMatrixCombine()
101    w.show()
102    app.exec_()
103       
Note: See TracBrowser for help on using the repository browser.