o
     i                  	   @   s   d dl mZ d dlZd dlmZ d dlmZ dZddgddgd	dggZg d
Z	deej
gej
f fddZ				ddedededefddZejjrQed dS e  ee eejj dS )    )CallableN)	benchmark)iterative_pinv         i      )      ?g??gffffff?gGz?
inverse_fnc           
      C   s>  t }d}td}g }tt D ]\}}}tj||||d}d|||k < tj|dd}|tj	| j
 dd|| j
 | i| j
 d	d
| d| d| dj|dg tD ]?}tj||||d}d|||k < | }|tj	| j
 dd|| j
 | i| j
 d|dd
| d| d| dj|d qSqt|}	|	  d S )Nr
   cuda)devicer   dimz(a)adensezB=z, M=z, K=)stmtglobalslabel	sub_labeldescription)min_run_timez
sparsity: z0.2f)MIN_RUN_TIMEtorchr   zipSHAPESrandsoftmaxextendr   Timer__name__blocked_autorange
SPARSITIES	to_sparseappendCompareprint)
r   r   probr   resultsBMKr   compare r.   _/home/ubuntu/.local/lib/python3.10/site-packages/xformers/benchmarks/benchmark_nystrom_utils.pybench_inverse   sT   

	

	
r0   皙?r	      Tidentity_tolerancepinv_tolerance	max_itersplotc                 C   s   t ddD ]l}dd| }}t|||}tj|dd}t d|d D ]M}t||d}	tj|}
t||	}t|}tjj	|| dd}tjj	|
|	 dd}|| k 
 sZ||krptd| d	| d
|  d|    nq#qd S )Nr   
      r   r   )n_iter)r   zSize z
, n_iters z4: 
	                     Final Error from Identity: z5 
	                     Final Error from linalg.pinv )ranger   r   r   r   linalgpinvmatmuleyenormallr'   item)r3   r4   r5   r6   ir*   r+   r   r9   resultexpectedresult_identityidentityidentity_errorinverse_errorr.   r.   r/   iterative_pinv_analysis@   s.   
rJ   z)This benchmark could not be done on ROCM!)r1   r	   r2   T)typingr   r   torch.utilsr   #xformers.components.attention.utilsr   r   r   r#   Tensorr0   floatintboolrJ   versionhipr'   r<   r=   r.   r.   r.   r/   <module>   s4   /
 