Changeset 8841:5769fd3981ed in orange


Ignore:
Timestamp:
08/30/11 09:55:10 (3 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
820aaa7b70997345cabbeede332d14acf7d08e20
Message:

Added MDS.

Location:
orange/OrangeWidgets/Visualize Qt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Visualize Qt/OWNxCanvasQt.py

    r8840 r8841  
    4343        orangeqt.NetworkCurve.set_node_sizes(self, values, min_size, max_size) 
    4444     
    45     def mds_callback(self, a, b, mds, mdsRefresh, components, progress_callback): 
     45    def fragviz_callback(self, a, b, mds, mdsRefresh, components, progress_callback): 
    4646        """Refresh the UI when running  MDS on network components.""" 
    4747         
     
    181181                    mds.points[u][1] = y 
    182182            else: 
    183                 for i,u in enumerate(nodes): 
    184                     mds.points[i][0] = u.x() 
    185                     mds.points[i][1] = u.y() 
     183                for i,u in enumerate(sorted(nodes.iterkeys())): 
     184                    mds.points[i][0] = nodes[u].x() 
     185                    mds.points[i][1] = nodes[u].y() 
    186186        else: 
    187187            mds.Torgerson()  
     
    195195                                components=components, 
    196196                                progress_callback=progress_callback:  
    197                                     self.mds_callback(a, b, mds, mdsRefresh, components, progress_callback)) 
     197                                    self.fragviz_callback(a, b, mds, mdsRefresh, components, progress_callback)) 
    198198         
    199199        self.mds_callback(mds.avgStress, 0, mds, mdsRefresh, components, progress_callback) 
     200         
     201        if progress_callback != None: 
     202            progress_callback(mds.avgStress, self.mdsStep) 
     203         
     204        p.animate_points = animate_points 
     205        return 0 
     206     
     207    def mds_callback(self, a, b, mds, mdsRefresh, progress_callback): 
     208        """Refresh the UI when running  MDS.""" 
     209         
     210        if not self.mdsStep % mdsRefresh: 
     211             
     212            self.set_node_coordinates(dict((u, (mds.points[u][0], \ 
     213                                                mds.points[u][1])) for u in \ 
     214                                           range(len(mds.points)))) 
     215            self.plot().replot() 
     216            qApp.processEvents() 
     217             
     218            if progress_callback is not None: 
     219                progress_callback(a, self.mdsStep)  
     220             
     221        self.mdsStep += 1 
     222        return 0 if self.stopMDS else 1 
     223     
     224    def layout_mds(self, steps, distances, progress_callback=None, opt_from_curr=False): 
     225        """Position the network components according to similarities among  
     226        them. 
     227         
     228        """ 
     229        nodes = self.nodes() 
     230         
     231        if distances == None or distances.dim != len(nodes): 
     232            self.information('invalid or no distance matrix') 
     233            return 1 
     234         
     235        p = self.plot() 
     236         
     237        minStressDelta = 0 
     238        mdsRefresh = int(steps / 20) 
     239         
     240        self.mdsStep = 1 
     241        self.stopMDS = False 
     242         
     243        distances.matrixType = Orange.core.SymMatrix.Symmetric 
     244        mds = Orange.projection.mds.MDS(distances) 
     245        mds.optimize(10, Orange.projection.mds.SgnRelStress, 0) 
     246        rect = self.data_rect() 
     247        w_fr = rect.width() 
     248        h_fr = rect.height() 
     249        d_fr = math.sqrt(w_fr**2 + h_fr**2) 
     250       
     251        x_mds = [mds.points[u][0] for u in range(len(mds.points))] 
     252        y_mds = [mds.points[u][1] for u in range(len(mds.points))] 
     253        w_mds = max(x_mds) - min(x_mds) 
     254        h_mds = max(y_mds) - min(y_mds) 
     255        d_mds = math.sqrt(w_mds**2 + h_mds**2) 
     256         
     257        animate_points = p.animate_points 
     258        p.animate_points = False 
     259         
     260        self.set_node_coordinates(dict( 
     261           (n, (nodes[n].x()*d_mds/d_fr, nodes[n].y()*d_mds/d_fr)) for n in nodes)) 
     262         
     263        p.replot() 
     264        qApp.processEvents() 
     265                      
     266        if opt_from_curr: 
     267            for i,u in enumerate(sorted(nodes.iterkeys())): 
     268                mds.points[i][0] = nodes[u].x() 
     269                mds.points[i][1] = nodes[u].y() 
     270        else: 
     271            mds.Torgerson()  
     272 
     273        mds.optimize(steps, Orange.projection.mds.SgnRelStress, minStressDelta,  
     274                     progressCallback= 
     275                         lambda a,  
     276                                b=None,  
     277                                mds=mds, 
     278                                mdsRefresh=mdsRefresh, 
     279                                progress_callback=progress_callback:  
     280                                    self.mds_callback(a, b, mds, mdsRefresh, progress_callback)) 
     281         
     282        self.mds_callback(mds.avgStress, 0, mds, mdsRefresh, progress_callback) 
    200283         
    201284        if progress_callback != None: 
  • orange/OrangeWidgets/Visualize Qt/OWNxExplorerQt.py

    r8840 r8841  
    14651465            return 
    14661466         
    1467         if not self.optButton.isChecked() and not self.optMethod in [2, 9]: 
     1467        if not self.optButton.isChecked() and not self.optMethod in [2,3,9,10]: 
    14681468            self.optButton.setChecked(False) 
    14691469            return 
     
    14901490            self.graph_layout_fragviz() 
    14911491        elif self.optMethod == 10:  
    1492             print "TODO: MDS" 
    1493             #self.mds_components(Orange.network.MdsType.MDS) 
     1492            self.graph_layout_mds() 
    14941493             
    14951494        self.optButton.setChecked(False) 
    1496 #        self.networkCanvas.networkCurve.coors = self.layout.map_to_graph(self.graph)  
    1497         #self.networkCanvas.updateCanvas() 
    14981495        self.networkCanvas.networkCurve.update_properties() 
    14991496        self.networkCanvas.replot() 
     
    15211518                self.stepsSpin.label.setText('Pivots: ') 
    15221519             
    1523             if str(self.optMethod) == '9':  
     1520            if str(self.optMethod) in ['9', '10']:  
    15241521                self.cb_opt_from_curr.setEnabled(True) 
    15251522                 
     
    15751572         
    15761573        self.optButton.setText("Stop") 
    1577          
     1574        self.progressBarInit() 
    15781575        qApp.processEvents() 
    1579  
    1580         self.progressBarInit() 
    15811576 
    15821577        if self.graph.number_of_nodes() == self.graph_base.number_of_nodes(): 
     
    15861581         
    15871582        self.networkCanvas.networkCurve.layout_fragviz(self.frSteps, matrix, self.graph, self.mdsProgress, self.opt_from_curr) 
     1583 
     1584        self.optButton.setChecked(False) 
     1585        self.optButton.setText("Optimize layout") 
     1586        self.progressBarFinished() 
     1587         
     1588    def graph_layout_mds(self): 
     1589        if self.items_matrix is None: 
     1590            self.information('Set distance matrix to input signal') 
     1591            self.optButton.setChecked(False) 
     1592            return 
     1593         
     1594        if self.layout is None: 
     1595            self.information('No network found') 
     1596            self.optButton.setChecked(False) 
     1597            return 
     1598         
     1599        if self.items_matrix.dim != self.graph.number_of_nodes(): 
     1600            self.error('Distance matrix dimensionality must equal number of vertices') 
     1601            self.optButton.setChecked(False) 
     1602            return 
     1603         
     1604        if not self.optButton.isChecked(): 
     1605            self.networkCanvas.networkCurve.stopMDS = True 
     1606            self.optButton.setChecked(False) 
     1607            self.optButton.setText("Optimize layout") 
     1608            return 
     1609         
     1610        self.optButton.setText("Stop") 
     1611        self.progressBarInit() 
     1612        qApp.processEvents() 
     1613         
     1614        if self.graph.number_of_nodes() == self.graph_base.number_of_nodes(): 
     1615            matrix = self.items_matrix 
     1616        else: 
     1617            matrix = self.items_matrix.get_items(sorted(self.graph.nodes())) 
     1618         
     1619        self.networkCanvas.networkCurve.layout_mds(self.frSteps, matrix, self.mdsProgress, self.opt_from_curr) 
    15881620 
    15891621        self.optButton.setChecked(False) 
Note: See TracChangeset for help on using the changeset viewer.