//----------------------------------------------------------------------
// File:      kd_split.h
// Programmer:    Sunil Arya and David Mount
// Description:   Methods for splitting kd-trees
// Last modified: 01/04/05 (Version 1.0)
//----------------------------------------------------------------------
// Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
// David Mount.  All Rights Reserved.
//
// This software and related documentation is part of the Approximate
// Nearest Neighbor Library (ANN).  This software is provided under
// the provisions of the Lesser GNU Public License (LGPL).  See the
// file ../ReadMe.txt for further information.
//
// The University of Maryland (U.M.) and the authors make no
// representations about the suitability or fitness of this software for
// any purpose.  It is provided "as is" without express or implied
// warranty.
//----------------------------------------------------------------------
// History:
//  Revision 0.1  03/04/98
//    Initial release
//----------------------------------------------------------------------

#ifndef ANN_KD_SPLIT_H
#define ANN_KD_SPLIT_H

#include "kd_tree.h"          // kd-tree definitions

//----------------------------------------------------------------------
//  External entry points
//    These are all splitting procedures for kd-trees.
//----------------------------------------------------------------------

void kd_split(              // standard (optimized) kd-splitter
  ANNpointArray   pa,       // point array (unaltered)
  ANNidxArray     pidx,     // point indices (permuted on return)
  const ANNorthRect &bnds,      // bounding rectangle for cell
  int         n,        // number of points
  int         dim,      // dimension of space
  int         &cut_dim,   // cutting dimension (returned)
  ANNcoord      &cut_val,   // cutting value (returned)
  int         &n_lo);     // num of points on low side (returned)

void midpt_split(           // midpoint kd-splitter
  ANNpointArray   pa,       // point array (unaltered)
  ANNidxArray     pidx,     // point indices (permuted on return)
  const ANNorthRect &bnds,      // bounding rectangle for cell
  int         n,        // number of points
  int         dim,      // dimension of space
  int         &cut_dim,   // cutting dimension (returned)
  ANNcoord      &cut_val,   // cutting value (returned)
  int         &n_lo);     // num of points on low side (returned)

void sl_midpt_split(          // sliding midpoint kd-splitter
  ANNpointArray   pa,       // point array (unaltered)
  ANNidxArray     pidx,     // point indices (permuted on return)
  const ANNorthRect &bnds,      // bounding rectangle for cell
  int         n,        // number of points
  int         dim,      // dimension of space
  int         &cut_dim,   // cutting dimension (returned)
  ANNcoord      &cut_val,   // cutting value (returned)
  int         &n_lo);     // num of points on low side (returned)

void fair_split(            // fair-split kd-splitter
  ANNpointArray   pa,       // point array (unaltered)
  ANNidxArray     pidx,     // point indices (permuted on return)
  const ANNorthRect &bnds,      // bounding rectangle for cell
  int         n,        // number of points
  int         dim,      // dimension of space
  int         &cut_dim,   // cutting dimension (returned)
  ANNcoord      &cut_val,   // cutting value (returned)
  int         &n_lo);     // num of points on low side (returned)

void sl_fair_split(           // sliding fair-split kd-splitter
  ANNpointArray   pa,       // point array (unaltered)
  ANNidxArray     pidx,     // point indices (permuted on return)
  const ANNorthRect &bnds,      // bounding rectangle for cell
  int         n,        // number of points
  int         dim,      // dimension of space
  int         &cut_dim,   // cutting dimension (returned)
  ANNcoord      &cut_val,   // cutting value (returned)
  int         &n_lo);     // num of points on low side (returned)

#endif
