package MyPackage;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Ali Shahbazi
 */


public class SpacialSearchNotOpt {//non-optimized spacial search: go over all points
    
    
    //Data array info
    private ArrayDouble2D Data;
    
    public SpacialSearchNotOpt(){
        super();
    }
    
    public void Preprocess(ArrayDouble2D data){//StepNum is in each dimension
        this.Data=data;
    }
    


    
    public double Find1NNDist(double[] input){
        int index;
        index=this.Find1NN(input);
        return this.Distance(input, this.Data.Arr[index]);
    }
    
    
    
    public int Find1NN(double[] input){ //returns the index of nearest neighbor, return -1 if no point found
        double dist_sq;
        double dist_sq_min=9999999999999999999999999999999.9;
        int i,j;
        int nearest=-1;
        int dimension=this.Data.GetDimension();

        for ( j = this.Data.GetStartIndex(); j < this.Data.GetEndIndex(); j++ ){
            dist_sq = 0.0;
            for ( i = 0; i < dimension; i++ )
                dist_sq = dist_sq + (input[i]-this.Data.Arr[j][i]) * (input[i]-this.Data.Arr[j][i]);

            if (dist_sq < dist_sq_min ){
                dist_sq_min = dist_sq;
                nearest = j;
            }
        }
        return nearest;
    
    }
    

    private double Distance(double[] x, double[] y){//distance in n dimension
        int dim=x.length;
        double dist=0;
        for(int i=0;i<dim;i++){
            dist+=((x[i]-y[i])*(x[i]-y[i]));
        }

        return (Math.sqrt(dist));
    }

    private double DistanceP2(double[] x, double[] y){//distance in n dimension
        int dim=x.length;
        double dist=0;
        for(int i=0;i<dim;i++){
            dist+=((x[i]-y[i])*(x[i]-y[i]));
        }

        return dist;
    }

    
    
    
 
}
