
    WiL%              
       ,   d dl mZ d dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZmZ d dlmZ  ej                   dd      d        Z ej                   ej$                  ej&                  ej&                  d	dd
      dd       Z ej                   dej$                  ej&                  ej&                  dd      d        Z ej                   d      d        Z ej                          dedddfd       Z ej                          deddeddddf	d       Zy)    )print_functionN)tau_rand_int	make_heapnew_build_candidatesdeheap_sortchecked_flagged_heap_push"sparse_generate_graph_update_arrayapply_graph_update_arrayEMPTY_GRAPH)sparse_euclideanTF)parallelcachec	           
          |j                   d   }	|	|z   dz
  |z  }
t        |      D ]  }d||<   	 t        j                  |      D ]5  }||
z  }t	        ||
z   |	      }| j                   d   }d}t        ||      D ]  }t        |j                   d         D ]  }|||f   }|dk  r ,t        |dz   |j                   d         D ]  }|||f   }|dk  r >|||   ||dz       }|||   ||dz       }|||   ||dz       }|||   ||dz       } |||||      }|||   k  s	|||   k  se||k  skt        j                  |      | ||df<   t        j                  |      | ||df<   || ||df<   |dz  }   |||<   8 | S )zHGenerate leaf updates into pre-allocated arrays for parallel efficiency.r         )shaperangenumbaprangeminnpfloat32)updatesn_updates_per_thread
leaf_blockdist_thresholdsindsindptrdatadist	n_threadsn_leavesleaves_per_threadt
start_leafend_leafmax_updatescountleaf_idxipjq	from_inds	from_datato_indsto_datads                             h/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/pynndescent/sparse_nndescent.pygenerate_leaf_updatesr4      s    "H!I-1i? 9 $"#Q$ \\)$ (**
z$55x@mmA&j(3 	'H:++A./ 'x{+q5q1uj&6&6q&9: 'A"8Q;/A1u $VAYA ?I $VAYA ?I"6!9va!e}=G"6!9va!e}=GY	7GDA?1--_Q5G1G ;.35::a=GAuaK035::a=GAuaK034GAuaK0!QJE#''	'2 #(Q?(B N    )r2   r+   r-   )localsr   r   c                    |j                   d   }|dz  }||z  }	|j                   d   }
t        ||
z  |
dz
  z  d|z  z        dz   }t        j                  ||dft        j                        }t        j                  |t        j
                        }|d   j                   d   }||z  dz   }t        |	dz         D ]M  }||z  }t        ||dz   |z        }||| }|d   d d df   }t        ||||| ||||	       t        j                  |      D ]  }||z  }t        ||z   |      }t        |      D ]  }t        ||         D ]  }t        j
                  |||df         }t        j
                  |||df         }|||df   }||k\  r:||k  r5t        |d   |   |d   |   |d   |   ||t        j                  d             ||k\  s||k  st        |d   |   |d   |   |d   |   ||t        j                  d                P y )Nr   @   r   r      dtype)r   intr   zerosr   int32r   r   r4   r   r   r   uint8)r   r   r   r    current_graph
leaf_arrayr!   r"   
block_sizen_blocksmax_leaf_sizeupdates_per_threadr   r   
n_verticesvertex_block_sizer*   block_start	block_endr   r   r$   v_block_startv_block_endr,   kr+   r-   r2   s                                r3   init_rp_treerM   O   sw    "HRJ:%H$$Q'MJ&-!*;<INORSS  hh	#5q9LG88IRXX>q!''*J"i/!38a<  .*n1q5J"67	I6
'*1a40 
	
 i( 	A 11Mm.??LK9% 3A67 AAq!12AAq!12A1a(AM)a+o1)!,Q/)!,Q/)!,Q/HHQK M)a+o1)!,Q/)!,Q/)!,Q/HHQK		'.r5   )r2   r*   idx)fastmathr6   r   c                    |j                   d   dz
  }t        |      D ]  }|d   |df   dk  st        | t        j                  |d   |   dk\        z
        D ]  }	t        j                  t        |            |z  }
|||
   ||
dz       }|||
   ||
dz       }|||   ||dz       }|||   ||dz       } |||||      }t        |d   |   |d   |   |d   |   ||
t        j                  d               y )Nr   r   g        r   )r   r   r   sumabsr   r   r?   )n_neighborsr   r   r   heapr    	rng_state	n_samplesr*   r,   rN   r.   r/   r0   r1   r2   s                   r3   init_randomrW      s/    Q!#I9 71a4=3;Q
c0A)BBC ff\)45	A vcAg?	 vcAg?	vay6!a%=9vay6!a%=9Iw@)GAJQ
DGAJ3  r5   )r   c                     d}|j                   d   }t        |dz         D ]T  }||z  }t        ||dz   |z        }||| }||| }|d   dddf   }t        |
||||| ||||	
       |t	        ||
||	      z  }V |S )zFProcess candidate neighbors for sparse data using array-based updates.r   r   N)r   r   r   r	   r
   )r   r   r   r    r@   new_candidate_neighborsold_candidate_neighborsrC   rB   r!   update_arrayr   crF   r*   rH   rI   new_candidate_blockold_candidate_blockr   s                       r3   sparse_process_candidatesr_      s      	
A(..q1J8a<  
*n
QUj$89	5k)L5k)L'*1a40* 	
 	
%<)=y
 	
-
4 Hr5   2   
   gMbP?c                    |j                   d   dz
  }d}||z  }t        j                         }t        |dz  ||dz
  z  dz  z   |z  |z        dz   }t	        j
                  ||dft        j                        }t	        j                  |t        j                        }t        |      D ][  }|
rt        d|dz   d	|       t        | |||      \  }}t        ||||| |||||||      }||	|z  |z  k  sI|
rt        d
|dz   d        y  y )Nr   r   i @  r   i   r9   r:   	z / z(	Stopping threshold met -- exiting after
iterations)r   r   get_num_threadsr<   r   emptyr   r=   r>   r   printr   r_   )r@   r   r   r   rS   rU   max_candidatesr    n_itersdeltaverboserF   rB   rC   r!   max_updates_per_threadr[   r   nrY   rZ   r\   s                         r3   nn_descent_internalrn      sH    a1$JJZ'H%%'I 	Q>A3E!F!JJ	

 	  88Y(>B"**UL88IRXX>7^ $Aug.=Q>9i>
:	 "9 &## 
 #j00A1q5,W5r5   c                 p   |j                   d   dz
  }|	d   j                   d   dk(  r0t        ||      }|
rt        | |||||       t        || |||||       n8|	d   j                   d   |k(  r|	d   j                   d   |k(  r|	}nt	        d      t        || |||||||||       t        |d   |d         S )Nr   r   z Invalid initial graph specified!)rh   r    ri   rj   rk   )r   r   rM   rW   
ValueErrorrn   r   )r   r   r   rS   rU   rh   r    ri   rj   
init_graphrp_tree_initrA   
low_memoryrk   rV   r@   s                   r3   
nn_descentrt     s    $ Q!#I!}1"!)[9vtT=*MKvt]D)T	A		Q	9	,A1D1DQ1G;1V";<< % }Q'q)9::r5   )   )
__future__r   numpyr   r   pynndescent.utilsr   r   r   r   r   r	   r
   r   pynndescent.sparser   njitr4   r   r>   rM   rW   r_   rn   rt    r5   r3   <module>r|      sD  
 &  	 	 	 0 T'4 (4n U[[u{{C

=
=@ U[[E


* %+ +\  	
8 8v  	
/; /;r5   