Changeset 10816:b910930f5d75 in orange


Ignore:
Timestamp:
04/19/12 15:26:50 (2 years ago)
Author:
mstajdohar
Branch:
default
rebase_source:
bee24e944611e8ca8de1d7812bdf3d9116cd54c6
Message:

Read new Model Map format.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Unsupervised/OWModelFile.py

    r10466 r10816  
    11""" 
    22<name>Model File</name> 
    3 <description>Load prediction models</description> 
     3<description>Load a Model Map</description> 
    44<contact>Miha Stajdohar (miha.stajdohar(@at@)gmail.com)</contact> 
    55<icon>icons/DistanceFile.png</icon> 
     
    88 
    99from OWWidget import * 
    10 from OWDistanceFile import * 
    1110 
    1211import OWGUI 
    13 import orange 
     12import Orange 
     13import orngMisc 
    1414import exceptions 
    1515import os.path 
    16 import pickle 
     16import cPickle as pickle 
     17import bz2 
    1718 
    18 class OWModelFile(OWDistanceFile): 
    19     settingsList = ["recentFiles", "origRecentFiles", "invertDistances", "normalizeMethod", "invertMethod"] 
     19class OWModelFile(OWWidget): 
     20    settingsList = ["files", "file_index"] 
    2021 
    21     def __init__(self, parent=None, signalManager = None): 
    22         OWDistanceFile.__init__(self, parent, signalManager, name='Model File', inputItems=0) 
    23         #self.inputs = [("Examples", ExampleTable, self.getExamples, Default)] 
    24          
    25          
    26          
    27         self.outputs = [("Distances", orange.SymMatrix)] 
    28          
    29         self.dataFileBox.setTitle(" Model File ") 
    30         self.origRecentFiles=[] 
    31         self.origFileIndex = 0 
    32         self.originalData = None 
    33          
     22    def __init__(self, parent=None, signalManager=None): 
     23        OWWidget.__init__(self, parent, signalManager, name='Model File', wantMainArea=0, resizingEnabled=1) 
     24 
     25        self.outputs = [("Distances", Orange.misc.SymMatrix), 
     26                        ("Model Meta-data", Orange.data.Table), 
     27                        ("Original Data", Orange.data.Table)] 
     28 
     29        #self.dataFileBox.setTitle("Model File") 
     30        self.files = [] 
     31        self.file_index = 0 
     32 
     33        self.matrix = None 
     34        self.model_data = None 
     35        self.original_data = None 
     36 
    3437        self.loadSettings() 
    35          
    36         box = OWGUI.widgetBox(self.controlArea, "Original Data File", addSpace=True) 
    37         hbox = OWGUI.widgetBox(box, orientation = 0) 
    38         self.origFilecombo = OWGUI.comboBox(hbox, self, "origFileIndex", callback = self.loadOrigDataFile) 
    39         self.origFilecombo.setMinimumWidth(250) 
    40         button = OWGUI.button(hbox, self, '...', callback = self.browseOrigFile) 
     38 
     39        self.fileBox = OWGUI.widgetBox(self.controlArea, "Model File", addSpace=True) 
     40        hbox = OWGUI.widgetBox(self.fileBox, orientation=0) 
     41        self.filecombo = OWGUI.comboBox(hbox, self, "file_index", callback=self.loadFile) 
     42        self.filecombo.setMinimumWidth(250) 
     43        button = OWGUI.button(hbox, self, '...', callback=self.browseFile) 
    4144        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon)) 
    4245        button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) 
    43         self.loadOrigDataFile() 
    44          
    45     def browseOrigFile(self): 
    46         if self.origRecentFiles: 
    47             lastPath = os.path.split(self.origRecentFiles[0])[0] 
     46 
     47 
     48#        Moved to SymMatrixTransform widget 
     49# 
     50#        ribg = OWGUI.radioButtonsInBox(self.controlArea, self, "normalizeMethod", [], "Normalize method", callback = self.setNormalizeMode) 
     51#        OWGUI.appendRadioButton(ribg, self, "normalizeMethod", "None", callback = self.setNormalizeMode) 
     52#        OWGUI.appendRadioButton(ribg, self, "normalizeMethod", "To interval [0,1]", callback = self.setNormalizeMode) 
     53#        OWGUI.appendRadioButton(ribg, self, "normalizeMethod", "Sigmoid function: 1 / (1 + e^x)", callback = self.setNormalizeMode) 
     54#         
     55#        ribg = OWGUI.radioButtonsInBox(self.controlArea, self, "invertMethod", [], "Invert method", callback = self.setInvertMode) 
     56#        OWGUI.appendRadioButton(ribg, self, "invertMethod", "None", callback = self.setInvertMode) 
     57#        OWGUI.appendRadioButton(ribg, self, "invertMethod", "-X", callback = self.setInvertMode) 
     58#        OWGUI.appendRadioButton(ribg, self, "invertMethod", "1 - X", callback = self.setInvertMode) 
     59#        OWGUI.appendRadioButton(ribg, self, "invertMethod", "Max - X", callback = self.setInvertMode) 
     60#        OWGUI.appendRadioButton(ribg, self, "invertMethod", "1 / X", callback = self.setInvertMode) 
     61 
     62        OWGUI.rubber(self.controlArea) 
     63 
     64        self.adjustSize() 
     65 
     66        for i in range(len(self.files) - 1, -1, -1): 
     67            if not (os.path.exists(self.files[i]) and os.path.isfile(self.files[i])): 
     68                del self.files[i] 
     69 
     70        if self.files: 
     71            self.loadFile() 
     72 
     73    def browseFile(self): 
     74        if self.files: 
     75            lastPath = os.path.split(self.files[0])[0] 
    4876        else: 
    4977            lastPath = "." 
    50         fn = unicode(QFileDialog.getOpenFileName(self, "Open Original Data File",  
    51                                              lastPath, "Data File (*.tab)")) 
     78        fn = unicode(QFileDialog.getOpenFileName(self, "Open Model Map File", 
     79                                             lastPath, "Model Map (*.bz2)")) 
    5280        fn = os.path.abspath(fn) 
    53         if fn in self.origRecentFiles: # if already in list, remove it 
    54             self.origRecentFiles.remove(fn) 
    55         self.origRecentFiles.insert(0, fn) 
    56         self.origFileIndex = 0 
    57         self.loadOrigDataFile() 
    58          
    59     def loadOrigDataFile(self): 
    60         if self.origFileIndex: 
    61             fnOrigData = self.origRecentFiles[self.origFileIndex] 
    62             self.origRecentFiles.remove(fnOrigData) 
    63             self.origRecentFiles.insert(0, fnOrigData) 
    64             self.origFileIndex = 0 
     81        if fn in self.files: # if already in list, remove it 
     82            self.files.remove(fn) 
     83        self.files.insert(0, fn) 
     84        self.file_index = 0 
     85        self.loadFile() 
     86 
     87    def loadFile(self): 
     88        if self.file_index: 
     89            fn = self.files[self.file_index] 
     90            self.files.remove(fn) 
     91            self.files.insert(0, fn) 
     92            self.file_index = 0 
    6593        else: 
    66             if len(self.origRecentFiles) > 0: 
    67                 fnOrigData = self.origRecentFiles[0] 
    68             else: 
    69                 fnOrigData = '' 
    70  
    71         self.origFilecombo.clear() 
    72         for file in self.origRecentFiles: 
    73             self.origFilecombo.addItem(os.path.split(file)[1]) 
    74          
    75         if os.path.isfile(fnOrigData): 
    76             self.originalData = orange.ExampleTable(fnOrigData) 
    77          
    78         if self.matrix == None: 
    79             self.loadFile() 
    80         else: 
    81             self.matrix.originalData = self.originalData 
    82             self.send("Distances", self.matrix) 
    83          
    84     def loadFile(self): 
    85         if not hasattr(self, "originalData"): 
    86             return 
    87          
    88         if self.fileIndex: 
    89             fn = self.recentFiles[self.fileIndex] 
    90             self.recentFiles.remove(fn) 
    91             self.recentFiles.insert(0, fn) 
    92             self.fileIndex = 0 
    93         else: 
    94             if len(self.recentFiles) > 0: 
    95                 fn = self.recentFiles[0] 
    96             else: 
    97                 return 
     94            fn = self.files[0] 
    9895 
    9996        self.filecombo.clear() 
    100         for file in self.recentFiles: 
     97        for file in self.files: 
    10198            self.filecombo.addItem(os.path.split(file)[1]) 
    10299        #self.filecombo.updateGeometry() 
    103100 
     101        self.matrix = None 
     102        self.model_data = None 
     103        self.original_data = None 
     104        pb = OWGUI.ProgressBar(self, 100) 
     105 
    104106        self.error() 
    105          
    106107        try: 
    107             self.matrix = None 
    108             self.labels = None 
    109             self.data = None 
    110             pb = OWGUI.ProgressBar(self, 100) 
    111             self.matrix, self.labels, self.data = readMatrix(fn, pb) 
    112              
    113             dstFile, ext = os.path.splitext(fn) 
    114             warning = "" 
    115             self.warning() 
    116             if os.path.exists(dstFile + ".tab"): 
    117                 self.data = orange.ExampleTable(dstFile + ".tab") 
    118                 self.matrix.items = self.data 
     108            matrix, self.model_data, self.original_data = pickle.load(bz2.BZ2File('%s' % fn, "r")) 
     109 
     110            self.matrix = Orange.misc.SymMatrix(len(matrix)) 
     111            milestones = orngMisc.progressBarMilestones(self.matrix.dim, 100) 
     112            for i in range(self.matrix.dim): 
     113                for j in range(i + 1): 
     114                    self.matrix[j, i] = matrix[i, j] 
     115 
     116                if i in milestones: 
     117                    pb.advance() 
     118            pb.finish() 
     119 
     120        except Exception, ex: 
     121            self.error("Error while reading the file: '%s'" % str(ex)) 
     122            return 
     123        self.relabel() 
     124 
     125    def relabel(self): 
     126        self.error() 
     127        if self.matrix is not None: 
     128            if self.model_data is not None and self.matrix.dim == len(self.model_data): 
     129                self.matrix.setattr("items", self.model_data) 
    119130            else: 
    120                 warning += "ExampleTable %s not found!\n" % (dstFile + ".tab") 
    121             if os.path.exists(dstFile + ".res"): 
    122                 self.matrix.results = pickle.load(open(dstFile + ".res", 'rb')) 
    123             else: 
    124                 warning += "Results pickle %s not found!\n" % (dstFile + ".res") 
    125              
    126             self.matrix.originalData = self.originalData 
    127              
    128             if warning != "": 
    129                 self.warning(warning.rstrip()) 
    130      
    131             self.relabel() 
    132         except Exception as e: 
    133             self.error("Error while reading the file\n\n%s" % e.message) 
    134          
    135 if __name__=="__main__": 
     131                self.error("The number of model doesn't match the matrix dimension. Invalid Model Map file.") 
     132 
     133            if self.original_data is not None: 
     134                self.matrix.setattr("original_data", self.original_data) 
     135 
     136            self.send("Distances", self.matrix) 
     137 
     138        if self.model_data is not None: 
     139            self.send("Model Meta-data", self.model_data) 
     140 
     141        if self.original_data is not None: 
     142            self.send("Original Data", self.original_data) 
     143 
     144if __name__ == "__main__": 
    136145    a = QApplication(sys.argv) 
    137146    ow = OWModelFile() 
Note: See TracChangeset for help on using the changeset viewer.