a
    DfTP                     @   s  d dl Zd dlZd dlmZ d dlmZ d dlmZ	 d dlm
Z d dlmZmZ d dlmZ d dlmZ eejjd	 Zeejjd	 Zejd
ddd Zdd Ze dd Zd"ddZe dd Zdd ZdZ e fddZ!e dd Z"dd Z#G d d! d!eZ$dS )#    N)BaseEstimator)check_array)arr_intersect)	arr_union)UMAPmake_epochs_per_sample)spectral_layout)!optimize_layout_aligned_euclidean   T)parallelc                 C   sV   t |}tj| jd tjd}t| jd D ]"}| | |v rHd||< q.d||< q.|S )Nr   ZdtypeTF)setnpemptyshapeZbool_numbaZprange)ZarrZtest_setresulti r   ^/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/umap/aligned_umap.pyin1d   s    

r   c                 C   s   dd |   D S )Nc                 S   s   i | ]\}}||qS r   r   ).0keyvaluer   r   r   
<dictcomp>       zinvert_dict.<locals>.<dictcomp>)items)dr   r   r   invert_dict   s    r   c           
      C   sD   | |d  }||d  }|j | }tj|\}}}|| }	||	 S )Nr   r
   )Tr   ZlinalgZsvd)
Zembedding_baseZembedding_to_alignZanchorsZsubset1Zsubset2MUSVRr   r   r   procrustes_align!   s    
r%      c                    s  t dd D dd D  d }tjtd d| d |fdtjd}dd D t|jd	 D ], t|D ]}||d  } | d tkrtj|dtjd| |f< qvt|}t|d D ] t fd
d|D }q|| |f< qvtd	| dD ]}||d  } | d d	k rHtj|dtjd| |f< nJt|}td	|d dD ]"t fdd|D }qb|| |f< q
qh|S )Nc                 S   s   g | ]}t | qS r   )maxkeysr   r   r   r   r   
<listcomp>.   r   z$expand_relations.<locals>.<listcomp>c                 S   s   g | ]}t | qS r   )r'   valuesr)   r   r   r   r*   /   r   r
      r   c                 S   s   g | ]}t |qS r   )r   r)   r   r   r   r*   8   r   r   c                    s    g | ]}    |d qS )r-   getr   n)r   krelation_dictsr   r   r*   B   r   c                    s$   g | ]}  d    |dqS )r
   r-   r.   r0   )r   r2   reverse_relation_dictsr   r   r*   N   r   )	r'   r   fulllenint32ranger   Zarangearray)r3   window_sizeZmax_n_samplesr   jZresult_indexmappingr   )r   r2   r3   r4   r   expand_relations+   sH    

r=   c              	   C   s  t j|jt jd}|jd d d }t|jd D ]\}| | }|| }t|jd D ]6}|| | dk sV|| | t| krqV| || |  }	||| |  }
t|jd D ]}||||f }|dk rq||| ||d    }|||f |||jd k   }||dk }|
|	| |	|d   }|t||||f  }t||jd }t	||jd }|dkr~|| ||||f< qd||||f< qqVq2|S )Nr   r
   r,   r         ?)
r   zerosr   float32r8   r6   copyr   intersect1dunion1d)Zgraphs_indptrZgraphs_indices	relationsr   Zcenter_indexr   Zbase_graph_indptrZbase_graph_indicesr;   Zcomparison_graph_indptrZcomparison_graph_indicesr2   Zcomparison_indexZraw_base_graph_indicesZbase_indicesZcomparison_indicesZintersection_sizeZ
union_sizer   r   r   build_neighborhood_similaritiesU   sJ    $

rE   c                 C   sL   | d u rd S t | tttjfv r(| | S t | tttd fv r@| S tdd S )NzUnrecognized parameter type)	typelisttupler   ndarrayintfloatbool
ValueError)Ziterable_or_valr1   r   r   r   get_nth_item_or_val   s    rN   )n_neighborsn_componentsmetricmetric_kwdsn_epochslearning_rateinitmin_distspreadset_op_mix_ratiolocal_connectivityrepulsion_strengthnegative_sample_ratetransform_queue_sizeangular_rp_foresttarget_n_neighborstarget_metrictarget_metric_kwdstarget_weightuniquec                 C   s   |D ]}|| v rt || tr2|| | |  qt || trX|| | | f ||< qt || tjrt|| | | ||< q| | || kr|| f| | | f ||< q|S N)
isinstancerG   appendrH   r   rI   )
new_paramsZexisting_paramsZn_modelsZparam_namesparamr   r   r   set_aligned_params   s"    


rh   c              	   C   s   |j d d }| j d }tj||ftjd}t|D ]}||v rR| ||  ||< q4d}	t|| ||d  D ]@}
||
 }||v rl|	||
 7 }	||  ||
 | ||   7  < ql|	dkrtjdd|||< q4||  |	  < q4|S )Nr   r
   r   g        g      $      $@)r   r   r?   r@   r8   randomuniform)previous_embeddingZweights_indptrZweights_indicesZweights_dataZrelation_dictZ	n_samplesZ
n_featuresr   r   Znormalisationidxr;   r   r   r   init_from_existing_internal   s$    
rn   c                 C   sT   t jjt jjt jj}| D ]\}}t||t|< q t| |j	|j
|j|S rc   )r   typedDictr   typesr7   r   r   rn   indptrindicesdata)rl   graphrD   Ztyped_relationsr   valr   r   r   init_from_existing   s    rw   c                   @   s4   e Zd ZdddZdddZdddZdddZdS )AlignedUMAP   r,   	euclideanNr>   spectral{Gz?r&   皙?F         @r-   categorical      ?*   c                 C   s   || _ || _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _d S rc   )rO   rQ   rR   rS   rU   rP   rZ   rT   alignment_regularisationalignment_window_sizerW   rV   
low_memoryrX   rY   r[   random_stater]   r\   r^   r_   r`   ra   transform_seedforce_approximation_algorithmverboserb   ab)selfrO   rP   rQ   rR   rS   rT   rU   r   r   rV   rW   r   rX   rY   rZ   r[   r\   r   r   r   r]   r^   r_   r`   ra   r   r   r   rb   r   r   r   __init__   s:    !zAlignedUMAP.__init__c                    s  d|vrt d|d _tjttfv s0J t tttjfv sHJ t d tjksbJ d urttttjfv sJ td tjksJ nd gt  tjtttjfv rt dt _	j
d u rd_
j
} fddtj	D _|dj}tj|}tjjtjjd d d }tjjtjjd d d }tjjtjjd d d }	tjjtjjd d d }
tjjtjjd d d }jD ]^}||jj ||jj |	|j j |
|j j |t|j j| qtj !j"}t#|||}t$jd	 j%jd	 jj|}d
t&|'  }|| j(tj)dd}tjjtjj)d d d d df }|| tdj	D ]}t$j| j%j| jj|}d
t&|'  }|| j(tj)dd}|| |d  }||d	k }t*|d	kd	 }|t+|d |t,||g q|-t.t/d(tj0}t1|||	|
|||||j2dd_3t4j3D ]@\}}t5j| jj6dd7 d	k}t8jtj9||< qS )NrD   <Aligned UMAP requires relations between data to be specifiedr
   6n_components must be a single integer, and cannot vary   c                    s   g | ]}t tj|tj|tj|tj|tj|jtj|tj	|tj
|tj|tj|jjjjjjjjjjjjjjjjd  | | qS )rO   rV   rS   rZ   rT   rU   rW   r[   rY   rX   rb   rP   rQ   rR   r   r   r]   r\   r^   r_   r`   ra   r   r   r   r   r   )r   rN   rO   rV   rS   rZ   rT   rU   rW   r[   rY   rX   rb   rP   rQ   rR   r   r   r]   r\   r^   r_   r`   ra   r   r   r   r   r   fitr0   Xr   yr   r   r*   B  s@   









z#AlignedUMAP.fit.<locals>.<listcomp>r:   r   ri   C)orderr-   r&   T)lambda_Z
move_other)Zaxis):rM   dict_relations_rF   rG   rH   r   rI   r6   rP   	n_models_rS   r8   mappers_r/   r   r=   r   ro   List
empty_listrq   r7   float64re   graph_rr   rs   tocoorowcolr   rt   rj   RandomStater   rE   r   Z	_raw_dataabsr'   astyper@   wherer%   Zvstackrandint	INT32_MIN	INT32_MAXint64r	   r   embeddings_	enumerater9   sumflattenr5   nan)r   r   r   
fit_paramsrS   r:   rD   indptr_listindices_listheadstailsepochs_per_samplesmapperrng_state_transformZregularisation_weightsZ
first_initZ	expansionZfirst_embeddingZ
embeddingsr   Z	next_initZnext_embeddingZanchor_dataZleft_anchorsZright_anchorsseed_tripletZ	embeddingZdisconnected_verticesr   r   r   r   &  s    


!


$


 zAlignedUMAP.fitc                 K   s   | j ||fi | | jS rc   )r   r   )r   r   r   r   r   r   r   fit_transform  s    zAlignedUMAP.fit_transformc                 K   s<  d|vrt d|d }t|ts&J t|}t|| j| j| _t| jt	t
tjfv r^t d| jd u rnd| _| j}tt| j| jt| j| jt| j| jt| j| jt| j| j| jt| j| jt| j| jt| j| jt| j| jt| j| j| j| j| j| j| j| j| j| j | j!| j"| j#| j$| j%| j&| j'| j(d)||}|  jd7  _|  j*|g7  _*|  j+|g7  _+|,d| j-}t.| j+|}t/j0j12t/j3j4d d d }	t/j0j12t/j3j4d d d }
t/j0j12t/j3j4d d d }t/j0j12t/j3j4d d d }t/j0j12t/j3j5d d d }t6| j*D ]\}}|	7|j8j9 |
7|j8j: |7|j8; j< |7|j8; j= |t>| j*d kr|7t?|j8; j@| n$|7tjA|jBjCd |d tj5d	 qtD|	|
|}tE|}tF| jGd
 |j8|}| jG7| tjHI| j$}|JtKtLdMtjN}tO| jG| jG|||||||| jPd
| _Gd S )NrD   r   r   r   r   r
   r:   r   r   r-   r&   )r   )QrM   rd   dictr   rh   __dict__r   rF   rP   rG   rH   r   rI   rS   r   rN   rO   rV   rZ   rT   rU   rW   r[   rY   rX   rb   rQ   rR   r   r   r]   r\   r^   r_   r`   ra   r   r   r   r   r   r   r   r   r/   r   r=   r   ro   r   r   rq   r7   r   r   re   r   rr   rs   r   r   r   r6   r   rt   r5   Z
embedding_r   rE   r   rw   r   rj   r   r   r   r   r   r   r	   r   )r   r   r   r   Znew_dict_relationsrS   Z
new_mapperr:   Znew_relationsr   r   r   r   r   r   r   Znew_regularisation_weightsZinv_dict_relationsZnew_embeddingr   r   r   r   r   update  s    
"$zAlignedUMAP.update)ry   r,   rz   NNr>   r{   r|   r&   r}   r>   Fr>   r>   r>   r~   r   NNNFr-   r   Nr   r   FFF)N)N)N)__name__
__module____qualname__r   r   r   r   r   r   r   r   rx      sD                                
B
 
rx   )r&   )%numpyr   r   Zsklearn.baser   Zsklearn.utilsr   Zumap.sparser   rB   r   rC   Z
umap.umap_r   r   Zumap.spectralr   Zumap.layoutsr	   Ziinfor7   minr   r'   r   Znjitr   r   r%   r=   rE   rN   ZPARAM_NAMESrh   rn   rw   rx   r   r   r   r   <module>   s2   


	
*
-
