U
    ׽|e'                  
   @   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 ]}| ||f }	|	dk rX q(t |d | jd D ]}
| ||
f }|dk r q<|||	 ||	d   }|||	 ||	d   }||| ||d   }||| ||d   }|||||}|||	 k s||| k rl|| |	||f qlq<q(|S )Nc                 S   s   g | ]}d d t jfgqS npinf.0i r   Y/var/www/website-v5/atlas_env/lib/python3.8/site-packages/pynndescent/sparse_nndescent.py
<listcomp>   s     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$    r/   )r.   r'   r)   )localsr   c                 C   s$  |j d }d}|| }t|d D ]}	|	| }
t||	d | }||
| }|d d d df }t||| |||}tt|D ]}tt|| D ]}|| | \}}}|dks|dkrqt|d | |d | |d | ||td t|d | |d | |d | ||td qq~q"d S )Nr   i   r   r      )r   r   minr/   lenr   r   uint8)r!   r"   r#   r$   current_graph
leaf_arrayn_leaves
block_sizen_blocksr   block_start	block_endr   r    r%   r(   kr'   r)   r.   r   r   r   init_rp_tree8   sJ    
     





r=   )r.   r   idx)fastmathr0   r   c                 C   s  |j d d }t|D ]}|d |df dk rt| t|d | dk D ]}	tt|| }
|||
 ||
d   }|||
 ||
d   }||| ||d   }||| ||d   }|||||}t|d | |d | |d | ||
td qLqd S )Nr   r   g        r1   )r   r   r   sumabsr   r   r4   )n_neighborsr!   r"   r#   heapr$   	rng_state	n_samplesr   r(   r>   r*   r+   r,   r-   r.   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 rqh||| ||d   }||| ||d   }||| ||d   }||| ||d   }|||||}||| ks||| krh||
 |||f qht|	D ]}t||
|f }|dk rNq,||| ||d   }||| ||d   }||| ||d   }||| ||d   }|||||}||| ks||| kr,||
 |||f q,q>q0|S )Nr   c                 S   s   g | ]}d d t jfgqS r   r   r   r   r   r   r      s     z*generate_graph_updates.<locals>.<listcomp>r   )r   r   r   r   intr   )new_candidate_blockold_candidate_blockr    r!   r"   r#   r$   r8   r%   max_candidatesr   r(   r'   r<   r)   r*   r+   r,   r-   r.   r   r   r   generate_graph_updates}   s>    


rK   2   
   gMbP?c              
   C   s  |j d d }d}|| }t }t|D ]}|
rDtd|d d| t| |||\}}d}t|d D ]n}|| }t||d | }||| }||| }| d d d df }t|||||||}|t| ||7 }qf||	| | kr*|
rtd|d d  d S q*d S )Nr   r    @  	 / (	Stopping threshold met -- exiting after
iterations)	r   r   get_num_threadsr   printr   r2   rK   r	   )r5   r!   r"   r#   rB   rD   rJ   r$   n_itersdeltaverbose
n_verticesr8   r9   	n_threadsr&   new_candidate_neighborsold_candidate_neighborscr   r:   r;   rH   rI   r    r%   r   r   r   'nn_descent_internal_low_memory_parallel   sD       
r]   c              
      s(  |j d d }d}|| }t } fddt d j d D }t|D ]}|
rdtd|d d| t |||\}}d}t|d D ]n}|| }t||d | }||| }||| } d d d df }t|||||||}|t ||7 }q||	| | krJ|
rtd|d d	  d S qJd S )
Nr   r   rN   c                    s$   g | ]}t  d  | tjqS )r   )setastyper   int64r   r5   r   r   r      s   z<nn_descent_internal_high_memory_parallel.<locals>.<listcomp>rO   rP   rQ   rR   )	r   r   rS   r   rT   r   r2   rK   r   )r5   r!   r"   r#   rB   rD   rJ   r$   rU   rV   rW   rX   r8   r9   rY   in_graphr&   rZ   r[   r\   r   r:   r;   rH   rI   r    r%   r   ra   r   (nn_descent_internal_high_memory_parallel   sJ    
   
rc   c                 C   s   |j d d }|	d j d dkrVt||}|
r@t| ||||| t|| ||||| n2|	d j d |kr|	d j d |kr|	}ntd|rt|| |||||||||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]   rc   r   )r!   r"   r#   rB   rD   rJ   r$   rU   rV   
init_graphrp_tree_initr6   
low_memoryrW   rE   r5   r   r   r   
nn_descent  sJ    
$rh   )
__future__r   localenumpyr   r   pynndescent.utilsr   r   r   r   r   r   r	   pynndescent.sparser
   	setlocale
LC_NUMERICEMPTY_GRAPHnjitr/   float32int32r=   rF   rK   r]   rc   rh   r   r   r   r   <module>   sX   $



*

.5: