o
    -ѹg'                  
   @   sB  d dl mZ d dl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 d dlmZ eejd eddZejdd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dd Zejddd	dd Ze dedddf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apply_graph_updates_high_memoryapply_graph_updates_low_memory)sparse_euclideanC   TF)parallelcachec                 C   s*  dd t | jd D }t| jd D ]~}t | jd D ]t}| ||f }	|	dk r+ qt |d | jd D ][}
| ||
f }|dk rC q|||	 ||	d   }|||	 ||	d   }||| ||d   }||| ||d   }|||||}|||	 k s||| k r|| |	||f q5qq|S )Nc                 S      g | ]	}d d t jfgqS npinf.0i r   `/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/pynndescent/sparse_nndescent.py
<listcomp>       z)generate_leaf_updates.<locals>.<listcomp>r   r   )rangeshapenumbaprangeappend)
leaf_blockdist_thresholdsindsindptrdatadistupdatesnr   pjq	from_inds	from_datato_indsto_datadr   r   r   generate_leaf_updates   s*   r1   )r0   r)   r+   )localsr   c                 C   s$  |j d }d}|| }t|d D ]~}	|	| }
t||	d | }||
| }|d d d df }t||| |||}tt|D ]O}tt|| D ]D}|| | \}}}|dks\|dkr]qIt|d | |d | |d | ||td t|d | |d | |d | ||td qIq?qd S )Nr   i   r   r      )r   r   minr1   lenr   r   uint8)r#   r$   r%   r&   current_graph
leaf_arrayZn_leaves
block_sizen_blocksr   block_start	block_endr!   r"   r'   r*   kr)   r+   r0   r   r   r   init_rp_tree8   sF   






r>   )r0   r   idx)Zfastmathr2   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        r3   )r   r   r   sumabsr   r   r6   )n_neighborsr#   r$   r%   heapr&   	rng_state	n_samplesr   r*   r?   r,   r-   r.   r/   r0   r   r   r   init_randomc   s   "*rF   c                 C   s  | j d }dd t|D }| j d }	t|D ]}
t|	D ]}t| |
|f }|dk r-qt||	D ]\}t| |
|f }|dk rAq2||| ||d   }||| ||d   }||| ||d   }||| ||d   }|||||}||| ks||| kr||
 |||f q2t|	D ]\}t||
|f }|dk rq||| ||d   }||| ||d   }||| ||d   }||| ||d   }|||||}||| ks||| kr||
 |||f qqq|S )Nr   c                 S   r   r   r   r   r   r   r   r      r   z*generate_graph_updates.<locals>.<listcomp>r   )r   r   r   r   intr    )new_candidate_blockold_candidate_blockr"   r#   r$   r%   r&   r9   r'   max_candidatesr   r*   r)   r=   r+   r,   r-   r.   r/   r0   r   r   r   generate_graph_updates}   sF   

"rK   2   
   gMbP?c              
   C   s  |j d d }d}|| }t }t|D ]k}|
r"td|d d| t| |||\}}d}t|d D ]7}|| }t||d | }||| }||| }| d d d df }t|||||||}|t| ||7 }q3||	| | kr|
r}td|d d  d S qd S )Nr   r    @  	 / (	Stopping threshold met -- exiting after
iterations)	r   r   get_num_threadsr   printr   r4   rK   r	   )r7   r#   r$   r%   rB   rD   rJ   r&   n_itersdeltaverbose
n_verticesr9   r:   	n_threadsr(   new_candidate_neighborsold_candidate_neighborscr   r;   r<   rH   rI   r"   r'   r   r   r   'nn_descent_internal_low_memory_parallel   sB   
r]   c              
      s&  |j d d }d}|| }t } fddt d j d D }t|D ]k}|
r2td|d d| t |||\}}d}t|d D ]7}|| }t||d | }||| }||| } d d d df }t|||||||}|t ||7 }qC||	| | kr|
rtd|d d	  d S q%d S )
Nr   r   rN   c                    s$   g | ]}t  d  | tjqS )r   )setZastyper   Zint64r   r7   r   r   r      s    z<nn_descent_internal_high_memory_parallel.<locals>.<listcomp>rO   rP   rQ   rR   )	r   r   rS   r   rT   r   r4   rK   r   )r7   r#   r$   r%   rB   rD   rJ   r&   rU   rV   rW   rX   r9   r:   rY   Zin_graphr(   rZ   r[   r\   r   r;   r<   rH   rI   r"   r'   r   r_   r   (nn_descent_internal_high_memory_parallel   sH   

r`   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|rVt|| |||||||||d nt|| |||||||||d t|d |d S )Nr   r   z Invalid initial graph specified!)rJ   r&   rU   rV   rW   )r   r   r>   rF   
ValueErrorr]   r`   r   )r#   r$   r%   rB   rD   rJ   r&   rU   rV   Z
init_graphZrp_tree_initr8   Z
low_memoryrW   rE   r7   r   r   r   
nn_descent  sJ   
$rb   )
__future__r   localeZnumpyr   r   Zpynndescent.utilsr   r   r   r   r   r   r	   Zpynndescent.sparser
   	setlocale
LC_NUMERICZEMPTY_GRAPHZnjitr1   Zfloat32Zint32r>   rF   rK   r]   r`   rb   r   r   r   r   <module>   sZ   $



*

.5: