void DataPartitions::doFrequency(DoubleVector dimData){
    m_partitions.clear();
    PairVector dimOrData;
    initPairs(dimOrData, dimData);
    pairSort(dimOrData);
    int dimsize = dimData.size();

    int nBins = this->m_rddtClust->m_rddtOp->m_nBins;
    if(nBins == 0 ){
        nBins = 1;
    }
    if(nBins>dimsize){
        nBins = dimsize;
    }
    for(int i = 0; i< nBins; i++){
        DataPartition* partition = new DataPartition();
        partition->setPartitions(this);
        partition->m_partitionIdx = i;
        this->m_partitions.push_back(partition);
    }

    int partitionsize = (int)ceil((double)dimsize/(double)nBins);
    for(unsigned i = 0; i< dimOrData.size(); i++){
        int p = (int)((double)i/(double)partitionsize);
        if(p>(int)m_partitions.size())
            p=m_partitions.size();
        int first = (dimOrData[i]).first;
        (m_partitions[p])->m_parIndices.push_back(first);
    }

}
void DataPartitions::doRange(DoubleVector dimData){
    m_partitions.clear();
    PairVector dimOrData;
    initPairs(dimOrData, dimData);
    pairSort(dimOrData);
    //todo
}
/* This function will be called when the service loaded  */
int search_record_init_service(ci_service_xdata_t * srv_xdata,
                      struct ci_server_conf *server_conf)
{
     ci_debug_printf(5, "Initialization of Search Record module......\n");
     
     /*Tell to the icap clients that we can support up to 1024 size of preview data*/
     ci_service_set_preview(srv_xdata, 128);

     /*Tell to the icap clients that we support 204 responses*/
     ci_service_enable_204(srv_xdata);

     /*Tell to the icap clients to send preview data for all files*/
     ci_service_set_transfer_preview(srv_xdata, "*");

     /*Tell to the icap clients that we want the X-Authenticated-User and X-Authenticated-Groups headers
       which contains the username and the groups in which belongs.  */
     /*ci_service_set_xopts(srv_xdata,  CI_XAUTHENTICATEDUSER|CI_XAUTHENTICATEDGROUPS);*/
     
	 initPairs(&search_engine);
	 addNewPair(&search_engine,baidu_matchurl,baidu_wordlist,baidu_site);
	 addNewPair(&search_engine,google_matchurl,google_wordlist,google_site);
     return CI_OK;
}
void MinuMatchTico::Pairing(unsigned int nAlignment)
{
	int n1 = pMinus[0]->size();
	int n2 = pMinus[1]->size();
	// Assume all_pairs have been sorted
	vector<MinuPair> initPairs(all_pairs.begin(), all_pairs.begin()+nAlignment);
	for(unsigned int i = 0; i < nAlignment; i++)
	{
		// Alignment
		Minu initMinu[2];
		initMinu[0] = (*(pMinus[0]))[initPairs[i].index[0]];
		initMinu[1] = (*(pMinus[1]))[initPairs[i].index[1]];

		Tran tran;
		int rot = NormalizeMinuDir(initMinu[1].dir-initMinu[0].dir);
		tran.rotC = cos(rot*M_PI/180);
		tran.rotS = sin(rot*M_PI/180);
		tran.dx = initMinu[1].x - initMinu[0].x * tran.rotC - initMinu[0].y * tran.rotS;
		tran.dy = initMinu[1].y + initMinu[0].x * tran.rotS - initMinu[0].y * tran.rotC;

		vector<Minu> minuz(*(pMinus[0]));
		TransMinus(minuz, tran);
		for(unsigned int m = 0; m < minuz.size(); m++)
			minuz[m].dir = NormalizeMinuDir(minuz[m].dir + rot);

		// Match
		vector<MinuPair> match_pairs;
		match_pairs.push_back(MinuPair(initPairs[i].index[0], initPairs[i].index[1], 0));

		vector<bool> used_flag1(n1, false), used_flag2(n2, false);
		used_flag1[initPairs[i].index[0]] = true;
		used_flag2[initPairs[i].index[1]] = true;

		for(unsigned int m = 0; m < all_pairs.size(); m++)
		{
			if(all_pairs[m].score==0)
				break;

			//if(g_pairRank[allPairs[m].ii*g_nMinu[1]+allPairs[m].jj]>g_thRank)
			//	continue;

			//if(g_minuSimi[allPairs[m].ii*g_nMinu[1]+allPairs[m].jj]<=g_thSimi)
			//	continue;

			if(all_pairs[m].score<=10)
				break;

			int ii = all_pairs[m].index[0];
			int jj = all_pairs[m].index[1];
			if(used_flag1[ii] || used_flag2[jj])
				continue;

			// geometrically compatible with initial pair
			double dx = minuz[ii].x - (*(pMinus[1]))[jj].x;
			double dy = minuz[ii].y - (*(pMinus[1]))[jj].y;
			double diff_pos = sqrt(dx*dx+dy*dy);
			int ddir = minuz[ii].dir - (*(pMinus[1]))[jj].dir;

			dx = (*(pMinus[0]))[initPairs[i].index[0]].x - (*(pMinus[0]))[ii].x;
			dy = (*(pMinus[0]))[initPairs[i].index[0]].y - (*(pMinus[0]))[ii].y;
			double lLen = sqrt(dx*dx+dy*dy);

			double diff_pos_th;
			if(lLen <= LEN_BOUND[0])
				diff_pos_th = DIFF_POS[0];
			else if(lLen >= LEN_BOUND[BOUND_NUM-1])
				diff_pos_th = DIFF_POS[BOUND_NUM-1];
			else if(lLen<=LEN_BOUND[1])
				diff_pos_th = DIFF_POS[0] + (lLen-LEN_BOUND[0]) * (DIFF_POS[1]-DIFF_POS[0])/(LEN_BOUND[1]-LEN_BOUND[0]);
			else
				diff_pos_th = DIFF_POS[1] + (lLen-LEN_BOUND[1]) * (DIFF_POS[2]-DIFF_POS[1])/(LEN_BOUND[2]-LEN_BOUND[1]);

			if(diff_pos<=diff_pos_th && abs(NormalizeMinuDir(ddir))<=30)
			{
				used_flag1[ii] = true;
				used_flag2[jj] = true;
				match_pairs.push_back(MinuPair(ii, jj, 0));
				if((int)match_pairs.size() >= min(n1, n2))
					break;
			}
		}

		match_pair_sets.push_back(match_pairs);
	}
}