ó
‡ˆ\c           @   s†  d  Z  d d l Z d d l j Z d d l m Z d d l m Z d d l m	 Z	 d d l m
 Z
 d d l m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d „  Z d „  Z d „  Z e d „  ƒ Z d „  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d S(   s{   
Testing for the approximate neighbor search using
Locality Sensitive Hashing Forest module
(sklearn.neighbors.LSHForest).
iÿÿÿÿN(   t   assert_array_equal(   t   assert_almost_equal(   t   assert_array_almost_equal(   t   assert_equal(   t   assert_raises(   t   assert_array_less(   t   assert_greater(   t   assert_true(   t   assert_not_equal(   t   assert_warns_message(   t   ignore_warnings(   t   pairwise_distances(   t	   LSHForest(   t   NearestNeighborsc           C   s   t  t d t ƒ d  S(   Nsc   LSHForest has poor performance and has been deprecated in 0.19. It will be removed in version 0.21.(   R	   t   DeprecationWarningR   (    (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_lsh_forest_deprecation   s    c          C   sò  t  j d d d g ƒ }  d } d } d } d } t  j j d ƒ } t  j |  j d d	 t ƒ} | j | | ƒ } x)t |  ƒ D]\ } }	 t	 t
 d
 t ƒd |	 d d ƒ }
 t	 |
 j ƒ | ƒ xÀ t | ƒ D]² } | | j d | ƒ j d d ƒ } |
 j | d | d t ƒ} t | | d d ƒ} t  j | ƒ d d  | … f } t  j | | ƒ j d } | t | ƒ } | | | | | <qÊ W| | t | ƒ | | <q} Wd | f GHt t  j t  j | ƒ d k ƒ d d ƒt t  j | ƒ d k d d ƒd  S(   Ngš™™™™™¹?i2   iô  id   i
   i   i*   i    t   dtypet   categoryt   n_candidatest   random_statei   iÿÿÿÿt   n_neighborst   return_distancet   metrict   cosines   accuracies:t   msgs"   Accuracies are not non-decreasing.s5   Highest accuracy is not strictly greater than lowest.(   t   npt   arrayt   randomt   RandomStatet   zerost   shapet   floatt   randt	   enumerateR
   R   R   t   fitt   ranget   randintt   reshapet
   kneighborst   FalseR   t   argsortt   intersect1dR   t   allt   difft   ptp(   t   n_candidates_valuest	   n_samplest
   n_featurest   n_itert   n_pointst   rngt
   accuraciest   Xt   iR   t   lshft   jt   queryt	   neighborst	   distancest   rankst   intersectiont   ratio(    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt)   test_neighbors_accuracy_with_n_candidates$   s6    "	!c          C   sç  t  j d d d g ƒ }  d } d } d } d } t  j j d ƒ } t  j |  j d d t ƒ} | j | | ƒ } x)t |  ƒ D]\ } }	 t	 t
 d t ƒd	 d
 d |	 ƒ }
 t	 |
 j ƒ | ƒ xÀ t | ƒ D]² } | | j d | ƒ j d d ƒ } |
 j | d | d t ƒ} t | | d d ƒ} t  j | ƒ d d  | … f } t  j | | ƒ j d } | t | ƒ } | | | | | <qÊ W| | t | ƒ | | <q} Wt t  j t  j | ƒ d k ƒ d d ƒt t  j | ƒ d k d d ƒd  S(   Ni   i
   id   i   i*   i    R   R   R   iô  t   n_estimatorsiÿÿÿÿR   R   R   R   R   s"   Accuracies are not non-decreasing.s5   Highest accuracy is not strictly greater than lowest.(   R   R   R   R   R   R   R   R    R!   R
   R   R   R"   R#   R$   R%   R&   R'   R   R(   R)   R   R*   R+   R,   (   R?   R.   R/   R0   R1   R2   R3   R4   R5   t   tR6   R7   R8   R9   R:   R;   R<   R=   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt)   test_neighbors_accuracy_with_n_estimatorsI   s4    "	!c          C   s	  d }  d } d } t  j j d ƒ } | j |  | ƒ } t t d t ƒd d ƒ } t t | j	 | d ƒ t | j
 ƒ | ƒ xw t | ƒ D]i } | j d |  ƒ } | | j d |  ƒ j d d	 ƒ } | j	 | d
 | d t ƒ}	 t |	 j d | ƒ qˆ Wd }
 | | j d |  |
 ƒ } | j	 | d
 d d t ƒ\ } }	 t |	 j d |
 ƒ t | j d |
 ƒ | j	 | d
 d d t ƒ}	 t |	 j d |
 ƒ | j | ƒ j d d	 ƒ } | j	 | d
 d d t ƒ| j	 | d t ƒ}	 t |	 j d d ƒ t |	 j j d k d d ƒd  S(   Ni   i   i
   i*   R   t   min_hash_matchi    i   iÿÿÿÿR   R   i   R5   R   s#   neighbors are not in integer dtype.(   R   R   R   R    R
   R   R   R   t
   ValueErrorR&   R"   R#   R$   R%   R'   R   R   t   Truet   randnR   R   t   kind(   R.   R/   R0   R2   R4   R6   R5   R   R8   R9   t	   n_queriest   queriesR:   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_kneighborsl   s@    	"		c          C   si  d }  d } d } t  j j d ƒ } | j |  | ƒ } t t d t ƒƒ  } t t | j	 | d ƒ t | j
 ƒ | ƒ xÙ t | ƒ D]Ë } | | j d |  ƒ j d d ƒ } t  j t | | d	 d
 ƒƒ } | j	 | d | d t ƒ}	 t |	 j d ƒ t |	 j t ƒ t |	 d j d d ƒ | j	 | d | d t ƒ\ }
 }	 t |
 d | ƒ q‚ Wd } | | j d |  | ƒ } | j	 | d t ƒ\ }
 }	 t |
 j | f ƒ t |
 j t ƒ t |	 j | f ƒ t |	 j t ƒ | | j d |  ƒ j d d ƒ } t  j t | | d	 d
 ƒƒ } t d d d	 d
 ƒ j
 | ƒ } | j	 | d | ƒ\ } } | j	 | d | ƒ\ } } d  S(   Ni   i   i
   i*   R   i    i   iÿÿÿÿR   R   t   radiusR   i   t	   algorithmt   brute(   i   (   R   R   R   R    R
   R   R   R   RC   t   radius_neighborsR"   R#   R$   R%   t   meanR   R'   R   R   R   t   objectR   RD   R   R   (   R.   R/   R0   R2   R4   R6   R5   R8   t	   mean_distR9   R:   RG   RH   t   nbrst   distances_exactt   _t   distances_approx(    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_radius_neighborsŸ   sB    "	"c          C   s  d d g d d g d d g d d g g }  t  |  ƒ } t d d d	 d
 ƒ j |  ƒ } t t d t ƒd d d | d d ƒ j |  ƒ } d d g g } t | |  d	 d
 ƒj ƒ  } t | d d d d ƒt | d d t	 j
 t	 j d ƒ ƒ t | d d ƒ t | d d d d ƒ| j | d d ƒ\ } } | j | d d ƒ\ } }	 t t	 j | d ƒ d d d g ƒ t t	 j |	 d ƒ d d d g ƒ t t	 j | d ƒ | d  ƒ t t	 j | d ƒ | d  ƒ t	 j t	 j ƒ j }
 | j | d d |
 ƒ\ } } | j | d d |
 ƒ\ } }	 t t	 j | d ƒ d d g ƒ t t	 j |	 d ƒ d d g ƒ t t	 j | d ƒ | d  ƒ t t	 j | d ƒ | d  ƒ d  S(   Ng+‡ÙÎ÷ï?gü©ñÒMbP?g      à?i    g      ð?g      ð¿RK   RL   R   R   R   RB   R   R   i*   g        t   decimali   i   i   i   i   RJ   iÿÿÿÿiþÿÿÿ(   t   lenR   R"   R
   R   R   R   t   ravelR   R   t   cost   piRM   R    t   sortR   t   finfot   float64t   eps(   R4   R1   t   nnbrst   lsfhR8   t   distst   exact_distst	   exact_idxt   approx_distst
   approx_idxR^   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt'   test_radius_neighbors_boundary_handlingë   s0    *%##  c          C   sô   d }  d } d } t  j j d ƒ } | j |  | ƒ } t t d t ƒƒ  } t | j ƒ | ƒ x t | ƒ D] } | j	 d |  ƒ } | | j	 d |  ƒ j
 d d ƒ } | j | d	 | d
 t ƒ\ }	 }
 t t  j t  j |	 d ƒ d k ƒ ƒ qk Wd  S(   Ni   i   i
   i*   R   i    i   iÿÿÿÿR   R   (   R   R   R   R    R
   R   R   R"   R#   R$   R%   R&   RD   R   R*   R+   (   R.   R/   R0   R2   R4   R6   R5   R   R8   R:   R9   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_distances(  s    "c          C   s  d }  d } d } t  j j d ƒ } | j |  | ƒ } t t d t ƒd | ƒ } t | j ƒ | ƒ t | | j	 ƒ t
 | t | j ƒ ƒ t
 d | j d j j d ƒ t
 | t | j ƒ ƒ t
 |  t | j d ƒ ƒ t
 | t | j ƒ ƒ t
 |  t | j d ƒ ƒ d  S(	   Ni   i   i   i*   R   R?   i    i    (   R   R   R   R    R
   R   R   R"   R    t   _fit_XR   RW   t   hash_functions_t   components_R   t   trees_t   original_indices_(   R.   R/   R?   R2   R4   R6   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_fitB  s    	c          C   s'  d }  d } d } t  j j d ƒ } | j |  | ƒ } | j | | ƒ } t t d t ƒƒ  } t | j ƒ | ƒ t | | j	 ƒ t | j
 ƒ | ƒ t t | j t  j j | | d ƒ ƒ t | j ƒ | ƒ t | j	 j d |  | ƒ t t | j d ƒ |  | ƒ t t | j d ƒ |  | ƒ d  S(   Ni   i   i   i*   R   i   i    (   R   R   R   R    R
   R   R   t   partial_fitR    Rh   R"   R   RC   RE   R   R   RW   Rl   Rk   (   R.   t   n_samples_partial_fitR/   R2   R4   t   X_partial_fitR6   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_partial_fit^  s&    c          C   s=  d }  d } d } t  j j d ƒ } | j |  | ƒ } t t d t ƒd | d | j d t  j t  j	 ƒ j
 ƒ ƒ } t | j ƒ | ƒ g  } x+ t | ƒ D] } | j | j | j ƒ q˜ Wx= t | ƒ D]/ } t t  j | ƒ t  j | j | j ƒ ƒ qÆ Wx= t | ƒ D]/ } t t  j | ƒ t  j | j | j ƒ ƒ qWd  S(	   Ni   i   i   i*   R   R?   R   i    (   R   R   R   R    R
   R   R   R$   t   iinfot   int32t   maxR"   R#   t   appendRi   Rj   R   t   varRN   (   R.   R/   R?   R2   R4   R6   t   hash_functionsR5   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_hash_functions  s$    $c          C   s‹  t  j d d d g d d d g d d d g d d d g d d d g g d	 t  j ƒ}  t  j d
 d d g d	 t  j ƒj d d ƒ } t t d t ƒd d ƒ } t | j ƒ |  ƒ d d } t t	 | | j
 | d d ƒ| j
 | d d ƒ\ } } t | j d d ƒ t t d t ƒd d ƒ } t | j ƒ |  ƒ d d } t t	 | | j
 | d d ƒ| j
 | d d ƒ\ } } t | j d d ƒ d  S(   Ni   i   i   i   i   i	   i   i
   R   i   i   iÿÿÿÿR   RB   i    s•   Number of candidates is not sufficient to retrieve %i neighbors with min_hash_match = %i. Candidates are filled up uniformly from unselected indices.R   i   (   i   i    (   i   i   (   R   R   t   float32R%   R
   R   R   R"   R	   t   UserWarningR&   R   R   (   t   X_traint   X_testR6   t   messageR:   R9   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_candidatesŸ  s*    6-		c          C   sê   d d d g }  d } t  j j d ƒ } x¼ |  D]´ } | j | | ƒ } t t d t ƒd d ƒ } t | j ƒ | ƒ | j | ƒ } | j	 | ƒ } t
 | j d | ƒ t
 | j d	 | ƒ t
 | j d | ƒ t
 | j d	 | ƒ q. Wd  S(
   Ni   i
   i   i   i*   R   RB   i    i   (   R   R   R   R    R
   R   R   R"   t   kneighbors_grapht   radius_neighbors_graphR   R   (   t   n_samples_sizesR/   R2   R.   R4   R6   R   R€   (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_graphsÇ  s    	c    
      C   s„  t  j d d d d ƒ}  t  j d d d d ƒ} t t d t ƒd d d d ƒ j |  ƒ } t t d t ƒd d d d ƒ j |  j ƒ } | j | d	 t ƒ\ } } | j | j d	 t ƒ\ } } t	 | | ƒ t	 | | ƒ | j
 | d	 t ƒ\ } } | j
 | j d	 t ƒ\ } } t | j | j ƒ x* t | | ƒ D] \ } }	 t	 | |	 ƒ q6Wx* t | | ƒ D] \ } }	 t	 | |	 ƒ qcWd  S(
   Ni2   id   R   i    i
   i   R   RJ   R   (   t   spR    R
   R   R   R"   t   AR&   RD   R   RM   R   R   t   zip(
   t   X1t   X2t   forest_sparset   forest_denset   d_sparset   i_sparset   d_denset   i_denset   at   b(    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   test_sparse_inputÜ  s&    ($   t   __doc__t   numpyR   t   scipy.sparset   sparseRƒ   t   sklearn.utils.testingR    R   R   R   R   R   R   R   R   R	   R
   t   sklearn.metrics.pairwiseR   t   sklearn.neighborsR   R   R   R>   RA   RI   RU   Rf   Rg   Rm   Rq   Rx   R~   R‚   R   (    (    (    sG   lib/python2.7/site-packages/sklearn/neighbors/tests/test_approximate.pyt   <module>   s:   		%	#3	L=			#		(	