
    RЦi                        S r SSKrSSKrSSKrSSKJr  SSKJrJrJ	r	J
r
  SSKJrJrJrJrJr  SSKrSSKr\" \R(                  R+                  S5      SS  V s/ s H  n \" U 5      PM     sn 5      rSrS	r\" S
\S9r\" \S5      (       aC  \R:                  R<                  \R:                  R>                  4r \R:                  R>                  r!O$\R<                  \R>                  4r \R>                  r!S r"S r#S r$S r%S r&S r'S r(S r)S r*S r+S r,S r-S r.SnS jr/S r0S r1S r2S r3S r4S  r5S! r6S" r7S# r8S$ r9S% r:S& r;SoS( jr<S) r=S* r>S+ r?S, r@S- rAS. rBS/ rCS0 rDS1 rE0 S2S_S3S_S4S_S5\9_S6\@_S7\A_S8\B_S9\C_S:\D_S;\E_S<\:_S=\;_S>\:_S?\;_S@\:_SA\;_SB\:_\;\=\=\>\>\?\?\" \<SCS'SD9\" \<SESFSD9\<SG.
ErF0 S2\+_S3\-_S4\,_S5\*_S6\0_S7\0_S8\0_S9\._S:\._S;\/_S<\2_S=\2_S>\1_S?\1_S@\3_SA\3_SB\4_\4\$\%\(\)\&\'\7\5\6SG.
ErG " SH SI5      rHSJ rISK rJSL rKSM rLSN rMSpSO jrN " SP SQ5      rOSqSR\PSS\	\   4ST jjrQ/ SUQrR/ SVQrS/ SWQrTSXSXSXSYSSSZSZSZSZSZSZSZSZS[.rUSYSSSZSZS\S\S\S]S]S]S]S]S]S]S^.rVS_\4S` jrWSrSa\P4Sb jjrX    SsSc\
\\Y4   Sd\YSS\	\   S_\	\
\\4      4Se jjrZ " Sf Sg5      r[  StSR\PSS\	\   S_\	\
\P\\4      4Sh jjr\/ SiQr]   SuSc\
\\Y4   SS\	\   S_\	\
\P\\4      4Sj jjr^ " Sk Sl5      r_SqSR\PSS\	\   4Sm jjr`gs  sn f )va  AutoAugment, RandAugment, AugMix, and 3-Augment for PyTorch

This code implements the searched ImageNet policies with various tweaks and improvements and
does not include any of the search code.

AA and RA Implementation adapted from:
    https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/autoaugment.py

AugMix adapted from:
    https://github.com/google-research/augmix

3-Augment based on: https://github.com/facebookresearch/deit/blob/main/README_revenge.md

Papers:
    AutoAugment: Learning Augmentation Policies from Data - https://arxiv.org/abs/1805.09501
    Learning Data Augmentation Strategies for Object Detection - https://arxiv.org/abs/1906.11172
    RandAugment: Practical automated data augmentation... - https://arxiv.org/abs/1909.13719
    AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty - https://arxiv.org/abs/1912.02781
    3-Augment: DeiT III: Revenge of the ViT - https://arxiv.org/abs/2204.07118

Hacked together by / Copyright 2019, Ross Wightman
    N)partial)DictListOptionalUnion)ImageImageOpsImageEnhance
ImageChopsImageFilter.   )   r   r   g      $@   )translate_constimg_mean
Resamplingc                     U R                  S[        5      n[        U[        [        45      (       a  [
        R                  " U5      $ U$ )Nresample)pop_DEFAULT_INTERPOLATION
isinstancelisttuplerandomchoice)kwargsinterpolations     U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/data/auto_augment.py_interpolationr    5   s9    JJz+ABM-$//}}]++    c                 b    SU ;   a  [         S:  a  U R                  S5        [        U 5      U S'   g )N	fillcolor   r   r   )_PIL_VERr   r    )r   s    r   _check_args_tfr'   <   s,    fF!2

;'/F:r!   c           
      ~    [        U5        U R                  " U R                  [        R                  SUSSSS440 UD6$ N   r   r'   	transformsizer   AFFINEimgfactorr   s      r   shear_xr2   B   s7    6==5<<!VQ1a1HSFSSr!   c           
      ~    [        U5        U R                  " U R                  [        R                  SSSUSS440 UD6$ r)   r+   r/   s      r   shear_yr4   G   s7    6==5<<!Q61a1HSFSSr!   c           
          XR                   S   -  n[        U5        U R                  " U R                   [        R                  SSUSSS440 UD6$ )Nr   r*   r-   r'   r,   r   r.   r0   pctr   pixelss       r   translate_x_relr:   L   sG    88A;F6==5<<!Q1a1HSFSSr!   c           
          XR                   S   -  n[        U5        U R                  " U R                   [        R                  SSSSSU440 UD6$ r)   r6   r7   s       r   translate_y_relr<   R   sG    88A;F6==5<<!Q1a1HSFSSr!   c           
      ~    [        U5        U R                  " U R                  [        R                  SSUSSS440 UD6$ r)   r+   r0   r9   r   s      r   translate_x_absr?   X   s7    6==5<<!Q1a1HSFSSr!   c           
      ~    [        U5        U R                  " U R                  [        R                  SSSSSU440 UD6$ r)   r+   r>   s      r   translate_y_absrA   ]   s7    6==5<<!Q1a1HSFSSr!   c           	         [        U5        [        S:  a  U R                  " U40 UD6$ [        S:  Ga)  U R                  u  p4SnUS-  US-  4n[        R
                  " U5      * n[        [        R                  " U5      S5      [        [        R                  " U5      S5      S[        [        R                  " U5      * S5      [        [        R                  " U5      S5      S/nS n	U	" US   * US   -
  US	   * US	   -
  U5      u  US
'   US'   US
==   US   -  ss'   US==   US	   -  ss'   U R                  " U R                  [        R                  U40 UD6$ U R                  XS   S9$ )N)r%   r   r$   )r   r          @           c                 >    Uu  p4pVpxX0-  XA-  -   U-   X`-  Xq-  -   U-   4$ N )	xymatrixabcdefs	            r   r,   rotate.<locals>.transformt   s3    !'Q1515=1$aeaema&777r!   r   r*   r   r%   r   )r   )r'   r&   rotater-   mathradiansroundcossinr,   r   r.   )
r0   degreesr   wh
post_transrotn_centeranglerK   r,   s
             r   rS   rS   b   sX   66zz',V,,6xx
3wC(g&&$((5/2&$((5/2&488E?"B'$((5/2&
	8  )^Ojm+k!n_z!}-Lf 
q	6!9 	q	[^#	q	[^#	}}SXXu||VFvFF::gz(::;;r!   c                 .    [         R                  " U 5      $ rG   )r	   autocontrastr0   __s     r   auto_contrastrc      s      %%r!   c                 .    [         R                  " U 5      $ rG   )r	   invertra   s     r   re   re      s    ??3r!   c                 .    [         R                  " U 5      $ rG   )r	   equalizera   s     r   rg   rg      s    S!!r!   c                 .    [         R                  " X5      $ rG   )r	   solarize)r0   threshrb   s      r   ri   ri      s    S))r!   c                 &   / n[        S5       H8  nXR:  a  UR                  [        SXQ-   5      5        M'  UR                  U5        M:     U R                  S;   a7  U R                  S:X  a  [	        U5      S:X  a  XD-   U-   nU R                  U5      $ U $ )N      )LRGBro   )rangeappendminmodelenpoint)r0   addrj   rb   lutis         r   solarize_addry      s|    
C3Z:JJs3()JJqM	  xx<88uSS)c/Cyy~Jr!   c                 >    US:  a  U $ [         R                  " X5      $ )N   )r	   	posterize)r0   bits_to_keeprb   s      r   r|   r|      s     q
c00r!   c                 L    [         R                  " U 5      R                  U5      $ rG   )r
   Contrastenhancer0   r1   rb   s      r   contrastr      s      %--f55r!   c                 L    [         R                  " U 5      R                  U5      $ rG   )r
   Colorr   r   s      r   colorr      s    c"**622r!   c                 L    [         R                  " U 5      R                  U5      $ rG   )r
   
Brightnessr   r   s      r   
brightnessr      s    ""3'//77r!   c                 L    [         R                  " U 5      R                  U5      $ rG   )r
   	Sharpnessr   r   s      r   	sharpnessr      s    !!#&..v66r!   c                 L    U R                  [        R                  " US95      n U $ )Nradius)filterr   GaussianBlurr   s      r   gaussian_blurr      s     
**[--V<
=CJr!   c           	          SnSnU R                  [        R                  " [        R                  " X4U-  5      S95      n U $ )N皙?rC   r   )r   r   r   r   uniform)r0   r1   rb   
radius_min
radius_maxs        r   gaussian_blur_randr      s9    JJ
**[--V^^J]cPc5de
fCJr!   c                 ~    [        S[        SSU-
  5      5      n[        R                  " U 5      R	                  U5      $ )N      ?rE   )rr   maxr
   r   r   )r0   r1   _s      r   
desaturater      s5    SR&[)*Fc"**622r!   c                 >    [         R                   " 5       S:  a  U * $ U $ )zWith 50% prob, negate the value      ?)r   )vs    r   _randomly_negater      s    3&A2-A-r!   c                 6    U [         -  S-  n [        U 5      n U 4$ )Ng      >@_LEVEL_DENOMr   level_hparamss     r   _rotate_level_to_argr      "    \!S(EU#E6Mr!   c                 "    U [         -  S-  S-   4$ )Ng?r   )r   r   s     r   _enhance_level_to_argr      s    L C'#-..r!   c                 P    U [         -  S-  n [        SS[        U 5      -   5      n U 4$ )Ng?r   r   )r   r   r   r   s     r    _enhance_increasing_level_to_argr      s1     \!R'ES+E223E6Mr!   r   c                 f    U [         -  n X#U-
  U -  -   n U(       a  [        U[        X05      5      n U 4$ rG   )r   r   rr   )r   r   min_valmax_valclamps        r   _minmax_level_to_argr      s9    \!E(E11EGS016Mr!   c                 6    U [         -  S-  n [        U 5      n U 4$ )Ng333333?r   r   s     r   _shear_level_to_argr      r   r!   c                 R    US   nU [         -  [        U5      -  n [        U 5      n U 4$ )Nr   )r   floatr   )r   hparamsr   s      r   _translate_abs_level_to_argr      s2    /0O\!U?%;;EU#E6Mr!   c                 Z    UR                  SS5      nU [        -  U-  n [        U 5      n U 4$ )Ntranslate_pctg?)getr   r   )r   r   r   s      r   _translate_rel_level_to_argr      s2    KK6M\!]2EU#E6Mr!   c                 .    [        U [        -  S-  5      4$ N   intr   r   s     r   _posterize_level_to_argr      s     $)*++r!   c                 &    S[        X5      S   -
  4$ )Nr   r   )r   )r   r   s     r   "_posterize_increasing_level_to_argr     s     &u6q99::r!   c                 4    [        U [        -  S-  5      S-   4$ r   r   r   s     r    _posterize_original_level_to_argr     s!     $)*Q.//r!   c                 B    [        S[        U [        -  S-  5      5      4$ )Nrl   rr   r   r   r   s     r   _solarize_level_to_argr     s#     sC-45677r!   c                 &    S[        X5      S   -
  4$ )Nrl   r   )r   r   s     r   !_solarize_increasing_level_to_argr     s     '8;;<<r!   c                 B    [        S[        U [        -  S-  5      5      4$ )Nr   n   r   r   s     r   _solarize_add_level_to_argr   !  s!    sC-45677r!   AutoContrastEqualizeInvertRotate	PosterizePosterizeIncreasingPosterizeOriginalSolarizeSolarizeIncreasingSolarizeAddr   ColorIncreasingr   ContrastIncreasingr   BrightnessIncreasingr   r   )r   r   r   rC   )
SharpnessIncreasingShearXShearY
TranslateX
TranslateYTranslateXRelTranslateYRel
Desaturater   GaussianBlurRandc                   *    \ rS rSrSS jrS rS rSrg)	AugmentOpie  Nc                    U=(       d    [         nXl        [        U   U l        [        U   U l        X l        X0l        UR                  5       U l	        [        SU;   a  US   O[        SU;   a  US   O[        S9U l        U R                  R                  SS5      U l        U R                  R                  SS 5      U l        g )Nr   r   )r#   r   magnitude_stdr   magnitude_max)_HPARAMS_DEFAULTname
NAME_TO_OPaug_fnLEVEL_TO_ARGlevel_fnprob	magnitudecopyr   dict_FILL_RANDOM_INTERPOLATIONr   r   r   r   )selfr   r   r   r   s        r   __init__AugmentOp.__init__g  s    --	 &$T*	"||~-77-Bgj)1@G1KW_-Qf
 "\\--oqA!\\--otDr!   c                 f   U R                   S:  a%  [        R                  " 5       U R                   :  a  U$ U R                  nU R                  S:  aa  U R                  [	        S5      :X  a  [        R
                  " SU5      nO0U R                  S:  a   [        R                  " X R                  5      nU R                  =(       d    [        n[        S[        X#5      5      nU R                  b  U R                  X R                  5      O	[        5       nU R                  " U/UQ70 U R                  D6$ )Nr   r   infrE   )r   r   r   r   r   r   gaussr   r   r   rr   r   r   r   r   r   )r   r0   r   upper_bound
level_argss        r   __call__AugmentOp.__call__|  s    99s?v}}:JNN	!!!U5\1"NN1i8	##a'"LL4F4FG	 ((8LC	78	?C}}?XT]]9ll;^c^e
{{3;;t{{;;r!   c                     U R                   R                  SU R                   SU R                   3-   nUSU R                   SU R
                   3-  nU R                  b  USU R                   3-  nUS-  nU$ )Nz(name=z, p=z, m=z, mstd=z, mmax=))	__class____name__r   r   r   r   r   )r   fss     r   __repr__AugmentOp.__repr__  s    ^^$$		{$tyyk'JJ
T^^$GD,>,>+?@@)GD../00B
c		r!   )	r   r   r   r   r   r   r   r   r   )r   
   Nr  
__module____qualname____firstlineno__r   r   r  __static_attributes__rH   r!   r   r   r   e  s    E*<$r!   r   c                    SS/SS/SS/SS/S	S
/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/S S!/S"S#/S$S%/S&S'/S(S)/S*S+/S,S-/SS./S/S0//nU VVs/ s H  o" Vs/ s H  n[        US1U 06PM     snPM      nnnU$ s  snf s  snnf )2Nr   皙?r*   r   r  r   r   皙?	   r   333333?   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   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   r  r  r   rE   r   r   r  r   r   r  r   r   r  r   r   r   r   r   r  r   r   r  r   r   rE   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   policysprL   pcs        r   auto_augment_policy_v0rH    s*    
12	01	./	34	34	01	67	/0	01	/0	12	01	 89	01	12	67	12	./	./	34	78	45	 56	34	./3F6 BH	H22
62a9a))2
6B	HI 7	H   	BA=1B=Bc                    SS/SS/SS/SS/S	S
/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/S S!/S"S#/S$S%/S&S'/S(S)/S*S+/S,S-/SS./S/S0//nU VVs/ s H  o" Vs/ s H  n[        US1U 06PM     snPM      nnnU$ s  snf s  snnf )2Nr  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  )r   r  r   r?  r@  rA  rB  r   rC  rD  s        r   auto_augment_policy_v0rrL    s*    
12	01	./	34	34	01	67	/0	01	/0	12	01	(*BC	01	12	67	12	./	./	34	78	45	(*?@	34	./3F6 BH	H22
62a9a))2
6B	HI 7	HrI  c                    SS/SS/SS/SS/S	S
/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/S S!/S"S#/SS/S	S
/SS/SS/SS/SS//nU VVs/ s H  o" Vs/ s H  n[        US$U 06PM     snPM      nnnU$ s  snf s  snnf )%N)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$  r   r  r  r-  r   r  r{   )r   r  r+  r   r  r   r   r  r  r   r  r   r   rE   r  r   r  r   r   r   r{   r6  r   r   r{   r   r   r   r   r  r{   r   r  r  r   r  r  r   r  r{   r   r  r%   r'  r   rC  rD  s        r   auto_augment_policy_originalrd    s*    
'(:;	78	34	&(EF	34	12	34	&(<=	12	<=	./	12	34	12	01	./	01	 23	12	01	34	78	12	01	343F6 BH	H22
62a9a))2
6B	HI 7	HrI  c                    SS/SS/SS/SS/S	S
/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/SS/S S!/S"S#/SS/S	S
/SS/SS/SS/SS//nU VVs/ s H  o" Vs/ s H  n[        US$U 06PM     snPM      nnnU$ s  snf s  snnf )%N)r   r  r{   rN  rO  rP  r  r  )r   r  r  )r   r  r+  r  r/  rQ  rR  rS  rT  )r   r  r%   r$  rU  r-  rV  rK  rW  rX  rY  rZ  r[  r\  r6  r]  r^  r_  r`  ra  rb  rc  r'  r   rC  rD  s        r   auto_augment_policy_originalrrf    s*    
)*<=	78	34	(*IJ	34	12	34	(*>?	12	>?	./	12	34	12	01	./	01	 23	12	01	34	78	12	01	343F6 BH	H22
62a9a))2
6B	HI 7	HrI  c                     S/S/S//nU VVs/ s H  o" Vs/ s H  n[        USU 06PM     snPM      nnnU$ s  snf s  snnf )N)r   r   r%   )r   r   r  )r   r   r  r   rC  rD  s        r   auto_augment_policy_3arh    sY    		 !	&'F
 BH	H22
62a9a))2
6B	HI 7	Hs   	=8==c                     U=(       d    [         nU S:X  a  [        U5      $ U S:X  a  [        U5      $ U S:X  a  [        U5      $ U S:X  a  [	        U5      $ U S:X  a  [        U5      $  SU  35       e)Noriginal	originalrv0v0r3azUnknown AA policy )r   rd  rf  rH  rL  rh  )r   r   s     r   auto_augment_policyro  &  s{    ))Gz+G44{,W55t|%g..u}&w//t|%g..-&tf--5r!   c                   &    \ rS rSrS rS rS rSrg)AutoAugmenti5  c                     Xl         g rG   rE  )r   rE  s     r   r   AutoAugment.__init__7  s    r!   c                 h    [         R                  " U R                  5      nU H  nU" U5      nM     U$ rG   )r   r   rE  )r   r0   
sub_policyops       r   r   AutoAugment.__call__:  s,    ]]4;;/
BS'C 
r!   c           
          U R                   R                  S-   nU R                   H;  nUS-  nUSR                  U Vs/ s H  n[	        U5      PM     sn5      -  nUS-  nM=     US-  nU$ s  snf )Nz(policy=z
	[z, ]r   )r  r  rE  joinstr)r   r  prw  s       r   r  AutoAugment.__repr__@  sq    ^^$$z1A'MB$))q1qSWq122B#IB  	c		 2s   A,rs  Nr  rH   r!   r   rq  rq  5  s    r!   rq  
config_strr   c                     U R                  S5      nUS   nUSS nU HZ  n[        R                   " SU5      n[        U5      S:  a  M+  USS u  pgUS:X  a  UR                  S[	        U5      5        MU   S	5       e   [        X1S
9n[        U5      $ )ak  Create a AutoAugment transform

Args:
    config_str: String defining configuration of auto augmentation. Consists of multiple sections separated by
        dashes ('-').
        The first section defines the AutoAugment policy (one of 'v0', 'v0r', 'original', 'originalr').
        While the remaining sections define other arguments
            * 'mstd' -  float std deviation of magnitude noise applied
    hparams: Other hparams (kwargs) for the AutoAugmentation scheme

Returns:
     A PyTorch compatible Transform

Examples::

    'original-mstd0.5' results in AutoAugment with original policy, magnitude_std 0.5
-r   r*   N(\d.*)r   mstdr   z"Unknown AutoAugment config section)r   )splitrert   
setdefaultr   ro  rq  )	r  r   configpolicy_namerN   cskeyval	aa_policys	            r   auto_augment_transformr  J  s    $ c"F)KABZFXXi#r7Q;bq6&=c
;>>>5  $KAIy!!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   r   r   r   r   r   r   r   r   r   r   r   r   r   g      ?g?)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
transformsc                     [        [        U R                  5       6 5      u  p[        R                  " U5      nU[        R
                  " U5      -  nX4$ rG   )r   zipitemsnparraysum)r  probss     r   _get_weighted_transformsr    sE    S*"2"2"456JHHUOEBFF5M!Er!   r   c                 p    U S:X  a  [         $ U S:X  a  [        $ U S:X  a  [        $ U(       a  [        $ [        $ )Nweights3awrn  )_RAND_WEIGHTED_0_RAND_WEIGHTED_3A_RAND_3A_RAND_INCREASING_TRANSFORMS_RAND_TRANSFORMS)r   
increasings     r   rand_augment_choicesr    s8    yu}  t|*4&J:JJr!   r   r   c           
      ~    U=(       d    [         nU=(       d    [        nU Vs/ s H  n[        XAXS9PM     sn$ s  snf )Nr   r   r   )r   r  r   )r   r   r   r  r   s        r   rand_augment_opsr    sM     ))G//JKUWKU4 9?KUW W Ws   :c                   *    \ rS rSrSS jrS rS rSrg)RandAugmenti  Nc                 (    Xl         X l        X0l        g rG   )ops
num_layerschoice_weights)r   r  r  r  s       r   r   RandAugment.__init__  s    $,r!   c                     [         R                  R                  U R                  U R                  U R
                  S L U R
                  S9nU H  nU" U5      nM     U$ )N)replacer}  )r  r   r   r  r  r  )r   r0   r  rw  s       r   r   RandAugment.__call__  sZ    iiHHOO''4/!!	  
 BS'C 
r!   c                     U R                   R                  SU R                   S3-   nU R                   H  nUSU 3-  nM     US-  nU$ )Nz(n=, ops=
	r   )r  r  r  r  r   r  rw  s      r   r  RandAugment.__repr__  sP    ^^$$T__,=V'DD((BD+B 
c		r!   )r  r  r  )r   Nr  rH   r!   r   r  r    s    -

r!   r  c                 j   [         nSnSnSnU R                  S5      nUS   S:X  d   eUSS nU GH  nUR                  S	5      (       a  [        USS 5      n	Uc  U	nM/  M1  [        R                  " S
U5      n
[        U
5      S:  a  MY  U
SS u  pUS:X  a0  [        U	5      nUS:  a  [        S5      nUR                  SU5        M  US:X  a  UR                  S[        U	5      5        M  US:X  a  [        U	5      (       a  SnM  M  US:X  a  [        U	5      nM  US:X  a  [        U	5      nM  US:X  a  [        U	5      nGM   S5       e   [        U[        5      (       a
  [        X%S9nOUc  U(       a  [        O[        nSn[        U[        5      (       a  [        U5      u  p-[!        X6XS9n[#        XUS9$ )a  Create a RandAugment transform

Args:
    config_str (str): String defining configuration of random augmentation. Consists of multiple sections separated
        by dashes ('-'). The first section defines the specific variant of rand augment (currently only 'rand').
        The remaining sections, not order specific determine
            * 'm' - integer magnitude of rand augment
            * 'n' - integer num layers (number of transform ops selected per image)
            * 'p' - float probability of applying each layer (default 0.5)
            * 'mstd' -  float std deviation of magnitude noise applied, or uniform sampling if infinity (or > 100)
            * 'mmax' - set upper bound for magnitude to something other than default of  _LEVEL_DENOM (10)
            * 'inc' - integer (bool), use augmentations that increase in severity with magnitude (default: 0)
            * 't' - str name of transform set to use
    hparams (dict): Other hparams (kwargs) for the RandAugmentation scheme

Returns:
     A PyTorch compatible Transform

Examples::

    'rand-m9-n3-mstd0.5' results in RandAugment with magnitude 9, num_layers 3, magnitude_std 0.5

    'rand-mstd1-tweights' results in mag std 1.0, weighted transforms, default mag of 10 and num_layers 2

r   Fr   r  r   randr*   Ntr  r  d   r   r   mmaxr   incTmnr}  z"Unknown RandAugment config section)r  )r   r   r   r  )r  )r   r  
startswithr|  r  rt   r   r  r   boolr   r  r  r  r   r  r  r  )r  r   r  r   r  r  r   r  rN   r  r  r  r  r  ra_opss                  r   rand_augment_transformr    s   < IJJDc"F!9ABZF<<ae*C! 
 " )Q'B2w{"1vHCf}Sz#: <D""?D9""?CH=99!%J H	 X
SzBBBuA D *c"")*L
		4>0DT
N*d##%=j%I"
	geFv.IIr!   )r   r   r   r   r   r   r   r   r   r   r   r   r   c           
          U=(       d    [         nU=(       d    [        nU Vs/ s H  n[        USU US9PM     sn$ s  snf )Nr   r  )r   _AUGMIX_TRANSFORMSr   )r   r   r  r   s       r   
augmix_opsr  _  sV    
 ))G11J 
 $ 	
   s   <c                   @    \ rS rSrSrSS jrS rS rS rS r	S r
S	rg
)AugMixAugmentin  zAugMix Transform
Adapted and improved from impl here: https://github.com/google-research/augmix/blob/master/imagenet.py
From paper: 'AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty -
https://arxiv.org/abs/1912.02781
c                 @    Xl         X l        X0l        X@l        XPl        g rG   )r  alphawidthdepthblended)r   r  r  r  r  r  s         r   r   AugMixAugment.__init__t  s    


r!   c                     X-  nSn/ nUS S S2    H   nXS-  nUSU-
  -  nUR                  U5        M"     [        R                  " US S S2   [        R                  S9$ )Nr   r*   dtype)rq   r  r  float32)r   wsr  cumprwsrZ   r  s          r   _calc_blended_weights#AugMixAugment._calc_blended_weights{  se    VDbDAHEQYDJJu  xxDbD	44r!   c                 x   UR                  5       nU R                  X#5      nU H  nU R                  S:  a  U R                  O[        R                  R                  SS5      n[        R                  R                  U R                  USS9nUn	U H  n
U
" U	5      n	M     [        R                  " XU5      nM     U$ )Nr   r*   r   Tr  )
r   r  r  r  r   randintr   r  r   blend)r   r0   mixing_weightsr  img_origr  rZ   r  r  img_augrw  s              r   _apply_blendedAugMixAugment._apply_blended  s    
 88:'':A"&**q.DJJbii6G6G16ME))""488UD"ACGW+ ++cA.C  
r!   c                    UR                   S   UR                   S   [        UR                  5       5      4n[        R                  " U[        R
                  S9nU H  nU R                  S:  a  U R                  O[        R                  R                  SS5      n[        R                  R                  U R                  USS9nUn	U H  n
U
" U	5      n	M     XV[        R                  " U	[        R
                  S9-  -  nM     [        R                  " USSUS9  [        R                  " UR                  [        R                   5      5      n[        R"                  " XU5      $ )	Nr   r*   r  r   Tr  g     o@)out)r-   rt   getbandsr  zerosr  r  r   r  r   r  asarrayclipr   	fromarrayastypeuint8r  )r   r0   r  r  	img_shapemixedmwr  r  r  rw  s              r   _apply_basicAugMixAugment._apply_basic  s    HHQK!c#,,..AA	"**5 B"&**q.DJJbii6G6G16ME))""488UD"ACGW+ "**WBJJ???E ! 	q$E*RXX 67{{3q))r!   c                    [         R                  " [         R                  R                  U R                  /U R
                  -  5      5      n[         R                  " [         R                  R                  U R                  U R                  5      5      nU R                  (       a  U R                  XU5      nU$ U R                  XU5      nU$ rG   )
r  r  r   	dirichletr  r  betar  r  r  )r   r0   r  r  r  s        r   r   AugMixAugment.__call__  s    BII$7$7tzz8Q$RSJJryy~~djj$**=><<''Q?E  %%c1=Er!   c                     U R                   R                  SU R                   SU R                   SU R                   S3-   nU R
                   H  nUSU 3-  nM     US-  nU$ )Nz(alpha=z, width=z, depth=r  r  r   )r  r  r  r  r  r  r  s      r   r  AugMixAugment.__repr__  si    ^^$$HTZZLPXY]YcYcXddj'kk((BD+B 
c		r!   )r  r  r  r  r  N)r   r  r  F)r  r  r	  r
  __doc__r   r  r  r  r   r  r  rH   r!   r   r  r  n  s%    
5 *"r!   r  c                 4   SnSnSnSnSnU R                  S5      nUS   S:X  d   eUSS	 nU H  n[        R                   " S
U5      n	[        U	5      S:  a  M+  U	S	S u  pU
S:X  a  UR                  S[	        U5      5        MU  U
S:X  a  [        U5      nMh  U
S:X  a  [        U5      nM{  U
S:X  a  [        U5      nM  U
S:X  a  [	        U5      nM  U
S:X  a  [        U5      nM   S5       e   UR                  S[	        S5      5        [        X!S9n[        XX4US9$ )a  Create AugMix PyTorch transform

Args:
    config_str (str): String defining configuration of random augmentation. Consists of multiple sections separated
        by dashes ('-'). The first section defines the specific variant of rand augment (currently only 'rand').
        The remaining sections, not order specific determine
            'm' - integer magnitude (severity) of augmentation mix (default: 3)
            'w' - integer width of augmentation chain (default: 3)
            'd' - integer depth of augmentation chain (-1 is random [1, 3], default: -1)
            'b' - integer (bool), blend each branch of chain into end result without a final blend, less CPU (default: 0)
            'mstd' -  float std deviation of magnitude noise applied (default: 0)
        Ex 'augmix-m5-w4-d2' results in AugMix with severity 5, chain width 4, chain depth 2

    hparams: Other hparams (kwargs) for the Augmentation transforms

Returns:
     A PyTorch compatible Transform
r  r  r   Fr  r   augmixr*   Nr  r   r  r   r  rZ   rO   rL   rM   zUnknown AugMix config sectionr   )r   r   )r  r  r  r  )	r  r  rt   r  r   r   r  r  r  )r  r   r   r  r  r  r  r  rN   r  r  r  r  s                r   augment_and_mix_transformr    s$   & IEEEGc"F!9   ABZFXXi#r7Q;bq6&=c
;CZCICZHECZHECZ#JECZ3iG9995' ( e5
y
:CWUUr!   )r   )rE   r   T)rl  NrG   )T)r  r   NN)NN)r  NN)ar  r   rT   r  	functoolsr   typingr   r   r   r   PILr   r	   r
   r   r   numpyr  r   __version__r  r   r&   r   r   r   r   hasattrr   BILINEARBICUBICr   r   r    r'   r2   r4   r:   r<   r?   rA   rS   rc   re   rg   ri   ry   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   rH  rL  rd  rf  rh  ro  rq  r|  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  )rI   s   0r   <module>r     s  ,   	  . . F F 
  #//"7"7"<Ra"@A"@Q#a&"@AB 
 5,"--668H8H8P8PQ"--55"^^U]];"]]0T
T
TTT
T
<>& "* 16387
3.
/
,;08=8
D d "	 ( = 9 & ; - " 7 % :  '!" <#$ &%& <!!--00.SI0#sK,9@M f f	
  9   ( < U u  ( *  J!" #$ %!!$$!*7
>/ /dBDBB. * "s  "Xd^  "F ( (  *  & Ks K (*"&26		We$	W	W $	W U4:./		W 8 #'7;QJQJ$QJ U3d?34QJh $ (*"&7;e$$ U3d?34F FR1V# 1V 1Vk Bs   K-