def compute(self):
        feats = torch.cat(self.feats, dim=0)
        if self.feat_norm == 'yes':
            #print("The test feature is normalized")
            feats = torch.nn.functional.normalize(feats, dim=1, p=2)
        # query
        qf = feats[:self.num_query]
        q_pids = np.asarray(self.pids[:self.num_query])
        q_camids = np.asarray(self.camids[:self.num_query])
        # gallery
        gf = feats[self.num_query:]
        g_pids = np.asarray(self.pids[self.num_query:])
        g_camids = np.asarray(self.camids[self.num_query:])

        distmat = euclidean_dist(qf, gf).cpu().numpy()

        if self.validation_flag:
            cmc, mAP = eval_func(distmat, q_pids, g_pids, q_camids, g_camids)
        else:
            cmc, mAP = np.zeros((self.max_rank,)), 0.0

        if self.output_flag:
            indices = np.argsort(distmat, axis=1)
            np.savetxt("result.txt", indices[:, :100], fmt="%05d")

        return cmc, mAP
    def compute(self):
        feats = torch.cat(self.feats, dim=0)
        camfeats = torch.cat(self.camfeats, dim=0)
        if self.feat_norm == 'yes':
            #print("The test feature is normalized")
            feats = torch.nn.functional.normalize(feats, dim=1, p=2)
            camfeats = torch.nn.functional.normalize(camfeats, dim=1, p=2)
        feats = feats.cpu().numpy().astype(np.float16)

        # merge by trkid
        self.pids = np.asarray(self.pids)
        trkids = list(set(self.trkids))
        merged_feats = np.zeros((len(trkids),feats.shape[1]))
        merged_labels = np.zeros(len(trkids)) - 1
        for i in range(len(trkids)):
            tmpidxs = np.where(self.trkids==trkids[i])
            tmpfeats = feats[tmpidxs]
            merged_feats[i] = np.mean(tmpfeats,axis=0)
            merged_labels[i] = self.pids[tmpidxs][0]
        feats = torch.from_numpy(merged_feats).cuda()

        distmat = re_ranking(feats, feats, 20, 6, 0.3)
        if self.finetune:
            camdistmat = euclidean_dist(camfeats, camfeats).cpu().numpy()
            distmat -= camdistmat * 0.1
        pos_bool = (distmat < 0)
        distmat[pos_bool] = 0

        eps = self.dist_thrd
        cluster = DBSCAN(eps=eps,min_samples=4, metric='precomputed', n_jobs=2)
        ret = cluster.fit_predict(distmat.astype(np.double))

        # most count
        labelset = Counter(ret[ret>=0])
        labelset = labelset.most_common()
        labelset = [i[0] for i in labelset]

        labelset = labelset[:self.topk]
        idxs = np.where(np.in1d(ret,labelset))[0]
        psolabels = ret[idxs]
        pids = merged_labels[idxs]
        acc = sklearn.metrics.cluster.normalized_mutual_info_score(psolabels,pids)

        # back to train images
        outret = np.zeros(len(self.trkids)) - 1
        for i in range(len(trkids)):
            if ret[i] >= 0:
                outret[self.trkids==trkids[i]] = ret[i]

        # relabel
        outret_set = set(outret)
        outret_set_len = len(labelset) - 1
        outliers = 0
        pid2label = {}
        for pid in outret_set:
            if pid in labelset:
                pid2label[pid] = labelset.index(pid)
            elif self.finetune and outliers <= 200:
                pid2label[pid] = outret_set_len + outliers
                outliers += 1
            else:
                pid2label[pid] = -1
        outret = np.asarray([pid2label[i] for i in outret])

        return outret,acc,len(outret[outret!=-1])
    def compute(self):
        feats = torch.cat(self.feats, dim=0)
        camera_feats = torch.cat(self.camera_feats, dim=0)
        if self.feat_norm == 'yes':
            #print("The test feature is normalized")
            feats = torch.nn.functional.normalize(feats, dim=1, p=2)
            camera_feats = torch.nn.functional.normalize(camera_feats, dim=1, p=2)
        # query
        qf = feats[:self.num_query]
        q_campred = np.asarray(self.camera_scores[:self.num_query], np.int)
        qcf = camera_feats[:self.num_query]
        q_pids = np.asarray(self.pids[:self.num_query])
        q_camids = np.asarray(self.camids[:self.num_query])
        # gallery
        gf = feats[self.num_query:]
        g_campred = np.asarray(self.camera_scores[self.num_query:], np.int)
        gcf = camera_feats[self.num_query:]
        g_pids = np.asarray(self.pids[self.num_query:])
        g_camids = np.asarray(self.camids[self.num_query:])

        qf = qf.cpu().numpy().astype(np.float16)
        gf = gf.cpu().numpy().astype(np.float16)
        P, neg_vec = compute_P2(qf, gf, g_campred, 0.02)
        qf = meanfeat_sub(P, neg_vec, qf, q_campred)
        gf = meanfeat_sub(P, neg_vec, gf, g_campred)
        gf_new = gf.copy()
        for _ in range(3):
            gf_new = mergesetfeat(gf_new, g_campred, gf, g_campred, 0.03, 50)
        qf_new = qf.copy()
        for _ in range(3):
            qf_new = mergesetfeat(qf_new, q_campred, gf_new, g_campred, 0.03, 50)
        qf = torch.from_numpy(qf_new).cuda()
        gf = torch.from_numpy(gf_new).cuda()

        distmat = re_ranking(qf, gf, k1=30, k2=8, lambda_value=0.3)

        camdistmat = euclidean_dist(qcf, gcf).cpu().numpy()

        if self.output_flag:
            np.save(os.path.join(self.output_dir, 'distmat.npy'), distmat)
            np.save(os.path.join(self.output_dir, 'q_pred.npy'), q_campred)
            np.save(os.path.join(self.output_dir, 'g_pred.npy'), g_campred)
            np.save(os.path.join(self.output_dir, 'camdistmat.npy'), camdistmat)

        distmat -= camdistmat * 0.1

        campredmat = np.equal(q_campred.reshape(-1,1), g_campred.T)
        distmat += campredmat * 1.0

        distmat = add_space(distmat, q_campred, g_campred)

        if self.validation_flag:
            cmc, mAP = eval_func(distmat, q_pids, g_pids, q_camids, g_camids)
        else:
            cmc, mAP = np.zeros((self.max_rank,)), 0.0

        if self.output_flag:
            indices = np.argsort(distmat, axis=1)
            np.savetxt("result.txt", indices[:, :100], fmt="%05d")

        return cmc, mAP