Changeset 11679:3c8959a16655 in orange


Ignore:
Timestamp:
09/02/13 16:39:30 (8 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Preserve learner order in 'TestLearners' widget output.

(fixes #1324)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Evaluate/OWTestLearners.py

    r11562 r11679  
    66<priority>200</priority> 
    77""" 
    8 # 
    9 # OWTestLearners.py 
    10 # 
    11 from OWWidget import * 
    12 import orngTest, orngStat, OWGUI 
     8 
    139import time 
    1410import warnings 
     11import itertools 
     12 
     13from OWWidget import * 
     14 
     15import orngTest, orngStat, OWGUI 
     16 
    1517from orngWrap import PreprocessedLearner 
    1618 
     
    2022 
    2123class Learner: 
     24    counter = itertools.count() 
     25 
    2226    def __init__(self, learner, id): 
    2327        self.learner = learner 
     
    2630        self.scores = [] 
    2731        self.results = None 
    28         self.time = time.time() # used to order the learners in the table 
     32        # Used to order the learners in the table (named time for 
     33        # back compatibility reasons) 
     34        self.time = next(self.counter) 
     35 
    2936 
    3037class Score: 
     
    3542        self.show = show 
    3643        self.cmBased = cmBased 
    37          
     44 
     45 
    3846def dispatch(score_desc, res, cm): 
    3947    """ Dispatch the call to orngStat method. 
     
    537545                self.learners[id] = Learner(learner, id) 
    538546                self.learners[id].time = time 
    539                 self.learners[id] = self.learners[id] 
    540547                self.clearScores([id]) 
    541548            else: 
     
    582589    def sendResults(self): 
    583590        """commit evaluation results""" 
    584         # for each learner, we first find a list where a result is stored 
    585         # and remember the corresponding index 
    586  
    587         valid = [(l.results, l.results.learners.index(l.learner)) 
    588                  for l in self.learners.values() if l.scores and l.results] 
    589              
    590         if not (self.data and len(valid)): 
     591        learners = sorted(self.learners.values(), 
     592                          key=lambda learner: learner.time) 
     593 
     594        learners = [learner for learner in learners 
     595                    if learner.results and learner.scores] 
     596 
     597        if not (self.data and len(learners)): 
    591598            self.send("Evaluation Results", None) 
    592599            return 
    593600 
    594         # find the result set for a largest number of learners 
    595         # and remove this set from the list of result sets 
    596         rlist = dict([(l.results,1) for l in self.learners.values() if l.scores and l.results]).keys() 
    597         rlen = [r.numberOfLearners for r in rlist] 
    598         results = rlist.pop(rlen.index(max(rlen))) 
    599          
    600         for (i, l) in enumerate(results.learners): 
    601             if not l in [l.learner for l in self.learners.values()]: 
    602                 results.remove(i) 
    603                 del results.learners[i] 
    604  
    605         for r in rlist: 
    606             for (i, l) in enumerate(r.learners): 
    607                 learner_id = [l1.id for l1 in self.learners.values() if l1.learner is l][0] 
    608                 if (r, i) in valid: 
    609                     results.add(r, i) 
    610                     results.learners.append(r.learners[i]) 
    611                     self.learners[learner_id].results = results 
     601        # Split combined results by learner/classifier 
     602        results_by_learner = {} 
     603        for learner in learners: 
     604            results = learner.results 
     605            res_split = orngStat.split_by_classifiers(results) 
     606            index = results.learners.index(learner.learner) 
     607            res_single = res_split[index] 
     608            res_single.learners = [learner.learner] 
     609            results_by_learner[learner] = res_single 
     610 
     611        def add_results(rhs, lhs): 
     612            assert(lhs.number_of_learners == 1) 
     613            rhs.add(lhs, 0) 
     614            rhs.learners.extend(lhs.learners) 
     615            return rhs 
     616 
     617        results = [results_by_learner[learner] for learner in learners] 
     618 
     619        results = reduce(add_results, results) 
     620 
     621        self.results = results 
    612622        self.send("Evaluation Results", results) 
    613         self.results = results 
     623        return 
    614624 
    615625    # signal processing 
     
    674684    ow=OWTestLearners() 
    675685    ow.show() 
    676     a.exec_() 
    677  
    678     data1 = orange.ExampleTable(r'../../doc/datasets/voting') 
    679     data2 = orange.ExampleTable(r'../../golf') 
    680     datar = orange.ExampleTable(r'../../auto-mpg') 
    681     data3 = orange.ExampleTable(r'../../sailing-big') 
    682     data4 = orange.ExampleTable(r'../../sailing-test') 
     686 
     687    data1 = orange.ExampleTable('voting') 
     688#     data2 = orange.ExampleTable('golf') 
     689#     datar = orange.ExampleTable('auto-mpg') 
     690#     data3 = orange.ExampleTable('sailing-big') 
     691#     data4 = orange.ExampleTable('sailing-test') 
    683692    data5 = orange.ExampleTable('emotions') 
    684693 
     
    701710    l5 = Orange.multilabel.BinaryRelevanceLearner() 
    702711 
    703     testcase = 4 
     712    testcase = 0 
    704713 
    705714    if testcase == 0: # 1(UPD), 3, 4 
    706         ow.setData(data2) 
     715        ow.setData(data1) 
    707716        ow.setLearner(r5, 5) 
    708717        ow.setLearner(l1, 1) 
    709718        ow.setLearner(l2, 2) 
    710719        ow.setLearner(l3, 3) 
     720        ow.handleNewSignals() 
     721 
    711722        l1.name = l1.name + " UPD" 
    712723        ow.setLearner(l1, 1) 
    713724        ow.setLearner(None, 2) 
    714725        ow.setLearner(l4, 4) 
    715 #        ow.setData(data1) 
    716 #        ow.setData(datar) 
    717 #        ow.setData(data1) 
     726        ow.handleNewSignals() 
     727 
    718728    if testcase == 1: # data, but all learners removed 
    719729        ow.setLearner(l1, 1) 
     
    739749        ow.setLearner(l5, 6) 
    740750 
     751    a.exec_() 
    741752    ow.saveSettings() 
Note: See TracChangeset for help on using the changeset viewer.