Changeset 7729:35ce4e062df4 in orange


Ignore:
Timestamp:
03/09/11 11:12:51 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
75591ef8541824beb37c041de8b5cf472402dbef
Message:

Fixed a bug with context settings (would save a pickled instance of orange.Variable, and then crash when loading because the pickle interface changed). This fix sets a new context version so all old settings will be discarded.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Data/OWMergeData.py

    r6701 r7729  
    1212class OWMergeData(OWWidget): 
    1313 
    14 #    settingsList = ["varA", "varB"] 
    15  
    16     contextHandlers = {"A": DomainContextHandler("A", [ContextField("varA")], syncWithGlobal=False), 
    17                        "B": DomainContextHandler("B", [ContextField("varB")], syncWithGlobal=False)}                                             
     14    contextHandlers = {"A": DomainContextHandler("A", [ContextField("varA")], syncWithGlobal=False, contextDataVersion=2), 
     15                       "B": DomainContextHandler("B", [ContextField("varB")], syncWithGlobal=False, contextDataVersion=2)}                                             
    1816 
    1917    def __init__(self, parent = None, signalManager = None, name = "Merge data"): 
     
    7674    ## Data input and output management 
    7775    ############################################################################################################################################################ 
    78  
     76         
    7977    def inVarList(self, varList, var): 
     78        varList = [(v.name, v.varType) for v in varList] 
    8079        if var in varList: 
    8180            return True, varList.index(var) 
    82         elif var and var.varType == orange.Variable.String and var.name in [v.name for v in varList]: 
    83             return True, [v.name for v in varList].index(var.name) 
    84         elif var and (var.name, var.varType) in [(v.name, v.varType) for v in varList]: 
    85             return True, [(v.name, v.varType) for v in varList].index((var.name, var.varType)) 
    8681        else: 
    8782            return False, -1 
    88          
    8983         
    9084    def onDataAInput(self, data): 
    9185        self.closeContext("A") 
    92         # set self.dataA, generate new domain if it is the same as of self.dataB.domain 
    93 #        if data and self.dataB and data.domain == self.dataB.domain: 
    94 #            if data.domain.classVar: 
    95 #                classVar = data.domain.classVar.clone() 
    96 #            else: 
    97 #                classVar = None 
    98 #            dc = orange.Domain([x.clone() for x in data.domain], classVar) 
    99 #            for i, a in enumerate(dc): 
    100 #                a.getValueFrom = lambda ex,f,i=i: ex[i] 
    101 ##             no need to clone meta attributes: dc.addmetas(dict([(orange.newmetaid(), x.clone()) for x in data.domain.getmetas().values()])); for i,id,a in enumerate(dc.getmetas().items()): ... 
    102 #            dc.addmetas(data.domain.getmetas()) 
    103 #            self.dataA = orange.ExampleTable(dc, data) 
    104 #            self.dataA = data 
    105 #        else: 
    106 #            self.dataA = data 
    10786        self.dataA = data 
    10887        # update self.varListA and self.varA 
     
    11190        else: 
    11291            self.varListA = [] 
    113 #        if not self.varA in self.varListA: 
    114 #            self.varA = None 
     92             
    11593        # update info 
    11694        self.updateInfoA() 
     
    123101        match, index = self.inVarList(self.varListA, self.varA) 
    124102        if match: 
    125             self.varA = self.varListA[index] 
     103            var = self.varListA[index] 
     104            self.varA = (var.name, var.varType) 
    126105            self.lbAttrA.setCurrentItem(self.lbAttrA.item(index)) 
    127     #        elif self.dataA: 
    128     #            self.varA = None 
     106             
    129107        self.sendData() 
    130108 
    131109    def onDataBInput(self, data): 
    132         # set self.dataB, generate new domain if it is the same as of self.dataA.domain 
    133110        self.closeContext("B") 
    134 #        if data and self.dataA and data.domain == self.dataA.domain: 
    135 #            if data.domain.classVar: 
    136 #                classVar = data.domain.classVar.clone() 
    137 #            else: 
    138 #                classVar = None 
    139 #            dc = orange.Domain([x.clone() for x in data.domain.attributes], classVar) 
    140 #            for i, a in enumerate(dc): 
    141 #                a.getValueFrom = lambda ex,f,i=i: ex[i] 
    142 #            # no need to clone meta attributes: dc.addmetas(dict([(orange.newmetaid(), x.clone()) for x in data.domain.getmetas().values()])); for i,id,a in enumerate(dc.getmetas().items()): ... 
    143 #            dc.addmetas(data.domain.getmetas()) 
    144 #            self.dataB = orange.ExampleTable(dc, data) 
    145 #            self.dataB = data 
    146 #        else: 
    147 #            self.dataB = data 
    148111        self.dataB = data 
    149112        # update self.varListB and self.varB 
     
    152115        else: 
    153116            self.varListB = [] 
    154 #        if not self.varB in self.varListB: 
    155 #            self.varB = None 
     117         
    156118        # update info 
    157119        self.updateInfoB() 
     
    165127        match, index = self.inVarList(self.varListB, self.varB) 
    166128        if match: 
    167             self.varB = self.varListB[index] 
     129            var = self.varListB[index] 
     130            self.varB = (var.name, var.varType) 
    168131            self.lbAttrB.setCurrentItem(self.lbAttrB.item(index)) 
    169 #        elif self.dataB: 
    170 #            self.varB = None 
    171132             
    172133        self.sendData() 
     
    194155            self.lblDataBAttributes.setText("") 
    195156 
    196  
    197 #    def sendData(self): 
    198 #        """Sends out data. 
    199 #        """ 
    200 #        if self.varA and self.varB and self.dataA and self.dataB: 
    201 #            # create dictionaries: attribute values -> example index 
    202 #            val2idxDictA = {} 
    203 #            for eIdx, e in enumerate(self.dataA): 
    204 #                val2idxDictA[e[self.varA].native()] = eIdx 
    205 #            val2idxDictB = {} 
    206 #            for eIdx, e in enumerate(self.dataB): 
    207 #                val2idxDictB[e[self.varB].native()] = eIdx 
    208 #            # remove DC and DK from dictionaries (change when bug 62 is fixed) 
    209 ###            if val2idxDictA.has_key(orange.Value(self.varA.varType, orange.ValueTypes.DC).native()): 
    210 ###                val2idxDictA.pop(orange.Value(self.varA.varType, orange.ValueTypes.DC).native()) 
    211 ###            if val2idxDictA.has_key(orange.Value(self.varA.varType, orange.ValueTypes.DK).native()): 
    212 ###                val2idxDictA.pop(orange.Value(self.varA.varType, orange.ValueTypes.DK).native()) 
    213 ###            if val2idxDictB.has_key(orange.Value(self.varB.varType, orange.ValueTypes.DC).native()): 
    214 ###                val2idxDictB.pop(orange.Value(self.varB.varType, orange.ValueTypes.DC).native()) 
    215 ###            if val2idxDictB.has_key(orange.Value(self.varB.varType, orange.ValueTypes.DK).native()): 
    216 ###                val2idxDictB.pop(orange.Value(self.varB.varType, orange.ValueTypes.DK).native()) 
    217 #            if val2idxDictA.has_key("?"): 
    218 #                val2idxDictA.pop("?") 
    219 #            if val2idxDictA.has_key("~"): 
    220 #                val2idxDictA.pop("~") 
    221 #            if val2idxDictA.has_key(""): 
    222 #                val2idxDictA.pop("") 
    223 #            if val2idxDictB.has_key("?"): 
    224 #                val2idxDictB.pop("?") 
    225 #            if val2idxDictB.has_key("~"): 
    226 #                val2idxDictB.pop("~") 
    227 #            if val2idxDictB.has_key(""): 
    228 #                val2idxDictB.pop("") 
    229 #            # example table names 
    230 #            nameA = self.dataA.name 
    231 #            if not nameA: nameA = "Examples A" 
    232 #            nameB = self.dataB.name 
    233 #            if not nameB: nameB = "Examples B" 
    234 #            # create example B with all values unknown 
    235 #            exBDK = orange.Example(self.dataB[0]) 
    236 #            for var in self.varListB: 
    237 ###                exBDK[var] = orange.Value(var.varType, orange.ValueTypes.DK) 
    238 #                exBDK[var] = "?" 
    239 #            # build example table to append to the right of A 
    240 #            vlBreduced = list(self.varListB) 
    241 #            vlBreduced.remove(self.varB) 
    242 #            domBreduced = orange.Domain(vlBreduced, None) 
    243 #            etBreduced = orange.ExampleTable(domBreduced) 
    244 #            for e in self.dataA: 
    245 #                dataBidx = val2idxDictB.get(e[self.varA].native(), None) 
    246 #                if dataBidx <> None: 
    247 #                    etBreduced.append(self.dataB[dataBidx]) 
    248 #                else: 
    249 #                    etBreduced.append(orange.Example(domBreduced, exBDK)) 
    250 #            etAB = orange.ExampleTable([self.dataA, etBreduced]) 
    251 #            etAB.name = "%(nameA)s (merged with %(nameB)s)" % vars() 
    252 #            self.send("Merged Examples A+B", etAB) 
    253 # 
    254 #            # create example A with all values unknown 
    255 #            exADK = orange.Example(self.dataA[0]) 
    256 #            for var in self.varListA: 
    257 ###                exADK[var] = orange.Value(var.varType, orange.ValueTypes.DK) 
    258 #                exADK[var] = "?" 
    259 #            # build example table to append to the right of B 
    260 #            vlAreduced = list(self.varListA) 
    261 #            vlAreduced.remove(self.varA) 
    262 #            domAreduced = orange.Domain(vlAreduced, None) 
    263 #            etAreduced = orange.ExampleTable(domAreduced) 
    264 #            for e in self.dataB: 
    265 #                dataAidx = val2idxDictA.get(e[self.varB].native(), None) 
    266 #                if dataAidx <> None: 
    267 #                    etAreduced.append(self.dataA[dataAidx]) 
    268 #                else: 
    269 #                    etAreduced.append(orange.Example(domAreduced, exADK)) 
    270 #            etBA = orange.ExampleTable([self.dataB, etAreduced]) 
    271 #            etBA.name = nameB + " (merged with %s)" % nameA 
    272 #            self.send("Merged Examples B+A", etBA) 
    273 #        else: 
    274 #            self.send("Merged Examples A+B", None) 
    275 #            self.send("Merged Examples B+A", None) 
    276  
    277157    def sendData(self): 
    278158        if self.dataA and self.dataB and self.varA and self.varB: 
    279             self.send("Merged Examples A+B", self.merge(self.dataA, self.dataB, self.varA, self.varB)) 
    280             self.send("Merged Examples B+A", self.merge(self.dataB, self.dataA, self.varB, self.varA)) 
     159            self.send("Merged Examples A+B", self.merge(self.dataA, self.dataB, self.varA[0], self.varB[0])) 
     160            self.send("Merged Examples B+A", self.merge(self.dataB, self.dataA, self.varB[0], self.varA[0])) 
    281161        else: 
    282162            self.send("Merged Examples A+B", None) 
     
    291171            if self.lbAttrA.selectedItems() != []: 
    292172                ind = self.lbAttrA.row(self.lbAttrA.selectedItems()[0]) 
    293                 self.varA = self.varListA[ind] 
     173                var = self.varListA[ind] 
     174                self.varA = (var.name, var.varType) 
    294175            else: 
    295176                self.varA = None 
     
    303184            if self.lbAttrB.selectedItems() != []: 
    304185                ind = self.lbAttrB.row(self.lbAttrB.selectedItems()[0]) 
    305                 self.varB = self.varListB[ind] 
     186                var = self.varListB[ind] 
     187                self.varB = (var.name, var.varType) 
    306188            else: 
    307189                self.varB = None 
     
    316198 
    317199    def _sp(self, l, capitalize=True): 
    318         """Input: list; returns tupple (str(len(l)), "s"/"") 
     200        """Input: list; returns tuple (str(len(l)), "s"/"") 
    319201        """ 
    320202        n = len(l) 
     
    361243                 
    362244        return orange.ExampleTable([dataA, mergingB]) 
    363  
    364      
    365 #    def setVarA(self, var): 
    366 #        if var in self.varListA: 
    367 #            ind = self.varListA.index(var) 
    368 #            self.lbAttrA.setCurrentItem(self.lbAttrA.item(ind)) 
    369 #         
    370 #    def varA(self): 
    371 #        selectedItems = self.lbAttrB.selectedItems() 
    372 #        if selectedItems: 
    373 #            ind = self.lbAttrB.row(selectedItems[0]) 
    374 #            return self.varListA[ind] 
    375 #        else: 
    376 #            return None 
    377 #    varA = property(varA, setVarA) 
    378 #     
    379 #    def setVarB(self, var): 
    380 #        if var in self.varListB: 
    381 #            ind = self.varListB.index(var) 
    382 #            self.lbAttrB.setCurrentItem(self.lbAttrB.item(ind)) 
    383 #             
    384 #    def varB(self): 
    385 #        selectedItems = self.lbAttrB.selectedItems() 
    386 #        if selectedItems: 
    387 #            ind = self.lbAttrB.row(selectedItems[0]) 
    388 #            return self.varListB[ind] 
    389 #        else: 
    390 #            return None 
    391 #     
    392 #    varB = property(varB, setVarB) 
    393245     
    394246if __name__=="__main__": 
Note: See TracChangeset for help on using the changeset viewer.