source: orange/Orange/OrangeWidgets/OWNetworkHist.py @ 9671:a7b056375472

Revision 9671:a7b056375472, 12.2 KB checked in by anze <anze.staric@…>, 2 years ago (diff)

Moved orange to Orange (part 2)

Line 
1#
2# OWHist.py
3#
4# the base for network histograms
5
6import OWGUI
7from OWWidget import *
8from OWGraph import *
9import orngNetwork
10
11import numpy, math
12from OWHist import *
13
14class OWNetworkHist():
15   
16    def __init__(self, parent=None, type=0):
17        self.parent = parent
18       
19    def addHistogramControls(self, parent=None):
20        # set default settings
21        self.spinLowerThreshold = 0
22        self.spinLowerChecked = False
23        self.spinUpperThreshold = 0
24        self.spinUpperChecked = False
25        self.netOption = 0
26        self.dstWeight = 0
27        self.kNN = 0
28        self.andor = 0
29        self.matrix = None
30        self.excludeLimit = 1
31        self.percentil = 0
32       
33        if parent is None:
34            parent = self.controlArea
35           
36        boxGeneral = OWGUI.widgetBox(parent, box = "Distance boundaries")
37       
38        OWGUI.lineEdit(boxGeneral, self, "spinLowerThreshold", "Lower:", orientation='horizontal', callback=self.changeLowerSpin, valueType=float)
39        OWGUI.lineEdit(boxGeneral, self, "spinUpperThreshold", "Upper:", orientation='horizontal', callback=self.changeUpperSpin, valueType=float)
40        ribg = OWGUI.radioButtonsInBox(boxGeneral, self, "andor", [], orientation='horizontal', callback = self.generateGraph)
41        OWGUI.appendRadioButton(ribg, self, "andor", "OR", callback = self.generateGraph)
42        b = OWGUI.appendRadioButton(ribg, self, "andor", "AND", callback = self.generateGraph)
43        b.setEnabled(False)
44        OWGUI.spin(boxGeneral, self, "kNN", 0, 1000, 1, label="kNN:", orientation='horizontal', callback=self.generateGraph)
45        OWGUI.doubleSpin(boxGeneral, self, "percentil", 0, 100, 0.1, label="Percentil:", orientation='horizontal', callback=self.setPercentil, callbackOnReturn=1)
46       
47        # Options
48        self.attrColor = ""
49        ribg = OWGUI.radioButtonsInBox(parent, self, "netOption", [], "Options", callback = self.generateGraph)
50        OWGUI.appendRadioButton(ribg, self, "netOption", "All vertices", callback = self.generateGraph)
51        OWGUI.appendRadioButton(ribg, self, "netOption", "Exclude small components", callback = self.generateGraph)
52        OWGUI.spin(OWGUI.indentedBox(ribg), self, "excludeLimit", 1, 100, 1, label="Less vertices than: ", callback = (lambda h=True: self.generateGraph(h)))
53        OWGUI.appendRadioButton(ribg, self, "netOption", "Largest connected component only", callback = self.generateGraph)
54        OWGUI.appendRadioButton(ribg, self, "netOption", "Connected component with vertex")
55        self.attribute = None
56        self.attributeCombo = OWGUI.comboBox(ribg, self, "attribute", box = "Filter attribute")#, callback=self.setVertexColor)
57       
58        ribg = OWGUI.radioButtonsInBox(parent, self, "dstWeight", [], "Distance -> Weight", callback = self.generateGraph)
59        OWGUI.appendRadioButton(ribg, self, "dstWeight", "Weight := distance", callback = self.generateGraph)
60        OWGUI.appendRadioButton(ribg, self, "dstWeight", "Weight := 1 - distance", callback = self.generateGraph)
61       
62        self.label = ''
63        self.searchString = OWGUI.lineEdit(self.attributeCombo.box, self, "label", callback=self.setSearchStringTimer, callbackOnType=True)
64        self.searchStringTimer = QTimer(self)
65        self.connect(self.searchStringTimer, SIGNAL("timeout()"), self.generateGraph)
66       
67        if str(self.netOption) != '3':
68            self.attributeCombo.box.setEnabled(False)
69           
70    def setPercentil(self):
71        self.spinLowerThreshold = self.histogram.minValue
72        net = orngNetwork.Network(self.matrix.dim, 0)
73        lower, upper = net.getDistanceMatrixThreshold(self.matrix, self.percentil/100)
74        self.spinUpperThreshold = upper
75        self.generateGraph()
76       
77    def enableAttributeSelection(self):
78        self.attributeCombo.box.setEnabled(True)
79       
80    def setSearchStringTimer(self):
81        self.searchStringTimer.stop()
82        self.searchStringTimer.start(750)
83
84    def setMatrix(self, data):
85        if data == None: return
86       
87        self.matrix = data
88        # draw histogram
89        data.matrixType = orange.SymMatrix.Symmetric
90        values = data.getValues()
91        #print "values:",values
92        self.histogram.setValues(values)
93       
94        low = min(values)
95        upp = max(values)
96        self.spinLowerThreshold = self.spinUpperThreshold = low - (0.03 * (upp - low))
97        self.generateGraph()
98        self.attributeCombo.clear()
99        vars = []
100        if (self.matrix != None):
101            if hasattr(self.matrix, "items"):
102                 
103                if isinstance(self.matrix.items, orange.ExampleTable):
104                    vars = list(self.matrix.items.domain.variables)
105               
106                    metas = self.matrix.items.domain.getmetas(0)
107                    for i, var in metas.iteritems():
108                        vars.append(var)
109                       
110        self.icons = self.createAttributeIconDict()
111                     
112        for var in vars:
113            try:
114                self.attributeCombo.addItem(self.icons[var.varType], unicode(var.name))
115            except:
116                print "error adding ", var, " to the attribute combo"
117
118    def changeLowerSpin(self):
119        self.percentil = 0
120       
121        if self.spinLowerThreshold < self.histogram.minValue:
122            self.spinLowerThreshold = self.histogram.minValue
123        elif self.spinLowerThreshold > self.histogram.maxValue:
124            self.spinLowerThreshold = self.histogram.maxValue
125           
126        if self.spinLowerThreshold >= self.spinUpperThreshold:
127            self.spinUpperThreshold = self.spinLowerThreshold
128           
129        self.generateGraph()
130       
131    def changeUpperSpin(self):
132        self.percentil = 0
133       
134        if self.spinUpperThreshold < self.histogram.minValue:
135            self.spinUpperThreshold = self.histogram.minValue
136        elif self.spinUpperThreshold > self.histogram.maxValue:
137            self.spinUpperThreshold = self.histogram.maxValue
138           
139        if self.spinUpperThreshold <= self.spinLowerThreshold:
140            self.spinLowerThreshold = self.spinUpperThreshold
141       
142        self.generateGraph()
143       
144    def generateGraph(self, N_changed = False):
145        self.searchStringTimer.stop()
146        self.attributeCombo.box.setEnabled(False)
147        self.error()
148        matrix = None
149        self.warning('')
150       
151        if N_changed:
152            self.netOption = 1
153           
154        if self.matrix == None:
155            self.infoa.setText("No data loaded.")
156            self.infob.setText("")
157            return
158       
159        #print len(self.histogram.yData), len(self.histogram.xData)
160        nEdgesEstimate = 2 * sum([self.histogram.yData[i] for i,e in enumerate(self.histogram.xData) if self.spinLowerThreshold <= e <= self.spinUpperThreshold])
161       
162        if nEdgesEstimate > 200000:
163            self.graph = None
164            nedges = 0
165            n = 0
166            self.error('Estimated number of edges is too high (%d).' % nEdgesEstimate)
167        else:
168            graph = orngNetwork.Network(self.matrix.dim, 0)
169            matrix = self.matrix
170           
171            if hasattr(self.matrix, "items"):               
172                if type(self.matrix.items) == orange.ExampleTable:
173                    #graph.setattr("items", self.data.items)
174                    graph.items = self.matrix.items
175                else:
176                    data = [[str(x)] for x in self.matrix.items]
177                    items = orange.ExampleTable(orange.Domain(orange.StringVariable('label'), 0), data)
178                    #graph.setattr("items", list(items))
179                    graph.items = list(items)
180               
181            # set the threshold
182            # set edges where distance is lower than threshold
183                 
184            self.warning(0)
185            if self.kNN >= self.matrix.dim:
186                self.warning(0, "kNN larger then supplied distance matrix dimension. Using k = %i" % (self.matrix.dim - 1))
187            nedges = graph.fromDistanceMatrix(self.matrix, self.spinLowerThreshold, self.spinUpperThreshold, min(self.kNN, self.matrix.dim - 1), self.andor)
188            edges = graph.getEdges()
189           
190            #print graph.nVertices, self.matrix.dim
191           
192            if self.dstWeight == 1:
193                if graph.directed:
194                    for u,v in edges:
195                        foo = 1
196                        if str(graph[u,v]) != "0":
197                            foo = 1.0 - float(graph[u,v])
198                       
199                        graph[u,v] = foo
200                else:
201                    for u,v in edges:
202                        if u <= v:
203                            foo = 1
204                            if str(graph[u,v]) != "0":
205                                foo = 1.0 - float(graph[u,v])
206                           
207                            graph[u,v] = foo
208                   
209            n = len(edges)
210            #print 'self.netOption',self.netOption
211            # exclude unconnected
212            if str(self.netOption) == '1':
213                components = [x for x in graph.getConnectedComponents() if len(x) > self.excludeLimit]
214                if len(components) > 0:
215                    include = reduce(lambda x,y: x+y, components)
216                    if len(include) > 1:
217                        self.graph = orngNetwork.Network(graph.getSubGraph(include))
218                        matrix = self.matrix.getitems(include)
219                    else:
220                        self.graph = None
221                        matrix = None
222                else:
223                    self.graph = None
224                    matrix = None
225            # largest connected component only       
226            elif str(self.netOption) == '2':
227                component = graph.getConnectedComponents()[0]
228                if len(component) > 1:
229                    self.graph = orngNetwork.Network(graph.getSubGraph(component))
230                    matrix = self.matrix.getitems(component)
231                else:
232                    self.graph = None
233                    matrix = None
234            # connected component with vertex by label
235            elif str(self.netOption) == '3':
236                self.attributeCombo.box.setEnabled(True)
237                self.graph = None
238                matrix = None
239                #print self.attributeCombo.currentText()
240                if self.attributeCombo.currentText() != '' and self.label != '':
241                    components = graph.getConnectedComponents()
242                       
243                    txt = self.label.lower()
244                    #print 'txt:',txt
245                    nodes = [i for i, values in enumerate(self.matrix.items) if txt in str(values[str(self.attributeCombo.currentText())]).lower()]
246                    #print "nodes:",nodes
247                    if len(nodes) > 0:
248                        vertices = []
249                        for component in components:
250                            for node in nodes:
251                                if node in component:
252                                    if len(component) > 0:
253                                        vertices.extend(component)
254                                       
255                        if len(vertices) > 0:
256                            #print "n vertices:", len(vertices), "n set vertices:", len(set(vertices))
257                            vertices = list(set(vertices))
258                            self.graph = orngNetwork.Network(graph.getSubGraph(vertices))
259                            matrix = self.matrix.getitems(vertices)
260            else:
261                self.graph = graph
262       
263        if matrix != None:
264            matrix.items  = self.graph.items
265            self.graph_matrix = matrix
266           
267        self.pconnected = nedges
268        self.nedges = n
269        if hasattr(self, "infoa"):
270            self.infoa.setText("%d vertices" % self.matrix.dim)
271        if hasattr(self, "infob"):
272            self.infob.setText("%d connected (%3.1f%%)" % (nedges, nedges / float(self.matrix.dim) * 100))
273        if hasattr(self, "infoc"):
274            self.infoc.setText("%d edges (%d average)" % (n, n / float(self.matrix.dim)))
275       
276        #print 'self.graph:',self.graph+
277        if hasattr(self, "sendSignals"):
278            self.sendSignals()
279       
280        self.histogram.setBoundary(self.spinLowerThreshold, self.spinUpperThreshold)
Note: See TracBrowser for help on using the repository browser.