
    Wi#                     x   d dl Zd dlZd dlmZ d dlmZmZ  ej                  dej                        Z
 ej                  dej                        Z ej                  dej                        ZdZdZ ej$                  ej                        j&                  Z ej$                  ej                        j&                  Z ej                  dej                        Zd	Z G d
 de      Z G d de      Z edg d      Z edg d      Z edg d      Z edg d      Z ej<                         defd       Z ej<                  ej@                  ej@                  d      d        Z! ej<                  ejD                  jF                  ejD                  jF                  d      d        Z$ ej<                  ejF                  ejF                  ejF                  ejF                  ejF                  ejF                  ejJ                  ej@                  d      d        Z& ej<                  ejF                  ej@                  ej                  d      d         Z' ej<                  ejP                  ejP                  ejF                  ejF                  ejF                  ejF                  ejF                  ejF                  ejF                  ej@                  d!
      d"        Z) ej<                  d#d$ejF                  ejF                  ejF                  d%&      d'        Z* ej<                         d(        Z+ ej<                  d)ejF                  i      d*        Z, ej<                         dLd+       Z- ej<                  ejF                  ej@                  d,      d-        Z. ej<                         d.        Z/ ej<                  d$/      d0        Z0 ej<                  ejF                  ejF                  d1      d2        Z1 ej<                  d#d)ej@                  i3      d4        Z2 ej<                  d#5      d6        Z3 ej<                  d#d#ej                  ej                  d7d89      d:        Z4 ej<                  d#d#ej                  ej                  d7d89      d;        Z5 ej<                  d#d#d8<      d=        Z6 ej<                  d#d#d>ej                  id89      d?        Z7 ej<                  d#d#d8<      d@        Z8 ej<                  d#d#d8<      dA        Z9 ej<                  d#d#B      	 dMdE       Z: ej<                  d#d#B      dNdF       Z; ej<                  d#d#B      edGdCdDdDfdH       Z< ej<                  d#d#B      edGfdI       Z= ej<                  d#d#d8<      edGfdJ       Z>dOdKZ?y)P    N)
namedtuple)EnumIntEnum   dtype)r   r   g      <g:0yE>c                       e Zd ZdZdZdZdZy)ProblemStatusr      r      N)__name__
__module____qualname__OPTIMALMAX_ITER_REACHED	UNBOUNDED
INFEASIBLE     i/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/pynndescent/optimal_transport.pyr   r   4   s    GIJr   r   c                       e Zd ZdZdZdZy)ArcStater	   r   r   N)r   r   r   STATE_UPPER
STATE_TREESTATE_LOWERr   r   r   r   r   <   s    KJKr   r   SpanningTree)	parentpredthread
rev_threadsucc_num	last_succforwardstaterootDiGraph)	n_nodesn_arcsnmuse_arc_mixing!num_total_big_subsequence_numberssubsequence_lengthnum_big_subsequencesmixing_coeffNodeArcData)costsupplyflowpisourcetargetLeavingArcData)u_inu_outv_indeltachangegh㈵>c                 n    t        j                  | |z
        }|||t        j                  |      z  z   k  S N)npabs)abrtolatoldiffs        r   iscloserG   n   s0    66!a%=DD4"&&)++,,r   )rB   e)localsc                    d}| }|j                   }|j                  }	|j                  }
|j                  }t	        ||      D ]  }||   ||   |	|
|      z   |	||      z
  z  }||k  r|}|}|dz  }|dk(  s4t        j                  |	|
|            t        j                  |	||            kD  rt        j                  |	|
|            }nt        j                  |	||            }|t        j                  ||         k  rt        j                  ||         }|t        |z   k  r|}||fc S | } t	        |      D ]  }||   ||   |	|
|      z   |	||      z
  z  }||k  r|}|}|dz  }|dk(  s4t        j                  |	|
|            t        j                  |	||            kD  rt        j                  |	|
|            }nt        j                  |	||            }|t        j                  ||         k  rt        j                  ||         }|t        |z   k  r|}||fc S | } t        j                  |	|
|            t        j                  |	||            kD  rt        j                  |	|
|            }nt        j                  |	||            }|t        j                  ||         k  rt        j                  ||         }|t        |z   k\  ry||fS )Nr   r   )r	   r   )r2   r5   r6   r7   ranger@   fabsEPSILON)pivot_block_sizepivot_next_arcsearch_arc_numstate_vectornode_arc_datain_arcmincntr2   r5   r6   r7   rH   crB   s                  r   find_entering_arcrW   v   s    C
C D			B!!F!!F>>2 'OtAwF1I6F1IFGs7CFq!8wwr&.)*RWWRv5G-HHGGBvf~./GGBvf~./BGGDL))GGDL)w{^#!"~--&)', >" 'OtAwF1I6F1IFGs7CFq!8wwr&.)*RWWRv5G-HHGGBvf~./GGBvf~./BGGDL))GGDL)w{^#!"~--&)'0 
wwr&.!"RWWRv-?%@@GGBvf~&'GGBvf~&'BGGDL!!GGDL!
!n>!!r   )uvc                 `    | |   }||   }||k7  r||   ||   k  r||   }n||   }||k7  r|}|S r?   r   )r6   r7   r"   r   rS   rX   rY   joins           r   find_join_noder\      sR    vAvA
q&A;!$q	Aq	A	 q& DKr   )rX   r9   r:   r;   firstsecondresultrS   c                     |j                   }|j                  }|j                  }|j                  }|j                  }|j
                  }	|j                  }
d}||   t        j                  k(  r||   }||   }n
||   }||   }t        }d}|}|| k7  r,|	|   }||   r||   }nt        }||k  r|}|}d}|
|   }|| k7  r,|}|| k7  r,|	|   }||   rt        }n||   }||k  r|}|}d}|
|   }|| k7  r,|dk(  r|}|}n|}|}t        |||||dk7        S )Nr	   r   r   r   )r6   r7   r4   r%   r$   r   r   r   r   INFINITYr8   )r[   rS   rR   spanning_treer6   r7   r4   r%   r$   r   r   r:   r]   r^   r<   r_   rX   rH   dr9   r;   s                        r   find_leaving_arcrd      st    !!F!!FDE##GD!!FE V},,,vvEF 	A
t)G1:QAAu9EEF1I t) 	A
t)G1:AQA:EEF1I t) {$tUFaK@@r   )rX   rS   valc                    |j                   }|j                  }|j                  }|j                  }|j                  }	|j
                  }
|j                  }|j                  dkD  r||   |j                  z  }||xx   |z  cc<   ||   }|| k7  r1||   r||	|   xx   |z  cc<   n||	|   xx   |z  cc<   |
|   }|| k7  r1||   }|| k7  r1||   r||	|   xx   |z  cc<   n||	|   xx   |z  cc<   |
|   }|| k7  r1|j                  rjt        j                  ||<   ||	|j                        dk(  r!t        j                  ||	|j                     <   y t        j                  ||	|j                     <   y ||    ||<   y )Nr   )r6   r7   r4   r%   r   r   r$   r<   r=   r   r   r:   r   r   )r[   leaving_arc_datarR   rb   rS   r6   r7   r4   r%   r   r   r$   re   rX   s                 r   update_flowrh   ,  s   !!F!!FDED!!F##G !Fm.444V6N4iqzT!W$T!W$q	A 4i 6N4iqzT!W$T!W$q	A 4i  ++f%++,-22:2F2FE$'--./2:2F2FE$'--./vfr   )
rX   wr9   r:   r;   rightstemnew_stempar_stemrS   c                 0   | j                   }| j                  }| j                  }| j                  }| j                  }	| j
                  }
| j                  }|j                  }|j                  }|j                  }||   }||   }|	|   }||   }|	|   }||   }||k(  r	||	|      }n||   }|x||<   }g }|j                  |       |}||k7  rT||   }|||<   |j                  |       ||   }|||<   |||<   |||<   |}|}|	|   |	|   k(  r||   }n|	|   }||   }||k7  rT|||<   |||<   |||<   ||	|<   ||k7  r
|||<   |||<   t        t        |            D ]  }||   }||||   <    d}|	|   }|}||k7  r6||   }||   ||<   |
|    |
|<   |||   ||   z
  z  }|||<   ||	|<   |}||k7  r6|||<   |||   k(  |
|<   |||<   d}d}|	|   |k(  r|}n|}|}||k7  r#|	|   |k(  r|	|   |	|<   ||   }||k7  r	|	|   |k(  r||k7  r-||k7  r(|}||k7  rK|	|   |k(  rC||	|<   ||   }||k7  r4|	|   |k(  rn*|}||k7  r#|	|   |k(  r|	|   |	|<   ||   }||k7  r	|	|   |k(  r|}||k7  r||xx   |z  cc<   ||   }||k7  r|}||k7  r||xx   |z  cc<   ||   }||k7  ry y )Nr   r	   )r   r    r!   r"   r#   r$   r   r:   r9   r;   appendrK   len) rb   rg   r[   rS   r6   r   r    r!   r"   r#   r$   r   r:   r9   r;   old_rev_threadold_succ_numold_last_succv_outrX   rj   lastrk   
dirty_revsrm   rl   ri   itmp_sctmp_lsup_limit_inup_limit_outs                                    r   update_spanning_treer|   ]  s     !!F!!F))J%%H''I##GD""E  D  D&NE?Le$M5ME$A1IE i&'d| F4L4JdH
%-$<q	! tq	
5  t T?i118$A$Aq	- %-0 F5MF1IJtIe
 !&~*
5 3z?# "qM !
6!9" FuFA
t)1Iq'Q ^
(1+++	! t) DJF6N*GDM!HTN KL$ 	A
{
y|t3 '	!1I {
y|t3
 ~$."8<IaLM$A)IaLq	A <IaLM$A
 <IaLM$A$U+IaLq	A <IaLM$A
 	A
t)|#1I t)
 	A
t)|#1I t)r   Talways)rX   r9   r;   )fastmathinlinerI   c                 @   |j                   }|j                  }|j                  }|j                  }| j                  }| j
                  }	||   r||	   ||   z
  |||      z
  }
n||	   ||   z
  |||      z   }
|||      }|}||k7  r||xx   |
z  cc<   ||   }||k7  ry y r?   )r    r   r$   r#   r9   r;   )rg   r5   r2   rb   r    r   r$   r#   r9   r;   sigmaendrX   s                r   update_potentialr     s     !!FD##G''I  D  Dt}42d8#d4:&6642d8#d4:&66 4
!CA
s(
11I s(r   c                     |j                   | z
  dz
  }|j                  r_||j                  kD  dz  }||j                  |z  z  }|j                  |z
  }||z  |j                  |z  z   }||z  |j
                  z  }||z   S |S Nr   )r)   r,   r-   r.   r/   r0   )arcgraphksmallvsubsequence_length2subsequence_numsubsequence_offsets          r   arc_idr     s    sQAe===B	U44v==#66?$$&&/0  "559K9KK!O33r   rw   c                 l   |j                   }|j                  }|j                  }|j                  }|j                  }| j
                  }| j                  }	| j                  }
| j                  }|j                  }d}g }g }t        |
      D ]@  }||
|z
  dz
     }|dkD  r||z  }|j                  |       *|dk  s0|j                  |       B g }t        |      dk(  r t        |      dk(  rt        j                  |
t        j                        }|d   }|d   }g }d||<   |j                  |       t        |      dkD  r,|d   }|d   }|j!                  d       ||k(  rn
||k\  r||z   |
z
  nd}t        |d|	       D ]J  }||	z  }||   rt#        ||       }t$        |k\  s$|j                  |       d||<   |j                  |       L t        |      dkD  rnt        t        |            D ]y  }||   }t&        }t&        }t(        }||k\  r||z   |
z
  nd}t        |d|	       D ]  }|t#        ||          }||k  s|}|} |t(        k7  s_|j                  t#        ||              { d}t        t        |            D ]  }||   }||   ||   |||      z   |||      z
  z  dk\  r)t+        |||j,                  |j.                  |      } t1        | |||      }!|!j2                  t&        k\  rd|fc S t5        | |!|||       |!j6                  st9        ||!| ||       t;        |!|||        d|fS )Nr   r   r   Tr	   F)r2   r5   r6   r7   r3   r*   r+   r(   r)   r%   rK   ro   rp   r@   zerosbool_popr   ra   MAXINVALIDr\   r"   r   rd   r<   rh   r=   r|   r   )"r   rR   rb   r2   r5   r6   r7   r3   n1n2r(   r)   r%   totalsupply_nodesdemand_nodesrX   curr
arc_vectorreachedststackrY   	first_arcrB   jrw   rV   min_costmin_arcrS   r[   rg   s"                                     r   construct_initial_pivotsr   '  s    D			B!!F!!F!!F	B	BmmG\\FEELL7^ #gkAo&!8TME"AX"# J
<A#l"3q"8((7"((3OO
Q%j1nb	Ab	AIIbMAv01R
W,RI9b2#. 	$G1:1e$u$%%a(!%GAJLLO	$ %j1n* s<() 	:AQAAHG01R
W,RI9b2#.  5)*x< HG	  '!!!&%"89	:  F3z?# HA &MT&\Bvf~,>>F6NASST FM22M4H4H&
 ,D&-W!!S(&= D*M=&Q"" 0@$PVW-r4G'H* <r   c                 b   | |z   }| |z  }|dz   }|d|z  z   }|}t        j                  |t         j                        }t        j                  |t         j                        }	t        j                  |t         j                        }
t        j                  |t         j                        }t        j                  |t         j                        }t        j                  |t         j                        }t        j                  |t         j
                        }t        j                  |t         j
                        }t        j                  |t         j                        }t        j                  |t         j
                        }t        j                  |t         j
                        }t        j                  |t         j
                        }t        j                  |t         j
                        }t        j                  |t         j                        }|rt        t        j
                  t        j                  |            d      }|}||z  dz   }||z  }||z  }d}d}t        |dz
  dd      D ]3  }|||z  z
  dz
  ||<   |||z  | z   z
  dz
  |	|<   ||z  }||k\  s-|dz  }|}5 nCd}d}d}d}d}t        |dz
  dd      D ]&  }|||z  z
  dz
  ||<   |||z  | z   z
  dz
  |	|<   |dz  }( t        |
|||||	      }t        |||||||||	      }t        ||| ||||||	      } ||| fS )Nr   r   r   
   r   r	   )r@   r   uint16onesfloat64int32r   int8maxsqrtrK   r1   r   r'   )!r*   r+   r,   r(   r)   all_node_nummax_arc_numr&   r6   r7   r2   r3   r4   r5   r   r   r$   r    r!   r"   r#   r%   r   r0   r.   r/   r-   rw   r   rB   rR   rb   r   s!                                    r   allocate_graph_structuresr     s    !eGUF Q;L1w;&KDXXk3FXXk3F77;bjj1DXXl"**5F88Krzz2D	,bjj	1BXXl"((3F88L1Dhh|2884GXXl"((3F,bhh7JxxBHH5HRXX6IHH[0E)2.$49%4,>AU,U)vz2r* 	A16*Q.F1IAEQ;/!3F1IFAF{Q	  ,-)vz2r* 	A16*Q.F1IAEQ;/!3F1IFA	
  fdBGM fj(IwtM 		)
E -..r   )rX   rH   c                 "   | j                   }| j                  }|j                  }|j                  }|j                  }|j
                  }|j                  }	|j                  }
|j                  }|j                  }|j                  }|j                  }|j                  }|j                  }|j                  }|j                  }|dk(  ryd}t!        |      D ]
  }|||   z  } t#        j$                  |      t&        kD  ryd}t!        |      D ]/  }||   |kD  r||   }||   dk7  rd||<   t(        j*                  ||<   1 |dz   |z  }|}d||<   d||<   d||<   ||d<   |dz   ||<   |dz
  ||<   | ||<   d||<   |}t!        |      D ]  }|||<   |||<   |dz   ||<   |||dz   <   d||<   |||<   t(        j,                  ||<   ||   dk\  r"d||<   d||<   ||	|<   ||
|<   ||   ||<   d||<   n"d||<   |||<   ||	|<   ||
|<   ||    ||<   |||<   |dz  } y)Nr   F        r   r	   T)r(   r)   r2   r3   r4   r5   r6   r7   r   r   r    r!   r"   r#   r$   r%   rK   r@   rL   NET_SUPPLY_ERROR_TOLERANCEr   r   r   )r   rR   rb   r(   r)   r2   r3   r4   r5   r6   r7   r   r   r    r!   r"   r#   r$   r%   
net_supplyrw   artificial_costr&   rH   rX   s                            r   initialize_graph_structuresr     s    mmG\\F D!!FD			B!!F!!F!!FD!!F))J%%H''I##GE!| J7^  fQi
  
wwz77 O6] (7_$"1gO7a<DG''a( '*g5O DF4LDJF4LJqMq[HTNQhIdO;F4LBtH 	A7^ q	QEq	
1q5	!&&a!9>GAJBqEF1IF1IQiDGDGGAJ#BqEF1IF1IayjDG%DG	Q-0 r   c                     t        |j                        D ]O  }||j                  k  r| |   ||j                  |z
  dz
  <   +|||j                  z
     ||j                  |z
  dz
  <   Q y r   )rK   r(   r*   )left_node_supplyright_node_supplyr   r3   r*   s        r   initialize_supplyr   0  si    5==! Kuww;,<Q,?F5==1$q(),=a%''k,JF5==1$q()	Kr   )r   c                 "    ||t        | |      <   y r?   )r   )r   cost_valr2   r   s       r   set_costr   9  s    'DU	r   )rw   r   c                     t        | j                  d         D ]E  }t        | j                  d         D ](  }t        || j                  d   z  |z   | ||f   ||       * G y Nr   r   )rK   shaper   )cost_matrixr   r2   rw   r   s        r   initialize_costr   >  sp    ;$$Q'( S{((+, 	SAQ**1--1;q!t3DdER	SSr   )r~   rI   c                 `    d}t        | j                  d         D ]  }|| |   ||   z  z  } |S Nr   r   )rK   r   )r4   r2   rV   rw   s       r   
total_costr   E  s?    A4::a=! 	T!WtAwHr   )nogilc                 6   t        t        j                  t        j                  |j                              d      }|j                  }t
        j                  }t        || |      \  }}|st
        j                  S d}	t        |d||j                  | |      \  }}
|dk\  r|	dz  }	|dkD  r|	|k\  rt
        j                  }nt        | j                  | j                  |j                  |j                   |      }t#        ||| |      }|j$                  t&        k\  rt
        j                  S t)        ||| ||       |j*                  r;t-        ||||| j                         t/        || j0                  | j2                  |       t        ||
||j                  | |      \  }}
|dk\  r| j4                  }| j0                  }|t
        j                  k(  rqt7        |j                  |j                  |j8                  z         D ]A  }||   dk7  st        j:                  ||         t<        kD  rt
        j>                  c S d||<   C t@         }t7        |j8                        D ]  }||   |kD  s||   } |dkD  r't7        |j8                        D ]  }||xx   |z  cc<    |S )Nr   r   r   )!r   r@   r   r   r)   r   r   r   r   rW   r%   r   r\   r6   r7   r"   r   rd   r<   r   rh   r=   r|   r   r5   r2   r4   rK   r(   rA   rM   r   ra   )rR   rb   r   max_iterrN   rP   solution_statusboundedrS   iter_numberrO   r[   rg   r4   r5   rH   max_potrw   s                     r   network_simplex_corer   M  s    288BGGELL$9:B?\\N#++O /um]SOGV&&&K /!^]-@-@-QWFN A+qa<K83+<<O    ""  
 ,D&-W!!S( ***D*M=&Q"" /v}?S?S  -"2"2M4F4F "3"
7 A+H D			B -///u||U\\EMM%AB 	 AAw!|66$q'?W,(333DG	  iG5==! a57?eG {u}}% 	AqEWE	 r   )rF   r_   F)r~   parallelrI   cachec                     | |z  }d}t        j                  |j                  d         D ]  }||   ||   ||   z  z
  }|||z  z  } t        j                  |      S r   )numbapranger   r@   r   )rX   KrY   yuKr_   rw   rF   s           r   right_marginal_errorr     sj     
QBF\\"((1+& tbeadl"$+ 776?r   c                    |j                   | z  }d}t        j                  |j                  d         D ]>  }t	        |j                  d         D ]!  }|||f   |||f   |||f   z  z
  }|||z  z  }# @ t        j                  |      S )Nr   r   r   )Tr   r   r   rK   r@   r   )	rX   r   rY   r   r   r_   rw   r   rF   s	            r   right_marginal_error_batchr     s     
qBF\\"((1+& "rxx{# 	"AQT7R1X!Q$//DdTk!F	"" 776?r   )r~   r   r   c                     | j                   d   }| j                   d   }t        j                  |       }t        j                  |      D ]*  }t        |      D ]  }||   | ||f   z  ||   z  |||f<    , |S r   )r   r@   
empty_liker   r   rK   )r   rX   rY   i_dimj_dimr_   rw   r   s           r   transport_planr     s    GGAJEGGAJE]]1F\\%  1u 	1AQ4!AqD'>AaD0F1a4L	11 Mr   r_   c                 0   | j                   d   }|j                   d   }d}t        j                  |      D ]W  }t        |      D ]G  }| |   ||   z  }	|t	        j
                  t	        j                  |	||   ||   z  z
        |	z        z  }I Y |||z  z  S )Nr   r   )r   r   r   rK   r@   float32rA   )
old_uold_vnew_unew_vr   r   r_   rw   r   old_uvs
             r   relative_change_in_planr     s    KKNEKKNEF\\%  Pu 	PA1Xa(FbjjqE!H1D(D!E!NOOF	PP
 UU]##r   c                    | j                   d   }| j                   d   }t        j                  |       }t        j                  |      D ]8  }||   dkD  r	d||   z  }nt
        }t        |      D ]  }|| ||f   z  |||f<    : |S )Nr   r   r         ?)r   r@   r   r   r   ra   rK   )r   xr   r   r_   rw   x_i_inverser   s           r   precompute_K_primer     s    GGAJEGGAJE]]1F\\%  1Q4#:!*K"Ku 	1A&1a40F1a4L	11 Mr   c                 
   | j                   d   }| j                   d   }t        j                  |       }t        j                  |      D ]7  }t        |      D ]'  }| ||f   |z  }t        j                  |       |||f<   ) 9 |S r   )r   r@   r   r   r   rK   exp)r2   regularizationr   r   r_   rw   r   scaled_costs           r   K_from_costr     s    JJqMEJJqME]]4 F\\%  0u 	0Aq!t*~5K66;,/F1a4L	00
 Mr   )r~   r     &.>c                    t        ||       }|}	|}
t        |      D ]  }||j                  |z  z  }t        j                  t        j
                  |             r ||fS d||z  z  }t        j                  t        j
                  |             r ||fS |}|}|dz  dk(  rt        |	|
||      }||k  r ||fS |}	|}
|dz  dk(  st        ||||      }||k  s ||fS  ||fS )Nr      r   r   )r   rK   r   r@   anyisfiniter   r   )r   r   rX   rY   r   r   error_tolerancechange_toleranceK_primeprev_uprev_v	iterationnext_vnext_urelative_changeerrs                   r   sinkhorn_iterationsr     s!    !A&GFF8_ 	accAg662;;v&&'2 a4K/ &()662;;v&&'( a4K% r>Q5ffffUO"22 a4K FFr>Q&q!Q2Co%a4K=< a4Kr   c                    t        ||       }t        |      D ]  }|j                  |j                  |z  z  }	t        j                  t        j
                  |	             r ||fS d||	z  z  }
t        j                  t        j
                  |
             r ||fS |
}|	}|dz  dk(  st        ||||      }||k  s ||fS  ||fS )Nr   r   r   )r   rK   r   r@   r   r   r   )r   r   rX   rY   r   r   r   r   r   r   r   r   s               r   sinkhorn_iterations_batchr  %  s     A&G8_ 	a662;;v&&'  a4K &()662;;v&&' a4K r>Q,Q1a8Co%a4K+* a4Kr   r   c           
      0   | j                   d   }|j                   d   }t        j                  |d|z  |j                        }	t        j                  |d|z  |j                        }
t	        ||      }t        | ||	|
||||      \  }	}
t        ||	|
      S )Nr   r   r   )r   r   r   )r   r@   fullr   r   r   r   )r   r   r2   r   r   r   r   dim_xdim_yrX   rY   r   s               r   sinkhorn_transport_planr  A  s     GGAJEGGAJE
sU{$**5A
sU{$**5AD.)A					')	DAq !Q""r   c                     t        | |||      }|j                  d   }|j                  d   }d}t        |      D ]$  }t        |      D ]  }	||||	f   |||	f   z  z  } & |S )N)r2   r   r   r   r   )r  r   rK   )
r   r   r2   r   r   dim_idim_jr_   rw   r   s
             r   sinkhorn_distancer  _  s    ,	14N   #E  #EF5\ 8u 	8AnQT*T!Q$Z77F	88 Mr   c           
      V   | j                   d   }|j                   d   }|j                   d   }t        j                  ||fd|z  |j                        }t        j                  ||fd|z  |j                        }t	        ||      }	t        | ||||	      \  }}|	j                   d   }
|	j                   d   }t        j                  |      }t        |
      D ]N  }t        |      D ]>  }|	||f   |||f   z  }t        |      D ]  }||xx   |||f   |z  |||f   z  z  cc<   ! @ P |S )Nr   r   r   r   )r   r@   r  r   r   r  r   rK   )r   r   r2   r   r  r  
batch_sizerX   rY   r   r   r   r_   rw   r   K_times_costbatchs                    r   sinkhorn_distance_batchr  n  sC   GGAJEGGAJEJ

#S5[

CA

#S5[

CAD.)A$					DAq GGAJEGGAJEXXj!F5\ Ju 	JAQT7T!Q$Z/Lz* Ju1e8|!;a5k!IIJ	JJ Mr   c                      t               }|j                  d   |j                  d   t        j                  d       fd       }|S )Nr   r   T)r~   c                 Z   t        j                  
d
z  	j                        }t        j                  dz  	j                        }t        	      }t	        | ||||      \  }}t        |||      }d}t        
      D ]$  }t              D ]  }||||f   	||f   z  z  } & |S )Nr   r   r   )r@   r  r   r   r   r   rK   )r   r   rX   rY   r   current_planr_   rw   r   r2   r  r  r   s            r   closurez2make_fixed_cost_sinkhorn_distance.<locals>.closure  s    GGE3;djj9GGE3;djj9n-"
1 &aA.u 	:A5\ :,q!t,tAqDz99:	: r   )r   r   r   njit)r2   r   r   r  r  r  s   ``  @@r   !make_fixed_cost_sinkhorn_distancer    sK    D.)AGGAJEGGAJE
ZZ , Nr   )T)r   r   r   )r   r   )r   )@numpyr@   r   collectionsr   enumr   r   eyer   _mock_identityr   
_mock_onesr   r   _dummy_costrM   r   finfor   ra   r   
dummy_costr   r   r   r   r'   r1   r8   r  rG   uint32rW   typesr   r\   uint8rd   rh   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r   r   <module>r#     s  :   " ,RWWQbjj)
bhhvRZZ0 !!  288BJJ##bhhrzzRXXfBJJ/
 D w  
 
 
 B
 G - - ELL9:J" ;J"b ++%++2D2DEF G$ \\,,++,,	?A?AJ emmTU(' V('` [[[[LLLL,,DDT u||U\\J

2  & C&'_ (_D J/ J/Z ELL9:T ;Tn K K 8( ( ELL9:S ;S T3"56 7 $P Pp MMU]];
	 MMU]];
	 TD6 7 TD(EMM1JRWX	$ Y	$ TD6 7 TD6	 7	 T&IM& '&R T& '6 T& 
# '#: T&!,S  ' TD6'23  7<r   