
    Vh,              
       
   d dl Z d dlmZmZ d dlZeZeZeZ	dZ
dZ G d d      Z G d d      Z G d	 d
      Z G d d      ZdedefdZdededefdZdededefdZdededefdZdee   fdZdedefdZdee   fdZdededededef
dZdee   fdZdedededefd Zdee   fd!Zdee   fd"Zdeded#edefd$Zdee   fd%Z dee   fd&Z!dee   fd'Z"ded(ed)e#ed*f   ddfd+Z$ded,ejJ                  ddfd-Z&y).    N)AnyCallablechoicefeedbackc            	       *    e Zd ZdZddedededdfdZy)		AHFeaturez
    The context, that AutoHeuristic stores, is a list of features. AutoHeuristic needs to know whether a feature is
    categorical (i.e., not a continuous variable) to learn a machine learning model.
    namevalueis_categoricalreturnNc                 .    || _         || _        || _        y N)r	   r
   r   selfr	   r
   r   s       a/home/dcms/DCMS/lib/python3.12/site-packages/torch/_inductor/autoheuristic/autoheuristic_utils.py__init__zAHFeature.__init__   s    	
,    F)__name__
__module____qualname____doc__strValueboolr    r   r   r   r      s)    
-S - - -QU -r   r   c            	       H    e Zd ZdZ	 d
dedeegef   deddfdZ	deddfd	Z
y)AHOperationak  
    AHOperation can be used to augment the data collected by AutoHeuristic.
    One might for example store features like m, k, n, but also want to use
    features like m*n, or k*n, to learn a heuristic. Instead of storing features
    that can be created from the collected data, one can use AHOperation to
    create new features from the collected data.
    r	   funcr   r   Nc                 .    || _         || _        || _        y r   )r	   r   r   )r   r	   r   r   s       r   r   zAHOperation.__init__$   s     		,r   datac                 @    | j                  |      || j                  <   y r   )r   r	   )r   r!   s     r   apply_operationzAHOperation.apply_operation+   s    ))D/TYYr   r   )r   r   r   r   r   r   r   r   r   r   r#   r   r   r   r   r      sQ     OT--'u5-GK-	-*C *D *r   r   c            	           e Zd ZU dZee   ed<   eee	f   ed<   ddZ
	 ddede	d	eddfd
Zdeee   ee   f   fdZdefdZdefdZdede	fdZdee   ddfdZy)	AHContexta!  
    This class is used to specify which information AutoHeuristic should store. For each choice, AutoHeursitic will
    store the context and the collected feedback. The context could be something like the shape of a tensor, i.e.,
    information that will help to learn a heuristic.
    featurescontext_dictr   Nc                      g | _         i | _        y r   )r&   r'   r   s    r   r   zAHContext.__init__9   s    r   r	   r
   r   c                 p    | j                   j                  t        |||             || j                  |<   y )Nr   )r&   appendr   r'   r   s       r   add_featurezAHContext.add_feature=   s/     	YtU>RS"'$r   c                     g }g }| j                   D ]E  }|j                  r|j                  |j                         +|j                  |j                         G ||fS r   )r&   r   r,   r	   )r   numerical_featurescategorical_featuresfeatures       r   &get_numerical_and_categorical_featuresz0AHContext.get_numerical_and_categorical_featuresC   s\    !}} 	8G%%$++GLL9"))',,7		8 "#777r   c                 F    dj                  d | j                  D              S )N,c              3   4   K   | ]  }|j                     y wr   )r	   .0r1   s     r   	<genexpr>z2AHContext.get_feature_names_csv.<locals>.<genexpr>O   s     BBs   joinr&   r)   s    r   get_feature_names_csvzAHContext.get_feature_names_csvN   s    xxBDMMBBBr   c                 F    dj                  d | j                  D              S )Nr4   c              3   F   K   | ]  }t        |j                          y wr   )r   r
   r6   s     r   r8   z3AHContext.get_feature_values_csv.<locals>.<genexpr>R   s     HwGMM*Hs   !r9   r)   s    r   get_feature_values_csvz AHContext.get_feature_values_csvQ   s    xxH$--HHHr   c                      | j                   |   S r   )r'   )r   r	   s     r   	get_valuezAHContext.get_valueT   s      &&r   
operationsc                 H    |D ]  }|j                  | j                          y r   )r#   r'   )r   rA   ops      r   apply_operationszAHContext.apply_operationsW   s%     	2Bt001	2r   )r   Nr   )r   r   r   r   listr   __annotations__dictr   r   r   r   r-   tupler2   r;   r>   r@   r   rD   r   r   r   r%   r%   /   s     9osEz""
 ?D(( %(7;(	(	8d3ic>R8S 	8Cs CI I'c 'e '24+< 2 2r   r%   c            
       N    e Zd Zdedeeef   dee   deddf
dZ	de
eef   fdZy)	
AHMetadatashared_memorydevice_capachoicesr	   r   Nc                 <    || _         || _        || _        || _        y r   )rK   rL   rM   r	   )r   rK   rL   rM   r	   s        r   r   zAHMetadata.__init__]   s"     +&	r   c                 J    | j                   | j                  | j                  dS )NrK   rL   r	   rP   r)   s    r   to_dictzAHMetadata.to_dictk   s%    !//++II
 	
r   )r   r   r   r   rH   intrE   Choicer   r   rG   r   rQ   r   r   r   rJ   rJ   \   sX     38_ f	
  

c5j) 
r   rJ   log_pathr   c                     t        | d      5 }|j                         j                         }|cd d d        S # 1 sw Y   y xY w)N )newline)openreadlinestrip)rT   filejson_strings      r   get_metadata_str_from_logr]   s   s:    	h	# tmmo++-  s	    8Acontextminsizec                     | j                  d      |k\  xr* | j                  d      |k\  xr | j                  d      |k\  S )Nmknr@   )r^   r_   s     r   check_minsizere   y   sJ    #') 	.c"g-	.c"g-r   metadatac                     | j                   dk(  r| j                  dk(  rt        |d      S | j                   dk(  r| j                  dk(  rt        |d      S y)Ni  )   r   i   i  )	   r   i   T)rK   rL   re   )rf   r^   s     r   pad_mm_preconditionrj      sU    'H,@,@F,JWc**			6	)h.B.Bf.LWc**r   c                     |j                  d      }|j                  d      }|j                  d      }|dkD  s
|dk  s|dk  ry|j                  d      }|j                  d      }|xr | S )	Nra   rb   rc         Fmat1_iscontigmat2_iscontigrd   )rf   r^   ra   rb   rc   rn   ro   s          r   get_mixedmm_preconditionrp      sv    #A#A#A3w!d(a$h%%o6M%%o6M...r   c                  Z    t        dd       } t        dd       }t        dd       }| ||gS )Nzm*kc                     | d   | d   z  S )Nra   rb   r   r!   s    r   <lambda>z#get_mult_dims_ops.<locals>.<lambda>       49tCy3H r   zm*nc                     | d   | d   z  S )Nra   rc   r   rs   s    r   rt   z#get_mult_dims_ops.<locals>.<lambda>   ru   r   zk*nc                     | d   | d   z  S )Nrb   rc   r   rs   s    r   rt   z#get_mult_dims_ops.<locals>.<lambda>   ru   r   )r   )m_times_k_opm_times_n_opk_times_n_ops      r   get_mult_dims_opsr{      s6    u&HILu&HILu&HIL,55r   r!   c                 t    | d   }| d   }| d   }|dk(  s
|dk(  s|dk(  ry||z  |z  ||z  ||z  z   ||z  z   z  S )Nra   rb   rc   r   g        r   )r!   ra   rb   rc   s       r   get_arith_intensityr}      s[    S	AS	AS	AAva16q519AAA-..r   c                  B   t               } t        dd       }dt        dt        fd}t        d|d      }t        d	t              }t               }t               }t               }| |||gz   }|j                  |       |j                  |       |j                  |       |S )
Nzk/(m*n)c                 $    | d   | d   | d   z  z  S )Nrb   ra   rc   r   rs   s    r   rt   z#pad_mm_operations.<locals>.<lambda>   s    S	T#Yc-B C r   r!   r   c                 n    | d   }| d   }| d   }t        | d         dk(  }||dz  kD  xr ||dz  kD  xr |S )Nra   rb   rc   
mat1_dtypeztorch.bfloat16rm   )r   )r!   ra   rb   rc   	is_bfloats        r   bfloat_perf_hitz*pad_mm_operations.<locals>.bfloat_perf_hit   sR    III\*+/??	AH~>!q4x.>Y>r   r   Tr+   arith_intensity)	r{   r   r   r   r}   get_dims_need_padding_opsget_dims_multiple_opsget_is_contig_opsextend)	mult_dims_opsk_div_m_times_n_opr   bfloat_perf_hit_oparith_intensity_opdims_need_padding_opsdims_multiple_opsis_contig_opsah_operationss	            r   pad_mm_operationsr      s    %'M$C?c ?d ? %?4 %%68KL57-/%'M!% M
 ./*+'r   dimlowerupperc                 &    | |   |k\  xr | |   |k  S r   r   )r!   r   r   r   s       r   
between_opr      s    94$s)u"44r   c            	          g d} g d}g }| D ]P  }|D ]I  \  }}t        j                  t        |||      }| d| d| }|j                  t	        ||d             K R |S )Nra   rb   rc   ))      )       )!   @   )A   rl   )      )r   r   r   LEQTr+   )	functoolspartialr   r,   r   )dimslimitsr   r   r   r   between_op_fnbetween_op_names           r   between_opsr      s    DAFM 	" 	LE5%--5M "'s3%s5':O  O]4P		 r   exponentc                     | |   d|z  k(  S )N   r   )r!   r   r   s      r   pow2_opr      s    98##r   c                  B    t               } t        dt              }| |gz   S )Nr   )r{   r   r}   )r   r   s     r   mm_operationsr      s(    %'M$%68KL.///r   c                  ,    t               t               z   S r   )r   r   r   r   r   mixed_mm_operationsr      s    ?[]**r   multc                     | |   |z  dk(  S )Nr   r   )r!   r   r   s      r   is_multipler      s    9tq  r   c                      g d} g d}g }|D ]I  }| D ]B  }t        j                  t        ||      }t        | d| |d      }|j	                  |       D K |S )N)r      rh   r   r   r   )r   r   
_multiple_Tr+   )r   r   r   r   r,   )	multiplesr   r   r   r   is_multiple_fndims_multiple_ops          r   r   r      sz    !ID 7 	7D&..{$ON*%z$(.  $$%56	77 r   c                      dt         dt        fd} t        d| d      }dt         dt        fd}t        d|d      }dt         dt        fd	}t        d
|      }|||gS )Nr!   r   c                 b    | d   }| d   }| d   }| d   }d}|dk(  r|dk7  rd}|dk(  r|dk7  rd}|S )	Nmat1_stride_0mat1_stride_1m_padded_lengthk_padded_lengthFr   r   Tr   )r!   r   r   r   r   mat1_innermost_needs_paddings         r   mat1_innermost_needs_padding_fnzBget_dims_need_padding_ops.<locals>.mat1_innermost_needs_padding_fn   b    _-_-0101',$A/Q"6+/(A/Q"6+/(++r   r   Tr+   c                 b    | d   }| d   }| d   }| d   }d}|dk(  r|dk7  rd}|dk(  r|dk7  rd}|S )	Nmat2_stride_0mat2_stride_1r   n_padded_lengthFr   r   Tr   )r!   r   r   r   r   mat2_innermost_needs_paddings         r   mat2_innermost_needs_padding_fnzBget_dims_need_padding_ops.<locals>.mat2_innermost_needs_padding_fn  r   r   r   c                 d    | d   }| d   }| d   }d}|dk7  r|dz  }|dk7  r|dz  }|dk7  r|dz  }|S )Nr   r   r   r   r   r   )r!   r   r   r   num_dims_needs_paddings        r   num_dims_needs_padding_fnz<get_dims_need_padding_ops.<locals>.num_dims_needs_padding_fn!  sh    010101!"a"a'"a"a'"a"a'"%%r   r   )r   r   r   rR   )r   mat1_innermost_opr   mat2_innermost_opr   num_dims_ops         r   r   r      s    
,c 
,d 
, $&'
,c 
,d 
, $&'& & & 68QRK0+>>r   c                      dt         dt        fd} t        d| d      }dt         dt        fd}t        d|d      }||gS )	Nr!   r   c                 8    | d   }| d   }| d   }||k(  xr |dk(  S )Nr   r   rb   r   r   )r!   stride_0stride_1rb   s       r   mat1_is_contig_fnz,get_is_contig_ops.<locals>.mat1_is_contig_fn3  2    ((I1}.Q.r   rn   Tr+   c                 8    | d   }| d   }| d   }||k(  xr |dk(  S )Nr   r   rc   r   r   )r!   r   r   rc   s       r   mat2_is_contig_fnz,get_is_contig_ops.<locals>.mat2_is_contig_fn=  r   r   ro   )r   r   r   )r   mat1_is_contig_opr   mat2_is_contig_ops       r   r   r   2  s`    / / / $*4/ / / $*4 011r   r	   stride.c                 X    t        |      D ]  \  }}| j                  | d| |        y )N_stride_)	enumerater-   )r^   r	   r   iss        r   context_add_stridesr   J  s5    &! 51tfHQC0!45r   dtypec                     d}|t         j                  k(  r.t         j                  j                  j                  j
                  }| j                  d|d       y )Nnot_float_32
using_tf32Tr+   )torchfloat32backendscudamatmul
allow_tf32r-   )r^   r   r   s      r   context_add_using_tf32r   O  sC    J^^((//::
jFr   )'r   typingr   r   r   floatFeedbackr   rS   r   
CHOICE_COLFEEDBACK_COLr   r   r%   rJ   r]   rR   r   re   rj   rp   rE   r{   r}   r   r   r   r   r   r   r   r   r   r   rH   r   r   r   r   r   r   <module>r      s       	
	- 	-* *(*2 *2Z
 
.  9 s t * y T /z /I /$ /64, 6/c /e /4, B5S 5s 53 5s 5t 5T+& "$# $C $3 $4 $0tK( 0+T+. +!c ! !3 !4 !tK0 3?4#4 3?l24, 205 5# 5uS#X 5SW 5
GI Gekk Gd Gr   