
    kh                        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ej(                  j+                  d      dd D  cg c]
  }  e|        c}       ZdZd	Z ed
e      Z eed      rCe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.dndZ/d Z0d Z1d Z2d Z3d Z4d  Z5d! Z6d" Z7d# Z8d$ Z9d% Z:d& Z;dod(Z<d) Z=d* Z>d+ Z?d, Z@d- ZAd. ZBd/ ZCd0 ZDd1 ZEi d2dd3dd4dd5e9d6e@d7eAd8eBd9eCd:eDd;eEd<e:d=e;d>e:d?e;d@e:dAe;dBe:e;e=e=e>e>e?e? ee<dCd'D       ee<dEdFD      e<dG
ZFi d2e+d3e-d4e,d5e*d6e0d7e0d8e0d9e.d:e.d;e/d<e2d=e2d>e1d?e1d@e3dAe3dBe4e4e$e%e(e)e&e'e7e5e6dG
ZG G dH dI      ZHdJ ZIdK ZJdL ZKdM ZLdN ZMdpdOZN G dP dQ      ZOdqdRePdSe	e   fdTZQg dUZRg dVZSg dWZTdXdXdXdYdddZdZdZdZdZdZdZdZd[ZUdYdddZdZd\d\d\d]d]d]d]d]d]d]d^ZVd_efd`ZWdrdaePfdbZX	 	 	 	 dsdce
eeYf   ddeYdSe	e   d_e	e
eef      fdeZZ G df dg      Z[	 	 dtdRePdSe	e   d_e	e
ePeef      fdhZ\g diZ]	 	 	 dudce
eeYf   dSe	e   d_e	e
ePeef      fdjZ^ G dk dl      Z_dqdRePdSe	e   fdmZ`yc c} w )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                     | j                  dt              }t        |t        t        f      rt        j                  |      S |S )Nresample)pop_DEFAULT_INTERPOLATION
isinstancelisttuplerandomchoice)kwargsinterpolations     R/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/data/auto_augment.py_interpolationr    5   s6    JJz+ABM-$/}}]++    c                 \    d| v rt         dk  r| j                  d       t        |       | d<   y )N	fillcolor   r   r   )_PIL_VERr   r    )r   s    r   _check_args_tfr'   <   s,    fF!2

;'/F:r!   c           
      ~    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_xr2   B   s9    63==5<<!VQ1a1HSFSSr!   c           
      ~    t        |        | j                  | j                  t        j                  ddd|ddffi |S r)   r+   r/   s      r   shear_yr4   G   s9    63==5<<!Q61a1HSFSSr!   c           
          || j                   d   z  }t        |        | j                  | j                   t        j                  dd|dddffi |S )Nr   r*   r-   r'   r,   r   r.   r0   pctr   pixelss       r   translate_x_relr:   L   sK    388A;F63==5<<!Q1a1HSFSSr!   c           
          || j                   d   z  }t        |        | j                  | j                   t        j                  ddddd|ffi |S r)   r6   r7   s       r   translate_y_relr<   R   sK    388A;F63==5<<!Q1a1HSFSSr!   c           
      ~    t        |        | j                  | j                  t        j                  dd|dddffi |S r)   r+   r0   r9   r   s      r   translate_x_absr?   X   s9    63==5<<!Q1a1HSFSSr!   c           
      ~    t        |        | j                  | j                  t        j                  ddddd|ffi |S r)   r+   r>   s      r   translate_y_absrA   ]   s9    63==5<<!Q1a1HSFSSr!   c           	         t        |       t        dk\  r | j                  |fi |S t        dk\  r%| 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 | j                  ||d         S )N)r%   r   r$   )r   r          @           c                 L    |\  }}}}}}|| z  ||z  z   |z   || z  ||z  z   |z   fS N )	xymatrixabcdefs	            r   r,   zrotate.<locals>.transformt   sA    !'Q1aAq51q5=1$a!ea!ema&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   rR   rR   b   s`   66szz',V,,6xx1
3wC(g&&$((5/2&$((5/2&488E?"B'$((5/2&
	8  )^Ojm+k!n_z!}-Lf 
q	6!9 	q	[^#	q	[^#	s}}SXXu||VFvFF::gz(::;;r!   c                 ,    t        j                  |       S rG   )r	   autocontrastr0   __s     r   auto_contrastrb      s      %%r!   c                 ,    t        j                  |       S rG   )r	   invertr`   s     r   rd   rd      s    ??3r!   c                 ,    t        j                  |       S rG   )r	   equalizer`   s     r   rf   rf      s    S!!r!   c                 .    t        j                  | |      S rG   )r	   solarize)r0   threshra   s      r   rh   rh      s    S&))r!   c                    g }t        d      D ]7  }||k  r|j                  t        d||z                '|j                  |       9 | j                  dv r6| j                  dk(  rt	        |      dk(  r||z   |z   }| j                  |      S | S )N      )LRGBrn   )rangeappendminmodelenpoint)r0   addri   ra   lutis         r   solarize_addrx      s    
C3Z v:JJs3C()JJqM	 xx<88uSS)c/Cyy~Jr!   c                 <    |dk\  r| S t        j                  | |      S )N   )r	   	posterize)r0   bits_to_keepra   s      r   r{   r{      s"    q
c<00r!   c                 J    t        j                  |       j                  |      S rG   )r
   Contrastenhancer0   r1   ra   s      r   contrastr      s      %--f55r!   c                 J    t        j                  |       j                  |      S rG   )r
   Colorr   r   s      r   colorr      s    c"**622r!   c                 J    t        j                  |       j                  |      S rG   )r
   
Brightnessr   r   s      r   
brightnessr      s    ""3'//77r!   c                 J    t        j                  |       j                  |      S rG   )r
   	Sharpnessr   r   s      r   	sharpnessr      s    !!#&..v66r!   c                 P    | j                  t        j                  |            } | S )Nradius)filterr   GaussianBlurr   s      r   gaussian_blurr      s     
**[--V<
=CJr!   c           	          d}d}| j                  t        j                  t        j                  |||z                    } | S )N皙?rC   r   )r   r   r   r   uniform)r0   r1   ra   
radius_min
radius_maxs        r   gaussian_blur_randr      s<    JJ
**[--V^^JPZ]cPc5de
fCJr!   c                 |    t        dt        dd|z
              }t        j                  |       j	                  |      S )N      ?rE   )rq   maxr
   r   r   )r0   r1   _s      r   
desaturater      s5    SR&[)*Fc"**622r!   c                 :    t        j                          dkD  r|  S | S )zWith 50% prob, negate the value      ?)r   )vs    r   _randomly_negater      s    3&A2-A-r!   c                 6    | 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                 P    | 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      s1     \!R'ES+E223E6Mr!   r   c                 `    | t         z  } |||z
  | z  z   } |rt        |t        ||             } | fS rG   )r   r   rq   )r   r   min_valmax_valclamps        r   _minmax_level_to_argr      s=    \!Ew(E11EGS%016Mr!   c                 6    | t         z  dz  } t        |       } | fS )Ng333333?r   r   s     r   _shear_level_to_argr      r   r!   c                 R    |d   }| t         z  t        |      z  } t        |       } | fS )Nr   )r   floatr   )r   hparamsr   s      r   _translate_abs_level_to_argr      s2    /0O\!U?%;;EU#E6Mr!   c                 Z    |j                  dd      }| t        z  |z  } t        |       } | fS )Ntranslate_pctg?)getr   r   )r   r   r   s      r   _translate_rel_level_to_argr      s2    KK6M\!]2EU#E6Mr!   c                 .    t        | t        z  dz        fS N   intr   r   s     r   _posterize_level_to_argr      s     $)*++r!   c                 (    dt        | |      d   z
  fS )Nr   r   )r   )r   r   s     r   "_posterize_increasing_level_to_argr     s     &ug6q99::r!   c                 4    t        | t        z  dz        dz   fS r   r   r   s     r    _posterize_original_level_to_argr     s!     $)*Q.//r!   c                 B    t        dt        | t        z  dz              fS )Nrk   rq   r   r   r   s     r   _solarize_level_to_argr     s#     sC-45677r!   c                 (    dt        | |      d   z
  fS )Nrk   r   )r   r   s     r   !_solarize_increasing_level_to_argr     s     'x8;;<<r!   c                 B    t        dt        | t        z  dz              fS )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                        e Zd ZddZd Zd Zy)	AugmentOpNc                    |xs t         }|| _        t        |   | _        t        |   | _        || _        || _        |j                         | _	        t        d|v r|d   nt        d|v r|d   nt              | _        | j                  j                  dd      | _        | j                  j                  dd       | _        y )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-Bgj)1@G1KW_-Qf
 "\\--oqA!\\--otDr!   c                 P   | j                   dk  r#t        j                         | j                   kD  r|S | j                  }| j                  dkD  r^| j                  t	        d      k(  rt        j
                  d|      }n/| j                  dkD  r t        j                  || j                        }| j                  xs t        }t        dt        ||            }| j                  | j                  || j                        n	t               } | j                  |g|i | j                  S )Nr   r   infrE   )r   r   r   r   r   r   gaussr   r   r   rq   r   r   r   r   r   )r   r0   r   upper_bound
level_argss        r   __call__zAugmentOp.__call__|  s    99s?v}}:JNN	!!!U5\1"NN1i8	##a'"LLD4F4FG	 ((8LC	;78	?C}}?XT]]9dll;^c^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__  s    ^^$$		{$tyyk'JJ
T^^$GD,>,>+?@@)GD../00B
c		r!   )r   
   Nr   
__module____qualname__r   r   r  rH   r!   r   r   r   e  s    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}|D cg c]  }|D cg c]  }t        |d1| i c} }}}|S c c}w c c}}w )2Nr   皙?r*   r   r  r   r   皙?	   r   333333?   r   r  r*   r   r  rz   r   r  r  r   r     r   r  r   r   r  r   r   皙?r   r   r  rz   r   r  rz   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  rz   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   rz   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_v0rB    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	H22
6a9a))
6	HB	HI 7	H   	A=A8.A=8A=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}|D cg c]  }|D cg c]  }t        |d1| i c} }}}|S c c}w c c}}w )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,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  )r   r  r   r9  r:  r;  r<  r   r=  r>  s        r   auto_augment_policy_v0rrF    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	H22
6a9a))
6	HB	HI 7	HrC  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}|D cg c]  }|D cg c]  }t        |d$| i c} }}}|S c c}w c c}}w )%N)r   r  rz   r   r  r  r   r  r%   r   r  r%   r  r  )r   r  r  )r   r  r%  r  r)  r   r  r   r   r  rz   r   r  r  r   r  r  )r   r  r%   r  r   r  r  r'  r   r  rz   )r   r  r%  r   r  r   r   r  r  r   r  r   r   rE   r  r   r  r   r   r   rz   r0  r~   r   rz   r   r   r   r   r  rz   r   r  r  r   r  r  r   r  rz   r   r  r%   r!  r   r=  r>  s        r   auto_augment_policy_originalr^    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	H22
6a9a))
6	HB	HI 7	HrC  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}|D cg c]  }|D cg c]  }t        |d$| i c} }}}|S c c}w c c}}w )%N)r   r  rz   rH  rI  rJ  r  r  )r   r  r  )r   r  r%  r  r)  rK  rL  rM  rN  )r   r  r%   r  rO  r'  rP  rE  rQ  rR  rS  rT  rU  rV  r0  rW  rX  rY  rZ  r[  r\  r]  r!  r   r=  r>  s        r   auto_augment_policy_originalrr`    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	H22
6a9a))
6	HB	HI 7	HrC  c                 |    dgdgdgg}|D cg c]  }|D cg c]  }t        |d| i c} }}}|S c c}w c c}}w )N)r   r   r%   )r   r   r  )r   r   r  r   r=  r>  s        r   auto_augment_policy_3arb    sT    		 !	&'F
 BH	H22
6a9a))
6	HB	HI 7	Hs   	8388c                     |xs 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	originalrv0v0r3azUnknown AA policy )r   r^  r`  rB  rF  rb  )r   r   s     r   auto_augment_policyri  &  s{    ))Gz+G44{,W55t|%g..u}&w//t|%g..-&tf--5r!   c                       e Zd Zd Zd Zd Zy)AutoAugmentc                     || _         y rG   )r?  )r   r?  s     r   r   zAutoAugment.__init__7  s	    r!   c                 b    t        j                  | j                        }|D ]
  } ||      } |S rG   )r   r   r?  )r   r0   
sub_policyops       r   r   zAutoAugment.__call__:  s1    ]]4;;/
 	BS'C	
r!   c           
          | j                   j                  dz   }| j                  D ]7  }|dz  }|dj                  |D cg c]  }t	        |       c}      z  }|dz  }9 |dz  }|S c c}w )Nz(policy=z
	[z, ]r   )r   r   r?  joinstr)r   r   pro  s       r   r  zAutoAugment.__repr__@  sr    ^^$$z1 	A'MB$))q1SW122B#IB	 	c		 2s   A'Nr  rH   r!   r   rk  rk  5  s    r!   rk  
config_strr   c                    | j                  d      }|d   }|dd }|D ]V  }t        j                   d|      }t        |      dk  r(|dd \  }}|dk(  r|j                  dt	        |             QJ d	        t        ||
      }t        |      S )a   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rers   
setdefaultr   ri  rk  )	ru  r   configpolicy_namerN   cskeyval	aa_policys	            r   auto_augment_transformr  J  s    $ c"F)KABZF 	?XXi#r7Q;bq6S&=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                     t        t        | j                                \  } }t        j                  |      }|t        j
                  |      z  }| |fS rG   )r   zipitemsnparraysum)r  probss     r   _get_weighted_transformsr    sI    S*"2"2"456JHHUOEBFF5M!Eur!   r   c                 `    | dk(  rt         S | dk(  rt        S | dk(  rt        S |rt        S t        S )Nweights3awrh  )_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           	      n    |xs t         }|xs t        }|D cg c]  }t        ||| |       c}S c c}w )Nr   r   r   )r   r  r   )r   r   r   r  r   s        r   rand_augment_opsr    sL     ))G//JKUWCG 49g? W W W   2c                        e Zd ZddZd Zd Zy)RandAugmentNc                 .    || _         || _        || _        y rG   )ops
num_layerschoice_weights)r   r  r  r  s       r   r   zRandAugment.__init__  s    $,r!   c                     t         j                  j                  | j                  | j                  | j
                  d u | j
                        }|D ]
  } ||      } |S )N)replacert  )r  r   r   r  r  r  )r   r0   r  ro  s       r   r   zRandAugment.__call__  s_    iiHHOO''4/!!	  
  	BS'C	
r!   c                     | j                   j                  d| j                   dz   }| j                  D ]
  }|d| z  } |dz  }|S )Nz(n=, ops=
	r   )r   r   r  r  r   r   ro  s      r   r  zRandAugment.__repr__  sU    ^^$$T__,=V'DD(( 	BD+B	
c		r!   )r   Nr  rH   r!   r   r  r    s    -

r!   r  c                 $   t         }d}d}d}| j                  d      }|d   dk(  sJ |dd }|D ]  }|j                  d	      rt        |dd       }	|%|	}(t	        j                  d
|      }
t        |
      dk  rM|
dd \  }}	|dk(  r.t        |	      }|dkD  rt        d      }|j                  d|       |dk(  r|j                  dt        |	             |dk(  rt        |	      sd}|dk(  rt        |	      }|dk(  rt        |	      }|dk(  rt        |	      }J 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 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   rw  r   randr*   Ntrx  ry  d   r   r   mmaxr   incTmnrt  z"Unknown RandAugment config section)r  )r   r   r   r  )r  )r   rz  
startswithrs  r{  rs   r   r|  r   boolr   r  r  r  r   r  r  r  )ru  r   r  r   r  r  r   r}  rN   r  r  r  ry  r  ra_opss                  r   rand_augment_transformr    s   < IJJDc"F!9ABZF  C<<ae*C! 
 )Q'B2w{"1vHCf}Sz#: <D""?D9""?CH=9!%JH	 X
SzBBBuA CD *c")*L
		4>0DT
N*d#%=j%I"
N	gZdeFvz.IIr!   )r   r   r   r   r   r   r   r   r   r   r   r   r   c           	      n    |xs t         }|xs t        }|D cg c]  }t        |d| |       c}S c c}w )Nr   r  )r   _AUGMIX_TRANSFORMSr   )r   r   r  r   s       r   
augmix_opsr  _  sO    
 ))G11J 
  	   r  c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
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
    c                 J    || _         || _        || _        || _        || _        y rG   )r  alphawidthdepthblended)r   r  r  r  r  r  s         r   r   zAugMixAugment.__init__t  s%    


r!   c                     ||z  }d}g }|d d d   D ]   }||z  }|d|z
  z  }|j                  |       " t        j                  |d d d   t        j                        S )Nr   r*   dtype)rp   r  r  float32)r   wsr  cumprwsrY   r  s          r   _calc_blended_weightsz#AugMixAugment._calc_blended_weights{  sn    !VDbD 	AHEQYDJJu	 xxDbD	44r!   c                 v   |j                         }| j                  ||      }|D ]  }| j                  dkD  r| j                  nt        j                  j                  dd      }t        j                  j                  | j                  |d      }|}	|D ]
  }
 |
|	      }	 t        j                  ||	|      } |S )Nr   r*   r   Tr  )
r   r  r  r  r   randintr   r  r   blend)r   r0   mixing_weightsr  img_origr  rY   r  r  img_augro  s              r   _apply_blendedzAugMixAugment._apply_blended  s    
 88:'': 	/A"&**q.DJJbii6G6G16ME))""488UD"ACG &W+&++c7A.C	/ 
r!   c                    |j                   d   |j                   d   t        |j                               f}t        j                  |t        j
                        }|D ]  }| j                  dkD  r| j                  nt        j                  j                  dd      }t        j                  j                  | j                  |d      }|}	|D ]
  }
 |
|	      }	 ||t        j                  |	t        j
                        z  z  } t        j                  |dd|       t        j                  |j                  t        j                               }t        j"                  |||      S )	Nr   r*   r  r   Tr  g     o@)out)r-   rs   getbandsr  zerosr  r  r   r  r   r  asarrayclipr   	fromarrayastypeuint8r  )r   r0   r  r  	img_shapemixedmwr  r  r  ro  s              r   _apply_basiczAugMixAugment._apply_basic  s    HHQK!c#,,..AA	"**5  	@B"&**q.DJJbii6G6G16ME))""488UD"ACG &W+&R"**WBJJ???E	@ 	q$E*RXX 67{{3q))r!   c                    t        j                  t         j                  j                  | j                  g| j
                  z              }t        j                  t         j                  j                  | j                  | j                              }| j                  r| j                  |||      }|S | j                  |||      }|S rG   )
r  r  r   	dirichletr  r  betar  r  r  )r   r0   r  r  r  s        r   r   zAugMixAugment.__call__  s    BII$7$7tzz8Q$RSJJryy~~djj$**=><<''^Q?E  %%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__  sn    ^^$$HTZZLPXY]YcYcXddj'kk(( 	BD+B	
c		r!   N)r   r  r  F)
r   r  r  __doc__r   r  r  r  r   r  rH   r!   r   r  r  n  s%    
5 *"r!   r  c                 &   d}d}d}d}d}| j                  d      }|d   dk(  sJ |dd	 }|D ]  }t        j                   d
|      }	t        |	      dk  r(|	d	d \  }
}|
dk(  r|j                  dt	        |             Q|
dk(  rt        |      }b|
dk(  rt        |      }s|
dk(  rt        |      }|
dk(  rt	        |      }|
dk(  rt        |      }J d        |j                  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 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   Frw  r   augmixr*   Nrx  r   ry  r   r  rY   rO   rL   rM   zUnknown AugMix config sectionr   )r   r   )r  r  r  r  )	rz  r{  rs   r|  r   r   r  r  r  )ru  r   r   r  r  r  r  r}  rN   r  r  r  r  s                r   augment_and_mix_transformr    s1   & IEEEGc"F!9   ABZF :XXi#r7Q;bq6S&=c
;CZCICZHECZHECZ#JECZ3iG9995':( e5
y'
:CEeWUUr!   )r   )rE   r   T)rf  NrG   )T)r  r   NN)NN)r  NN)ar  r   rS   r{  	functoolsr   typingr   r   r   r   PILr   r	   r
   r   r   numpyr  r   __version__rz  r   r&   r   r   r   r   hasattrr   BILINEARBICUBICr   r   r    r'   r2   r4   r:   r<   r?   rA   rR   rb   rd   rf   rh   rx   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   rB  rF  r^  r`  rb  ri  rk  rs  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"@AQ#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