source: orange/Orange/OrangeWidgets/Unsupervised/OWNxSNAP.py @ 9671:a7b056375472

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

Moved orange to Orange (part 2)

Line 
1"""
2<name>SNAP</name>
3<description>Read networks from Stanford Large Network Dataset Collection.</description>
4<icon>icons/SNAP.png</icon>
5<contact>Miha Stajdohar (miha.stajdohar(@at@)gmail.com)</contact> 
6<priority>6415</priority>
7"""
8
9import sys
10import string
11import os.path
12import user
13
14import PyQt4.QtNetwork
15
16import Orange.data
17import Orange.network
18import OWGUI
19
20from OWWidget import *
21import itertools
22           
23class OWNxSNAP(OWWidget):
24   
25    settingsList=['last_total']
26   
27    def __init__(self,parent=None, signalManager = None):
28        OWWidget.__init__(self, parent, signalManager, "SNAP")
29
30        self.inputs = []
31        self.outputs = [("Network", Orange.network.Graph), ("Items", Orange.data.Table)]
32       
33        self.last_total = 24763
34       
35        self.loadSettings()
36       
37        self.networks = []
38        self.tables = []
39       
40        image = QPixmap(os.path.dirname(__file__) + "/icons/snap_logo.png")
41
42        imageLabel = QLabel(self)
43        imageLabel.setPixmap(image)
44        self.controlArea.layout().addWidget(imageLabel)
45       
46        self.controlArea.layout().addStretch(1)
47       
48        lbl = QLabel("<a href='http://snap.stanford.edu/data/'>http://snap.stanford.edu/data</a>", self)
49        lbl.setOpenExternalLinks(True)
50        self.controlArea.layout().addWidget(lbl)
51       
52        scrollArea = QScrollArea(self.mainArea)
53        self.mainArea.layout().addWidget(scrollArea)
54       
55        self.network_list = OWGUI.widgetBox(self.mainArea, addToLayout=False)
56        self.network_list.layout().setSizeConstraint(QLayout.SetFixedSize); 
57        scrollArea.setWidget(self.network_list);     
58       
59        self.snap = Orange.network.snap.SNAP()
60        self.snap.get_network_list(self.add_tables, self.progress_callback)
61        self.progressBarInit()
62        self.setMinimumSize(960, 600)
63   
64    def add_tables(self, networks):
65        self.networks = networks
66        self.tables = []
67       
68        if networks is None:
69            return
70       
71        networks.sort(key=lambda net: net.repository)
72        for k,g in itertools.groupby(networks, key=lambda net: net.repository):
73            network_group = list(g)
74       
75            if len(network_group) > 0:
76                self.network_list.layout().addWidget(QLabel("<h3>" + network_group[0].repository + "</h3>"))
77                table = OWGUI.table(self.network_list, rows=len(network_group), columns=5, selectionMode = -1, addToLayout = 1)
78                table.setHorizontalHeaderLabels(['Name', 'Type', 'Nodes', 'Edges', 'Description'])
79                f = table.font()
80                f.setPointSize(9)
81                table.setFont(f)
82                table.verticalHeader().hide()
83                table.setSelectionMode(QAbstractItemView.SingleSelection)
84                table.setSelectionBehavior(QAbstractItemView.SelectRows)
85                self.connect(table, SIGNAL('itemSelectionChanged()'), lambda table=table: self.select_network(table))
86           
87                for i, net in enumerate(network_group):
88                    lbl = QLabel("<a href='"+ net.link +"'>" + net.name + "</a>")
89                    lbl.setOpenExternalLinks(True)
90                    table.setCellWidget(i, 0, lbl)
91                    OWGUI.tableItem(table, i, 1, net.type)
92                    OWGUI.tableItem(table, i, 2, net.nodes)
93                    OWGUI.tableItem(table, i, 3, net.edges)
94                    OWGUI.tableItem(table, i, 4, net.description)
95 
96                table.setFixedSize(712, 100)
97                table.setColumnWidth(0, 120)
98                table.setColumnWidth(1, 80)
99                table.setColumnWidth(2, 80)
100                table.setColumnWidth(3, 80)
101                table.setColumnWidth(4, 350)
102                table.resizeRowsToContents()                   
103                table.setFixedSize(712, sum(table.rowHeight(i) for i in range(len(networks))) + 27)
104                self.tables.append(table)
105               
106                OWGUI.separator(self.network_list, 10, 10)
107       
108    def download_progress(self, numblocks, blocksize, filesize):
109        try:
110            percent = min((numblocks*blocksize*100)/filesize, 100)
111            self.progressBarSet(percent)
112        except:
113            percent = 100
114            if numblocks != 0:
115                print str(percent)+'%'
116       
117    def select_network(self, selected_table):
118        for table in self.tables:
119            selected = table.selectedIndexes()
120            if len(selected) > 0:
121                row = selected[0].row()
122                fn = selected_table.cellWidget(row, 0).text()
123                network_info = self.snap.get_network(fn[fn.indexOf('>')+1:-4])
124                self.progressBarInit()
125                network = network_info.read(progress_callback=self.download_progress)
126                self.progressBarFinished()
127                self.send('Network', network)
128           
129            if table is not selected_table:
130                table.clearSelection()
131       
132   
133    def progress_callback(self, done, total):
134        if done == total:
135            self.progressBarFinished()
136            return
137       
138        if total > 0:
139            self.progressBarSet(int(done/total * 100))
140        else:
141            self.progressBarSet(int(done * 100 / self.last_total))
142       
143if __name__ == "__main__":
144    a=QApplication(sys.argv)
145    owf=OWNxSNAP()
146    owf.activateLoadedSettings()
147    owf.show() 
148    a.exec_()
149    owf.saveSettings()
Note: See TracBrowser for help on using the repository browser.