LCOV - code coverage report
Current view: top level - synthesis/MeasurementEquations/lbfgs - alglibmisc.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 2312 0.0 %
Date: 2024-10-10 11:40:37 Functions: 0 237 0.0 %

          Line data    Source code
       1             : /*************************************************************************
       2             : ALGLIB 3.17.0 (source code generated 2020-12-27)
       3             : Copyright (c) Sergey Bochkanov (ALGLIB project).
       4             : 
       5             : >>> SOURCE LICENSE >>>
       6             : This program is free software; you can redistribute it and/or modify
       7             : it under the terms of the GNU General Public License as published by
       8             : the Free Software Foundation (www.fsf.org); either version 2 of the 
       9             : License, or (at your option) any later version.
      10             : 
      11             : This program is distributed in the hope that it will be useful,
      12             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : GNU General Public License for more details.
      15             : 
      16             : A copy of the GNU General Public License is available at
      17             : http://www.fsf.org/licensing/licenses
      18             : >>> END OF LICENSE >>>
      19             : *************************************************************************/
      20             : #ifdef _MSC_VER
      21             : #define _CRT_SECURE_NO_WARNINGS
      22             : #endif
      23             : #include "stdafx.h"
      24             : #include "alglibmisc.h"
      25             : 
      26             : // disable some irrelevant warnings
      27             : #if (AE_COMPILER==AE_MSVC) && !defined(AE_ALL_WARNINGS)
      28             : #pragma warning(disable:4100)
      29             : #pragma warning(disable:4127)
      30             : #pragma warning(disable:4611)
      31             : #pragma warning(disable:4702)
      32             : #pragma warning(disable:4996)
      33             : #endif
      34             : 
      35             : /////////////////////////////////////////////////////////////////////////
      36             : //
      37             : // THIS SECTION CONTAINS IMPLEMENTATION OF C++ INTERFACE
      38             : //
      39             : /////////////////////////////////////////////////////////////////////////
      40             : namespace alglib
      41             : {
      42             : 
      43             : #if defined(AE_COMPILE_NEARESTNEIGHBOR) || !defined(AE_PARTIAL_BUILD)
      44             : 
      45             : #endif
      46             : 
      47             : #if defined(AE_COMPILE_HQRND) || !defined(AE_PARTIAL_BUILD)
      48             : 
      49             : #endif
      50             : 
      51             : #if defined(AE_COMPILE_XDEBUG) || !defined(AE_PARTIAL_BUILD)
      52             : 
      53             : #endif
      54             : 
      55             : #if defined(AE_COMPILE_NEARESTNEIGHBOR) || !defined(AE_PARTIAL_BUILD)
      56             : /*************************************************************************
      57             : Buffer object which is used to perform nearest neighbor  requests  in  the
      58             : multithreaded mode (multiple threads working with same KD-tree object).
      59             : 
      60             : This object should be created with KDTreeCreateRequestBuffer().
      61             : *************************************************************************/
      62           0 : _kdtreerequestbuffer_owner::_kdtreerequestbuffer_owner()
      63             : {
      64             :     jmp_buf _break_jump;
      65             :     alglib_impl::ae_state _state;
      66             :     
      67           0 :     alglib_impl::ae_state_init(&_state);
      68           0 :     if( setjmp(_break_jump) )
      69             :     {
      70           0 :         if( p_struct!=NULL )
      71             :         {
      72           0 :             alglib_impl::_kdtreerequestbuffer_destroy(p_struct);
      73           0 :             alglib_impl::ae_free(p_struct);
      74             :         }
      75           0 :         p_struct = NULL;
      76             : #if !defined(AE_NO_EXCEPTIONS)
      77           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
      78             : #else
      79             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
      80             :         return;
      81             : #endif
      82             :     }
      83           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
      84           0 :     p_struct = NULL;
      85           0 :     p_struct = (alglib_impl::kdtreerequestbuffer*)alglib_impl::ae_malloc(sizeof(alglib_impl::kdtreerequestbuffer), &_state);
      86           0 :     memset(p_struct, 0, sizeof(alglib_impl::kdtreerequestbuffer));
      87           0 :     alglib_impl::_kdtreerequestbuffer_init(p_struct, &_state, ae_false);
      88           0 :     ae_state_clear(&_state);
      89           0 : }
      90             : 
      91           0 : _kdtreerequestbuffer_owner::_kdtreerequestbuffer_owner(const _kdtreerequestbuffer_owner &rhs)
      92             : {
      93             :     jmp_buf _break_jump;
      94             :     alglib_impl::ae_state _state;
      95             :     
      96           0 :     alglib_impl::ae_state_init(&_state);
      97           0 :     if( setjmp(_break_jump) )
      98             :     {
      99           0 :         if( p_struct!=NULL )
     100             :         {
     101           0 :             alglib_impl::_kdtreerequestbuffer_destroy(p_struct);
     102           0 :             alglib_impl::ae_free(p_struct);
     103             :         }
     104           0 :         p_struct = NULL;
     105             : #if !defined(AE_NO_EXCEPTIONS)
     106           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
     107             : #else
     108             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
     109             :         return;
     110             : #endif
     111             :     }
     112           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
     113           0 :     p_struct = NULL;
     114           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: kdtreerequestbuffer copy constructor failure (source is not initialized)", &_state);
     115           0 :     p_struct = (alglib_impl::kdtreerequestbuffer*)alglib_impl::ae_malloc(sizeof(alglib_impl::kdtreerequestbuffer), &_state);
     116           0 :     memset(p_struct, 0, sizeof(alglib_impl::kdtreerequestbuffer));
     117           0 :     alglib_impl::_kdtreerequestbuffer_init_copy(p_struct, const_cast<alglib_impl::kdtreerequestbuffer*>(rhs.p_struct), &_state, ae_false);
     118           0 :     ae_state_clear(&_state);
     119           0 : }
     120             : 
     121           0 : _kdtreerequestbuffer_owner& _kdtreerequestbuffer_owner::operator=(const _kdtreerequestbuffer_owner &rhs)
     122             : {
     123           0 :     if( this==&rhs )
     124           0 :         return *this;
     125             :     jmp_buf _break_jump;
     126             :     alglib_impl::ae_state _state;
     127             :     
     128           0 :     alglib_impl::ae_state_init(&_state);
     129           0 :     if( setjmp(_break_jump) )
     130             :     {
     131             : #if !defined(AE_NO_EXCEPTIONS)
     132           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
     133             : #else
     134             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
     135             :         return *this;
     136             : #endif
     137             :     }
     138           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
     139           0 :     alglib_impl::ae_assert(p_struct!=NULL, "ALGLIB: kdtreerequestbuffer assignment constructor failure (destination is not initialized)", &_state);
     140           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: kdtreerequestbuffer assignment constructor failure (source is not initialized)", &_state);
     141           0 :     alglib_impl::_kdtreerequestbuffer_destroy(p_struct);
     142           0 :     memset(p_struct, 0, sizeof(alglib_impl::kdtreerequestbuffer));
     143           0 :     alglib_impl::_kdtreerequestbuffer_init_copy(p_struct, const_cast<alglib_impl::kdtreerequestbuffer*>(rhs.p_struct), &_state, ae_false);
     144           0 :     ae_state_clear(&_state);
     145           0 :     return *this;
     146             : }
     147             : 
     148           0 : _kdtreerequestbuffer_owner::~_kdtreerequestbuffer_owner()
     149             : {
     150           0 :     if( p_struct!=NULL )
     151             :     {
     152           0 :         alglib_impl::_kdtreerequestbuffer_destroy(p_struct);
     153           0 :         ae_free(p_struct);
     154             :     }
     155           0 : }
     156             : 
     157           0 : alglib_impl::kdtreerequestbuffer* _kdtreerequestbuffer_owner::c_ptr()
     158             : {
     159           0 :     return p_struct;
     160             : }
     161             : 
     162           0 : alglib_impl::kdtreerequestbuffer* _kdtreerequestbuffer_owner::c_ptr() const
     163             : {
     164           0 :     return const_cast<alglib_impl::kdtreerequestbuffer*>(p_struct);
     165             : }
     166           0 : kdtreerequestbuffer::kdtreerequestbuffer() : _kdtreerequestbuffer_owner() 
     167             : {
     168           0 : }
     169             : 
     170           0 : kdtreerequestbuffer::kdtreerequestbuffer(const kdtreerequestbuffer &rhs):_kdtreerequestbuffer_owner(rhs) 
     171             : {
     172           0 : }
     173             : 
     174           0 : kdtreerequestbuffer& kdtreerequestbuffer::operator=(const kdtreerequestbuffer &rhs)
     175             : {
     176           0 :     if( this==&rhs )
     177           0 :         return *this;
     178           0 :     _kdtreerequestbuffer_owner::operator=(rhs);
     179           0 :     return *this;
     180             : }
     181             : 
     182           0 : kdtreerequestbuffer::~kdtreerequestbuffer()
     183             : {
     184           0 : }
     185             : 
     186             : 
     187             : /*************************************************************************
     188             : KD-tree object.
     189             : *************************************************************************/
     190           0 : _kdtree_owner::_kdtree_owner()
     191             : {
     192             :     jmp_buf _break_jump;
     193             :     alglib_impl::ae_state _state;
     194             :     
     195           0 :     alglib_impl::ae_state_init(&_state);
     196           0 :     if( setjmp(_break_jump) )
     197             :     {
     198           0 :         if( p_struct!=NULL )
     199             :         {
     200           0 :             alglib_impl::_kdtree_destroy(p_struct);
     201           0 :             alglib_impl::ae_free(p_struct);
     202             :         }
     203           0 :         p_struct = NULL;
     204             : #if !defined(AE_NO_EXCEPTIONS)
     205           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
     206             : #else
     207             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
     208             :         return;
     209             : #endif
     210             :     }
     211           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
     212           0 :     p_struct = NULL;
     213           0 :     p_struct = (alglib_impl::kdtree*)alglib_impl::ae_malloc(sizeof(alglib_impl::kdtree), &_state);
     214           0 :     memset(p_struct, 0, sizeof(alglib_impl::kdtree));
     215           0 :     alglib_impl::_kdtree_init(p_struct, &_state, ae_false);
     216           0 :     ae_state_clear(&_state);
     217           0 : }
     218             : 
     219           0 : _kdtree_owner::_kdtree_owner(const _kdtree_owner &rhs)
     220             : {
     221             :     jmp_buf _break_jump;
     222             :     alglib_impl::ae_state _state;
     223             :     
     224           0 :     alglib_impl::ae_state_init(&_state);
     225           0 :     if( setjmp(_break_jump) )
     226             :     {
     227           0 :         if( p_struct!=NULL )
     228             :         {
     229           0 :             alglib_impl::_kdtree_destroy(p_struct);
     230           0 :             alglib_impl::ae_free(p_struct);
     231             :         }
     232           0 :         p_struct = NULL;
     233             : #if !defined(AE_NO_EXCEPTIONS)
     234           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
     235             : #else
     236             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
     237             :         return;
     238             : #endif
     239             :     }
     240           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
     241           0 :     p_struct = NULL;
     242           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: kdtree copy constructor failure (source is not initialized)", &_state);
     243           0 :     p_struct = (alglib_impl::kdtree*)alglib_impl::ae_malloc(sizeof(alglib_impl::kdtree), &_state);
     244           0 :     memset(p_struct, 0, sizeof(alglib_impl::kdtree));
     245           0 :     alglib_impl::_kdtree_init_copy(p_struct, const_cast<alglib_impl::kdtree*>(rhs.p_struct), &_state, ae_false);
     246           0 :     ae_state_clear(&_state);
     247           0 : }
     248             : 
     249           0 : _kdtree_owner& _kdtree_owner::operator=(const _kdtree_owner &rhs)
     250             : {
     251           0 :     if( this==&rhs )
     252           0 :         return *this;
     253             :     jmp_buf _break_jump;
     254             :     alglib_impl::ae_state _state;
     255             :     
     256           0 :     alglib_impl::ae_state_init(&_state);
     257           0 :     if( setjmp(_break_jump) )
     258             :     {
     259             : #if !defined(AE_NO_EXCEPTIONS)
     260           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
     261             : #else
     262             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
     263             :         return *this;
     264             : #endif
     265             :     }
     266           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
     267           0 :     alglib_impl::ae_assert(p_struct!=NULL, "ALGLIB: kdtree assignment constructor failure (destination is not initialized)", &_state);
     268           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: kdtree assignment constructor failure (source is not initialized)", &_state);
     269           0 :     alglib_impl::_kdtree_destroy(p_struct);
     270           0 :     memset(p_struct, 0, sizeof(alglib_impl::kdtree));
     271           0 :     alglib_impl::_kdtree_init_copy(p_struct, const_cast<alglib_impl::kdtree*>(rhs.p_struct), &_state, ae_false);
     272           0 :     ae_state_clear(&_state);
     273           0 :     return *this;
     274             : }
     275             : 
     276           0 : _kdtree_owner::~_kdtree_owner()
     277             : {
     278           0 :     if( p_struct!=NULL )
     279             :     {
     280           0 :         alglib_impl::_kdtree_destroy(p_struct);
     281           0 :         ae_free(p_struct);
     282             :     }
     283           0 : }
     284             : 
     285           0 : alglib_impl::kdtree* _kdtree_owner::c_ptr()
     286             : {
     287           0 :     return p_struct;
     288             : }
     289             : 
     290           0 : alglib_impl::kdtree* _kdtree_owner::c_ptr() const
     291             : {
     292           0 :     return const_cast<alglib_impl::kdtree*>(p_struct);
     293             : }
     294           0 : kdtree::kdtree() : _kdtree_owner() 
     295             : {
     296           0 : }
     297             : 
     298           0 : kdtree::kdtree(const kdtree &rhs):_kdtree_owner(rhs) 
     299             : {
     300           0 : }
     301             : 
     302           0 : kdtree& kdtree::operator=(const kdtree &rhs)
     303             : {
     304           0 :     if( this==&rhs )
     305           0 :         return *this;
     306           0 :     _kdtree_owner::operator=(rhs);
     307           0 :     return *this;
     308             : }
     309             : 
     310           0 : kdtree::~kdtree()
     311             : {
     312           0 : }
     313             : 
     314             : 
     315             : /*************************************************************************
     316             : This function serializes data structure to string.
     317             : 
     318             : Important properties of s_out:
     319             : * it contains alphanumeric characters, dots, underscores, minus signs
     320             : * these symbols are grouped into words, which are separated by spaces
     321             :   and Windows-style (CR+LF) newlines
     322             : * although  serializer  uses  spaces and CR+LF as separators, you can 
     323             :   replace any separator character by arbitrary combination of spaces,
     324             :   tabs, Windows or Unix newlines. It allows flexible reformatting  of
     325             :   the  string  in  case you want to include it into text or XML file. 
     326             :   But you should not insert separators into the middle of the "words"
     327             :   nor you should change case of letters.
     328             : * s_out can be freely moved between 32-bit and 64-bit systems, little
     329             :   and big endian machines, and so on. You can serialize structure  on
     330             :   32-bit machine and unserialize it on 64-bit one (or vice versa), or
     331             :   serialize  it  on  SPARC  and  unserialize  on  x86.  You  can also 
     332             :   serialize  it  in  C++ version of ALGLIB and unserialize in C# one, 
     333             :   and vice versa.
     334             : *************************************************************************/
     335           0 : void kdtreeserialize(kdtree &obj, std::string &s_out)
     336             : {
     337             :     jmp_buf _break_jump;
     338             :     alglib_impl::ae_state state;
     339             :     alglib_impl::ae_serializer serializer;
     340             :     alglib_impl::ae_int_t ssize;
     341             : 
     342           0 :     alglib_impl::ae_state_init(&state);
     343           0 :     if( setjmp(_break_jump) )
     344             :     {
     345             : #if !defined(AE_NO_EXCEPTIONS)
     346           0 :         _ALGLIB_CPP_EXCEPTION(state.error_msg);
     347             : #else
     348             :         _ALGLIB_SET_ERROR_FLAG(state.error_msg);
     349             :         return;
     350             : #endif
     351             :     }
     352           0 :     ae_state_set_break_jump(&state, &_break_jump);
     353           0 :     alglib_impl::ae_serializer_init(&serializer);
     354           0 :     alglib_impl::ae_serializer_alloc_start(&serializer);
     355           0 :     alglib_impl::kdtreealloc(&serializer, obj.c_ptr(), &state);
     356           0 :     ssize = alglib_impl::ae_serializer_get_alloc_size(&serializer);
     357           0 :     s_out.clear();
     358           0 :     s_out.reserve((size_t)(ssize+1));
     359           0 :     alglib_impl::ae_serializer_sstart_str(&serializer, &s_out);
     360           0 :     alglib_impl::kdtreeserialize(&serializer, obj.c_ptr(), &state);
     361           0 :     alglib_impl::ae_serializer_stop(&serializer, &state);
     362           0 :     alglib_impl::ae_assert( s_out.length()<=(size_t)ssize, "ALGLIB: serialization integrity error", &state);
     363           0 :     alglib_impl::ae_serializer_clear(&serializer);
     364           0 :     alglib_impl::ae_state_clear(&state);
     365           0 : }
     366             : /*************************************************************************
     367             : This function unserializes data structure from string.
     368             : *************************************************************************/
     369           0 : void kdtreeunserialize(const std::string &s_in, kdtree &obj)
     370             : {
     371             :     jmp_buf _break_jump;
     372             :     alglib_impl::ae_state state;
     373             :     alglib_impl::ae_serializer serializer;
     374             : 
     375           0 :     alglib_impl::ae_state_init(&state);
     376           0 :     if( setjmp(_break_jump) )
     377             :     {
     378             : #if !defined(AE_NO_EXCEPTIONS)
     379           0 :         _ALGLIB_CPP_EXCEPTION(state.error_msg);
     380             : #else
     381             :         _ALGLIB_SET_ERROR_FLAG(state.error_msg);
     382             :         return;
     383             : #endif
     384             :     }
     385           0 :     ae_state_set_break_jump(&state, &_break_jump);
     386           0 :     alglib_impl::ae_serializer_init(&serializer);
     387           0 :     alglib_impl::ae_serializer_ustart_str(&serializer, &s_in);
     388           0 :     alglib_impl::kdtreeunserialize(&serializer, obj.c_ptr(), &state);
     389           0 :     alglib_impl::ae_serializer_stop(&serializer, &state);
     390           0 :     alglib_impl::ae_serializer_clear(&serializer);
     391           0 :     alglib_impl::ae_state_clear(&state);
     392           0 : }
     393             : 
     394             : 
     395             : /*************************************************************************
     396             : This function serializes data structure to C++ stream.
     397             : 
     398             : Data stream generated by this function is same as  string  representation
     399             : generated  by  string  version  of  serializer - alphanumeric characters,
     400             : dots, underscores, minus signs, which are grouped into words separated by
     401             : spaces and CR+LF.
     402             : 
     403             : We recommend you to read comments on string version of serializer to find
     404             : out more about serialization of AlGLIB objects.
     405             : *************************************************************************/
     406           0 : void kdtreeserialize(kdtree &obj, std::ostream &s_out)
     407             : {
     408             :     jmp_buf _break_jump;
     409             :     alglib_impl::ae_state state;
     410             :     alglib_impl::ae_serializer serializer;
     411             : 
     412           0 :     alglib_impl::ae_state_init(&state);
     413           0 :     if( setjmp(_break_jump) )
     414             :     {
     415             : #if !defined(AE_NO_EXCEPTIONS)
     416           0 :         _ALGLIB_CPP_EXCEPTION(state.error_msg);
     417             : #else
     418             :         _ALGLIB_SET_ERROR_FLAG(state.error_msg);
     419             :         return;
     420             : #endif
     421             :     }
     422           0 :     ae_state_set_break_jump(&state, &_break_jump);
     423           0 :     alglib_impl::ae_serializer_init(&serializer);
     424           0 :     alglib_impl::ae_serializer_alloc_start(&serializer);
     425           0 :     alglib_impl::kdtreealloc(&serializer, obj.c_ptr(), &state);
     426           0 :     alglib_impl::ae_serializer_get_alloc_size(&serializer); // not actually needed, but we have to ask
     427           0 :     alglib_impl::ae_serializer_sstart_stream(&serializer, &s_out);
     428           0 :     alglib_impl::kdtreeserialize(&serializer, obj.c_ptr(), &state);
     429           0 :     alglib_impl::ae_serializer_stop(&serializer, &state);
     430           0 :     alglib_impl::ae_serializer_clear(&serializer);
     431           0 :     alglib_impl::ae_state_clear(&state);
     432           0 : }
     433             : /*************************************************************************
     434             : This function unserializes data structure from stream.
     435             : *************************************************************************/
     436           0 : void kdtreeunserialize(const std::istream &s_in, kdtree &obj)
     437             : {
     438             :     jmp_buf _break_jump;
     439             :     alglib_impl::ae_state state;
     440             :     alglib_impl::ae_serializer serializer;
     441             : 
     442           0 :     alglib_impl::ae_state_init(&state);
     443           0 :     if( setjmp(_break_jump) )
     444             :     {
     445             : #if !defined(AE_NO_EXCEPTIONS)
     446           0 :         _ALGLIB_CPP_EXCEPTION(state.error_msg);
     447             : #else
     448             :         _ALGLIB_SET_ERROR_FLAG(state.error_msg);
     449             :         return;
     450             : #endif
     451             :     }
     452           0 :     ae_state_set_break_jump(&state, &_break_jump);
     453           0 :     alglib_impl::ae_serializer_init(&serializer);
     454           0 :     alglib_impl::ae_serializer_ustart_stream(&serializer, &s_in);
     455           0 :     alglib_impl::kdtreeunserialize(&serializer, obj.c_ptr(), &state);
     456           0 :     alglib_impl::ae_serializer_stop(&serializer, &state);
     457           0 :     alglib_impl::ae_serializer_clear(&serializer);
     458           0 :     alglib_impl::ae_state_clear(&state);
     459           0 : }
     460             : 
     461             : /*************************************************************************
     462             : KD-tree creation
     463             : 
     464             : This subroutine creates KD-tree from set of X-values and optional Y-values
     465             : 
     466             : INPUT PARAMETERS
     467             :     XY      -   dataset, array[0..N-1,0..NX+NY-1].
     468             :                 one row corresponds to one point.
     469             :                 first NX columns contain X-values, next NY (NY may be zero)
     470             :                 columns may contain associated Y-values
     471             :     N       -   number of points, N>=0.
     472             :     NX      -   space dimension, NX>=1.
     473             :     NY      -   number of optional Y-values, NY>=0.
     474             :     NormType-   norm type:
     475             :                 * 0 denotes infinity-norm
     476             :                 * 1 denotes 1-norm
     477             :                 * 2 denotes 2-norm (Euclidean norm)
     478             : 
     479             : OUTPUT PARAMETERS
     480             :     KDT     -   KD-tree
     481             : 
     482             : 
     483             : NOTES
     484             : 
     485             : 1. KD-tree  creation  have O(N*logN) complexity and O(N*(2*NX+NY))  memory
     486             :    requirements.
     487             : 2. Although KD-trees may be used with any combination of N  and  NX,  they
     488             :    are more efficient than brute-force search only when N >> 4^NX. So they
     489             :    are most useful in low-dimensional tasks (NX=2, NX=3). NX=1  is another
     490             :    inefficient case, because  simple  binary  search  (without  additional
     491             :    structures) is much more efficient in such tasks than KD-trees.
     492             : 
     493             :   -- ALGLIB --
     494             :      Copyright 28.02.2010 by Bochkanov Sergey
     495             : *************************************************************************/
     496           0 : void kdtreebuild(const real_2d_array &xy, const ae_int_t n, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt, const xparams _xparams)
     497             : {
     498             :     jmp_buf _break_jump;
     499             :     alglib_impl::ae_state _alglib_env_state;
     500           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     501           0 :     if( setjmp(_break_jump) )
     502             :     {
     503             : #if !defined(AE_NO_EXCEPTIONS)
     504           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     505             : #else
     506             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
     507             :         return;
     508             : #endif
     509             :     }
     510           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     511           0 :     if( _xparams.flags!=0x0 )
     512           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     513           0 :     alglib_impl::kdtreebuild(const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), n, nx, ny, normtype, const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), &_alglib_env_state);
     514           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     515           0 :     return;
     516             : }
     517             : 
     518             : /*************************************************************************
     519             : KD-tree creation
     520             : 
     521             : This subroutine creates KD-tree from set of X-values and optional Y-values
     522             : 
     523             : INPUT PARAMETERS
     524             :     XY      -   dataset, array[0..N-1,0..NX+NY-1].
     525             :                 one row corresponds to one point.
     526             :                 first NX columns contain X-values, next NY (NY may be zero)
     527             :                 columns may contain associated Y-values
     528             :     N       -   number of points, N>=0.
     529             :     NX      -   space dimension, NX>=1.
     530             :     NY      -   number of optional Y-values, NY>=0.
     531             :     NormType-   norm type:
     532             :                 * 0 denotes infinity-norm
     533             :                 * 1 denotes 1-norm
     534             :                 * 2 denotes 2-norm (Euclidean norm)
     535             : 
     536             : OUTPUT PARAMETERS
     537             :     KDT     -   KD-tree
     538             : 
     539             : 
     540             : NOTES
     541             : 
     542             : 1. KD-tree  creation  have O(N*logN) complexity and O(N*(2*NX+NY))  memory
     543             :    requirements.
     544             : 2. Although KD-trees may be used with any combination of N  and  NX,  they
     545             :    are more efficient than brute-force search only when N >> 4^NX. So they
     546             :    are most useful in low-dimensional tasks (NX=2, NX=3). NX=1  is another
     547             :    inefficient case, because  simple  binary  search  (without  additional
     548             :    structures) is much more efficient in such tasks than KD-trees.
     549             : 
     550             :   -- ALGLIB --
     551             :      Copyright 28.02.2010 by Bochkanov Sergey
     552             : *************************************************************************/
     553             : #if !defined(AE_NO_EXCEPTIONS)
     554           0 : void kdtreebuild(const real_2d_array &xy, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt, const xparams _xparams)
     555             : {
     556             :     jmp_buf _break_jump;
     557             :     alglib_impl::ae_state _alglib_env_state;    
     558             :     ae_int_t n;
     559             : 
     560           0 :     n = xy.rows();
     561           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     562           0 :     if( setjmp(_break_jump) )
     563           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     564           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     565           0 :     if( _xparams.flags!=0x0 )
     566           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     567           0 :     alglib_impl::kdtreebuild(const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), n, nx, ny, normtype, const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), &_alglib_env_state);
     568             : 
     569           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     570           0 :     return;
     571             : }
     572             : #endif
     573             : 
     574             : /*************************************************************************
     575             : KD-tree creation
     576             : 
     577             : This  subroutine  creates  KD-tree  from set of X-values, integer tags and
     578             : optional Y-values
     579             : 
     580             : INPUT PARAMETERS
     581             :     XY      -   dataset, array[0..N-1,0..NX+NY-1].
     582             :                 one row corresponds to one point.
     583             :                 first NX columns contain X-values, next NY (NY may be zero)
     584             :                 columns may contain associated Y-values
     585             :     Tags    -   tags, array[0..N-1], contains integer tags associated
     586             :                 with points.
     587             :     N       -   number of points, N>=0
     588             :     NX      -   space dimension, NX>=1.
     589             :     NY      -   number of optional Y-values, NY>=0.
     590             :     NormType-   norm type:
     591             :                 * 0 denotes infinity-norm
     592             :                 * 1 denotes 1-norm
     593             :                 * 2 denotes 2-norm (Euclidean norm)
     594             : 
     595             : OUTPUT PARAMETERS
     596             :     KDT     -   KD-tree
     597             : 
     598             : NOTES
     599             : 
     600             : 1. KD-tree  creation  have O(N*logN) complexity and O(N*(2*NX+NY))  memory
     601             :    requirements.
     602             : 2. Although KD-trees may be used with any combination of N  and  NX,  they
     603             :    are more efficient than brute-force search only when N >> 4^NX. So they
     604             :    are most useful in low-dimensional tasks (NX=2, NX=3). NX=1  is another
     605             :    inefficient case, because  simple  binary  search  (without  additional
     606             :    structures) is much more efficient in such tasks than KD-trees.
     607             : 
     608             :   -- ALGLIB --
     609             :      Copyright 28.02.2010 by Bochkanov Sergey
     610             : *************************************************************************/
     611           0 : void kdtreebuildtagged(const real_2d_array &xy, const integer_1d_array &tags, const ae_int_t n, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt, const xparams _xparams)
     612             : {
     613             :     jmp_buf _break_jump;
     614             :     alglib_impl::ae_state _alglib_env_state;
     615           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     616           0 :     if( setjmp(_break_jump) )
     617             :     {
     618             : #if !defined(AE_NO_EXCEPTIONS)
     619           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     620             : #else
     621             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
     622             :         return;
     623             : #endif
     624             :     }
     625           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     626           0 :     if( _xparams.flags!=0x0 )
     627           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     628           0 :     alglib_impl::kdtreebuildtagged(const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), const_cast<alglib_impl::ae_vector*>(tags.c_ptr()), n, nx, ny, normtype, const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), &_alglib_env_state);
     629           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     630           0 :     return;
     631             : }
     632             : 
     633             : /*************************************************************************
     634             : KD-tree creation
     635             : 
     636             : This  subroutine  creates  KD-tree  from set of X-values, integer tags and
     637             : optional Y-values
     638             : 
     639             : INPUT PARAMETERS
     640             :     XY      -   dataset, array[0..N-1,0..NX+NY-1].
     641             :                 one row corresponds to one point.
     642             :                 first NX columns contain X-values, next NY (NY may be zero)
     643             :                 columns may contain associated Y-values
     644             :     Tags    -   tags, array[0..N-1], contains integer tags associated
     645             :                 with points.
     646             :     N       -   number of points, N>=0
     647             :     NX      -   space dimension, NX>=1.
     648             :     NY      -   number of optional Y-values, NY>=0.
     649             :     NormType-   norm type:
     650             :                 * 0 denotes infinity-norm
     651             :                 * 1 denotes 1-norm
     652             :                 * 2 denotes 2-norm (Euclidean norm)
     653             : 
     654             : OUTPUT PARAMETERS
     655             :     KDT     -   KD-tree
     656             : 
     657             : NOTES
     658             : 
     659             : 1. KD-tree  creation  have O(N*logN) complexity and O(N*(2*NX+NY))  memory
     660             :    requirements.
     661             : 2. Although KD-trees may be used with any combination of N  and  NX,  they
     662             :    are more efficient than brute-force search only when N >> 4^NX. So they
     663             :    are most useful in low-dimensional tasks (NX=2, NX=3). NX=1  is another
     664             :    inefficient case, because  simple  binary  search  (without  additional
     665             :    structures) is much more efficient in such tasks than KD-trees.
     666             : 
     667             :   -- ALGLIB --
     668             :      Copyright 28.02.2010 by Bochkanov Sergey
     669             : *************************************************************************/
     670             : #if !defined(AE_NO_EXCEPTIONS)
     671           0 : void kdtreebuildtagged(const real_2d_array &xy, const integer_1d_array &tags, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt, const xparams _xparams)
     672             : {
     673             :     jmp_buf _break_jump;
     674             :     alglib_impl::ae_state _alglib_env_state;    
     675             :     ae_int_t n;
     676           0 :     if( (xy.rows()!=tags.length()))
     677           0 :         _ALGLIB_CPP_EXCEPTION("Error while calling 'kdtreebuildtagged': looks like one of arguments has wrong size");
     678           0 :     n = xy.rows();
     679           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     680           0 :     if( setjmp(_break_jump) )
     681           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     682           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     683           0 :     if( _xparams.flags!=0x0 )
     684           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     685           0 :     alglib_impl::kdtreebuildtagged(const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), const_cast<alglib_impl::ae_vector*>(tags.c_ptr()), n, nx, ny, normtype, const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), &_alglib_env_state);
     686             : 
     687           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     688           0 :     return;
     689             : }
     690             : #endif
     691             : 
     692             : /*************************************************************************
     693             : This function creates buffer  structure  which  can  be  used  to  perform
     694             : parallel KD-tree requests.
     695             : 
     696             : KD-tree subpackage provides two sets of request functions - ones which use
     697             : internal buffer of KD-tree object  (these  functions  are  single-threaded
     698             : because they use same buffer, which can not shared between  threads),  and
     699             : ones which use external buffer.
     700             : 
     701             : This function is used to initialize external buffer.
     702             : 
     703             : INPUT PARAMETERS
     704             :     KDT         -   KD-tree which is associated with newly created buffer
     705             : 
     706             : OUTPUT PARAMETERS
     707             :     Buf         -   external buffer.
     708             : 
     709             : 
     710             : IMPORTANT: KD-tree buffer should be used only with  KD-tree  object  which
     711             :            was used to initialize buffer. Any attempt to use buffer   with
     712             :            different object is dangerous - you  may  get  integrity  check
     713             :            failure (exception) because sizes of internal arrays do not fit
     714             :            to dimensions of KD-tree structure.
     715             : 
     716             :   -- ALGLIB --
     717             :      Copyright 18.03.2016 by Bochkanov Sergey
     718             : *************************************************************************/
     719           0 : void kdtreecreaterequestbuffer(const kdtree &kdt, kdtreerequestbuffer &buf, const xparams _xparams)
     720             : {
     721             :     jmp_buf _break_jump;
     722             :     alglib_impl::ae_state _alglib_env_state;
     723           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     724           0 :     if( setjmp(_break_jump) )
     725             :     {
     726             : #if !defined(AE_NO_EXCEPTIONS)
     727           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     728             : #else
     729             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
     730             :         return;
     731             : #endif
     732             :     }
     733           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     734           0 :     if( _xparams.flags!=0x0 )
     735           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     736           0 :     alglib_impl::kdtreecreaterequestbuffer(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), &_alglib_env_state);
     737           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     738           0 :     return;
     739             : }
     740             : 
     741             : /*************************************************************************
     742             : K-NN query: K nearest neighbors
     743             : 
     744             : IMPORTANT: this function can not be used in multithreaded code because  it
     745             :            uses internal temporary buffer of kd-tree object, which can not
     746             :            be shared between multiple threads.  If  you  want  to  perform
     747             :            parallel requests, use function  which  uses  external  request
     748             :            buffer: KDTreeTsQueryKNN() ("Ts" stands for "thread-safe").
     749             : 
     750             : INPUT PARAMETERS
     751             :     KDT         -   KD-tree
     752             :     X           -   point, array[0..NX-1].
     753             :     K           -   number of neighbors to return, K>=1
     754             :     SelfMatch   -   whether self-matches are allowed:
     755             :                     * if True, nearest neighbor may be the point itself
     756             :                       (if it exists in original dataset)
     757             :                     * if False, then only points with non-zero distance
     758             :                       are returned
     759             :                     * if not given, considered True
     760             : 
     761             : RESULT
     762             :     number of actual neighbors found (either K or N, if K>N).
     763             : 
     764             : This  subroutine  performs  query  and  stores  its result in the internal
     765             : structures of the KD-tree. You can use  following  subroutines  to  obtain
     766             : these results:
     767             : * KDTreeQueryResultsX() to get X-values
     768             : * KDTreeQueryResultsXY() to get X- and Y-values
     769             : * KDTreeQueryResultsTags() to get tag values
     770             : * KDTreeQueryResultsDistances() to get distances
     771             : 
     772             :   -- ALGLIB --
     773             :      Copyright 28.02.2010 by Bochkanov Sergey
     774             : *************************************************************************/
     775           0 : ae_int_t kdtreequeryknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const bool selfmatch, const xparams _xparams)
     776             : {
     777             :     jmp_buf _break_jump;
     778             :     alglib_impl::ae_state _alglib_env_state;
     779           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     780           0 :     if( setjmp(_break_jump) )
     781             :     {
     782             : #if !defined(AE_NO_EXCEPTIONS)
     783           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     784             : #else
     785             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
     786             :         return 0;
     787             : #endif
     788             :     }
     789           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     790           0 :     if( _xparams.flags!=0x0 )
     791           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     792           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, &_alglib_env_state);
     793           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     794           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
     795             : }
     796             : 
     797             : /*************************************************************************
     798             : K-NN query: K nearest neighbors
     799             : 
     800             : IMPORTANT: this function can not be used in multithreaded code because  it
     801             :            uses internal temporary buffer of kd-tree object, which can not
     802             :            be shared between multiple threads.  If  you  want  to  perform
     803             :            parallel requests, use function  which  uses  external  request
     804             :            buffer: KDTreeTsQueryKNN() ("Ts" stands for "thread-safe").
     805             : 
     806             : INPUT PARAMETERS
     807             :     KDT         -   KD-tree
     808             :     X           -   point, array[0..NX-1].
     809             :     K           -   number of neighbors to return, K>=1
     810             :     SelfMatch   -   whether self-matches are allowed:
     811             :                     * if True, nearest neighbor may be the point itself
     812             :                       (if it exists in original dataset)
     813             :                     * if False, then only points with non-zero distance
     814             :                       are returned
     815             :                     * if not given, considered True
     816             : 
     817             : RESULT
     818             :     number of actual neighbors found (either K or N, if K>N).
     819             : 
     820             : This  subroutine  performs  query  and  stores  its result in the internal
     821             : structures of the KD-tree. You can use  following  subroutines  to  obtain
     822             : these results:
     823             : * KDTreeQueryResultsX() to get X-values
     824             : * KDTreeQueryResultsXY() to get X- and Y-values
     825             : * KDTreeQueryResultsTags() to get tag values
     826             : * KDTreeQueryResultsDistances() to get distances
     827             : 
     828             :   -- ALGLIB --
     829             :      Copyright 28.02.2010 by Bochkanov Sergey
     830             : *************************************************************************/
     831             : #if !defined(AE_NO_EXCEPTIONS)
     832           0 : ae_int_t kdtreequeryknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const xparams _xparams)
     833             : {
     834             :     jmp_buf _break_jump;
     835             :     alglib_impl::ae_state _alglib_env_state;    
     836             :     bool selfmatch;
     837             : 
     838           0 :     selfmatch = true;
     839           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     840           0 :     if( setjmp(_break_jump) )
     841           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     842           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     843           0 :     if( _xparams.flags!=0x0 )
     844           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     845           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, &_alglib_env_state);
     846             : 
     847           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     848           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
     849             : }
     850             : #endif
     851             : 
     852             : /*************************************************************************
     853             : K-NN query: K nearest neighbors, using external thread-local buffer.
     854             : 
     855             : You can call this function from multiple threads for same kd-tree instance,
     856             : assuming that different instances of buffer object are passed to different
     857             : threads.
     858             : 
     859             : INPUT PARAMETERS
     860             :     KDT         -   kd-tree
     861             :     Buf         -   request buffer  object  created  for  this  particular
     862             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
     863             :                     function.
     864             :     X           -   point, array[0..NX-1].
     865             :     K           -   number of neighbors to return, K>=1
     866             :     SelfMatch   -   whether self-matches are allowed:
     867             :                     * if True, nearest neighbor may be the point itself
     868             :                       (if it exists in original dataset)
     869             :                     * if False, then only points with non-zero distance
     870             :                       are returned
     871             :                     * if not given, considered True
     872             : 
     873             : RESULT
     874             :     number of actual neighbors found (either K or N, if K>N).
     875             : 
     876             : This  subroutine  performs  query  and  stores  its result in the internal
     877             : structures  of  the  buffer object. You can use following  subroutines  to
     878             : obtain these results (pay attention to "buf" in their names):
     879             : * KDTreeTsQueryResultsX() to get X-values
     880             : * KDTreeTsQueryResultsXY() to get X- and Y-values
     881             : * KDTreeTsQueryResultsTags() to get tag values
     882             : * KDTreeTsQueryResultsDistances() to get distances
     883             : 
     884             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
     885             :            was used to initialize buffer. Any attempt to use biffer   with
     886             :            different object is dangerous - you  may  get  integrity  check
     887             :            failure (exception) because sizes of internal arrays do not fit
     888             :            to dimensions of KD-tree structure.
     889             : 
     890             :   -- ALGLIB --
     891             :      Copyright 18.03.2016 by Bochkanov Sergey
     892             : *************************************************************************/
     893           0 : ae_int_t kdtreetsqueryknn(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const ae_int_t k, const bool selfmatch, const xparams _xparams)
     894             : {
     895             :     jmp_buf _break_jump;
     896             :     alglib_impl::ae_state _alglib_env_state;
     897           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     898           0 :     if( setjmp(_break_jump) )
     899             :     {
     900             : #if !defined(AE_NO_EXCEPTIONS)
     901           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     902             : #else
     903             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
     904             :         return 0;
     905             : #endif
     906             :     }
     907           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     908           0 :     if( _xparams.flags!=0x0 )
     909           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     910           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, &_alglib_env_state);
     911           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     912           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
     913             : }
     914             : 
     915             : /*************************************************************************
     916             : K-NN query: K nearest neighbors, using external thread-local buffer.
     917             : 
     918             : You can call this function from multiple threads for same kd-tree instance,
     919             : assuming that different instances of buffer object are passed to different
     920             : threads.
     921             : 
     922             : INPUT PARAMETERS
     923             :     KDT         -   kd-tree
     924             :     Buf         -   request buffer  object  created  for  this  particular
     925             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
     926             :                     function.
     927             :     X           -   point, array[0..NX-1].
     928             :     K           -   number of neighbors to return, K>=1
     929             :     SelfMatch   -   whether self-matches are allowed:
     930             :                     * if True, nearest neighbor may be the point itself
     931             :                       (if it exists in original dataset)
     932             :                     * if False, then only points with non-zero distance
     933             :                       are returned
     934             :                     * if not given, considered True
     935             : 
     936             : RESULT
     937             :     number of actual neighbors found (either K or N, if K>N).
     938             : 
     939             : This  subroutine  performs  query  and  stores  its result in the internal
     940             : structures  of  the  buffer object. You can use following  subroutines  to
     941             : obtain these results (pay attention to "buf" in their names):
     942             : * KDTreeTsQueryResultsX() to get X-values
     943             : * KDTreeTsQueryResultsXY() to get X- and Y-values
     944             : * KDTreeTsQueryResultsTags() to get tag values
     945             : * KDTreeTsQueryResultsDistances() to get distances
     946             : 
     947             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
     948             :            was used to initialize buffer. Any attempt to use biffer   with
     949             :            different object is dangerous - you  may  get  integrity  check
     950             :            failure (exception) because sizes of internal arrays do not fit
     951             :            to dimensions of KD-tree structure.
     952             : 
     953             :   -- ALGLIB --
     954             :      Copyright 18.03.2016 by Bochkanov Sergey
     955             : *************************************************************************/
     956             : #if !defined(AE_NO_EXCEPTIONS)
     957           0 : ae_int_t kdtreetsqueryknn(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const ae_int_t k, const xparams _xparams)
     958             : {
     959             :     jmp_buf _break_jump;
     960             :     alglib_impl::ae_state _alglib_env_state;    
     961             :     bool selfmatch;
     962             : 
     963           0 :     selfmatch = true;
     964           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
     965           0 :     if( setjmp(_break_jump) )
     966           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
     967           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
     968           0 :     if( _xparams.flags!=0x0 )
     969           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
     970           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, &_alglib_env_state);
     971             : 
     972           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
     973           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
     974             : }
     975             : #endif
     976             : 
     977             : /*************************************************************************
     978             : R-NN query: all points within R-sphere centered at X, ordered by  distance
     979             : between point and X (by ascending).
     980             : 
     981             : NOTE: it is also possible to perform undordered queries performed by means
     982             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
     983             :       are faster because we do not have to use heap structure for sorting.
     984             : 
     985             : IMPORTANT: this function can not be used in multithreaded code because  it
     986             :            uses internal temporary buffer of kd-tree object, which can not
     987             :            be shared between multiple threads.  If  you  want  to  perform
     988             :            parallel requests, use function  which  uses  external  request
     989             :            buffer: kdtreetsqueryrnn() ("Ts" stands for "thread-safe").
     990             : 
     991             : INPUT PARAMETERS
     992             :     KDT         -   KD-tree
     993             :     X           -   point, array[0..NX-1].
     994             :     R           -   radius of sphere (in corresponding norm), R>0
     995             :     SelfMatch   -   whether self-matches are allowed:
     996             :                     * if True, nearest neighbor may be the point itself
     997             :                       (if it exists in original dataset)
     998             :                     * if False, then only points with non-zero distance
     999             :                       are returned
    1000             :                     * if not given, considered True
    1001             : 
    1002             : RESULT
    1003             :     number of neighbors found, >=0
    1004             : 
    1005             : This  subroutine  performs  query  and  stores  its result in the internal
    1006             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1007             : actual results:
    1008             : * KDTreeQueryResultsX() to get X-values
    1009             : * KDTreeQueryResultsXY() to get X- and Y-values
    1010             : * KDTreeQueryResultsTags() to get tag values
    1011             : * KDTreeQueryResultsDistances() to get distances
    1012             : 
    1013             :   -- ALGLIB --
    1014             :      Copyright 28.02.2010 by Bochkanov Sergey
    1015             : *************************************************************************/
    1016           0 : ae_int_t kdtreequeryrnn(const kdtree &kdt, const real_1d_array &x, const double r, const bool selfmatch, const xparams _xparams)
    1017             : {
    1018             :     jmp_buf _break_jump;
    1019             :     alglib_impl::ae_state _alglib_env_state;
    1020           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1021           0 :     if( setjmp(_break_jump) )
    1022             :     {
    1023             : #if !defined(AE_NO_EXCEPTIONS)
    1024           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1025             : #else
    1026             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1027             :         return 0;
    1028             : #endif
    1029             :     }
    1030           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1031           0 :     if( _xparams.flags!=0x0 )
    1032           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1033           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryrnn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1034           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1035           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1036             : }
    1037             : 
    1038             : /*************************************************************************
    1039             : R-NN query: all points within R-sphere centered at X, ordered by  distance
    1040             : between point and X (by ascending).
    1041             : 
    1042             : NOTE: it is also possible to perform undordered queries performed by means
    1043             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
    1044             :       are faster because we do not have to use heap structure for sorting.
    1045             : 
    1046             : IMPORTANT: this function can not be used in multithreaded code because  it
    1047             :            uses internal temporary buffer of kd-tree object, which can not
    1048             :            be shared between multiple threads.  If  you  want  to  perform
    1049             :            parallel requests, use function  which  uses  external  request
    1050             :            buffer: kdtreetsqueryrnn() ("Ts" stands for "thread-safe").
    1051             : 
    1052             : INPUT PARAMETERS
    1053             :     KDT         -   KD-tree
    1054             :     X           -   point, array[0..NX-1].
    1055             :     R           -   radius of sphere (in corresponding norm), R>0
    1056             :     SelfMatch   -   whether self-matches are allowed:
    1057             :                     * if True, nearest neighbor may be the point itself
    1058             :                       (if it exists in original dataset)
    1059             :                     * if False, then only points with non-zero distance
    1060             :                       are returned
    1061             :                     * if not given, considered True
    1062             : 
    1063             : RESULT
    1064             :     number of neighbors found, >=0
    1065             : 
    1066             : This  subroutine  performs  query  and  stores  its result in the internal
    1067             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1068             : actual results:
    1069             : * KDTreeQueryResultsX() to get X-values
    1070             : * KDTreeQueryResultsXY() to get X- and Y-values
    1071             : * KDTreeQueryResultsTags() to get tag values
    1072             : * KDTreeQueryResultsDistances() to get distances
    1073             : 
    1074             :   -- ALGLIB --
    1075             :      Copyright 28.02.2010 by Bochkanov Sergey
    1076             : *************************************************************************/
    1077             : #if !defined(AE_NO_EXCEPTIONS)
    1078           0 : ae_int_t kdtreequeryrnn(const kdtree &kdt, const real_1d_array &x, const double r, const xparams _xparams)
    1079             : {
    1080             :     jmp_buf _break_jump;
    1081             :     alglib_impl::ae_state _alglib_env_state;    
    1082             :     bool selfmatch;
    1083             : 
    1084           0 :     selfmatch = true;
    1085           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1086           0 :     if( setjmp(_break_jump) )
    1087           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1088           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1089           0 :     if( _xparams.flags!=0x0 )
    1090           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1091           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryrnn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1092             : 
    1093           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1094           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1095             : }
    1096             : #endif
    1097             : 
    1098             : /*************************************************************************
    1099             : R-NN query: all points within R-sphere  centered  at  X,  no  ordering  by
    1100             : distance as undicated by "U" suffix (faster that ordered query, for  large
    1101             : queries - significantly faster).
    1102             : 
    1103             : IMPORTANT: this function can not be used in multithreaded code because  it
    1104             :            uses internal temporary buffer of kd-tree object, which can not
    1105             :            be shared between multiple threads.  If  you  want  to  perform
    1106             :            parallel requests, use function  which  uses  external  request
    1107             :            buffer: kdtreetsqueryrnn() ("Ts" stands for "thread-safe").
    1108             : 
    1109             : INPUT PARAMETERS
    1110             :     KDT         -   KD-tree
    1111             :     X           -   point, array[0..NX-1].
    1112             :     R           -   radius of sphere (in corresponding norm), R>0
    1113             :     SelfMatch   -   whether self-matches are allowed:
    1114             :                     * if True, nearest neighbor may be the point itself
    1115             :                       (if it exists in original dataset)
    1116             :                     * if False, then only points with non-zero distance
    1117             :                       are returned
    1118             :                     * if not given, considered True
    1119             : 
    1120             : RESULT
    1121             :     number of neighbors found, >=0
    1122             : 
    1123             : This  subroutine  performs  query  and  stores  its result in the internal
    1124             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1125             : actual results:
    1126             : * KDTreeQueryResultsX() to get X-values
    1127             : * KDTreeQueryResultsXY() to get X- and Y-values
    1128             : * KDTreeQueryResultsTags() to get tag values
    1129             : * KDTreeQueryResultsDistances() to get distances
    1130             : 
    1131             : As indicated by "U" suffix, this function returns unordered results.
    1132             : 
    1133             :   -- ALGLIB --
    1134             :      Copyright 01.11.2018 by Bochkanov Sergey
    1135             : *************************************************************************/
    1136           0 : ae_int_t kdtreequeryrnnu(const kdtree &kdt, const real_1d_array &x, const double r, const bool selfmatch, const xparams _xparams)
    1137             : {
    1138             :     jmp_buf _break_jump;
    1139             :     alglib_impl::ae_state _alglib_env_state;
    1140           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1141           0 :     if( setjmp(_break_jump) )
    1142             :     {
    1143             : #if !defined(AE_NO_EXCEPTIONS)
    1144           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1145             : #else
    1146             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1147             :         return 0;
    1148             : #endif
    1149             :     }
    1150           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1151           0 :     if( _xparams.flags!=0x0 )
    1152           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1153           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryrnnu(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1154           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1155           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1156             : }
    1157             : 
    1158             : /*************************************************************************
    1159             : R-NN query: all points within R-sphere  centered  at  X,  no  ordering  by
    1160             : distance as undicated by "U" suffix (faster that ordered query, for  large
    1161             : queries - significantly faster).
    1162             : 
    1163             : IMPORTANT: this function can not be used in multithreaded code because  it
    1164             :            uses internal temporary buffer of kd-tree object, which can not
    1165             :            be shared between multiple threads.  If  you  want  to  perform
    1166             :            parallel requests, use function  which  uses  external  request
    1167             :            buffer: kdtreetsqueryrnn() ("Ts" stands for "thread-safe").
    1168             : 
    1169             : INPUT PARAMETERS
    1170             :     KDT         -   KD-tree
    1171             :     X           -   point, array[0..NX-1].
    1172             :     R           -   radius of sphere (in corresponding norm), R>0
    1173             :     SelfMatch   -   whether self-matches are allowed:
    1174             :                     * if True, nearest neighbor may be the point itself
    1175             :                       (if it exists in original dataset)
    1176             :                     * if False, then only points with non-zero distance
    1177             :                       are returned
    1178             :                     * if not given, considered True
    1179             : 
    1180             : RESULT
    1181             :     number of neighbors found, >=0
    1182             : 
    1183             : This  subroutine  performs  query  and  stores  its result in the internal
    1184             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1185             : actual results:
    1186             : * KDTreeQueryResultsX() to get X-values
    1187             : * KDTreeQueryResultsXY() to get X- and Y-values
    1188             : * KDTreeQueryResultsTags() to get tag values
    1189             : * KDTreeQueryResultsDistances() to get distances
    1190             : 
    1191             : As indicated by "U" suffix, this function returns unordered results.
    1192             : 
    1193             :   -- ALGLIB --
    1194             :      Copyright 01.11.2018 by Bochkanov Sergey
    1195             : *************************************************************************/
    1196             : #if !defined(AE_NO_EXCEPTIONS)
    1197           0 : ae_int_t kdtreequeryrnnu(const kdtree &kdt, const real_1d_array &x, const double r, const xparams _xparams)
    1198             : {
    1199             :     jmp_buf _break_jump;
    1200             :     alglib_impl::ae_state _alglib_env_state;    
    1201             :     bool selfmatch;
    1202             : 
    1203           0 :     selfmatch = true;
    1204           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1205           0 :     if( setjmp(_break_jump) )
    1206           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1207           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1208           0 :     if( _xparams.flags!=0x0 )
    1209           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1210           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryrnnu(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1211             : 
    1212           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1213           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1214             : }
    1215             : #endif
    1216             : 
    1217             : /*************************************************************************
    1218             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    1219             : thread-local buffer, sorted by distance between point and X (by ascending)
    1220             : 
    1221             : You can call this function from multiple threads for same kd-tree instance,
    1222             : assuming that different instances of buffer object are passed to different
    1223             : threads.
    1224             : 
    1225             : NOTE: it is also possible to perform undordered queries performed by means
    1226             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
    1227             :       are faster because we do not have to use heap structure for sorting.
    1228             : 
    1229             : INPUT PARAMETERS
    1230             :     KDT         -   KD-tree
    1231             :     Buf         -   request buffer  object  created  for  this  particular
    1232             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1233             :                     function.
    1234             :     X           -   point, array[0..NX-1].
    1235             :     R           -   radius of sphere (in corresponding norm), R>0
    1236             :     SelfMatch   -   whether self-matches are allowed:
    1237             :                     * if True, nearest neighbor may be the point itself
    1238             :                       (if it exists in original dataset)
    1239             :                     * if False, then only points with non-zero distance
    1240             :                       are returned
    1241             :                     * if not given, considered True
    1242             : 
    1243             : RESULT
    1244             :     number of neighbors found, >=0
    1245             : 
    1246             : This  subroutine  performs  query  and  stores  its result in the internal
    1247             : structures  of  the  buffer object. You can use following  subroutines  to
    1248             : obtain these results (pay attention to "buf" in their names):
    1249             : * KDTreeTsQueryResultsX() to get X-values
    1250             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1251             : * KDTreeTsQueryResultsTags() to get tag values
    1252             : * KDTreeTsQueryResultsDistances() to get distances
    1253             : 
    1254             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1255             :            was used to initialize buffer. Any attempt to use biffer   with
    1256             :            different object is dangerous - you  may  get  integrity  check
    1257             :            failure (exception) because sizes of internal arrays do not fit
    1258             :            to dimensions of KD-tree structure.
    1259             : 
    1260             :   -- ALGLIB --
    1261             :      Copyright 18.03.2016 by Bochkanov Sergey
    1262             : *************************************************************************/
    1263           0 : ae_int_t kdtreetsqueryrnn(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const double r, const bool selfmatch, const xparams _xparams)
    1264             : {
    1265             :     jmp_buf _break_jump;
    1266             :     alglib_impl::ae_state _alglib_env_state;
    1267           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1268           0 :     if( setjmp(_break_jump) )
    1269             :     {
    1270             : #if !defined(AE_NO_EXCEPTIONS)
    1271           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1272             : #else
    1273             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1274             :         return 0;
    1275             : #endif
    1276             :     }
    1277           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1278           0 :     if( _xparams.flags!=0x0 )
    1279           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1280           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryrnn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1281           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1282           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1283             : }
    1284             : 
    1285             : /*************************************************************************
    1286             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    1287             : thread-local buffer, sorted by distance between point and X (by ascending)
    1288             : 
    1289             : You can call this function from multiple threads for same kd-tree instance,
    1290             : assuming that different instances of buffer object are passed to different
    1291             : threads.
    1292             : 
    1293             : NOTE: it is also possible to perform undordered queries performed by means
    1294             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
    1295             :       are faster because we do not have to use heap structure for sorting.
    1296             : 
    1297             : INPUT PARAMETERS
    1298             :     KDT         -   KD-tree
    1299             :     Buf         -   request buffer  object  created  for  this  particular
    1300             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1301             :                     function.
    1302             :     X           -   point, array[0..NX-1].
    1303             :     R           -   radius of sphere (in corresponding norm), R>0
    1304             :     SelfMatch   -   whether self-matches are allowed:
    1305             :                     * if True, nearest neighbor may be the point itself
    1306             :                       (if it exists in original dataset)
    1307             :                     * if False, then only points with non-zero distance
    1308             :                       are returned
    1309             :                     * if not given, considered True
    1310             : 
    1311             : RESULT
    1312             :     number of neighbors found, >=0
    1313             : 
    1314             : This  subroutine  performs  query  and  stores  its result in the internal
    1315             : structures  of  the  buffer object. You can use following  subroutines  to
    1316             : obtain these results (pay attention to "buf" in their names):
    1317             : * KDTreeTsQueryResultsX() to get X-values
    1318             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1319             : * KDTreeTsQueryResultsTags() to get tag values
    1320             : * KDTreeTsQueryResultsDistances() to get distances
    1321             : 
    1322             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1323             :            was used to initialize buffer. Any attempt to use biffer   with
    1324             :            different object is dangerous - you  may  get  integrity  check
    1325             :            failure (exception) because sizes of internal arrays do not fit
    1326             :            to dimensions of KD-tree structure.
    1327             : 
    1328             :   -- ALGLIB --
    1329             :      Copyright 18.03.2016 by Bochkanov Sergey
    1330             : *************************************************************************/
    1331             : #if !defined(AE_NO_EXCEPTIONS)
    1332           0 : ae_int_t kdtreetsqueryrnn(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const double r, const xparams _xparams)
    1333             : {
    1334             :     jmp_buf _break_jump;
    1335             :     alglib_impl::ae_state _alglib_env_state;    
    1336             :     bool selfmatch;
    1337             : 
    1338           0 :     selfmatch = true;
    1339           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1340           0 :     if( setjmp(_break_jump) )
    1341           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1342           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1343           0 :     if( _xparams.flags!=0x0 )
    1344           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1345           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryrnn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1346             : 
    1347           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1348           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1349             : }
    1350             : #endif
    1351             : 
    1352             : /*************************************************************************
    1353             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    1354             : thread-local buffer, no ordering by distance as undicated  by  "U"  suffix
    1355             : (faster that ordered query, for large queries - significantly faster).
    1356             : 
    1357             : You can call this function from multiple threads for same kd-tree instance,
    1358             : assuming that different instances of buffer object are passed to different
    1359             : threads.
    1360             : 
    1361             : INPUT PARAMETERS
    1362             :     KDT         -   KD-tree
    1363             :     Buf         -   request buffer  object  created  for  this  particular
    1364             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1365             :                     function.
    1366             :     X           -   point, array[0..NX-1].
    1367             :     R           -   radius of sphere (in corresponding norm), R>0
    1368             :     SelfMatch   -   whether self-matches are allowed:
    1369             :                     * if True, nearest neighbor may be the point itself
    1370             :                       (if it exists in original dataset)
    1371             :                     * if False, then only points with non-zero distance
    1372             :                       are returned
    1373             :                     * if not given, considered True
    1374             : 
    1375             : RESULT
    1376             :     number of neighbors found, >=0
    1377             : 
    1378             : This  subroutine  performs  query  and  stores  its result in the internal
    1379             : structures  of  the  buffer object. You can use following  subroutines  to
    1380             : obtain these results (pay attention to "buf" in their names):
    1381             : * KDTreeTsQueryResultsX() to get X-values
    1382             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1383             : * KDTreeTsQueryResultsTags() to get tag values
    1384             : * KDTreeTsQueryResultsDistances() to get distances
    1385             : 
    1386             : As indicated by "U" suffix, this function returns unordered results.
    1387             : 
    1388             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1389             :            was used to initialize buffer. Any attempt to use biffer   with
    1390             :            different object is dangerous - you  may  get  integrity  check
    1391             :            failure (exception) because sizes of internal arrays do not fit
    1392             :            to dimensions of KD-tree structure.
    1393             : 
    1394             :   -- ALGLIB --
    1395             :      Copyright 18.03.2016 by Bochkanov Sergey
    1396             : *************************************************************************/
    1397           0 : ae_int_t kdtreetsqueryrnnu(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const double r, const bool selfmatch, const xparams _xparams)
    1398             : {
    1399             :     jmp_buf _break_jump;
    1400             :     alglib_impl::ae_state _alglib_env_state;
    1401           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1402           0 :     if( setjmp(_break_jump) )
    1403             :     {
    1404             : #if !defined(AE_NO_EXCEPTIONS)
    1405           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1406             : #else
    1407             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1408             :         return 0;
    1409             : #endif
    1410             :     }
    1411           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1412           0 :     if( _xparams.flags!=0x0 )
    1413           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1414           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryrnnu(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1415           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1416           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1417             : }
    1418             : 
    1419             : /*************************************************************************
    1420             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    1421             : thread-local buffer, no ordering by distance as undicated  by  "U"  suffix
    1422             : (faster that ordered query, for large queries - significantly faster).
    1423             : 
    1424             : You can call this function from multiple threads for same kd-tree instance,
    1425             : assuming that different instances of buffer object are passed to different
    1426             : threads.
    1427             : 
    1428             : INPUT PARAMETERS
    1429             :     KDT         -   KD-tree
    1430             :     Buf         -   request buffer  object  created  for  this  particular
    1431             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1432             :                     function.
    1433             :     X           -   point, array[0..NX-1].
    1434             :     R           -   radius of sphere (in corresponding norm), R>0
    1435             :     SelfMatch   -   whether self-matches are allowed:
    1436             :                     * if True, nearest neighbor may be the point itself
    1437             :                       (if it exists in original dataset)
    1438             :                     * if False, then only points with non-zero distance
    1439             :                       are returned
    1440             :                     * if not given, considered True
    1441             : 
    1442             : RESULT
    1443             :     number of neighbors found, >=0
    1444             : 
    1445             : This  subroutine  performs  query  and  stores  its result in the internal
    1446             : structures  of  the  buffer object. You can use following  subroutines  to
    1447             : obtain these results (pay attention to "buf" in their names):
    1448             : * KDTreeTsQueryResultsX() to get X-values
    1449             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1450             : * KDTreeTsQueryResultsTags() to get tag values
    1451             : * KDTreeTsQueryResultsDistances() to get distances
    1452             : 
    1453             : As indicated by "U" suffix, this function returns unordered results.
    1454             : 
    1455             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1456             :            was used to initialize buffer. Any attempt to use biffer   with
    1457             :            different object is dangerous - you  may  get  integrity  check
    1458             :            failure (exception) because sizes of internal arrays do not fit
    1459             :            to dimensions of KD-tree structure.
    1460             : 
    1461             :   -- ALGLIB --
    1462             :      Copyright 18.03.2016 by Bochkanov Sergey
    1463             : *************************************************************************/
    1464             : #if !defined(AE_NO_EXCEPTIONS)
    1465           0 : ae_int_t kdtreetsqueryrnnu(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const double r, const xparams _xparams)
    1466             : {
    1467             :     jmp_buf _break_jump;
    1468             :     alglib_impl::ae_state _alglib_env_state;    
    1469             :     bool selfmatch;
    1470             : 
    1471           0 :     selfmatch = true;
    1472           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1473           0 :     if( setjmp(_break_jump) )
    1474           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1475           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1476           0 :     if( _xparams.flags!=0x0 )
    1477           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1478           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryrnnu(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), r, selfmatch, &_alglib_env_state);
    1479             : 
    1480           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1481           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1482             : }
    1483             : #endif
    1484             : 
    1485             : /*************************************************************************
    1486             : K-NN query: approximate K nearest neighbors
    1487             : 
    1488             : IMPORTANT: this function can not be used in multithreaded code because  it
    1489             :            uses internal temporary buffer of kd-tree object, which can not
    1490             :            be shared between multiple threads.  If  you  want  to  perform
    1491             :            parallel requests, use function  which  uses  external  request
    1492             :            buffer: KDTreeTsQueryAKNN() ("Ts" stands for "thread-safe").
    1493             : 
    1494             : INPUT PARAMETERS
    1495             :     KDT         -   KD-tree
    1496             :     X           -   point, array[0..NX-1].
    1497             :     K           -   number of neighbors to return, K>=1
    1498             :     SelfMatch   -   whether self-matches are allowed:
    1499             :                     * if True, nearest neighbor may be the point itself
    1500             :                       (if it exists in original dataset)
    1501             :                     * if False, then only points with non-zero distance
    1502             :                       are returned
    1503             :                     * if not given, considered True
    1504             :     Eps         -   approximation factor, Eps>=0. eps-approximate  nearest
    1505             :                     neighbor  is  a  neighbor  whose distance from X is at
    1506             :                     most (1+eps) times distance of true nearest neighbor.
    1507             : 
    1508             : RESULT
    1509             :     number of actual neighbors found (either K or N, if K>N).
    1510             : 
    1511             : NOTES
    1512             :     significant performance gain may be achieved only when Eps  is  is  on
    1513             :     the order of magnitude of 1 or larger.
    1514             : 
    1515             : This  subroutine  performs  query  and  stores  its result in the internal
    1516             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1517             : these results:
    1518             : * KDTreeQueryResultsX() to get X-values
    1519             : * KDTreeQueryResultsXY() to get X- and Y-values
    1520             : * KDTreeQueryResultsTags() to get tag values
    1521             : * KDTreeQueryResultsDistances() to get distances
    1522             : 
    1523             :   -- ALGLIB --
    1524             :      Copyright 28.02.2010 by Bochkanov Sergey
    1525             : *************************************************************************/
    1526           0 : ae_int_t kdtreequeryaknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const bool selfmatch, const double eps, const xparams _xparams)
    1527             : {
    1528             :     jmp_buf _break_jump;
    1529             :     alglib_impl::ae_state _alglib_env_state;
    1530           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1531           0 :     if( setjmp(_break_jump) )
    1532             :     {
    1533             : #if !defined(AE_NO_EXCEPTIONS)
    1534           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1535             : #else
    1536             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1537             :         return 0;
    1538             : #endif
    1539             :     }
    1540           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1541           0 :     if( _xparams.flags!=0x0 )
    1542           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1543           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryaknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, eps, &_alglib_env_state);
    1544           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1545           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1546             : }
    1547             : 
    1548             : /*************************************************************************
    1549             : K-NN query: approximate K nearest neighbors
    1550             : 
    1551             : IMPORTANT: this function can not be used in multithreaded code because  it
    1552             :            uses internal temporary buffer of kd-tree object, which can not
    1553             :            be shared between multiple threads.  If  you  want  to  perform
    1554             :            parallel requests, use function  which  uses  external  request
    1555             :            buffer: KDTreeTsQueryAKNN() ("Ts" stands for "thread-safe").
    1556             : 
    1557             : INPUT PARAMETERS
    1558             :     KDT         -   KD-tree
    1559             :     X           -   point, array[0..NX-1].
    1560             :     K           -   number of neighbors to return, K>=1
    1561             :     SelfMatch   -   whether self-matches are allowed:
    1562             :                     * if True, nearest neighbor may be the point itself
    1563             :                       (if it exists in original dataset)
    1564             :                     * if False, then only points with non-zero distance
    1565             :                       are returned
    1566             :                     * if not given, considered True
    1567             :     Eps         -   approximation factor, Eps>=0. eps-approximate  nearest
    1568             :                     neighbor  is  a  neighbor  whose distance from X is at
    1569             :                     most (1+eps) times distance of true nearest neighbor.
    1570             : 
    1571             : RESULT
    1572             :     number of actual neighbors found (either K or N, if K>N).
    1573             : 
    1574             : NOTES
    1575             :     significant performance gain may be achieved only when Eps  is  is  on
    1576             :     the order of magnitude of 1 or larger.
    1577             : 
    1578             : This  subroutine  performs  query  and  stores  its result in the internal
    1579             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1580             : these results:
    1581             : * KDTreeQueryResultsX() to get X-values
    1582             : * KDTreeQueryResultsXY() to get X- and Y-values
    1583             : * KDTreeQueryResultsTags() to get tag values
    1584             : * KDTreeQueryResultsDistances() to get distances
    1585             : 
    1586             :   -- ALGLIB --
    1587             :      Copyright 28.02.2010 by Bochkanov Sergey
    1588             : *************************************************************************/
    1589             : #if !defined(AE_NO_EXCEPTIONS)
    1590           0 : ae_int_t kdtreequeryaknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const double eps, const xparams _xparams)
    1591             : {
    1592             :     jmp_buf _break_jump;
    1593             :     alglib_impl::ae_state _alglib_env_state;    
    1594             :     bool selfmatch;
    1595             : 
    1596           0 :     selfmatch = true;
    1597           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1598           0 :     if( setjmp(_break_jump) )
    1599           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1600           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1601           0 :     if( _xparams.flags!=0x0 )
    1602           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1603           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequeryaknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, eps, &_alglib_env_state);
    1604             : 
    1605           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1606           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1607             : }
    1608             : #endif
    1609             : 
    1610             : /*************************************************************************
    1611             : K-NN query: approximate K nearest neighbors, using thread-local buffer.
    1612             : 
    1613             : You can call this function from multiple threads for same kd-tree instance,
    1614             : assuming that different instances of buffer object are passed to different
    1615             : threads.
    1616             : 
    1617             : INPUT PARAMETERS
    1618             :     KDT         -   KD-tree
    1619             :     Buf         -   request buffer  object  created  for  this  particular
    1620             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1621             :                     function.
    1622             :     X           -   point, array[0..NX-1].
    1623             :     K           -   number of neighbors to return, K>=1
    1624             :     SelfMatch   -   whether self-matches are allowed:
    1625             :                     * if True, nearest neighbor may be the point itself
    1626             :                       (if it exists in original dataset)
    1627             :                     * if False, then only points with non-zero distance
    1628             :                       are returned
    1629             :                     * if not given, considered True
    1630             :     Eps         -   approximation factor, Eps>=0. eps-approximate  nearest
    1631             :                     neighbor  is  a  neighbor  whose distance from X is at
    1632             :                     most (1+eps) times distance of true nearest neighbor.
    1633             : 
    1634             : RESULT
    1635             :     number of actual neighbors found (either K or N, if K>N).
    1636             : 
    1637             : NOTES
    1638             :     significant performance gain may be achieved only when Eps  is  is  on
    1639             :     the order of magnitude of 1 or larger.
    1640             : 
    1641             : This  subroutine  performs  query  and  stores  its result in the internal
    1642             : structures  of  the  buffer object. You can use following  subroutines  to
    1643             : obtain these results (pay attention to "buf" in their names):
    1644             : * KDTreeTsQueryResultsX() to get X-values
    1645             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1646             : * KDTreeTsQueryResultsTags() to get tag values
    1647             : * KDTreeTsQueryResultsDistances() to get distances
    1648             : 
    1649             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1650             :            was used to initialize buffer. Any attempt to use biffer   with
    1651             :            different object is dangerous - you  may  get  integrity  check
    1652             :            failure (exception) because sizes of internal arrays do not fit
    1653             :            to dimensions of KD-tree structure.
    1654             : 
    1655             :   -- ALGLIB --
    1656             :      Copyright 18.03.2016 by Bochkanov Sergey
    1657             : *************************************************************************/
    1658           0 : ae_int_t kdtreetsqueryaknn(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const ae_int_t k, const bool selfmatch, const double eps, const xparams _xparams)
    1659             : {
    1660             :     jmp_buf _break_jump;
    1661             :     alglib_impl::ae_state _alglib_env_state;
    1662           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1663           0 :     if( setjmp(_break_jump) )
    1664             :     {
    1665             : #if !defined(AE_NO_EXCEPTIONS)
    1666           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1667             : #else
    1668             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1669             :         return 0;
    1670             : #endif
    1671             :     }
    1672           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1673           0 :     if( _xparams.flags!=0x0 )
    1674           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1675           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryaknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, eps, &_alglib_env_state);
    1676           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1677           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1678             : }
    1679             : 
    1680             : /*************************************************************************
    1681             : K-NN query: approximate K nearest neighbors, using thread-local buffer.
    1682             : 
    1683             : You can call this function from multiple threads for same kd-tree instance,
    1684             : assuming that different instances of buffer object are passed to different
    1685             : threads.
    1686             : 
    1687             : INPUT PARAMETERS
    1688             :     KDT         -   KD-tree
    1689             :     Buf         -   request buffer  object  created  for  this  particular
    1690             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1691             :                     function.
    1692             :     X           -   point, array[0..NX-1].
    1693             :     K           -   number of neighbors to return, K>=1
    1694             :     SelfMatch   -   whether self-matches are allowed:
    1695             :                     * if True, nearest neighbor may be the point itself
    1696             :                       (if it exists in original dataset)
    1697             :                     * if False, then only points with non-zero distance
    1698             :                       are returned
    1699             :                     * if not given, considered True
    1700             :     Eps         -   approximation factor, Eps>=0. eps-approximate  nearest
    1701             :                     neighbor  is  a  neighbor  whose distance from X is at
    1702             :                     most (1+eps) times distance of true nearest neighbor.
    1703             : 
    1704             : RESULT
    1705             :     number of actual neighbors found (either K or N, if K>N).
    1706             : 
    1707             : NOTES
    1708             :     significant performance gain may be achieved only when Eps  is  is  on
    1709             :     the order of magnitude of 1 or larger.
    1710             : 
    1711             : This  subroutine  performs  query  and  stores  its result in the internal
    1712             : structures  of  the  buffer object. You can use following  subroutines  to
    1713             : obtain these results (pay attention to "buf" in their names):
    1714             : * KDTreeTsQueryResultsX() to get X-values
    1715             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1716             : * KDTreeTsQueryResultsTags() to get tag values
    1717             : * KDTreeTsQueryResultsDistances() to get distances
    1718             : 
    1719             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1720             :            was used to initialize buffer. Any attempt to use biffer   with
    1721             :            different object is dangerous - you  may  get  integrity  check
    1722             :            failure (exception) because sizes of internal arrays do not fit
    1723             :            to dimensions of KD-tree structure.
    1724             : 
    1725             :   -- ALGLIB --
    1726             :      Copyright 18.03.2016 by Bochkanov Sergey
    1727             : *************************************************************************/
    1728             : #if !defined(AE_NO_EXCEPTIONS)
    1729           0 : ae_int_t kdtreetsqueryaknn(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &x, const ae_int_t k, const double eps, const xparams _xparams)
    1730             : {
    1731             :     jmp_buf _break_jump;
    1732             :     alglib_impl::ae_state _alglib_env_state;    
    1733             :     bool selfmatch;
    1734             : 
    1735           0 :     selfmatch = true;
    1736           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1737           0 :     if( setjmp(_break_jump) )
    1738           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1739           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1740           0 :     if( _xparams.flags!=0x0 )
    1741           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1742           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsqueryaknn(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), k, selfmatch, eps, &_alglib_env_state);
    1743             : 
    1744           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1745           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1746             : }
    1747             : #endif
    1748             : 
    1749             : /*************************************************************************
    1750             : Box query: all points within user-specified box.
    1751             : 
    1752             : IMPORTANT: this function can not be used in multithreaded code because  it
    1753             :            uses internal temporary buffer of kd-tree object, which can not
    1754             :            be shared between multiple threads.  If  you  want  to  perform
    1755             :            parallel requests, use function  which  uses  external  request
    1756             :            buffer: KDTreeTsQueryBox() ("Ts" stands for "thread-safe").
    1757             : 
    1758             : INPUT PARAMETERS
    1759             :     KDT         -   KD-tree
    1760             :     BoxMin      -   lower bounds, array[0..NX-1].
    1761             :     BoxMax      -   upper bounds, array[0..NX-1].
    1762             : 
    1763             : 
    1764             : RESULT
    1765             :     number of actual neighbors found (in [0,N]).
    1766             : 
    1767             : This  subroutine  performs  query  and  stores  its result in the internal
    1768             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    1769             : these results:
    1770             : * KDTreeQueryResultsX() to get X-values
    1771             : * KDTreeQueryResultsXY() to get X- and Y-values
    1772             : * KDTreeQueryResultsTags() to get tag values
    1773             : * KDTreeQueryResultsDistances() returns zeros for this request
    1774             : 
    1775             : NOTE: this particular query returns unordered results, because there is no
    1776             :       meaningful way of  ordering  points.  Furthermore,  no 'distance' is
    1777             :       associated with points - it is either INSIDE  or OUTSIDE (so request
    1778             :       for distances will return zeros).
    1779             : 
    1780             :   -- ALGLIB --
    1781             :      Copyright 14.05.2016 by Bochkanov Sergey
    1782             : *************************************************************************/
    1783           0 : ae_int_t kdtreequerybox(const kdtree &kdt, const real_1d_array &boxmin, const real_1d_array &boxmax, const xparams _xparams)
    1784             : {
    1785             :     jmp_buf _break_jump;
    1786             :     alglib_impl::ae_state _alglib_env_state;
    1787           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1788           0 :     if( setjmp(_break_jump) )
    1789             :     {
    1790             : #if !defined(AE_NO_EXCEPTIONS)
    1791           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1792             : #else
    1793             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1794             :         return 0;
    1795             : #endif
    1796             :     }
    1797           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1798           0 :     if( _xparams.flags!=0x0 )
    1799           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1800           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreequerybox(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(boxmin.c_ptr()), const_cast<alglib_impl::ae_vector*>(boxmax.c_ptr()), &_alglib_env_state);
    1801           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1802           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1803             : }
    1804             : 
    1805             : /*************************************************************************
    1806             : Box query: all points within user-specified box, using thread-local buffer.
    1807             : 
    1808             : You can call this function from multiple threads for same kd-tree instance,
    1809             : assuming that different instances of buffer object are passed to different
    1810             : threads.
    1811             : 
    1812             : INPUT PARAMETERS
    1813             :     KDT         -   KD-tree
    1814             :     Buf         -   request buffer  object  created  for  this  particular
    1815             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    1816             :                     function.
    1817             :     BoxMin      -   lower bounds, array[0..NX-1].
    1818             :     BoxMax      -   upper bounds, array[0..NX-1].
    1819             : 
    1820             : RESULT
    1821             :     number of actual neighbors found (in [0,N]).
    1822             : 
    1823             : This  subroutine  performs  query  and  stores  its result in the internal
    1824             : structures  of  the  buffer object. You can use following  subroutines  to
    1825             : obtain these results (pay attention to "ts" in their names):
    1826             : * KDTreeTsQueryResultsX() to get X-values
    1827             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    1828             : * KDTreeTsQueryResultsTags() to get tag values
    1829             : * KDTreeTsQueryResultsDistances() returns zeros for this query
    1830             : 
    1831             : NOTE: this particular query returns unordered results, because there is no
    1832             :       meaningful way of  ordering  points.  Furthermore,  no 'distance' is
    1833             :       associated with points - it is either INSIDE  or OUTSIDE (so request
    1834             :       for distances will return zeros).
    1835             : 
    1836             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    1837             :            was used to initialize buffer. Any attempt to use biffer   with
    1838             :            different object is dangerous - you  may  get  integrity  check
    1839             :            failure (exception) because sizes of internal arrays do not fit
    1840             :            to dimensions of KD-tree structure.
    1841             : 
    1842             :   -- ALGLIB --
    1843             :      Copyright 14.05.2016 by Bochkanov Sergey
    1844             : *************************************************************************/
    1845           0 : ae_int_t kdtreetsquerybox(const kdtree &kdt, const kdtreerequestbuffer &buf, const real_1d_array &boxmin, const real_1d_array &boxmax, const xparams _xparams)
    1846             : {
    1847             :     jmp_buf _break_jump;
    1848             :     alglib_impl::ae_state _alglib_env_state;
    1849           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1850           0 :     if( setjmp(_break_jump) )
    1851             :     {
    1852             : #if !defined(AE_NO_EXCEPTIONS)
    1853           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1854             : #else
    1855             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1856             :         return 0;
    1857             : #endif
    1858             :     }
    1859           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1860           0 :     if( _xparams.flags!=0x0 )
    1861           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1862           0 :     alglib_impl::ae_int_t result = alglib_impl::kdtreetsquerybox(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(boxmin.c_ptr()), const_cast<alglib_impl::ae_vector*>(boxmax.c_ptr()), &_alglib_env_state);
    1863           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1864           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    1865             : }
    1866             : 
    1867             : /*************************************************************************
    1868             : X-values from last query.
    1869             : 
    1870             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    1871             : object. If you performed buffered requests (ones which  use  instances  of
    1872             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    1873             : function - kdtreetsqueryresultsx().
    1874             : 
    1875             : INPUT PARAMETERS
    1876             :     KDT     -   KD-tree
    1877             :     X       -   possibly pre-allocated buffer. If X is too small to store
    1878             :                 result, it is resized. If size(X) is enough to store
    1879             :                 result, it is left unchanged.
    1880             : 
    1881             : OUTPUT PARAMETERS
    1882             :     X       -   rows are filled with X-values
    1883             : 
    1884             : NOTES
    1885             : 1. points are ordered by distance from the query point (first = closest)
    1886             : 2. if  XY is larger than required to store result, only leading part  will
    1887             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    1888             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    1889             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    1890             :    you want function  to  resize  array  according  to  result  size,  use
    1891             :    function with same name and suffix 'I'.
    1892             : 
    1893             : SEE ALSO
    1894             : * KDTreeQueryResultsXY()            X- and Y-values
    1895             : * KDTreeQueryResultsTags()          tag values
    1896             : * KDTreeQueryResultsDistances()     distances
    1897             : 
    1898             :   -- ALGLIB --
    1899             :      Copyright 28.02.2010 by Bochkanov Sergey
    1900             : *************************************************************************/
    1901           0 : void kdtreequeryresultsx(const kdtree &kdt, real_2d_array &x, const xparams _xparams)
    1902             : {
    1903             :     jmp_buf _break_jump;
    1904             :     alglib_impl::ae_state _alglib_env_state;
    1905           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1906           0 :     if( setjmp(_break_jump) )
    1907             :     {
    1908             : #if !defined(AE_NO_EXCEPTIONS)
    1909           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1910             : #else
    1911             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1912             :         return;
    1913             : #endif
    1914             :     }
    1915           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1916           0 :     if( _xparams.flags!=0x0 )
    1917           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1918           0 :     alglib_impl::kdtreequeryresultsx(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_matrix*>(x.c_ptr()), &_alglib_env_state);
    1919           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1920           0 :     return;
    1921             : }
    1922             : 
    1923             : /*************************************************************************
    1924             : X- and Y-values from last query
    1925             : 
    1926             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    1927             : object. If you performed buffered requests (ones which  use  instances  of
    1928             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    1929             : function - kdtreetsqueryresultsxy().
    1930             : 
    1931             : INPUT PARAMETERS
    1932             :     KDT     -   KD-tree
    1933             :     XY      -   possibly pre-allocated buffer. If XY is too small to store
    1934             :                 result, it is resized. If size(XY) is enough to store
    1935             :                 result, it is left unchanged.
    1936             : 
    1937             : OUTPUT PARAMETERS
    1938             :     XY      -   rows are filled with points: first NX columns with
    1939             :                 X-values, next NY columns - with Y-values.
    1940             : 
    1941             : NOTES
    1942             : 1. points are ordered by distance from the query point (first = closest)
    1943             : 2. if  XY is larger than required to store result, only leading part  will
    1944             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    1945             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    1946             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    1947             :    you want function  to  resize  array  according  to  result  size,  use
    1948             :    function with same name and suffix 'I'.
    1949             : 
    1950             : SEE ALSO
    1951             : * KDTreeQueryResultsX()             X-values
    1952             : * KDTreeQueryResultsTags()          tag values
    1953             : * KDTreeQueryResultsDistances()     distances
    1954             : 
    1955             :   -- ALGLIB --
    1956             :      Copyright 28.02.2010 by Bochkanov Sergey
    1957             : *************************************************************************/
    1958           0 : void kdtreequeryresultsxy(const kdtree &kdt, real_2d_array &xy, const xparams _xparams)
    1959             : {
    1960             :     jmp_buf _break_jump;
    1961             :     alglib_impl::ae_state _alglib_env_state;
    1962           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    1963           0 :     if( setjmp(_break_jump) )
    1964             :     {
    1965             : #if !defined(AE_NO_EXCEPTIONS)
    1966           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    1967             : #else
    1968             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    1969             :         return;
    1970             : #endif
    1971             :     }
    1972           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    1973           0 :     if( _xparams.flags!=0x0 )
    1974           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    1975           0 :     alglib_impl::kdtreequeryresultsxy(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), &_alglib_env_state);
    1976           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    1977           0 :     return;
    1978             : }
    1979             : 
    1980             : /*************************************************************************
    1981             : Tags from last query
    1982             : 
    1983             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    1984             : object. If you performed buffered requests (ones which  use  instances  of
    1985             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    1986             : function - kdtreetsqueryresultstags().
    1987             : 
    1988             : INPUT PARAMETERS
    1989             :     KDT     -   KD-tree
    1990             :     Tags    -   possibly pre-allocated buffer. If X is too small to store
    1991             :                 result, it is resized. If size(X) is enough to store
    1992             :                 result, it is left unchanged.
    1993             : 
    1994             : OUTPUT PARAMETERS
    1995             :     Tags    -   filled with tags associated with points,
    1996             :                 or, when no tags were supplied, with zeros
    1997             : 
    1998             : NOTES
    1999             : 1. points are ordered by distance from the query point (first = closest)
    2000             : 2. if  XY is larger than required to store result, only leading part  will
    2001             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    2002             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    2003             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    2004             :    you want function  to  resize  array  according  to  result  size,  use
    2005             :    function with same name and suffix 'I'.
    2006             : 
    2007             : SEE ALSO
    2008             : * KDTreeQueryResultsX()             X-values
    2009             : * KDTreeQueryResultsXY()            X- and Y-values
    2010             : * KDTreeQueryResultsDistances()     distances
    2011             : 
    2012             :   -- ALGLIB --
    2013             :      Copyright 28.02.2010 by Bochkanov Sergey
    2014             : *************************************************************************/
    2015           0 : void kdtreequeryresultstags(const kdtree &kdt, integer_1d_array &tags, const xparams _xparams)
    2016             : {
    2017             :     jmp_buf _break_jump;
    2018             :     alglib_impl::ae_state _alglib_env_state;
    2019           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2020           0 :     if( setjmp(_break_jump) )
    2021             :     {
    2022             : #if !defined(AE_NO_EXCEPTIONS)
    2023           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2024             : #else
    2025             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2026             :         return;
    2027             : #endif
    2028             :     }
    2029           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2030           0 :     if( _xparams.flags!=0x0 )
    2031           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2032           0 :     alglib_impl::kdtreequeryresultstags(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(tags.c_ptr()), &_alglib_env_state);
    2033           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2034           0 :     return;
    2035             : }
    2036             : 
    2037             : /*************************************************************************
    2038             : Distances from last query
    2039             : 
    2040             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    2041             : object. If you performed buffered requests (ones which  use  instances  of
    2042             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    2043             : function - kdtreetsqueryresultsdistances().
    2044             : 
    2045             : INPUT PARAMETERS
    2046             :     KDT     -   KD-tree
    2047             :     R       -   possibly pre-allocated buffer. If X is too small to store
    2048             :                 result, it is resized. If size(X) is enough to store
    2049             :                 result, it is left unchanged.
    2050             : 
    2051             : OUTPUT PARAMETERS
    2052             :     R       -   filled with distances (in corresponding norm)
    2053             : 
    2054             : NOTES
    2055             : 1. points are ordered by distance from the query point (first = closest)
    2056             : 2. if  XY is larger than required to store result, only leading part  will
    2057             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    2058             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    2059             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    2060             :    you want function  to  resize  array  according  to  result  size,  use
    2061             :    function with same name and suffix 'I'.
    2062             : 
    2063             : SEE ALSO
    2064             : * KDTreeQueryResultsX()             X-values
    2065             : * KDTreeQueryResultsXY()            X- and Y-values
    2066             : * KDTreeQueryResultsTags()          tag values
    2067             : 
    2068             :   -- ALGLIB --
    2069             :      Copyright 28.02.2010 by Bochkanov Sergey
    2070             : *************************************************************************/
    2071           0 : void kdtreequeryresultsdistances(const kdtree &kdt, real_1d_array &r, const xparams _xparams)
    2072             : {
    2073             :     jmp_buf _break_jump;
    2074             :     alglib_impl::ae_state _alglib_env_state;
    2075           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2076           0 :     if( setjmp(_break_jump) )
    2077             :     {
    2078             : #if !defined(AE_NO_EXCEPTIONS)
    2079           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2080             : #else
    2081             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2082             :         return;
    2083             : #endif
    2084             :     }
    2085           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2086           0 :     if( _xparams.flags!=0x0 )
    2087           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2088           0 :     alglib_impl::kdtreequeryresultsdistances(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(r.c_ptr()), &_alglib_env_state);
    2089           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2090           0 :     return;
    2091             : }
    2092             : 
    2093             : /*************************************************************************
    2094             : X-values from last query associated with kdtreerequestbuffer object.
    2095             : 
    2096             : INPUT PARAMETERS
    2097             :     KDT     -   KD-tree
    2098             :     Buf     -   request  buffer  object  created   for   this   particular
    2099             :                 instance of kd-tree structure.
    2100             :     X       -   possibly pre-allocated buffer. If X is too small to store
    2101             :                 result, it is resized. If size(X) is enough to store
    2102             :                 result, it is left unchanged.
    2103             : 
    2104             : OUTPUT PARAMETERS
    2105             :     X       -   rows are filled with X-values
    2106             : 
    2107             : NOTES
    2108             : 1. points are ordered by distance from the query point (first = closest)
    2109             : 2. if  XY is larger than required to store result, only leading part  will
    2110             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    2111             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    2112             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    2113             :    you want function  to  resize  array  according  to  result  size,  use
    2114             :    function with same name and suffix 'I'.
    2115             : 
    2116             : SEE ALSO
    2117             : * KDTreeQueryResultsXY()            X- and Y-values
    2118             : * KDTreeQueryResultsTags()          tag values
    2119             : * KDTreeQueryResultsDistances()     distances
    2120             : 
    2121             :   -- ALGLIB --
    2122             :      Copyright 28.02.2010 by Bochkanov Sergey
    2123             : *************************************************************************/
    2124           0 : void kdtreetsqueryresultsx(const kdtree &kdt, const kdtreerequestbuffer &buf, real_2d_array &x, const xparams _xparams)
    2125             : {
    2126             :     jmp_buf _break_jump;
    2127             :     alglib_impl::ae_state _alglib_env_state;
    2128           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2129           0 :     if( setjmp(_break_jump) )
    2130             :     {
    2131             : #if !defined(AE_NO_EXCEPTIONS)
    2132           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2133             : #else
    2134             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2135             :         return;
    2136             : #endif
    2137             :     }
    2138           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2139           0 :     if( _xparams.flags!=0x0 )
    2140           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2141           0 :     alglib_impl::kdtreetsqueryresultsx(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_matrix*>(x.c_ptr()), &_alglib_env_state);
    2142           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2143           0 :     return;
    2144             : }
    2145             : 
    2146             : /*************************************************************************
    2147             : X- and Y-values from last query associated with kdtreerequestbuffer object.
    2148             : 
    2149             : INPUT PARAMETERS
    2150             :     KDT     -   KD-tree
    2151             :     Buf     -   request  buffer  object  created   for   this   particular
    2152             :                 instance of kd-tree structure.
    2153             :     XY      -   possibly pre-allocated buffer. If XY is too small to store
    2154             :                 result, it is resized. If size(XY) is enough to store
    2155             :                 result, it is left unchanged.
    2156             : 
    2157             : OUTPUT PARAMETERS
    2158             :     XY      -   rows are filled with points: first NX columns with
    2159             :                 X-values, next NY columns - with Y-values.
    2160             : 
    2161             : NOTES
    2162             : 1. points are ordered by distance from the query point (first = closest)
    2163             : 2. if  XY is larger than required to store result, only leading part  will
    2164             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    2165             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    2166             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    2167             :    you want function  to  resize  array  according  to  result  size,  use
    2168             :    function with same name and suffix 'I'.
    2169             : 
    2170             : SEE ALSO
    2171             : * KDTreeQueryResultsX()             X-values
    2172             : * KDTreeQueryResultsTags()          tag values
    2173             : * KDTreeQueryResultsDistances()     distances
    2174             : 
    2175             :   -- ALGLIB --
    2176             :      Copyright 28.02.2010 by Bochkanov Sergey
    2177             : *************************************************************************/
    2178           0 : void kdtreetsqueryresultsxy(const kdtree &kdt, const kdtreerequestbuffer &buf, real_2d_array &xy, const xparams _xparams)
    2179             : {
    2180             :     jmp_buf _break_jump;
    2181             :     alglib_impl::ae_state _alglib_env_state;
    2182           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2183           0 :     if( setjmp(_break_jump) )
    2184             :     {
    2185             : #if !defined(AE_NO_EXCEPTIONS)
    2186           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2187             : #else
    2188             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2189             :         return;
    2190             : #endif
    2191             :     }
    2192           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2193           0 :     if( _xparams.flags!=0x0 )
    2194           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2195           0 :     alglib_impl::kdtreetsqueryresultsxy(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), &_alglib_env_state);
    2196           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2197           0 :     return;
    2198             : }
    2199             : 
    2200             : /*************************************************************************
    2201             : Tags from last query associated with kdtreerequestbuffer object.
    2202             : 
    2203             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    2204             : object. If you performed buffered requests (ones which  use  instances  of
    2205             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    2206             : function - KDTreeTsqueryresultstags().
    2207             : 
    2208             : INPUT PARAMETERS
    2209             :     KDT     -   KD-tree
    2210             :     Buf     -   request  buffer  object  created   for   this   particular
    2211             :                 instance of kd-tree structure.
    2212             :     Tags    -   possibly pre-allocated buffer. If X is too small to store
    2213             :                 result, it is resized. If size(X) is enough to store
    2214             :                 result, it is left unchanged.
    2215             : 
    2216             : OUTPUT PARAMETERS
    2217             :     Tags    -   filled with tags associated with points,
    2218             :                 or, when no tags were supplied, with zeros
    2219             : 
    2220             : NOTES
    2221             : 1. points are ordered by distance from the query point (first = closest)
    2222             : 2. if  XY is larger than required to store result, only leading part  will
    2223             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    2224             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    2225             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    2226             :    you want function  to  resize  array  according  to  result  size,  use
    2227             :    function with same name and suffix 'I'.
    2228             : 
    2229             : SEE ALSO
    2230             : * KDTreeQueryResultsX()             X-values
    2231             : * KDTreeQueryResultsXY()            X- and Y-values
    2232             : * KDTreeQueryResultsDistances()     distances
    2233             : 
    2234             :   -- ALGLIB --
    2235             :      Copyright 28.02.2010 by Bochkanov Sergey
    2236             : *************************************************************************/
    2237           0 : void kdtreetsqueryresultstags(const kdtree &kdt, const kdtreerequestbuffer &buf, integer_1d_array &tags, const xparams _xparams)
    2238             : {
    2239             :     jmp_buf _break_jump;
    2240             :     alglib_impl::ae_state _alglib_env_state;
    2241           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2242           0 :     if( setjmp(_break_jump) )
    2243             :     {
    2244             : #if !defined(AE_NO_EXCEPTIONS)
    2245           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2246             : #else
    2247             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2248             :         return;
    2249             : #endif
    2250             :     }
    2251           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2252           0 :     if( _xparams.flags!=0x0 )
    2253           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2254           0 :     alglib_impl::kdtreetsqueryresultstags(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(tags.c_ptr()), &_alglib_env_state);
    2255           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2256           0 :     return;
    2257             : }
    2258             : 
    2259             : /*************************************************************************
    2260             : Distances from last query associated with kdtreerequestbuffer object.
    2261             : 
    2262             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    2263             : object. If you performed buffered requests (ones which  use  instances  of
    2264             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    2265             : function - KDTreeTsqueryresultsdistances().
    2266             : 
    2267             : INPUT PARAMETERS
    2268             :     KDT     -   KD-tree
    2269             :     Buf     -   request  buffer  object  created   for   this   particular
    2270             :                 instance of kd-tree structure.
    2271             :     R       -   possibly pre-allocated buffer. If X is too small to store
    2272             :                 result, it is resized. If size(X) is enough to store
    2273             :                 result, it is left unchanged.
    2274             : 
    2275             : OUTPUT PARAMETERS
    2276             :     R       -   filled with distances (in corresponding norm)
    2277             : 
    2278             : NOTES
    2279             : 1. points are ordered by distance from the query point (first = closest)
    2280             : 2. if  XY is larger than required to store result, only leading part  will
    2281             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    2282             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    2283             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    2284             :    you want function  to  resize  array  according  to  result  size,  use
    2285             :    function with same name and suffix 'I'.
    2286             : 
    2287             : SEE ALSO
    2288             : * KDTreeQueryResultsX()             X-values
    2289             : * KDTreeQueryResultsXY()            X- and Y-values
    2290             : * KDTreeQueryResultsTags()          tag values
    2291             : 
    2292             :   -- ALGLIB --
    2293             :      Copyright 28.02.2010 by Bochkanov Sergey
    2294             : *************************************************************************/
    2295           0 : void kdtreetsqueryresultsdistances(const kdtree &kdt, const kdtreerequestbuffer &buf, real_1d_array &r, const xparams _xparams)
    2296             : {
    2297             :     jmp_buf _break_jump;
    2298             :     alglib_impl::ae_state _alglib_env_state;
    2299           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2300           0 :     if( setjmp(_break_jump) )
    2301             :     {
    2302             : #if !defined(AE_NO_EXCEPTIONS)
    2303           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2304             : #else
    2305             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2306             :         return;
    2307             : #endif
    2308             :     }
    2309           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2310           0 :     if( _xparams.flags!=0x0 )
    2311           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2312           0 :     alglib_impl::kdtreetsqueryresultsdistances(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::kdtreerequestbuffer*>(buf.c_ptr()), const_cast<alglib_impl::ae_vector*>(r.c_ptr()), &_alglib_env_state);
    2313           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2314           0 :     return;
    2315             : }
    2316             : 
    2317             : /*************************************************************************
    2318             : X-values from last query; 'interactive' variant for languages like  Python
    2319             : which   support    constructs   like  "X = KDTreeQueryResultsXI(KDT)"  and
    2320             : interactive mode of interpreter.
    2321             : 
    2322             : This function allocates new array on each call,  so  it  is  significantly
    2323             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    2324             : when you call it from command line.
    2325             : 
    2326             :   -- ALGLIB --
    2327             :      Copyright 28.02.2010 by Bochkanov Sergey
    2328             : *************************************************************************/
    2329           0 : void kdtreequeryresultsxi(const kdtree &kdt, real_2d_array &x, const xparams _xparams)
    2330             : {
    2331             :     jmp_buf _break_jump;
    2332             :     alglib_impl::ae_state _alglib_env_state;
    2333           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2334           0 :     if( setjmp(_break_jump) )
    2335             :     {
    2336             : #if !defined(AE_NO_EXCEPTIONS)
    2337           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2338             : #else
    2339             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2340             :         return;
    2341             : #endif
    2342             :     }
    2343           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2344           0 :     if( _xparams.flags!=0x0 )
    2345           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2346           0 :     alglib_impl::kdtreequeryresultsxi(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_matrix*>(x.c_ptr()), &_alglib_env_state);
    2347           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2348           0 :     return;
    2349             : }
    2350             : 
    2351             : /*************************************************************************
    2352             : XY-values from last query; 'interactive' variant for languages like Python
    2353             : which   support    constructs   like "XY = KDTreeQueryResultsXYI(KDT)" and
    2354             : interactive mode of interpreter.
    2355             : 
    2356             : This function allocates new array on each call,  so  it  is  significantly
    2357             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    2358             : when you call it from command line.
    2359             : 
    2360             :   -- ALGLIB --
    2361             :      Copyright 28.02.2010 by Bochkanov Sergey
    2362             : *************************************************************************/
    2363           0 : void kdtreequeryresultsxyi(const kdtree &kdt, real_2d_array &xy, const xparams _xparams)
    2364             : {
    2365             :     jmp_buf _break_jump;
    2366             :     alglib_impl::ae_state _alglib_env_state;
    2367           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2368           0 :     if( setjmp(_break_jump) )
    2369             :     {
    2370             : #if !defined(AE_NO_EXCEPTIONS)
    2371           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2372             : #else
    2373             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2374             :         return;
    2375             : #endif
    2376             :     }
    2377           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2378           0 :     if( _xparams.flags!=0x0 )
    2379           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2380           0 :     alglib_impl::kdtreequeryresultsxyi(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_matrix*>(xy.c_ptr()), &_alglib_env_state);
    2381           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2382           0 :     return;
    2383             : }
    2384             : 
    2385             : /*************************************************************************
    2386             : Tags  from  last  query;  'interactive' variant for languages like  Python
    2387             : which  support  constructs  like "Tags = KDTreeQueryResultsTagsI(KDT)" and
    2388             : interactive mode of interpreter.
    2389             : 
    2390             : This function allocates new array on each call,  so  it  is  significantly
    2391             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    2392             : when you call it from command line.
    2393             : 
    2394             :   -- ALGLIB --
    2395             :      Copyright 28.02.2010 by Bochkanov Sergey
    2396             : *************************************************************************/
    2397           0 : void kdtreequeryresultstagsi(const kdtree &kdt, integer_1d_array &tags, const xparams _xparams)
    2398             : {
    2399             :     jmp_buf _break_jump;
    2400             :     alglib_impl::ae_state _alglib_env_state;
    2401           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2402           0 :     if( setjmp(_break_jump) )
    2403             :     {
    2404             : #if !defined(AE_NO_EXCEPTIONS)
    2405           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2406             : #else
    2407             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2408             :         return;
    2409             : #endif
    2410             :     }
    2411           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2412           0 :     if( _xparams.flags!=0x0 )
    2413           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2414           0 :     alglib_impl::kdtreequeryresultstagsi(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(tags.c_ptr()), &_alglib_env_state);
    2415           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2416           0 :     return;
    2417             : }
    2418             : 
    2419             : /*************************************************************************
    2420             : Distances from last query; 'interactive' variant for languages like Python
    2421             : which  support  constructs   like  "R = KDTreeQueryResultsDistancesI(KDT)"
    2422             : and interactive mode of interpreter.
    2423             : 
    2424             : This function allocates new array on each call,  so  it  is  significantly
    2425             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    2426             : when you call it from command line.
    2427             : 
    2428             :   -- ALGLIB --
    2429             :      Copyright 28.02.2010 by Bochkanov Sergey
    2430             : *************************************************************************/
    2431           0 : void kdtreequeryresultsdistancesi(const kdtree &kdt, real_1d_array &r, const xparams _xparams)
    2432             : {
    2433             :     jmp_buf _break_jump;
    2434             :     alglib_impl::ae_state _alglib_env_state;
    2435           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2436           0 :     if( setjmp(_break_jump) )
    2437             :     {
    2438             : #if !defined(AE_NO_EXCEPTIONS)
    2439           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2440             : #else
    2441             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2442             :         return;
    2443             : #endif
    2444             :     }
    2445           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2446           0 :     if( _xparams.flags!=0x0 )
    2447           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2448           0 :     alglib_impl::kdtreequeryresultsdistancesi(const_cast<alglib_impl::kdtree*>(kdt.c_ptr()), const_cast<alglib_impl::ae_vector*>(r.c_ptr()), &_alglib_env_state);
    2449           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2450           0 :     return;
    2451             : }
    2452             : #endif
    2453             : 
    2454             : #if defined(AE_COMPILE_HQRND) || !defined(AE_PARTIAL_BUILD)
    2455             : /*************************************************************************
    2456             : Portable high quality random number generator state.
    2457             : Initialized with HQRNDRandomize() or HQRNDSeed().
    2458             : 
    2459             : Fields:
    2460             :     S1, S2      -   seed values
    2461             :     V           -   precomputed value
    2462             :     MagicV      -   'magic' value used to determine whether State structure
    2463             :                     was correctly initialized.
    2464             : *************************************************************************/
    2465           0 : _hqrndstate_owner::_hqrndstate_owner()
    2466             : {
    2467             :     jmp_buf _break_jump;
    2468             :     alglib_impl::ae_state _state;
    2469             :     
    2470           0 :     alglib_impl::ae_state_init(&_state);
    2471           0 :     if( setjmp(_break_jump) )
    2472             :     {
    2473           0 :         if( p_struct!=NULL )
    2474             :         {
    2475           0 :             alglib_impl::_hqrndstate_destroy(p_struct);
    2476           0 :             alglib_impl::ae_free(p_struct);
    2477             :         }
    2478           0 :         p_struct = NULL;
    2479             : #if !defined(AE_NO_EXCEPTIONS)
    2480           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
    2481             : #else
    2482             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
    2483             :         return;
    2484             : #endif
    2485             :     }
    2486           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
    2487           0 :     p_struct = NULL;
    2488           0 :     p_struct = (alglib_impl::hqrndstate*)alglib_impl::ae_malloc(sizeof(alglib_impl::hqrndstate), &_state);
    2489           0 :     memset(p_struct, 0, sizeof(alglib_impl::hqrndstate));
    2490           0 :     alglib_impl::_hqrndstate_init(p_struct, &_state, ae_false);
    2491           0 :     ae_state_clear(&_state);
    2492           0 : }
    2493             : 
    2494           0 : _hqrndstate_owner::_hqrndstate_owner(const _hqrndstate_owner &rhs)
    2495             : {
    2496             :     jmp_buf _break_jump;
    2497             :     alglib_impl::ae_state _state;
    2498             :     
    2499           0 :     alglib_impl::ae_state_init(&_state);
    2500           0 :     if( setjmp(_break_jump) )
    2501             :     {
    2502           0 :         if( p_struct!=NULL )
    2503             :         {
    2504           0 :             alglib_impl::_hqrndstate_destroy(p_struct);
    2505           0 :             alglib_impl::ae_free(p_struct);
    2506             :         }
    2507           0 :         p_struct = NULL;
    2508             : #if !defined(AE_NO_EXCEPTIONS)
    2509           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
    2510             : #else
    2511             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
    2512             :         return;
    2513             : #endif
    2514             :     }
    2515           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
    2516           0 :     p_struct = NULL;
    2517           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: hqrndstate copy constructor failure (source is not initialized)", &_state);
    2518           0 :     p_struct = (alglib_impl::hqrndstate*)alglib_impl::ae_malloc(sizeof(alglib_impl::hqrndstate), &_state);
    2519           0 :     memset(p_struct, 0, sizeof(alglib_impl::hqrndstate));
    2520           0 :     alglib_impl::_hqrndstate_init_copy(p_struct, const_cast<alglib_impl::hqrndstate*>(rhs.p_struct), &_state, ae_false);
    2521           0 :     ae_state_clear(&_state);
    2522           0 : }
    2523             : 
    2524           0 : _hqrndstate_owner& _hqrndstate_owner::operator=(const _hqrndstate_owner &rhs)
    2525             : {
    2526           0 :     if( this==&rhs )
    2527           0 :         return *this;
    2528             :     jmp_buf _break_jump;
    2529             :     alglib_impl::ae_state _state;
    2530             :     
    2531           0 :     alglib_impl::ae_state_init(&_state);
    2532           0 :     if( setjmp(_break_jump) )
    2533             :     {
    2534             : #if !defined(AE_NO_EXCEPTIONS)
    2535           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
    2536             : #else
    2537             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
    2538             :         return *this;
    2539             : #endif
    2540             :     }
    2541           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
    2542           0 :     alglib_impl::ae_assert(p_struct!=NULL, "ALGLIB: hqrndstate assignment constructor failure (destination is not initialized)", &_state);
    2543           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: hqrndstate assignment constructor failure (source is not initialized)", &_state);
    2544           0 :     alglib_impl::_hqrndstate_destroy(p_struct);
    2545           0 :     memset(p_struct, 0, sizeof(alglib_impl::hqrndstate));
    2546           0 :     alglib_impl::_hqrndstate_init_copy(p_struct, const_cast<alglib_impl::hqrndstate*>(rhs.p_struct), &_state, ae_false);
    2547           0 :     ae_state_clear(&_state);
    2548           0 :     return *this;
    2549             : }
    2550             : 
    2551           0 : _hqrndstate_owner::~_hqrndstate_owner()
    2552             : {
    2553           0 :     if( p_struct!=NULL )
    2554             :     {
    2555           0 :         alglib_impl::_hqrndstate_destroy(p_struct);
    2556           0 :         ae_free(p_struct);
    2557             :     }
    2558           0 : }
    2559             : 
    2560           0 : alglib_impl::hqrndstate* _hqrndstate_owner::c_ptr()
    2561             : {
    2562           0 :     return p_struct;
    2563             : }
    2564             : 
    2565           0 : alglib_impl::hqrndstate* _hqrndstate_owner::c_ptr() const
    2566             : {
    2567           0 :     return const_cast<alglib_impl::hqrndstate*>(p_struct);
    2568             : }
    2569           0 : hqrndstate::hqrndstate() : _hqrndstate_owner() 
    2570             : {
    2571           0 : }
    2572             : 
    2573           0 : hqrndstate::hqrndstate(const hqrndstate &rhs):_hqrndstate_owner(rhs) 
    2574             : {
    2575           0 : }
    2576             : 
    2577           0 : hqrndstate& hqrndstate::operator=(const hqrndstate &rhs)
    2578             : {
    2579           0 :     if( this==&rhs )
    2580           0 :         return *this;
    2581           0 :     _hqrndstate_owner::operator=(rhs);
    2582           0 :     return *this;
    2583             : }
    2584             : 
    2585           0 : hqrndstate::~hqrndstate()
    2586             : {
    2587           0 : }
    2588             : 
    2589             : /*************************************************************************
    2590             : HQRNDState  initialization  with  random  values  which come from standard
    2591             : RNG.
    2592             : 
    2593             :   -- ALGLIB --
    2594             :      Copyright 02.12.2009 by Bochkanov Sergey
    2595             : *************************************************************************/
    2596           0 : void hqrndrandomize(hqrndstate &state, const xparams _xparams)
    2597             : {
    2598             :     jmp_buf _break_jump;
    2599             :     alglib_impl::ae_state _alglib_env_state;
    2600           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2601           0 :     if( setjmp(_break_jump) )
    2602             :     {
    2603             : #if !defined(AE_NO_EXCEPTIONS)
    2604           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2605             : #else
    2606             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2607             :         return;
    2608             : #endif
    2609             :     }
    2610           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2611           0 :     if( _xparams.flags!=0x0 )
    2612           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2613           0 :     alglib_impl::hqrndrandomize(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), &_alglib_env_state);
    2614           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2615           0 :     return;
    2616             : }
    2617             : 
    2618             : /*************************************************************************
    2619             : HQRNDState initialization with seed values
    2620             : 
    2621             :   -- ALGLIB --
    2622             :      Copyright 02.12.2009 by Bochkanov Sergey
    2623             : *************************************************************************/
    2624           0 : void hqrndseed(const ae_int_t s1, const ae_int_t s2, hqrndstate &state, const xparams _xparams)
    2625             : {
    2626             :     jmp_buf _break_jump;
    2627             :     alglib_impl::ae_state _alglib_env_state;
    2628           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2629           0 :     if( setjmp(_break_jump) )
    2630             :     {
    2631             : #if !defined(AE_NO_EXCEPTIONS)
    2632           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2633             : #else
    2634             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2635             :         return;
    2636             : #endif
    2637             :     }
    2638           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2639           0 :     if( _xparams.flags!=0x0 )
    2640           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2641           0 :     alglib_impl::hqrndseed(s1, s2, const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), &_alglib_env_state);
    2642           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2643           0 :     return;
    2644             : }
    2645             : 
    2646             : /*************************************************************************
    2647             : This function generates random real number in (0,1),
    2648             : not including interval boundaries
    2649             : 
    2650             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2651             : 
    2652             :   -- ALGLIB --
    2653             :      Copyright 02.12.2009 by Bochkanov Sergey
    2654             : *************************************************************************/
    2655           0 : double hqrnduniformr(const hqrndstate &state, const xparams _xparams)
    2656             : {
    2657             :     jmp_buf _break_jump;
    2658             :     alglib_impl::ae_state _alglib_env_state;
    2659           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2660           0 :     if( setjmp(_break_jump) )
    2661             :     {
    2662             : #if !defined(AE_NO_EXCEPTIONS)
    2663           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2664             : #else
    2665             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2666             :         return 0;
    2667             : #endif
    2668             :     }
    2669           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2670           0 :     if( _xparams.flags!=0x0 )
    2671           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2672           0 :     double result = alglib_impl::hqrnduniformr(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), &_alglib_env_state);
    2673           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2674           0 :     return *(reinterpret_cast<double*>(&result));
    2675             : }
    2676             : 
    2677             : /*************************************************************************
    2678             : This function generates random integer number in [0, N)
    2679             : 
    2680             : 1. State structure must be initialized with HQRNDRandomize() or HQRNDSeed()
    2681             : 2. N can be any positive number except for very large numbers:
    2682             :    * close to 2^31 on 32-bit systems
    2683             :    * close to 2^62 on 64-bit systems
    2684             :    An exception will be generated if N is too large.
    2685             : 
    2686             :   -- ALGLIB --
    2687             :      Copyright 02.12.2009 by Bochkanov Sergey
    2688             : *************************************************************************/
    2689           0 : ae_int_t hqrnduniformi(const hqrndstate &state, const ae_int_t n, const xparams _xparams)
    2690             : {
    2691             :     jmp_buf _break_jump;
    2692             :     alglib_impl::ae_state _alglib_env_state;
    2693           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2694           0 :     if( setjmp(_break_jump) )
    2695             :     {
    2696             : #if !defined(AE_NO_EXCEPTIONS)
    2697           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2698             : #else
    2699             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2700             :         return 0;
    2701             : #endif
    2702             :     }
    2703           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2704           0 :     if( _xparams.flags!=0x0 )
    2705           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2706           0 :     alglib_impl::ae_int_t result = alglib_impl::hqrnduniformi(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), n, &_alglib_env_state);
    2707           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2708           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    2709             : }
    2710             : 
    2711             : /*************************************************************************
    2712             : Random number generator: normal numbers
    2713             : 
    2714             : This function generates one random number from normal distribution.
    2715             : Its performance is equal to that of HQRNDNormal2()
    2716             : 
    2717             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2718             : 
    2719             :   -- ALGLIB --
    2720             :      Copyright 02.12.2009 by Bochkanov Sergey
    2721             : *************************************************************************/
    2722           0 : double hqrndnormal(const hqrndstate &state, const xparams _xparams)
    2723             : {
    2724             :     jmp_buf _break_jump;
    2725             :     alglib_impl::ae_state _alglib_env_state;
    2726           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2727           0 :     if( setjmp(_break_jump) )
    2728             :     {
    2729             : #if !defined(AE_NO_EXCEPTIONS)
    2730           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2731             : #else
    2732             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2733             :         return 0;
    2734             : #endif
    2735             :     }
    2736           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2737           0 :     if( _xparams.flags!=0x0 )
    2738           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2739           0 :     double result = alglib_impl::hqrndnormal(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), &_alglib_env_state);
    2740           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2741           0 :     return *(reinterpret_cast<double*>(&result));
    2742             : }
    2743             : 
    2744             : /*************************************************************************
    2745             : Random number generator: vector with random entries (normal distribution)
    2746             : 
    2747             : This function generates N random numbers from normal distribution.
    2748             : 
    2749             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2750             : 
    2751             :   -- ALGLIB --
    2752             :      Copyright 02.12.2009 by Bochkanov Sergey
    2753             : *************************************************************************/
    2754           0 : void hqrndnormalv(const hqrndstate &state, const ae_int_t n, real_1d_array &x, const xparams _xparams)
    2755             : {
    2756             :     jmp_buf _break_jump;
    2757             :     alglib_impl::ae_state _alglib_env_state;
    2758           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2759           0 :     if( setjmp(_break_jump) )
    2760             :     {
    2761             : #if !defined(AE_NO_EXCEPTIONS)
    2762           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2763             : #else
    2764             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2765             :         return;
    2766             : #endif
    2767             :     }
    2768           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2769           0 :     if( _xparams.flags!=0x0 )
    2770           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2771           0 :     alglib_impl::hqrndnormalv(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), n, const_cast<alglib_impl::ae_vector*>(x.c_ptr()), &_alglib_env_state);
    2772           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2773           0 :     return;
    2774             : }
    2775             : 
    2776             : /*************************************************************************
    2777             : Random number generator: matrix with random entries (normal distribution)
    2778             : 
    2779             : This function generates MxN random matrix.
    2780             : 
    2781             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2782             : 
    2783             :   -- ALGLIB --
    2784             :      Copyright 02.12.2009 by Bochkanov Sergey
    2785             : *************************************************************************/
    2786           0 : void hqrndnormalm(const hqrndstate &state, const ae_int_t m, const ae_int_t n, real_2d_array &x, const xparams _xparams)
    2787             : {
    2788             :     jmp_buf _break_jump;
    2789             :     alglib_impl::ae_state _alglib_env_state;
    2790           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2791           0 :     if( setjmp(_break_jump) )
    2792             :     {
    2793             : #if !defined(AE_NO_EXCEPTIONS)
    2794           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2795             : #else
    2796             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2797             :         return;
    2798             : #endif
    2799             :     }
    2800           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2801           0 :     if( _xparams.flags!=0x0 )
    2802           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2803           0 :     alglib_impl::hqrndnormalm(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), m, n, const_cast<alglib_impl::ae_matrix*>(x.c_ptr()), &_alglib_env_state);
    2804           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2805           0 :     return;
    2806             : }
    2807             : 
    2808             : /*************************************************************************
    2809             : Random number generator: random X and Y such that X^2+Y^2=1
    2810             : 
    2811             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2812             : 
    2813             :   -- ALGLIB --
    2814             :      Copyright 02.12.2009 by Bochkanov Sergey
    2815             : *************************************************************************/
    2816           0 : void hqrndunit2(const hqrndstate &state, double &x, double &y, const xparams _xparams)
    2817             : {
    2818             :     jmp_buf _break_jump;
    2819             :     alglib_impl::ae_state _alglib_env_state;
    2820           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2821           0 :     if( setjmp(_break_jump) )
    2822             :     {
    2823             : #if !defined(AE_NO_EXCEPTIONS)
    2824           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2825             : #else
    2826             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2827             :         return;
    2828             : #endif
    2829             :     }
    2830           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2831           0 :     if( _xparams.flags!=0x0 )
    2832           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2833           0 :     alglib_impl::hqrndunit2(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), &x, &y, &_alglib_env_state);
    2834           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2835           0 :     return;
    2836             : }
    2837             : 
    2838             : /*************************************************************************
    2839             : Random number generator: normal numbers
    2840             : 
    2841             : This function generates two independent random numbers from normal
    2842             : distribution. Its performance is equal to that of HQRNDNormal()
    2843             : 
    2844             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2845             : 
    2846             :   -- ALGLIB --
    2847             :      Copyright 02.12.2009 by Bochkanov Sergey
    2848             : *************************************************************************/
    2849           0 : void hqrndnormal2(const hqrndstate &state, double &x1, double &x2, const xparams _xparams)
    2850             : {
    2851             :     jmp_buf _break_jump;
    2852             :     alglib_impl::ae_state _alglib_env_state;
    2853           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2854           0 :     if( setjmp(_break_jump) )
    2855             :     {
    2856             : #if !defined(AE_NO_EXCEPTIONS)
    2857           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2858             : #else
    2859             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2860             :         return;
    2861             : #endif
    2862             :     }
    2863           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2864           0 :     if( _xparams.flags!=0x0 )
    2865           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2866           0 :     alglib_impl::hqrndnormal2(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), &x1, &x2, &_alglib_env_state);
    2867           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2868           0 :     return;
    2869             : }
    2870             : 
    2871             : /*************************************************************************
    2872             : Random number generator: exponential distribution
    2873             : 
    2874             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    2875             : 
    2876             :   -- ALGLIB --
    2877             :      Copyright 11.08.2007 by Bochkanov Sergey
    2878             : *************************************************************************/
    2879           0 : double hqrndexponential(const hqrndstate &state, const double lambdav, const xparams _xparams)
    2880             : {
    2881             :     jmp_buf _break_jump;
    2882             :     alglib_impl::ae_state _alglib_env_state;
    2883           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2884           0 :     if( setjmp(_break_jump) )
    2885             :     {
    2886             : #if !defined(AE_NO_EXCEPTIONS)
    2887           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2888             : #else
    2889             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2890             :         return 0;
    2891             : #endif
    2892             :     }
    2893           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2894           0 :     if( _xparams.flags!=0x0 )
    2895           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2896           0 :     double result = alglib_impl::hqrndexponential(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), lambdav, &_alglib_env_state);
    2897           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2898           0 :     return *(reinterpret_cast<double*>(&result));
    2899             : }
    2900             : 
    2901             : /*************************************************************************
    2902             : This function generates  random number from discrete distribution given by
    2903             : finite sample X.
    2904             : 
    2905             : INPUT PARAMETERS
    2906             :     State   -   high quality random number generator, must be
    2907             :                 initialized with HQRNDRandomize() or HQRNDSeed().
    2908             :         X   -   finite sample
    2909             :         N   -   number of elements to use, N>=1
    2910             : 
    2911             : RESULT
    2912             :     this function returns one of the X[i] for random i=0..N-1
    2913             : 
    2914             :   -- ALGLIB --
    2915             :      Copyright 08.11.2011 by Bochkanov Sergey
    2916             : *************************************************************************/
    2917           0 : double hqrnddiscrete(const hqrndstate &state, const real_1d_array &x, const ae_int_t n, const xparams _xparams)
    2918             : {
    2919             :     jmp_buf _break_jump;
    2920             :     alglib_impl::ae_state _alglib_env_state;
    2921           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2922           0 :     if( setjmp(_break_jump) )
    2923             :     {
    2924             : #if !defined(AE_NO_EXCEPTIONS)
    2925           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2926             : #else
    2927             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2928             :         return 0;
    2929             : #endif
    2930             :     }
    2931           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2932           0 :     if( _xparams.flags!=0x0 )
    2933           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2934           0 :     double result = alglib_impl::hqrnddiscrete(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), n, &_alglib_env_state);
    2935           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2936           0 :     return *(reinterpret_cast<double*>(&result));
    2937             : }
    2938             : 
    2939             : /*************************************************************************
    2940             : This function generates random number from continuous  distribution  given
    2941             : by finite sample X.
    2942             : 
    2943             : INPUT PARAMETERS
    2944             :     State   -   high quality random number generator, must be
    2945             :                 initialized with HQRNDRandomize() or HQRNDSeed().
    2946             :         X   -   finite sample, array[N] (can be larger, in this  case only
    2947             :                 leading N elements are used). THIS ARRAY MUST BE SORTED BY
    2948             :                 ASCENDING.
    2949             :         N   -   number of elements to use, N>=1
    2950             : 
    2951             : RESULT
    2952             :     this function returns random number from continuous distribution which
    2953             :     tries to approximate X as mush as possible. min(X)<=Result<=max(X).
    2954             : 
    2955             :   -- ALGLIB --
    2956             :      Copyright 08.11.2011 by Bochkanov Sergey
    2957             : *************************************************************************/
    2958           0 : double hqrndcontinuous(const hqrndstate &state, const real_1d_array &x, const ae_int_t n, const xparams _xparams)
    2959             : {
    2960             :     jmp_buf _break_jump;
    2961             :     alglib_impl::ae_state _alglib_env_state;
    2962           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    2963           0 :     if( setjmp(_break_jump) )
    2964             :     {
    2965             : #if !defined(AE_NO_EXCEPTIONS)
    2966           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    2967             : #else
    2968             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    2969             :         return 0;
    2970             : #endif
    2971             :     }
    2972           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    2973           0 :     if( _xparams.flags!=0x0 )
    2974           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    2975           0 :     double result = alglib_impl::hqrndcontinuous(const_cast<alglib_impl::hqrndstate*>(state.c_ptr()), const_cast<alglib_impl::ae_vector*>(x.c_ptr()), n, &_alglib_env_state);
    2976           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    2977           0 :     return *(reinterpret_cast<double*>(&result));
    2978             : }
    2979             : #endif
    2980             : 
    2981             : #if defined(AE_COMPILE_XDEBUG) || !defined(AE_PARTIAL_BUILD)
    2982             : /*************************************************************************
    2983             : 
    2984             : *************************************************************************/
    2985           0 : _xdebugrecord1_owner::_xdebugrecord1_owner()
    2986             : {
    2987             :     jmp_buf _break_jump;
    2988             :     alglib_impl::ae_state _state;
    2989             :     
    2990           0 :     alglib_impl::ae_state_init(&_state);
    2991           0 :     if( setjmp(_break_jump) )
    2992             :     {
    2993           0 :         if( p_struct!=NULL )
    2994             :         {
    2995           0 :             alglib_impl::_xdebugrecord1_destroy(p_struct);
    2996           0 :             alglib_impl::ae_free(p_struct);
    2997             :         }
    2998           0 :         p_struct = NULL;
    2999             : #if !defined(AE_NO_EXCEPTIONS)
    3000           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
    3001             : #else
    3002             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
    3003             :         return;
    3004             : #endif
    3005             :     }
    3006           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
    3007           0 :     p_struct = NULL;
    3008           0 :     p_struct = (alglib_impl::xdebugrecord1*)alglib_impl::ae_malloc(sizeof(alglib_impl::xdebugrecord1), &_state);
    3009           0 :     memset(p_struct, 0, sizeof(alglib_impl::xdebugrecord1));
    3010           0 :     alglib_impl::_xdebugrecord1_init(p_struct, &_state, ae_false);
    3011           0 :     ae_state_clear(&_state);
    3012           0 : }
    3013             : 
    3014           0 : _xdebugrecord1_owner::_xdebugrecord1_owner(const _xdebugrecord1_owner &rhs)
    3015             : {
    3016             :     jmp_buf _break_jump;
    3017             :     alglib_impl::ae_state _state;
    3018             :     
    3019           0 :     alglib_impl::ae_state_init(&_state);
    3020           0 :     if( setjmp(_break_jump) )
    3021             :     {
    3022           0 :         if( p_struct!=NULL )
    3023             :         {
    3024           0 :             alglib_impl::_xdebugrecord1_destroy(p_struct);
    3025           0 :             alglib_impl::ae_free(p_struct);
    3026             :         }
    3027           0 :         p_struct = NULL;
    3028             : #if !defined(AE_NO_EXCEPTIONS)
    3029           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
    3030             : #else
    3031             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
    3032             :         return;
    3033             : #endif
    3034             :     }
    3035           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
    3036           0 :     p_struct = NULL;
    3037           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: xdebugrecord1 copy constructor failure (source is not initialized)", &_state);
    3038           0 :     p_struct = (alglib_impl::xdebugrecord1*)alglib_impl::ae_malloc(sizeof(alglib_impl::xdebugrecord1), &_state);
    3039           0 :     memset(p_struct, 0, sizeof(alglib_impl::xdebugrecord1));
    3040           0 :     alglib_impl::_xdebugrecord1_init_copy(p_struct, const_cast<alglib_impl::xdebugrecord1*>(rhs.p_struct), &_state, ae_false);
    3041           0 :     ae_state_clear(&_state);
    3042           0 : }
    3043             : 
    3044           0 : _xdebugrecord1_owner& _xdebugrecord1_owner::operator=(const _xdebugrecord1_owner &rhs)
    3045             : {
    3046           0 :     if( this==&rhs )
    3047           0 :         return *this;
    3048             :     jmp_buf _break_jump;
    3049             :     alglib_impl::ae_state _state;
    3050             :     
    3051           0 :     alglib_impl::ae_state_init(&_state);
    3052           0 :     if( setjmp(_break_jump) )
    3053             :     {
    3054             : #if !defined(AE_NO_EXCEPTIONS)
    3055           0 :         _ALGLIB_CPP_EXCEPTION(_state.error_msg);
    3056             : #else
    3057             :         _ALGLIB_SET_ERROR_FLAG(_state.error_msg);
    3058             :         return *this;
    3059             : #endif
    3060             :     }
    3061           0 :     alglib_impl::ae_state_set_break_jump(&_state, &_break_jump);
    3062           0 :     alglib_impl::ae_assert(p_struct!=NULL, "ALGLIB: xdebugrecord1 assignment constructor failure (destination is not initialized)", &_state);
    3063           0 :     alglib_impl::ae_assert(rhs.p_struct!=NULL, "ALGLIB: xdebugrecord1 assignment constructor failure (source is not initialized)", &_state);
    3064           0 :     alglib_impl::_xdebugrecord1_destroy(p_struct);
    3065           0 :     memset(p_struct, 0, sizeof(alglib_impl::xdebugrecord1));
    3066           0 :     alglib_impl::_xdebugrecord1_init_copy(p_struct, const_cast<alglib_impl::xdebugrecord1*>(rhs.p_struct), &_state, ae_false);
    3067           0 :     ae_state_clear(&_state);
    3068           0 :     return *this;
    3069             : }
    3070             : 
    3071           0 : _xdebugrecord1_owner::~_xdebugrecord1_owner()
    3072             : {
    3073           0 :     if( p_struct!=NULL )
    3074             :     {
    3075           0 :         alglib_impl::_xdebugrecord1_destroy(p_struct);
    3076           0 :         ae_free(p_struct);
    3077             :     }
    3078           0 : }
    3079             : 
    3080           0 : alglib_impl::xdebugrecord1* _xdebugrecord1_owner::c_ptr()
    3081             : {
    3082           0 :     return p_struct;
    3083             : }
    3084             : 
    3085           0 : alglib_impl::xdebugrecord1* _xdebugrecord1_owner::c_ptr() const
    3086             : {
    3087           0 :     return const_cast<alglib_impl::xdebugrecord1*>(p_struct);
    3088             : }
    3089           0 : xdebugrecord1::xdebugrecord1() : _xdebugrecord1_owner() ,i(p_struct->i),c(*((alglib::complex*)(&p_struct->c))),a(&p_struct->a)
    3090             : {
    3091           0 : }
    3092             : 
    3093           0 : xdebugrecord1::xdebugrecord1(const xdebugrecord1 &rhs):_xdebugrecord1_owner(rhs) ,i(p_struct->i),c(*((alglib::complex*)(&p_struct->c))),a(&p_struct->a)
    3094             : {
    3095           0 : }
    3096             : 
    3097           0 : xdebugrecord1& xdebugrecord1::operator=(const xdebugrecord1 &rhs)
    3098             : {
    3099           0 :     if( this==&rhs )
    3100           0 :         return *this;
    3101           0 :     _xdebugrecord1_owner::operator=(rhs);
    3102           0 :     return *this;
    3103             : }
    3104             : 
    3105           0 : xdebugrecord1::~xdebugrecord1()
    3106             : {
    3107           0 : }
    3108             : 
    3109             : /*************************************************************************
    3110             : This is debug function intended for testing ALGLIB interface generator.
    3111             : Never use it in any real life project.
    3112             : 
    3113             : Creates and returns XDebugRecord1 structure:
    3114             : * integer and complex fields of Rec1 are set to 1 and 1+i correspondingly
    3115             : * array field of Rec1 is set to [2,3]
    3116             : 
    3117             :   -- ALGLIB --
    3118             :      Copyright 27.05.2014 by Bochkanov Sergey
    3119             : *************************************************************************/
    3120           0 : void xdebuginitrecord1(xdebugrecord1 &rec1, const xparams _xparams)
    3121             : {
    3122             :     jmp_buf _break_jump;
    3123             :     alglib_impl::ae_state _alglib_env_state;
    3124           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3125           0 :     if( setjmp(_break_jump) )
    3126             :     {
    3127             : #if !defined(AE_NO_EXCEPTIONS)
    3128           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3129             : #else
    3130             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3131             :         return;
    3132             : #endif
    3133             :     }
    3134           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3135           0 :     if( _xparams.flags!=0x0 )
    3136           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3137           0 :     alglib_impl::xdebuginitrecord1(const_cast<alglib_impl::xdebugrecord1*>(rec1.c_ptr()), &_alglib_env_state);
    3138           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3139           0 :     return;
    3140             : }
    3141             : 
    3142             : /*************************************************************************
    3143             : This is debug function intended for testing ALGLIB interface generator.
    3144             : Never use it in any real life project.
    3145             : 
    3146             : Counts number of True values in the boolean 1D array.
    3147             : 
    3148             :   -- ALGLIB --
    3149             :      Copyright 11.10.2013 by Bochkanov Sergey
    3150             : *************************************************************************/
    3151           0 : ae_int_t xdebugb1count(const boolean_1d_array &a, const xparams _xparams)
    3152             : {
    3153             :     jmp_buf _break_jump;
    3154             :     alglib_impl::ae_state _alglib_env_state;
    3155           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3156           0 :     if( setjmp(_break_jump) )
    3157             :     {
    3158             : #if !defined(AE_NO_EXCEPTIONS)
    3159           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3160             : #else
    3161             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3162             :         return 0;
    3163             : #endif
    3164             :     }
    3165           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3166           0 :     if( _xparams.flags!=0x0 )
    3167           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3168           0 :     alglib_impl::ae_int_t result = alglib_impl::xdebugb1count(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3169           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3170           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    3171             : }
    3172             : 
    3173             : /*************************************************************************
    3174             : This is debug function intended for testing ALGLIB interface generator.
    3175             : Never use it in any real life project.
    3176             : 
    3177             : Replace all values in array by NOT(a[i]).
    3178             : Array is passed using "shared" convention.
    3179             : 
    3180             :   -- ALGLIB --
    3181             :      Copyright 11.10.2013 by Bochkanov Sergey
    3182             : *************************************************************************/
    3183           0 : void xdebugb1not(const boolean_1d_array &a, const xparams _xparams)
    3184             : {
    3185             :     jmp_buf _break_jump;
    3186             :     alglib_impl::ae_state _alglib_env_state;
    3187           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3188           0 :     if( setjmp(_break_jump) )
    3189             :     {
    3190             : #if !defined(AE_NO_EXCEPTIONS)
    3191           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3192             : #else
    3193             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3194             :         return;
    3195             : #endif
    3196             :     }
    3197           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3198           0 :     if( _xparams.flags!=0x0 )
    3199           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3200           0 :     alglib_impl::xdebugb1not(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3201           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3202           0 :     return;
    3203             : }
    3204             : 
    3205             : /*************************************************************************
    3206             : This is debug function intended for testing ALGLIB interface generator.
    3207             : Never use it in any real life project.
    3208             : 
    3209             : Appends copy of array to itself.
    3210             : Array is passed using "var" convention.
    3211             : 
    3212             :   -- ALGLIB --
    3213             :      Copyright 11.10.2013 by Bochkanov Sergey
    3214             : *************************************************************************/
    3215           0 : void xdebugb1appendcopy(boolean_1d_array &a, const xparams _xparams)
    3216             : {
    3217             :     jmp_buf _break_jump;
    3218             :     alglib_impl::ae_state _alglib_env_state;
    3219           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3220           0 :     if( setjmp(_break_jump) )
    3221             :     {
    3222             : #if !defined(AE_NO_EXCEPTIONS)
    3223           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3224             : #else
    3225             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3226             :         return;
    3227             : #endif
    3228             :     }
    3229           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3230           0 :     if( _xparams.flags!=0x0 )
    3231           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3232           0 :     alglib_impl::xdebugb1appendcopy(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3233           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3234           0 :     return;
    3235             : }
    3236             : 
    3237             : /*************************************************************************
    3238             : This is debug function intended for testing ALGLIB interface generator.
    3239             : Never use it in any real life project.
    3240             : 
    3241             : Generate N-element array with even-numbered elements set to True.
    3242             : Array is passed using "out" convention.
    3243             : 
    3244             :   -- ALGLIB --
    3245             :      Copyright 11.10.2013 by Bochkanov Sergey
    3246             : *************************************************************************/
    3247           0 : void xdebugb1outeven(const ae_int_t n, boolean_1d_array &a, const xparams _xparams)
    3248             : {
    3249             :     jmp_buf _break_jump;
    3250             :     alglib_impl::ae_state _alglib_env_state;
    3251           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3252           0 :     if( setjmp(_break_jump) )
    3253             :     {
    3254             : #if !defined(AE_NO_EXCEPTIONS)
    3255           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3256             : #else
    3257             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3258             :         return;
    3259             : #endif
    3260             :     }
    3261           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3262           0 :     if( _xparams.flags!=0x0 )
    3263           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3264           0 :     alglib_impl::xdebugb1outeven(n, const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3265           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3266           0 :     return;
    3267             : }
    3268             : 
    3269             : /*************************************************************************
    3270             : This is debug function intended for testing ALGLIB interface generator.
    3271             : Never use it in any real life project.
    3272             : 
    3273             : Returns sum of elements in the array.
    3274             : 
    3275             :   -- ALGLIB --
    3276             :      Copyright 11.10.2013 by Bochkanov Sergey
    3277             : *************************************************************************/
    3278           0 : ae_int_t xdebugi1sum(const integer_1d_array &a, const xparams _xparams)
    3279             : {
    3280             :     jmp_buf _break_jump;
    3281             :     alglib_impl::ae_state _alglib_env_state;
    3282           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3283           0 :     if( setjmp(_break_jump) )
    3284             :     {
    3285             : #if !defined(AE_NO_EXCEPTIONS)
    3286           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3287             : #else
    3288             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3289             :         return 0;
    3290             : #endif
    3291             :     }
    3292           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3293           0 :     if( _xparams.flags!=0x0 )
    3294           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3295           0 :     alglib_impl::ae_int_t result = alglib_impl::xdebugi1sum(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3296           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3297           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    3298             : }
    3299             : 
    3300             : /*************************************************************************
    3301             : This is debug function intended for testing ALGLIB interface generator.
    3302             : Never use it in any real life project.
    3303             : 
    3304             : Replace all values in array by -A[I]
    3305             : Array is passed using "shared" convention.
    3306             : 
    3307             :   -- ALGLIB --
    3308             :      Copyright 11.10.2013 by Bochkanov Sergey
    3309             : *************************************************************************/
    3310           0 : void xdebugi1neg(const integer_1d_array &a, const xparams _xparams)
    3311             : {
    3312             :     jmp_buf _break_jump;
    3313             :     alglib_impl::ae_state _alglib_env_state;
    3314           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3315           0 :     if( setjmp(_break_jump) )
    3316             :     {
    3317             : #if !defined(AE_NO_EXCEPTIONS)
    3318           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3319             : #else
    3320             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3321             :         return;
    3322             : #endif
    3323             :     }
    3324           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3325           0 :     if( _xparams.flags!=0x0 )
    3326           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3327           0 :     alglib_impl::xdebugi1neg(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3328           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3329           0 :     return;
    3330             : }
    3331             : 
    3332             : /*************************************************************************
    3333             : This is debug function intended for testing ALGLIB interface generator.
    3334             : Never use it in any real life project.
    3335             : 
    3336             : Appends copy of array to itself.
    3337             : Array is passed using "var" convention.
    3338             : 
    3339             :   -- ALGLIB --
    3340             :      Copyright 11.10.2013 by Bochkanov Sergey
    3341             : *************************************************************************/
    3342           0 : void xdebugi1appendcopy(integer_1d_array &a, const xparams _xparams)
    3343             : {
    3344             :     jmp_buf _break_jump;
    3345             :     alglib_impl::ae_state _alglib_env_state;
    3346           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3347           0 :     if( setjmp(_break_jump) )
    3348             :     {
    3349             : #if !defined(AE_NO_EXCEPTIONS)
    3350           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3351             : #else
    3352             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3353             :         return;
    3354             : #endif
    3355             :     }
    3356           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3357           0 :     if( _xparams.flags!=0x0 )
    3358           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3359           0 :     alglib_impl::xdebugi1appendcopy(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3360           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3361           0 :     return;
    3362             : }
    3363             : 
    3364             : /*************************************************************************
    3365             : This is debug function intended for testing ALGLIB interface generator.
    3366             : Never use it in any real life project.
    3367             : 
    3368             : Generate N-element array with even-numbered A[I] set to I, and odd-numbered
    3369             : ones set to 0.
    3370             : 
    3371             : Array is passed using "out" convention.
    3372             : 
    3373             :   -- ALGLIB --
    3374             :      Copyright 11.10.2013 by Bochkanov Sergey
    3375             : *************************************************************************/
    3376           0 : void xdebugi1outeven(const ae_int_t n, integer_1d_array &a, const xparams _xparams)
    3377             : {
    3378             :     jmp_buf _break_jump;
    3379             :     alglib_impl::ae_state _alglib_env_state;
    3380           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3381           0 :     if( setjmp(_break_jump) )
    3382             :     {
    3383             : #if !defined(AE_NO_EXCEPTIONS)
    3384           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3385             : #else
    3386             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3387             :         return;
    3388             : #endif
    3389             :     }
    3390           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3391           0 :     if( _xparams.flags!=0x0 )
    3392           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3393           0 :     alglib_impl::xdebugi1outeven(n, const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3394           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3395           0 :     return;
    3396             : }
    3397             : 
    3398             : /*************************************************************************
    3399             : This is debug function intended for testing ALGLIB interface generator.
    3400             : Never use it in any real life project.
    3401             : 
    3402             : Returns sum of elements in the array.
    3403             : 
    3404             :   -- ALGLIB --
    3405             :      Copyright 11.10.2013 by Bochkanov Sergey
    3406             : *************************************************************************/
    3407           0 : double xdebugr1sum(const real_1d_array &a, const xparams _xparams)
    3408             : {
    3409             :     jmp_buf _break_jump;
    3410             :     alglib_impl::ae_state _alglib_env_state;
    3411           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3412           0 :     if( setjmp(_break_jump) )
    3413             :     {
    3414             : #if !defined(AE_NO_EXCEPTIONS)
    3415           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3416             : #else
    3417             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3418             :         return 0;
    3419             : #endif
    3420             :     }
    3421           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3422           0 :     if( _xparams.flags!=0x0 )
    3423           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3424           0 :     double result = alglib_impl::xdebugr1sum(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3425           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3426           0 :     return *(reinterpret_cast<double*>(&result));
    3427             : }
    3428             : 
    3429             : /*************************************************************************
    3430             : This is debug function intended for testing ALGLIB interface generator.
    3431             : Never use it in any real life project.
    3432             : 
    3433             : Replace all values in array by -A[I]
    3434             : Array is passed using "shared" convention.
    3435             : 
    3436             :   -- ALGLIB --
    3437             :      Copyright 11.10.2013 by Bochkanov Sergey
    3438             : *************************************************************************/
    3439           0 : void xdebugr1neg(const real_1d_array &a, const xparams _xparams)
    3440             : {
    3441             :     jmp_buf _break_jump;
    3442             :     alglib_impl::ae_state _alglib_env_state;
    3443           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3444           0 :     if( setjmp(_break_jump) )
    3445             :     {
    3446             : #if !defined(AE_NO_EXCEPTIONS)
    3447           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3448             : #else
    3449             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3450             :         return;
    3451             : #endif
    3452             :     }
    3453           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3454           0 :     if( _xparams.flags!=0x0 )
    3455           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3456           0 :     alglib_impl::xdebugr1neg(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3457           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3458           0 :     return;
    3459             : }
    3460             : 
    3461             : /*************************************************************************
    3462             : This is debug function intended for testing ALGLIB interface generator.
    3463             : Never use it in any real life project.
    3464             : 
    3465             : Appends copy of array to itself.
    3466             : Array is passed using "var" convention.
    3467             : 
    3468             :   -- ALGLIB --
    3469             :      Copyright 11.10.2013 by Bochkanov Sergey
    3470             : *************************************************************************/
    3471           0 : void xdebugr1appendcopy(real_1d_array &a, const xparams _xparams)
    3472             : {
    3473             :     jmp_buf _break_jump;
    3474             :     alglib_impl::ae_state _alglib_env_state;
    3475           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3476           0 :     if( setjmp(_break_jump) )
    3477             :     {
    3478             : #if !defined(AE_NO_EXCEPTIONS)
    3479           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3480             : #else
    3481             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3482             :         return;
    3483             : #endif
    3484             :     }
    3485           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3486           0 :     if( _xparams.flags!=0x0 )
    3487           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3488           0 :     alglib_impl::xdebugr1appendcopy(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3489           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3490           0 :     return;
    3491             : }
    3492             : 
    3493             : /*************************************************************************
    3494             : This is debug function intended for testing ALGLIB interface generator.
    3495             : Never use it in any real life project.
    3496             : 
    3497             : Generate N-element array with even-numbered A[I] set to I*0.25,
    3498             : and odd-numbered ones are set to 0.
    3499             : 
    3500             : Array is passed using "out" convention.
    3501             : 
    3502             :   -- ALGLIB --
    3503             :      Copyright 11.10.2013 by Bochkanov Sergey
    3504             : *************************************************************************/
    3505           0 : void xdebugr1outeven(const ae_int_t n, real_1d_array &a, const xparams _xparams)
    3506             : {
    3507             :     jmp_buf _break_jump;
    3508             :     alglib_impl::ae_state _alglib_env_state;
    3509           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3510           0 :     if( setjmp(_break_jump) )
    3511             :     {
    3512             : #if !defined(AE_NO_EXCEPTIONS)
    3513           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3514             : #else
    3515             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3516             :         return;
    3517             : #endif
    3518             :     }
    3519           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3520           0 :     if( _xparams.flags!=0x0 )
    3521           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3522           0 :     alglib_impl::xdebugr1outeven(n, const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3523           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3524           0 :     return;
    3525             : }
    3526             : 
    3527             : /*************************************************************************
    3528             : This is debug function intended for testing ALGLIB interface generator.
    3529             : Never use it in any real life project.
    3530             : 
    3531             : Returns sum of elements in the array.
    3532             : 
    3533             :   -- ALGLIB --
    3534             :      Copyright 11.10.2013 by Bochkanov Sergey
    3535             : *************************************************************************/
    3536           0 : alglib::complex xdebugc1sum(const complex_1d_array &a, const xparams _xparams)
    3537             : {
    3538             :     jmp_buf _break_jump;
    3539             :     alglib_impl::ae_state _alglib_env_state;
    3540           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3541           0 :     if( setjmp(_break_jump) )
    3542             :     {
    3543             : #if !defined(AE_NO_EXCEPTIONS)
    3544           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3545             : #else
    3546             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3547             :         return 0;
    3548             : #endif
    3549             :     }
    3550           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3551           0 :     if( _xparams.flags!=0x0 )
    3552           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3553           0 :     alglib_impl::ae_complex result = alglib_impl::xdebugc1sum(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3554           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3555           0 :     return *(reinterpret_cast<alglib::complex*>(&result));
    3556             : }
    3557             : 
    3558             : /*************************************************************************
    3559             : This is debug function intended for testing ALGLIB interface generator.
    3560             : Never use it in any real life project.
    3561             : 
    3562             : Replace all values in array by -A[I]
    3563             : Array is passed using "shared" convention.
    3564             : 
    3565             :   -- ALGLIB --
    3566             :      Copyright 11.10.2013 by Bochkanov Sergey
    3567             : *************************************************************************/
    3568           0 : void xdebugc1neg(const complex_1d_array &a, const xparams _xparams)
    3569             : {
    3570             :     jmp_buf _break_jump;
    3571             :     alglib_impl::ae_state _alglib_env_state;
    3572           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3573           0 :     if( setjmp(_break_jump) )
    3574             :     {
    3575             : #if !defined(AE_NO_EXCEPTIONS)
    3576           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3577             : #else
    3578             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3579             :         return;
    3580             : #endif
    3581             :     }
    3582           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3583           0 :     if( _xparams.flags!=0x0 )
    3584           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3585           0 :     alglib_impl::xdebugc1neg(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3586           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3587           0 :     return;
    3588             : }
    3589             : 
    3590             : /*************************************************************************
    3591             : This is debug function intended for testing ALGLIB interface generator.
    3592             : Never use it in any real life project.
    3593             : 
    3594             : Appends copy of array to itself.
    3595             : Array is passed using "var" convention.
    3596             : 
    3597             :   -- ALGLIB --
    3598             :      Copyright 11.10.2013 by Bochkanov Sergey
    3599             : *************************************************************************/
    3600           0 : void xdebugc1appendcopy(complex_1d_array &a, const xparams _xparams)
    3601             : {
    3602             :     jmp_buf _break_jump;
    3603             :     alglib_impl::ae_state _alglib_env_state;
    3604           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3605           0 :     if( setjmp(_break_jump) )
    3606             :     {
    3607             : #if !defined(AE_NO_EXCEPTIONS)
    3608           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3609             : #else
    3610             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3611             :         return;
    3612             : #endif
    3613             :     }
    3614           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3615           0 :     if( _xparams.flags!=0x0 )
    3616           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3617           0 :     alglib_impl::xdebugc1appendcopy(const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3618           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3619           0 :     return;
    3620             : }
    3621             : 
    3622             : /*************************************************************************
    3623             : This is debug function intended for testing ALGLIB interface generator.
    3624             : Never use it in any real life project.
    3625             : 
    3626             : Generate N-element array with even-numbered A[K] set to (x,y) = (K*0.25, K*0.125)
    3627             : and odd-numbered ones are set to 0.
    3628             : 
    3629             : Array is passed using "out" convention.
    3630             : 
    3631             :   -- ALGLIB --
    3632             :      Copyright 11.10.2013 by Bochkanov Sergey
    3633             : *************************************************************************/
    3634           0 : void xdebugc1outeven(const ae_int_t n, complex_1d_array &a, const xparams _xparams)
    3635             : {
    3636             :     jmp_buf _break_jump;
    3637             :     alglib_impl::ae_state _alglib_env_state;
    3638           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3639           0 :     if( setjmp(_break_jump) )
    3640             :     {
    3641             : #if !defined(AE_NO_EXCEPTIONS)
    3642           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3643             : #else
    3644             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3645             :         return;
    3646             : #endif
    3647             :     }
    3648           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3649           0 :     if( _xparams.flags!=0x0 )
    3650           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3651           0 :     alglib_impl::xdebugc1outeven(n, const_cast<alglib_impl::ae_vector*>(a.c_ptr()), &_alglib_env_state);
    3652           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3653           0 :     return;
    3654             : }
    3655             : 
    3656             : /*************************************************************************
    3657             : This is debug function intended for testing ALGLIB interface generator.
    3658             : Never use it in any real life project.
    3659             : 
    3660             : Counts number of True values in the boolean 2D array.
    3661             : 
    3662             :   -- ALGLIB --
    3663             :      Copyright 11.10.2013 by Bochkanov Sergey
    3664             : *************************************************************************/
    3665           0 : ae_int_t xdebugb2count(const boolean_2d_array &a, const xparams _xparams)
    3666             : {
    3667             :     jmp_buf _break_jump;
    3668             :     alglib_impl::ae_state _alglib_env_state;
    3669           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3670           0 :     if( setjmp(_break_jump) )
    3671             :     {
    3672             : #if !defined(AE_NO_EXCEPTIONS)
    3673           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3674             : #else
    3675             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3676             :         return 0;
    3677             : #endif
    3678             :     }
    3679           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3680           0 :     if( _xparams.flags!=0x0 )
    3681           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3682           0 :     alglib_impl::ae_int_t result = alglib_impl::xdebugb2count(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3683           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3684           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    3685             : }
    3686             : 
    3687             : /*************************************************************************
    3688             : This is debug function intended for testing ALGLIB interface generator.
    3689             : Never use it in any real life project.
    3690             : 
    3691             : Replace all values in array by NOT(a[i]).
    3692             : Array is passed using "shared" convention.
    3693             : 
    3694             :   -- ALGLIB --
    3695             :      Copyright 11.10.2013 by Bochkanov Sergey
    3696             : *************************************************************************/
    3697           0 : void xdebugb2not(const boolean_2d_array &a, const xparams _xparams)
    3698             : {
    3699             :     jmp_buf _break_jump;
    3700             :     alglib_impl::ae_state _alglib_env_state;
    3701           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3702           0 :     if( setjmp(_break_jump) )
    3703             :     {
    3704             : #if !defined(AE_NO_EXCEPTIONS)
    3705           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3706             : #else
    3707             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3708             :         return;
    3709             : #endif
    3710             :     }
    3711           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3712           0 :     if( _xparams.flags!=0x0 )
    3713           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3714           0 :     alglib_impl::xdebugb2not(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3715           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3716           0 :     return;
    3717             : }
    3718             : 
    3719             : /*************************************************************************
    3720             : This is debug function intended for testing ALGLIB interface generator.
    3721             : Never use it in any real life project.
    3722             : 
    3723             : Transposes array.
    3724             : Array is passed using "var" convention.
    3725             : 
    3726             :   -- ALGLIB --
    3727             :      Copyright 11.10.2013 by Bochkanov Sergey
    3728             : *************************************************************************/
    3729           0 : void xdebugb2transpose(boolean_2d_array &a, const xparams _xparams)
    3730             : {
    3731             :     jmp_buf _break_jump;
    3732             :     alglib_impl::ae_state _alglib_env_state;
    3733           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3734           0 :     if( setjmp(_break_jump) )
    3735             :     {
    3736             : #if !defined(AE_NO_EXCEPTIONS)
    3737           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3738             : #else
    3739             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3740             :         return;
    3741             : #endif
    3742             :     }
    3743           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3744           0 :     if( _xparams.flags!=0x0 )
    3745           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3746           0 :     alglib_impl::xdebugb2transpose(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3747           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3748           0 :     return;
    3749             : }
    3750             : 
    3751             : /*************************************************************************
    3752             : This is debug function intended for testing ALGLIB interface generator.
    3753             : Never use it in any real life project.
    3754             : 
    3755             : Generate MxN matrix with elements set to "Sin(3*I+5*J)>0"
    3756             : Array is passed using "out" convention.
    3757             : 
    3758             :   -- ALGLIB --
    3759             :      Copyright 11.10.2013 by Bochkanov Sergey
    3760             : *************************************************************************/
    3761           0 : void xdebugb2outsin(const ae_int_t m, const ae_int_t n, boolean_2d_array &a, const xparams _xparams)
    3762             : {
    3763             :     jmp_buf _break_jump;
    3764             :     alglib_impl::ae_state _alglib_env_state;
    3765           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3766           0 :     if( setjmp(_break_jump) )
    3767             :     {
    3768             : #if !defined(AE_NO_EXCEPTIONS)
    3769           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3770             : #else
    3771             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3772             :         return;
    3773             : #endif
    3774             :     }
    3775           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3776           0 :     if( _xparams.flags!=0x0 )
    3777           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3778           0 :     alglib_impl::xdebugb2outsin(m, n, const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3779           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3780           0 :     return;
    3781             : }
    3782             : 
    3783             : /*************************************************************************
    3784             : This is debug function intended for testing ALGLIB interface generator.
    3785             : Never use it in any real life project.
    3786             : 
    3787             : Returns sum of elements in the array.
    3788             : 
    3789             :   -- ALGLIB --
    3790             :      Copyright 11.10.2013 by Bochkanov Sergey
    3791             : *************************************************************************/
    3792           0 : ae_int_t xdebugi2sum(const integer_2d_array &a, const xparams _xparams)
    3793             : {
    3794             :     jmp_buf _break_jump;
    3795             :     alglib_impl::ae_state _alglib_env_state;
    3796           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3797           0 :     if( setjmp(_break_jump) )
    3798             :     {
    3799             : #if !defined(AE_NO_EXCEPTIONS)
    3800           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3801             : #else
    3802             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3803             :         return 0;
    3804             : #endif
    3805             :     }
    3806           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3807           0 :     if( _xparams.flags!=0x0 )
    3808           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3809           0 :     alglib_impl::ae_int_t result = alglib_impl::xdebugi2sum(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3810           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3811           0 :     return *(reinterpret_cast<ae_int_t*>(&result));
    3812             : }
    3813             : 
    3814             : /*************************************************************************
    3815             : This is debug function intended for testing ALGLIB interface generator.
    3816             : Never use it in any real life project.
    3817             : 
    3818             : Replace all values in array by -a[i,j]
    3819             : Array is passed using "shared" convention.
    3820             : 
    3821             :   -- ALGLIB --
    3822             :      Copyright 11.10.2013 by Bochkanov Sergey
    3823             : *************************************************************************/
    3824           0 : void xdebugi2neg(const integer_2d_array &a, const xparams _xparams)
    3825             : {
    3826             :     jmp_buf _break_jump;
    3827             :     alglib_impl::ae_state _alglib_env_state;
    3828           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3829           0 :     if( setjmp(_break_jump) )
    3830             :     {
    3831             : #if !defined(AE_NO_EXCEPTIONS)
    3832           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3833             : #else
    3834             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3835             :         return;
    3836             : #endif
    3837             :     }
    3838           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3839           0 :     if( _xparams.flags!=0x0 )
    3840           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3841           0 :     alglib_impl::xdebugi2neg(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3842           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3843           0 :     return;
    3844             : }
    3845             : 
    3846             : /*************************************************************************
    3847             : This is debug function intended for testing ALGLIB interface generator.
    3848             : Never use it in any real life project.
    3849             : 
    3850             : Transposes array.
    3851             : Array is passed using "var" convention.
    3852             : 
    3853             :   -- ALGLIB --
    3854             :      Copyright 11.10.2013 by Bochkanov Sergey
    3855             : *************************************************************************/
    3856           0 : void xdebugi2transpose(integer_2d_array &a, const xparams _xparams)
    3857             : {
    3858             :     jmp_buf _break_jump;
    3859             :     alglib_impl::ae_state _alglib_env_state;
    3860           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3861           0 :     if( setjmp(_break_jump) )
    3862             :     {
    3863             : #if !defined(AE_NO_EXCEPTIONS)
    3864           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3865             : #else
    3866             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3867             :         return;
    3868             : #endif
    3869             :     }
    3870           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3871           0 :     if( _xparams.flags!=0x0 )
    3872           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3873           0 :     alglib_impl::xdebugi2transpose(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3874           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3875           0 :     return;
    3876             : }
    3877             : 
    3878             : /*************************************************************************
    3879             : This is debug function intended for testing ALGLIB interface generator.
    3880             : Never use it in any real life project.
    3881             : 
    3882             : Generate MxN matrix with elements set to "Sign(Sin(3*I+5*J))"
    3883             : Array is passed using "out" convention.
    3884             : 
    3885             :   -- ALGLIB --
    3886             :      Copyright 11.10.2013 by Bochkanov Sergey
    3887             : *************************************************************************/
    3888           0 : void xdebugi2outsin(const ae_int_t m, const ae_int_t n, integer_2d_array &a, const xparams _xparams)
    3889             : {
    3890             :     jmp_buf _break_jump;
    3891             :     alglib_impl::ae_state _alglib_env_state;
    3892           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3893           0 :     if( setjmp(_break_jump) )
    3894             :     {
    3895             : #if !defined(AE_NO_EXCEPTIONS)
    3896           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3897             : #else
    3898             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3899             :         return;
    3900             : #endif
    3901             :     }
    3902           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3903           0 :     if( _xparams.flags!=0x0 )
    3904           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3905           0 :     alglib_impl::xdebugi2outsin(m, n, const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3906           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3907           0 :     return;
    3908             : }
    3909             : 
    3910             : /*************************************************************************
    3911             : This is debug function intended for testing ALGLIB interface generator.
    3912             : Never use it in any real life project.
    3913             : 
    3914             : Returns sum of elements in the array.
    3915             : 
    3916             :   -- ALGLIB --
    3917             :      Copyright 11.10.2013 by Bochkanov Sergey
    3918             : *************************************************************************/
    3919           0 : double xdebugr2sum(const real_2d_array &a, const xparams _xparams)
    3920             : {
    3921             :     jmp_buf _break_jump;
    3922             :     alglib_impl::ae_state _alglib_env_state;
    3923           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3924           0 :     if( setjmp(_break_jump) )
    3925             :     {
    3926             : #if !defined(AE_NO_EXCEPTIONS)
    3927           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3928             : #else
    3929             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3930             :         return 0;
    3931             : #endif
    3932             :     }
    3933           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3934           0 :     if( _xparams.flags!=0x0 )
    3935           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3936           0 :     double result = alglib_impl::xdebugr2sum(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3937           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3938           0 :     return *(reinterpret_cast<double*>(&result));
    3939             : }
    3940             : 
    3941             : /*************************************************************************
    3942             : This is debug function intended for testing ALGLIB interface generator.
    3943             : Never use it in any real life project.
    3944             : 
    3945             : Replace all values in array by -a[i,j]
    3946             : Array is passed using "shared" convention.
    3947             : 
    3948             :   -- ALGLIB --
    3949             :      Copyright 11.10.2013 by Bochkanov Sergey
    3950             : *************************************************************************/
    3951           0 : void xdebugr2neg(const real_2d_array &a, const xparams _xparams)
    3952             : {
    3953             :     jmp_buf _break_jump;
    3954             :     alglib_impl::ae_state _alglib_env_state;
    3955           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3956           0 :     if( setjmp(_break_jump) )
    3957             :     {
    3958             : #if !defined(AE_NO_EXCEPTIONS)
    3959           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3960             : #else
    3961             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3962             :         return;
    3963             : #endif
    3964             :     }
    3965           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3966           0 :     if( _xparams.flags!=0x0 )
    3967           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    3968           0 :     alglib_impl::xdebugr2neg(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    3969           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    3970           0 :     return;
    3971             : }
    3972             : 
    3973             : /*************************************************************************
    3974             : This is debug function intended for testing ALGLIB interface generator.
    3975             : Never use it in any real life project.
    3976             : 
    3977             : Transposes array.
    3978             : Array is passed using "var" convention.
    3979             : 
    3980             :   -- ALGLIB --
    3981             :      Copyright 11.10.2013 by Bochkanov Sergey
    3982             : *************************************************************************/
    3983           0 : void xdebugr2transpose(real_2d_array &a, const xparams _xparams)
    3984             : {
    3985             :     jmp_buf _break_jump;
    3986             :     alglib_impl::ae_state _alglib_env_state;
    3987           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    3988           0 :     if( setjmp(_break_jump) )
    3989             :     {
    3990             : #if !defined(AE_NO_EXCEPTIONS)
    3991           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    3992             : #else
    3993             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    3994             :         return;
    3995             : #endif
    3996             :     }
    3997           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    3998           0 :     if( _xparams.flags!=0x0 )
    3999           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4000           0 :     alglib_impl::xdebugr2transpose(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    4001           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4002           0 :     return;
    4003             : }
    4004             : 
    4005             : /*************************************************************************
    4006             : This is debug function intended for testing ALGLIB interface generator.
    4007             : Never use it in any real life project.
    4008             : 
    4009             : Generate MxN matrix with elements set to "Sin(3*I+5*J)"
    4010             : Array is passed using "out" convention.
    4011             : 
    4012             :   -- ALGLIB --
    4013             :      Copyright 11.10.2013 by Bochkanov Sergey
    4014             : *************************************************************************/
    4015           0 : void xdebugr2outsin(const ae_int_t m, const ae_int_t n, real_2d_array &a, const xparams _xparams)
    4016             : {
    4017             :     jmp_buf _break_jump;
    4018             :     alglib_impl::ae_state _alglib_env_state;
    4019           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    4020           0 :     if( setjmp(_break_jump) )
    4021             :     {
    4022             : #if !defined(AE_NO_EXCEPTIONS)
    4023           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    4024             : #else
    4025             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    4026             :         return;
    4027             : #endif
    4028             :     }
    4029           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    4030           0 :     if( _xparams.flags!=0x0 )
    4031           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4032           0 :     alglib_impl::xdebugr2outsin(m, n, const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    4033           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4034           0 :     return;
    4035             : }
    4036             : 
    4037             : /*************************************************************************
    4038             : This is debug function intended for testing ALGLIB interface generator.
    4039             : Never use it in any real life project.
    4040             : 
    4041             : Returns sum of elements in the array.
    4042             : 
    4043             :   -- ALGLIB --
    4044             :      Copyright 11.10.2013 by Bochkanov Sergey
    4045             : *************************************************************************/
    4046           0 : alglib::complex xdebugc2sum(const complex_2d_array &a, const xparams _xparams)
    4047             : {
    4048             :     jmp_buf _break_jump;
    4049             :     alglib_impl::ae_state _alglib_env_state;
    4050           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    4051           0 :     if( setjmp(_break_jump) )
    4052             :     {
    4053             : #if !defined(AE_NO_EXCEPTIONS)
    4054           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    4055             : #else
    4056             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    4057             :         return 0;
    4058             : #endif
    4059             :     }
    4060           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    4061           0 :     if( _xparams.flags!=0x0 )
    4062           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4063           0 :     alglib_impl::ae_complex result = alglib_impl::xdebugc2sum(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    4064           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4065           0 :     return *(reinterpret_cast<alglib::complex*>(&result));
    4066             : }
    4067             : 
    4068             : /*************************************************************************
    4069             : This is debug function intended for testing ALGLIB interface generator.
    4070             : Never use it in any real life project.
    4071             : 
    4072             : Replace all values in array by -a[i,j]
    4073             : Array is passed using "shared" convention.
    4074             : 
    4075             :   -- ALGLIB --
    4076             :      Copyright 11.10.2013 by Bochkanov Sergey
    4077             : *************************************************************************/
    4078           0 : void xdebugc2neg(const complex_2d_array &a, const xparams _xparams)
    4079             : {
    4080             :     jmp_buf _break_jump;
    4081             :     alglib_impl::ae_state _alglib_env_state;
    4082           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    4083           0 :     if( setjmp(_break_jump) )
    4084             :     {
    4085             : #if !defined(AE_NO_EXCEPTIONS)
    4086           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    4087             : #else
    4088             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    4089             :         return;
    4090             : #endif
    4091             :     }
    4092           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    4093           0 :     if( _xparams.flags!=0x0 )
    4094           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4095           0 :     alglib_impl::xdebugc2neg(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    4096           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4097           0 :     return;
    4098             : }
    4099             : 
    4100             : /*************************************************************************
    4101             : This is debug function intended for testing ALGLIB interface generator.
    4102             : Never use it in any real life project.
    4103             : 
    4104             : Transposes array.
    4105             : Array is passed using "var" convention.
    4106             : 
    4107             :   -- ALGLIB --
    4108             :      Copyright 11.10.2013 by Bochkanov Sergey
    4109             : *************************************************************************/
    4110           0 : void xdebugc2transpose(complex_2d_array &a, const xparams _xparams)
    4111             : {
    4112             :     jmp_buf _break_jump;
    4113             :     alglib_impl::ae_state _alglib_env_state;
    4114           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    4115           0 :     if( setjmp(_break_jump) )
    4116             :     {
    4117             : #if !defined(AE_NO_EXCEPTIONS)
    4118           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    4119             : #else
    4120             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    4121             :         return;
    4122             : #endif
    4123             :     }
    4124           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    4125           0 :     if( _xparams.flags!=0x0 )
    4126           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4127           0 :     alglib_impl::xdebugc2transpose(const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    4128           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4129           0 :     return;
    4130             : }
    4131             : 
    4132             : /*************************************************************************
    4133             : This is debug function intended for testing ALGLIB interface generator.
    4134             : Never use it in any real life project.
    4135             : 
    4136             : Generate MxN matrix with elements set to "Sin(3*I+5*J),Cos(3*I+5*J)"
    4137             : Array is passed using "out" convention.
    4138             : 
    4139             :   -- ALGLIB --
    4140             :      Copyright 11.10.2013 by Bochkanov Sergey
    4141             : *************************************************************************/
    4142           0 : void xdebugc2outsincos(const ae_int_t m, const ae_int_t n, complex_2d_array &a, const xparams _xparams)
    4143             : {
    4144             :     jmp_buf _break_jump;
    4145             :     alglib_impl::ae_state _alglib_env_state;
    4146           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    4147           0 :     if( setjmp(_break_jump) )
    4148             :     {
    4149             : #if !defined(AE_NO_EXCEPTIONS)
    4150           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    4151             : #else
    4152             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    4153             :         return;
    4154             : #endif
    4155             :     }
    4156           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    4157           0 :     if( _xparams.flags!=0x0 )
    4158           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4159           0 :     alglib_impl::xdebugc2outsincos(m, n, const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), &_alglib_env_state);
    4160           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4161           0 :     return;
    4162             : }
    4163             : 
    4164             : /*************************************************************************
    4165             : This is debug function intended for testing ALGLIB interface generator.
    4166             : Never use it in any real life project.
    4167             : 
    4168             : Returns sum of a[i,j]*(1+b[i,j]) such that c[i,j] is True
    4169             : 
    4170             :   -- ALGLIB --
    4171             :      Copyright 11.10.2013 by Bochkanov Sergey
    4172             : *************************************************************************/
    4173           0 : double xdebugmaskedbiasedproductsum(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const real_2d_array &b, const boolean_2d_array &c, const xparams _xparams)
    4174             : {
    4175             :     jmp_buf _break_jump;
    4176             :     alglib_impl::ae_state _alglib_env_state;
    4177           0 :     alglib_impl::ae_state_init(&_alglib_env_state);
    4178           0 :     if( setjmp(_break_jump) )
    4179             :     {
    4180             : #if !defined(AE_NO_EXCEPTIONS)
    4181           0 :         _ALGLIB_CPP_EXCEPTION(_alglib_env_state.error_msg);
    4182             : #else
    4183             :         _ALGLIB_SET_ERROR_FLAG(_alglib_env_state.error_msg);
    4184             :         return 0;
    4185             : #endif
    4186             :     }
    4187           0 :     ae_state_set_break_jump(&_alglib_env_state, &_break_jump);
    4188           0 :     if( _xparams.flags!=0x0 )
    4189           0 :         ae_state_set_flags(&_alglib_env_state, _xparams.flags);
    4190           0 :     double result = alglib_impl::xdebugmaskedbiasedproductsum(m, n, const_cast<alglib_impl::ae_matrix*>(a.c_ptr()), const_cast<alglib_impl::ae_matrix*>(b.c_ptr()), const_cast<alglib_impl::ae_matrix*>(c.c_ptr()), &_alglib_env_state);
    4191           0 :     alglib_impl::ae_state_clear(&_alglib_env_state);
    4192           0 :     return *(reinterpret_cast<double*>(&result));
    4193             : }
    4194             : #endif
    4195             : }
    4196             : 
    4197             : /////////////////////////////////////////////////////////////////////////
    4198             : //
    4199             : // THIS SECTION CONTAINS IMPLEMENTATION OF COMPUTATIONAL CORE
    4200             : //
    4201             : /////////////////////////////////////////////////////////////////////////
    4202             : namespace alglib_impl
    4203             : {
    4204             : #if defined(AE_COMPILE_NEARESTNEIGHBOR) || !defined(AE_PARTIAL_BUILD)
    4205             : static ae_int_t nearestneighbor_splitnodesize = 6;
    4206             : static ae_int_t nearestneighbor_kdtreefirstversion = 0;
    4207             : static ae_int_t nearestneighbor_tsqueryrnn(kdtree* kdt,
    4208             :      kdtreerequestbuffer* buf,
    4209             :      /* Real    */ ae_vector* x,
    4210             :      double r,
    4211             :      ae_bool selfmatch,
    4212             :      ae_bool orderedbydist,
    4213             :      ae_state *_state);
    4214             : static void nearestneighbor_kdtreesplit(kdtree* kdt,
    4215             :      ae_int_t i1,
    4216             :      ae_int_t i2,
    4217             :      ae_int_t d,
    4218             :      double s,
    4219             :      ae_int_t* i3,
    4220             :      ae_state *_state);
    4221             : static void nearestneighbor_kdtreegeneratetreerec(kdtree* kdt,
    4222             :      ae_int_t* nodesoffs,
    4223             :      ae_int_t* splitsoffs,
    4224             :      ae_int_t i1,
    4225             :      ae_int_t i2,
    4226             :      ae_int_t maxleafsize,
    4227             :      ae_state *_state);
    4228             : static void nearestneighbor_kdtreequerynnrec(kdtree* kdt,
    4229             :      kdtreerequestbuffer* buf,
    4230             :      ae_int_t offs,
    4231             :      ae_state *_state);
    4232             : static void nearestneighbor_kdtreequeryboxrec(kdtree* kdt,
    4233             :      kdtreerequestbuffer* buf,
    4234             :      ae_int_t offs,
    4235             :      ae_state *_state);
    4236             : static void nearestneighbor_kdtreeinitbox(kdtree* kdt,
    4237             :      /* Real    */ ae_vector* x,
    4238             :      kdtreerequestbuffer* buf,
    4239             :      ae_state *_state);
    4240             : static void nearestneighbor_kdtreeallocdatasetindependent(kdtree* kdt,
    4241             :      ae_int_t nx,
    4242             :      ae_int_t ny,
    4243             :      ae_state *_state);
    4244             : static void nearestneighbor_kdtreeallocdatasetdependent(kdtree* kdt,
    4245             :      ae_int_t n,
    4246             :      ae_int_t nx,
    4247             :      ae_int_t ny,
    4248             :      ae_state *_state);
    4249             : static void nearestneighbor_checkrequestbufferconsistency(kdtree* kdt,
    4250             :      kdtreerequestbuffer* buf,
    4251             :      ae_state *_state);
    4252             : 
    4253             : 
    4254             : #endif
    4255             : #if defined(AE_COMPILE_HQRND) || !defined(AE_PARTIAL_BUILD)
    4256             : static ae_int_t hqrnd_hqrndmax = 2147483561;
    4257             : static ae_int_t hqrnd_hqrndm1 = 2147483563;
    4258             : static ae_int_t hqrnd_hqrndm2 = 2147483399;
    4259             : static ae_int_t hqrnd_hqrndmagic = 1634357784;
    4260             : static ae_int_t hqrnd_hqrndintegerbase(hqrndstate* state,
    4261             :      ae_state *_state);
    4262             : 
    4263             : 
    4264             : #endif
    4265             : #if defined(AE_COMPILE_XDEBUG) || !defined(AE_PARTIAL_BUILD)
    4266             : 
    4267             : 
    4268             : #endif
    4269             : 
    4270             : #if defined(AE_COMPILE_NEARESTNEIGHBOR) || !defined(AE_PARTIAL_BUILD)
    4271             : 
    4272             : 
    4273             : /*************************************************************************
    4274             : KD-tree creation
    4275             : 
    4276             : This subroutine creates KD-tree from set of X-values and optional Y-values
    4277             : 
    4278             : INPUT PARAMETERS
    4279             :     XY      -   dataset, array[0..N-1,0..NX+NY-1].
    4280             :                 one row corresponds to one point.
    4281             :                 first NX columns contain X-values, next NY (NY may be zero)
    4282             :                 columns may contain associated Y-values
    4283             :     N       -   number of points, N>=0.
    4284             :     NX      -   space dimension, NX>=1.
    4285             :     NY      -   number of optional Y-values, NY>=0.
    4286             :     NormType-   norm type:
    4287             :                 * 0 denotes infinity-norm
    4288             :                 * 1 denotes 1-norm
    4289             :                 * 2 denotes 2-norm (Euclidean norm)
    4290             :                 
    4291             : OUTPUT PARAMETERS
    4292             :     KDT     -   KD-tree
    4293             :     
    4294             :     
    4295             : NOTES
    4296             : 
    4297             : 1. KD-tree  creation  have O(N*logN) complexity and O(N*(2*NX+NY))  memory
    4298             :    requirements.
    4299             : 2. Although KD-trees may be used with any combination of N  and  NX,  they
    4300             :    are more efficient than brute-force search only when N >> 4^NX. So they
    4301             :    are most useful in low-dimensional tasks (NX=2, NX=3). NX=1  is another
    4302             :    inefficient case, because  simple  binary  search  (without  additional
    4303             :    structures) is much more efficient in such tasks than KD-trees.
    4304             : 
    4305             :   -- ALGLIB --
    4306             :      Copyright 28.02.2010 by Bochkanov Sergey
    4307             : *************************************************************************/
    4308           0 : void kdtreebuild(/* Real    */ ae_matrix* xy,
    4309             :      ae_int_t n,
    4310             :      ae_int_t nx,
    4311             :      ae_int_t ny,
    4312             :      ae_int_t normtype,
    4313             :      kdtree* kdt,
    4314             :      ae_state *_state)
    4315             : {
    4316             :     ae_frame _frame_block;
    4317             :     ae_vector tags;
    4318             :     ae_int_t i;
    4319             : 
    4320           0 :     ae_frame_make(_state, &_frame_block);
    4321           0 :     memset(&tags, 0, sizeof(tags));
    4322           0 :     _kdtree_clear(kdt);
    4323           0 :     ae_vector_init(&tags, 0, DT_INT, _state, ae_true);
    4324             : 
    4325           0 :     ae_assert(n>=0, "KDTreeBuild: N<0", _state);
    4326           0 :     ae_assert(nx>=1, "KDTreeBuild: NX<1", _state);
    4327           0 :     ae_assert(ny>=0, "KDTreeBuild: NY<0", _state);
    4328           0 :     ae_assert(normtype>=0&&normtype<=2, "KDTreeBuild: incorrect NormType", _state);
    4329           0 :     ae_assert(xy->rows>=n, "KDTreeBuild: rows(X)<N", _state);
    4330           0 :     ae_assert(xy->cols>=nx+ny||n==0, "KDTreeBuild: cols(X)<NX+NY", _state);
    4331           0 :     ae_assert(apservisfinitematrix(xy, n, nx+ny, _state), "KDTreeBuild: XY contains infinite or NaN values", _state);
    4332           0 :     if( n>0 )
    4333             :     {
    4334           0 :         ae_vector_set_length(&tags, n, _state);
    4335           0 :         for(i=0; i<=n-1; i++)
    4336             :         {
    4337           0 :             tags.ptr.p_int[i] = 0;
    4338             :         }
    4339             :     }
    4340           0 :     kdtreebuildtagged(xy, &tags, n, nx, ny, normtype, kdt, _state);
    4341           0 :     ae_frame_leave(_state);
    4342           0 : }
    4343             : 
    4344             : 
    4345             : /*************************************************************************
    4346             : KD-tree creation
    4347             : 
    4348             : This  subroutine  creates  KD-tree  from set of X-values, integer tags and
    4349             : optional Y-values
    4350             : 
    4351             : INPUT PARAMETERS
    4352             :     XY      -   dataset, array[0..N-1,0..NX+NY-1].
    4353             :                 one row corresponds to one point.
    4354             :                 first NX columns contain X-values, next NY (NY may be zero)
    4355             :                 columns may contain associated Y-values
    4356             :     Tags    -   tags, array[0..N-1], contains integer tags associated
    4357             :                 with points.
    4358             :     N       -   number of points, N>=0
    4359             :     NX      -   space dimension, NX>=1.
    4360             :     NY      -   number of optional Y-values, NY>=0.
    4361             :     NormType-   norm type:
    4362             :                 * 0 denotes infinity-norm
    4363             :                 * 1 denotes 1-norm
    4364             :                 * 2 denotes 2-norm (Euclidean norm)
    4365             : 
    4366             : OUTPUT PARAMETERS
    4367             :     KDT     -   KD-tree
    4368             : 
    4369             : NOTES
    4370             : 
    4371             : 1. KD-tree  creation  have O(N*logN) complexity and O(N*(2*NX+NY))  memory
    4372             :    requirements.
    4373             : 2. Although KD-trees may be used with any combination of N  and  NX,  they
    4374             :    are more efficient than brute-force search only when N >> 4^NX. So they
    4375             :    are most useful in low-dimensional tasks (NX=2, NX=3). NX=1  is another
    4376             :    inefficient case, because  simple  binary  search  (without  additional
    4377             :    structures) is much more efficient in such tasks than KD-trees.
    4378             : 
    4379             :   -- ALGLIB --
    4380             :      Copyright 28.02.2010 by Bochkanov Sergey
    4381             : *************************************************************************/
    4382           0 : void kdtreebuildtagged(/* Real    */ ae_matrix* xy,
    4383             :      /* Integer */ ae_vector* tags,
    4384             :      ae_int_t n,
    4385             :      ae_int_t nx,
    4386             :      ae_int_t ny,
    4387             :      ae_int_t normtype,
    4388             :      kdtree* kdt,
    4389             :      ae_state *_state)
    4390             : {
    4391             :     ae_int_t i;
    4392             :     ae_int_t j;
    4393             :     ae_int_t nodesoffs;
    4394             :     ae_int_t splitsoffs;
    4395             : 
    4396           0 :     _kdtree_clear(kdt);
    4397             : 
    4398           0 :     ae_assert(n>=0, "KDTreeBuildTagged: N<0", _state);
    4399           0 :     ae_assert(nx>=1, "KDTreeBuildTagged: NX<1", _state);
    4400           0 :     ae_assert(ny>=0, "KDTreeBuildTagged: NY<0", _state);
    4401           0 :     ae_assert(normtype>=0&&normtype<=2, "KDTreeBuildTagged: incorrect NormType", _state);
    4402           0 :     ae_assert(xy->rows>=n, "KDTreeBuildTagged: rows(X)<N", _state);
    4403           0 :     ae_assert(xy->cols>=nx+ny||n==0, "KDTreeBuildTagged: cols(X)<NX+NY", _state);
    4404           0 :     ae_assert(apservisfinitematrix(xy, n, nx+ny, _state), "KDTreeBuildTagged: XY contains infinite or NaN values", _state);
    4405             :     
    4406             :     /*
    4407             :      * initialize
    4408             :      */
    4409           0 :     kdt->n = n;
    4410           0 :     kdt->nx = nx;
    4411           0 :     kdt->ny = ny;
    4412           0 :     kdt->normtype = normtype;
    4413           0 :     kdt->innerbuf.kcur = 0;
    4414             :     
    4415             :     /*
    4416             :      * N=0 => quick exit
    4417             :      */
    4418           0 :     if( n==0 )
    4419             :     {
    4420           0 :         return;
    4421             :     }
    4422             :     
    4423             :     /*
    4424             :      * Allocate
    4425             :      */
    4426           0 :     nearestneighbor_kdtreeallocdatasetindependent(kdt, nx, ny, _state);
    4427           0 :     nearestneighbor_kdtreeallocdatasetdependent(kdt, n, nx, ny, _state);
    4428           0 :     kdtreecreaterequestbuffer(kdt, &kdt->innerbuf, _state);
    4429             :     
    4430             :     /*
    4431             :      * Initial fill
    4432             :      */
    4433           0 :     for(i=0; i<=n-1; i++)
    4434             :     {
    4435           0 :         ae_v_move(&kdt->xy.ptr.pp_double[i][0], 1, &xy->ptr.pp_double[i][0], 1, ae_v_len(0,nx-1));
    4436           0 :         ae_v_move(&kdt->xy.ptr.pp_double[i][nx], 1, &xy->ptr.pp_double[i][0], 1, ae_v_len(nx,2*nx+ny-1));
    4437           0 :         kdt->tags.ptr.p_int[i] = tags->ptr.p_int[i];
    4438             :     }
    4439             :     
    4440             :     /*
    4441             :      * Determine bounding box
    4442             :      */
    4443           0 :     ae_v_move(&kdt->boxmin.ptr.p_double[0], 1, &kdt->xy.ptr.pp_double[0][0], 1, ae_v_len(0,nx-1));
    4444           0 :     ae_v_move(&kdt->boxmax.ptr.p_double[0], 1, &kdt->xy.ptr.pp_double[0][0], 1, ae_v_len(0,nx-1));
    4445           0 :     for(i=1; i<=n-1; i++)
    4446             :     {
    4447           0 :         for(j=0; j<=nx-1; j++)
    4448             :         {
    4449           0 :             kdt->boxmin.ptr.p_double[j] = ae_minreal(kdt->boxmin.ptr.p_double[j], kdt->xy.ptr.pp_double[i][j], _state);
    4450           0 :             kdt->boxmax.ptr.p_double[j] = ae_maxreal(kdt->boxmax.ptr.p_double[j], kdt->xy.ptr.pp_double[i][j], _state);
    4451             :         }
    4452             :     }
    4453             :     
    4454             :     /*
    4455             :      * Generate tree
    4456             :      */
    4457           0 :     nodesoffs = 0;
    4458           0 :     splitsoffs = 0;
    4459           0 :     ae_v_move(&kdt->innerbuf.curboxmin.ptr.p_double[0], 1, &kdt->boxmin.ptr.p_double[0], 1, ae_v_len(0,nx-1));
    4460           0 :     ae_v_move(&kdt->innerbuf.curboxmax.ptr.p_double[0], 1, &kdt->boxmax.ptr.p_double[0], 1, ae_v_len(0,nx-1));
    4461           0 :     nearestneighbor_kdtreegeneratetreerec(kdt, &nodesoffs, &splitsoffs, 0, n, 8, _state);
    4462           0 :     ivectorresize(&kdt->nodes, nodesoffs, _state);
    4463           0 :     rvectorresize(&kdt->splits, splitsoffs, _state);
    4464             : }
    4465             : 
    4466             : 
    4467             : /*************************************************************************
    4468             : This function creates buffer  structure  which  can  be  used  to  perform
    4469             : parallel KD-tree requests.
    4470             : 
    4471             : KD-tree subpackage provides two sets of request functions - ones which use
    4472             : internal buffer of KD-tree object  (these  functions  are  single-threaded
    4473             : because they use same buffer, which can not shared between  threads),  and
    4474             : ones which use external buffer.
    4475             : 
    4476             : This function is used to initialize external buffer.
    4477             : 
    4478             : INPUT PARAMETERS
    4479             :     KDT         -   KD-tree which is associated with newly created buffer
    4480             : 
    4481             : OUTPUT PARAMETERS
    4482             :     Buf         -   external buffer.
    4483             :     
    4484             :     
    4485             : IMPORTANT: KD-tree buffer should be used only with  KD-tree  object  which
    4486             :            was used to initialize buffer. Any attempt to use buffer   with
    4487             :            different object is dangerous - you  may  get  integrity  check
    4488             :            failure (exception) because sizes of internal arrays do not fit
    4489             :            to dimensions of KD-tree structure.
    4490             : 
    4491             :   -- ALGLIB --
    4492             :      Copyright 18.03.2016 by Bochkanov Sergey
    4493             : *************************************************************************/
    4494           0 : void kdtreecreaterequestbuffer(kdtree* kdt,
    4495             :      kdtreerequestbuffer* buf,
    4496             :      ae_state *_state)
    4497             : {
    4498             : 
    4499           0 :     _kdtreerequestbuffer_clear(buf);
    4500             : 
    4501           0 :     ae_vector_set_length(&buf->x, kdt->nx, _state);
    4502           0 :     ae_vector_set_length(&buf->boxmin, kdt->nx, _state);
    4503           0 :     ae_vector_set_length(&buf->boxmax, kdt->nx, _state);
    4504           0 :     ae_vector_set_length(&buf->idx, kdt->n, _state);
    4505           0 :     ae_vector_set_length(&buf->r, kdt->n, _state);
    4506           0 :     ae_vector_set_length(&buf->buf, ae_maxint(kdt->n, kdt->nx, _state), _state);
    4507           0 :     ae_vector_set_length(&buf->curboxmin, kdt->nx, _state);
    4508           0 :     ae_vector_set_length(&buf->curboxmax, kdt->nx, _state);
    4509           0 :     buf->kcur = 0;
    4510           0 : }
    4511             : 
    4512             : 
    4513             : /*************************************************************************
    4514             : K-NN query: K nearest neighbors
    4515             : 
    4516             : IMPORTANT: this function can not be used in multithreaded code because  it
    4517             :            uses internal temporary buffer of kd-tree object, which can not
    4518             :            be shared between multiple threads.  If  you  want  to  perform
    4519             :            parallel requests, use function  which  uses  external  request
    4520             :            buffer: KDTreeTsQueryKNN() ("Ts" stands for "thread-safe").
    4521             : 
    4522             : INPUT PARAMETERS
    4523             :     KDT         -   KD-tree
    4524             :     X           -   point, array[0..NX-1].
    4525             :     K           -   number of neighbors to return, K>=1
    4526             :     SelfMatch   -   whether self-matches are allowed:
    4527             :                     * if True, nearest neighbor may be the point itself
    4528             :                       (if it exists in original dataset)
    4529             :                     * if False, then only points with non-zero distance
    4530             :                       are returned
    4531             :                     * if not given, considered True
    4532             : 
    4533             : RESULT
    4534             :     number of actual neighbors found (either K or N, if K>N).
    4535             : 
    4536             : This  subroutine  performs  query  and  stores  its result in the internal
    4537             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    4538             : these results:
    4539             : * KDTreeQueryResultsX() to get X-values
    4540             : * KDTreeQueryResultsXY() to get X- and Y-values
    4541             : * KDTreeQueryResultsTags() to get tag values
    4542             : * KDTreeQueryResultsDistances() to get distances
    4543             : 
    4544             :   -- ALGLIB --
    4545             :      Copyright 28.02.2010 by Bochkanov Sergey
    4546             : *************************************************************************/
    4547           0 : ae_int_t kdtreequeryknn(kdtree* kdt,
    4548             :      /* Real    */ ae_vector* x,
    4549             :      ae_int_t k,
    4550             :      ae_bool selfmatch,
    4551             :      ae_state *_state)
    4552             : {
    4553             :     ae_int_t result;
    4554             : 
    4555             : 
    4556           0 :     ae_assert(k>=1, "KDTreeQueryKNN: K<1!", _state);
    4557           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeQueryKNN: Length(X)<NX!", _state);
    4558           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeQueryKNN: X contains infinite or NaN values!", _state);
    4559           0 :     result = kdtreetsqueryaknn(kdt, &kdt->innerbuf, x, k, selfmatch, 0.0, _state);
    4560           0 :     return result;
    4561             : }
    4562             : 
    4563             : 
    4564             : /*************************************************************************
    4565             : K-NN query: K nearest neighbors, using external thread-local buffer.
    4566             : 
    4567             : You can call this function from multiple threads for same kd-tree instance,
    4568             : assuming that different instances of buffer object are passed to different
    4569             : threads.
    4570             : 
    4571             : INPUT PARAMETERS
    4572             :     KDT         -   kd-tree
    4573             :     Buf         -   request buffer  object  created  for  this  particular
    4574             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    4575             :                     function.
    4576             :     X           -   point, array[0..NX-1].
    4577             :     K           -   number of neighbors to return, K>=1
    4578             :     SelfMatch   -   whether self-matches are allowed:
    4579             :                     * if True, nearest neighbor may be the point itself
    4580             :                       (if it exists in original dataset)
    4581             :                     * if False, then only points with non-zero distance
    4582             :                       are returned
    4583             :                     * if not given, considered True
    4584             : 
    4585             : RESULT
    4586             :     number of actual neighbors found (either K or N, if K>N).
    4587             : 
    4588             : This  subroutine  performs  query  and  stores  its result in the internal
    4589             : structures  of  the  buffer object. You can use following  subroutines  to
    4590             : obtain these results (pay attention to "buf" in their names):
    4591             : * KDTreeTsQueryResultsX() to get X-values
    4592             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    4593             : * KDTreeTsQueryResultsTags() to get tag values
    4594             : * KDTreeTsQueryResultsDistances() to get distances
    4595             :     
    4596             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    4597             :            was used to initialize buffer. Any attempt to use biffer   with
    4598             :            different object is dangerous - you  may  get  integrity  check
    4599             :            failure (exception) because sizes of internal arrays do not fit
    4600             :            to dimensions of KD-tree structure.
    4601             : 
    4602             :   -- ALGLIB --
    4603             :      Copyright 18.03.2016 by Bochkanov Sergey
    4604             : *************************************************************************/
    4605           0 : ae_int_t kdtreetsqueryknn(kdtree* kdt,
    4606             :      kdtreerequestbuffer* buf,
    4607             :      /* Real    */ ae_vector* x,
    4608             :      ae_int_t k,
    4609             :      ae_bool selfmatch,
    4610             :      ae_state *_state)
    4611             : {
    4612             :     ae_int_t result;
    4613             : 
    4614             : 
    4615           0 :     ae_assert(k>=1, "KDTreeTsQueryKNN: K<1!", _state);
    4616           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeTsQueryKNN: Length(X)<NX!", _state);
    4617           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeTsQueryKNN: X contains infinite or NaN values!", _state);
    4618           0 :     result = kdtreetsqueryaknn(kdt, buf, x, k, selfmatch, 0.0, _state);
    4619           0 :     return result;
    4620             : }
    4621             : 
    4622             : 
    4623             : /*************************************************************************
    4624             : R-NN query: all points within R-sphere centered at X, ordered by  distance
    4625             : between point and X (by ascending).
    4626             : 
    4627             : NOTE: it is also possible to perform undordered queries performed by means
    4628             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
    4629             :       are faster because we do not have to use heap structure for sorting.
    4630             : 
    4631             : IMPORTANT: this function can not be used in multithreaded code because  it
    4632             :            uses internal temporary buffer of kd-tree object, which can not
    4633             :            be shared between multiple threads.  If  you  want  to  perform
    4634             :            parallel requests, use function  which  uses  external  request
    4635             :            buffer: kdtreetsqueryrnn() ("Ts" stands for "thread-safe").
    4636             : 
    4637             : INPUT PARAMETERS
    4638             :     KDT         -   KD-tree
    4639             :     X           -   point, array[0..NX-1].
    4640             :     R           -   radius of sphere (in corresponding norm), R>0
    4641             :     SelfMatch   -   whether self-matches are allowed:
    4642             :                     * if True, nearest neighbor may be the point itself
    4643             :                       (if it exists in original dataset)
    4644             :                     * if False, then only points with non-zero distance
    4645             :                       are returned
    4646             :                     * if not given, considered True
    4647             : 
    4648             : RESULT
    4649             :     number of neighbors found, >=0
    4650             : 
    4651             : This  subroutine  performs  query  and  stores  its result in the internal
    4652             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    4653             : actual results:
    4654             : * KDTreeQueryResultsX() to get X-values
    4655             : * KDTreeQueryResultsXY() to get X- and Y-values
    4656             : * KDTreeQueryResultsTags() to get tag values
    4657             : * KDTreeQueryResultsDistances() to get distances
    4658             : 
    4659             :   -- ALGLIB --
    4660             :      Copyright 28.02.2010 by Bochkanov Sergey
    4661             : *************************************************************************/
    4662           0 : ae_int_t kdtreequeryrnn(kdtree* kdt,
    4663             :      /* Real    */ ae_vector* x,
    4664             :      double r,
    4665             :      ae_bool selfmatch,
    4666             :      ae_state *_state)
    4667             : {
    4668             :     ae_int_t result;
    4669             : 
    4670             : 
    4671           0 :     ae_assert(ae_fp_greater(r,(double)(0)), "KDTreeQueryRNN: incorrect R!", _state);
    4672           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeQueryRNN: Length(X)<NX!", _state);
    4673           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeQueryRNN: X contains infinite or NaN values!", _state);
    4674           0 :     result = kdtreetsqueryrnn(kdt, &kdt->innerbuf, x, r, selfmatch, _state);
    4675           0 :     return result;
    4676             : }
    4677             : 
    4678             : 
    4679             : /*************************************************************************
    4680             : R-NN query: all points within R-sphere  centered  at  X,  no  ordering  by
    4681             : distance as undicated by "U" suffix (faster that ordered query, for  large
    4682             : queries - significantly faster).
    4683             : 
    4684             : IMPORTANT: this function can not be used in multithreaded code because  it
    4685             :            uses internal temporary buffer of kd-tree object, which can not
    4686             :            be shared between multiple threads.  If  you  want  to  perform
    4687             :            parallel requests, use function  which  uses  external  request
    4688             :            buffer: kdtreetsqueryrnn() ("Ts" stands for "thread-safe").
    4689             : 
    4690             : INPUT PARAMETERS
    4691             :     KDT         -   KD-tree
    4692             :     X           -   point, array[0..NX-1].
    4693             :     R           -   radius of sphere (in corresponding norm), R>0
    4694             :     SelfMatch   -   whether self-matches are allowed:
    4695             :                     * if True, nearest neighbor may be the point itself
    4696             :                       (if it exists in original dataset)
    4697             :                     * if False, then only points with non-zero distance
    4698             :                       are returned
    4699             :                     * if not given, considered True
    4700             : 
    4701             : RESULT
    4702             :     number of neighbors found, >=0
    4703             : 
    4704             : This  subroutine  performs  query  and  stores  its result in the internal
    4705             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    4706             : actual results:
    4707             : * KDTreeQueryResultsX() to get X-values
    4708             : * KDTreeQueryResultsXY() to get X- and Y-values
    4709             : * KDTreeQueryResultsTags() to get tag values
    4710             : * KDTreeQueryResultsDistances() to get distances
    4711             : 
    4712             : As indicated by "U" suffix, this function returns unordered results.
    4713             : 
    4714             :   -- ALGLIB --
    4715             :      Copyright 01.11.2018 by Bochkanov Sergey
    4716             : *************************************************************************/
    4717           0 : ae_int_t kdtreequeryrnnu(kdtree* kdt,
    4718             :      /* Real    */ ae_vector* x,
    4719             :      double r,
    4720             :      ae_bool selfmatch,
    4721             :      ae_state *_state)
    4722             : {
    4723             :     ae_int_t result;
    4724             : 
    4725             : 
    4726           0 :     ae_assert(ae_fp_greater(r,(double)(0)), "KDTreeQueryRNNU: incorrect R!", _state);
    4727           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeQueryRNNU: Length(X)<NX!", _state);
    4728           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeQueryRNNU: X contains infinite or NaN values!", _state);
    4729           0 :     result = kdtreetsqueryrnnu(kdt, &kdt->innerbuf, x, r, selfmatch, _state);
    4730           0 :     return result;
    4731             : }
    4732             : 
    4733             : 
    4734             : /*************************************************************************
    4735             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    4736             : thread-local buffer, sorted by distance between point and X (by ascending)
    4737             : 
    4738             : You can call this function from multiple threads for same kd-tree instance,
    4739             : assuming that different instances of buffer object are passed to different
    4740             : threads.
    4741             : 
    4742             : NOTE: it is also possible to perform undordered queries performed by means
    4743             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
    4744             :       are faster because we do not have to use heap structure for sorting.
    4745             : 
    4746             : INPUT PARAMETERS
    4747             :     KDT         -   KD-tree
    4748             :     Buf         -   request buffer  object  created  for  this  particular
    4749             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    4750             :                     function.
    4751             :     X           -   point, array[0..NX-1].
    4752             :     R           -   radius of sphere (in corresponding norm), R>0
    4753             :     SelfMatch   -   whether self-matches are allowed:
    4754             :                     * if True, nearest neighbor may be the point itself
    4755             :                       (if it exists in original dataset)
    4756             :                     * if False, then only points with non-zero distance
    4757             :                       are returned
    4758             :                     * if not given, considered True
    4759             : 
    4760             : RESULT
    4761             :     number of neighbors found, >=0
    4762             : 
    4763             : This  subroutine  performs  query  and  stores  its result in the internal
    4764             : structures  of  the  buffer object. You can use following  subroutines  to
    4765             : obtain these results (pay attention to "buf" in their names):
    4766             : * KDTreeTsQueryResultsX() to get X-values
    4767             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    4768             : * KDTreeTsQueryResultsTags() to get tag values
    4769             : * KDTreeTsQueryResultsDistances() to get distances
    4770             :     
    4771             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    4772             :            was used to initialize buffer. Any attempt to use biffer   with
    4773             :            different object is dangerous - you  may  get  integrity  check
    4774             :            failure (exception) because sizes of internal arrays do not fit
    4775             :            to dimensions of KD-tree structure.
    4776             : 
    4777             :   -- ALGLIB --
    4778             :      Copyright 18.03.2016 by Bochkanov Sergey
    4779             : *************************************************************************/
    4780           0 : ae_int_t kdtreetsqueryrnn(kdtree* kdt,
    4781             :      kdtreerequestbuffer* buf,
    4782             :      /* Real    */ ae_vector* x,
    4783             :      double r,
    4784             :      ae_bool selfmatch,
    4785             :      ae_state *_state)
    4786             : {
    4787             :     ae_int_t result;
    4788             : 
    4789             : 
    4790           0 :     ae_assert(ae_isfinite(r, _state)&&ae_fp_greater(r,(double)(0)), "KDTreeTsQueryRNN: incorrect R!", _state);
    4791           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeTsQueryRNN: Length(X)<NX!", _state);
    4792           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeTsQueryRNN: X contains infinite or NaN values!", _state);
    4793           0 :     result = nearestneighbor_tsqueryrnn(kdt, buf, x, r, selfmatch, ae_true, _state);
    4794           0 :     return result;
    4795             : }
    4796             : 
    4797             : 
    4798             : /*************************************************************************
    4799             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    4800             : thread-local buffer, no ordering by distance as undicated  by  "U"  suffix
    4801             : (faster that ordered query, for large queries - significantly faster).
    4802             : 
    4803             : You can call this function from multiple threads for same kd-tree instance,
    4804             : assuming that different instances of buffer object are passed to different
    4805             : threads.
    4806             : 
    4807             : INPUT PARAMETERS
    4808             :     KDT         -   KD-tree
    4809             :     Buf         -   request buffer  object  created  for  this  particular
    4810             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    4811             :                     function.
    4812             :     X           -   point, array[0..NX-1].
    4813             :     R           -   radius of sphere (in corresponding norm), R>0
    4814             :     SelfMatch   -   whether self-matches are allowed:
    4815             :                     * if True, nearest neighbor may be the point itself
    4816             :                       (if it exists in original dataset)
    4817             :                     * if False, then only points with non-zero distance
    4818             :                       are returned
    4819             :                     * if not given, considered True
    4820             : 
    4821             : RESULT
    4822             :     number of neighbors found, >=0
    4823             : 
    4824             : This  subroutine  performs  query  and  stores  its result in the internal
    4825             : structures  of  the  buffer object. You can use following  subroutines  to
    4826             : obtain these results (pay attention to "buf" in their names):
    4827             : * KDTreeTsQueryResultsX() to get X-values
    4828             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    4829             : * KDTreeTsQueryResultsTags() to get tag values
    4830             : * KDTreeTsQueryResultsDistances() to get distances
    4831             : 
    4832             : As indicated by "U" suffix, this function returns unordered results.
    4833             :     
    4834             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    4835             :            was used to initialize buffer. Any attempt to use biffer   with
    4836             :            different object is dangerous - you  may  get  integrity  check
    4837             :            failure (exception) because sizes of internal arrays do not fit
    4838             :            to dimensions of KD-tree structure.
    4839             : 
    4840             :   -- ALGLIB --
    4841             :      Copyright 18.03.2016 by Bochkanov Sergey
    4842             : *************************************************************************/
    4843           0 : ae_int_t kdtreetsqueryrnnu(kdtree* kdt,
    4844             :      kdtreerequestbuffer* buf,
    4845             :      /* Real    */ ae_vector* x,
    4846             :      double r,
    4847             :      ae_bool selfmatch,
    4848             :      ae_state *_state)
    4849             : {
    4850             :     ae_int_t result;
    4851             : 
    4852             : 
    4853           0 :     ae_assert(ae_isfinite(r, _state)&&ae_fp_greater(r,(double)(0)), "KDTreeTsQueryRNNU: incorrect R!", _state);
    4854           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeTsQueryRNNU: Length(X)<NX!", _state);
    4855           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeTsQueryRNNU: X contains infinite or NaN values!", _state);
    4856           0 :     result = nearestneighbor_tsqueryrnn(kdt, buf, x, r, selfmatch, ae_false, _state);
    4857           0 :     return result;
    4858             : }
    4859             : 
    4860             : 
    4861             : /*************************************************************************
    4862             : K-NN query: approximate K nearest neighbors
    4863             : 
    4864             : IMPORTANT: this function can not be used in multithreaded code because  it
    4865             :            uses internal temporary buffer of kd-tree object, which can not
    4866             :            be shared between multiple threads.  If  you  want  to  perform
    4867             :            parallel requests, use function  which  uses  external  request
    4868             :            buffer: KDTreeTsQueryAKNN() ("Ts" stands for "thread-safe").
    4869             : 
    4870             : INPUT PARAMETERS
    4871             :     KDT         -   KD-tree
    4872             :     X           -   point, array[0..NX-1].
    4873             :     K           -   number of neighbors to return, K>=1
    4874             :     SelfMatch   -   whether self-matches are allowed:
    4875             :                     * if True, nearest neighbor may be the point itself
    4876             :                       (if it exists in original dataset)
    4877             :                     * if False, then only points with non-zero distance
    4878             :                       are returned
    4879             :                     * if not given, considered True
    4880             :     Eps         -   approximation factor, Eps>=0. eps-approximate  nearest
    4881             :                     neighbor  is  a  neighbor  whose distance from X is at
    4882             :                     most (1+eps) times distance of true nearest neighbor.
    4883             : 
    4884             : RESULT
    4885             :     number of actual neighbors found (either K or N, if K>N).
    4886             :     
    4887             : NOTES
    4888             :     significant performance gain may be achieved only when Eps  is  is  on
    4889             :     the order of magnitude of 1 or larger.
    4890             : 
    4891             : This  subroutine  performs  query  and  stores  its result in the internal
    4892             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    4893             : these results:
    4894             : * KDTreeQueryResultsX() to get X-values
    4895             : * KDTreeQueryResultsXY() to get X- and Y-values
    4896             : * KDTreeQueryResultsTags() to get tag values
    4897             : * KDTreeQueryResultsDistances() to get distances
    4898             : 
    4899             :   -- ALGLIB --
    4900             :      Copyright 28.02.2010 by Bochkanov Sergey
    4901             : *************************************************************************/
    4902           0 : ae_int_t kdtreequeryaknn(kdtree* kdt,
    4903             :      /* Real    */ ae_vector* x,
    4904             :      ae_int_t k,
    4905             :      ae_bool selfmatch,
    4906             :      double eps,
    4907             :      ae_state *_state)
    4908             : {
    4909             :     ae_int_t result;
    4910             : 
    4911             : 
    4912           0 :     result = kdtreetsqueryaknn(kdt, &kdt->innerbuf, x, k, selfmatch, eps, _state);
    4913           0 :     return result;
    4914             : }
    4915             : 
    4916             : 
    4917             : /*************************************************************************
    4918             : K-NN query: approximate K nearest neighbors, using thread-local buffer.
    4919             : 
    4920             : You can call this function from multiple threads for same kd-tree instance,
    4921             : assuming that different instances of buffer object are passed to different
    4922             : threads.
    4923             : 
    4924             : INPUT PARAMETERS
    4925             :     KDT         -   KD-tree
    4926             :     Buf         -   request buffer  object  created  for  this  particular
    4927             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    4928             :                     function.
    4929             :     X           -   point, array[0..NX-1].
    4930             :     K           -   number of neighbors to return, K>=1
    4931             :     SelfMatch   -   whether self-matches are allowed:
    4932             :                     * if True, nearest neighbor may be the point itself
    4933             :                       (if it exists in original dataset)
    4934             :                     * if False, then only points with non-zero distance
    4935             :                       are returned
    4936             :                     * if not given, considered True
    4937             :     Eps         -   approximation factor, Eps>=0. eps-approximate  nearest
    4938             :                     neighbor  is  a  neighbor  whose distance from X is at
    4939             :                     most (1+eps) times distance of true nearest neighbor.
    4940             : 
    4941             : RESULT
    4942             :     number of actual neighbors found (either K or N, if K>N).
    4943             :     
    4944             : NOTES
    4945             :     significant performance gain may be achieved only when Eps  is  is  on
    4946             :     the order of magnitude of 1 or larger.
    4947             : 
    4948             : This  subroutine  performs  query  and  stores  its result in the internal
    4949             : structures  of  the  buffer object. You can use following  subroutines  to
    4950             : obtain these results (pay attention to "buf" in their names):
    4951             : * KDTreeTsQueryResultsX() to get X-values
    4952             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    4953             : * KDTreeTsQueryResultsTags() to get tag values
    4954             : * KDTreeTsQueryResultsDistances() to get distances
    4955             :     
    4956             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    4957             :            was used to initialize buffer. Any attempt to use biffer   with
    4958             :            different object is dangerous - you  may  get  integrity  check
    4959             :            failure (exception) because sizes of internal arrays do not fit
    4960             :            to dimensions of KD-tree structure.
    4961             : 
    4962             :   -- ALGLIB --
    4963             :      Copyright 18.03.2016 by Bochkanov Sergey
    4964             : *************************************************************************/
    4965           0 : ae_int_t kdtreetsqueryaknn(kdtree* kdt,
    4966             :      kdtreerequestbuffer* buf,
    4967             :      /* Real    */ ae_vector* x,
    4968             :      ae_int_t k,
    4969             :      ae_bool selfmatch,
    4970             :      double eps,
    4971             :      ae_state *_state)
    4972             : {
    4973             :     ae_int_t i;
    4974             :     ae_int_t j;
    4975             :     ae_int_t result;
    4976             : 
    4977             : 
    4978           0 :     ae_assert(k>0, "KDTreeTsQueryAKNN: incorrect K!", _state);
    4979           0 :     ae_assert(ae_fp_greater_eq(eps,(double)(0)), "KDTreeTsQueryAKNN: incorrect Eps!", _state);
    4980           0 :     ae_assert(x->cnt>=kdt->nx, "KDTreeTsQueryAKNN: Length(X)<NX!", _state);
    4981           0 :     ae_assert(isfinitevector(x, kdt->nx, _state), "KDTreeTsQueryAKNN: X contains infinite or NaN values!", _state);
    4982             :     
    4983             :     /*
    4984             :      * Handle special case: KDT.N=0
    4985             :      */
    4986           0 :     if( kdt->n==0 )
    4987             :     {
    4988           0 :         buf->kcur = 0;
    4989           0 :         result = 0;
    4990           0 :         return result;
    4991             :     }
    4992             :     
    4993             :     /*
    4994             :      * Check consistency of request buffer
    4995             :      */
    4996           0 :     nearestneighbor_checkrequestbufferconsistency(kdt, buf, _state);
    4997             :     
    4998             :     /*
    4999             :      * Prepare parameters
    5000             :      */
    5001           0 :     k = ae_minint(k, kdt->n, _state);
    5002           0 :     buf->kneeded = k;
    5003           0 :     buf->rneeded = (double)(0);
    5004           0 :     buf->selfmatch = selfmatch;
    5005           0 :     if( kdt->normtype==2 )
    5006             :     {
    5007           0 :         buf->approxf = 1/ae_sqr(1+eps, _state);
    5008             :     }
    5009             :     else
    5010             :     {
    5011           0 :         buf->approxf = 1/(1+eps);
    5012             :     }
    5013           0 :     buf->kcur = 0;
    5014             :     
    5015             :     /*
    5016             :      * calculate distance from point to current bounding box
    5017             :      */
    5018           0 :     nearestneighbor_kdtreeinitbox(kdt, x, buf, _state);
    5019             :     
    5020             :     /*
    5021             :      * call recursive search
    5022             :      * results are returned as heap
    5023             :      */
    5024           0 :     nearestneighbor_kdtreequerynnrec(kdt, buf, 0, _state);
    5025             :     
    5026             :     /*
    5027             :      * pop from heap to generate ordered representation
    5028             :      *
    5029             :      * last element is non pop'ed because it is already in
    5030             :      * its place
    5031             :      */
    5032           0 :     result = buf->kcur;
    5033           0 :     j = buf->kcur;
    5034           0 :     for(i=buf->kcur; i>=2; i--)
    5035             :     {
    5036           0 :         tagheappopi(&buf->r, &buf->idx, &j, _state);
    5037             :     }
    5038           0 :     return result;
    5039             : }
    5040             : 
    5041             : 
    5042             : /*************************************************************************
    5043             : Box query: all points within user-specified box.
    5044             : 
    5045             : IMPORTANT: this function can not be used in multithreaded code because  it
    5046             :            uses internal temporary buffer of kd-tree object, which can not
    5047             :            be shared between multiple threads.  If  you  want  to  perform
    5048             :            parallel requests, use function  which  uses  external  request
    5049             :            buffer: KDTreeTsQueryBox() ("Ts" stands for "thread-safe").
    5050             : 
    5051             : INPUT PARAMETERS
    5052             :     KDT         -   KD-tree
    5053             :     BoxMin      -   lower bounds, array[0..NX-1].
    5054             :     BoxMax      -   upper bounds, array[0..NX-1].
    5055             : 
    5056             : 
    5057             : RESULT
    5058             :     number of actual neighbors found (in [0,N]).
    5059             : 
    5060             : This  subroutine  performs  query  and  stores  its result in the internal
    5061             : structures of the KD-tree. You can use  following  subroutines  to  obtain
    5062             : these results:
    5063             : * KDTreeQueryResultsX() to get X-values
    5064             : * KDTreeQueryResultsXY() to get X- and Y-values
    5065             : * KDTreeQueryResultsTags() to get tag values
    5066             : * KDTreeQueryResultsDistances() returns zeros for this request
    5067             :     
    5068             : NOTE: this particular query returns unordered results, because there is no
    5069             :       meaningful way of  ordering  points.  Furthermore,  no 'distance' is
    5070             :       associated with points - it is either INSIDE  or OUTSIDE (so request
    5071             :       for distances will return zeros).
    5072             : 
    5073             :   -- ALGLIB --
    5074             :      Copyright 14.05.2016 by Bochkanov Sergey
    5075             : *************************************************************************/
    5076           0 : ae_int_t kdtreequerybox(kdtree* kdt,
    5077             :      /* Real    */ ae_vector* boxmin,
    5078             :      /* Real    */ ae_vector* boxmax,
    5079             :      ae_state *_state)
    5080             : {
    5081             :     ae_int_t result;
    5082             : 
    5083             : 
    5084           0 :     result = kdtreetsquerybox(kdt, &kdt->innerbuf, boxmin, boxmax, _state);
    5085           0 :     return result;
    5086             : }
    5087             : 
    5088             : 
    5089             : /*************************************************************************
    5090             : Box query: all points within user-specified box, using thread-local buffer.
    5091             : 
    5092             : You can call this function from multiple threads for same kd-tree instance,
    5093             : assuming that different instances of buffer object are passed to different
    5094             : threads.
    5095             : 
    5096             : INPUT PARAMETERS
    5097             :     KDT         -   KD-tree
    5098             :     Buf         -   request buffer  object  created  for  this  particular
    5099             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    5100             :                     function.
    5101             :     BoxMin      -   lower bounds, array[0..NX-1].
    5102             :     BoxMax      -   upper bounds, array[0..NX-1].
    5103             : 
    5104             : RESULT
    5105             :     number of actual neighbors found (in [0,N]).
    5106             : 
    5107             : This  subroutine  performs  query  and  stores  its result in the internal
    5108             : structures  of  the  buffer object. You can use following  subroutines  to
    5109             : obtain these results (pay attention to "ts" in their names):
    5110             : * KDTreeTsQueryResultsX() to get X-values
    5111             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    5112             : * KDTreeTsQueryResultsTags() to get tag values
    5113             : * KDTreeTsQueryResultsDistances() returns zeros for this query
    5114             :     
    5115             : NOTE: this particular query returns unordered results, because there is no
    5116             :       meaningful way of  ordering  points.  Furthermore,  no 'distance' is
    5117             :       associated with points - it is either INSIDE  or OUTSIDE (so request
    5118             :       for distances will return zeros).
    5119             :     
    5120             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    5121             :            was used to initialize buffer. Any attempt to use biffer   with
    5122             :            different object is dangerous - you  may  get  integrity  check
    5123             :            failure (exception) because sizes of internal arrays do not fit
    5124             :            to dimensions of KD-tree structure.
    5125             : 
    5126             :   -- ALGLIB --
    5127             :      Copyright 14.05.2016 by Bochkanov Sergey
    5128             : *************************************************************************/
    5129           0 : ae_int_t kdtreetsquerybox(kdtree* kdt,
    5130             :      kdtreerequestbuffer* buf,
    5131             :      /* Real    */ ae_vector* boxmin,
    5132             :      /* Real    */ ae_vector* boxmax,
    5133             :      ae_state *_state)
    5134             : {
    5135             :     ae_int_t j;
    5136             :     ae_int_t result;
    5137             : 
    5138             : 
    5139           0 :     ae_assert(boxmin->cnt>=kdt->nx, "KDTreeTsQueryBox: Length(BoxMin)<NX!", _state);
    5140           0 :     ae_assert(boxmax->cnt>=kdt->nx, "KDTreeTsQueryBox: Length(BoxMax)<NX!", _state);
    5141           0 :     ae_assert(isfinitevector(boxmin, kdt->nx, _state), "KDTreeTsQueryBox: BoxMin contains infinite or NaN values!", _state);
    5142           0 :     ae_assert(isfinitevector(boxmax, kdt->nx, _state), "KDTreeTsQueryBox: BoxMax contains infinite or NaN values!", _state);
    5143             :     
    5144             :     /*
    5145             :      * Check consistency of request buffer
    5146             :      */
    5147           0 :     nearestneighbor_checkrequestbufferconsistency(kdt, buf, _state);
    5148             :     
    5149             :     /*
    5150             :      * Quick exit for degenerate boxes
    5151             :      */
    5152           0 :     for(j=0; j<=kdt->nx-1; j++)
    5153             :     {
    5154           0 :         if( ae_fp_greater(boxmin->ptr.p_double[j],boxmax->ptr.p_double[j]) )
    5155             :         {
    5156           0 :             buf->kcur = 0;
    5157           0 :             result = 0;
    5158           0 :             return result;
    5159             :         }
    5160             :     }
    5161             :     
    5162             :     /*
    5163             :      * Prepare parameters
    5164             :      */
    5165           0 :     for(j=0; j<=kdt->nx-1; j++)
    5166             :     {
    5167           0 :         buf->boxmin.ptr.p_double[j] = boxmin->ptr.p_double[j];
    5168           0 :         buf->boxmax.ptr.p_double[j] = boxmax->ptr.p_double[j];
    5169           0 :         buf->curboxmin.ptr.p_double[j] = boxmin->ptr.p_double[j];
    5170           0 :         buf->curboxmax.ptr.p_double[j] = boxmax->ptr.p_double[j];
    5171             :     }
    5172           0 :     buf->kcur = 0;
    5173             :     
    5174             :     /*
    5175             :      * call recursive search
    5176             :      */
    5177           0 :     nearestneighbor_kdtreequeryboxrec(kdt, buf, 0, _state);
    5178           0 :     result = buf->kcur;
    5179           0 :     return result;
    5180             : }
    5181             : 
    5182             : 
    5183             : /*************************************************************************
    5184             : X-values from last query.
    5185             : 
    5186             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    5187             : object. If you performed buffered requests (ones which  use  instances  of
    5188             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    5189             : function - kdtreetsqueryresultsx().
    5190             : 
    5191             : INPUT PARAMETERS
    5192             :     KDT     -   KD-tree
    5193             :     X       -   possibly pre-allocated buffer. If X is too small to store
    5194             :                 result, it is resized. If size(X) is enough to store
    5195             :                 result, it is left unchanged.
    5196             : 
    5197             : OUTPUT PARAMETERS
    5198             :     X       -   rows are filled with X-values
    5199             : 
    5200             : NOTES
    5201             : 1. points are ordered by distance from the query point (first = closest)
    5202             : 2. if  XY is larger than required to store result, only leading part  will
    5203             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5204             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5205             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5206             :    you want function  to  resize  array  according  to  result  size,  use
    5207             :    function with same name and suffix 'I'.
    5208             : 
    5209             : SEE ALSO
    5210             : * KDTreeQueryResultsXY()            X- and Y-values
    5211             : * KDTreeQueryResultsTags()          tag values
    5212             : * KDTreeQueryResultsDistances()     distances
    5213             : 
    5214             :   -- ALGLIB --
    5215             :      Copyright 28.02.2010 by Bochkanov Sergey
    5216             : *************************************************************************/
    5217           0 : void kdtreequeryresultsx(kdtree* kdt,
    5218             :      /* Real    */ ae_matrix* x,
    5219             :      ae_state *_state)
    5220             : {
    5221             : 
    5222             : 
    5223           0 :     kdtreetsqueryresultsx(kdt, &kdt->innerbuf, x, _state);
    5224           0 : }
    5225             : 
    5226             : 
    5227             : /*************************************************************************
    5228             : X- and Y-values from last query
    5229             : 
    5230             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    5231             : object. If you performed buffered requests (ones which  use  instances  of
    5232             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    5233             : function - kdtreetsqueryresultsxy().
    5234             : 
    5235             : INPUT PARAMETERS
    5236             :     KDT     -   KD-tree
    5237             :     XY      -   possibly pre-allocated buffer. If XY is too small to store
    5238             :                 result, it is resized. If size(XY) is enough to store
    5239             :                 result, it is left unchanged.
    5240             : 
    5241             : OUTPUT PARAMETERS
    5242             :     XY      -   rows are filled with points: first NX columns with
    5243             :                 X-values, next NY columns - with Y-values.
    5244             : 
    5245             : NOTES
    5246             : 1. points are ordered by distance from the query point (first = closest)
    5247             : 2. if  XY is larger than required to store result, only leading part  will
    5248             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5249             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5250             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5251             :    you want function  to  resize  array  according  to  result  size,  use
    5252             :    function with same name and suffix 'I'.
    5253             : 
    5254             : SEE ALSO
    5255             : * KDTreeQueryResultsX()             X-values
    5256             : * KDTreeQueryResultsTags()          tag values
    5257             : * KDTreeQueryResultsDistances()     distances
    5258             : 
    5259             :   -- ALGLIB --
    5260             :      Copyright 28.02.2010 by Bochkanov Sergey
    5261             : *************************************************************************/
    5262           0 : void kdtreequeryresultsxy(kdtree* kdt,
    5263             :      /* Real    */ ae_matrix* xy,
    5264             :      ae_state *_state)
    5265             : {
    5266             : 
    5267             : 
    5268           0 :     kdtreetsqueryresultsxy(kdt, &kdt->innerbuf, xy, _state);
    5269           0 : }
    5270             : 
    5271             : 
    5272             : /*************************************************************************
    5273             : Tags from last query
    5274             : 
    5275             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    5276             : object. If you performed buffered requests (ones which  use  instances  of
    5277             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    5278             : function - kdtreetsqueryresultstags().
    5279             : 
    5280             : INPUT PARAMETERS
    5281             :     KDT     -   KD-tree
    5282             :     Tags    -   possibly pre-allocated buffer. If X is too small to store
    5283             :                 result, it is resized. If size(X) is enough to store
    5284             :                 result, it is left unchanged.
    5285             : 
    5286             : OUTPUT PARAMETERS
    5287             :     Tags    -   filled with tags associated with points,
    5288             :                 or, when no tags were supplied, with zeros
    5289             : 
    5290             : NOTES
    5291             : 1. points are ordered by distance from the query point (first = closest)
    5292             : 2. if  XY is larger than required to store result, only leading part  will
    5293             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5294             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5295             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5296             :    you want function  to  resize  array  according  to  result  size,  use
    5297             :    function with same name and suffix 'I'.
    5298             : 
    5299             : SEE ALSO
    5300             : * KDTreeQueryResultsX()             X-values
    5301             : * KDTreeQueryResultsXY()            X- and Y-values
    5302             : * KDTreeQueryResultsDistances()     distances
    5303             : 
    5304             :   -- ALGLIB --
    5305             :      Copyright 28.02.2010 by Bochkanov Sergey
    5306             : *************************************************************************/
    5307           0 : void kdtreequeryresultstags(kdtree* kdt,
    5308             :      /* Integer */ ae_vector* tags,
    5309             :      ae_state *_state)
    5310             : {
    5311             : 
    5312             : 
    5313           0 :     kdtreetsqueryresultstags(kdt, &kdt->innerbuf, tags, _state);
    5314           0 : }
    5315             : 
    5316             : 
    5317             : /*************************************************************************
    5318             : Distances from last query
    5319             : 
    5320             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    5321             : object. If you performed buffered requests (ones which  use  instances  of
    5322             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    5323             : function - kdtreetsqueryresultsdistances().
    5324             : 
    5325             : INPUT PARAMETERS
    5326             :     KDT     -   KD-tree
    5327             :     R       -   possibly pre-allocated buffer. If X is too small to store
    5328             :                 result, it is resized. If size(X) is enough to store
    5329             :                 result, it is left unchanged.
    5330             : 
    5331             : OUTPUT PARAMETERS
    5332             :     R       -   filled with distances (in corresponding norm)
    5333             : 
    5334             : NOTES
    5335             : 1. points are ordered by distance from the query point (first = closest)
    5336             : 2. if  XY is larger than required to store result, only leading part  will
    5337             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5338             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5339             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5340             :    you want function  to  resize  array  according  to  result  size,  use
    5341             :    function with same name and suffix 'I'.
    5342             : 
    5343             : SEE ALSO
    5344             : * KDTreeQueryResultsX()             X-values
    5345             : * KDTreeQueryResultsXY()            X- and Y-values
    5346             : * KDTreeQueryResultsTags()          tag values
    5347             : 
    5348             :   -- ALGLIB --
    5349             :      Copyright 28.02.2010 by Bochkanov Sergey
    5350             : *************************************************************************/
    5351           0 : void kdtreequeryresultsdistances(kdtree* kdt,
    5352             :      /* Real    */ ae_vector* r,
    5353             :      ae_state *_state)
    5354             : {
    5355             : 
    5356             : 
    5357           0 :     kdtreetsqueryresultsdistances(kdt, &kdt->innerbuf, r, _state);
    5358           0 : }
    5359             : 
    5360             : 
    5361             : /*************************************************************************
    5362             : X-values from last query associated with kdtreerequestbuffer object.
    5363             : 
    5364             : INPUT PARAMETERS
    5365             :     KDT     -   KD-tree
    5366             :     Buf     -   request  buffer  object  created   for   this   particular
    5367             :                 instance of kd-tree structure.
    5368             :     X       -   possibly pre-allocated buffer. If X is too small to store
    5369             :                 result, it is resized. If size(X) is enough to store
    5370             :                 result, it is left unchanged.
    5371             : 
    5372             : OUTPUT PARAMETERS
    5373             :     X       -   rows are filled with X-values
    5374             : 
    5375             : NOTES
    5376             : 1. points are ordered by distance from the query point (first = closest)
    5377             : 2. if  XY is larger than required to store result, only leading part  will
    5378             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5379             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5380             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5381             :    you want function  to  resize  array  according  to  result  size,  use
    5382             :    function with same name and suffix 'I'.
    5383             : 
    5384             : SEE ALSO
    5385             : * KDTreeQueryResultsXY()            X- and Y-values
    5386             : * KDTreeQueryResultsTags()          tag values
    5387             : * KDTreeQueryResultsDistances()     distances
    5388             : 
    5389             :   -- ALGLIB --
    5390             :      Copyright 28.02.2010 by Bochkanov Sergey
    5391             : *************************************************************************/
    5392           0 : void kdtreetsqueryresultsx(kdtree* kdt,
    5393             :      kdtreerequestbuffer* buf,
    5394             :      /* Real    */ ae_matrix* x,
    5395             :      ae_state *_state)
    5396             : {
    5397             :     ae_int_t i;
    5398             :     ae_int_t k;
    5399             : 
    5400             : 
    5401           0 :     if( buf->kcur==0 )
    5402             :     {
    5403           0 :         return;
    5404             :     }
    5405           0 :     if( x->rows<buf->kcur||x->cols<kdt->nx )
    5406             :     {
    5407           0 :         ae_matrix_set_length(x, buf->kcur, kdt->nx, _state);
    5408             :     }
    5409           0 :     k = buf->kcur;
    5410           0 :     for(i=0; i<=k-1; i++)
    5411             :     {
    5412           0 :         ae_v_move(&x->ptr.pp_double[i][0], 1, &kdt->xy.ptr.pp_double[buf->idx.ptr.p_int[i]][kdt->nx], 1, ae_v_len(0,kdt->nx-1));
    5413             :     }
    5414             : }
    5415             : 
    5416             : 
    5417             : /*************************************************************************
    5418             : X- and Y-values from last query associated with kdtreerequestbuffer object.
    5419             : 
    5420             : INPUT PARAMETERS
    5421             :     KDT     -   KD-tree
    5422             :     Buf     -   request  buffer  object  created   for   this   particular
    5423             :                 instance of kd-tree structure.
    5424             :     XY      -   possibly pre-allocated buffer. If XY is too small to store
    5425             :                 result, it is resized. If size(XY) is enough to store
    5426             :                 result, it is left unchanged.
    5427             : 
    5428             : OUTPUT PARAMETERS
    5429             :     XY      -   rows are filled with points: first NX columns with
    5430             :                 X-values, next NY columns - with Y-values.
    5431             : 
    5432             : NOTES
    5433             : 1. points are ordered by distance from the query point (first = closest)
    5434             : 2. if  XY is larger than required to store result, only leading part  will
    5435             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5436             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5437             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5438             :    you want function  to  resize  array  according  to  result  size,  use
    5439             :    function with same name and suffix 'I'.
    5440             : 
    5441             : SEE ALSO
    5442             : * KDTreeQueryResultsX()             X-values
    5443             : * KDTreeQueryResultsTags()          tag values
    5444             : * KDTreeQueryResultsDistances()     distances
    5445             : 
    5446             :   -- ALGLIB --
    5447             :      Copyright 28.02.2010 by Bochkanov Sergey
    5448             : *************************************************************************/
    5449           0 : void kdtreetsqueryresultsxy(kdtree* kdt,
    5450             :      kdtreerequestbuffer* buf,
    5451             :      /* Real    */ ae_matrix* xy,
    5452             :      ae_state *_state)
    5453             : {
    5454             :     ae_int_t i;
    5455             :     ae_int_t k;
    5456             : 
    5457             : 
    5458           0 :     if( buf->kcur==0 )
    5459             :     {
    5460           0 :         return;
    5461             :     }
    5462           0 :     if( xy->rows<buf->kcur||xy->cols<kdt->nx+kdt->ny )
    5463             :     {
    5464           0 :         ae_matrix_set_length(xy, buf->kcur, kdt->nx+kdt->ny, _state);
    5465             :     }
    5466           0 :     k = buf->kcur;
    5467           0 :     for(i=0; i<=k-1; i++)
    5468             :     {
    5469           0 :         ae_v_move(&xy->ptr.pp_double[i][0], 1, &kdt->xy.ptr.pp_double[buf->idx.ptr.p_int[i]][kdt->nx], 1, ae_v_len(0,kdt->nx+kdt->ny-1));
    5470             :     }
    5471             : }
    5472             : 
    5473             : 
    5474             : /*************************************************************************
    5475             : Tags from last query associated with kdtreerequestbuffer object.
    5476             : 
    5477             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    5478             : object. If you performed buffered requests (ones which  use  instances  of
    5479             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    5480             : function - KDTreeTsqueryresultstags().
    5481             : 
    5482             : INPUT PARAMETERS
    5483             :     KDT     -   KD-tree
    5484             :     Buf     -   request  buffer  object  created   for   this   particular
    5485             :                 instance of kd-tree structure.
    5486             :     Tags    -   possibly pre-allocated buffer. If X is too small to store
    5487             :                 result, it is resized. If size(X) is enough to store
    5488             :                 result, it is left unchanged.
    5489             : 
    5490             : OUTPUT PARAMETERS
    5491             :     Tags    -   filled with tags associated with points,
    5492             :                 or, when no tags were supplied, with zeros
    5493             : 
    5494             : NOTES
    5495             : 1. points are ordered by distance from the query point (first = closest)
    5496             : 2. if  XY is larger than required to store result, only leading part  will
    5497             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5498             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5499             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5500             :    you want function  to  resize  array  according  to  result  size,  use
    5501             :    function with same name and suffix 'I'.
    5502             : 
    5503             : SEE ALSO
    5504             : * KDTreeQueryResultsX()             X-values
    5505             : * KDTreeQueryResultsXY()            X- and Y-values
    5506             : * KDTreeQueryResultsDistances()     distances
    5507             : 
    5508             :   -- ALGLIB --
    5509             :      Copyright 28.02.2010 by Bochkanov Sergey
    5510             : *************************************************************************/
    5511           0 : void kdtreetsqueryresultstags(kdtree* kdt,
    5512             :      kdtreerequestbuffer* buf,
    5513             :      /* Integer */ ae_vector* tags,
    5514             :      ae_state *_state)
    5515             : {
    5516             :     ae_int_t i;
    5517             :     ae_int_t k;
    5518             : 
    5519             : 
    5520           0 :     if( buf->kcur==0 )
    5521             :     {
    5522           0 :         return;
    5523             :     }
    5524           0 :     if( tags->cnt<buf->kcur )
    5525             :     {
    5526           0 :         ae_vector_set_length(tags, buf->kcur, _state);
    5527             :     }
    5528           0 :     k = buf->kcur;
    5529           0 :     for(i=0; i<=k-1; i++)
    5530             :     {
    5531           0 :         tags->ptr.p_int[i] = kdt->tags.ptr.p_int[buf->idx.ptr.p_int[i]];
    5532             :     }
    5533             : }
    5534             : 
    5535             : 
    5536             : /*************************************************************************
    5537             : Distances from last query associated with kdtreerequestbuffer object.
    5538             : 
    5539             : This function retuns results stored in  the  internal  buffer  of  kd-tree
    5540             : object. If you performed buffered requests (ones which  use  instances  of
    5541             : kdtreerequestbuffer class), you  should  call  buffered  version  of  this
    5542             : function - KDTreeTsqueryresultsdistances().
    5543             : 
    5544             : INPUT PARAMETERS
    5545             :     KDT     -   KD-tree
    5546             :     Buf     -   request  buffer  object  created   for   this   particular
    5547             :                 instance of kd-tree structure.
    5548             :     R       -   possibly pre-allocated buffer. If X is too small to store
    5549             :                 result, it is resized. If size(X) is enough to store
    5550             :                 result, it is left unchanged.
    5551             : 
    5552             : OUTPUT PARAMETERS
    5553             :     R       -   filled with distances (in corresponding norm)
    5554             : 
    5555             : NOTES
    5556             : 1. points are ordered by distance from the query point (first = closest)
    5557             : 2. if  XY is larger than required to store result, only leading part  will
    5558             :    be overwritten; trailing part will be left unchanged. So  if  on  input
    5559             :    XY = [[A,B],[C,D]], and result is [1,2],  then  on  exit  we  will  get
    5560             :    XY = [[1,2],[C,D]]. This is done purposely to increase performance;  if
    5561             :    you want function  to  resize  array  according  to  result  size,  use
    5562             :    function with same name and suffix 'I'.
    5563             : 
    5564             : SEE ALSO
    5565             : * KDTreeQueryResultsX()             X-values
    5566             : * KDTreeQueryResultsXY()            X- and Y-values
    5567             : * KDTreeQueryResultsTags()          tag values
    5568             : 
    5569             :   -- ALGLIB --
    5570             :      Copyright 28.02.2010 by Bochkanov Sergey
    5571             : *************************************************************************/
    5572           0 : void kdtreetsqueryresultsdistances(kdtree* kdt,
    5573             :      kdtreerequestbuffer* buf,
    5574             :      /* Real    */ ae_vector* r,
    5575             :      ae_state *_state)
    5576             : {
    5577             :     ae_int_t i;
    5578             :     ae_int_t k;
    5579             : 
    5580             : 
    5581           0 :     if( buf->kcur==0 )
    5582             :     {
    5583           0 :         return;
    5584             :     }
    5585           0 :     if( r->cnt<buf->kcur )
    5586             :     {
    5587           0 :         ae_vector_set_length(r, buf->kcur, _state);
    5588             :     }
    5589           0 :     k = buf->kcur;
    5590             :     
    5591             :     /*
    5592             :      * unload norms
    5593             :      *
    5594             :      * Abs() call is used to handle cases with negative norms
    5595             :      * (generated during KFN requests)
    5596             :      */
    5597           0 :     if( kdt->normtype==0 )
    5598             :     {
    5599           0 :         for(i=0; i<=k-1; i++)
    5600             :         {
    5601           0 :             r->ptr.p_double[i] = ae_fabs(buf->r.ptr.p_double[i], _state);
    5602             :         }
    5603             :     }
    5604           0 :     if( kdt->normtype==1 )
    5605             :     {
    5606           0 :         for(i=0; i<=k-1; i++)
    5607             :         {
    5608           0 :             r->ptr.p_double[i] = ae_fabs(buf->r.ptr.p_double[i], _state);
    5609             :         }
    5610             :     }
    5611           0 :     if( kdt->normtype==2 )
    5612             :     {
    5613           0 :         for(i=0; i<=k-1; i++)
    5614             :         {
    5615           0 :             r->ptr.p_double[i] = ae_sqrt(ae_fabs(buf->r.ptr.p_double[i], _state), _state);
    5616             :         }
    5617             :     }
    5618             : }
    5619             : 
    5620             : 
    5621             : /*************************************************************************
    5622             : X-values from last query; 'interactive' variant for languages like  Python
    5623             : which   support    constructs   like  "X = KDTreeQueryResultsXI(KDT)"  and
    5624             : interactive mode of interpreter.
    5625             : 
    5626             : This function allocates new array on each call,  so  it  is  significantly
    5627             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    5628             : when you call it from command line.
    5629             : 
    5630             :   -- ALGLIB --
    5631             :      Copyright 28.02.2010 by Bochkanov Sergey
    5632             : *************************************************************************/
    5633           0 : void kdtreequeryresultsxi(kdtree* kdt,
    5634             :      /* Real    */ ae_matrix* x,
    5635             :      ae_state *_state)
    5636             : {
    5637             : 
    5638           0 :     ae_matrix_clear(x);
    5639             : 
    5640           0 :     kdtreequeryresultsx(kdt, x, _state);
    5641           0 : }
    5642             : 
    5643             : 
    5644             : /*************************************************************************
    5645             : XY-values from last query; 'interactive' variant for languages like Python
    5646             : which   support    constructs   like "XY = KDTreeQueryResultsXYI(KDT)" and
    5647             : interactive mode of interpreter.
    5648             : 
    5649             : This function allocates new array on each call,  so  it  is  significantly
    5650             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    5651             : when you call it from command line.
    5652             : 
    5653             :   -- ALGLIB --
    5654             :      Copyright 28.02.2010 by Bochkanov Sergey
    5655             : *************************************************************************/
    5656           0 : void kdtreequeryresultsxyi(kdtree* kdt,
    5657             :      /* Real    */ ae_matrix* xy,
    5658             :      ae_state *_state)
    5659             : {
    5660             : 
    5661           0 :     ae_matrix_clear(xy);
    5662             : 
    5663           0 :     kdtreequeryresultsxy(kdt, xy, _state);
    5664           0 : }
    5665             : 
    5666             : 
    5667             : /*************************************************************************
    5668             : Tags  from  last  query;  'interactive' variant for languages like  Python
    5669             : which  support  constructs  like "Tags = KDTreeQueryResultsTagsI(KDT)" and
    5670             : interactive mode of interpreter.
    5671             : 
    5672             : This function allocates new array on each call,  so  it  is  significantly
    5673             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    5674             : when you call it from command line.
    5675             : 
    5676             :   -- ALGLIB --
    5677             :      Copyright 28.02.2010 by Bochkanov Sergey
    5678             : *************************************************************************/
    5679           0 : void kdtreequeryresultstagsi(kdtree* kdt,
    5680             :      /* Integer */ ae_vector* tags,
    5681             :      ae_state *_state)
    5682             : {
    5683             : 
    5684           0 :     ae_vector_clear(tags);
    5685             : 
    5686           0 :     kdtreequeryresultstags(kdt, tags, _state);
    5687           0 : }
    5688             : 
    5689             : 
    5690             : /*************************************************************************
    5691             : Distances from last query; 'interactive' variant for languages like Python
    5692             : which  support  constructs   like  "R = KDTreeQueryResultsDistancesI(KDT)"
    5693             : and interactive mode of interpreter.
    5694             : 
    5695             : This function allocates new array on each call,  so  it  is  significantly
    5696             : slower than its 'non-interactive' counterpart, but it is  more  convenient
    5697             : when you call it from command line.
    5698             : 
    5699             :   -- ALGLIB --
    5700             :      Copyright 28.02.2010 by Bochkanov Sergey
    5701             : *************************************************************************/
    5702           0 : void kdtreequeryresultsdistancesi(kdtree* kdt,
    5703             :      /* Real    */ ae_vector* r,
    5704             :      ae_state *_state)
    5705             : {
    5706             : 
    5707           0 :     ae_vector_clear(r);
    5708             : 
    5709           0 :     kdtreequeryresultsdistances(kdt, r, _state);
    5710           0 : }
    5711             : 
    5712             : 
    5713             : /*************************************************************************
    5714             : It is informational function which returns bounding box for entire dataset.
    5715             : This function is not visible to ALGLIB users, only ALGLIB itself  may  use
    5716             : it.
    5717             : 
    5718             : This function assumes that output buffers are preallocated by caller.
    5719             : 
    5720             :   -- ALGLIB --
    5721             :      Copyright 20.06.2016 by Bochkanov Sergey
    5722             : *************************************************************************/
    5723           0 : void kdtreeexplorebox(kdtree* kdt,
    5724             :      /* Real    */ ae_vector* boxmin,
    5725             :      /* Real    */ ae_vector* boxmax,
    5726             :      ae_state *_state)
    5727             : {
    5728             :     ae_int_t i;
    5729             : 
    5730             : 
    5731           0 :     rvectorsetlengthatleast(boxmin, kdt->nx, _state);
    5732           0 :     rvectorsetlengthatleast(boxmax, kdt->nx, _state);
    5733           0 :     for(i=0; i<=kdt->nx-1; i++)
    5734             :     {
    5735           0 :         boxmin->ptr.p_double[i] = kdt->boxmin.ptr.p_double[i];
    5736           0 :         boxmax->ptr.p_double[i] = kdt->boxmax.ptr.p_double[i];
    5737             :     }
    5738           0 : }
    5739             : 
    5740             : 
    5741             : /*************************************************************************
    5742             : It is informational function which allows to get  information  about  node
    5743             : type. Node index is given by integer value, with 0  corresponding  to root
    5744             : node and other node indexes obtained via exploration.
    5745             : 
    5746             : You should not expect that serialization/unserialization will retain  node
    5747             : indexes. You should keep in  mind  that  future  versions  of  ALGLIB  may
    5748             : introduce new node types.
    5749             : 
    5750             : OUTPUT VALUES:
    5751             :     NodeType    -   node type:
    5752             :                     * 0 corresponds to leaf node, which can be explored by
    5753             :                       kdtreeexploreleaf() function
    5754             :                     * 1 corresponds to split node, which can  be  explored
    5755             :                       by kdtreeexploresplit() function
    5756             : 
    5757             :   -- ALGLIB --
    5758             :      Copyright 20.06.2016 by Bochkanov Sergey
    5759             : *************************************************************************/
    5760           0 : void kdtreeexplorenodetype(kdtree* kdt,
    5761             :      ae_int_t node,
    5762             :      ae_int_t* nodetype,
    5763             :      ae_state *_state)
    5764             : {
    5765             : 
    5766           0 :     *nodetype = 0;
    5767             : 
    5768           0 :     ae_assert(node>=0, "KDTreeExploreNodeType: incorrect node", _state);
    5769           0 :     ae_assert(node<kdt->nodes.cnt, "KDTreeExploreNodeType: incorrect node", _state);
    5770           0 :     if( kdt->nodes.ptr.p_int[node]>0 )
    5771             :     {
    5772             :         
    5773             :         /*
    5774             :          * Leaf node
    5775             :          */
    5776           0 :         *nodetype = 0;
    5777           0 :         return;
    5778             :     }
    5779           0 :     if( kdt->nodes.ptr.p_int[node]==0 )
    5780             :     {
    5781             :         
    5782             :         /*
    5783             :          * Split node
    5784             :          */
    5785           0 :         *nodetype = 1;
    5786           0 :         return;
    5787             :     }
    5788           0 :     ae_assert(ae_false, "KDTreeExploreNodeType: integrity check failure", _state);
    5789             : }
    5790             : 
    5791             : 
    5792             : /*************************************************************************
    5793             : It is informational function which allows to get  information  about  leaf
    5794             : node. Node index is given by integer value, with 0  corresponding  to root
    5795             : node and other node indexes obtained via exploration.
    5796             : 
    5797             : You should not expect that serialization/unserialization will retain  node
    5798             : indexes. You should keep in  mind  that  future  versions  of  ALGLIB  may
    5799             : introduce new node types.
    5800             : 
    5801             : OUTPUT VALUES:
    5802             :     XT      -   output buffer is reallocated (if too small) and filled by
    5803             :                 XY values
    5804             :     K       -   number of rows in XY
    5805             : 
    5806             :   -- ALGLIB --
    5807             :      Copyright 20.06.2016 by Bochkanov Sergey
    5808             : *************************************************************************/
    5809           0 : void kdtreeexploreleaf(kdtree* kdt,
    5810             :      ae_int_t node,
    5811             :      /* Real    */ ae_matrix* xy,
    5812             :      ae_int_t* k,
    5813             :      ae_state *_state)
    5814             : {
    5815             :     ae_int_t offs;
    5816             :     ae_int_t i;
    5817             :     ae_int_t j;
    5818             : 
    5819           0 :     *k = 0;
    5820             : 
    5821           0 :     ae_assert(node>=0, "KDTreeExploreLeaf: incorrect node index", _state);
    5822           0 :     ae_assert(node+1<kdt->nodes.cnt, "KDTreeExploreLeaf: incorrect node index", _state);
    5823           0 :     ae_assert(kdt->nodes.ptr.p_int[node]>0, "KDTreeExploreLeaf: incorrect node index", _state);
    5824           0 :     *k = kdt->nodes.ptr.p_int[node];
    5825           0 :     offs = kdt->nodes.ptr.p_int[node+1];
    5826           0 :     ae_assert(offs>=0, "KDTreeExploreLeaf: integrity error", _state);
    5827           0 :     ae_assert(offs+(*k)-1<kdt->xy.rows, "KDTreeExploreLeaf: integrity error", _state);
    5828           0 :     rmatrixsetlengthatleast(xy, *k, kdt->nx+kdt->ny, _state);
    5829           0 :     for(i=0; i<=*k-1; i++)
    5830             :     {
    5831           0 :         for(j=0; j<=kdt->nx+kdt->ny-1; j++)
    5832             :         {
    5833           0 :             xy->ptr.pp_double[i][j] = kdt->xy.ptr.pp_double[offs+i][kdt->nx+j];
    5834             :         }
    5835             :     }
    5836           0 : }
    5837             : 
    5838             : 
    5839             : /*************************************************************************
    5840             : It is informational function which allows to get  information  about split
    5841             : node. Node index is given by integer value, with 0  corresponding  to root
    5842             : node and other node indexes obtained via exploration.
    5843             : 
    5844             : You should not expect that serialization/unserialization will retain  node
    5845             : indexes. You should keep in  mind  that  future  versions  of  ALGLIB  may
    5846             : introduce new node types.
    5847             : 
    5848             : OUTPUT VALUES:
    5849             :     XT      -   output buffer is reallocated (if too small) and filled by
    5850             :                 XY values
    5851             :     K       -   number of rows in XY
    5852             : 
    5853             :     //      Nodes[idx+1]=dim    dimension to split
    5854             :     //      Nodes[idx+2]=offs   offset of splitting point in Splits[]
    5855             :     //      Nodes[idx+3]=left   position of left child in Nodes[]
    5856             :     //      Nodes[idx+4]=right  position of right child in Nodes[]
    5857             :     
    5858             :   -- ALGLIB --
    5859             :      Copyright 20.06.2016 by Bochkanov Sergey
    5860             : *************************************************************************/
    5861           0 : void kdtreeexploresplit(kdtree* kdt,
    5862             :      ae_int_t node,
    5863             :      ae_int_t* d,
    5864             :      double* s,
    5865             :      ae_int_t* nodele,
    5866             :      ae_int_t* nodege,
    5867             :      ae_state *_state)
    5868             : {
    5869             : 
    5870           0 :     *d = 0;
    5871           0 :     *s = 0;
    5872           0 :     *nodele = 0;
    5873           0 :     *nodege = 0;
    5874             : 
    5875           0 :     ae_assert(node>=0, "KDTreeExploreSplit: incorrect node index", _state);
    5876           0 :     ae_assert(node+4<kdt->nodes.cnt, "KDTreeExploreSplit: incorrect node index", _state);
    5877           0 :     ae_assert(kdt->nodes.ptr.p_int[node]==0, "KDTreeExploreSplit: incorrect node index", _state);
    5878           0 :     *d = kdt->nodes.ptr.p_int[node+1];
    5879           0 :     *s = kdt->splits.ptr.p_double[kdt->nodes.ptr.p_int[node+2]];
    5880           0 :     *nodele = kdt->nodes.ptr.p_int[node+3];
    5881           0 :     *nodege = kdt->nodes.ptr.p_int[node+4];
    5882           0 :     ae_assert(*d>=0, "KDTreeExploreSplit: integrity failure", _state);
    5883           0 :     ae_assert(*d<kdt->nx, "KDTreeExploreSplit: integrity failure", _state);
    5884           0 :     ae_assert(ae_isfinite(*s, _state), "KDTreeExploreSplit: integrity failure", _state);
    5885           0 :     ae_assert(*nodele>=0, "KDTreeExploreSplit: integrity failure", _state);
    5886           0 :     ae_assert(*nodele<kdt->nodes.cnt, "KDTreeExploreSplit: integrity failure", _state);
    5887           0 :     ae_assert(*nodege>=0, "KDTreeExploreSplit: integrity failure", _state);
    5888           0 :     ae_assert(*nodege<kdt->nodes.cnt, "KDTreeExploreSplit: integrity failure", _state);
    5889           0 : }
    5890             : 
    5891             : 
    5892             : /*************************************************************************
    5893             : Serializer: allocation
    5894             : 
    5895             :   -- ALGLIB --
    5896             :      Copyright 14.03.2011 by Bochkanov Sergey
    5897             : *************************************************************************/
    5898           0 : void kdtreealloc(ae_serializer* s, kdtree* tree, ae_state *_state)
    5899             : {
    5900             : 
    5901             : 
    5902             :     
    5903             :     /*
    5904             :      * Header
    5905             :      */
    5906           0 :     ae_serializer_alloc_entry(s);
    5907           0 :     ae_serializer_alloc_entry(s);
    5908             :     
    5909             :     /*
    5910             :      * Data
    5911             :      */
    5912           0 :     ae_serializer_alloc_entry(s);
    5913           0 :     ae_serializer_alloc_entry(s);
    5914           0 :     ae_serializer_alloc_entry(s);
    5915           0 :     ae_serializer_alloc_entry(s);
    5916           0 :     allocrealmatrix(s, &tree->xy, -1, -1, _state);
    5917           0 :     allocintegerarray(s, &tree->tags, -1, _state);
    5918           0 :     allocrealarray(s, &tree->boxmin, -1, _state);
    5919           0 :     allocrealarray(s, &tree->boxmax, -1, _state);
    5920           0 :     allocintegerarray(s, &tree->nodes, -1, _state);
    5921           0 :     allocrealarray(s, &tree->splits, -1, _state);
    5922           0 : }
    5923             : 
    5924             : 
    5925             : /*************************************************************************
    5926             : Serializer: serialization
    5927             : 
    5928             :   -- ALGLIB --
    5929             :      Copyright 14.03.2011 by Bochkanov Sergey
    5930             : *************************************************************************/
    5931           0 : void kdtreeserialize(ae_serializer* s, kdtree* tree, ae_state *_state)
    5932             : {
    5933             : 
    5934             : 
    5935             :     
    5936             :     /*
    5937             :      * Header
    5938             :      */
    5939           0 :     ae_serializer_serialize_int(s, getkdtreeserializationcode(_state), _state);
    5940           0 :     ae_serializer_serialize_int(s, nearestneighbor_kdtreefirstversion, _state);
    5941             :     
    5942             :     /*
    5943             :      * Data
    5944             :      */
    5945           0 :     ae_serializer_serialize_int(s, tree->n, _state);
    5946           0 :     ae_serializer_serialize_int(s, tree->nx, _state);
    5947           0 :     ae_serializer_serialize_int(s, tree->ny, _state);
    5948           0 :     ae_serializer_serialize_int(s, tree->normtype, _state);
    5949           0 :     serializerealmatrix(s, &tree->xy, -1, -1, _state);
    5950           0 :     serializeintegerarray(s, &tree->tags, -1, _state);
    5951           0 :     serializerealarray(s, &tree->boxmin, -1, _state);
    5952           0 :     serializerealarray(s, &tree->boxmax, -1, _state);
    5953           0 :     serializeintegerarray(s, &tree->nodes, -1, _state);
    5954           0 :     serializerealarray(s, &tree->splits, -1, _state);
    5955           0 : }
    5956             : 
    5957             : 
    5958             : /*************************************************************************
    5959             : Serializer: unserialization
    5960             : 
    5961             :   -- ALGLIB --
    5962             :      Copyright 14.03.2011 by Bochkanov Sergey
    5963             : *************************************************************************/
    5964           0 : void kdtreeunserialize(ae_serializer* s, kdtree* tree, ae_state *_state)
    5965             : {
    5966             :     ae_int_t i0;
    5967             :     ae_int_t i1;
    5968             : 
    5969           0 :     _kdtree_clear(tree);
    5970             : 
    5971             :     
    5972             :     /*
    5973             :      * check correctness of header
    5974             :      */
    5975           0 :     ae_serializer_unserialize_int(s, &i0, _state);
    5976           0 :     ae_assert(i0==getkdtreeserializationcode(_state), "KDTreeUnserialize: stream header corrupted", _state);
    5977           0 :     ae_serializer_unserialize_int(s, &i1, _state);
    5978           0 :     ae_assert(i1==nearestneighbor_kdtreefirstversion, "KDTreeUnserialize: stream header corrupted", _state);
    5979             :     
    5980             :     /*
    5981             :      * Unserialize data
    5982             :      */
    5983           0 :     ae_serializer_unserialize_int(s, &tree->n, _state);
    5984           0 :     ae_serializer_unserialize_int(s, &tree->nx, _state);
    5985           0 :     ae_serializer_unserialize_int(s, &tree->ny, _state);
    5986           0 :     ae_serializer_unserialize_int(s, &tree->normtype, _state);
    5987           0 :     unserializerealmatrix(s, &tree->xy, _state);
    5988           0 :     unserializeintegerarray(s, &tree->tags, _state);
    5989           0 :     unserializerealarray(s, &tree->boxmin, _state);
    5990           0 :     unserializerealarray(s, &tree->boxmax, _state);
    5991           0 :     unserializeintegerarray(s, &tree->nodes, _state);
    5992           0 :     unserializerealarray(s, &tree->splits, _state);
    5993           0 :     kdtreecreaterequestbuffer(tree, &tree->innerbuf, _state);
    5994           0 : }
    5995             : 
    5996             : 
    5997             : /*************************************************************************
    5998             : R-NN query: all points within  R-sphere  centered  at  X,  using  external
    5999             : thread-local buffer, sorted by distance between point and X (by ascending)
    6000             : 
    6001             : You can call this function from multiple threads for same kd-tree instance,
    6002             : assuming that different instances of buffer object are passed to different
    6003             : threads.
    6004             : 
    6005             : NOTE: it is also possible to perform undordered queries performed by means
    6006             :       of kdtreequeryrnnu() and kdtreetsqueryrnnu() functions. Such queries
    6007             :       are faster because we do not have to use heap structure for sorting.
    6008             : 
    6009             : INPUT PARAMETERS
    6010             :     KDT         -   KD-tree
    6011             :     Buf         -   request buffer  object  created  for  this  particular
    6012             :                     instance of kd-tree structure with kdtreecreaterequestbuffer()
    6013             :                     function.
    6014             :     X           -   point, array[0..NX-1].
    6015             :     R           -   radius of sphere (in corresponding norm), R>0
    6016             :     SelfMatch   -   whether self-matches are allowed:
    6017             :                     * if True, nearest neighbor may be the point itself
    6018             :                       (if it exists in original dataset)
    6019             :                     * if False, then only points with non-zero distance
    6020             :                       are returned
    6021             :                     * if not given, considered True
    6022             : 
    6023             : RESULT
    6024             :     number of neighbors found, >=0
    6025             : 
    6026             : This  subroutine  performs  query  and  stores  its result in the internal
    6027             : structures  of  the  buffer object. You can use following  subroutines  to
    6028             : obtain these results (pay attention to "buf" in their names):
    6029             : * KDTreeTsQueryResultsX() to get X-values
    6030             : * KDTreeTsQueryResultsXY() to get X- and Y-values
    6031             : * KDTreeTsQueryResultsTags() to get tag values
    6032             : * KDTreeTsQueryResultsDistances() to get distances
    6033             :     
    6034             : IMPORTANT: kd-tree buffer should be used only with  KD-tree  object  which
    6035             :            was used to initialize buffer. Any attempt to use biffer   with
    6036             :            different object is dangerous - you  may  get  integrity  check
    6037             :            failure (exception) because sizes of internal arrays do not fit
    6038             :            to dimensions of KD-tree structure.
    6039             : 
    6040             :   -- ALGLIB --
    6041             :      Copyright 18.03.2016 by Bochkanov Sergey
    6042             : *************************************************************************/
    6043           0 : static ae_int_t nearestneighbor_tsqueryrnn(kdtree* kdt,
    6044             :      kdtreerequestbuffer* buf,
    6045             :      /* Real    */ ae_vector* x,
    6046             :      double r,
    6047             :      ae_bool selfmatch,
    6048             :      ae_bool orderedbydist,
    6049             :      ae_state *_state)
    6050             : {
    6051             :     ae_int_t i;
    6052             :     ae_int_t j;
    6053             :     ae_int_t result;
    6054             : 
    6055             : 
    6056             :     
    6057             :     /*
    6058             :      * Handle special case: KDT.N=0
    6059             :      */
    6060           0 :     if( kdt->n==0 )
    6061             :     {
    6062           0 :         buf->kcur = 0;
    6063           0 :         result = 0;
    6064           0 :         return result;
    6065             :     }
    6066             :     
    6067             :     /*
    6068             :      * Check consistency of request buffer
    6069             :      */
    6070           0 :     nearestneighbor_checkrequestbufferconsistency(kdt, buf, _state);
    6071             :     
    6072             :     /*
    6073             :      * Prepare parameters
    6074             :      */
    6075           0 :     buf->kneeded = 0;
    6076           0 :     if( kdt->normtype!=2 )
    6077             :     {
    6078           0 :         buf->rneeded = r;
    6079             :     }
    6080             :     else
    6081             :     {
    6082           0 :         buf->rneeded = ae_sqr(r, _state);
    6083             :     }
    6084           0 :     buf->selfmatch = selfmatch;
    6085           0 :     buf->approxf = (double)(1);
    6086           0 :     buf->kcur = 0;
    6087             :     
    6088             :     /*
    6089             :      * calculate distance from point to current bounding box
    6090             :      */
    6091           0 :     nearestneighbor_kdtreeinitbox(kdt, x, buf, _state);
    6092             :     
    6093             :     /*
    6094             :      * call recursive search
    6095             :      * results are returned as heap
    6096             :      */
    6097           0 :     nearestneighbor_kdtreequerynnrec(kdt, buf, 0, _state);
    6098           0 :     result = buf->kcur;
    6099             :     
    6100             :     /*
    6101             :      * pop from heap to generate ordered representation
    6102             :      *
    6103             :      * last element is not pop'ed because it is already in
    6104             :      * its place
    6105             :      */
    6106           0 :     if( orderedbydist )
    6107             :     {
    6108           0 :         j = buf->kcur;
    6109           0 :         for(i=buf->kcur; i>=2; i--)
    6110             :         {
    6111           0 :             tagheappopi(&buf->r, &buf->idx, &j, _state);
    6112             :         }
    6113             :     }
    6114           0 :     return result;
    6115             : }
    6116             : 
    6117             : 
    6118             : /*************************************************************************
    6119             : Rearranges nodes [I1,I2) using partition in D-th dimension with S as threshold.
    6120             : Returns split position I3: [I1,I3) and [I3,I2) are created as result.
    6121             : 
    6122             : This subroutine doesn't create tree structures, just rearranges nodes.
    6123             : *************************************************************************/
    6124           0 : static void nearestneighbor_kdtreesplit(kdtree* kdt,
    6125             :      ae_int_t i1,
    6126             :      ae_int_t i2,
    6127             :      ae_int_t d,
    6128             :      double s,
    6129             :      ae_int_t* i3,
    6130             :      ae_state *_state)
    6131             : {
    6132             :     ae_int_t i;
    6133             :     ae_int_t j;
    6134             :     ae_int_t ileft;
    6135             :     ae_int_t iright;
    6136             :     double v;
    6137             : 
    6138           0 :     *i3 = 0;
    6139             : 
    6140           0 :     ae_assert(kdt->n>0, "KDTreeSplit: internal error", _state);
    6141             :     
    6142             :     /*
    6143             :      * split XY/Tags in two parts:
    6144             :      * * [ILeft,IRight] is non-processed part of XY/Tags
    6145             :      *
    6146             :      * After cycle is done, we have Ileft=IRight. We deal with
    6147             :      * this element separately.
    6148             :      *
    6149             :      * After this, [I1,ILeft) contains left part, and [ILeft,I2)
    6150             :      * contains right part.
    6151             :      */
    6152           0 :     ileft = i1;
    6153           0 :     iright = i2-1;
    6154           0 :     while(ileft<iright)
    6155             :     {
    6156           0 :         if( kdt->xy.ptr.pp_double[ileft][d]<=s )
    6157             :         {
    6158             :             
    6159             :             /*
    6160             :              * XY[ILeft] is on its place.
    6161             :              * Advance ILeft.
    6162             :              */
    6163           0 :             ileft = ileft+1;
    6164             :         }
    6165             :         else
    6166             :         {
    6167             :             
    6168             :             /*
    6169             :              * XY[ILeft,..] must be at IRight.
    6170             :              * Swap and advance IRight.
    6171             :              */
    6172           0 :             for(i=0; i<=2*kdt->nx+kdt->ny-1; i++)
    6173             :             {
    6174           0 :                 v = kdt->xy.ptr.pp_double[ileft][i];
    6175           0 :                 kdt->xy.ptr.pp_double[ileft][i] = kdt->xy.ptr.pp_double[iright][i];
    6176           0 :                 kdt->xy.ptr.pp_double[iright][i] = v;
    6177             :             }
    6178           0 :             j = kdt->tags.ptr.p_int[ileft];
    6179           0 :             kdt->tags.ptr.p_int[ileft] = kdt->tags.ptr.p_int[iright];
    6180           0 :             kdt->tags.ptr.p_int[iright] = j;
    6181           0 :             iright = iright-1;
    6182             :         }
    6183             :     }
    6184           0 :     if( kdt->xy.ptr.pp_double[ileft][d]<=s )
    6185             :     {
    6186           0 :         ileft = ileft+1;
    6187             :     }
    6188             :     else
    6189             :     {
    6190           0 :         iright = iright-1;
    6191             :     }
    6192           0 :     *i3 = ileft;
    6193           0 : }
    6194             : 
    6195             : 
    6196             : /*************************************************************************
    6197             : Recursive kd-tree generation subroutine.
    6198             : 
    6199             : PARAMETERS
    6200             :     KDT         tree
    6201             :     NodesOffs   unused part of Nodes[] which must be filled by tree
    6202             :     SplitsOffs  unused part of Splits[]
    6203             :     I1, I2      points from [I1,I2) are processed
    6204             :     
    6205             : NodesOffs[] and SplitsOffs[] must be large enough.
    6206             : 
    6207             :   -- ALGLIB --
    6208             :      Copyright 28.02.2010 by Bochkanov Sergey
    6209             : *************************************************************************/
    6210           0 : static void nearestneighbor_kdtreegeneratetreerec(kdtree* kdt,
    6211             :      ae_int_t* nodesoffs,
    6212             :      ae_int_t* splitsoffs,
    6213             :      ae_int_t i1,
    6214             :      ae_int_t i2,
    6215             :      ae_int_t maxleafsize,
    6216             :      ae_state *_state)
    6217             : {
    6218             :     ae_int_t n;
    6219             :     ae_int_t nx;
    6220             :     ae_int_t ny;
    6221             :     ae_int_t i;
    6222             :     ae_int_t j;
    6223             :     ae_int_t oldoffs;
    6224             :     ae_int_t i3;
    6225             :     ae_int_t cntless;
    6226             :     ae_int_t cntgreater;
    6227             :     double minv;
    6228             :     double maxv;
    6229             :     ae_int_t minidx;
    6230             :     ae_int_t maxidx;
    6231             :     ae_int_t d;
    6232             :     double ds;
    6233             :     double s;
    6234             :     double v;
    6235             :     double v0;
    6236             :     double v1;
    6237             : 
    6238             : 
    6239           0 :     ae_assert(kdt->n>0, "KDTreeGenerateTreeRec: internal error", _state);
    6240           0 :     ae_assert(i2>i1, "KDTreeGenerateTreeRec: internal error", _state);
    6241             :     
    6242             :     /*
    6243             :      * Generate leaf if needed
    6244             :      */
    6245           0 :     if( i2-i1<=maxleafsize )
    6246             :     {
    6247           0 :         kdt->nodes.ptr.p_int[*nodesoffs+0] = i2-i1;
    6248           0 :         kdt->nodes.ptr.p_int[*nodesoffs+1] = i1;
    6249           0 :         *nodesoffs = *nodesoffs+2;
    6250           0 :         return;
    6251             :     }
    6252             :     
    6253             :     /*
    6254             :      * Load values for easier access
    6255             :      */
    6256           0 :     nx = kdt->nx;
    6257           0 :     ny = kdt->ny;
    6258             :     
    6259             :     /*
    6260             :      * Select dimension to split:
    6261             :      * * D is a dimension number
    6262             :      * In case bounding box has zero size, we enforce creation of the leaf node.
    6263             :      */
    6264           0 :     d = 0;
    6265           0 :     ds = kdt->innerbuf.curboxmax.ptr.p_double[0]-kdt->innerbuf.curboxmin.ptr.p_double[0];
    6266           0 :     for(i=1; i<=nx-1; i++)
    6267             :     {
    6268           0 :         v = kdt->innerbuf.curboxmax.ptr.p_double[i]-kdt->innerbuf.curboxmin.ptr.p_double[i];
    6269           0 :         if( v>ds )
    6270             :         {
    6271           0 :             ds = v;
    6272           0 :             d = i;
    6273             :         }
    6274             :     }
    6275           0 :     if( ae_fp_eq(ds,(double)(0)) )
    6276             :     {
    6277           0 :         kdt->nodes.ptr.p_int[*nodesoffs+0] = i2-i1;
    6278           0 :         kdt->nodes.ptr.p_int[*nodesoffs+1] = i1;
    6279           0 :         *nodesoffs = *nodesoffs+2;
    6280           0 :         return;
    6281             :     }
    6282             :     
    6283             :     /*
    6284             :      * Select split position S using sliding midpoint rule,
    6285             :      * rearrange points into [I1,I3) and [I3,I2).
    6286             :      *
    6287             :      * In case all points has same value of D-th component
    6288             :      * (MinV=MaxV) we enforce D-th dimension of bounding
    6289             :      * box to become exactly zero and repeat tree construction.
    6290             :      */
    6291           0 :     s = kdt->innerbuf.curboxmin.ptr.p_double[d]+0.5*ds;
    6292           0 :     ae_v_move(&kdt->innerbuf.buf.ptr.p_double[0], 1, &kdt->xy.ptr.pp_double[i1][d], kdt->xy.stride, ae_v_len(0,i2-i1-1));
    6293           0 :     n = i2-i1;
    6294           0 :     cntless = 0;
    6295           0 :     cntgreater = 0;
    6296           0 :     minv = kdt->innerbuf.buf.ptr.p_double[0];
    6297           0 :     maxv = kdt->innerbuf.buf.ptr.p_double[0];
    6298           0 :     minidx = i1;
    6299           0 :     maxidx = i1;
    6300           0 :     for(i=0; i<=n-1; i++)
    6301             :     {
    6302           0 :         v = kdt->innerbuf.buf.ptr.p_double[i];
    6303           0 :         if( v<minv )
    6304             :         {
    6305           0 :             minv = v;
    6306           0 :             minidx = i1+i;
    6307             :         }
    6308           0 :         if( v>maxv )
    6309             :         {
    6310           0 :             maxv = v;
    6311           0 :             maxidx = i1+i;
    6312             :         }
    6313           0 :         if( v<s )
    6314             :         {
    6315           0 :             cntless = cntless+1;
    6316             :         }
    6317           0 :         if( v>s )
    6318             :         {
    6319           0 :             cntgreater = cntgreater+1;
    6320             :         }
    6321             :     }
    6322           0 :     if( minv==maxv )
    6323             :     {
    6324             :         
    6325             :         /*
    6326             :          * In case all points has same value of D-th component
    6327             :          * (MinV=MaxV) we enforce D-th dimension of bounding
    6328             :          * box to become exactly zero and repeat tree construction.
    6329             :          */
    6330           0 :         v0 = kdt->innerbuf.curboxmin.ptr.p_double[d];
    6331           0 :         v1 = kdt->innerbuf.curboxmax.ptr.p_double[d];
    6332           0 :         kdt->innerbuf.curboxmin.ptr.p_double[d] = minv;
    6333           0 :         kdt->innerbuf.curboxmax.ptr.p_double[d] = maxv;
    6334           0 :         nearestneighbor_kdtreegeneratetreerec(kdt, nodesoffs, splitsoffs, i1, i2, maxleafsize, _state);
    6335           0 :         kdt->innerbuf.curboxmin.ptr.p_double[d] = v0;
    6336           0 :         kdt->innerbuf.curboxmax.ptr.p_double[d] = v1;
    6337           0 :         return;
    6338             :     }
    6339           0 :     if( cntless>0&&cntgreater>0 )
    6340             :     {
    6341             :         
    6342             :         /*
    6343             :          * normal midpoint split
    6344             :          */
    6345           0 :         nearestneighbor_kdtreesplit(kdt, i1, i2, d, s, &i3, _state);
    6346             :     }
    6347             :     else
    6348             :     {
    6349             :         
    6350             :         /*
    6351             :          * sliding midpoint
    6352             :          */
    6353           0 :         if( cntless==0 )
    6354             :         {
    6355             :             
    6356             :             /*
    6357             :              * 1. move split to MinV,
    6358             :              * 2. place one point to the left bin (move to I1),
    6359             :              *    others - to the right bin
    6360             :              */
    6361           0 :             s = minv;
    6362           0 :             if( minidx!=i1 )
    6363             :             {
    6364           0 :                 for(i=0; i<=2*nx+ny-1; i++)
    6365             :                 {
    6366           0 :                     v = kdt->xy.ptr.pp_double[minidx][i];
    6367           0 :                     kdt->xy.ptr.pp_double[minidx][i] = kdt->xy.ptr.pp_double[i1][i];
    6368           0 :                     kdt->xy.ptr.pp_double[i1][i] = v;
    6369             :                 }
    6370           0 :                 j = kdt->tags.ptr.p_int[minidx];
    6371           0 :                 kdt->tags.ptr.p_int[minidx] = kdt->tags.ptr.p_int[i1];
    6372           0 :                 kdt->tags.ptr.p_int[i1] = j;
    6373             :             }
    6374           0 :             i3 = i1+1;
    6375             :         }
    6376             :         else
    6377             :         {
    6378             :             
    6379             :             /*
    6380             :              * 1. move split to MaxV,
    6381             :              * 2. place one point to the right bin (move to I2-1),
    6382             :              *    others - to the left bin
    6383             :              */
    6384           0 :             s = maxv;
    6385           0 :             if( maxidx!=i2-1 )
    6386             :             {
    6387           0 :                 for(i=0; i<=2*nx+ny-1; i++)
    6388             :                 {
    6389           0 :                     v = kdt->xy.ptr.pp_double[maxidx][i];
    6390           0 :                     kdt->xy.ptr.pp_double[maxidx][i] = kdt->xy.ptr.pp_double[i2-1][i];
    6391           0 :                     kdt->xy.ptr.pp_double[i2-1][i] = v;
    6392             :                 }
    6393           0 :                 j = kdt->tags.ptr.p_int[maxidx];
    6394           0 :                 kdt->tags.ptr.p_int[maxidx] = kdt->tags.ptr.p_int[i2-1];
    6395           0 :                 kdt->tags.ptr.p_int[i2-1] = j;
    6396             :             }
    6397           0 :             i3 = i2-1;
    6398             :         }
    6399             :     }
    6400             :     
    6401             :     /*
    6402             :      * Generate 'split' node
    6403             :      */
    6404           0 :     kdt->nodes.ptr.p_int[*nodesoffs+0] = 0;
    6405           0 :     kdt->nodes.ptr.p_int[*nodesoffs+1] = d;
    6406           0 :     kdt->nodes.ptr.p_int[*nodesoffs+2] = *splitsoffs;
    6407           0 :     kdt->splits.ptr.p_double[*splitsoffs+0] = s;
    6408           0 :     oldoffs = *nodesoffs;
    6409           0 :     *nodesoffs = *nodesoffs+nearestneighbor_splitnodesize;
    6410           0 :     *splitsoffs = *splitsoffs+1;
    6411             :     
    6412             :     /*
    6413             :      * Recursive generation:
    6414             :      * * update CurBox
    6415             :      * * call subroutine
    6416             :      * * restore CurBox
    6417             :      */
    6418           0 :     kdt->nodes.ptr.p_int[oldoffs+3] = *nodesoffs;
    6419           0 :     v = kdt->innerbuf.curboxmax.ptr.p_double[d];
    6420           0 :     kdt->innerbuf.curboxmax.ptr.p_double[d] = s;
    6421           0 :     nearestneighbor_kdtreegeneratetreerec(kdt, nodesoffs, splitsoffs, i1, i3, maxleafsize, _state);
    6422           0 :     kdt->innerbuf.curboxmax.ptr.p_double[d] = v;
    6423           0 :     kdt->nodes.ptr.p_int[oldoffs+4] = *nodesoffs;
    6424           0 :     v = kdt->innerbuf.curboxmin.ptr.p_double[d];
    6425           0 :     kdt->innerbuf.curboxmin.ptr.p_double[d] = s;
    6426           0 :     nearestneighbor_kdtreegeneratetreerec(kdt, nodesoffs, splitsoffs, i3, i2, maxleafsize, _state);
    6427           0 :     kdt->innerbuf.curboxmin.ptr.p_double[d] = v;
    6428             :     
    6429             :     /*
    6430             :      * Zero-fill unused portions of the node (avoid false warnings by Valgrind
    6431             :      * about attempt to serialize uninitialized values)
    6432             :      */
    6433           0 :     ae_assert(nearestneighbor_splitnodesize==6, "KDTreeGenerateTreeRec: node size has unexpectedly changed", _state);
    6434           0 :     kdt->nodes.ptr.p_int[oldoffs+5] = 0;
    6435             : }
    6436             : 
    6437             : 
    6438             : /*************************************************************************
    6439             : Recursive subroutine for NN queries.
    6440             : 
    6441             :   -- ALGLIB --
    6442             :      Copyright 28.02.2010 by Bochkanov Sergey
    6443             : *************************************************************************/
    6444           0 : static void nearestneighbor_kdtreequerynnrec(kdtree* kdt,
    6445             :      kdtreerequestbuffer* buf,
    6446             :      ae_int_t offs,
    6447             :      ae_state *_state)
    6448             : {
    6449             :     double ptdist;
    6450             :     ae_int_t i;
    6451             :     ae_int_t j;
    6452             :     ae_int_t nx;
    6453             :     ae_int_t i1;
    6454             :     ae_int_t i2;
    6455             :     ae_int_t d;
    6456             :     double s;
    6457             :     double v;
    6458             :     double t1;
    6459             :     ae_int_t childbestoffs;
    6460             :     ae_int_t childworstoffs;
    6461             :     ae_int_t childoffs;
    6462             :     double prevdist;
    6463             :     ae_bool todive;
    6464             :     ae_bool bestisleft;
    6465             :     ae_bool updatemin;
    6466             : 
    6467             : 
    6468           0 :     ae_assert(kdt->n>0, "KDTreeQueryNNRec: internal error", _state);
    6469             :     
    6470             :     /*
    6471             :      * Leaf node.
    6472             :      * Process points.
    6473             :      */
    6474           0 :     if( kdt->nodes.ptr.p_int[offs]>0 )
    6475             :     {
    6476           0 :         i1 = kdt->nodes.ptr.p_int[offs+1];
    6477           0 :         i2 = i1+kdt->nodes.ptr.p_int[offs];
    6478           0 :         for(i=i1; i<=i2-1; i++)
    6479             :         {
    6480             :             
    6481             :             /*
    6482             :              * Calculate distance
    6483             :              */
    6484           0 :             ptdist = (double)(0);
    6485           0 :             nx = kdt->nx;
    6486           0 :             if( kdt->normtype==0 )
    6487             :             {
    6488           0 :                 for(j=0; j<=nx-1; j++)
    6489             :                 {
    6490           0 :                     ptdist = ae_maxreal(ptdist, ae_fabs(kdt->xy.ptr.pp_double[i][j]-buf->x.ptr.p_double[j], _state), _state);
    6491             :                 }
    6492             :             }
    6493           0 :             if( kdt->normtype==1 )
    6494             :             {
    6495           0 :                 for(j=0; j<=nx-1; j++)
    6496             :                 {
    6497           0 :                     ptdist = ptdist+ae_fabs(kdt->xy.ptr.pp_double[i][j]-buf->x.ptr.p_double[j], _state);
    6498             :                 }
    6499             :             }
    6500           0 :             if( kdt->normtype==2 )
    6501             :             {
    6502           0 :                 for(j=0; j<=nx-1; j++)
    6503             :                 {
    6504           0 :                     ptdist = ptdist+ae_sqr(kdt->xy.ptr.pp_double[i][j]-buf->x.ptr.p_double[j], _state);
    6505             :                 }
    6506             :             }
    6507             :             
    6508             :             /*
    6509             :              * Skip points with zero distance if self-matches are turned off
    6510             :              */
    6511           0 :             if( ptdist==0&&!buf->selfmatch )
    6512             :             {
    6513           0 :                 continue;
    6514             :             }
    6515             :             
    6516             :             /*
    6517             :              * We CAN'T process point if R-criterion isn't satisfied,
    6518             :              * i.e. (RNeeded<>0) AND (PtDist>R).
    6519             :              */
    6520           0 :             if( buf->rneeded==0||ptdist<=buf->rneeded )
    6521             :             {
    6522             :                 
    6523             :                 /*
    6524             :                  * R-criterion is satisfied, we must either:
    6525             :                  * * replace worst point, if (KNeeded<>0) AND (KCur=KNeeded)
    6526             :                  *   (or skip, if worst point is better)
    6527             :                  * * add point without replacement otherwise
    6528             :                  */
    6529           0 :                 if( buf->kcur<buf->kneeded||buf->kneeded==0 )
    6530             :                 {
    6531             :                     
    6532             :                     /*
    6533             :                      * add current point to heap without replacement
    6534             :                      */
    6535           0 :                     tagheappushi(&buf->r, &buf->idx, &buf->kcur, ptdist, i, _state);
    6536             :                 }
    6537             :                 else
    6538             :                 {
    6539             :                     
    6540             :                     /*
    6541             :                      * New points are added or not, depending on their distance.
    6542             :                      * If added, they replace element at the top of the heap
    6543             :                      */
    6544           0 :                     if( ptdist<buf->r.ptr.p_double[0] )
    6545             :                     {
    6546           0 :                         if( buf->kneeded==1 )
    6547             :                         {
    6548           0 :                             buf->idx.ptr.p_int[0] = i;
    6549           0 :                             buf->r.ptr.p_double[0] = ptdist;
    6550             :                         }
    6551             :                         else
    6552             :                         {
    6553           0 :                             tagheapreplacetopi(&buf->r, &buf->idx, buf->kneeded, ptdist, i, _state);
    6554             :                         }
    6555             :                     }
    6556             :                 }
    6557             :             }
    6558             :         }
    6559           0 :         return;
    6560             :     }
    6561             :     
    6562             :     /*
    6563             :      * Simple split
    6564             :      */
    6565           0 :     if( kdt->nodes.ptr.p_int[offs]==0 )
    6566             :     {
    6567             :         
    6568             :         /*
    6569             :          * Load:
    6570             :          * * D  dimension to split
    6571             :          * * S  split position
    6572             :          */
    6573           0 :         d = kdt->nodes.ptr.p_int[offs+1];
    6574           0 :         s = kdt->splits.ptr.p_double[kdt->nodes.ptr.p_int[offs+2]];
    6575             :         
    6576             :         /*
    6577             :          * Calculate:
    6578             :          * * ChildBestOffs      child box with best chances
    6579             :          * * ChildWorstOffs     child box with worst chances
    6580             :          */
    6581           0 :         if( buf->x.ptr.p_double[d]<=s )
    6582             :         {
    6583           0 :             childbestoffs = kdt->nodes.ptr.p_int[offs+3];
    6584           0 :             childworstoffs = kdt->nodes.ptr.p_int[offs+4];
    6585           0 :             bestisleft = ae_true;
    6586             :         }
    6587             :         else
    6588             :         {
    6589           0 :             childbestoffs = kdt->nodes.ptr.p_int[offs+4];
    6590           0 :             childworstoffs = kdt->nodes.ptr.p_int[offs+3];
    6591           0 :             bestisleft = ae_false;
    6592             :         }
    6593             :         
    6594             :         /*
    6595             :          * Navigate through childs
    6596             :          */
    6597           0 :         for(i=0; i<=1; i++)
    6598             :         {
    6599             :             
    6600             :             /*
    6601             :              * Select child to process:
    6602             :              * * ChildOffs      current child offset in Nodes[]
    6603             :              * * UpdateMin      whether minimum or maximum value
    6604             :              *                  of bounding box is changed on update
    6605             :              */
    6606           0 :             if( i==0 )
    6607             :             {
    6608           0 :                 childoffs = childbestoffs;
    6609           0 :                 updatemin = !bestisleft;
    6610             :             }
    6611             :             else
    6612             :             {
    6613           0 :                 updatemin = bestisleft;
    6614           0 :                 childoffs = childworstoffs;
    6615             :             }
    6616             :             
    6617             :             /*
    6618             :              * Update bounding box and current distance
    6619             :              */
    6620           0 :             if( updatemin )
    6621             :             {
    6622           0 :                 prevdist = buf->curdist;
    6623           0 :                 t1 = buf->x.ptr.p_double[d];
    6624           0 :                 v = buf->curboxmin.ptr.p_double[d];
    6625           0 :                 if( t1<=s )
    6626             :                 {
    6627           0 :                     if( kdt->normtype==0 )
    6628             :                     {
    6629           0 :                         buf->curdist = ae_maxreal(buf->curdist, s-t1, _state);
    6630             :                     }
    6631           0 :                     if( kdt->normtype==1 )
    6632             :                     {
    6633           0 :                         buf->curdist = buf->curdist-ae_maxreal(v-t1, (double)(0), _state)+s-t1;
    6634             :                     }
    6635           0 :                     if( kdt->normtype==2 )
    6636             :                     {
    6637           0 :                         buf->curdist = buf->curdist-ae_sqr(ae_maxreal(v-t1, (double)(0), _state), _state)+ae_sqr(s-t1, _state);
    6638             :                     }
    6639             :                 }
    6640           0 :                 buf->curboxmin.ptr.p_double[d] = s;
    6641             :             }
    6642             :             else
    6643             :             {
    6644           0 :                 prevdist = buf->curdist;
    6645           0 :                 t1 = buf->x.ptr.p_double[d];
    6646           0 :                 v = buf->curboxmax.ptr.p_double[d];
    6647           0 :                 if( t1>=s )
    6648             :                 {
    6649           0 :                     if( kdt->normtype==0 )
    6650             :                     {
    6651           0 :                         buf->curdist = ae_maxreal(buf->curdist, t1-s, _state);
    6652             :                     }
    6653           0 :                     if( kdt->normtype==1 )
    6654             :                     {
    6655           0 :                         buf->curdist = buf->curdist-ae_maxreal(t1-v, (double)(0), _state)+t1-s;
    6656             :                     }
    6657           0 :                     if( kdt->normtype==2 )
    6658             :                     {
    6659           0 :                         buf->curdist = buf->curdist-ae_sqr(ae_maxreal(t1-v, (double)(0), _state), _state)+ae_sqr(t1-s, _state);
    6660             :                     }
    6661             :                 }
    6662           0 :                 buf->curboxmax.ptr.p_double[d] = s;
    6663             :             }
    6664             :             
    6665             :             /*
    6666             :              * Decide: to dive into cell or not to dive
    6667             :              */
    6668           0 :             if( buf->rneeded!=0&&buf->curdist>buf->rneeded )
    6669             :             {
    6670           0 :                 todive = ae_false;
    6671             :             }
    6672             :             else
    6673             :             {
    6674           0 :                 if( buf->kcur<buf->kneeded||buf->kneeded==0 )
    6675             :                 {
    6676             :                     
    6677             :                     /*
    6678             :                      * KCur<KNeeded (i.e. not all points are found)
    6679             :                      */
    6680           0 :                     todive = ae_true;
    6681             :                 }
    6682             :                 else
    6683             :                 {
    6684             :                     
    6685             :                     /*
    6686             :                      * KCur=KNeeded, decide to dive or not to dive
    6687             :                      * using point position relative to bounding box.
    6688             :                      */
    6689           0 :                     todive = buf->curdist<=buf->r.ptr.p_double[0]*buf->approxf;
    6690             :                 }
    6691             :             }
    6692           0 :             if( todive )
    6693             :             {
    6694           0 :                 nearestneighbor_kdtreequerynnrec(kdt, buf, childoffs, _state);
    6695             :             }
    6696             :             
    6697             :             /*
    6698             :              * Restore bounding box and distance
    6699             :              */
    6700           0 :             if( updatemin )
    6701             :             {
    6702           0 :                 buf->curboxmin.ptr.p_double[d] = v;
    6703             :             }
    6704             :             else
    6705             :             {
    6706           0 :                 buf->curboxmax.ptr.p_double[d] = v;
    6707             :             }
    6708           0 :             buf->curdist = prevdist;
    6709             :         }
    6710           0 :         return;
    6711             :     }
    6712             : }
    6713             : 
    6714             : 
    6715             : /*************************************************************************
    6716             : Recursive subroutine for box queries.
    6717             : 
    6718             :   -- ALGLIB --
    6719             :      Copyright 28.02.2010 by Bochkanov Sergey
    6720             : *************************************************************************/
    6721           0 : static void nearestneighbor_kdtreequeryboxrec(kdtree* kdt,
    6722             :      kdtreerequestbuffer* buf,
    6723             :      ae_int_t offs,
    6724             :      ae_state *_state)
    6725             : {
    6726             :     ae_bool inbox;
    6727             :     ae_int_t nx;
    6728             :     ae_int_t i1;
    6729             :     ae_int_t i2;
    6730             :     ae_int_t i;
    6731             :     ae_int_t j;
    6732             :     ae_int_t d;
    6733             :     double s;
    6734             :     double v;
    6735             : 
    6736             : 
    6737           0 :     ae_assert(kdt->n>0, "KDTreeQueryBoxRec: internal error", _state);
    6738           0 :     nx = kdt->nx;
    6739             :     
    6740             :     /*
    6741             :      * Check that intersection of query box with bounding box is non-empty.
    6742             :      * This check is performed once for Offs=0 (tree root).
    6743             :      */
    6744           0 :     if( offs==0 )
    6745             :     {
    6746           0 :         for(j=0; j<=nx-1; j++)
    6747             :         {
    6748           0 :             if( buf->boxmin.ptr.p_double[j]>buf->curboxmax.ptr.p_double[j] )
    6749             :             {
    6750           0 :                 return;
    6751             :             }
    6752           0 :             if( buf->boxmax.ptr.p_double[j]<buf->curboxmin.ptr.p_double[j] )
    6753             :             {
    6754           0 :                 return;
    6755             :             }
    6756             :         }
    6757             :     }
    6758             :     
    6759             :     /*
    6760             :      * Leaf node.
    6761             :      * Process points.
    6762             :      */
    6763           0 :     if( kdt->nodes.ptr.p_int[offs]>0 )
    6764             :     {
    6765           0 :         i1 = kdt->nodes.ptr.p_int[offs+1];
    6766           0 :         i2 = i1+kdt->nodes.ptr.p_int[offs];
    6767           0 :         for(i=i1; i<=i2-1; i++)
    6768             :         {
    6769             :             
    6770             :             /*
    6771             :              * Check whether point is in box or not
    6772             :              */
    6773           0 :             inbox = ae_true;
    6774           0 :             for(j=0; j<=nx-1; j++)
    6775             :             {
    6776           0 :                 inbox = inbox&&kdt->xy.ptr.pp_double[i][j]>=buf->boxmin.ptr.p_double[j];
    6777           0 :                 inbox = inbox&&kdt->xy.ptr.pp_double[i][j]<=buf->boxmax.ptr.p_double[j];
    6778             :             }
    6779           0 :             if( !inbox )
    6780             :             {
    6781           0 :                 continue;
    6782             :             }
    6783             :             
    6784             :             /*
    6785             :              * Add point to unordered list
    6786             :              */
    6787           0 :             buf->r.ptr.p_double[buf->kcur] = 0.0;
    6788           0 :             buf->idx.ptr.p_int[buf->kcur] = i;
    6789           0 :             buf->kcur = buf->kcur+1;
    6790             :         }
    6791           0 :         return;
    6792             :     }
    6793             :     
    6794             :     /*
    6795             :      * Simple split
    6796             :      */
    6797           0 :     if( kdt->nodes.ptr.p_int[offs]==0 )
    6798             :     {
    6799             :         
    6800             :         /*
    6801             :          * Load:
    6802             :          * * D  dimension to split
    6803             :          * * S  split position
    6804             :          */
    6805           0 :         d = kdt->nodes.ptr.p_int[offs+1];
    6806           0 :         s = kdt->splits.ptr.p_double[kdt->nodes.ptr.p_int[offs+2]];
    6807             :         
    6808             :         /*
    6809             :          * Check lower split (S is upper bound of new bounding box)
    6810             :          */
    6811           0 :         if( s>=buf->boxmin.ptr.p_double[d] )
    6812             :         {
    6813           0 :             v = buf->curboxmax.ptr.p_double[d];
    6814           0 :             buf->curboxmax.ptr.p_double[d] = s;
    6815           0 :             nearestneighbor_kdtreequeryboxrec(kdt, buf, kdt->nodes.ptr.p_int[offs+3], _state);
    6816           0 :             buf->curboxmax.ptr.p_double[d] = v;
    6817             :         }
    6818             :         
    6819             :         /*
    6820             :          * Check upper split (S is lower bound of new bounding box)
    6821             :          */
    6822           0 :         if( s<=buf->boxmax.ptr.p_double[d] )
    6823             :         {
    6824           0 :             v = buf->curboxmin.ptr.p_double[d];
    6825           0 :             buf->curboxmin.ptr.p_double[d] = s;
    6826           0 :             nearestneighbor_kdtreequeryboxrec(kdt, buf, kdt->nodes.ptr.p_int[offs+4], _state);
    6827           0 :             buf->curboxmin.ptr.p_double[d] = v;
    6828             :         }
    6829           0 :         return;
    6830             :     }
    6831             : }
    6832             : 
    6833             : 
    6834             : /*************************************************************************
    6835             : Copies X[] to Buf.X[]
    6836             : Loads distance from X[] to bounding box.
    6837             : Initializes Buf.CurBox[].
    6838             : 
    6839             :   -- ALGLIB --
    6840             :      Copyright 28.02.2010 by Bochkanov Sergey
    6841             : *************************************************************************/
    6842           0 : static void nearestneighbor_kdtreeinitbox(kdtree* kdt,
    6843             :      /* Real    */ ae_vector* x,
    6844             :      kdtreerequestbuffer* buf,
    6845             :      ae_state *_state)
    6846             : {
    6847             :     ae_int_t i;
    6848             :     double vx;
    6849             :     double vmin;
    6850             :     double vmax;
    6851             : 
    6852             : 
    6853           0 :     ae_assert(kdt->n>0, "KDTreeInitBox: internal error", _state);
    6854             :     
    6855             :     /*
    6856             :      * calculate distance from point to current bounding box
    6857             :      */
    6858           0 :     buf->curdist = (double)(0);
    6859           0 :     if( kdt->normtype==0 )
    6860             :     {
    6861           0 :         for(i=0; i<=kdt->nx-1; i++)
    6862             :         {
    6863           0 :             vx = x->ptr.p_double[i];
    6864           0 :             vmin = kdt->boxmin.ptr.p_double[i];
    6865           0 :             vmax = kdt->boxmax.ptr.p_double[i];
    6866           0 :             buf->x.ptr.p_double[i] = vx;
    6867           0 :             buf->curboxmin.ptr.p_double[i] = vmin;
    6868           0 :             buf->curboxmax.ptr.p_double[i] = vmax;
    6869           0 :             if( vx<vmin )
    6870             :             {
    6871           0 :                 buf->curdist = ae_maxreal(buf->curdist, vmin-vx, _state);
    6872             :             }
    6873             :             else
    6874             :             {
    6875           0 :                 if( vx>vmax )
    6876             :                 {
    6877           0 :                     buf->curdist = ae_maxreal(buf->curdist, vx-vmax, _state);
    6878             :                 }
    6879             :             }
    6880             :         }
    6881             :     }
    6882           0 :     if( kdt->normtype==1 )
    6883             :     {
    6884           0 :         for(i=0; i<=kdt->nx-1; i++)
    6885             :         {
    6886           0 :             vx = x->ptr.p_double[i];
    6887           0 :             vmin = kdt->boxmin.ptr.p_double[i];
    6888           0 :             vmax = kdt->boxmax.ptr.p_double[i];
    6889           0 :             buf->x.ptr.p_double[i] = vx;
    6890           0 :             buf->curboxmin.ptr.p_double[i] = vmin;
    6891           0 :             buf->curboxmax.ptr.p_double[i] = vmax;
    6892           0 :             if( vx<vmin )
    6893             :             {
    6894           0 :                 buf->curdist = buf->curdist+vmin-vx;
    6895             :             }
    6896             :             else
    6897             :             {
    6898           0 :                 if( vx>vmax )
    6899             :                 {
    6900           0 :                     buf->curdist = buf->curdist+vx-vmax;
    6901             :                 }
    6902             :             }
    6903             :         }
    6904             :     }
    6905           0 :     if( kdt->normtype==2 )
    6906             :     {
    6907           0 :         for(i=0; i<=kdt->nx-1; i++)
    6908             :         {
    6909           0 :             vx = x->ptr.p_double[i];
    6910           0 :             vmin = kdt->boxmin.ptr.p_double[i];
    6911           0 :             vmax = kdt->boxmax.ptr.p_double[i];
    6912           0 :             buf->x.ptr.p_double[i] = vx;
    6913           0 :             buf->curboxmin.ptr.p_double[i] = vmin;
    6914           0 :             buf->curboxmax.ptr.p_double[i] = vmax;
    6915           0 :             if( vx<vmin )
    6916             :             {
    6917           0 :                 buf->curdist = buf->curdist+ae_sqr(vmin-vx, _state);
    6918             :             }
    6919             :             else
    6920             :             {
    6921           0 :                 if( vx>vmax )
    6922             :                 {
    6923           0 :                     buf->curdist = buf->curdist+ae_sqr(vx-vmax, _state);
    6924             :                 }
    6925             :             }
    6926             :         }
    6927             :     }
    6928           0 : }
    6929             : 
    6930             : 
    6931             : /*************************************************************************
    6932             : This function allocates all dataset-independend array  fields  of  KDTree,
    6933             : i.e.  such  array  fields  that  their dimensions do not depend on dataset
    6934             : size.
    6935             : 
    6936             : This function do not sets KDT.NX or KDT.NY - it just allocates arrays
    6937             : 
    6938             :   -- ALGLIB --
    6939             :      Copyright 14.03.2011 by Bochkanov Sergey
    6940             : *************************************************************************/
    6941           0 : static void nearestneighbor_kdtreeallocdatasetindependent(kdtree* kdt,
    6942             :      ae_int_t nx,
    6943             :      ae_int_t ny,
    6944             :      ae_state *_state)
    6945             : {
    6946             : 
    6947             : 
    6948           0 :     ae_assert(kdt->n>0, "KDTreeAllocDatasetIndependent: internal error", _state);
    6949           0 :     ae_vector_set_length(&kdt->boxmin, nx, _state);
    6950           0 :     ae_vector_set_length(&kdt->boxmax, nx, _state);
    6951           0 : }
    6952             : 
    6953             : 
    6954             : /*************************************************************************
    6955             : This function allocates all dataset-dependent array fields of KDTree, i.e.
    6956             : such array fields that their dimensions depend on dataset size.
    6957             : 
    6958             : This function do not sets KDT.N, KDT.NX or KDT.NY -
    6959             : it just allocates arrays.
    6960             : 
    6961             :   -- ALGLIB --
    6962             :      Copyright 14.03.2011 by Bochkanov Sergey
    6963             : *************************************************************************/
    6964           0 : static void nearestneighbor_kdtreeallocdatasetdependent(kdtree* kdt,
    6965             :      ae_int_t n,
    6966             :      ae_int_t nx,
    6967             :      ae_int_t ny,
    6968             :      ae_state *_state)
    6969             : {
    6970             : 
    6971             : 
    6972           0 :     ae_assert(n>0, "KDTreeAllocDatasetDependent: internal error", _state);
    6973           0 :     ae_matrix_set_length(&kdt->xy, n, 2*nx+ny, _state);
    6974           0 :     ae_vector_set_length(&kdt->tags, n, _state);
    6975           0 :     ae_vector_set_length(&kdt->nodes, nearestneighbor_splitnodesize*2*n, _state);
    6976           0 :     ae_vector_set_length(&kdt->splits, 2*n, _state);
    6977           0 : }
    6978             : 
    6979             : 
    6980             : /*************************************************************************
    6981             : This  function   checks  consistency  of  request  buffer  structure  with
    6982             : dimensions of kd-tree object.
    6983             : 
    6984             :   -- ALGLIB --
    6985             :      Copyright 02.04.2016 by Bochkanov Sergey
    6986             : *************************************************************************/
    6987           0 : static void nearestneighbor_checkrequestbufferconsistency(kdtree* kdt,
    6988             :      kdtreerequestbuffer* buf,
    6989             :      ae_state *_state)
    6990             : {
    6991             : 
    6992             : 
    6993           0 :     ae_assert(buf->x.cnt>=kdt->nx, "KDTree: dimensions of kdtreerequestbuffer are inconsistent with kdtree structure", _state);
    6994           0 :     ae_assert(buf->idx.cnt>=kdt->n, "KDTree: dimensions of kdtreerequestbuffer are inconsistent with kdtree structure", _state);
    6995           0 :     ae_assert(buf->r.cnt>=kdt->n, "KDTree: dimensions of kdtreerequestbuffer are inconsistent with kdtree structure", _state);
    6996           0 :     ae_assert(buf->buf.cnt>=ae_maxint(kdt->n, kdt->nx, _state), "KDTree: dimensions of kdtreerequestbuffer are inconsistent with kdtree structure", _state);
    6997           0 :     ae_assert(buf->curboxmin.cnt>=kdt->nx, "KDTree: dimensions of kdtreerequestbuffer are inconsistent with kdtree structure", _state);
    6998           0 :     ae_assert(buf->curboxmax.cnt>=kdt->nx, "KDTree: dimensions of kdtreerequestbuffer are inconsistent with kdtree structure", _state);
    6999           0 : }
    7000             : 
    7001             : 
    7002           0 : void _kdtreerequestbuffer_init(void* _p, ae_state *_state, ae_bool make_automatic)
    7003             : {
    7004           0 :     kdtreerequestbuffer *p = (kdtreerequestbuffer*)_p;
    7005           0 :     ae_touch_ptr((void*)p);
    7006           0 :     ae_vector_init(&p->x, 0, DT_REAL, _state, make_automatic);
    7007           0 :     ae_vector_init(&p->boxmin, 0, DT_REAL, _state, make_automatic);
    7008           0 :     ae_vector_init(&p->boxmax, 0, DT_REAL, _state, make_automatic);
    7009           0 :     ae_vector_init(&p->idx, 0, DT_INT, _state, make_automatic);
    7010           0 :     ae_vector_init(&p->r, 0, DT_REAL, _state, make_automatic);
    7011           0 :     ae_vector_init(&p->buf, 0, DT_REAL, _state, make_automatic);
    7012           0 :     ae_vector_init(&p->curboxmin, 0, DT_REAL, _state, make_automatic);
    7013           0 :     ae_vector_init(&p->curboxmax, 0, DT_REAL, _state, make_automatic);
    7014           0 : }
    7015             : 
    7016             : 
    7017           0 : void _kdtreerequestbuffer_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic)
    7018             : {
    7019           0 :     kdtreerequestbuffer *dst = (kdtreerequestbuffer*)_dst;
    7020           0 :     kdtreerequestbuffer *src = (kdtreerequestbuffer*)_src;
    7021           0 :     ae_vector_init_copy(&dst->x, &src->x, _state, make_automatic);
    7022           0 :     ae_vector_init_copy(&dst->boxmin, &src->boxmin, _state, make_automatic);
    7023           0 :     ae_vector_init_copy(&dst->boxmax, &src->boxmax, _state, make_automatic);
    7024           0 :     dst->kneeded = src->kneeded;
    7025           0 :     dst->rneeded = src->rneeded;
    7026           0 :     dst->selfmatch = src->selfmatch;
    7027           0 :     dst->approxf = src->approxf;
    7028           0 :     dst->kcur = src->kcur;
    7029           0 :     ae_vector_init_copy(&dst->idx, &src->idx, _state, make_automatic);
    7030           0 :     ae_vector_init_copy(&dst->r, &src->r, _state, make_automatic);
    7031           0 :     ae_vector_init_copy(&dst->buf, &src->buf, _state, make_automatic);
    7032           0 :     ae_vector_init_copy(&dst->curboxmin, &src->curboxmin, _state, make_automatic);
    7033           0 :     ae_vector_init_copy(&dst->curboxmax, &src->curboxmax, _state, make_automatic);
    7034           0 :     dst->curdist = src->curdist;
    7035           0 : }
    7036             : 
    7037             : 
    7038           0 : void _kdtreerequestbuffer_clear(void* _p)
    7039             : {
    7040           0 :     kdtreerequestbuffer *p = (kdtreerequestbuffer*)_p;
    7041           0 :     ae_touch_ptr((void*)p);
    7042           0 :     ae_vector_clear(&p->x);
    7043           0 :     ae_vector_clear(&p->boxmin);
    7044           0 :     ae_vector_clear(&p->boxmax);
    7045           0 :     ae_vector_clear(&p->idx);
    7046           0 :     ae_vector_clear(&p->r);
    7047           0 :     ae_vector_clear(&p->buf);
    7048           0 :     ae_vector_clear(&p->curboxmin);
    7049           0 :     ae_vector_clear(&p->curboxmax);
    7050           0 : }
    7051             : 
    7052             : 
    7053           0 : void _kdtreerequestbuffer_destroy(void* _p)
    7054             : {
    7055           0 :     kdtreerequestbuffer *p = (kdtreerequestbuffer*)_p;
    7056           0 :     ae_touch_ptr((void*)p);
    7057           0 :     ae_vector_destroy(&p->x);
    7058           0 :     ae_vector_destroy(&p->boxmin);
    7059           0 :     ae_vector_destroy(&p->boxmax);
    7060           0 :     ae_vector_destroy(&p->idx);
    7061           0 :     ae_vector_destroy(&p->r);
    7062           0 :     ae_vector_destroy(&p->buf);
    7063           0 :     ae_vector_destroy(&p->curboxmin);
    7064           0 :     ae_vector_destroy(&p->curboxmax);
    7065           0 : }
    7066             : 
    7067             : 
    7068           0 : void _kdtree_init(void* _p, ae_state *_state, ae_bool make_automatic)
    7069             : {
    7070           0 :     kdtree *p = (kdtree*)_p;
    7071           0 :     ae_touch_ptr((void*)p);
    7072           0 :     ae_matrix_init(&p->xy, 0, 0, DT_REAL, _state, make_automatic);
    7073           0 :     ae_vector_init(&p->tags, 0, DT_INT, _state, make_automatic);
    7074           0 :     ae_vector_init(&p->boxmin, 0, DT_REAL, _state, make_automatic);
    7075           0 :     ae_vector_init(&p->boxmax, 0, DT_REAL, _state, make_automatic);
    7076           0 :     ae_vector_init(&p->nodes, 0, DT_INT, _state, make_automatic);
    7077           0 :     ae_vector_init(&p->splits, 0, DT_REAL, _state, make_automatic);
    7078           0 :     _kdtreerequestbuffer_init(&p->innerbuf, _state, make_automatic);
    7079           0 : }
    7080             : 
    7081             : 
    7082           0 : void _kdtree_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic)
    7083             : {
    7084           0 :     kdtree *dst = (kdtree*)_dst;
    7085           0 :     kdtree *src = (kdtree*)_src;
    7086           0 :     dst->n = src->n;
    7087           0 :     dst->nx = src->nx;
    7088           0 :     dst->ny = src->ny;
    7089           0 :     dst->normtype = src->normtype;
    7090           0 :     ae_matrix_init_copy(&dst->xy, &src->xy, _state, make_automatic);
    7091           0 :     ae_vector_init_copy(&dst->tags, &src->tags, _state, make_automatic);
    7092           0 :     ae_vector_init_copy(&dst->boxmin, &src->boxmin, _state, make_automatic);
    7093           0 :     ae_vector_init_copy(&dst->boxmax, &src->boxmax, _state, make_automatic);
    7094           0 :     ae_vector_init_copy(&dst->nodes, &src->nodes, _state, make_automatic);
    7095           0 :     ae_vector_init_copy(&dst->splits, &src->splits, _state, make_automatic);
    7096           0 :     _kdtreerequestbuffer_init_copy(&dst->innerbuf, &src->innerbuf, _state, make_automatic);
    7097           0 :     dst->debugcounter = src->debugcounter;
    7098           0 : }
    7099             : 
    7100             : 
    7101           0 : void _kdtree_clear(void* _p)
    7102             : {
    7103           0 :     kdtree *p = (kdtree*)_p;
    7104           0 :     ae_touch_ptr((void*)p);
    7105           0 :     ae_matrix_clear(&p->xy);
    7106           0 :     ae_vector_clear(&p->tags);
    7107           0 :     ae_vector_clear(&p->boxmin);
    7108           0 :     ae_vector_clear(&p->boxmax);
    7109           0 :     ae_vector_clear(&p->nodes);
    7110           0 :     ae_vector_clear(&p->splits);
    7111           0 :     _kdtreerequestbuffer_clear(&p->innerbuf);
    7112           0 : }
    7113             : 
    7114             : 
    7115           0 : void _kdtree_destroy(void* _p)
    7116             : {
    7117           0 :     kdtree *p = (kdtree*)_p;
    7118           0 :     ae_touch_ptr((void*)p);
    7119           0 :     ae_matrix_destroy(&p->xy);
    7120           0 :     ae_vector_destroy(&p->tags);
    7121           0 :     ae_vector_destroy(&p->boxmin);
    7122           0 :     ae_vector_destroy(&p->boxmax);
    7123           0 :     ae_vector_destroy(&p->nodes);
    7124           0 :     ae_vector_destroy(&p->splits);
    7125           0 :     _kdtreerequestbuffer_destroy(&p->innerbuf);
    7126           0 : }
    7127             : 
    7128             : 
    7129             : #endif
    7130             : #if defined(AE_COMPILE_HQRND) || !defined(AE_PARTIAL_BUILD)
    7131             : 
    7132             : 
    7133             : /*************************************************************************
    7134             : HQRNDState  initialization  with  random  values  which come from standard
    7135             : RNG.
    7136             : 
    7137             :   -- ALGLIB --
    7138             :      Copyright 02.12.2009 by Bochkanov Sergey
    7139             : *************************************************************************/
    7140           0 : void hqrndrandomize(hqrndstate* state, ae_state *_state)
    7141             : {
    7142             :     ae_int_t s0;
    7143             :     ae_int_t s1;
    7144             : 
    7145           0 :     _hqrndstate_clear(state);
    7146             : 
    7147           0 :     s0 = ae_randominteger(hqrnd_hqrndm1, _state);
    7148           0 :     s1 = ae_randominteger(hqrnd_hqrndm2, _state);
    7149           0 :     hqrndseed(s0, s1, state, _state);
    7150           0 : }
    7151             : 
    7152             : 
    7153             : /*************************************************************************
    7154             : HQRNDState initialization with seed values
    7155             : 
    7156             :   -- ALGLIB --
    7157             :      Copyright 02.12.2009 by Bochkanov Sergey
    7158             : *************************************************************************/
    7159           0 : void hqrndseed(ae_int_t s1,
    7160             :      ae_int_t s2,
    7161             :      hqrndstate* state,
    7162             :      ae_state *_state)
    7163             : {
    7164             : 
    7165           0 :     _hqrndstate_clear(state);
    7166             : 
    7167             :     
    7168             :     /*
    7169             :      * Protection against negative seeds:
    7170             :      *
    7171             :      *     SEED := -(SEED+1)
    7172             :      *
    7173             :      * We can use just "-SEED" because there exists such integer number  N
    7174             :      * that N<0, -N=N<0 too. (This number is equal to 0x800...000).   Need
    7175             :      * to handle such seed correctly forces us to use  a  bit  complicated
    7176             :      * formula.
    7177             :      */
    7178           0 :     if( s1<0 )
    7179             :     {
    7180           0 :         s1 = -(s1+1);
    7181             :     }
    7182           0 :     if( s2<0 )
    7183             :     {
    7184           0 :         s2 = -(s2+1);
    7185             :     }
    7186           0 :     state->s1 = s1%(hqrnd_hqrndm1-1)+1;
    7187           0 :     state->s2 = s2%(hqrnd_hqrndm2-1)+1;
    7188           0 :     state->magicv = hqrnd_hqrndmagic;
    7189           0 : }
    7190             : 
    7191             : 
    7192             : /*************************************************************************
    7193             : This function generates random real number in (0,1),
    7194             : not including interval boundaries
    7195             : 
    7196             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7197             : 
    7198             :   -- ALGLIB --
    7199             :      Copyright 02.12.2009 by Bochkanov Sergey
    7200             : *************************************************************************/
    7201           0 : double hqrnduniformr(hqrndstate* state, ae_state *_state)
    7202             : {
    7203             :     double result;
    7204             : 
    7205             : 
    7206           0 :     result = (double)(hqrnd_hqrndintegerbase(state, _state)+1)/(double)(hqrnd_hqrndmax+2);
    7207           0 :     return result;
    7208             : }
    7209             : 
    7210             : 
    7211             : /*************************************************************************
    7212             : This function generates random integer number in [0, N)
    7213             : 
    7214             : 1. State structure must be initialized with HQRNDRandomize() or HQRNDSeed()
    7215             : 2. N can be any positive number except for very large numbers:
    7216             :    * close to 2^31 on 32-bit systems
    7217             :    * close to 2^62 on 64-bit systems
    7218             :    An exception will be generated if N is too large.
    7219             : 
    7220             :   -- ALGLIB --
    7221             :      Copyright 02.12.2009 by Bochkanov Sergey
    7222             : *************************************************************************/
    7223           0 : ae_int_t hqrnduniformi(hqrndstate* state, ae_int_t n, ae_state *_state)
    7224             : {
    7225             :     ae_int_t maxcnt;
    7226             :     ae_int_t mx;
    7227             :     ae_int_t a;
    7228             :     ae_int_t b;
    7229             :     ae_int_t result;
    7230             : 
    7231             : 
    7232           0 :     ae_assert(n>0, "HQRNDUniformI: N<=0!", _state);
    7233           0 :     maxcnt = hqrnd_hqrndmax+1;
    7234             :     
    7235             :     /*
    7236             :      * Two branches: one for N<=MaxCnt, another for N>MaxCnt.
    7237             :      */
    7238           0 :     if( n>maxcnt )
    7239             :     {
    7240             :         
    7241             :         /*
    7242             :          * N>=MaxCnt.
    7243             :          *
    7244             :          * We have two options here:
    7245             :          * a) N is exactly divisible by MaxCnt
    7246             :          * b) N is not divisible by MaxCnt
    7247             :          *
    7248             :          * In both cases we reduce problem on interval spanning [0,N)
    7249             :          * to several subproblems on intervals spanning [0,MaxCnt).
    7250             :          */
    7251           0 :         if( n%maxcnt==0 )
    7252             :         {
    7253             :             
    7254             :             /*
    7255             :              * N is exactly divisible by MaxCnt.
    7256             :              *
    7257             :              * [0,N) range is dividided into N/MaxCnt bins,
    7258             :              * each of them having length equal to MaxCnt.
    7259             :              *
    7260             :              * We generate:
    7261             :              * * random bin number B
    7262             :              * * random offset within bin A
    7263             :              * Both random numbers are generated by recursively
    7264             :              * calling HQRNDUniformI().
    7265             :              *
    7266             :              * Result is equal to A+MaxCnt*B.
    7267             :              */
    7268           0 :             ae_assert(n/maxcnt<=maxcnt, "HQRNDUniformI: N is too large", _state);
    7269           0 :             a = hqrnduniformi(state, maxcnt, _state);
    7270           0 :             b = hqrnduniformi(state, n/maxcnt, _state);
    7271           0 :             result = a+maxcnt*b;
    7272             :         }
    7273             :         else
    7274             :         {
    7275             :             
    7276             :             /*
    7277             :              * N is NOT exactly divisible by MaxCnt.
    7278             :              *
    7279             :              * [0,N) range is dividided into Ceil(N/MaxCnt) bins,
    7280             :              * each of them having length equal to MaxCnt.
    7281             :              *
    7282             :              * We generate:
    7283             :              * * random bin number B in [0, Ceil(N/MaxCnt)-1]
    7284             :              * * random offset within bin A
    7285             :              * * if both of what is below is true
    7286             :              *   1) bin number B is that of the last bin
    7287             :              *   2) A >= N mod MaxCnt
    7288             :              *   then we repeat generation of A/B.
    7289             :              *   This stage is essential in order to avoid bias in the result.
    7290             :              * * otherwise, we return A*MaxCnt+N
    7291             :              */
    7292           0 :             ae_assert(n/maxcnt+1<=maxcnt, "HQRNDUniformI: N is too large", _state);
    7293           0 :             result = -1;
    7294             :             do
    7295             :             {
    7296           0 :                 a = hqrnduniformi(state, maxcnt, _state);
    7297           0 :                 b = hqrnduniformi(state, n/maxcnt+1, _state);
    7298           0 :                 if( b==n/maxcnt&&a>=n%maxcnt )
    7299             :                 {
    7300           0 :                     continue;
    7301             :                 }
    7302           0 :                 result = a+maxcnt*b;
    7303             :             }
    7304           0 :             while(result<0);
    7305             :         }
    7306             :     }
    7307             :     else
    7308             :     {
    7309             :         
    7310             :         /*
    7311             :          * N<=MaxCnt
    7312             :          *
    7313             :          * Code below is a bit complicated because we can not simply
    7314             :          * return "HQRNDIntegerBase() mod N" - it will be skewed for
    7315             :          * large N's in [0.1*HQRNDMax...HQRNDMax].
    7316             :          */
    7317           0 :         mx = maxcnt-maxcnt%n;
    7318             :         do
    7319             :         {
    7320           0 :             result = hqrnd_hqrndintegerbase(state, _state);
    7321             :         }
    7322           0 :         while(result>=mx);
    7323           0 :         result = result%n;
    7324             :     }
    7325           0 :     return result;
    7326             : }
    7327             : 
    7328             : 
    7329             : /*************************************************************************
    7330             : Random number generator: normal numbers
    7331             : 
    7332             : This function generates one random number from normal distribution.
    7333             : Its performance is equal to that of HQRNDNormal2()
    7334             : 
    7335             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7336             : 
    7337             :   -- ALGLIB --
    7338             :      Copyright 02.12.2009 by Bochkanov Sergey
    7339             : *************************************************************************/
    7340           0 : double hqrndnormal(hqrndstate* state, ae_state *_state)
    7341             : {
    7342             :     double v1;
    7343             :     double v2;
    7344             :     double result;
    7345             : 
    7346             : 
    7347           0 :     hqrndnormal2(state, &v1, &v2, _state);
    7348           0 :     result = v1;
    7349           0 :     return result;
    7350             : }
    7351             : 
    7352             : 
    7353             : /*************************************************************************
    7354             : Random number generator: vector with random entries (normal distribution)
    7355             : 
    7356             : This function generates N random numbers from normal distribution.
    7357             : 
    7358             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7359             : 
    7360             :   -- ALGLIB --
    7361             :      Copyright 02.12.2009 by Bochkanov Sergey
    7362             : *************************************************************************/
    7363           0 : void hqrndnormalv(hqrndstate* state,
    7364             :      ae_int_t n,
    7365             :      /* Real    */ ae_vector* x,
    7366             :      ae_state *_state)
    7367             : {
    7368             :     ae_int_t i;
    7369             :     ae_int_t n2;
    7370             :     double v1;
    7371             :     double v2;
    7372             : 
    7373           0 :     ae_vector_clear(x);
    7374             : 
    7375           0 :     n2 = n/2;
    7376           0 :     rallocv(n, x, _state);
    7377           0 :     for(i=0; i<=n2-1; i++)
    7378             :     {
    7379           0 :         hqrndnormal2(state, &v1, &v2, _state);
    7380           0 :         x->ptr.p_double[2*i+0] = v1;
    7381           0 :         x->ptr.p_double[2*i+1] = v2;
    7382             :     }
    7383           0 :     if( n%2!=0 )
    7384             :     {
    7385           0 :         hqrndnormal2(state, &v1, &v2, _state);
    7386           0 :         x->ptr.p_double[n-1] = v1;
    7387             :     }
    7388           0 : }
    7389             : 
    7390             : 
    7391             : /*************************************************************************
    7392             : Random number generator: matrix with random entries (normal distribution)
    7393             : 
    7394             : This function generates MxN random matrix.
    7395             : 
    7396             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7397             : 
    7398             :   -- ALGLIB --
    7399             :      Copyright 02.12.2009 by Bochkanov Sergey
    7400             : *************************************************************************/
    7401           0 : void hqrndnormalm(hqrndstate* state,
    7402             :      ae_int_t m,
    7403             :      ae_int_t n,
    7404             :      /* Real    */ ae_matrix* x,
    7405             :      ae_state *_state)
    7406             : {
    7407             :     ae_int_t i;
    7408             :     ae_int_t j;
    7409             :     ae_int_t n2;
    7410             :     double v1;
    7411             :     double v2;
    7412             : 
    7413           0 :     ae_matrix_clear(x);
    7414             : 
    7415           0 :     n2 = n/2;
    7416           0 :     ae_matrix_set_length(x, m, n, _state);
    7417           0 :     for(i=0; i<=m-1; i++)
    7418             :     {
    7419           0 :         for(j=0; j<=n2-1; j++)
    7420             :         {
    7421           0 :             hqrndnormal2(state, &v1, &v2, _state);
    7422           0 :             x->ptr.pp_double[i][2*j+0] = v1;
    7423           0 :             x->ptr.pp_double[i][2*j+1] = v2;
    7424             :         }
    7425           0 :         if( n%2!=0 )
    7426             :         {
    7427           0 :             hqrndnormal2(state, &v1, &v2, _state);
    7428           0 :             x->ptr.pp_double[i][n-1] = v1;
    7429             :         }
    7430             :     }
    7431           0 : }
    7432             : 
    7433             : 
    7434             : /*************************************************************************
    7435             : Random number generator: random X and Y such that X^2+Y^2=1
    7436             : 
    7437             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7438             : 
    7439             :   -- ALGLIB --
    7440             :      Copyright 02.12.2009 by Bochkanov Sergey
    7441             : *************************************************************************/
    7442           0 : void hqrndunit2(hqrndstate* state, double* x, double* y, ae_state *_state)
    7443             : {
    7444             :     double v;
    7445             :     double mx;
    7446             :     double mn;
    7447             : 
    7448           0 :     *x = 0;
    7449           0 :     *y = 0;
    7450             : 
    7451             :     do
    7452             :     {
    7453           0 :         hqrndnormal2(state, x, y, _state);
    7454             :     }
    7455           0 :     while(!(ae_fp_neq(*x,(double)(0))||ae_fp_neq(*y,(double)(0))));
    7456           0 :     mx = ae_maxreal(ae_fabs(*x, _state), ae_fabs(*y, _state), _state);
    7457           0 :     mn = ae_minreal(ae_fabs(*x, _state), ae_fabs(*y, _state), _state);
    7458           0 :     v = mx*ae_sqrt(1+ae_sqr(mn/mx, _state), _state);
    7459           0 :     *x = *x/v;
    7460           0 :     *y = *y/v;
    7461           0 : }
    7462             : 
    7463             : 
    7464             : /*************************************************************************
    7465             : Random number generator: normal numbers
    7466             : 
    7467             : This function generates two independent random numbers from normal
    7468             : distribution. Its performance is equal to that of HQRNDNormal()
    7469             : 
    7470             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7471             : 
    7472             :   -- ALGLIB --
    7473             :      Copyright 02.12.2009 by Bochkanov Sergey
    7474             : *************************************************************************/
    7475           0 : void hqrndnormal2(hqrndstate* state,
    7476             :      double* x1,
    7477             :      double* x2,
    7478             :      ae_state *_state)
    7479             : {
    7480             :     double u;
    7481             :     double v;
    7482             :     double s;
    7483             : 
    7484           0 :     *x1 = 0;
    7485           0 :     *x2 = 0;
    7486             : 
    7487             :     for(;;)
    7488             :     {
    7489           0 :         u = 2*hqrnduniformr(state, _state)-1;
    7490           0 :         v = 2*hqrnduniformr(state, _state)-1;
    7491           0 :         s = ae_sqr(u, _state)+ae_sqr(v, _state);
    7492           0 :         if( ae_fp_greater(s,(double)(0))&&ae_fp_less(s,(double)(1)) )
    7493             :         {
    7494             :             
    7495             :             /*
    7496             :              * two Sqrt's instead of one to
    7497             :              * avoid overflow when S is too small
    7498             :              */
    7499           0 :             s = ae_sqrt(-2*ae_log(s, _state), _state)/ae_sqrt(s, _state);
    7500           0 :             *x1 = u*s;
    7501           0 :             *x2 = v*s;
    7502           0 :             return;
    7503             :         }
    7504             :     }
    7505             : }
    7506             : 
    7507             : 
    7508             : /*************************************************************************
    7509             : Random number generator: exponential distribution
    7510             : 
    7511             : State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
    7512             : 
    7513             :   -- ALGLIB --
    7514             :      Copyright 11.08.2007 by Bochkanov Sergey
    7515             : *************************************************************************/
    7516           0 : double hqrndexponential(hqrndstate* state,
    7517             :      double lambdav,
    7518             :      ae_state *_state)
    7519             : {
    7520             :     double result;
    7521             : 
    7522             : 
    7523           0 :     ae_assert(ae_fp_greater(lambdav,(double)(0)), "HQRNDExponential: LambdaV<=0!", _state);
    7524           0 :     result = -ae_log(hqrnduniformr(state, _state), _state)/lambdav;
    7525           0 :     return result;
    7526             : }
    7527             : 
    7528             : 
    7529             : /*************************************************************************
    7530             : This function generates  random number from discrete distribution given by
    7531             : finite sample X.
    7532             : 
    7533             : INPUT PARAMETERS
    7534             :     State   -   high quality random number generator, must be
    7535             :                 initialized with HQRNDRandomize() or HQRNDSeed().
    7536             :         X   -   finite sample
    7537             :         N   -   number of elements to use, N>=1
    7538             : 
    7539             : RESULT
    7540             :     this function returns one of the X[i] for random i=0..N-1
    7541             : 
    7542             :   -- ALGLIB --
    7543             :      Copyright 08.11.2011 by Bochkanov Sergey
    7544             : *************************************************************************/
    7545           0 : double hqrnddiscrete(hqrndstate* state,
    7546             :      /* Real    */ ae_vector* x,
    7547             :      ae_int_t n,
    7548             :      ae_state *_state)
    7549             : {
    7550             :     double result;
    7551             : 
    7552             : 
    7553           0 :     ae_assert(n>0, "HQRNDDiscrete: N<=0", _state);
    7554           0 :     ae_assert(n<=x->cnt, "HQRNDDiscrete: Length(X)<N", _state);
    7555           0 :     result = x->ptr.p_double[hqrnduniformi(state, n, _state)];
    7556           0 :     return result;
    7557             : }
    7558             : 
    7559             : 
    7560             : /*************************************************************************
    7561             : This function generates random number from continuous  distribution  given
    7562             : by finite sample X.
    7563             : 
    7564             : INPUT PARAMETERS
    7565             :     State   -   high quality random number generator, must be
    7566             :                 initialized with HQRNDRandomize() or HQRNDSeed().
    7567             :         X   -   finite sample, array[N] (can be larger, in this  case only
    7568             :                 leading N elements are used). THIS ARRAY MUST BE SORTED BY
    7569             :                 ASCENDING.
    7570             :         N   -   number of elements to use, N>=1
    7571             : 
    7572             : RESULT
    7573             :     this function returns random number from continuous distribution which  
    7574             :     tries to approximate X as mush as possible. min(X)<=Result<=max(X).
    7575             : 
    7576             :   -- ALGLIB --
    7577             :      Copyright 08.11.2011 by Bochkanov Sergey
    7578             : *************************************************************************/
    7579           0 : double hqrndcontinuous(hqrndstate* state,
    7580             :      /* Real    */ ae_vector* x,
    7581             :      ae_int_t n,
    7582             :      ae_state *_state)
    7583             : {
    7584             :     double mx;
    7585             :     double mn;
    7586             :     ae_int_t i;
    7587             :     double result;
    7588             : 
    7589             : 
    7590           0 :     ae_assert(n>0, "HQRNDContinuous: N<=0", _state);
    7591           0 :     ae_assert(n<=x->cnt, "HQRNDContinuous: Length(X)<N", _state);
    7592           0 :     if( n==1 )
    7593             :     {
    7594           0 :         result = x->ptr.p_double[0];
    7595           0 :         return result;
    7596             :     }
    7597           0 :     i = hqrnduniformi(state, n-1, _state);
    7598           0 :     mn = x->ptr.p_double[i];
    7599           0 :     mx = x->ptr.p_double[i+1];
    7600           0 :     ae_assert(ae_fp_greater_eq(mx,mn), "HQRNDDiscrete: X is not sorted by ascending", _state);
    7601           0 :     if( ae_fp_neq(mx,mn) )
    7602             :     {
    7603           0 :         result = (mx-mn)*hqrnduniformr(state, _state)+mn;
    7604             :     }
    7605             :     else
    7606             :     {
    7607           0 :         result = mn;
    7608             :     }
    7609           0 :     return result;
    7610             : }
    7611             : 
    7612             : 
    7613             : /*************************************************************************
    7614             : This function returns random integer in [0,HQRNDMax]
    7615             : 
    7616             : L'Ecuyer, Efficient and portable combined random number generators
    7617             : *************************************************************************/
    7618           0 : static ae_int_t hqrnd_hqrndintegerbase(hqrndstate* state,
    7619             :      ae_state *_state)
    7620             : {
    7621             :     ae_int_t k;
    7622             :     ae_int_t result;
    7623             : 
    7624             : 
    7625           0 :     ae_assert(state->magicv==hqrnd_hqrndmagic, "HQRNDIntegerBase: State is not correctly initialized!", _state);
    7626           0 :     k = state->s1/53668;
    7627           0 :     state->s1 = 40014*(state->s1-k*53668)-k*12211;
    7628           0 :     if( state->s1<0 )
    7629             :     {
    7630           0 :         state->s1 = state->s1+2147483563;
    7631             :     }
    7632           0 :     k = state->s2/52774;
    7633           0 :     state->s2 = 40692*(state->s2-k*52774)-k*3791;
    7634           0 :     if( state->s2<0 )
    7635             :     {
    7636           0 :         state->s2 = state->s2+2147483399;
    7637             :     }
    7638             :     
    7639             :     /*
    7640             :      * Result
    7641             :      */
    7642           0 :     result = state->s1-state->s2;
    7643           0 :     if( result<1 )
    7644             :     {
    7645           0 :         result = result+2147483562;
    7646             :     }
    7647           0 :     result = result-1;
    7648           0 :     return result;
    7649             : }
    7650             : 
    7651             : 
    7652           0 : void _hqrndstate_init(void* _p, ae_state *_state, ae_bool make_automatic)
    7653             : {
    7654           0 :     hqrndstate *p = (hqrndstate*)_p;
    7655           0 :     ae_touch_ptr((void*)p);
    7656           0 : }
    7657             : 
    7658             : 
    7659           0 : void _hqrndstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic)
    7660             : {
    7661           0 :     hqrndstate *dst = (hqrndstate*)_dst;
    7662           0 :     hqrndstate *src = (hqrndstate*)_src;
    7663           0 :     dst->s1 = src->s1;
    7664           0 :     dst->s2 = src->s2;
    7665           0 :     dst->magicv = src->magicv;
    7666           0 : }
    7667             : 
    7668             : 
    7669           0 : void _hqrndstate_clear(void* _p)
    7670             : {
    7671           0 :     hqrndstate *p = (hqrndstate*)_p;
    7672           0 :     ae_touch_ptr((void*)p);
    7673           0 : }
    7674             : 
    7675             : 
    7676           0 : void _hqrndstate_destroy(void* _p)
    7677             : {
    7678           0 :     hqrndstate *p = (hqrndstate*)_p;
    7679           0 :     ae_touch_ptr((void*)p);
    7680           0 : }
    7681             : 
    7682             : 
    7683             : #endif
    7684             : #if defined(AE_COMPILE_XDEBUG) || !defined(AE_PARTIAL_BUILD)
    7685             : 
    7686             : 
    7687             : /*************************************************************************
    7688             : This is debug function intended for testing ALGLIB interface generator.
    7689             : Never use it in any real life project.
    7690             : 
    7691             : Creates and returns XDebugRecord1 structure:
    7692             : * integer and complex fields of Rec1 are set to 1 and 1+i correspondingly
    7693             : * array field of Rec1 is set to [2,3]
    7694             : 
    7695             :   -- ALGLIB --
    7696             :      Copyright 27.05.2014 by Bochkanov Sergey
    7697             : *************************************************************************/
    7698           0 : void xdebuginitrecord1(xdebugrecord1* rec1, ae_state *_state)
    7699             : {
    7700             : 
    7701           0 :     _xdebugrecord1_clear(rec1);
    7702             : 
    7703           0 :     rec1->i = 1;
    7704           0 :     rec1->c.x = (double)(1);
    7705           0 :     rec1->c.y = (double)(1);
    7706           0 :     ae_vector_set_length(&rec1->a, 2, _state);
    7707           0 :     rec1->a.ptr.p_double[0] = (double)(2);
    7708           0 :     rec1->a.ptr.p_double[1] = (double)(3);
    7709           0 : }
    7710             : 
    7711             : 
    7712             : /*************************************************************************
    7713             : This is debug function intended for testing ALGLIB interface generator.
    7714             : Never use it in any real life project.
    7715             : 
    7716             : Counts number of True values in the boolean 1D array.
    7717             : 
    7718             :   -- ALGLIB --
    7719             :      Copyright 11.10.2013 by Bochkanov Sergey
    7720             : *************************************************************************/
    7721           0 : ae_int_t xdebugb1count(/* Boolean */ ae_vector* a, ae_state *_state)
    7722             : {
    7723             :     ae_int_t i;
    7724             :     ae_int_t result;
    7725             : 
    7726             : 
    7727           0 :     result = 0;
    7728           0 :     for(i=0; i<=a->cnt-1; i++)
    7729             :     {
    7730           0 :         if( a->ptr.p_bool[i] )
    7731             :         {
    7732           0 :             result = result+1;
    7733             :         }
    7734             :     }
    7735           0 :     return result;
    7736             : }
    7737             : 
    7738             : 
    7739             : /*************************************************************************
    7740             : This is debug function intended for testing ALGLIB interface generator.
    7741             : Never use it in any real life project.
    7742             : 
    7743             : Replace all values in array by NOT(a[i]).
    7744             : Array is passed using "shared" convention.
    7745             : 
    7746             :   -- ALGLIB --
    7747             :      Copyright 11.10.2013 by Bochkanov Sergey
    7748             : *************************************************************************/
    7749           0 : void xdebugb1not(/* Boolean */ ae_vector* a, ae_state *_state)
    7750             : {
    7751             :     ae_int_t i;
    7752             : 
    7753             : 
    7754           0 :     for(i=0; i<=a->cnt-1; i++)
    7755             :     {
    7756           0 :         a->ptr.p_bool[i] = !a->ptr.p_bool[i];
    7757             :     }
    7758           0 : }
    7759             : 
    7760             : 
    7761             : /*************************************************************************
    7762             : This is debug function intended for testing ALGLIB interface generator.
    7763             : Never use it in any real life project.
    7764             : 
    7765             : Appends copy of array to itself.
    7766             : Array is passed using "var" convention.
    7767             : 
    7768             :   -- ALGLIB --
    7769             :      Copyright 11.10.2013 by Bochkanov Sergey
    7770             : *************************************************************************/
    7771           0 : void xdebugb1appendcopy(/* Boolean */ ae_vector* a, ae_state *_state)
    7772             : {
    7773             :     ae_frame _frame_block;
    7774             :     ae_int_t i;
    7775             :     ae_vector b;
    7776             : 
    7777           0 :     ae_frame_make(_state, &_frame_block);
    7778           0 :     memset(&b, 0, sizeof(b));
    7779           0 :     ae_vector_init(&b, 0, DT_BOOL, _state, ae_true);
    7780             : 
    7781           0 :     ae_vector_set_length(&b, a->cnt, _state);
    7782           0 :     for(i=0; i<=b.cnt-1; i++)
    7783             :     {
    7784           0 :         b.ptr.p_bool[i] = a->ptr.p_bool[i];
    7785             :     }
    7786           0 :     ae_vector_set_length(a, 2*b.cnt, _state);
    7787           0 :     for(i=0; i<=a->cnt-1; i++)
    7788             :     {
    7789           0 :         a->ptr.p_bool[i] = b.ptr.p_bool[i%b.cnt];
    7790             :     }
    7791           0 :     ae_frame_leave(_state);
    7792           0 : }
    7793             : 
    7794             : 
    7795             : /*************************************************************************
    7796             : This is debug function intended for testing ALGLIB interface generator.
    7797             : Never use it in any real life project.
    7798             : 
    7799             : Generate N-element array with even-numbered elements set to True.
    7800             : Array is passed using "out" convention.
    7801             : 
    7802             :   -- ALGLIB --
    7803             :      Copyright 11.10.2013 by Bochkanov Sergey
    7804             : *************************************************************************/
    7805           0 : void xdebugb1outeven(ae_int_t n,
    7806             :      /* Boolean */ ae_vector* a,
    7807             :      ae_state *_state)
    7808             : {
    7809             :     ae_int_t i;
    7810             : 
    7811           0 :     ae_vector_clear(a);
    7812             : 
    7813           0 :     ae_vector_set_length(a, n, _state);
    7814           0 :     for(i=0; i<=a->cnt-1; i++)
    7815             :     {
    7816           0 :         a->ptr.p_bool[i] = i%2==0;
    7817             :     }
    7818           0 : }
    7819             : 
    7820             : 
    7821             : /*************************************************************************
    7822             : This is debug function intended for testing ALGLIB interface generator.
    7823             : Never use it in any real life project.
    7824             : 
    7825             : Returns sum of elements in the array.
    7826             : 
    7827             :   -- ALGLIB --
    7828             :      Copyright 11.10.2013 by Bochkanov Sergey
    7829             : *************************************************************************/
    7830           0 : ae_int_t xdebugi1sum(/* Integer */ ae_vector* a, ae_state *_state)
    7831             : {
    7832             :     ae_int_t i;
    7833             :     ae_int_t result;
    7834             : 
    7835             : 
    7836           0 :     result = 0;
    7837           0 :     for(i=0; i<=a->cnt-1; i++)
    7838             :     {
    7839           0 :         result = result+a->ptr.p_int[i];
    7840             :     }
    7841           0 :     return result;
    7842             : }
    7843             : 
    7844             : 
    7845             : /*************************************************************************
    7846             : This is debug function intended for testing ALGLIB interface generator.
    7847             : Never use it in any real life project.
    7848             : 
    7849             : Replace all values in array by -A[I]
    7850             : Array is passed using "shared" convention.
    7851             : 
    7852             :   -- ALGLIB --
    7853             :      Copyright 11.10.2013 by Bochkanov Sergey
    7854             : *************************************************************************/
    7855           0 : void xdebugi1neg(/* Integer */ ae_vector* a, ae_state *_state)
    7856             : {
    7857             :     ae_int_t i;
    7858             : 
    7859             : 
    7860           0 :     for(i=0; i<=a->cnt-1; i++)
    7861             :     {
    7862           0 :         a->ptr.p_int[i] = -a->ptr.p_int[i];
    7863             :     }
    7864           0 : }
    7865             : 
    7866             : 
    7867             : /*************************************************************************
    7868             : This is debug function intended for testing ALGLIB interface generator.
    7869             : Never use it in any real life project.
    7870             : 
    7871             : Appends copy of array to itself.
    7872             : Array is passed using "var" convention.
    7873             : 
    7874             :   -- ALGLIB --
    7875             :      Copyright 11.10.2013 by Bochkanov Sergey
    7876             : *************************************************************************/
    7877           0 : void xdebugi1appendcopy(/* Integer */ ae_vector* a, ae_state *_state)
    7878             : {
    7879             :     ae_frame _frame_block;
    7880             :     ae_int_t i;
    7881             :     ae_vector b;
    7882             : 
    7883           0 :     ae_frame_make(_state, &_frame_block);
    7884           0 :     memset(&b, 0, sizeof(b));
    7885           0 :     ae_vector_init(&b, 0, DT_INT, _state, ae_true);
    7886             : 
    7887           0 :     ae_vector_set_length(&b, a->cnt, _state);
    7888           0 :     for(i=0; i<=b.cnt-1; i++)
    7889             :     {
    7890           0 :         b.ptr.p_int[i] = a->ptr.p_int[i];
    7891             :     }
    7892           0 :     ae_vector_set_length(a, 2*b.cnt, _state);
    7893           0 :     for(i=0; i<=a->cnt-1; i++)
    7894             :     {
    7895           0 :         a->ptr.p_int[i] = b.ptr.p_int[i%b.cnt];
    7896             :     }
    7897           0 :     ae_frame_leave(_state);
    7898           0 : }
    7899             : 
    7900             : 
    7901             : /*************************************************************************
    7902             : This is debug function intended for testing ALGLIB interface generator.
    7903             : Never use it in any real life project.
    7904             : 
    7905             : Generate N-element array with even-numbered A[I] set to I, and odd-numbered
    7906             : ones set to 0.
    7907             : 
    7908             : Array is passed using "out" convention.
    7909             : 
    7910             :   -- ALGLIB --
    7911             :      Copyright 11.10.2013 by Bochkanov Sergey
    7912             : *************************************************************************/
    7913           0 : void xdebugi1outeven(ae_int_t n,
    7914             :      /* Integer */ ae_vector* a,
    7915             :      ae_state *_state)
    7916             : {
    7917             :     ae_int_t i;
    7918             : 
    7919           0 :     ae_vector_clear(a);
    7920             : 
    7921           0 :     ae_vector_set_length(a, n, _state);
    7922           0 :     for(i=0; i<=a->cnt-1; i++)
    7923             :     {
    7924           0 :         if( i%2==0 )
    7925             :         {
    7926           0 :             a->ptr.p_int[i] = i;
    7927             :         }
    7928             :         else
    7929             :         {
    7930           0 :             a->ptr.p_int[i] = 0;
    7931             :         }
    7932             :     }
    7933           0 : }
    7934             : 
    7935             : 
    7936             : /*************************************************************************
    7937             : This is debug function intended for testing ALGLIB interface generator.
    7938             : Never use it in any real life project.
    7939             : 
    7940             : Returns sum of elements in the array.
    7941             : 
    7942             :   -- ALGLIB --
    7943             :      Copyright 11.10.2013 by Bochkanov Sergey
    7944             : *************************************************************************/
    7945           0 : double xdebugr1sum(/* Real    */ ae_vector* a, ae_state *_state)
    7946             : {
    7947             :     ae_int_t i;
    7948             :     double result;
    7949             : 
    7950             : 
    7951           0 :     result = (double)(0);
    7952           0 :     for(i=0; i<=a->cnt-1; i++)
    7953             :     {
    7954           0 :         result = result+a->ptr.p_double[i];
    7955             :     }
    7956           0 :     return result;
    7957             : }
    7958             : 
    7959             : 
    7960             : /*************************************************************************
    7961             : This is debug function intended for testing ALGLIB interface generator.
    7962             : Never use it in any real life project.
    7963             : 
    7964             : Replace all values in array by -A[I]
    7965             : Array is passed using "shared" convention.
    7966             : 
    7967             :   -- ALGLIB --
    7968             :      Copyright 11.10.2013 by Bochkanov Sergey
    7969             : *************************************************************************/
    7970           0 : void xdebugr1neg(/* Real    */ ae_vector* a, ae_state *_state)
    7971             : {
    7972             :     ae_int_t i;
    7973             : 
    7974             : 
    7975           0 :     for(i=0; i<=a->cnt-1; i++)
    7976             :     {
    7977           0 :         a->ptr.p_double[i] = -a->ptr.p_double[i];
    7978             :     }
    7979           0 : }
    7980             : 
    7981             : 
    7982             : /*************************************************************************
    7983             : This is debug function intended for testing ALGLIB interface generator.
    7984             : Never use it in any real life project.
    7985             : 
    7986             : Appends copy of array to itself.
    7987             : Array is passed using "var" convention.
    7988             : 
    7989             :   -- ALGLIB --
    7990             :      Copyright 11.10.2013 by Bochkanov Sergey
    7991             : *************************************************************************/
    7992           0 : void xdebugr1appendcopy(/* Real    */ ae_vector* a, ae_state *_state)
    7993             : {
    7994             :     ae_frame _frame_block;
    7995             :     ae_int_t i;
    7996             :     ae_vector b;
    7997             : 
    7998           0 :     ae_frame_make(_state, &_frame_block);
    7999           0 :     memset(&b, 0, sizeof(b));
    8000           0 :     ae_vector_init(&b, 0, DT_REAL, _state, ae_true);
    8001             : 
    8002           0 :     ae_vector_set_length(&b, a->cnt, _state);
    8003           0 :     for(i=0; i<=b.cnt-1; i++)
    8004             :     {
    8005           0 :         b.ptr.p_double[i] = a->ptr.p_double[i];
    8006             :     }
    8007           0 :     ae_vector_set_length(a, 2*b.cnt, _state);
    8008           0 :     for(i=0; i<=a->cnt-1; i++)
    8009             :     {
    8010           0 :         a->ptr.p_double[i] = b.ptr.p_double[i%b.cnt];
    8011             :     }
    8012           0 :     ae_frame_leave(_state);
    8013           0 : }
    8014             : 
    8015             : 
    8016             : /*************************************************************************
    8017             : This is debug function intended for testing ALGLIB interface generator.
    8018             : Never use it in any real life project.
    8019             : 
    8020             : Generate N-element array with even-numbered A[I] set to I*0.25,
    8021             : and odd-numbered ones are set to 0.
    8022             : 
    8023             : Array is passed using "out" convention.
    8024             : 
    8025             :   -- ALGLIB --
    8026             :      Copyright 11.10.2013 by Bochkanov Sergey
    8027             : *************************************************************************/
    8028           0 : void xdebugr1outeven(ae_int_t n,
    8029             :      /* Real    */ ae_vector* a,
    8030             :      ae_state *_state)
    8031             : {
    8032             :     ae_int_t i;
    8033             : 
    8034           0 :     ae_vector_clear(a);
    8035             : 
    8036           0 :     ae_vector_set_length(a, n, _state);
    8037           0 :     for(i=0; i<=a->cnt-1; i++)
    8038             :     {
    8039           0 :         if( i%2==0 )
    8040             :         {
    8041           0 :             a->ptr.p_double[i] = i*0.25;
    8042             :         }
    8043             :         else
    8044             :         {
    8045           0 :             a->ptr.p_double[i] = (double)(0);
    8046             :         }
    8047             :     }
    8048           0 : }
    8049             : 
    8050             : 
    8051             : /*************************************************************************
    8052             : This is debug function intended for testing ALGLIB interface generator.
    8053             : Never use it in any real life project.
    8054             : 
    8055             : Returns sum of elements in the array.
    8056             : 
    8057             :   -- ALGLIB --
    8058             :      Copyright 11.10.2013 by Bochkanov Sergey
    8059             : *************************************************************************/
    8060           0 : ae_complex xdebugc1sum(/* Complex */ ae_vector* a, ae_state *_state)
    8061             : {
    8062             :     ae_int_t i;
    8063             :     ae_complex result;
    8064             : 
    8065             : 
    8066           0 :     result = ae_complex_from_i(0);
    8067           0 :     for(i=0; i<=a->cnt-1; i++)
    8068             :     {
    8069           0 :         result = ae_c_add(result,a->ptr.p_complex[i]);
    8070             :     }
    8071           0 :     return result;
    8072             : }
    8073             : 
    8074             : 
    8075             : /*************************************************************************
    8076             : This is debug function intended for testing ALGLIB interface generator.
    8077             : Never use it in any real life project.
    8078             : 
    8079             : Replace all values in array by -A[I]
    8080             : Array is passed using "shared" convention.
    8081             : 
    8082             :   -- ALGLIB --
    8083             :      Copyright 11.10.2013 by Bochkanov Sergey
    8084             : *************************************************************************/
    8085           0 : void xdebugc1neg(/* Complex */ ae_vector* a, ae_state *_state)
    8086             : {
    8087             :     ae_int_t i;
    8088             : 
    8089             : 
    8090           0 :     for(i=0; i<=a->cnt-1; i++)
    8091             :     {
    8092           0 :         a->ptr.p_complex[i] = ae_c_neg(a->ptr.p_complex[i]);
    8093             :     }
    8094           0 : }
    8095             : 
    8096             : 
    8097             : /*************************************************************************
    8098             : This is debug function intended for testing ALGLIB interface generator.
    8099             : Never use it in any real life project.
    8100             : 
    8101             : Appends copy of array to itself.
    8102             : Array is passed using "var" convention.
    8103             : 
    8104             :   -- ALGLIB --
    8105             :      Copyright 11.10.2013 by Bochkanov Sergey
    8106             : *************************************************************************/
    8107           0 : void xdebugc1appendcopy(/* Complex */ ae_vector* a, ae_state *_state)
    8108             : {
    8109             :     ae_frame _frame_block;
    8110             :     ae_int_t i;
    8111             :     ae_vector b;
    8112             : 
    8113           0 :     ae_frame_make(_state, &_frame_block);
    8114           0 :     memset(&b, 0, sizeof(b));
    8115           0 :     ae_vector_init(&b, 0, DT_COMPLEX, _state, ae_true);
    8116             : 
    8117           0 :     ae_vector_set_length(&b, a->cnt, _state);
    8118           0 :     for(i=0; i<=b.cnt-1; i++)
    8119             :     {
    8120           0 :         b.ptr.p_complex[i] = a->ptr.p_complex[i];
    8121             :     }
    8122           0 :     ae_vector_set_length(a, 2*b.cnt, _state);
    8123           0 :     for(i=0; i<=a->cnt-1; i++)
    8124             :     {
    8125           0 :         a->ptr.p_complex[i] = b.ptr.p_complex[i%b.cnt];
    8126             :     }
    8127           0 :     ae_frame_leave(_state);
    8128           0 : }
    8129             : 
    8130             : 
    8131             : /*************************************************************************
    8132             : This is debug function intended for testing ALGLIB interface generator.
    8133             : Never use it in any real life project.
    8134             : 
    8135             : Generate N-element array with even-numbered A[K] set to (x,y) = (K*0.25, K*0.125)
    8136             : and odd-numbered ones are set to 0.
    8137             : 
    8138             : Array is passed using "out" convention.
    8139             : 
    8140             :   -- ALGLIB --
    8141             :      Copyright 11.10.2013 by Bochkanov Sergey
    8142             : *************************************************************************/
    8143           0 : void xdebugc1outeven(ae_int_t n,
    8144             :      /* Complex */ ae_vector* a,
    8145             :      ae_state *_state)
    8146             : {
    8147             :     ae_int_t i;
    8148             : 
    8149           0 :     ae_vector_clear(a);
    8150             : 
    8151           0 :     ae_vector_set_length(a, n, _state);
    8152           0 :     for(i=0; i<=a->cnt-1; i++)
    8153             :     {
    8154           0 :         if( i%2==0 )
    8155             :         {
    8156           0 :             a->ptr.p_complex[i].x = i*0.250;
    8157           0 :             a->ptr.p_complex[i].y = i*0.125;
    8158             :         }
    8159             :         else
    8160             :         {
    8161           0 :             a->ptr.p_complex[i] = ae_complex_from_i(0);
    8162             :         }
    8163             :     }
    8164           0 : }
    8165             : 
    8166             : 
    8167             : /*************************************************************************
    8168             : This is debug function intended for testing ALGLIB interface generator.
    8169             : Never use it in any real life project.
    8170             : 
    8171             : Counts number of True values in the boolean 2D array.
    8172             : 
    8173             :   -- ALGLIB --
    8174             :      Copyright 11.10.2013 by Bochkanov Sergey
    8175             : *************************************************************************/
    8176           0 : ae_int_t xdebugb2count(/* Boolean */ ae_matrix* a, ae_state *_state)
    8177             : {
    8178             :     ae_int_t i;
    8179             :     ae_int_t j;
    8180             :     ae_int_t result;
    8181             : 
    8182             : 
    8183           0 :     result = 0;
    8184           0 :     for(i=0; i<=a->rows-1; i++)
    8185             :     {
    8186           0 :         for(j=0; j<=a->cols-1; j++)
    8187             :         {
    8188           0 :             if( a->ptr.pp_bool[i][j] )
    8189             :             {
    8190           0 :                 result = result+1;
    8191             :             }
    8192             :         }
    8193             :     }
    8194           0 :     return result;
    8195             : }
    8196             : 
    8197             : 
    8198             : /*************************************************************************
    8199             : This is debug function intended for testing ALGLIB interface generator.
    8200             : Never use it in any real life project.
    8201             : 
    8202             : Replace all values in array by NOT(a[i]).
    8203             : Array is passed using "shared" convention.
    8204             : 
    8205             :   -- ALGLIB --
    8206             :      Copyright 11.10.2013 by Bochkanov Sergey
    8207             : *************************************************************************/
    8208           0 : void xdebugb2not(/* Boolean */ ae_matrix* a, ae_state *_state)
    8209             : {
    8210             :     ae_int_t i;
    8211             :     ae_int_t j;
    8212             : 
    8213             : 
    8214           0 :     for(i=0; i<=a->rows-1; i++)
    8215             :     {
    8216           0 :         for(j=0; j<=a->cols-1; j++)
    8217             :         {
    8218           0 :             a->ptr.pp_bool[i][j] = !a->ptr.pp_bool[i][j];
    8219             :         }
    8220             :     }
    8221           0 : }
    8222             : 
    8223             : 
    8224             : /*************************************************************************
    8225             : This is debug function intended for testing ALGLIB interface generator.
    8226             : Never use it in any real life project.
    8227             : 
    8228             : Transposes array.
    8229             : Array is passed using "var" convention.
    8230             : 
    8231             :   -- ALGLIB --
    8232             :      Copyright 11.10.2013 by Bochkanov Sergey
    8233             : *************************************************************************/
    8234           0 : void xdebugb2transpose(/* Boolean */ ae_matrix* a, ae_state *_state)
    8235             : {
    8236             :     ae_frame _frame_block;
    8237             :     ae_int_t i;
    8238             :     ae_int_t j;
    8239             :     ae_matrix b;
    8240             : 
    8241           0 :     ae_frame_make(_state, &_frame_block);
    8242           0 :     memset(&b, 0, sizeof(b));
    8243           0 :     ae_matrix_init(&b, 0, 0, DT_BOOL, _state, ae_true);
    8244             : 
    8245           0 :     ae_matrix_set_length(&b, a->rows, a->cols, _state);
    8246           0 :     for(i=0; i<=b.rows-1; i++)
    8247             :     {
    8248           0 :         for(j=0; j<=b.cols-1; j++)
    8249             :         {
    8250           0 :             b.ptr.pp_bool[i][j] = a->ptr.pp_bool[i][j];
    8251             :         }
    8252             :     }
    8253           0 :     ae_matrix_set_length(a, b.cols, b.rows, _state);
    8254           0 :     for(i=0; i<=b.rows-1; i++)
    8255             :     {
    8256           0 :         for(j=0; j<=b.cols-1; j++)
    8257             :         {
    8258           0 :             a->ptr.pp_bool[j][i] = b.ptr.pp_bool[i][j];
    8259             :         }
    8260             :     }
    8261           0 :     ae_frame_leave(_state);
    8262           0 : }
    8263             : 
    8264             : 
    8265             : /*************************************************************************
    8266             : This is debug function intended for testing ALGLIB interface generator.
    8267             : Never use it in any real life project.
    8268             : 
    8269             : Generate MxN matrix with elements set to "Sin(3*I+5*J)>0"
    8270             : Array is passed using "out" convention.
    8271             : 
    8272             :   -- ALGLIB --
    8273             :      Copyright 11.10.2013 by Bochkanov Sergey
    8274             : *************************************************************************/
    8275           0 : void xdebugb2outsin(ae_int_t m,
    8276             :      ae_int_t n,
    8277             :      /* Boolean */ ae_matrix* a,
    8278             :      ae_state *_state)
    8279             : {
    8280             :     ae_int_t i;
    8281             :     ae_int_t j;
    8282             : 
    8283           0 :     ae_matrix_clear(a);
    8284             : 
    8285           0 :     ae_matrix_set_length(a, m, n, _state);
    8286           0 :     for(i=0; i<=a->rows-1; i++)
    8287             :     {
    8288           0 :         for(j=0; j<=a->cols-1; j++)
    8289             :         {
    8290           0 :             a->ptr.pp_bool[i][j] = ae_fp_greater(ae_sin((double)(3*i+5*j), _state),(double)(0));
    8291             :         }
    8292             :     }
    8293           0 : }
    8294             : 
    8295             : 
    8296             : /*************************************************************************
    8297             : This is debug function intended for testing ALGLIB interface generator.
    8298             : Never use it in any real life project.
    8299             : 
    8300             : Returns sum of elements in the array.
    8301             : 
    8302             :   -- ALGLIB --
    8303             :      Copyright 11.10.2013 by Bochkanov Sergey
    8304             : *************************************************************************/
    8305           0 : ae_int_t xdebugi2sum(/* Integer */ ae_matrix* a, ae_state *_state)
    8306             : {
    8307             :     ae_int_t i;
    8308             :     ae_int_t j;
    8309             :     ae_int_t result;
    8310             : 
    8311             : 
    8312           0 :     result = 0;
    8313           0 :     for(i=0; i<=a->rows-1; i++)
    8314             :     {
    8315           0 :         for(j=0; j<=a->cols-1; j++)
    8316             :         {
    8317           0 :             result = result+a->ptr.pp_int[i][j];
    8318             :         }
    8319             :     }
    8320           0 :     return result;
    8321             : }
    8322             : 
    8323             : 
    8324             : /*************************************************************************
    8325             : This is debug function intended for testing ALGLIB interface generator.
    8326             : Never use it in any real life project.
    8327             : 
    8328             : Replace all values in array by -a[i,j]
    8329             : Array is passed using "shared" convention.
    8330             : 
    8331             :   -- ALGLIB --
    8332             :      Copyright 11.10.2013 by Bochkanov Sergey
    8333             : *************************************************************************/
    8334           0 : void xdebugi2neg(/* Integer */ ae_matrix* a, ae_state *_state)
    8335             : {
    8336             :     ae_int_t i;
    8337             :     ae_int_t j;
    8338             : 
    8339             : 
    8340           0 :     for(i=0; i<=a->rows-1; i++)
    8341             :     {
    8342           0 :         for(j=0; j<=a->cols-1; j++)
    8343             :         {
    8344           0 :             a->ptr.pp_int[i][j] = -a->ptr.pp_int[i][j];
    8345             :         }
    8346             :     }
    8347           0 : }
    8348             : 
    8349             : 
    8350             : /*************************************************************************
    8351             : This is debug function intended for testing ALGLIB interface generator.
    8352             : Never use it in any real life project.
    8353             : 
    8354             : Transposes array.
    8355             : Array is passed using "var" convention.
    8356             : 
    8357             :   -- ALGLIB --
    8358             :      Copyright 11.10.2013 by Bochkanov Sergey
    8359             : *************************************************************************/
    8360           0 : void xdebugi2transpose(/* Integer */ ae_matrix* a, ae_state *_state)
    8361             : {
    8362             :     ae_frame _frame_block;
    8363             :     ae_int_t i;
    8364             :     ae_int_t j;
    8365             :     ae_matrix b;
    8366             : 
    8367           0 :     ae_frame_make(_state, &_frame_block);
    8368           0 :     memset(&b, 0, sizeof(b));
    8369           0 :     ae_matrix_init(&b, 0, 0, DT_INT, _state, ae_true);
    8370             : 
    8371           0 :     ae_matrix_set_length(&b, a->rows, a->cols, _state);
    8372           0 :     for(i=0; i<=b.rows-1; i++)
    8373             :     {
    8374           0 :         for(j=0; j<=b.cols-1; j++)
    8375             :         {
    8376           0 :             b.ptr.pp_int[i][j] = a->ptr.pp_int[i][j];
    8377             :         }
    8378             :     }
    8379           0 :     ae_matrix_set_length(a, b.cols, b.rows, _state);
    8380           0 :     for(i=0; i<=b.rows-1; i++)
    8381             :     {
    8382           0 :         for(j=0; j<=b.cols-1; j++)
    8383             :         {
    8384           0 :             a->ptr.pp_int[j][i] = b.ptr.pp_int[i][j];
    8385             :         }
    8386             :     }
    8387           0 :     ae_frame_leave(_state);
    8388           0 : }
    8389             : 
    8390             : 
    8391             : /*************************************************************************
    8392             : This is debug function intended for testing ALGLIB interface generator.
    8393             : Never use it in any real life project.
    8394             : 
    8395             : Generate MxN matrix with elements set to "Sign(Sin(3*I+5*J))"
    8396             : Array is passed using "out" convention.
    8397             : 
    8398             :   -- ALGLIB --
    8399             :      Copyright 11.10.2013 by Bochkanov Sergey
    8400             : *************************************************************************/
    8401           0 : void xdebugi2outsin(ae_int_t m,
    8402             :      ae_int_t n,
    8403             :      /* Integer */ ae_matrix* a,
    8404             :      ae_state *_state)
    8405             : {
    8406             :     ae_int_t i;
    8407             :     ae_int_t j;
    8408             : 
    8409           0 :     ae_matrix_clear(a);
    8410             : 
    8411           0 :     ae_matrix_set_length(a, m, n, _state);
    8412           0 :     for(i=0; i<=a->rows-1; i++)
    8413             :     {
    8414           0 :         for(j=0; j<=a->cols-1; j++)
    8415             :         {
    8416           0 :             a->ptr.pp_int[i][j] = ae_sign(ae_sin((double)(3*i+5*j), _state), _state);
    8417             :         }
    8418             :     }
    8419           0 : }
    8420             : 
    8421             : 
    8422             : /*************************************************************************
    8423             : This is debug function intended for testing ALGLIB interface generator.
    8424             : Never use it in any real life project.
    8425             : 
    8426             : Returns sum of elements in the array.
    8427             : 
    8428             :   -- ALGLIB --
    8429             :      Copyright 11.10.2013 by Bochkanov Sergey
    8430             : *************************************************************************/
    8431           0 : double xdebugr2sum(/* Real    */ ae_matrix* a, ae_state *_state)
    8432             : {
    8433             :     ae_int_t i;
    8434             :     ae_int_t j;
    8435             :     double result;
    8436             : 
    8437             : 
    8438           0 :     result = (double)(0);
    8439           0 :     for(i=0; i<=a->rows-1; i++)
    8440             :     {
    8441           0 :         for(j=0; j<=a->cols-1; j++)
    8442             :         {
    8443           0 :             result = result+a->ptr.pp_double[i][j];
    8444             :         }
    8445             :     }
    8446           0 :     return result;
    8447             : }
    8448             : 
    8449             : 
    8450             : /*************************************************************************
    8451             : This is debug function intended for testing ALGLIB interface generator.
    8452             : Never use it in any real life project.
    8453             : 
    8454             : Replace all values in array by -a[i,j]
    8455             : Array is passed using "shared" convention.
    8456             : 
    8457             :   -- ALGLIB --
    8458             :      Copyright 11.10.2013 by Bochkanov Sergey
    8459             : *************************************************************************/
    8460           0 : void xdebugr2neg(/* Real    */ ae_matrix* a, ae_state *_state)
    8461             : {
    8462             :     ae_int_t i;
    8463             :     ae_int_t j;
    8464             : 
    8465             : 
    8466           0 :     for(i=0; i<=a->rows-1; i++)
    8467             :     {
    8468           0 :         for(j=0; j<=a->cols-1; j++)
    8469             :         {
    8470           0 :             a->ptr.pp_double[i][j] = -a->ptr.pp_double[i][j];
    8471             :         }
    8472             :     }
    8473           0 : }
    8474             : 
    8475             : 
    8476             : /*************************************************************************
    8477             : This is debug function intended for testing ALGLIB interface generator.
    8478             : Never use it in any real life project.
    8479             : 
    8480             : Transposes array.
    8481             : Array is passed using "var" convention.
    8482             : 
    8483             :   -- ALGLIB --
    8484             :      Copyright 11.10.2013 by Bochkanov Sergey
    8485             : *************************************************************************/
    8486           0 : void xdebugr2transpose(/* Real    */ ae_matrix* a, ae_state *_state)
    8487             : {
    8488             :     ae_frame _frame_block;
    8489             :     ae_int_t i;
    8490             :     ae_int_t j;
    8491             :     ae_matrix b;
    8492             : 
    8493           0 :     ae_frame_make(_state, &_frame_block);
    8494           0 :     memset(&b, 0, sizeof(b));
    8495           0 :     ae_matrix_init(&b, 0, 0, DT_REAL, _state, ae_true);
    8496             : 
    8497           0 :     ae_matrix_set_length(&b, a->rows, a->cols, _state);
    8498           0 :     for(i=0; i<=b.rows-1; i++)
    8499             :     {
    8500           0 :         for(j=0; j<=b.cols-1; j++)
    8501             :         {
    8502           0 :             b.ptr.pp_double[i][j] = a->ptr.pp_double[i][j];
    8503             :         }
    8504             :     }
    8505           0 :     ae_matrix_set_length(a, b.cols, b.rows, _state);
    8506           0 :     for(i=0; i<=b.rows-1; i++)
    8507             :     {
    8508           0 :         for(j=0; j<=b.cols-1; j++)
    8509             :         {
    8510           0 :             a->ptr.pp_double[j][i] = b.ptr.pp_double[i][j];
    8511             :         }
    8512             :     }
    8513           0 :     ae_frame_leave(_state);
    8514           0 : }
    8515             : 
    8516             : 
    8517             : /*************************************************************************
    8518             : This is debug function intended for testing ALGLIB interface generator.
    8519             : Never use it in any real life project.
    8520             : 
    8521             : Generate MxN matrix with elements set to "Sin(3*I+5*J)"
    8522             : Array is passed using "out" convention.
    8523             : 
    8524             :   -- ALGLIB --
    8525             :      Copyright 11.10.2013 by Bochkanov Sergey
    8526             : *************************************************************************/
    8527           0 : void xdebugr2outsin(ae_int_t m,
    8528             :      ae_int_t n,
    8529             :      /* Real    */ ae_matrix* a,
    8530             :      ae_state *_state)
    8531             : {
    8532             :     ae_int_t i;
    8533             :     ae_int_t j;
    8534             : 
    8535           0 :     ae_matrix_clear(a);
    8536             : 
    8537           0 :     ae_matrix_set_length(a, m, n, _state);
    8538           0 :     for(i=0; i<=a->rows-1; i++)
    8539             :     {
    8540           0 :         for(j=0; j<=a->cols-1; j++)
    8541             :         {
    8542           0 :             a->ptr.pp_double[i][j] = ae_sin((double)(3*i+5*j), _state);
    8543             :         }
    8544             :     }
    8545           0 : }
    8546             : 
    8547             : 
    8548             : /*************************************************************************
    8549             : This is debug function intended for testing ALGLIB interface generator.
    8550             : Never use it in any real life project.
    8551             : 
    8552             : Returns sum of elements in the array.
    8553             : 
    8554             :   -- ALGLIB --
    8555             :      Copyright 11.10.2013 by Bochkanov Sergey
    8556             : *************************************************************************/
    8557           0 : ae_complex xdebugc2sum(/* Complex */ ae_matrix* a, ae_state *_state)
    8558             : {
    8559             :     ae_int_t i;
    8560             :     ae_int_t j;
    8561             :     ae_complex result;
    8562             : 
    8563             : 
    8564           0 :     result = ae_complex_from_i(0);
    8565           0 :     for(i=0; i<=a->rows-1; i++)
    8566             :     {
    8567           0 :         for(j=0; j<=a->cols-1; j++)
    8568             :         {
    8569           0 :             result = ae_c_add(result,a->ptr.pp_complex[i][j]);
    8570             :         }
    8571             :     }
    8572           0 :     return result;
    8573             : }
    8574             : 
    8575             : 
    8576             : /*************************************************************************
    8577             : This is debug function intended for testing ALGLIB interface generator.
    8578             : Never use it in any real life project.
    8579             : 
    8580             : Replace all values in array by -a[i,j]
    8581             : Array is passed using "shared" convention.
    8582             : 
    8583             :   -- ALGLIB --
    8584             :      Copyright 11.10.2013 by Bochkanov Sergey
    8585             : *************************************************************************/
    8586           0 : void xdebugc2neg(/* Complex */ ae_matrix* a, ae_state *_state)
    8587             : {
    8588             :     ae_int_t i;
    8589             :     ae_int_t j;
    8590             : 
    8591             : 
    8592           0 :     for(i=0; i<=a->rows-1; i++)
    8593             :     {
    8594           0 :         for(j=0; j<=a->cols-1; j++)
    8595             :         {
    8596           0 :             a->ptr.pp_complex[i][j] = ae_c_neg(a->ptr.pp_complex[i][j]);
    8597             :         }
    8598             :     }
    8599           0 : }
    8600             : 
    8601             : 
    8602             : /*************************************************************************
    8603             : This is debug function intended for testing ALGLIB interface generator.
    8604             : Never use it in any real life project.
    8605             : 
    8606             : Transposes array.
    8607             : Array is passed using "var" convention.
    8608             : 
    8609             :   -- ALGLIB --
    8610             :      Copyright 11.10.2013 by Bochkanov Sergey
    8611             : *************************************************************************/
    8612           0 : void xdebugc2transpose(/* Complex */ ae_matrix* a, ae_state *_state)
    8613             : {
    8614             :     ae_frame _frame_block;
    8615             :     ae_int_t i;
    8616             :     ae_int_t j;
    8617             :     ae_matrix b;
    8618             : 
    8619           0 :     ae_frame_make(_state, &_frame_block);
    8620           0 :     memset(&b, 0, sizeof(b));
    8621           0 :     ae_matrix_init(&b, 0, 0, DT_COMPLEX, _state, ae_true);
    8622             : 
    8623           0 :     ae_matrix_set_length(&b, a->rows, a->cols, _state);
    8624           0 :     for(i=0; i<=b.rows-1; i++)
    8625             :     {
    8626           0 :         for(j=0; j<=b.cols-1; j++)
    8627             :         {
    8628           0 :             b.ptr.pp_complex[i][j] = a->ptr.pp_complex[i][j];
    8629             :         }
    8630             :     }
    8631           0 :     ae_matrix_set_length(a, b.cols, b.rows, _state);
    8632           0 :     for(i=0; i<=b.rows-1; i++)
    8633             :     {
    8634           0 :         for(j=0; j<=b.cols-1; j++)
    8635             :         {
    8636           0 :             a->ptr.pp_complex[j][i] = b.ptr.pp_complex[i][j];
    8637             :         }
    8638             :     }
    8639           0 :     ae_frame_leave(_state);
    8640           0 : }
    8641             : 
    8642             : 
    8643             : /*************************************************************************
    8644             : This is debug function intended for testing ALGLIB interface generator.
    8645             : Never use it in any real life project.
    8646             : 
    8647             : Generate MxN matrix with elements set to "Sin(3*I+5*J),Cos(3*I+5*J)"
    8648             : Array is passed using "out" convention.
    8649             : 
    8650             :   -- ALGLIB --
    8651             :      Copyright 11.10.2013 by Bochkanov Sergey
    8652             : *************************************************************************/
    8653           0 : void xdebugc2outsincos(ae_int_t m,
    8654             :      ae_int_t n,
    8655             :      /* Complex */ ae_matrix* a,
    8656             :      ae_state *_state)
    8657             : {
    8658             :     ae_int_t i;
    8659             :     ae_int_t j;
    8660             : 
    8661           0 :     ae_matrix_clear(a);
    8662             : 
    8663           0 :     ae_matrix_set_length(a, m, n, _state);
    8664           0 :     for(i=0; i<=a->rows-1; i++)
    8665             :     {
    8666           0 :         for(j=0; j<=a->cols-1; j++)
    8667             :         {
    8668           0 :             a->ptr.pp_complex[i][j].x = ae_sin((double)(3*i+5*j), _state);
    8669           0 :             a->ptr.pp_complex[i][j].y = ae_cos((double)(3*i+5*j), _state);
    8670             :         }
    8671             :     }
    8672           0 : }
    8673             : 
    8674             : 
    8675             : /*************************************************************************
    8676             : This is debug function intended for testing ALGLIB interface generator.
    8677             : Never use it in any real life project.
    8678             : 
    8679             : Returns sum of a[i,j]*(1+b[i,j]) such that c[i,j] is True
    8680             : 
    8681             :   -- ALGLIB --
    8682             :      Copyright 11.10.2013 by Bochkanov Sergey
    8683             : *************************************************************************/
    8684           0 : double xdebugmaskedbiasedproductsum(ae_int_t m,
    8685             :      ae_int_t n,
    8686             :      /* Real    */ ae_matrix* a,
    8687             :      /* Real    */ ae_matrix* b,
    8688             :      /* Boolean */ ae_matrix* c,
    8689             :      ae_state *_state)
    8690             : {
    8691             :     ae_int_t i;
    8692             :     ae_int_t j;
    8693             :     double result;
    8694             : 
    8695             : 
    8696           0 :     ae_assert(m>=a->rows, "Assertion failed", _state);
    8697           0 :     ae_assert(m>=b->rows, "Assertion failed", _state);
    8698           0 :     ae_assert(m>=c->rows, "Assertion failed", _state);
    8699           0 :     ae_assert(n>=a->cols, "Assertion failed", _state);
    8700           0 :     ae_assert(n>=b->cols, "Assertion failed", _state);
    8701           0 :     ae_assert(n>=c->cols, "Assertion failed", _state);
    8702           0 :     result = 0.0;
    8703           0 :     for(i=0; i<=m-1; i++)
    8704             :     {
    8705           0 :         for(j=0; j<=n-1; j++)
    8706             :         {
    8707           0 :             if( c->ptr.pp_bool[i][j] )
    8708             :             {
    8709           0 :                 result = result+a->ptr.pp_double[i][j]*(1+b->ptr.pp_double[i][j]);
    8710             :             }
    8711             :         }
    8712             :     }
    8713           0 :     return result;
    8714             : }
    8715             : 
    8716             : 
    8717           0 : void _xdebugrecord1_init(void* _p, ae_state *_state, ae_bool make_automatic)
    8718             : {
    8719           0 :     xdebugrecord1 *p = (xdebugrecord1*)_p;
    8720           0 :     ae_touch_ptr((void*)p);
    8721           0 :     ae_vector_init(&p->a, 0, DT_REAL, _state, make_automatic);
    8722           0 : }
    8723             : 
    8724             : 
    8725           0 : void _xdebugrecord1_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic)
    8726             : {
    8727           0 :     xdebugrecord1 *dst = (xdebugrecord1*)_dst;
    8728           0 :     xdebugrecord1 *src = (xdebugrecord1*)_src;
    8729           0 :     dst->i = src->i;
    8730           0 :     dst->c = src->c;
    8731           0 :     ae_vector_init_copy(&dst->a, &src->a, _state, make_automatic);
    8732           0 : }
    8733             : 
    8734             : 
    8735           0 : void _xdebugrecord1_clear(void* _p)
    8736             : {
    8737           0 :     xdebugrecord1 *p = (xdebugrecord1*)_p;
    8738           0 :     ae_touch_ptr((void*)p);
    8739           0 :     ae_vector_clear(&p->a);
    8740           0 : }
    8741             : 
    8742             : 
    8743           0 : void _xdebugrecord1_destroy(void* _p)
    8744             : {
    8745           0 :     xdebugrecord1 *p = (xdebugrecord1*)_p;
    8746           0 :     ae_touch_ptr((void*)p);
    8747           0 :     ae_vector_destroy(&p->a);
    8748           0 : }
    8749             : 
    8750             : 
    8751             : #endif
    8752             : 
    8753             : }
    8754             : 

Generated by: LCOV version 1.16