/* $Id: DocumentSearcherTerasawa.java 125 2011-03-09 09:49:51Z ohura $ */
package jp.ac.hokudai.meme.core_smart_gs.searcher;

import java.util.ArrayList;

public class DocumentSearcherTerasawa extends DocumentSearcher{

    
    public DocumentSearcherTerasawa(){
        super();
    }
    
    /* (非 Javadoc)
     * @see jp.ac.hokudai.meme.core_smart_gs.searcher.DocumentSearcher#searchStart(double[][], int[])
     */
    protected ResultIndex searchStart(double[][] dscData, int[] index) {
//        ArrayList slitList = dscData_.getSlitDataList_();
//        Random random = new Random();
//        int pageIdx = random.nextInt(slitList.size());
//        Rectangle[] page = (Rectangle[]) slitList.get(pageIdx);
//        
//        int start = random.nextInt(page.length);
//        int length = random.nextInt(30);
//        
//        ArrayList dummyHit = new ArrayList();
//        for (int i = 0; i < length; i++) {
//            dummyHit.add(new CharPiece(0, page[start + i]));
//        }
//        ResultRects result = new ResultRects();
//        result.addResult(dummyHit);
//        return result;

    	//通常（DTWなし）の距離算出をします。
    	int i,k,sn,dim;
    	double diff;
    	int qfrom=index[0];
    	int qto=index[index.length-1];
//    	int winsize=qto-qfrom+1;
        int winsize = index.length;
    	int searchbegin=0;
    	
    	int numslits=dscData.length;
    	int numdim=dscData[0].length;
    	int searchend=numslits-winsize;
    	double[] dist = new double[numslits];
    	for(sn=searchbegin;sn<=searchend;++sn){
    		dist[sn]=0;
    		for(k=0;k<winsize;++k){
    			for(dim=0;dim<numdim;++dim){
    				diff=dscData[qfrom+k][dim]-dscData[sn+k][dim];
    				dist[sn]+=diff*diff;
    			}
    		}
    	}

//    	距離が計算されたらソートして上位を出力します。
//      distを小さい順にMAXFOUND位まで拾う。
//      気の利いたソート法ではなくバカソートしているのは、MAXFOUNDが小さいから。
        ResultIndex result = new ResultIndex();

    	double dmin;
    	double DBL_MAX=999999.99;
    	int minidx;

    	for(i=-20;i<=20;++i)  //自分自身の前後賞を拾わないための措置
    		if(qfrom+i>=0 && qfrom+i<numslits) dist[qfrom+i]=DBL_MAX;
    	for(k=0;k<maxFound_;++k){
    		dmin=DBL_MAX;
    		minidx=0;
    		for(sn=searchbegin;sn<=searchend;++sn){
    			if(dist[sn]<dmin && dist[sn]>0){
    				dmin=dist[sn];
    				minidx=sn;
    			}
    		}
            result.addResult(new FoundIndex(minidx,minidx+winsize-1,dmin));
    		for(i=-20;i<=20;++i)
    			if(minidx+i>=0 && minidx+i<numslits) dist[minidx+i]=DBL_MAX;
    	}

        return result;
    	
	}
    
    /**
     * @param args
     */
    public static void main(String[] args) {

    }

}
