a
    Df'                  
   @   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   i/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/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$    r0   )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   minr0   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*   r/   r   r   r   init_rp_tree8   s@    






r=   )r/   r   idx)Zfastmathr1   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        r2   )r   r   r   sumabsr   r   r5   )n_neighborsr"   r#   r$   heapr%   	rng_state	n_samplesr   r)   r>   r+   r,   r-   r.   r/   r   r   r   init_randomc   s    "*rE   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      r   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>    


rJ   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   r3   rJ   r	   )r6   r"   r#   r$   rA   rC   rI   r%   n_itersdeltaverbose
n_verticesr8   r9   	n_threadsr'   new_candidate_neighborsold_candidate_neighborscr   r:   r;   rG   rH   r!   r&   r   r   r   'nn_descent_internal_low_memory_parallel   s>    
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   rM   c                    s$   g | ]}t  d  | tjqS )r   )setZastyper   int64r   r6   r   r   r      s   z<nn_descent_internal_high_memory_parallel.<locals>.<listcomp>rN   rO   rP   rQ   )	r   r   rR   r   rS   r   r3   rJ   r   )r6   r"   r#   r$   rA   rC   rI   r%   rT   rU   rV   rW   r8   r9   rX   Zin_graphr'   rY   rZ   r[   r   r:   r;   rG   rH   r!   r&   r   r_   r   (nn_descent_internal_high_memory_parallel   sD    

r`   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!)rI   r%   rT   rU   rV   )r   r   r=   rE   
ValueErrorr\   r`   r   )r"   r#   r$   rA   rC   rI   r%   rT   rU   Z
init_graphZrp_tree_initr7   Z
low_memoryrV   rD   r6   r   r   r   
nn_descent  sJ    
$rb   )
__future__r   localenumpyr   r   Zpynndescent.utilsr   r   r   r   r   r   r	   Zpynndescent.sparser
   	setlocale
LC_NUMERICZEMPTY_GRAPHZnjitr0   float32int32r=   rE   rJ   r\   r`   rb   r   r   r   r   <module>   sX   $



*

.5: