Changeset 7962:bc95a7bc0d32 in orange


Ignore:
Timestamp:
06/01/11 14:45:46 (3 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
901ff73d61a7f8b2790b943b0c711fd687ce97f6
Message:

Fixed reading directed graphs.

Location:
orange/OrangeWidgets/Unsupervised
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Unsupervised/OWNxExplorer.py

    r7954 r7962  
    136136         
    137137        self.tabs = OWGUI.tabWidget(self.hcontroArea) 
    138         self.connect(self.tabs, SIGNAL("currentChanged(int)"), self.currentTabChanged) 
    139138         
    140139        self.verticesTab = OWGUI.createTabPage(self.tabs, "Vertices") 
     
    144143        #self.editTab = OWGUI.createTabPage(self.tabs, "Edit") 
    145144         
    146  
     145        self.tabs.setCurrentIndex(self.tabIndex) 
     146        self.connect(self.tabs, SIGNAL("currentChanged(int)"), lambda index: setattr(self, 'tabIndex', index)) 
     147         
    147148        self.optimizeBox = OWGUI.radioButtonsInBox(self.verticesTab, self, "optimizeWhat", [], "Optimize", addSpace=False) 
    148149         
    149         self.optCombo = OWGUI.comboBox(self.optimizeBox, self, "optMethod", label='Method:     ', orientation='horizontal', callback=self.setOptMethod) 
     150        self.optCombo = OWGUI.comboBox(self.optimizeBox, self, "optMethod", label='Method:     ', orientation='horizontal', callback=self.graph_layout_method) 
    150151        self.optCombo.addItem("No optimization") 
    151152        self.optCombo.addItem("Random") 
     
    161162        self.stepsSpin.setEnabled(False) 
    162163         
    163         self.optButton = OWGUI.button(self.optimizeBox, self, "Optimize layout", callback=self.optLayout, toggleButton=1) 
     164        self.optButton = OWGUI.button(self.optimizeBox, self, "Optimize layout", callback=self.graph_layout, toggleButton=1) 
    164165         
    165166        colorBox = OWGUI.widgetBox(self.verticesTab, "Vertex color attribute", orientation="horizontal", addSpace = False) 
     
    192193         
    193194        ib = OWGUI.widgetBox(self.edgesTab, "General", orientation="vertical") 
    194         OWGUI.checkBox(ib, self, 'showWeights', 'Show weights', callback = self.showWeightLabels) 
    195         OWGUI.checkBox(ib, self, 'showEdgeLabels', 'Show labels on edges', callback = self.showEdgeLabelsClick) 
     195        OWGUI.checkBox(ib, self, 'showWeights', 'Show weights', callback=(lambda: self._set_canvas_attr('showWeights', self.showWeights))) 
     196        OWGUI.checkBox(ib, self, 'showEdgeLabels', 'Show labels on edges', callback=(lambda: self._set_canvas_attr('showEdgeLabels', self.showEdgeLabels))) 
    196197        OWGUI.spin(ib, self, "maxLinkSize", 1, 50, 1, label="Max edge width:", callback = self.setMaxLinkSize) 
    197         OWGUI.checkBox(ib, self, 'showDistances', 'Explore vertex distances', callback = self.showDistancesClick) 
     198        self.showDistancesCheckBox = OWGUI.checkBox(ib, self, 'showDistances', 'Explore vertex distances', callback=(lambda: self._set_canvas_attr('showDistances', self.showDistances)), disabled=1) 
    198199         
    199200        ib = OWGUI.widgetBox(self.verticesTab, "General", orientation="vertical") 
    200         OWGUI.checkBox(ib, self, 'showIndexes', 'Show indexes', callback = self.showIndexLabels) 
    201         OWGUI.checkBox(ib, self, 'labelsOnMarkedOnly', 'Show labels on marked vertices only', callback = self.labelsOnMarked) 
    202         OWGUI.checkBox(ib, self, 'renderAntialiased', 'Render antialiased', callback = self.setRenderAntialiased) 
     201        OWGUI.checkBox(ib, self, 'showIndexes', 'Show indexes', callback=(lambda: self._set_canvas_attr('showIndexes', self.showIndexes))) 
     202        OWGUI.checkBox(ib, self, 'labelsOnMarkedOnly', 'Show labels on marked vertices only', callback=(lambda: self._set_canvas_attr('labelsOnMarkedOnly', self.labelsOnMarkedOnly))) 
     203        OWGUI.checkBox(ib, self, 'renderAntialiased', 'Render antialiased', callback=(lambda: self._set_canvas_attr('renderAntialiased', self.renderAntialiased))) 
    203204        self.insideView = 0 
    204205        self.insideViewNeighbours = 2 
    205206        OWGUI.spin(ib, self, "insideViewNeighbours", 1, 6, 1, label="Inside view (neighbours): ", checked = "insideView", checkCallback = self.insideview, callback = self.insideviewneighbours) 
    206         OWGUI.checkBox(ib, self, 'showMissingValues', 'Show missing values', callback = self.setShowMissingValues) 
     207        OWGUI.checkBox(ib, self, 'showMissingValues', 'Show missing values', callback=(lambda: self._set_canvas_attr('showMissingValues', self.showMissingValues))) 
    207208         
    208209        ib = OWGUI.widgetBox(self.markTab, "Info", orientation="vertical") 
     
    298299        ibs = OWGUI.widgetBox(ib, orientation="horizontal") 
    299300        self.btnMDS = OWGUI.button(ibs, self, "Fragviz", callback=self.mdsComponents, toggleButton=1) 
    300         self.btnESIM = OWGUI.button(ibs, self, "eSim", callback=self.exactSimulation, toggleButton=1) 
    301         self.btnMDSv = OWGUI.button(ibs, self, "MDS", callback=self.mdsVertices, toggleButton=1) 
     301        self.btnESIM = OWGUI.button(ibs, self, "eSim", callback=(lambda: self.mdsComponents(Orange.network.MdsType.exactSimulation)), toggleButton=1) 
     302        self.btnMDSv = OWGUI.button(ibs, self, "MDS", callback=(lambda: self.mdsComponents(Orange.network.MdsType.MDS)), toggleButton=1) 
    302303        ibs = OWGUI.widgetBox(ib, orientation="horizontal") 
    303304        self.btnRotate = OWGUI.button(ibs, self, "Rotate", callback=self.rotateComponents, toggleButton=1) 
     
    318319         
    319320        OWGUI.spin(ib, self, "rotateSteps", 1, 10000, 1, label="Rotate max steps: ") 
    320         OWGUI.spin(ib, self, "minComponentEdgeWidth", 0, 100, 1, label="Min component edge width: ", callback=self.setComponentEdgeWidth) 
    321         OWGUI.spin(ib, self, "maxComponentEdgeWidth", 0, 200, 1, label="Max component edge width: ", callback=self.setComponentEdgeWidth) 
     321        OWGUI.spin(ib, self, "minComponentEdgeWidth", 0, 100, 1, label="Min component edge width: ", callback=(lambda changedMin=1: self.setComponentEdgeWidth(changedMin))) 
     322        OWGUI.spin(ib, self, "maxComponentEdgeWidth", 0, 200, 1, label="Max component edge width: ", callback=(lambda changedMin=0: self.setComponentEdgeWidth(changedMin))) 
    322323         
    323324        self.attSelectionAttribute = 0 
     
    350351        self.networkCanvas.discEdgePalette = dlg.getDiscretePalette("discPalette") 
    351352         
    352         self.setOptMethod() 
     353        self.graph_layout_method() 
    353354        self.setFontSize() 
    354         self.tabs.setCurrentIndex(self.tabIndex) 
    355355        self.set_graph(None) 
    356356        self.setMinimumWidth(900) 
     
    359359        #self.controlArea.setEnabled(False) 
    360360         
    361     def currentTabChanged(self, index):  
    362         self.tabIndex = index 
    363          
    364     def setComponentEdgeWidth(self): 
    365         self.networkCanvas.minComponentEdgeWidth = self.minComponentEdgeWidth 
    366         self.networkCanvas.maxComponentEdgeWidth = self.maxComponentEdgeWidth 
    367         self.updateCanvas() 
     361    def setComponentEdgeWidth(self, changedMin=True): 
     362        if self.networkCanvas is None: 
     363            return 
     364         
     365        canvas = self.networkCanvas 
     366        if changedMin: 
     367            if self.maxComponentEdgeWidth < self.minComponentEdgeWidth: 
     368                self.maxComponentEdgeWidth = self.minComponentEdgeWidth 
     369        else: 
     370            if self.minComponentEdgeWidth > self.maxComponentEdgeWidth: 
     371                self.minComponentEdgeWidth = self.maxComponentEdgeWidth 
     372         
     373        canvas.minComponentEdgeWidth = self.minComponentEdgeWidth 
     374        canvas.maxComponentEdgeWidth = self.maxComponentEdgeWidth 
     375        self.networkCanvas.updateCanvas() 
    368376     
    369377    def setAutoSendAttributes(self): 
     
    417425            self.networkCanvas.forceVectors = None 
    418426             
    419         self.updateCanvas() 
     427        self.networkCanvas.updateCanvas() 
    420428         
    421429    def rotateProgress(self, curr, max): 
     
    541549        self.progressBarFinished() 
    542550         
    543     def exactSimulation(self): 
    544         self.mdsComponents(Orange.network.MdsType.exactSimulation) 
    545          
    546     def mdsVertices(self): 
    547         self.mdsComponents(Orange.network.MdsType.MDS) 
    548          
    549551    def setVertexDistance(self, matrix): 
    550552        self.error('') 
    551553        self.information('') 
     554        self.showDistancesCheckBox.setEnabled(0) 
    552555         
    553556        if matrix is None or self.graph is None: 
     
    567570        self.layout.vertexDistance = matrix 
    568571        if self.networkCanvas: self.networkCanvas.vertexDistance = matrix 
    569          
    570         self.updateCanvas() 
     572        self.showDistancesCheckBox.setEnabled(1) 
     573         
     574        self.networkCanvas.updateCanvas() 
    571575             
    572576    def setSendMarkedNodes(self): 
     
    594598            self.networkCanvas.insideviewNeighbours = self.insideViewNeighbours 
    595599            self.optButton.setChecked(True) 
    596             self.fr(False) 
     600            self.graph_layout_fr(False) 
    597601         
    598602    def insideview(self): 
     
    603607                self.networkCanvas.insideview = 0 
    604608                self.networkCanvas.showAllVertices() 
    605                 self.updateCanvas() 
     609                self.networkCanvas.updateCanvas() 
    606610            else: 
    607611                print "insideview: 0" 
     
    609613                self.networkCanvas.insideviewNeighbors = self.insideViewNeighbours 
    610614                self.optButton.setChecked(True) 
    611                 self.fr(False) 
     615                self.graph_layout_fr(False) 
    612616     
    613617        else: 
     
    979983        #    print item 
    980984                         
    981     def showIndexLabels(self): 
    982         self.networkCanvas.showIndexes = self.showIndexes 
    983         self.networkCanvas.updateData() 
    984         self.networkCanvas.replot() 
    985          
    986     def showWeightLabels(self): 
    987         self.networkCanvas.showWeights = self.showWeights 
    988         self.networkCanvas.updateData() 
    989         self.networkCanvas.replot() 
    990          
    991     def showDistancesClick(self): 
    992         if self.visualize and self.visualize.vertexDistance is None: 
    993             self.warning("Vertex distance signal is not set. Distances are not known.") 
    994         self.networkCanvas.showDistances = self.showDistances 
    995          
    996     def showEdgeLabelsClick(self): 
    997         self.networkCanvas.showEdgeLabels = self.showEdgeLabels 
    998         self.networkCanvas.updateData() 
    999         self.networkCanvas.replot() 
    1000          
    1001     def labelsOnMarked(self): 
    1002         self.networkCanvas.labelsOnMarkedOnly = self.labelsOnMarkedOnly 
    1003         self.networkCanvas.updateData() 
    1004         self.networkCanvas.replot() 
    1005      
     985    def _set_canvas_attr(self, attr, value): 
     986        setattr(self.networkCanvas, attr, value) 
     987        self.networkCanvas.updateCanvas() 
     988                 
    1006989    def setSearchStringTimer(self): 
    1007990        self.hubs = 1 
     
    12311214         
    12321215        if graph.items() is not None and 'x' in graph.items().domain and 'y' in graph.items().domain: 
    1233             positions = [(ex['x'].value, ex['y'].value) for ex in graph.items()] 
     1216            positions = [(ex['x'].value, ex['y'].value) for ex in graph.items() if ex['x'].value != '?' and ex['y'].value != '?'] 
    12341217            self.layout.set_graph(graph, positions) 
    12351218        else: 
     
    12661249        else: 
    12671250            self.edgesPerVertex = 0 
    1268              
    1269         components = Orange.network.nx.algorithms.components.connected_components(graph) 
     1251         
     1252        undirected_graph = graph.to_undirected() if graph.is_directed() else graph 
     1253        components = Orange.network.nx.algorithms.components.connected_components(undirected_graph) 
    12701254        if len(components) > 1: 
    12711255            self.diameter = -1 
    12721256        else: 
    12731257            self.diameter = Orange.network.nx.algorithms.distance_measures.diameter(graph) 
    1274         self.clustering_coefficient = Orange.network.nx.algorithms.cluster.average_clustering(graph) * 100 
     1258        self.clustering_coefficient = Orange.network.nx.algorithms.cluster.average_clustering(undirected_graph) * 100 
    12751259         
    12761260        self.setCombos() 
    1277          
     1261             
    12781262        lastNameComponentAttributeFound = False 
    12791263        for i in range(self.nameComponentCombo.count()): 
     
    12961280        self.frSteps = int(5.0 / t) 
    12971281        if self.frSteps <   1: self.frSteps = 1; 
    1298         if self.frSteps > 1500: self.frSteps = 1500; 
     1282        if self.frSteps > 3000: self.frSteps = 3000; 
    12991283         
    13001284        self.networkCanvas.labelsOnMarkedOnly = self.labelsOnMarkedOnly 
     
    13081292            self.maxLinkSize = 1 
    13091293            self.optMethod = 0 
    1310             self.setOptMethod()             
     1294            self.graph_layout_method()             
    13111295             
    13121296        if self.vertexSize > 0: 
     
    13241308         
    13251309        self.optButton.setChecked(1) 
    1326         self.optLayout()         
     1310        self.graph_layout()         
    13271311        self.information(0) 
    13281312        #self.controlArea.setEnabled(True) 
    1329         self.updateCanvas() 
     1313        self.networkCanvas.updateCanvas() 
    13301314         
    13311315    def setItems(self, items=None): 
     
    13421326         
    13431327        self.setVertexSize() 
    1344         self.showIndexLabels() 
    1345         self.showWeightLabels() 
    1346         self.showEdgeLabelsClick() 
    1347          
     1328        self.networkCanvas.showIndexes = self.showIndexes 
     1329        self.networkCanvas.showWeights = self.showWeights 
     1330        self.networkCanvas.showEdgeLabels = self.showEdgeLabels  
    13481331        self.setCombos() 
    13491332        self.networkCanvas.updateData() 
     
    14101393            except: 
    14111394                self.warning('"index" attribute does not exist in "items" table.') 
    1412                              
    1413     def updateCanvas(self): 
    1414         # if network exists 
    1415         if self.graph is not None: 
    1416             self.networkCanvas.updateCanvas() 
    1417  
     1395                     
    14181396    def showDegreeDistribution(self): 
    14191397        if self.graph is None: 
     
    14661444    Layout Optimization 
    14671445    """ 
    1468     def optLayout(self): 
     1446    def graph_layout(self): 
    14691447        if self.graph is None:   #grafa se ni 
    14701448            self.optButton.setChecked(False) 
     
    14781456             
    14791457        if self.optMethod == 1: 
    1480             self.random() 
     1458            self.layout.random() 
    14811459        elif self.optMethod == 2: 
    1482             self.fr(False) 
     1460            self.graph_layout_fr(False) 
    14831461        elif self.optMethod == 3: 
    1484             self.fr(True) 
     1462            self.graph_layout_fr(True) 
    14851463        elif self.optMethod == 4: 
    1486             self.frRadial() 
     1464            self.graph_layout_fr_radial() 
    14871465        elif self.optMethod == 5: 
    1488             self.circularCrossingReduction() 
     1466            self.layout.circular_crossing_reduction() 
    14891467        elif self.optMethod == 6: 
    1490             self.circularOriginal() 
     1468            self.layout.circular_original() 
    14911469        elif self.optMethod == 7: 
    1492             self.circularRandom() 
     1470            self.layout.circular_random() 
    14931471        elif self.optMethod == 8: 
    1494             self.pivotMDS() 
     1472            self.graph_layout_pivot_mds() 
    14951473             
    14961474        self.optButton.setChecked(False) 
     1475        self.networkCanvas.updateCanvas() 
    14971476        qApp.processEvents() 
    14981477         
    1499     def setOptMethod(self, method=None): 
     1478    def graph_layout_method(self, method=None): 
    15001479        self.stepsSpin.label.setText('Iterations: ') 
    15011480         
     
    15161495            self.stepsSpin.setEnabled(False) 
    15171496            self.optButton.setChecked(True) 
    1518             self.optLayout() 
    1519  
    1520     def random(self): 
    1521         if self.graph is None:   #grafa se ni 
    1522             return     
    1523         self.layout.random() 
    1524         self.updateCanvas(); 
    1525          
    1526     def fr(self, weighted): 
     1497            self.graph_layout() 
     1498         
     1499    def graph_layout_fr(self, weighted): 
    15271500        if self.graph is None:   #grafa se ni 
    15281501            return 
     
    15541527                iteration += 1 
    15551528                qApp.processEvents() 
    1556                 self.updateCanvas() 
     1529                self.networkCanvas.updateCanvas() 
    15571530             
    15581531            #print "ostanek: " + str(o) + ", initTemp: " + str(initTemp) 
     
    15611534            initTemp = self.layout.fr(o, initTemp, coolFactor, weighted) 
    15621535            qApp.processEvents() 
    1563             self.updateCanvas() 
     1536            self.networkCanvas.updateCanvas() 
    15641537        else: 
    15651538            while iteration < o: 
     
    15701543                iteration += 1 
    15711544                qApp.processEvents() 
    1572                 self.updateCanvas() 
     1545                self.networkCanvas.updateCanvas() 
    15731546                 
    15741547        self.optButton.setChecked(False) 
    15751548        self.optButton.setText("Optimize layout") 
    15761549         
    1577     def frSpecial(self): 
     1550    def graph_layout_fr_special(self): 
    15781551        if self.graph is None:   #grafa se ni 
    15791552            return 
     
    15891562        self.networkCanvas.replot() 
    15901563                 
    1591     def frRadial(self): 
     1564    def graph_layout_fr_radial(self): 
    15921565        if self.graph is None:   #grafa se ni 
    15931566            return 
     
    16141587        self.networkCanvas.circles = [10000 / 12, 10000/12*2, 10000/12*3]#, 10000/12*4, 10000/12*5] 
    16151588        #self.networkCanvas.circles = [100, 200, 300] 
    1616         self.updateCanvas() 
     1589        self.networkCanvas.updateCanvas() 
    16171590        self.networkCanvas.circles = [] 
    1618          
    1619     def circularOriginal(self): 
    1620         #print "Circular Original" 
    1621         if self.graph is not None: 
    1622             self.layout.circular_original() 
    1623             self.updateCanvas() 
    1624             
    1625     def circularRandom(self): 
    1626         #print "Circular Random" 
    1627         if self.graph is not None: 
    1628             self.layout.circular_random() 
    1629             self.updateCanvas() 
    1630  
    1631     def circularCrossingReduction(self): 
    1632         #print "Circular Crossing Reduction" 
    1633         if self.graph is not None: 
    1634             self.layout.circular_crossing_reduction() 
    1635             self.updateCanvas() 
    1636              
    1637     def pivotMDS(self): 
     1591             
     1592    def graph_layout_pivot_mds(self): 
    16381593        if self.vertexDistance is None: 
    16391594            self.information('Set distance matrix to input signal') 
     
    16541609        self.graph.coors[0] = x 
    16551610        self.graph.coors[1] = y 
    1656         self.updateCanvas() 
     1611        self.networkCanvas.updateCanvas() 
    16571612     
    16581613       
     
    17121667    def selectAllConnectedNodes(self): 
    17131668        self.networkCanvas.selectConnectedNodes(1000000) 
    1714          
    1715     def setShowMissingValues(self): 
    1716         self.networkCanvas.showMissingValues = self.showMissingValues 
    1717         self.networkCanvas.updateData() 
    1718         self.networkCanvas.replot() 
    1719          
     1669                 
    17201670    def setMaxLinkSize(self): 
    17211671        if self.graph is None: 
     
    17501700        self.networkCanvas.fontSize = self.fontSize 
    17511701        self.networkCanvas.drawPlotItems() 
    1752          
    1753     def setRenderAntialiased(self): 
    1754         self.networkCanvas.renderAntialiased = self.renderAntialiased 
    1755         self.networkCanvas.updateData() 
    1756         self.networkCanvas.replot() 
    1757          
     1702                 
    17581703    def sendReport(self): 
    17591704        self.reportSettings("Graph data", 
  • orange/OrangeWidgets/Unsupervised/OWNxFile.py

    r7954 r7962  
    219219        if os.path.exists(items_candidate): 
    220220            self.readDataFile(items_candidate) 
     221            if items_candidate in self.recentDataFiles: 
     222                self.recentDataFiles.remove(items_candidate) 
    221223            self.recentDataFiles.insert(0, items_candidate) 
    222224        elif os.path.exists(os.path.splitext(fn)[0] + "_items.tab"): 
    223225            items_candidate = os.path.splitext(fn)[0] + "_items.tab" 
    224226            self.readDataFile(items_candidate) 
     227            if items_candidate in self.recentDataFiles: 
     228                self.recentDataFiles.remove(items_candidate) 
    225229            self.recentDataFiles.insert(0, items_candidate) 
    226230        else: 
     
    250254        if fn == "(none)" or self.graph == None: 
    251255            self.infoc.setText("No vertices data file specified") 
    252             self.send("Network", None) 
     256            self.graph.set_items(None) 
     257            self.send("Network", self.graph) 
    253258            self.send("Items", None) 
    254259            return 
     
    272277            return 
    273278         
     279        items = self.graph.items() 
     280        if items is not None and \ 
     281                'x' in items.domain and \ 
     282                'y' in items.domain and \ 
     283                len(self.graph.items()) == len(table) and \ 
     284                'x' not in table.domain and 'y' not in table.domain: 
     285            xvar = items.domain['x'] 
     286            yvar = items.domain['y'] 
     287            tmp = Orange.data.Table(Orange.data.Domain([xvar, yvar], False), items) 
     288            table = Orange.data.Table([table, tmp]) 
     289             
    274290        self.graph.set_items(table) 
    275291        self.infoc.setText("Vertices data file added") 
Note: See TracChangeset for help on using the changeset viewer.