U
    Ö½|eÌJ  ã                   @   s  d dl Zd dlZd dlmZ d dlmZ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_random_stateÚ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 ]"}| | |krHd||< q.d||< q.|S )Nr   ©ÚdtypeTF)ÚsetÚnpÚemptyÚshapeÚuint8ÚnumbaÚprange)ÚarrZtest_setÚresultÚi© r   úN/var/www/website-v5/atlas_env/lib/python3.8/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>   s      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   ÚlinalgÚ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r¶t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< nLt |¡}tt 	ˆ¡d ƒD ]"}t ‡ ‡‡fdd„|D ƒ¡}�qd||ˆ |f< �q
qh|S )Nc                 S   s   g | ]}t | ¡ ƒ‘qS r   )ÚmaxÚkeys©r   r!   r   r   r   Ú
<listcomp>.   s     z$expand_relations.<locals>.<listcomp>c                 S   s   g | ]}t | ¡ ƒ‘qS r   )r-   Úvaluesr/   r   r   r   r0   /   s     r   é   éÿÿÿÿr   c                 S   s   g | ]}t |ƒ‘qS r   )r"   r/   r   r   r   r0   8   s     r   c                    s    g | ]}ˆˆ ˆ    |d ¡‘qS )r3   ©Úget©r   Ún)r   ÚjÚrelation_dictsr   r   r0   B   s     c                    s$   g | ]}ˆˆ ˆ d     |d¡‘qS )r   r3   r4   r6   )r   r8   Úreverse_relation_dictsr   r   r0   N   s     )
r-   r   ÚfullÚlenÚint32Úranger   ÚarangeÚarrayÚabs)r9   Úwindow_sizeÚmax_n_samplesr   Zresult_indexÚmappingÚkr   )r   r8   r9   r:   r   Úexpand_relations+   sH    ÿÿüÿý
ÿ
ÿrF   c              	   C   sˆ  t j|jt jd�}|jd d d }t|jd ƒD �]N}| | }|| }t|jd ƒD �](}|| | dk sV|| | t| ƒkr‚qV| || |  }	||| |  }
t|jd ƒD ]Î}||||f }|dk rÌq°||| ||d  …  ¡ }|||f | }||dk }|
|	| |	|d  … }|t||||f ƒ }t||ƒjd }t	||ƒjd }|dk�rp|| ||||f< q°d||||f< q°qVq2|S )Nr   r   r2   r   ç      ð?)
r   Úzerosr   Úfloat32r>   r<   Úcopyr   Úintersect1dÚunion1d)Zgraphs_indptrZgraphs_indicesÚ	relationsr   Zcenter_indexr   Zbase_graph_indptrZbase_graph_indicesr8   Zcomparison_graph_indptrZcomparison_graph_indicesrE   Zcomparison_indexZraw_base_graph_indicesZbase_indicesZcomparison_indicesZintersection_sizeZ
union_sizer   r   r   Úbuild_neighborhood_similaritiesU   sJ    $ 
ÿ
 ÿÿÿ
ÿ
rN   c                 C   sL   | d krd S t | ƒtttjfkr(| | S t | ƒtttd fkr@| S tdƒ‚d S )NzUnrecognized parameter type)	ÚtypeÚlistÚtupler   ÚndarrayÚintÚfloatÚboolÚ
ValueError)Ziterable_or_valr7   r   r   r   Úget_nth_item_or_val‚   s    rW   )Ú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   sr   |D ]h}|| krt || ƒtttjfkr@|| | | f ||< q| | || kr|| f| | | f ||< q|S ©N)rO   rP   rQ   r   rR   )Ú
new_paramsZexisting_paramsZn_modelsÚparam_namesÚparamr   r   r   Úset_aligned_params¥   s    ÿrp   c              	   C   sâ   |j d d }| j d }tj||ftjd�}t|ƒD ]¨}||krR| ||  ||< q4d}	t|| ||d  ƒD ]@}
||
 }||krl|	||
 7 }	||  ||
 | ||   7  < ql|	dkrÌtj dd|¡||< q4||  |	  < q4|S )Nr   r   r   g        g      $Àç      $@)r   r   rH   rI   r>   ÚrandomÚuniform)Úprevious_embeddingZweights_indptrZweights_indicesZweights_dataZrelation_dictÚ	n_samplesÚ
n_featuresr   r   ÚnormalisationÚidxr8   r   r   r   Úinit_from_existing_internal³   s$    
ÿry   c                 C   sT   t jj t jjt jj¡}| ¡ D ]\}}t |¡|t |¡< q t| |j	|j
|j|ƒS rl   )r   ÚtypedÚDictr   Útypesr=   r    r   ry   ÚindptrÚindicesÚdata)rt   ÚgraphrM   Ztyped_relationsr   Úvalr   r   r   Úinit_from_existingÏ   s    ûr‚   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é   r2   Ú	euclideanNrG   Úspectralç{®Gáz„?r,   çš™™™™™¹?Fé   ç      @r3   Úcategoricalç      à?é*   c                 C   s²   || _ || _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _d S rl   )rX   rZ   r[   r\   r^   rY   rc   r]   Úalignment_regularisationÚalignment_window_sizer`   r_   Ú
low_memoryra   rb   rd   Úrandom_staterf   re   rg   rh   ri   rj   Útransform_seedÚforce_approximation_algorithmÚverboserk   ÚaÚb)ÚselfrX   rY   rZ   r[   r\   r]   r^   rŽ   r�   r_   r`   r�   ra   rb   rc   rd   re   r•   r–   r‘   rf   rg   rh   ri   rj   r’   r“   r”   rk   r   r   r   Ú__init__Ý   s:    !zAlignedUMAP.__init__c                    sÔ  d|krt dƒ‚|d ˆ_tˆjƒttfks0t‚tˆ ƒtttjfksHt‚tˆ ƒd tˆjƒksbt‚ˆd k	ržtˆƒtttjfks‚t‚tˆƒd tˆjƒks¬t‚nd gtˆ ƒ ‰tˆj	ƒtttjfkrÊt dƒ‚tˆ ƒˆ_
‡ ‡‡fdd„tˆj
ƒD ƒˆ_ˆjd k�rd}nˆj}| 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 |ƒ¡ �q¶t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/t0d¡ )tj1¡}t2|||	|
|||||ˆj3dd�ˆ_4t5ˆj4ƒD ]@\}}t 6ˆj| jj7dd�¡ 8¡ d	k}t 9ˆj	tj:¡||< �qŽˆS )NrM   ú<Aligned UMAP requires relations between data to be specifiedr   z6n_components must be a single integer, and cannot varyc                    sÈ   g | ]À}t tˆj|ƒtˆj|ƒtˆj|ƒtˆj|ƒtˆ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 ))rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   rZ   r[   r�   r‘   rf   re   rg   rh   ri   rj   r’   r“   r”   r•   r–   )r   rW   rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   rZ   r[   r�   r‘   rf   re   rg   rh   ri   rj   r’   r“   r”   r•   r–   Úfitr6   ©ÚXr—   Úyr   r   r0   6  s@   ä









æ åz#AlignedUMAP.fit.<locals>.<listcomp>éÈ   rB   r   rq   ÚC)Úorderr3   r,   T)Úlambda_Ú
move_other)Úaxis);rV   Údict_relations_rO   rP   rQ   ÚAssertionErrorr   rR   r<   rY   Ú	n_models_r>   Úmappers_r\   r5   r�   rF   r   rz   ÚListÚ
empty_listr|   r=   Úfloat64ÚappendÚgraph_r}   r~   ÚtocooÚrowÚcolr   r   rr   ÚRandomStater’   rN   r	   Ú	_raw_datarA   r-   ÚastyperI   Úwherer+   ÚvstackÚrandintÚ	INT32_MINÚ	INT32_MAXÚint64r
   rŽ   Úembeddings_Ú	enumerater@   ÚsumÚflattenr;   Únan)r—   rœ   r�   Ú
fit_paramsr\   rB   rM   Úindptr_listÚindices_listÚheadsÚtailsÚepochs_per_samplesÚmapperÚrng_state_transformÚregularisation_weightsZ
first_initÚ	expansionZfirst_embeddingZ
embeddingsr   Z	next_initZnext_embeddingZanchor_dataZleft_anchorsZright_anchorsÚseed_tripletÚ	embeddingÚdisconnected_verticesr   r›   r   rš     sÄ    ÿ

ã 
ÿý

üþ$


üþýÿÿõ ÿzAlignedUMAP.fitc                 K   s   | j ||f|Ž | jS rl   )rš   r¹   )r—   rœ   r�   r¾   r   r   r   Úfit_transform±  s    zAlignedUMAP.fit_transformc                 K   sÆ  d|krt dƒ‚|d }t|ƒ}t|| j| jƒ| _|  jd7  _tt| j| jƒt| j| jƒt| j	| jƒt| j
| jƒt| j| jƒt| j| jƒt| j| jƒt| j| jƒt| j| jƒt| j| jƒ| j| j| jd� ||¡}|  j|g7  _|  jt|ƒg7  _| j	d k�r
d}n| 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… ¡}t| jƒD ]œ\}}|  |j!j"¡ |  |j!j#¡ |	  |j! $¡ j%¡ |
  |j! $¡ j&¡ |t'| jƒd k�r|  t(|j! $¡ j)|ƒ¡ n$|  t*j+|j,j-d |d t*jd�¡ �q¦t.| jƒ}t/|||ƒ}t0| j1d |j!|ƒ}| j1  |¡ t*j2 3| j¡}| 4t5t6d	¡ 7t*j8¡}t9| j1| j1|	|
|||||| j:d
�
| _1d S )NrM   r™   r   )rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   r‘   r’   rž   r   r   r3   r,   )r¡   );rV   r   rp   Ú__dict__r¦   r   rW   rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   r‘   r’   rš   r§   r¤   r"   r   rz   r¨   r©   r|   r=   rª   rº   r«   r¬   r}   r~   r­   r®   r¯   r<   r   r   r   r;   Ú
embedding_r   rF   rN   r‚   r¹   rr   r°   rµ   r¶   r·   r²   r¸   r
   rŽ   )r—   rœ   r�   r¾   Znew_dict_relationsZ
new_mapperr\   r¿   rÀ   rÁ   rÂ   rÃ   r   rÄ   Znew_relationsZnew_regularisation_weightsZnew_embeddingrÅ   rÈ   r   r   r   Úupdateµ  sª    ÿ ÿ ÿ ÿí ìÿÿ
ý  ÿÿözAlignedUMAP.update)r„   r2   r…   NNrG   r†   r‡   r,   rˆ   rG   FrG   rG   rG   r‰   rŠ   NNNFr3   r‹   NrŒ   r�   FFF)N)N)N)Ú__name__Ú
__module__Ú__qualname__r˜   rš   rË   rÎ   r   r   r   r   rƒ   Ü   sD                                â
B
 
rƒ   )r,   )&Únumpyr   r   Úsklearn.baser   Úsklearn.utilsr   r   Úumap.sparser   rK   r   rL   Z
umap.umap_r   r   Úumap.spectralr	   Úumap.layoutsr
   Úiinfor=   Úminr¶   r-   r·   Únjitr   r"   r+   rF   rN   rW   ZPARAM_NAMESrp   ry   r‚   rƒ   r   r   r   r   Ú<module>   s2   


	
*
,
