a
    dފ                     @   s(  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d ejddd	 D Zd
ZdZededZeedrejjejjfZejjZ nejejfZejZ dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd  Z)d!d" Z*d#d$ Z+d%d& Z,d'd( Z-dd*d+Z.d,d- Z/d.d/ Z0d0d1 Z1d2d3 Z2d4d5 Z3d6d7 Z4d8d9 Z5d:d; Z6d<d= Z7d>d? Z8d@dA Z9dBdC Z:ddGdHZ;dIdJ Z<dKdL Z=dMdN Z>dOdP Z?dQdR Z@dSdT ZAdUdV ZBdWdX ZCdYdZ ZDddde8e?e@eAeBeCeDe9e:e9e:e9e:e9e:e<e<e=e=e>e>ee;d[dEd\ee;d]d^d\e;d_ZEe*e,e+e)e/e/e/e-e-e.e1e1e0e0e2e2e3e3e#e$e'e(e%e&e6e4e5d_ZFG d`da daZGdbdc ZHddde ZIdfdg ZJdhdi ZKdjdk ZLddmdnZMG dodp dpZNdeOe	e dqdrdsZPg dtZQg duZRg dvZSdwdwdwdxd	d	dydydydydydydydydzZTdxd	d	dydyd{d{d{d|d|d|d|d|d|d|d}ZUed~ddZVdeOdddZWde
eXeYf eYe	e e	e
eef  dddZZG dd dZ[deOe	e e	e
eOeef  dddZ\g dZ]de
eXeYf e	e e	e
eOeef  dddZ^G dd dZ_deOe	e dqdd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                 C   s   g | ]}t |qS  )int).0xr   r   _/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/data/auto_augment.py
<listcomp>"       r   .   )   r   r   g      $@   )translate_constimg_mean
Resamplingc                 C   s(   |  dt}t|ttfr$t|S |S )Nresample)pop_DEFAULT_INTERPOLATION
isinstancelisttuplerandomchoice)kwargsinterpolationr   r   r   _interpolation5   s    
r$   c                 C   s*   d| v rt dk r| d t| | d< d S )N	fillcolor   r   r   )_PIL_VERr   r$   )r"   r   r   r   _check_args_tf<   s    
r)   c              	   K   s.   t | | j| jtjd|ddddffi |S N   r   r)   	transformsizer   AFFINEimgfactorr"   r   r   r   shear_xB   s    r3   c              	   K   s.   t | | j| jtjddd|ddffi |S r*   r,   r0   r   r   r   shear_yG   s    r4   c              	   K   s<   || j d  }t| | j| j tjdd|dddffi |S )Nr   r+   r.   r)   r-   r   r/   r1   Zpctr"   pixelsr   r   r   translate_x_relL   s    r8   c              	   K   s<   || j d  }t| | j| j tjddddd|ffi |S r*   r5   r6   r   r   r   translate_y_relR   s    r9   c              	   K   s.   t | | j| jtjdd|dddffi |S r*   r,   r1   r7   r"   r   r   r   translate_x_absX   s    r;   c              	   K   s.   t | | j| jtjddddd|ffi |S r*   r,   r:   r   r   r   translate_y_abs]   s    r<   c           
      K   s(  t | tdkr"| j|fi |S tdkr| j\}}d}|d |d f}t| }tt|dtt|ddtt| dtt|ddg}dd }	|	|d	  |d	  |d
  |d
  |\|d< |d< |d  |d	 7  < |d  |d
 7  < | j	| jt
j|fi |S | j||d dS )N)r'   r   r&   )r   r          @           c           	      S   s8   |\}}}}}}||  ||  | ||  ||  | fS Nr   )	r   ymatrixabcdefr   r   r   r-   t   s    zrotate.<locals>.transformr   r+   r   r'   r   )r   )r)   r(   rotater.   mathradiansroundcossinr-   r   r/   )
r1   degreesr"   whZ
post_transZrotn_centerZanglerB   r-   r   r   r   rI   b   s.    

	"rI   c                 K   s
   t | S r@   )r   Zautocontrastr1   __r   r   r   auto_contrast   s    rT   c                 K   s
   t | S r@   )r   invertrR   r   r   r   rU      s    rU   c                 K   s
   t | S r@   )r   equalizerR   r   r   r   rV      s    rV   c                 K   s   t | |S r@   )r   solarize)r1   threshrS   r   r   r   rW      s    rW   r   c                 K   st   g }t dD ],}||k r.|td||  q|| q| jdv rp| jdkrft|dkrf|| | }| |S | S )N      )LRGBr\   )rangeappendminmodelenZpoint)r1   addrX   rS   Zlutir   r   r   solarize_add   s    

rd   c                 K   s   |dkr| S t | |S )N   )r   	posterize)r1   Zbits_to_keeprS   r   r   r   rf      s    rf   c                 K   s   t | |S r@   )r	   Contrastenhancer1   r2   rS   r   r   r   contrast   s    rj   c                 K   s   t | |S r@   )r	   Colorrh   ri   r   r   r   color   s    rl   c                 K   s   t | |S r@   )r	   
Brightnessrh   ri   r   r   r   
brightness   s    rn   c                 K   s   t | |S r@   )r	   	Sharpnessrh   ri   r   r   r   	sharpness   s    rp   c                 K   s   |  tj|d} | S )NZradius)filterr   GaussianBlurri   r   r   r   gaussian_blur   s    rt   c                 K   s*   d}d}|  tjt||| d} | S )N皙?r=   rq   )rr   r   rs   r    uniform)r1   r2   rS   Z
radius_minZ
radius_maxr   r   r   gaussian_blur_rand   s    rw   c                 K   s$   t dtdd| }t| |S )N      ?r?   )r_   maxr	   rk   rh   )r1   r2   _r   r   r   
desaturate   s    r{   c                 C   s   t   dkr|  S | S )zWith 50% prob, negate the value      ?)r    )vr   r   r   _randomly_negate   s    r~   c                 C   s   | t  d } t| } | fS )Ng      >@_LEVEL_DENOMr~   level_hparamsr   r   r   _rotate_level_to_arg   s    r   c                 C   s   | t  d d fS )Ng?ru   )r   r   r   r   r   _enhance_level_to_arg   s    r   c                 C   s$   | t  d } tddt|  } | fS )Ng?ru   rx   )r   ry   r~   r   r   r   r    _enhance_increasing_level_to_arg   s    r   r?   rx   Tc                 C   s2   | t  } ||| |   } |r,t|t|| } | fS r@   )r   ry   r_   )r   r   min_valmax_valclampr   r   r   _minmax_level_to_arg   s
    r   c                 C   s   | t  d } t| } | fS )Ng333333?r   r   r   r   r   _shear_level_to_arg   s    r   c                 C   s&   |d }| t  t| } t| } | fS )Nr   )r   floatr~   )r   hparamsr   r   r   r   _translate_abs_level_to_arg   s    r   c                 C   s&   | dd}| t | } t| } | fS )Ntranslate_pctg?)getr   r~   )r   r   r   r   r   r   _translate_rel_level_to_arg   s    r   c                 C   s   t | t d fS N   r   r   r   r   r   r   _posterize_level_to_arg   s    r   c                 C   s   dt | |d  fS )Nr   r   )r   )r   r   r   r   r   "_posterize_increasing_level_to_arg  s    r   c                 C   s   t | t d d fS r   r   r   r   r   r    _posterize_original_level_to_arg  s    r   c                 C   s   t dt| t d fS )NrY   r_   r   r   r   r   r   r   _solarize_level_to_arg  s    r   c                 C   s   dt | |d  fS )NrY   r   )r   r   r   r   r   !_solarize_increasing_level_to_arg  s    r   c                 C   s   t dt| t d fS )Nr   n   r   r   r   r   r   _solarize_add_level_to_arg!  s    r   r|   )r   r   ru   r=   )AutoContrastEqualizeInvertRotate	PosterizePosterizeIncreasingPosterizeOriginalSolarizeSolarizeIncreasingSolarizeAddrk   ColorIncreasingrg   ContrastIncreasingrm   BrightnessIncreasingro   SharpnessIncreasingShearXShearYZ
TranslateXZ
TranslateYTranslateXRelTranslateYRel
Desaturaters   GaussianBlurRandc                   @   s&   e Zd Zd
ddZdd Zdd	 ZdS )	AugmentOpr|   
   Nc                 C   s   |pt }|| _t| | _t| | _|| _|| _| | _	t
d|v rJ|d ntd|v r\|d ntd| _| 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   r   r   r   __init__g  s    



zAugmentOp.__init__c                 C   s   | j dk rt | j kr|S | j}| jdkr`| jtdkrHtd|}n| jdkr`t|| j}| jpht}t	dt
||}| jd ur| || jnt }| j|g|R i | jS )Nrx   r   infr?   )r   r    r   r   r   rv   gaussr   r   ry   r_   r   r   r   r   r"   )r   r1   r   Zupper_boundZ
level_argsr   r   r   __call__|  s    


zAugmentOp.__call__c                 C   sZ   | j jd| j d| j  }|d| j d| j 7 }| jd urN|d| j 7 }|d7 }|S )Nz(name=z, p=z, m=z, mstd=z, mmax=))	__class____name__r   r   r   r   r   )r   fsr   r   r   __repr__  s    
zAugmentOp.__repr__)r|   r   Nr   
__module____qualname__r   r   r   r   r   r   r   r   e  s   
r   c                    s   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d1d2|D }|S )3Nr   皙?r+   r   r   r   rk   皙?	   r   333333?   rk   r   r+   r   r   re   r   r   r   r   r      r   r   r   r   r   r   rk   皙?r   r   r   re   r   r   re   r   r   r   r   r   r   rk   r   r+   r   rx   r   r   r   r   r   r   r   r   rx   r   r   r   r   rk   r   r   r   r   r   )r   r      r   r   r   r   r   re   rk   r   r   r   r   r   r   r   r   r   rx   r   r   r   r   r   r?   r   r   r   r   r   r   r   rk   r   r   rk   rx   r   r   r   r   r   r   r   r   r?   re   r   rx   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'   c                    s   g | ]} fd d|D qS )c                    s   g | ]}t |d  iqS r   r   r   rC   r  r   r   r     r   z5auto_augment_policy_v0.<locals>.<listcomp>.<listcomp>r   r   spr  r   r   r     r   z*auto_augment_policy_v0.<locals>.<listcomp>r   r   policyZpcr   r  r   auto_augment_policy_v0  s8    r  c                    s   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d1d2|D }|S )3Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r  r  r  c                    s   g | ]} fd d|D qS )c                    s   g | ]}t |d  iqS r  r  r  r  r   r   r     r   z6auto_augment_policy_v0r.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r     r   z+auto_augment_policy_v0r.<locals>.<listcomp>r   r	  r   r  r   auto_augment_policy_v0r  s8    r  c                    s   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%|D }|S )&N)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   re   r   r   r   r   r   r   )r   r   r'   r   r   r   r   r   r   r   re   )r   r   r   rk   r   r   r   r   r   r   r   r   r   r?   r   r   r   r   r   rx   re   r   rg   rx   re   rk   rx   r   rk   r   re   r   r   r   ro   r   r   r   r   re   r   r   r'   r   c                    s   g | ]} fd d|D qS )c                    s   g | ]}t |d  iqS r  r  r  r  r   r   r     r   z;auto_augment_policy_original.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r     r   z0auto_augment_policy_original.<locals>.<listcomp>r   r	  r   r  r   auto_augment_policy_original  s8    r$  c                    s   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%|D }|S )&N)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  r   r  r  r  r   r!  r"  r#  r   c                    s   g | ]} fd d|D qS )c                    s   g | ]}t |d  iqS r  r  r  r  r   r   r     r   z<auto_augment_policy_originalr.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r     r   z1auto_augment_policy_originalr.<locals>.<listcomp>r   r	  r   r  r   auto_augment_policy_originalr  s8    r%  c                    s&   dgdgdgg} fdd|D }|S )N)r   rx   r'   )r   rx   r   )r   rx   r   c                    s   g | ]} fd d|D qS )c                    s   g | ]}t |d  iqS r  r  r  r  r   r   r   "  r   z5auto_augment_policy_3a.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r   "  r   z*auto_augment_policy_3a.<locals>.<listcomp>r   r	  r   r  r   auto_augment_policy_3a  s    r&  v0c                 C   sn   |pt }| dkrt|S | dkr(t|S | dkr8t|S | dkrHt|S | dkrXt|S dsjJ d|  d S )NoriginalZ	originalrr'  Zv0r3aFzUnknown AA policy )r   r$  r%  r  r  r&  )r   r   r   r   r   auto_augment_policy&  s    r*  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )AutoAugmentc                 C   s
   || _ d S r@   )r
  )r   r
  r   r   r   r   7  s    zAutoAugment.__init__c                 C   s"   t | j}|D ]}||}q|S r@   )r    r!   r
  )r   r1   Z
sub_policyopr   r   r   r   :  s    
zAutoAugment.__call__c                 C   sL   | j jd }| jD ],}|d7 }|ddd |D 7 }|d7 }q|d7 }|S )Nz(policy=z
	[z, c                 S   s   g | ]}t |qS r   )str)r   r,  r   r   r   r   D  r   z(AutoAugment.__repr__.<locals>.<listcomp>]r   )r   r   r
  join)r   r   pr   r   r   r   @  s    

zAutoAugment.__repr__Nr   r   r   r   r   r+  5  s   r+  )
config_strr   c           	      C   s   |  d}|d }|dd }|D ]T}t d|}t|dk r@q"|dd \}}|dkrj|dt| q"d	s"J d
q"t||d}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   r+   N(\d.*)r   mstdr   Fz"Unknown AutoAugment config sectionr  )splitrera   
setdefaultr   r*  r+  )	r1  r   configZpolicy_namerE   cskeyvalZ	aa_policyr   r   r   auto_augment_transformJ  s    
r<  )r   r   r   r   r   r   r   rk   rg   rm   ro   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   rs   r   r   r+   )r   r   rs   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                 C   s4   t t|   \} }t|}|t| }| |fS r@   )r   zipitemsnparraysum)r=  Zprobsr   r   r   _get_weighted_transforms  s    
rC  )r   c                 C   s0   | dkrt S | dkrtS | dkr$tS |r,tS tS )NweightsZ3awr)  )_RAND_WEIGHTED_0_RAND_WEIGHTED_3A_RAND_3A_RAND_INCREASING_TRANSFORMS_RAND_TRANSFORMS)r   
increasingr   r   r   rand_augment_choices  s    rK  r   r   r   r   r=  c                    s&    pt  |pt} fdd|D S )Nc                    s   g | ]}t | d qS )r   r   r   r  r   r   r   r   r   r   r   r     s   z$rand_augment_ops.<locals>.<listcomp>)r   rI  rL  r   rO  r   rand_augment_ops  s
    rP  c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
RandAugmentr   Nc                 C   s   || _ || _|| _d S r@   )ops
num_layerschoice_weights)r   rR  rS  rT  r   r   r   r     s    zRandAugment.__init__c                 C   s6   t jj| j| j| jd u | jd}|D ]}||}q$|S )N)replacer0  )r@  r    r!   rR  rS  rT  )r   r1   rR  r,  r   r   r   r     s    
zRandAugment.__call__c                 C   s<   | j jd| j d }| jD ]}|d| 7 }q|d7 }|S )Nz(n=, ops=
	r   )r   r   rS  rR  r   r   r,  r   r   r   r     s
    
zRandAugment.__repr__)r   Nr   r   r   r   r   rQ    s   
rQ  )r1  r   r=  c                 C   s  t }d}d}d}| d}|d dks*J |dd }|D ]}|d	rft|dd }	|du rd|	}q:td
|}
t|
dk rq:|
dd \}}	|dkrt|	}|dkrtd}|d| q:|dkr|dt|	 q:|dkrt	|	rd}q:|dkrt|	}q:|dkrt|	}q:|dkr*t|	}q:ds:J dq:t
|trRt||d}n|du rj|rftnt}d}t
|trt|\}}t||||d}t|||d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|   r2  r   Zrandr+   Ntr3  r4  d   r   r   Zmmaxr   incTmnr0  z"Unknown RandAugment config section)rJ  rL  )rT  )r   r5  
startswithr-  r6  ra   r   r7  r   boolr   rK  rH  rI  r   rC  rP  rQ  )r1  r   r=  r   rS  rJ  r   r8  rE   r;  r9  r:  r4  rT  Zra_opsr   r   r   rand_augment_transform  sT    








r`  )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=  c                    s$    pt  |pt} fdd|D S )Nc                    s   g | ]}t |d  dqS )rx   rM  r  rN  r   r   r   r   r   c  s   zaugmix_ops.<locals>.<listcomp>)r   _AUGMIX_TRANSFORMSra  r   rb  r   
augmix_ops\  s
    rd  c                   @   sB   e Zd ZdZdddZdd	 Zd
d Zdd Zdd Zd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
    rx   r   Fc                 C   s"   || _ || _|| _|| _|| _d S r@   )rR  alphawidthdepthblended)r   rR  rg  rh  ri  rj  r   r   r   r   q  s
    zAugMixAugment.__init__c                 C   s\   || }d}g }|d d d D ]"}|| }|d| 9 }| | qtj|d d d tjdS )Nrx   rf  r+   Zdtype)r^   r@  rA  float32)r   wsr\  ZcumpZrwsrP   rg  r   r   r   _calc_blended_weightsx  s    z#AugMixAugment._calc_blended_weightsc                 C   sx   |  }| ||}|D ]Z}| jdkr,| jntjdd}tjj| j|dd}|}	|D ]}
|
|	}	qVt	||	|}q|S )Nr   r+   r   TrU  )
r   rn  ri  r@  r    randintr!   rR  r   blend)r   r1   mixing_weightsr\  Zimg_origrm  rP   ri  rR  img_augr,  r   r   r   _apply_blended  s    
zAugMixAugment._apply_blendedc                 C   s   |j d |j d t| f}tj|tjd}|D ]d}| jdkrF| jntjdd}tjj	| j
|dd}|}	|D ]}
|
|	}	qp||tj|	tjd 7 }q2tj|dd|d t|tj}t|||S )	Nr   r+   rk  r   Tro  g     o@)out)r.   ra   Zgetbandsr@  zerosrl  ri  r    rp  r!   rR  ZasarrayZclipr   Z	fromarrayZastypeZuint8rq  )r   r1   rr  r\  Z	img_shapemixedmwri  rR  rs  r,  r   r   r   _apply_basic  s    
zAugMixAugment._apply_basicc                 C   s\   t t j| jg| j }t t j| j| j}| jrJ| |||}n| 	|||}|S r@   )
r@  rl  r    Z	dirichletrg  rh  betarj  rt  ry  )r   r1   rr  r\  rw  r   r   r   r     s    zAugMixAugment.__call__c                 C   sL   | j jd| j d| j d| j d }| jD ]}|d| 7 }q,|d7 }|S )Nz(alpha=z, width=z, depth=rV  rW  r   )r   r   rg  rh  ri  rR  rX  r   r   r   r     s
    &
zAugMixAugment.__repr__N)rx   r   rf  F)
r   r   r   __doc__r   rn  rt  ry  r   r   r   r   r   r   re  k  s   

	re  c                 C   s  d}d}d}d}d}|  d}|d dks.J |dd	 }|D ]}t d
|}	t|	dk r\q>|	d	d \}
}|
dkr|dt| q>|
dkrt|}q>|
dkrt|}q>|
dkrt|}q>|
dkrt|}q>|
dkrt|}q>ds>J dq>|dtd t||d}t|||||d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   rf  rx   Fr2  r   Zaugmixr+   Nr3  r   r4  r   r\  rP   rF   rC   rD   zUnknown AugMix config sectionr   )r   r   )rg  rh  ri  rj  )	r5  r6  ra   r7  r   r   r_  rd  re  )r1  r   r   rh  ri  rg  rj  r8  rE   r9  r:  r;  rR  r   r   r   augment_and_mix_transform  s:    





r|  )r   )r?   rx   T)r'  N)N)T)r   r|   NN)NN)r   NN)N)ar{  r    rJ   r6  	functoolsr   typingr   r   r   r   ZPILr   r   r	   r
   r   numpyr@  r   __version__r5  r(   r   r   r   r   hasattrr   ZBILINEARZBICUBICr   r   r$   r)   r3   r4   r8   r9   r;   r<   rI   rT   rU   rV   rW   rd   rf   rj   rl   rn   rp   rt   rw   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r$  r%  r&  r*  r+  r-  r<  rI  rH  rG  rF  rE  rC  rK  r   r   rP  rQ  r`  rc  rd  re  r|  r   r   r   r   <module>   st  "



!2!"!!

#    
  Q   
I