def __init__(self,tuneID,params,data,queue):
        multiprocessing.Process.__init__(self)
        self.tuneID=tuneID
        self.model=CascadingModel(**params)
        #if transferLearning:

        self.data=data
        self.queue=queue
        self.params=params
def testBestReRank(k,bestModel=None):
    if bestModel is None:
        model=CascadingModel(tasktype=modeltype,digtype=datatype)
    else:
        model=bestModel
    mymetric=model.mymetric
    mymetric.verbose=0
    taskids=data.taskids[:data.testPoint]
    Y_label=data.testLabel[:data.testPoint]

    print("tuning re-rank weight\n")
    best_param={3:0,5:0,10:0}
    rw=[w/10 for w in range(0,11)]
    rw.reverse()


    model.topK=k
    maxAcc=[0,0]
    model.loadConf()
    model.loadModel()
    Y_predict2=model.predict(data.testX,taskids)

    for w in rw:
            acc=mymetric.topKPDIGUsers(Y_predict2,Y_label,taskids,k,w)
            acc=np.mean(acc)
            if acc>maxAcc[0]:
                maxAcc=[acc,w]
                #print(data.tasktype,"top %d"%k,acc,"weight=%f"%(w/10))
    best_param[k]=maxAcc[1]
    print("\n",data.tasktype,"top %d"%k,maxAcc[0],"weight=%f"%maxAcc[1])
    print()
def testCascadingModel():
    model=CascadingModel(tasktype=modeltype)
    taskids=data.taskids[:data.testPoint]
    Y_label=data.testLabel[:data.testPoint]
    Y_sublabel=data.submitLabelClassification[:data.testPoint]
    Y_reglabel=data.registerLabelClassification[:data.testPoint]
    mymetric=model.mymetric
    mymetric.callall=False

    print()

    print("\n meta-learning model top k acc")
    for k in (3,5,10):
        model.topK=k
        model.loadConf()
        model.loadModel()
        Y_predict2=model.predict(data.testX,taskids)
        #metrics
        acc=mymetric.topKPossibleUsers(Y_predict2,Y_label,k)
        acc=np.mean(acc)
        print(data.tasktype,"top %d"%k,acc)

        acc=mymetric.topKRUsers(Y_predict2,Y_label,Y_reglabel,k,)
        acc=np.mean(acc)
        print(data.tasktype,"top %d"%k,acc)

        acc=mymetric.topKSUsers(Y_predict2,Y_label,Y_sublabel,k,)
        acc=np.mean(acc)
        print(data.tasktype,"top %d"%k,acc)

        print()
class TuneTask(multiprocessing.Process):
    maxProcessNum=32
    def __init__(self,tuneID,params,data,queue):
        multiprocessing.Process.__init__(self)
        self.tuneID=tuneID
        self.model=CascadingModel(**params)
        #if transferLearning:

        self.data=data
        self.queue=queue
        self.params=params

    def run(self):

        bestScore=0
        topDig=[w/10 for w in range(10,11)]
        topDig.reverse()
        tD=0
        #print("begin,%d"%self.tuneID)
        mymetric=self.model.mymetric
        taskids=self.data.taskids[self.data.validatePoint:]
        X=self.data.trainX
        Y_label=self.data.trainLabel
        for self.model.topDig in topDig:
            #print("predicting")
            Y=self.model.predict(X,taskids)
            Y=mymetric.topKPossibleUsers(Y,Y_label,self.model.topK)
            acc=np.mean(Y)
            #acc=self.model.score(self.data)
            #print(acc,"topDig=%f"%self.model.topDig)
            if acc>bestScore:
                tD=self.model.topDig
                bestScore=acc

        self.model.topDig=tD
        self.params["topDig"]=self.model.topDig

        #print("finished")
        #self.cond.acquire()
        self.queue.put([self.tuneID,self.model,bestScore,self.params])