
    Ngފ                        d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZmZmZ ddlZddlZ ed ej                            d          dd         D                       Zd	Zd
Z ede          Z eed          r%ej        j        ej        j        fZej        j        Z nej        ej        fZej        Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-dtdZ.d Z/d Z0d Z1d  Z2d! Z3d" Z4d# Z5d$ Z6d% Z7d& Z8d' Z9d( Z:dud,Z;d- Z<d. Z=d/ Z>d0 Z?d1 Z@d2 ZAd3 ZBd4 ZCd5 ZDi d6dd7dd8dd9e8d:e?d;e@d<eAd=eBd>eCd?eDd@e9dAe:dBe9dCe:dDe9dEe:dFe9e:e<e<e=e=e>e> ee;dGd*H           ee;dIdJH          e;dK
ZEi d6e*d7e,d8e+d9e)d:e/d;e/d<e/d=e-d>e-d?e.d@e1dAe1dBe0dCe0dDe2dEe2dFe3e3e#e$e'e(e%e&e6e4e5dK
ZF G dL dM          ZGdN ZHdO ZIdP ZJdQ ZKdR ZLdvdTZM G dU dV          ZNdwdWeOdXe	e         fdYZPg dZZQg d[ZRg d\ZSd]d]d]d^ddd_d_d_d_d_d_d_d_d`ZTd^ddd_d_dadadadbdbdbdbdbdbdbdcZUddefdeZVdxdfeOfdgZW	 	 	 	 dydie
eXeYf         djeYdXe	e         dde	e
eef                  fdkZZ G dl dm          Z[	 	 dzdWeOdXe	e         dde	e
eOeef                  fdnZ\g doZ]	 	 	 d{die
eXeYf         dXe	e         dde	e
eOeef                  fdpZ^ G dq dr          Z_dwdWeOdXe	e         fdsZ`dS )|a   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ImageFilterc                 ,    g | ]}t          |          S  )int).0xs     R/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/data/auto_augment.py
<listcomp>r   "   s    AAAQ#a&&AAA    .   )   r   r   g      $@   )translate_constimg_mean
Resamplingc                     |                      dt                    }t          |t          t          f          rt          j        |          S |S )Nresample)pop_DEFAULT_INTERPOLATION
isinstancelisttuplerandomchoice)kwargsinterpolations     r   _interpolationr'   5   sB    JJz+ABBM-$// ,}]+++r   c                 r    d| v r t           dk     r|                     d           t          |           | d<   d S )N	fillcolor   r   r   )_PIL_VERr   r'   )r%   s    r   _check_args_tfr-   <   sA    fF!2!2

;'//F:r   c           
      j    t          |            | j        | j        t          j        d|ddddffi |S N   r   r-   	transformsizer   AFFINEimgfactorr%   s      r   shear_xr8   B   s?    63=5<!VQ1a1HSSFSSSr   c           
      j    t          |            | j        | j        t          j        ddd|ddffi |S r/   r1   r5   s      r   shear_yr:   G   s?    63=5<!Q61a1HSSFSSSr   c           
          || j         d         z  }t          |            | j        | j         t          j        dd|dddffi |S )Nr   r0   r3   r-   r2   r   r4   r6   pctr%   pixelss       r   translate_x_relr@   L   sO    38A;F63=5<!Q1a1HSSFSSSr   c           
          || j         d         z  }t          |            | j        | j         t          j        ddddd|ffi |S r/   r<   r=   s       r   translate_y_relrB   R   sO    38A;F63=5<!Q1a1HSSFSSSr   c           
      j    t          |            | j        | j        t          j        dd|dddffi |S r/   r1   r6   r?   r%   s      r   translate_x_absrE   X   s?    63=5<!Q1a1HSSFSSSr   c           
      j    t          |            | j        | j        t          j        ddddd|ffi |S r/   r1   rD   s      r   translate_y_absrG   ]   s?    63=5<!Q1a1HSSFSSSr   c           	         t          |           t          dk    r | j        |fi |S t          dk    r8| j        \  }}d}|dz  |dz  f}t	          j        |           }t          t	          j        |          d          t          t	          j        |          d          dt          t	          j        |           d          t          t	          j        |          d          dg}d }	 |	|d          |d         z
  |d	          |d	         z
  |          \  |d
<   |d<   |d
xx         |d         z  cc<   |dxx         |d	         z  cc<    | j	        | j        t          j        |fi |S |                     ||d                   S )N)r+   r   r*   )r   r          @           c                 L    |\  }}}}}}|| z  ||z  z   |z   || z  ||z  z   |z   fS Nr   )	r   ymatrixabcdefs	            r   r2   zrotate.<locals>.transformt   sA    !'Q1aAq51q5=1$a!ea!ema&777r   r   r0   r   r+   r   )r   )r-   r,   rotater3   mathradiansroundcossinr2   r   r4   )
r6   degreesr%   wh
post_transrotn_centeranglerO   r2   s
             r   rV   rV   b   s   66sz',,V,,,6x1
3wC(g&&&$(5//2&&$(5//2&&48E??"B''$(5//2&&
	8 	8 	8  )y^Ojm+k!n_z!}-Lf 
  
q	6!9 	q			[^#			q			[^#			s}SXu|VFFvFFF::gz(::;;;r   c                 *    t          j        |           S rM   )r	   autocontrastr6   __s     r   auto_contrastrf      s     %%%r   c                 *    t          j        |           S rM   )r	   invertrd   s     r   rh   rh      s    ?3r   c                 *    t          j        |           S rM   )r	   equalizerd   s     r   rj   rj      s    S!!!r   c                 ,    t          j        | |          S rM   )r	   solarize)r6   threshre   s      r   rl   rl      s    S&)))r   r   c                 :   g }t          d          D ]D}||k     r'|                    t          d||z                        /|                    |           E| j        dv r;| j        dk    rt	          |          dk    r||z   |z   }|                     |          S | S )N      )LRGBrr   )rangeappendminmodelenpoint)r6   addrm   re   lutis         r   solarize_addr|      s    
C3ZZ  v::JJs3C(())))JJqMMMM
x<8uSS)c/Cyy~~Jr   c                 <    |dk    r| S t          j        | |          S )N   )r	   	posterize)r6   bits_to_keepre   s      r   r   r      s%    q
c<000r   c                 P    t          j        |                               |          S rM   )r
   Contrastenhancer6   r7   re   s      r   contrastr      s!     %%--f555r   c                 P    t          j        |                               |          S rM   )r
   Colorr   r   s      r   colorr      s!    c""**6222r   c                 P    t          j        |                               |          S rM   )r
   
Brightnessr   r   s      r   
brightnessr      s!    "3''//777r   c                 P    t          j        |                               |          S rM   )r
   	Sharpnessr   r   s      r   	sharpnessr      s!    !#&&..v666r   c                 V    |                      t          j        |                    } | S )Nradius)filterr   GaussianBlurr   s      r   gaussian_blurr      s&    
**[-V<<<
=
=CJr   c           	          d}d}|                      t          j        t          j        |||z                                } | S )N皙?rI   r   )r   r   r   r#   uniform)r6   r7   re   
radius_min
radius_maxs        r   gaussian_blur_randr      sC    JJ
**[-V^JPZ]cPc5d5deee
f
fCJr   c                     t          dt          dd|z
                      }t          j        |                               |          S )N      ?rK   )ru   maxr
   r   r   )r6   r7   _s      r   
desaturater      s>    SR&[))**Fc""**6222r   c                 :    t          j                     dk    r|  n| S )zWith 50% prob, negate the value      ?)r#   )vs    r   _randomly_negater      s    3&&A22A-r   c                 @    | t           z  dz  } t          |           } | fS )Ng      >@_LEVEL_DENOMr   level_hparamss     r   _rotate_level_to_argr      %    \!S(EU##E6Mr   c                 $    | t           z  dz  dz   fS )Ng?r   )r   r   s     r   _enhance_level_to_argr      s    L C'#-..r   c                 b    | t           z  dz  } t          ddt          |           z             } | fS )Ng?r   r   )r   r   r   r   s     r    _enhance_increasing_level_to_argr      s7     \!R'ES+E22233E6Mr   rK   r   Tc                 r    | t           z  } |||z
  | z  z   } |rt          |t          ||                     } | fS rM   )r   r   ru   )r   r   min_valmax_valclamps        r   _minmax_level_to_argr      sH    \!Ew(E11E 2GS%00116Mr   c                 @    | t           z  dz  } t          |           } | fS )Ng333333?r   r   s     r   _shear_level_to_argr      r   r   c                 j    |d         }| t           z  t          |          z  } t          |           } | fS )Nr   )r   floatr   )r   hparamsr   s      r   _translate_abs_level_to_argr      s8    /0O\!U?%;%;;EU##E6Mr   c                 l    |                     dd          }| t          z  |z  } t          |           } | fS )Ntranslate_pctg?)getr   r   )r   r   r   s      r   _translate_rel_level_to_argr      s8    KK66M\!]2EU##E6Mr   c                 8    t          | t          z  dz            fS N   r   r   r   s     r   _posterize_level_to_argr      s     $)**++r   c                 6    dt          | |          d         z
  fS )Nr   r   )r   )r   r   s     r   "_posterize_increasing_level_to_argr     s"     &ug66q99::r   c                 >    t          | t          z  dz            dz   fS r   r   r   s     r    _posterize_original_level_to_argr     s$     $)**Q.//r   c                 T    t          dt          | t          z  dz                      fS )Nro   ru   r   r   r   s     r   _solarize_level_to_argr     s)     sC-4556677r   c                 6    dt          | |          d         z
  fS )Nro   r   )r   r   s     r   !_solarize_increasing_level_to_argr     s"     'x88;;<<r   c                 T    t          dt          | t          z  dz                      fS )Nr   n   r   r   s     r   _solarize_add_level_to_argr   !  s'    sC-4556677r   AutoContrastEqualizeInvertRotate	PosterizePosterizeIncreasingPosterizeOriginalSolarizeSolarizeIncreasingSolarizeAddr   ColorIncreasingr   ContrastIncreasingr   BrightnessIncreasingr   r   )r   r   r   rI   )
SharpnessIncreasingShearXShearY
TranslateX
TranslateYTranslateXRelTranslateYRel
Desaturater   GaussianBlurRandc                   "    e Zd ZddZd Zd ZdS )	AugmentOpr   
   Nc                    |pt           }|| _        t          |         | _        t          |         | _        || _        || _        |                                | _	        t          d|v r|d         nt          d|v r|d         nt                    | _        | j	                            dd          | _        | j	                            dd           | _        d S )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__zAugmentOp.__init__g  s    --	 &$T*	"||~~-77-B-Bgj))1@G1K1KW_--Qf
 
 
 "\--oqAA!\--otDDr   c                    | j         dk     rt          j                    | j         k    r|S | j        }| j        dk    rS| j        t	          d          k    rt          j        d|          }n%| j        dk    rt          j        || j                  }| j        pt          }t          dt          ||                    }| j        |                     || j                  nt                      } | j        |g|R i | j        S )Nr   r   infrK   )r   r#   r   r   r   r   gaussr   r   r   ru   r   r   r"   r   r%   )r   r6   r   upper_bound
level_argss        r   __call__zAugmentOp.__call__|  s    9s??v}::JN	!!!U5\\11"N1i88		#a''"LD4FGG	 (8LC	;7788	?C}?XT]]9dl;;;^c^e^e
t{3;;;;t{;;;r   c                     | j         j        d| j         d| j         z   }|d| j         d| j         z  }| j        |d| j         z  }|dz  }|S )Nz(name=z, p=z, m=z, mstd=z, mmax=))	__class____name__r   r   r   r   r   )r   fss     r   __repr__zAugmentOp.__repr__  ss    ^$'J	'J'Jty'J'JJ
@T^@@D,>@@@)0D.000B
c		r   )r   r   Nr  
__module____qualname__r   r   r  r   r   r   r   r   e  sJ        E E E E*< < <$    r   r   c                      ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gdd.gd/d0gg} fd1|D             }|S )2Nr   皙?r0   r   r  r   r   皙?	   r   333333?   r   r  r0   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  r0   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   rK   r   r   r  r   r   r  r   r   r  r   r   r   r   r   r  r   r   r  r   r   rK   r~   r   r   r   r   r  r   r   r  r  r   r  r  )r   r  r   r   r  r   r   r  r0   r   r  r(  r   r  r+   c                 ,    g | ]}fd |D             S )c                 (    g | ]}t          |d iS r   r   r   rP   r   s     r   r   z5auto_augment_policy_v0.<locals>.<listcomp>.<listcomp>  &    
6
6
6a9a)))
6
6
6r   r   r   spr   s     r   r   z*auto_augment_policy_v0.<locals>.<listcomp>  .    	H	H	H2
6
6
6
62
6
6
6	H	H	Hr   r   r   policypcs   `  r   auto_augment_policy_v0rL    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 
I	H	H	H	H	H	HBIr   c                      ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gdd.gd/d0gg} fd1|D             }|S )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,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  )r   r  r   r<  r=  r>  r?  c                 ,    g | ]}fd |D             S )c                 (    g | ]}t          |d iS rB  rC  rD  s     r   r   z6auto_augment_policy_v0r.<locals>.<listcomp>.<listcomp>  rE  r   r   rF  s     r   r   z+auto_augment_policy_v0r.<locals>.<listcomp>  rH  r   r   rI  s   `  r   auto_augment_policy_v0rrQ    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 
I	H	H	H	H	H	HBIr   c                      ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gddgd	d
gddgddgddgddgg} fd$|D             }|S )%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   rK   r  r   r  r   r   r   r~   r3  r   r   r~   r   r   r   r   r  r~   r   r  r  r   r  r  r   r  r~   r   r  r+   r$  c                 ,    g | ]}fd |D             S )c                 (    g | ]}t          |d iS rB  rC  rD  s     r   r   z;auto_augment_policy_original.<locals>.<listcomp>.<listcomp>  rE  r   r   rF  s     r   r   z0auto_augment_policy_original.<locals>.<listcomp>  rH  r   r   rI  s   `  r   auto_augment_policy_originalrk    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 
I	H	H	H	H	H	HBIr   c                      ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gddgd	d
gddgddgddgddgg} fd$|D             }|S )%N)r   r  r~   rS  rT  rU  r  r  )r   r  r  )r   r  r(  r  r,  rV  rW  rX  rY  )r   r  r+   r!  rZ  r*  r[  rN  r\  r]  r^  r_  r`  ra  r3  rb  rc  rd  re  rf  rg  rh  r$  c                 ,    g | ]}fd |D             S )c                 (    g | ]}t          |d iS rB  rC  rD  s     r   r   z<auto_augment_policy_originalr.<locals>.<listcomp>.<listcomp>  rE  r   r   rF  s     r   r   z1auto_augment_policy_originalr.<locals>.<listcomp>  rH  r   r   rI  s   `  r   auto_augment_policy_originalrro    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 
I	H	H	H	H	H	HBIr   c                 4     dgdgdgg} fd|D             }|S )N)r   r   r+   )r   r   r   )r   r   r   c                 ,    g | ]}fd |D             S )c                 (    g | ]}t          |d iS rB  rC  rD  s     r   r   z5auto_augment_policy_3a.<locals>.<listcomp>.<listcomp>"  rE  r   r   rF  s     r   r   z*auto_augment_policy_3a.<locals>.<listcomp>"  rH  r   r   rI  s   `  r   auto_augment_policy_3ars    s=    		 !	&'F
 
I	H	H	H	H	H	HBIr   v0c                     |pt           }| dk    rt          |          S | dk    rt          |          S | dk    rt          |          S | dk    rt	          |          S | dk    rt          |          S J d|              )Noriginal	originalrrt  v0r3aFzUnknown AA policy )r   rk  ro  rL  rQ  rs  )r   r   s     r   auto_augment_policyrz  &  s    ))Gz+G444{,W555t||%g...u}}&w///t||%g...--t-----r   c                        e Zd Zd Zd Zd ZdS )AutoAugmentc                     || _         d S rM   )rJ  )r   rJ  s     r   r   zAutoAugment.__init__7  s    r   c                 X    t          j        | j                  }|D ]} ||          }|S rM   )r#   r$   rJ  )r   r6   
sub_policyops       r   r   zAutoAugment.__call__:  s6    ]4;//
 	 	B"S''CC
r   c                     | j         j        dz   }| j        D ].}|dz  }|d                    d |D                       z  }|dz  }/|dz  }|S )Nz(policy=z
	[z, c                 ,    g | ]}t          |          S r   )str)r   r  s     r   r   z(AutoAugment.__repr__.<locals>.<listcomp>D  s    111SWW111r   ]r  )r  r  rJ  join)r   r  ps      r   r  zAutoAugment.__repr__@  si    ^$z1 	 	A'MB$))11q111222B#IBB
c		r   Nr  r   r   r   r|  r|  5  sA                r   r|  
config_strr   c                 l   |                      d          }|d         }|dd         }|D ]k}t          j         d|          }t          |          dk     r+|dd         \  }}|dk    r$|                    dt	          |                     bJ d
            t          ||          }t          |          S )az  
    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').

            The remaining sections:
                'mstd' -  float std deviation of magnitude noise applied
            Ex 'original-mstd0.5' results in AutoAugment with original policy, magnitude_std 0.5

        hparams: Other hparams (kwargs) for the AutoAugmentation scheme

    Returns:
         A PyTorch compatible Transform
    -r   r0   N(\d.*)r   mstdr   Fz"Unknown AutoAugment config sectionrB  )splitrerw   
setdefaultr   rz  r|  )	r  r   configpolicy_namerR   cskeyval	aa_policys	            r   auto_augment_transformr  J  s    $ c""F)KABBZF 	? 	?Xi##r77Q;;bqb6S&==c

;;;;>>>>>#KAA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  r0   )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                     t          t          |                                            \  } }t          j        |          }|t          j        |          z  }| |fS rM   )r!   zipitemsnparraysum)r  probss     r   _get_weighted_transformsr    sO    S*"2"2"4"4566JHUOOEBF5MM!Eur   r   c                 p    | dk    rt           S | dk    rt          S | dk    rt          S |rt          nt          S )Nweights3awry  )_RAND_WEIGHTED_0_RAND_WEIGHTED_3A_RAND_3A_RAND_INCREASING_TRANSFORMS_RAND_TRANSFORMS)r   
increasings     r   rand_augment_choicesr    sB    yu}}  t||*4J&&:JJr   r   r   r   c                 L     pt           |pt          } fd|D             S )Nc                 6    g | ]}t          |           S )r   r   r   rC  )r   r   r   r   r   s     r   r   z$rand_augment_ops.<locals>.<listcomp>  sG     W W WCG 49g? ? ? W W Wr   )r   r  r   r   r   r  s   ``` r   rand_augment_opsr    s\     ))G//JW W W W W WKUW W W Wr   c                   "    e Zd ZddZd Zd ZdS )RandAugmentr   Nc                 0    || _         || _        || _        d S rM   )ops
num_layerschoice_weights)r   r  r  r  s       r   r   zRandAugment.__init__  s    $,r   c                     t           j                            | j        | j        | j        d u | j                  }|D ]} ||          }|S )N)replacer  )r  r#   r$   r  r  r  )r   r6   r  r  s       r   r   zRandAugment.__call__  s^    iHO'4/!	  
 
  	 	B"S''CC
r   c                 d    | j         j        d| j         dz   }| j        D ]
}|d| z  }|dz  }|S )Nz(n=, ops=
	r  )r  r  r  r  r   r  r  s      r   r  zRandAugment.__repr__  sP    ^$'DT_'D'D'DD( 	 	B+++BB
c		r   )r   Nr  r   r   r   r  r    sF        - - - -

 
 
    r   r  c                     t           }d}d}d}|                     d          }|d         dk    sJ |dd         }|D ]:}|                    d	          rt          |dd                   }	||	}4t	          j        d
|          }
t          |
          dk     r]|
dd         \  }}	|dk    r;t          |	          }|dk    rt          d          }|                    d|           |dk    r$|                    dt          |	                     |dk    rt          |	          rd}|dk    rt          |	          }|dk    rt          |	          }|dk    rt          |	          }2J d            t          |t                    rt          ||          }n||rt          nt          }d}t          |t                    rt          |          \  }}t!          ||||          }t#          |||          S )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 sepecific 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
            Ex '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

        hparams (dict): Other hparams (kwargs) for the RandAugmentation scheme

    Returns:
         A PyTorch compatible Transform
    r   Fr   r  r   randr0   Ntr  r  d   r   r   mmaxr   incTmnr  z"Unknown RandAugment config section)r  r  )r  )r   r  
startswithr  r  rw   r   r  r   boolr    r  r  r  r   r  r  r  )r  r   r  r   r  r  r   r  rR   r  r  r  r  r  ra_opss                  r   rand_augment_transformr    s3   6 IJJDc""F!9ABBZF  C  C<< 	Cae**C! 
 )Q''B2ww{{"1"vHCf}}Szz#:: <<D""?D9999""?CHH====99 &!%JHH		 XX

SzzBBBBB*c"" U)*LLL

		4>T00DT
N*d## J%=j%I%I"
N	gZdeeeFvz.IIIIr   )r   r   r   r   r   r   r   r   r   r   r   r   r   c                 H     pt           |pt          } fd|D             S )Nc                 6    g | ]}t          |d           S )r   r  rC  )r   r   r   r   s     r   r   zaugmix_ops.<locals>.<listcomp>c  sF       
  	     r   )r   _AUGMIX_TRANSFORMS)r   r   r  s   `` r   
augmix_opsr  \  sN    
 ))G11J    
    r   c                   8    e Zd ZdZddZd Zd Zd	 Zd
 Zd Z	dS )AugMixAugmenta   AugMix 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
    r   r  Fc                 L    || _         || _        || _        || _        || _        d S rM   )r  alphawidthdepthblended)r   r  r  r  r  r  s         r   r   zAugMixAugment.__init__q  s)    


r   c                     ||z  }d}g }|d d d         D ]$}||z  }|d|z
  z  }|                     |           %t          j        |d d d         t          j                  S )Nr   r  r0   dtype)rt   r  r  float32)r   wsr  cumprwsr]   r  s          r   _calc_blended_weightsz#AugMixAugment._calc_blended_weightsx  s{    !VDDbD 	 	AHEQYDJJuxDDbD	4444r   c                 f   |                                 }|                     ||          }|D ]}| j        dk    r| j        nt          j                            dd          }t          j                            | j        |d          }|}	|D ]}
 |
|	          }	t          j	        ||	|          }|S )Nr   r0   r   Tr  )
r   r  r  r  r#   randintr$   r  r   blend)r   r6   mixing_weightsr  img_origr  r]   r  r  img_augr  s              r   _apply_blendedzAugMixAugment._apply_blended  s    
 88::'':: 	/ 	/A"&*q..DJJbi6G6G16M6ME)""48UD"AACG & &"W+++c7A..CC
r   c                    |j         d         |j         d         t          |                                          f}t          j        |t          j                  }|D ]}| j        dk    r| j        nt          j                            dd          }t          j        	                    | j
        |d          }|}	|D ]}
 |
|	          }	||t          j        |	t          j                  z  z  }t          j        |dd|           t          j        |                    t          j                            }t          j        |||          S )	Nr   r0   r  r   Tr  g     o@)out)r3   rw   getbandsr  zerosr  r  r#   r  r$   r  asarrayclipr   	fromarrayastypeuint8r  )r   r6   r  r  	img_shapemixedmwr  r  r  r  s              r   _apply_basiczAugMixAugment._apply_basic  s'    HQK!c#,,...A.AA	"*555  	@ 	@B"&*q..DJJbi6G6G16M6ME)""48UD"AACG & &"W++R"*WBJ?????EE
q$E****RX 6 677{3q)))r   c                 h   t          j        t           j                            | j        g| j        z                      }t          j        t           j                            | j        | j                            }| j        r|                     |||          }n| 	                    |||          }|S rM   )
r  r  r#   	dirichletr  r  betar  r  r  )r   r6   r  r  r  s        r   r   zAugMixAugment.__call__  s    BI$7$7tz8Q$R$RSSJry~~dj$*==>>< 	>''^Q??EE%%c>1==Er   c                     | j         j        d| j         d| j         d| j         dz   }| j        D ]
}|d| z  }|dz  }|S )Nz(alpha=z, width=z, depth=r  r  r  )r  r  r  r  r  r  r  s      r   r  zAugMixAugment.__repr__  sf    ^$'k'k'kTZ'k'kY]Yc'k'k'kk( 	 	B+++BB
c		r   N)r   r  r  F)
r  r  r  __doc__r   r  r  r  r   r  r   r   r   r  r  k  s}         
   5 5 5   * * *"      r   r  c                    d}d}d}d}d}|                      d          }|d         dk    sJ |dd	         }|D ]}t          j         d
|          }	t          |	          dk     r+|	d	d         \  }
}|
dk    r$|                    dt	          |                     b|
dk    rt          |          }x|
dk    rt          |          }|
dk    rt          |          }|
dk    rt	          |          }|
dk    rt          |          }J d            |                    dt	          d                     t          ||          }t          |||||          S )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 sepecific 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   augmixr0   Nr  r   r  r   r  r]   rS   rP   rQ   zUnknown AugMix config sectionr   )r   r   )r  r  r  r  )	r  r  rw   r  r   r   r  r  r  )r  r   r   r  r  r  r  r  rR   r  r  r  r  s                r   augment_and_mix_transformr    s   & IEEEGc""F!9    ABBZF : :Xi##r77Q;;bqb6S&==c

;;;;CZZCIICZZHHEECZZHHEECZZ#JJEECZZ3iiGG99999e555
y'
:
:
:CEeWUUUUr   )r   )rK   r   T)rt  NrM   )T)r   r   NN)NN)r   NN)ar  r#   rW   r  	functoolsr   typingr   r   r   r   PILr   r	   r
   r   r   numpyr  r"   __version__r  r,   r   r   r   r   hasattrr   BILINEARBICUBICr   r   r'   r-   r8   r:   r@   rB   rE   rG   rV   rf   rh   rj   rl   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   rL  rQ  rk  ro  rs  rz  r|  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r   r   r   <module>r     sY	   ,   				       . . . . . . . . . . . . F F F F F F F F F F F F F F 



     5AA#/"7"7"<"<RaR"@AAABB4   
 75, +"-68H8PQ"-5"^U];"]  0 0 0T T T
T T T
T T TT T TT T T
T T T
< < <>& & &     " " "* * *    1 1 16 6 63 3 38 8 87 7 7  
  3 3 3. . .
  / / /
           , , ,; ; ;0 0 08 8 8= = =8 8 8
D d "	 ( = 9 & ; - " 7 % :  '!" <#$ &%& <!!--00'.SIIIG0#sKKK,9  @M f f	
  9   ( < U u  ( *  J!" #$ %!!$$!*7  
>/ / / / / / / /d  B  D  B  B  . . . .       * "  "s  "Xd^  "  "  "  "F   (   (     *   &    K Ks K K K K (*"&26		W 	We$	W	W $	W U4:./		W 	W 	W 	W       8 #'7;NJ NJNJ$NJ U3d?34NJ NJ NJ NJb   $ (*"&7; e$$ U3d?34   F F F F F F F FR1V 1V# 1V 1V 1V 1V 1V 1V 1Vr   