Changeset 7772:54ba9ee6d0e7 in orange
 Timestamp:
 03/22/11 17:33:35 (3 years ago)
 Branch:
 default
 Convert:
 51be7aff6bded6fae748326e88dc9e408e3cf0f0
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

orange/Orange/network/__init__.py
r7660 r7772 80 80 81 81 * .random() 82 * .fruchterman Reingold(steps, temperature, coolingFactor=Default, hiddenNodes=[], weighted=False)83 * .radial FruchtermanReingold(center, steps, temperature)84 * .circular Original()85 * .circular Random()86 * .circular CrossingReduction()82 * .fruchterman_reingold(steps, temperature, coolingFactor=Default, hiddenNodes=[], weighted=False) 83 * .radial_fruchterman_reingold(center, steps, temperature) 84 * .circular_original() 85 * .circular_random() 86 * .circular_crossing_reduction() 87 87 88 88 Spring forces layout optimization is the result of the above script: … … 236 236 'objects' attribute. For instance, if you set graph.objects to ["Age", 237 237 "Gender", "Height", "Weight"] then graph["Age", "Height"] would be equivalent 238 to graph[0, 2] and graph.get Neighbours("Weight") to graph.getNeighbours(3).238 to graph[0, 2] and graph.get_neighbours("Weight") to graph.get_neighbours(3). 239 239 Vertex identifier doesn't need to be a string, it can be any Python 240 240 object. … … 257 257 Searching through the list is, of course, rather slow, so it is recommended 258 258 to use integer indices for larger graphs. So, if you request 259 graph.get Neighbours(0), the method will return the neighbours of the first259 graph.get_neighbours(0), the method will return the neighbours of the first 260 260 vertex, even if objects is given. But  what if you want to map all 261 261 indices, even integers, through objects? In this case, you need to set 262 262 graph.forceMapping to 1. If graph.forceMapping is set and graph.objects is 263 given, even get Neighbours(0) will search the graph.objects for 0 and return263 given, even get_neighbours(0) will search the graph.objects for 0 and return 264 264 the neighbours of the corresponding (not necessarily the first) node. 265 265 … … 304 304 (graph[2, 5, 2] = None). 305 305 306 .. method:: edge Exists(v1, v2[, type])306 .. method:: edge_exists(v1, v2[, type]) 307 307 308 308 Returns true if the edge between v1 and v2 exists. For multiple edge … … 317 317 "true". 318 318 319 .. method:: add Cluster(list_of_vertices)319 .. method:: add_cluster(list_of_vertices) 320 320 321 321 Creates a cluster  adds edges between all listed vertices. … … 326 326 node. 327 327 328 .. method:: get Neighbours(v1[, type])328 .. method:: get_neighbours(v1[, type]) 329 329 330 330 Returns all the nodes that are connected to v1. In directed graphs, 331 331 this includes vertices with edges toward or from v1. In graphs with 332 332 multiple edge types you can also specify the edge type you are 333 interested in: get Neighbours will the return only the vertices that are333 interested in: get_neighbours will the return only the vertices that are 334 334 connected to v1 by edges of that type. 335 335 336 .. method:: get EdgesFrom(v1[, type])336 .. method:: get_edges_from(v1[, type]) 337 337 338 338 Return all the vertices which are connected to v1 by the edges leading 339 339 from v1. In edges with multiple edge types, you can specify the edge 340 340 type. In undirected graph, this function is equivalent to 341 get Neighbours.342 343 .. method:: get EdgesTo(v1[, type])341 get_neighbours. 342 343 .. method:: get_edges_to(v1[, type]) 344 344 345 345 Returns all the vertices with edges leading to v1. Again, you can 346 346 decide for a single edge type to observe, and, again again, in 347 undirected graphs this function is equivalent to get Neighbours.347 undirected graphs this function is equivalent to get_neighbours. 348 348 349 349 If objects is set, functions return a list of objects (names of … … 356 356 edges pointing to the given edge. There is no problem when graph is 357 357 represented as a matrix (:obj:`Orange.network.GraphAsMatrix`); these are 358 always fast. On directed graph, get EdgeFrom is always fast as well.358 always fast. On directed graph, get_edges_from is always fast as well. 359 359 360 360 In undirected graphs represented as lists or trees, the edge between … … 371 371 the list, but there is smaller number of lists to be checked. 372 372 Generally, the average number of traversed list elements for 373 get Neighbours/getEdgesFrom/getEdgesTo on undirected graphs with373 get_neighbours/get_edges_from/get_edges_to on undirected graphs with 374 374 p*nVertices2 edges is p(nVerticesv1)v1. 375 375 … … 379 379 these functions, it doesn't matter. 380 380 381 For directed graphs, get EdgesFrom is trivial. The other two functions are381 For directed graphs, get_edges_from is trivial. The other two functions are 382 382 even slower than for undirected graphs, since to find the edges leading 383 383 from any vertex to a given one, all lists/trees need to be searched. So, if 384 your algorithm will extensively use get EdgesTo or getNeighbours and your384 your algorithm will extensively use get_edges_to or get_neighbours and your 385 385 graph is large but the number of edges is less than nEdges2/2, you should 386 386 use :obj:`Orange.network.GraphAsTree` or, to be faster but consume more … … 397 397 **Graph analysis** 398 398 399 .. method:: get SubGraph(vertices)399 .. method:: get_sub_graph(vertices) 400 400 401 401 Return a new graph of type :obj:`Orange.network.Graph` that is a 402 402 subgraph of the original graph and consists of given vertices. 403 403 404 .. method:: get ClusteringCoefficient()404 .. method:: get_clustering_coefficient() 405 405 406 406 Return the graph average local clustering coefficient, described in … … 408 408 Nature 1998, 393(6684):440442. 409 409 410 .. method:: get ConnectedComponents()410 .. method:: get_connected_components() 411 411 412 412 Return a list of all connected components sorted descending by 413 413 component size. 414 414 415 .. method:: get DegreeDistribution()415 .. method:: get_degree_distribution() 416 416 417 417 Return degree distribution as dictionary of type 418 418 {degree:number_of_vertices}. 419 419 420 .. method:: get Degrees()420 .. method:: get_degrees() 421 421 422 422 Return a list of degrees. List size matches number of vertices. Index 423 423 of given degree matches index of corresponding vertex. 424 424 425 .. method:: get Hubs(n)425 .. method:: get_hubs(n) 426 426 427 427 Return a list of n largest hubs. 428 428 429 .. method:: get ShortestPaths(u, v)429 .. method:: get_shortest_paths(u, v) 430 430 431 431 Return a list of vertices in the shortest path between u and v. 432 432 433 .. method:: get Distance(u, v)433 .. method:: get_distance(u, v) 434 434 435 435 Return a distance between vertices u and v. 436 436 437 .. method:: get Diameter()437 .. method:: get_diameter() 438 438 439 439 Return a diameter of the graph. … … 610 610 attribute. 611 611 612 .. method:: from DistanceMatrix(matrix, lower, upper, kNN=0):612 .. method:: from_distance_matrix(matrix, lower, upper, kNN=0): 613 613 614 614 Creates edges between vertices with the distance within given … … 627 627 :type kNN: int 628 628 629 .. method:: hide Vertices(vertices)629 .. method:: hide_vertices(vertices) 630 630 631 631 Remove vertices from optimize list 632 632 633 .. method:: show Vertices(vertices)633 .. method:: show_vertices(vertices) 634 634 635 635 Add vertices to optimize list 636 636 637 .. method:: show All()637 .. method:: show_all() 638 638 639 639 Add all vertices to optimize list 640 640 641 .. method:: get Visible()641 .. method:: get_visible() 642 642 643 643 Return optimize list … … 655 655 self.clustering = NetworkClustering(self) 656 656 657 def get DistanceMatrixThreshold(self, matrix, ratio):657 def get_distance_matrix_threshold(self, matrix, ratio): 658 658 """Return lower and upper distance threshold values for the given 659 659 ratio of edges … … 677 677 678 678 """ 679 self.saveNetwork(fileName)680 681 def saveNetwork(self, fileName):682 679 try: 683 680 root, ext = os.path.splitext(fileName) … … 692 689 self.saveGML(graphFile) 693 690 else: 694 self.save Pajek(graphFile)695 696 def save GML(self, fp):691 self.save_pajek(graphFile) 692 693 def save_gml(self, fp): 697 694 """Save network to GML (.gml) file format. 698 695 … … 728 725 self.links.save(name + "_links.tab") 729 726 730 def save Pajek(self, fp):727 def save_pajek(self, fp): 731 728 """Save network to Pajek (.net) file format. 732 729 … … 838 835 return net 839 836 837 ########################################################################## 838 ### BEGIN: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0) ### 839 ########################################################################## 840 841 def getDistanceMatrixThreshold(self, matrix, ratio): 842 import warnings 843 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 844 "get_distance_matrix_threshold", DeprecationWarning) 845 return self.get_distance_matrix_threshold(matrix, ratio) 846 847 def saveNetwork(self, fileName): 848 import warnings 849 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 850 "save", DeprecationWarning) 851 return self.save(fileName) 852 853 def savePajek(fp): 854 import warnings 855 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 856 "save_pajek", DeprecationWarning) 857 return self.save_pajek(fp) 858 859 def saveGML(self, fp): 860 import warnings 861 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 862 "save_gml", DeprecationWarning) 863 return self.save_gml(fp) 864 865 ########################################################################## 866 ### END: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0) ### 867 ########################################################################## 868 840 869 class NetworkOptimization(Orange.core.NetworkOptimization): 841 870 … … 854 883 Random layout optimization. 855 884 856 .. method:: fruchterman Reingold(steps=100, temperature=1000, coolFactor=default, hiddenNodes=[], weighted=False)885 .. method:: fruchterman_reingold(steps=100, temperature=1000, coolFactor=default, hiddenNodes=[], weighted=False) 857 886 858 887 FruchtermanReingold spring layout optimization. Set number of iterations … … 860 889 and set list of hidden nodes with argument hidden_nodes. 861 890 862 .. method:: radial FruchtermanReingold(center, steps=100, temperature=1000)891 .. method:: radial_fruchterman_reingold(center, steps=100, temperature=1000) 863 892 864 893 Radial FruchtermanReingold spring layout optimization. Set center node … … 866 895 temperature with temperature (for example: 1000). 867 896 868 .. method:: circular Original()897 .. method:: circular_original() 869 898 870 899 Circular layout optimization based on original order. 871 900 872 .. method:: circular Random()901 .. method:: circular_random() 873 902 874 903 Circular layout optimization based on random order. 875 904 876 .. method:: circular CrossingReduction()905 .. method:: circular_crossing_reduction() 877 906 878 907 Circular layout optimization (Michael Baur, Ulrik Brandes) with crossing 879 908 reduction. 880 909 881 .. method:: closest Vertex(x, y)910 .. method:: closest_vertex(x, y) 882 911 883 912 Return the closest vertex to (x, y) coordinate. 884 913 885 .. method:: vertex Distances(x, y)914 .. method:: vertex_distances(x, y) 886 915 887 916 Return distances (list of (distance, vertex) tuples) of all vertices to 888 917 the given coordinate. 889 918 890 .. method:: get VerticesInRect(x1, y1, x2, y2)919 .. method:: get_vertices_in_rect(x1, y1, x2, y2) 891 920 892 921 Return a list of all vertices in given rectangle. … … 909 938 self.mds = None 910 939 911 def set Network(network):940 def set_network(self, network): 912 941 """Set the network object for layout optimization. 913 942 … … 918 947 self.setGraph(network) 919 948 920 def _compute Forces(self):949 def _compute_forces(self): 921 950 """Compute forces for each vertex for force vector visualization.""" 922 951 n = self.graph.nVertices … … 1019 1048 self.coors[1][len(nodescomp)] = y 1020 1049 1021 def get Vars(self):1050 def get_vars(self): 1022 1051 """Return a list of features in network items.""" 1023 1052 vars = [] … … 1032 1061 return vars 1033 1062 1034 def get EdgeVars(self):1063 def get_edge_vars(self): 1035 1064 """Return a list of features in network links.""" 1036 1065 vars = [] … … 1045 1074 1046 1075 return [x for x in vars if str(x.name) != 'u' and str(x.name) != 'v'] 1047 1048 def getData(self, i, j): 1049 import warnings 1050 warnings.warn("Deprecated.", DeprecationWarning) 1051 if self.graph.items is Orange.data.Table: 1052 return self.data[i][j] 1053 elif self.graph.data is type([]): 1054 return self.data[i][j] 1055 1056 def nVertices(self): 1057 import warnings 1058 warnings.warn("Deprecated.", DeprecationWarning) 1059 if self.graph: 1060 return self.graph.nVertices 1061 1062 def rotateVertices(self, components, phi): 1076 1077 def rotate_vertices(self, components, phi): 1063 1078 """Rotate network components for a given angle. 1064 1079 … … 1095 1110 self.graph.coors[1][component] = y + y_center 1096 1111 1097 def rotate Components(self, maxSteps=100, minMoment=0.000000001,1098 callbackProgress=None, callbackUpdateCanvas=None):1112 def rotate_components(self, maxSteps=100, minMoment=0.000000001, 1113 callbackProgress=None, callbackUpdateCanvas=None): 1099 1114 """Rotate the network components using a spring model.""" 1100 1115 if self.vertexDistance == None: … … 1175 1190 break 1176 1191 1177 self.rotate Vertices(components, phi)1192 self.rotate_vertices(components, phi) 1178 1193 if callbackUpdateCanvas: callbackUpdateCanvas() 1179 1194 if callbackProgress : callbackProgress(min([dirChange[i] for i \ … … 1181 1196 step += 1 1182 1197 1183 def mds UpdateData(self, components, mds, callbackUpdateCanvas):1198 def mds_update_data(self, components, mds, callbackUpdateCanvas): 1184 1199 """Translate and rotate the network components to computed positions.""" 1185 1200 component_props = [] … … 1394 1409 callbackUpdateCanvas() 1395 1410 1396 def mds Callback(self, a,b=None):1411 def mds_callback(self, a, b=None): 1397 1412 """Refresh the UI when running MDS on network components.""" 1398 1413 if not self.mdsStep % self.mdsRefresh: 1399 self.mds UpdateData(self.mdsComponents,1414 self.mds_update_data(self.mdsComponentList, 1400 1415 self.mds, 1401 1416 self.callbackUpdateCanvas) … … 1417 1432 return 1 1418 1433 1419 def mds Components(self, mdsSteps, mdsRefresh, callbackProgress=None, \1420 callbackUpdateCanvas=None, torgerson=0, \1421 minStressDelta=0, avgLinkage=False, rotationOnly=False,\1422 mdsType=MdsType.componentMDS, scalingRatio=0, \1423 mdsFromCurrentPos=0):1434 def mds_components(self, mdsSteps, mdsRefresh, callbackProgress=None, \ 1435 callbackUpdateCanvas=None, torgerson=0, \ 1436 minStressDelta=0, avgLinkage=False, rotationOnly=False,\ 1437 mdsType=MdsType.componentMDS, scalingRatio=0, \ 1438 mdsFromCurrentPos=0): 1424 1439 """Position the network components according to similarities among 1425 1440 them. … … 1437 1452 return 1 1438 1453 1439 self.mdsComponent s= self.graph.getConnectedComponents()1454 self.mdsComponentList = self.graph.getConnectedComponents() 1440 1455 self.mdsRefresh = mdsRefresh 1441 1456 self.mdsStep = 0 … … 1461 1476 1462 1477 if avgLinkage: 1463 matrix = self.vertexDistance.avgLinkage(self.mdsComponent s)1478 matrix = self.vertexDistance.avgLinkage(self.mdsComponentList) 1464 1479 else: 1465 1480 matrix = self.vertexDistance … … 1470 1485 if mdsFromCurrentPos: 1471 1486 if avgLinkage: 1472 for u, c in enumerate(self.mdsComponent s):1487 for u, c in enumerate(self.mdsComponentList): 1473 1488 x = sum(self.graph.coors[0][c]) / len(c) 1474 1489 y = sum(self.graph.coors[1][c]) / len(c) … … 1490 1505 self.mds.optimize(mdsSteps, Orange.projection.mds.SgnRelStress, self.minStressDelta,\ 1491 1506 progressCallback=self.mdsCallback) 1492 self.mds UpdateData(self.mdsComponents, self.mds, callbackUpdateCanvas)1507 self.mds_update_data(self.mdsComponentList, self.mds, callbackUpdateCanvas) 1493 1508 1494 1509 if callbackProgress != None: … … 1500 1515 del self.mdsStep 1501 1516 #del self.mds 1502 del self.mdsComponent s1517 del self.mdsComponentList 1503 1518 del self.minStressDelta 1504 1519 del self.callbackUpdateCanvas … … 1509 1524 return 0 1510 1525 1526 def mds_components_avg_linkage(self, mdsSteps, mdsRefresh, \ 1527 callbackProgress=None, \ 1528 callbackUpdateCanvas=None, torgerson=0, \ 1529 minStressDelta = 0, scalingRatio=0,\ 1530 mdsFromCurrentPos=0): 1531 return self.mds_components(mdsSteps, mdsRefresh, callbackProgress, \ 1532 callbackUpdateCanvas, torgerson, \ 1533 minStressDelta, True, \ 1534 scalingRatio=scalingRatio, \ 1535 mdsFromCurrentPos=mdsFromCurrentPos) 1536 1537 ########################################################################## 1538 ### BEGIN: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0) ### 1539 ########################################################################## 1540 1541 def setNetwork(self, network): 1542 import warnings 1543 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1544 "set_network", DeprecationWarning) 1545 return self.set_network(network) 1546 1547 def _computeForces(self): 1548 import warnings 1549 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1550 "_compute_forces", DeprecationWarning) 1551 return self._compute_forces() 1552 1553 def getVars(self): 1554 import warnings 1555 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1556 "get_vars", DeprecationWarning) 1557 return self.get_vars() 1558 1559 def getEdgeVars(self): 1560 import warnings 1561 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1562 "get_edge_vars", DeprecationWarning) 1563 return self.get_edge_vars() 1564 1565 def rotateVertices(self, components, phi): 1566 import warnings 1567 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1568 "rotate_vertices", DeprecationWarning) 1569 return self.rotate_vertices(components, phi) 1570 1571 def rotateComponents(self, maxSteps=100, minMoment=0.000000001, 1572 callbackProgress=None, callbackUpdateCanvas=None): 1573 import warnings 1574 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1575 "rotate_components", DeprecationWarning) 1576 return self.rotate_components(maxSteps, minMoment, 1577 callbackProgress, callbackUpdateCanvas) 1578 1579 def mdsUpdateData(self, components, mds, callbackUpdateCanvas): 1580 import warnings 1581 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1582 "mds_update_data", DeprecationWarning) 1583 return self.mds_update_data(components, mds, 1584 callbackUpdateCanvas) 1585 1586 def mdsCallback(self, a, b=None): 1587 import warnings 1588 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1589 "mds_callback", DeprecationWarning) 1590 return self.mds_callback(a, b) 1591 1592 def mdsComponents(self, mdsSteps, mdsRefresh, callbackProgress=None, \ 1593 callbackUpdateCanvas=None, torgerson=0, \ 1594 minStressDelta=0, avgLinkage=False, rotationOnly=False, \ 1595 mdsType=MdsType.componentMDS, scalingRatio=0, \ 1596 mdsFromCurrentPos=0): 1597 import warnings 1598 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1599 "mds_components", DeprecationWarning) 1600 return self.mds_components(mdsSteps, mdsRefresh, \ 1601 callbackProgress, callbackUpdateCanvas, torgerson, \ 1602 minStressDelta, avgLinkage, rotationOnly, \ 1603 mdsType, scalingRatio, mdsFromCurrentPos) 1604 1511 1605 def mdsComponentsAvgLinkage(self, mdsSteps, mdsRefresh, \ 1512 1606 callbackProgress=None, \ … … 1514 1608 minStressDelta = 0, scalingRatio=0,\ 1515 1609 mdsFromCurrentPos=0): 1516 return self.mdsComponents(mdsSteps, mdsRefresh, callbackProgress, \ 1517 callbackUpdateCanvas, torgerson, \ 1518 minStressDelta, True, \ 1519 scalingRatio=scalingRatio, \ 1520 mdsFromCurrentPos=mdsFromCurrentPos) 1521 1610 import warnings 1611 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1612 "mds_components_avg_linkage", DeprecationWarning) 1613 return self.mds_components_avg_linkage(mdsSteps, \ 1614 mdsRefresh, callbackProgress, callbackUpdateCanvas, \ 1615 torgerson, minStressDelta, scalingRatio, mdsFromCurrentPos) 1616 1617 def getData(self, i, j): 1618 import warnings 1619 warnings.warn("Deprecated, will be deleted in Orange 3.0.", 1620 DeprecationWarning) 1621 if self.graph.items is Orange.data.Table: 1622 return self.data[i][j] 1623 elif self.graph.data is type([]): 1624 return self.data[i][j] 1625 1626 def nVertices(self): 1627 import warnings 1628 warnings.warn("Deprecated, will be deleted in Orange 3.0.", 1629 DeprecationWarning) 1630 if self.graph: 1631 return self.graph.nVertices 1632 1522 1633 def saveNetwork(self, fn): 1523 1634 import warnings 1524 warnings.warn("Deprecated . Use Orange.network.Network.save",1525 1635 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1636 "Orange.Network.save", DeprecationWarning) 1526 1637 name = '' 1527 1638 try: … … 1598 1709 def readNetwork(self, fn, directed=0): 1599 1710 import warnings 1600 warnings.warn("Deprecated . Use Orange.network.Network.read",1601 1711 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1712 "Orange.Network.read", DeprecationWarning) 1602 1713 network = Network(1,directed) 1603 1714 net = network.readPajek(fn, directed) … … 1606 1717 return net 1607 1718 1719 ########################################################################## 1720 ### END: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0) ### 1721 ########################################################################## 1722 1608 1723 class NetworkClustering(): 1609 1724 … … 1620 1735 1621 1736 1622 def label Propagation(self, results2items=0, resultHistory2items=0):1737 def label_propagation(self, results2items=0, resultHistory2items=0): 1623 1738 """Label propagation method from Raghavan et al., 2007 1624 1739 … … 1639 1754 stop = 1 1640 1755 for v in vertices: 1641 nbh = self.net.get Neighbours(v)1756 nbh = self.net.get_neighbours(v) 1642 1757 if len(nbh) == 0: 1643 1758 continue … … 1656 1771 if stop: 1657 1772 for v in vertices: 1658 nbh = self.net.get Neighbours(v)1773 nbh = self.net.get_neighbours(v) 1659 1774 if len(nbh) == 0: continue 1660 1775 lbls = [labels[u] for u in nbh] … … 1694 1809 return labels 1695 1810 1696 1811 ########################################################################## 1812 ### BEGIN: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0) ### 1813 ########################################################################## 1814 1815 def labelPropagation(self, results2items=0, resultHistory2items=0): 1816 import warnings 1817 warnings.warn("Deprecated, will be deleted in Orange 3.0. Use %s" % \ 1818 "label_propagation", DeprecationWarning) 1819 return self.label_propagation(results2items=0, resultHistory2items=0) 1820 1821 ########################################################################## 1822 ### END: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0) ### 1823 ##########################################################################
Note: See TracChangeset
for help on using the changeset viewer.