
    WiIP                     
   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j&                  ej(                        j*                  d	z   Z ej&                  ej(                        j.                  d	z
  Z ej2                  d
      d        Zd Z ej2                         d        ZddZ ej2                         d        Zd ZdZ e fdZ! ej2                         d        Z"d Z# G d de      Z$y)    N)BaseEstimator)check_array)arr_intersect)	arr_union)UMAPmake_epochs_per_sample)spectral_layout)!optimize_layout_aligned_euclidean   T)parallelc                     t        |      }t        j                  | j                  d   t        j                        }t        j                  | j                  d         D ]  }| |   |v rd||<   d||<    |S )Nr   dtypeTF)setnpemptyshapebool_numbaprange)arrtest_setresultis       ]/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/umap/aligned_umap.pyin1dr      sl    8}HXXciil"((3F\\#))A,' q6XF1IF1I	 M    c                 V    | j                         D ci c]  \  }}||
 c}}S c c}}w N)items)dkeyvalues      r   invert_dictr$      s$    )*3:3E3J333s   %c                     | |d      }||d      }|j                   |z  }t        j                  j                  |      \  }}}||z  }	||	z  S )Nr   r   )Tr   linalgsvd)
embedding_baseembedding_to_alignanchorssubset1subset2MUSVRs
             r   procrustes_alignr3   !   sX    WQZ(G ,G		GAiimmAGAq!	AA!!r   c                    t        | D cg c]  }t        |j                                c}| D cg c]  }t        |j                                c}z         dz   }t        j                  t        |       dz   d|z  dz   |fdt        j                        }| D cg c]  }t        |       }}t        |j                  d         D ]  }t        |      D ]  }||dz   z   }||z   dz   t        |       k\  r,t        j                  |dt        j                        |||f<   Kt        j                  |      }	t        |dz         D ];  }
t        j                  |	D cg c]  }| ||
z      j                  |d       c}      }	= |	|||f<    t        d| d      D ]  }||dz
  z   }||z   dz
  dk  r,t        j                  |dt        j                        |||f<   Bt        j                  |      }	t        d|dz
  d      D ]>  }
t        j                  |	D cg c]  }|||
z   dz
     j                  |d       c}      }	@ |	|||f<     |S c c}w c c}w c c}w c c}w c c}w )Nr      r   r   )maxkeysvaluesr   fulllenint32r$   ranger   arangearrayget)relation_dictswindow_sizer!   max_n_samplesr   reverse_relation_dictsr   jresult_indexmappingkns               r   expand_relationsrJ   +   sd   $23qS]3(671s188:78	
 		  WW	^	q	 !k/A"5}E
hhF
 7EEk!nEE6<<?# 2{# 
	2A'AE2L1uqyC//*,''-288*Tq,'))M2q1u A hhCJKaA.221b9KG +2q,'
	2 q;,+ 
	2A'AE2L1uqy1}*,''-288*Tq,'))M2q!a%, A hhOVW!/A	:>>q"EWG +2q,'
	222 MI 47 F L Xs    I I
II"I#c           
      <   t        j                  |j                  t         j                        }|j                  d   dz
  dz  }t	        |j                  d         D ];  }| |   }||   }t	        |j                  d         D ]  }||z   |z
  dk  s||z   |z
  t        |       k\  r$| ||z   |z
     }	|||z   |z
     }
t	        |j                  d         D ]  }||||f   }|dk  r|||   ||dz       j                         }|||f   |||j                  d   k        }||dk\     }|
|	|   |	|dz       }|t        ||||f            }t        ||      j                  d   }t        ||      j                  d   }|dkD  r||z  ||||f<   d||||f<     > |S )Nr   r   r5   r         ?)
r   zerosr   float32r=   r;   copyr   intersect1dunion1d)graphs_indptrgraphs_indices	relationsr   center_indexr   base_graph_indptrbase_graph_indicesrE   comparison_graph_indptrcomparison_graph_indicesrH   comparison_indexraw_base_graph_indicesbase_indicescomparison_indicesintersection_size
union_sizes                     r   build_neighborhood_similaritiesr`   U   s    XXiooRZZ8FOOA&*q0L9??1%& &*)!,+A.yq)* #	*A1u|#a'1q5<+?3}CU+U&3AEL4H&I#'5a!el6J'K$9??1-. *#,Q1W#5 #a');%a(+<QU+C*$& '  )A*+AIOOTUDV+VW   ,LA,=>%=+,<=@W(1,A&"
 &8+Yq!t_=&" %0>P$Q$W$W%! %\3EFLLQO
>&7*&DF1a7O&)F1a7O;*#	*&*P Mr   c                     | y t        |       t        t        t        j                  fv r| |   S t        |       t
        t        t        d fv r| S t        d      )NzUnrecognized parameter type)	typelisttupler   ndarrayintfloatbool
ValueError)iterable_or_valrI   s     r   get_nth_item_or_valrk      sV    Oubjj 99q!!	o	3tT":	:677r   )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                 r   |D ]  }|| v st        ||   t              r||   j                  | |          3t        ||   t              r||   | |   fz   ||<   Vt        ||   t        j
                        r t	        j                  ||   | |         ||<   | |   ||   k7  s||   f|z  | |   fz   ||<    |S r   )
isinstancerc   appendrd   r   re   )
new_paramsexisting_paramsn_modelsparam_namesparams        r   set_aligned_paramsr      s     J/%0$7&--j.?@OE2E:)8)?:eCTBV)V&OE2BJJ?)+#E*Ju,=*& e$(>>.=e.D-F-Q"5)U .OE*  r   c           	         |j                   d   dz
  }| j                   d   }t        j                  ||ft        j                        }t	        |      D ]  }||v r| ||      ||<   d}	t	        ||   ||dz            D ]-  }
||
   }||v s|	||
   z  }	||xx   ||
   | ||      z  z  cc<   / |	dk(  r%t        j
                  j                  dd|      ||<   ||xx   |	z  cc<    |S )Nr   r   r   g        g      $      $@)r   r   rM   rN   r=   randomuniform)previous_embeddingweights_indptrweights_indicesweights_datarelation_dict	n_samples
n_featuresr   r   normalisationidxrE   s               r   init_from_existing_internalr      s    $$Q'!+I#))!,JXXy*-RZZ@F9 +*=+;<F1IM^A.q1u0EF #C(%!\#%66M1I$S),>}Q?O,PPI	 !II--eT:Fq	q	]*	+" Mr   c                    t         j                  j                  j                  t         j                  j
                  t         j                  j
                        }|j                         D ]0  \  }}t        j
                  |      |t        j
                  |      <   2 t        | |j                  |j                  |j                  |      S r   )r   typedDictr   typesr<   r    r   r   indptrindicesdata)r   graphrT   typed_relationsr"   vals         r   init_from_existingr      s    kk&&,,U[[->->@Q@QROOO% 7S)+#&7&

 r   c                   f    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZy)AlignedUMAPNc                    || _         || _        || _        || _        || _        || _        || _        || _        || _        |	| _	        || _
        |
| _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        y r   )rl   rn   ro   rp   rr   rm   rw   rq   alignment_regularisationalignment_window_sizert   rs   
low_memoryru   rv   rx   random_staterz   ry   r{   r|   r}   r~   transform_seedforce_approximation_algorithmverboser   ab)selfrl   rm   rn   ro   rp   rq   rr   r   r   rs   rt   r   ru   rv   rw   rx   ry   r   r   r   rz   r{   r|   r}   r~   r   r   r   r   s                                 r   __init__zAlignedUMAP.__init__   s    B '& 	("4*(@%%:" $ 0"4$8!(!2$8!"4*"4*,-J*r   c                 >   d|vrt        d      |d   | _        t        | j                        t        t        fv sJ t        |      t        t        t
        j                  fv sJ t        |      dz
  t        | j                        k(  sJ |Nt        |      t        t        t
        j                  fv sJ t        |      dz
  t        | j                        k(  sJ d gt        |      z  }t        | j                        t        t        t
        j                  fv rt        d      t        |      | _	        | j                  d| _
        | j                  }t        | j                        D cg c]  }t        d+i dt        | j                  |      dt        | j                  |      dt        | j                  |      d	t        | j                   |      d
t        | j"                  |      d| j$                  dt        | j&                  |      dt        | j(                  |      dt        | j*                  |      dt        | j,                  |      dt        | j.                  |      d| j                  d| j0                  d| j2                  d| j4                  d| j6                  d| j8                  d| j:                  d| j<                  d| j>                  d| j@                  d| jB                  d| jD                  d| jF                  d| jH                  d| jJ                  d | jL                  jO                  ||   ||          c}| _(        |jS                  d!| jT                        }tW        | j                  |      }tX        jZ                  j\                  j_                  tX        j`                  jb                  d d d         }tX        jZ                  j\                  j_                  tX        j`                  jb                  d d d         }	tX        jZ                  j\                  j_                  tX        j`                  jb                  d d d         }
tX        jZ                  j\                  j_                  tX        j`                  jb                  d d d         }tX        jZ                  j\                  j_                  tX        j`                  jd                  d d d         }| jP                  D ]  }|jg                  |jh                  jj                         |	jg                  |jh                  jl                         |
jg                  |jh                  jo                         jp                         |jg                  |jh                  jo                         jr                         |jg                  tu        |jh                  jo                         jv                  |              t
        jx                  j{                  | jD                        }t}        ||	|      }t        | jP                  d"   j                  | jP                  d"   jh                  | j                  |      }d#t        j                  |      j                         z  }||z  j                  t
        j                  d$%      }tX        jZ                  j\                  j_                  tX        j`                  j                  d d d d df         }|jg                  |       t        d| j                        D ]  }t        | jP                  |   j                  | jP                  |   jh                  | j                  |      }d#t        j                  |      j                         z  }||z  j                  t
        j                  d$%      }||   |dz
     }||d"k\     }t        j                  |d"k\        d"   }|jg                  t        |d&   |t        j                  ||g                    |j                  t        t        d'      j                  t
        j                        }t        |||
||||||| j                  d()      | _N        t        | j                        D ]  \  }}t        j                  | jP                  |   jh                  j                  d*            j                         d"k(  }t        j                  | j                  t
        j                        ||<    | S c c}w ),NrT   <Aligned UMAP requires relations between data to be specifiedr   6n_components must be a single integer, and cannot vary   rl   rs   rp   rw   rq   rr   rt   rx   rv   ru   r   rm   rn   ro   r   r   rz   ry   r{   r|   r}   r~   r   r   r   r   r   rB   r   r   C)orderr6      T)lambda_
move_other)axis )Uri   dict_relations_rb   rc   rd   r   re   r;   rm   	n_models_rp   r=   r   rk   rl   rs   rw   rq   rr   rt   rx   rv   ru   r   rn   ro   r   r   rz   ry   r{   r|   r}   r~   r   r   r   r   r   fitmappers_r@   r   rJ   r   r   List
empty_listr   r<   float64r   graph_r   r   tocoorowcolr   r   r   RandomStater`   r	   	_raw_dataabsr7   astyperN   wherer3   vstackrandint	INT32_MIN	INT32_MAXint64r
   r   embeddings_	enumerater?   sumflattenr:   nan)r   Xy
fit_paramsrp   rI   rB   rT   indptr_listindices_listheadstailsepochs_per_samplesmapperrng_state_transformregularisation_weights
first_init	expansionfirst_embedding
embeddingsr   	next_initnext_embeddinganchor_dataleft_anchorsright_anchorsseed_triplet	embeddingdisconnected_verticess                                r   r   zAlignedUMAP.fit'  s   j(Q   *+6D(()dE]:::Aw4

3333A
D$8$8 9:::=7tUBJJ7777FQJC(<(<$=>>>QA !!"tUBJJ&??UVVQ== DM==@ 4>>*=
< ;  /0@0@!D,T]]A> -T]]A> $7t7N7NPQ#R	
 2$2D2DaH YY +4;;: &99R9RTU%V $7t7N7NPQ#R "5T5J5JA!N +4;;: ".. {{ !,,  ??  "..!" #'"8"8#$ &*%>%>%& $(#:#:'( #00)* $(#:#:+, #00-.  $22/0 /3.P.P12 34 &&56 &&78 c!A$!o9
B !nn]D4N4NO$T%9%9;G	kk&&11%++2C2CCaC2HI{{''225;;3D3DSqS3IJ  ++EKK,=,=cc,BC  ++EKK,=,=cc,BC"[[--889L9LSqS9QRmm 	Fv}}334 5 56LL,,.223LL,,.223%%&v}}':':'<'A'A8L	 !ii33D4G4GH!@"

 %MM!&&MM!##	

 266*-1133	%	199JJ : 

 [[%%001D1DQ!V1LM
/*q$..) 	A'a **a ''!!#	I rvvi04466I')3;;

 < N $A,{Q7K&{a'78LHH[A%56q9M rN"II|];<	. +229iKRRHH
 ="11
 &d&6&67 	RLAyq)0044!4<=EEG1L " 02wwt7H7H"&&/QI+,		R k
s   +G+dc                 B     | j                   ||fi | | j                  S r   )r   r   )r   r   r   r   s       r   fit_transformzAlignedUMAP.fit_transform  s#    A$$r   c                 b   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| _        | j                  }t        d'i dt        | j                   | j                        dt        | j"                  | j                        dt        | j                  | j                        dt        | j$                  | j                        d	t        | j&                  | j                        d
| j(                  dt        | j*                  | j                        dt        | j,                  | j                        dt        | j.                  | j                        dt        | j0                  | j                        dt        | j2                  | j                        d| j                  d| j4                  d| j6                  d| j8                  d| j:                  d| j<                  d| j>                  d| j@                  d| jB                  d| jD                  d| jF                  d| jH                  d| jJ                  d| jL                  d| jN                  d| jP                  jS                  ||      }| xj                  d z  c_        | xjT                  |gz  c_*        | xjV                  |gz  c_+        |jY                  d!| jZ                        }t]        | jV                  |      }t^        j`                  jb                  je                  t^        jf                  jh                  d d d          }	t^        j`                  jb                  je                  t^        jf                  jh                  d d d          }
t^        j`                  jb                  je                  t^        jf                  jh                  d d d          }t^        j`                  jb                  je                  t^        jf                  jh                  d d d          }t^        j`                  jb                  je                  t^        jf                  jj                  d d d          }tm        | jT                        D ]_  \  }}|	jo                  |jp                  jr                         |
jo                  |jp                  jt                         |jo                  |jp                  jw                         jx                         |jo                  |jp                  jw                         jz                         |t}        | jT                        d z
  k(  r?|jo                  t        |jp                  jw                         j                  |             |jo                  t        j                  |j                  j                  d"   |d z   t        jj                  #             b t        |	|
|      }t        |      }t        | j                  d$   |jp                  |      }| j                  jo                  |       t        j                  j                  | jH                        }|j                  t        t        d%      j                  t        j                        }t        | j                  | j                  |||||||| j                  &
      | _G        y )(NrT   r   r   r   rl   rs   rp   rw   rq   rr   rt   rx   rv   ru   r   rm   rn   ro   r   r   rz   ry   r{   r|   r}   r~   r   r   r   r   r   r   rB   r   r   r6   r   )r   r   )Qri   r   dictr   r   __dict__r   rb   rm   rc   rd   r   re   rp   r   rk   rl   rs   rw   rq   rr   rt   rx   rv   ru   r   rn   ro   r   r   rz   ry   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r@   r   rJ   r   r   r   r   r   r<   r   r   r   r   r   r   r   r   r   r;   r   r   r:   
embedding_r   r`   r$   r   r   r   r   r   r   r   r   r   r
   r   )r   r   r   r   new_dict_relationsrp   
new_mapperrB   new_relationsr   r   r   r   r   r   r   new_regularisation_weightsinv_dict_relationsnew_embeddingr   r   s                        r   updatezAlignedUMAP.update  s   j(Q  (4,d333N*:t}}dnnU !!"tUBJJ&??UVV== DM== "
+D,<,<dnnM"
(G"
 )G"
  3'' 	"
 .d.@.@$..Q"
 "
 't{{DNNC"
 "5))4>>""
  3'' "
  11F1FW!"
" 't{{DNNC#"
$ **%"
& ;;'"
( (()"
* +"
, **-"
. #44/"
0 "&!:!:1"
2  $663"
4 ,,5"
6  $667"
8 ,,9"
:  ..;"
< +/*L*L="
> LL?"
@ ffA"
B ffC"
D #a)E 	H 	!*%!3 44 nn]D4N4NO()=)={Kkk&&11%++2C2CCaC2HI{{''225;;3D3DSqS3IJ  ++EKK,=,=cc,BC  ++EKK,=,=cc,BC"[[--889L9LSqS9QR"4==1 	IAvv}}334 5 56LL,,.223LL,,.223C&**"))*6==+>+>+@+E+ExP #))GGF--33A61BJJW	 &E&
" ));<*R *"3"35G
 	. ii33D4G4GH*229iKRRHH
 =&11
r   )   r5   	euclideanNNrL   spectralg{Gz?r   g?rL   FrL   rL   rL      g      @NNNFr6   categoricalNg      ?*   FFFr   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r      st     !' 

#&+=@DQf t
r   r   )r   )%numpyr   r   sklearn.baser   sklearn.utilsr   umap.sparser   rP   r   rQ   
umap.umap_r   r   umap.spectralr	   umap.layoutsr
   iinfor<   minr   r7   r   njitr   r$   r3   rJ   r`   rk   PARAM_NAMESr   r   r   r   r   r   r   <module>r     s     & % 4 , 3 ) :BHHRXX""Q&	BHHRXX""Q&	 T	 	4 " "'T + +\80 KV (  6
N
- N
r   