
    Vpf$                       d Z ddlmZ ddlmZmZmZmZ ddlZddl	Z	ddl
Z
ddlmZm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 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Z"e"j#        de"j$        de"j%        de"j&        diZ'd Z( G d de          Z) G d de          Z* G d dej+                  Z,d5d(Z-ej.        d)ddfd6d*Z/ej.        d)ddfd6d+Z0d7d/Z1	 d8d9d1Z2	 d8d9d2Z3d)d3 ej.        fd4Z4dS ):zSparse test utilities.    )annotations)CallableIterableIteratorSequenceN)Any
NamedTuple)lax)	tree_util)	test_util)DotDimensionNumbers)
gpu_sparse)	DTypeLike)sparse)safe_zip
split_listgh㈵>g|=c                6    t          | t          j                  S N)
isinstancer   	JAXSparsexs    a/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/experimental/sparse/test_util.py	is_sparser   ,   s    	Av'	(	((    c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	S )
BatchedDotGeneralPropertiesztuple[int, ...]	lhs_shape	rhs_shapeintn_batchn_denser   dimension_numbersN__name__
__module____qualname____annotations__ r   r   r   r   0   sH         ,,,,,,((((((r   r   c                  .    e Zd ZU ded<   ded<   ded<   dS )SparseLayoutr    r!   r"   n_sparseNr$   r)   r   r   r+   r+   8   s+         ,,,,,,-----r   r+   c            	      b    e Zd ZdddddddZ	 	 	 ddZdddddd	Zd
 ZddddddddddZdS )SparseTestCaseTN check_dtypesatolrtolcanonicalize_dtypeserr_msgc          	         t          j        |          \  }}	t          j        |          \  }
}|                     |	|           |                     ||
|||||           d S )Nr0   )r   tree_flattenassertEqualassertAllClose)selfr   yr1   r2   r3   r4   r5   x_bufsx_treey_bufsy_trees               r   assertSparseArraysEquivalentz+SparseTestCase.assertSparseArraysEquivalent?   s|    +A..NFF+A..NFFVV$$$\SW,?  R R R R Rr   c
                t    |            }
t          j        t          j        |
t                    } || } ||
 }t          j        t          j        |t                    }|                     ||||p||p||	           |r6 t          j        |          |
 }|                     |||p||p|           dS dS )z-Check an operation against a dense equivalentis_leaf)r1   r2   r3   r4   r2   r3   N)	r   tree_mapr   todenser   r9   jaxjitr@   )r:   dense_op	sparse_op
args_maker	check_jitr1   tolr2   r3   r4   sparse_args
dense_argsexpected
sparse_ansactualsparse_ans_jits                   r   _CheckAgainstDensez!SparseTestCase._CheckAgainstDenseH   s     *,,K#FNKSSSJx$HK(J
INNNF&|![St{s,?  A A A  L)swy));7n
''
N-1[St{s ( L L L L LL Lr   fwdrev)argnumsmodesr2   r3   c               x   t          d |D                       sJ  |            }t          j        |          \  }	d |D             }
t          j        dg|
d d                                                   |fd|D             fd}fd}d|v rK t          j        |	          |	 } t          j        |	          |	 }|                     ||||
           d|v rM t          j	        |	          |	 } t          j	        |	          |	 }|                     ||||
           d S d S )Nc              3     K   | ]}|d v V  	dS )rU   Nr)   ).0modes     r   	<genexpr>z3SparseTestCase._CheckGradsSparse.<locals>.<genexpr>]   s'      88$t~%888888r   c                \    g | ])}t          t          j        |          d                    *S r   )lenr   r7   r\   args     r   
<listcomp>z4SparseTestCase._CheckGradsSparse.<locals>.<listcomp>a   s0    DDDI*3//233DDDr   r   c                     g | ]
}|         S r)   r)   )r\   nargnums_flats     r   rd   z4SparseTestCase._CheckGradsSparse.<locals>.<listcomp>d   s    777!l1o777r   c                     t          j        |           }t          j        t          j        |t
                    } | S NrB   r   tree_unflattenrE   r   rF   r   )	args_flatargs
args_dense	dense_funtrees      r   dense_fun_flatz8SparseTestCase._CheckGradsSparse.<locals>.dense_fun_flatf   s;    %dI66d%fndINNNjY
##r   c                      t          j        |            }t          j        t          j        |t
                    S rj   rk   )rm   out
sparse_funrq   s     r   sparse_fun_flatz9SparseTestCase._CheckGradsSparse.<locals>.sparse_fun_flatk   s6    J	0yAABcYGGGGr   rW   )rX   rD   rV   )
allr   r7   npcumsumtolistrG   jacrevr9   jacfwd)r:   rp   ru   rK   rX   rY   r2   r3   rn   rm   num_bufsrr   rv   	result_de	result_sprh   rq   s    ``            @@r   _CheckGradsSparsez SparseTestCase._CheckGradsSparse[   s   88%88888888:<<D,T22OItDDtDDDH9a0(3B3-01188::L7777w777l$ $ $ $ $ $
H H H H H H ~~B#*^\BBBINiC#*_lCCCYOi
)YTEEE~~B#*^\BBBINiC#*_lCCCYOi
)YTEEEEE ~r   c                H    |                                  fd|D             S )Nc                B    g | ]}                     d |dz             S )r      )randint)r\   rc   rngs     r   rd   z0SparseTestCase._random_bdims.<locals>.<listcomp>{   s+    444CKK37##444r   )r   )r:   rn   r   s     @r   _random_bdimszSparseTestCase._random_bdimsy   s*    
((**C4444t4444r      F)
batch_sizebdimsrL   r1   rM   r2   r3   r4   c                    | j         d              D              d d fd}|                     t          j        |          t          j        |          ||||	|
||	  	         d S )Nc              3  P   K   | ]!}t          |          r|j        n|j        V  "d S r   )r   r!   ndimrb   s     r   r^   z6SparseTestCase._CheckBatchingSparse.<locals>.<genexpr>   sI       #< #<'* 3<C..#N3;;ch #< #< #< #< #< #<r   c                x     t          j        t          j        t          j        |                    |           S )N)	dimension)r   sparsify	functoolspartialr
   concatenate)rn   bdims     r   concatz3SparseTestCase._CheckBatchingSparse.<locals>.concat   s/    PV_Y.s$OOOPPQUVVVr   c                z     t          j        t          j        t          j        |g                    |           S )N)
dimensions)r   r   r   r   r
   expand_dims)rc   r   s     r   expandz3SparseTestCase._CheckBatchingSparse.<locals>.expand   s1    SV_Y.sD6RRRSSTWXXXr   c                     t          t          fdt                    D                        } fdt          |           D             S )Nc              3  ,   K   | ]}             V  d S r   r)   )r\   _rK   s     r   r^   zRSparseTestCase._CheckBatchingSparse.<locals>.batched_args_maker.<locals>.<genexpr>   s)      @@

@@@@@@r   c                ^    g | ](\  }|d         n fd|D                       )S )Nr   c                (    g | ]} |          S r)   r)   )r\   r   r   r   s     r   rd   z^SparseTestCase._CheckBatchingSparse.<locals>.batched_args_maker.<locals>.<listcomp>.<listcomp>   s#    1O1O1Oa&&D//1O1O1Or   r)   )r\   rc   r   r   r   s     @r   rd   zSSparseTestCase._CheckBatchingSparse.<locals>.batched_args_maker.<locals>.<listcomp>   s_     6 6 6#t c!ff&&1O1O1O1O1O31O1O1OQU*V*V 6 6 6r   )listzipranger   )rn   rK   r   r   r   r   s    r   batched_args_makerz?SparseTestCase._CheckBatchingSparse.<locals>.batched_args_maker   sl    #@@@@eJ.?.?@@@ABBd6 6 6 6 6'e446 6 6 6r   )r1   rM   r2   r3   rL   r4   )r   rT   rG   vmap)r:   rp   ru   rK   r   r   rL   r1   rM   r2   r3   r4   r   r   r   s      ```       @@r   _CheckBatchingSparsez#SparseTestCase._CheckBatchingSparse}   s     } d  #< #<.8jll#< #< #< =eW W WY Y Y6 6 6 6 6 6 6 6 6 	CHY66U8S8SUg)53TPT`i0C  E E E E Er   )TTNNNT)r%   r&   r'   r@   rT   r   r   r   r)   r   r   r.   r.   >   s        ?C$(,$PRR R R R R KOFJ-1L L L L( !%NDF F F F F<5 5 5 ST[_%*4dY]/3E E E E E E Er   r.   shapeSequence[int]dtyper   r   np.random.RandomStaterand_methodCallable[..., Any]nseint | floatr!   r    r"   sparse_formatstrreturnsparse.BCOO | sparse.BCSRc               T   |dvrt          d| d          t          |           |z
  |z
  }|dk     s|dk     s|dk     rt          d| d|d|          |dk    r|d	k    rt          d
| d          t          | ||g          \  }	}
}d|cxk    rdk     r9n n6t          t	          j        |t	          j        |
          z                      }t          |          } ||          }g |	||R }t          j         |||                    }t	          j	        d          }|dk    rLg |	||R }t          j        |
                    d|
||                    }t          j        ||f|           S g |	|R }g |	|
d         dz   R }t          j        |
                    d|
d         ||                    }t          j        |
                    d|dz   ||          d          }|j        d                             d          }t          j        |||f|           S )N)bcoobcsrzSparse format z not supported.r   zInvalid parameters: shape=z	 n_batch=z
 n_sparse=r      z*bcsr array must have 2 sparse dimensions; z
 is given.r   int32r   )sizer   )r   re   )axis).r   )
ValueErrorra   r   r    rx   ceilprodjnparrayr   r   r   BCOOsortatsetBCSR)r   r   r   r   r   r!   r"   r   r,   batch_shapesparse_shapedense_shapense_intdata_rng
data_shapedatar   index_shapeindicesindptr_shapeindptrs                        r   _rand_sparser      s    ***
DmDDD
E
EEZZ'!G+(\\Wq[[GaKK
KEKKWKKKK
L
LLfQ
 - - - - . . . ,6e7>6I,K ,K(+|[#\\\\\\\\\
bgcBGL11122
3
3CHH'[(44g444*	88J..	/	/$
(7

%f3K33(33Ki	kk!\5kAAC CG;ge4444)K)))K6[6,q/A"566Li	kk!\!_;ekDDF FGX	kk!Wq[|5kAAL L LFYv""1%%F;gv.e<<<<r   g      ?c           	     B    t          j        t          | ||||d          S )zGenerates a random BCOO array.r   r   r   r   r!   r"   r   r   r   r   r   r   r   r!   r"   s        r   	rand_bcoor      .     
	<Sk"GW)/
1 
1 
1 1r   c           	     B    t          j        t          | ||||d          S )zGenerates a random BCSR array.r   r   r   r   s        r   	rand_bcsrr      r   r   sr   Iterable[tuple]c                     t           j                             fdt          t	                     dz             D                       S )z3Return an iterator over all subsets of a sequence sc              3  B   K   | ]}t          j        |          V  d S r   )	itertoolscombinations)r\   rg   r   s     r   r^   ziter_subsets.<locals>.<genexpr>   sA       ' ''(iQ""' ' ' ' ' 'r   r   )r   chainfrom_iterabler   ra   )r   s   `r   iter_subsetsr      sU    		&	& ' ' ' ',1#a&&1*,=,=' ' ' 
 
 r   Iterator[SparseLayout]c              #     K   t          |t          |           dz             D ]P}t          t          |           dz   |z
            D ]+}t          |           |z
  |z
  }t          |||          V  ,Qd S )Nr   r!   r,   r"   r   ra   r+   )r   min_n_batchr!   r"   r,   s        r   iter_sparse_layoutsr      s       {CJJN33 N NgUa'122 N NUg%/h8WMMMMMMMNN Nr   c              #     K   d}t          |t          |           dz
            D ]+}t          |           |z
  |z
  }t          |||          V  ,d S )Nr   r   r   r   )r   r   r,   r!   r"   s        r   iter_bcsr_layoutsr      sq       ({CJJN33 L Lg%jj8#g-G
w7
K
K
KKKKKL Lr   c                    | S r   r)   r   s    r   <lambda>r      s    Q r   c                     |f fd	}|S )Nc                    	          }t          j        |           }d|cxk    rdk     rn n||z  }t          |t          |                    } || |          }	                    |||z
  d          }d|j        |<    |          S )Nr   r   F)replace)mathr   minr    choiceflat)
r   r   r   randr   Mr   postr   r   s
          r   r   z!rand_sparse.<locals>._rand_sparse   s    ;sD9UDC||||!|||||$Jc
dCHH

CUEAjjtcz5j99GAF7O477Nr   r)   )r   r   r   r   r   s   ` `` r   rand_sparser      s8    %( 	 	 	 	 	 	 	 	 
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    r"   r    )r   r   r   r   r`   )r   r   r   r   )5__doc__
__future__r   collections.abcr   r   r   r   r   r   r   typingr   r	   rG   r
   r   jax._srcr   jtujax._src.lax.laxr   jax._src.libr   jax._src.typingr   jax.experimentalr   	jax.numpynumpyr   jax.utilr   r   rx   float32float64	complex64
complex128
MATMUL_TOLr   r   r+   JaxTestCaser.   r   rand_defaultr   r   r   r   r   r   r)   r   r   <module>r     s     " " " " " " B B B B B B B B B B B B          " " " " " " " " 



             % % % % % % 0 0 0 0 0 0 # # # # # # % % % % % % # # # # # #       ) ) ) ) ) ) ) )     JJL$M5	
) ) )) ) ) ) )* ) ) )    :   OE OE OE OE OES_ OE OE OEb'= '= '= '=T /2.>"1 1 1 1 1 /2.>"1 1 1 1 1    '(N N N N N '(L L L L L ;;C<L      r   