o
    {iL%                  
   @   s  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dd	 Zejejejejd
ddddddZejdejejejddddd Zejdddd Ze dedddfddZe deddeddddf	ddZdS )    )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	              	   C   s  |j d }	|	| d | }
t|D ]}d||< qt|D ]}||
 }t||
 |	}| j d }d}t||D ]}t|j d D ]}|||f }|dk rM nt|d |j d D ]t}|||f }|dk re ng||| ||d   }||| ||d   }||| ||d   }||| ||d   }|||||}||| k s||| k r||k rt|| ||df< t|| ||df< || ||df< |d7 }qWq?q6|||< q| 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d r1   P/home/ubuntu/.local/lib/python3.10/site-packages/pynndescent/sparse_nndescent.pygenerate_leaf_updates   s@   



r3   )r0   r)   r+   )localsr   r      c                 C   s  |j d }|d }|| }	|j d }
t||
 |
d  d|  d }tj||dftjd}tj|tjd}|d j d }|| d }t|	d D ]}|| }t||d | }||| }|d d d df }t||||| ||||	 t	
|D ]x}|| }t|| |}t|D ]f}t|| D ]]}t|||df }t|||df }|||df }||kr||k rt|d | |d | |d | ||td ||kr||k rt|d | |d | |d | ||td qqqxqHd S )Nr   @   r   r      dtype)r   intr   zerosr   int32r   r   r3   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+   r0   r1   r1   r2   init_rp_treeO   sr   







rK   )r0   r(   idx)fastmathr4   r   c                 C   s  |j d d }t|D ]v}|d |df dk rt| t|d | dk D ]Z}	tt|| }
|||
 ||
d   }|||
 ||
d   }||| ||d   }||| ||d   }|||||}t|d | |d | |d | ||
td q&qd S )Nr   r   g        r   )r   r   r   sumabsr   r   r=   )n_neighborsr   r   r   heapr   	rng_state	n_samplesr(   r*   rL   r,   r-   r.   r/   r0   r1   r1   r2   init_random   s   "*rT   )r   c                 C   s   d}|j d }t|d D ];}|| }t||d | }||| }||| }|d dddf }t|
||||| ||||	
 |t||
||	7 }q|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_neighborsrA   r@   r   update_arrayr   crD   r(   rF   rG   new_candidate_blockold_candidate_blockr   r1   r1   r2   sparse_process_candidates   s0   
r[   2   
   gMbP?c                 C   s   |j d d }d}|| }t }t|d ||d  d  | | d }tj||dftjd}tj|tjd}t	|D ]:}|
rIt
d|d d	| t| |||\}}t||||| |||||||}||	| | krv|
rst
d
|d d  d S q<d S )Nr   r   i @  r   i   r7   r8   	z / z(	Stopping threshold met -- exiting after
iterations)r   r   get_num_threadsr:   r   emptyr   r;   r<   r   printr   r[   )r>   r   r   r   rP   rR   max_candidatesr   n_itersdeltaverboserD   r@   rA   r   max_updates_per_threadrW   r   nrU   rV   rX   r1   r1   r2   nn_descent_internal   sT   ri   c                 C   s   |j d d }|	d j d dkr+t||}|
r t| ||||| t|| ||||| n|	d j d |kr@|	d j d |kr@|	}ntdt|| |||||||||d t|d |d S )Nr   r   z Invalid initial graph specified!)rc   r   rd   re   rf   )r   r   rK   rT   
ValueErrorri   r   )r   r   r   rP   rR   rc   r   rd   re   
init_graphrp_tree_initr?   
low_memoryrf   rS   r>   r1   r1   r2   
nn_descent  s.   
$rn   )r5   )
__future__r   numpyr   r   pynndescent.utilsr   r   r   r   r   r   r	   r
   pynndescent.sparser   njitr3   r   r<   rK   rT   r[   ri   rn   r1   r1   r1   r2   <module>   sN   (
7@


.;