
    3j,                         S SK r S SKJrJrJrJrJrJrJr  S SK	r	SSK
JrJrJrJrJrJrJrJr  SSKJr  SSKJr  \\   r\\	R2                  \\\	R2                  4   4   r " S S\5      rg)	    N)AnyDictListOptionalTupleUnioncast   )AugmentationSequentialColorJitterImageSequentialRandomAffineRandomErasingRandomGaussianNoiseRandomHorizontalFlipRandomRotation90)_AugmentationBase)	ParamItemc                   `  ^  \ rS rSrSrSSSSSSS	S
SSSS.S\\\4   S\S\S\S\S\S\	S\\
R                  \\\4   4   S\\
R                  \\\4   4   S\S\\   S\\   S\SS4U 4S jjjrS\\
R                  \\\4   4   S\\
R                  \\\4   4   S \S\\\\4   S!4   4S" jrS#\SS4S$ jrS%\S\S\\	\\\\
R,                  4      4   4S& jrS%\S\S'\
R                  S\4S( jrS)\S*\S'\
R                  S\4S+ jr   S/S%\S,\\\      S\\   S#\\   S\4
U 4S- jjjrS.rU =r$ )0!AdaptiveDiscriminatorAugmentation(   a  Implementation of Adaptive Discriminator Augmentation for GANs training as introduced in :cite:`Karras2020ada`.

adjust a global probability p over all augmentations list to select a subset of images to augment
based on an exponential moving average of the Discriminator's accuracy labeling real samples.


Args:
    *args: a list of kornia augmentation modules, set to a default list if not specified.

    initial_p: initial global probability `p` for applying the augmentations

    adjustment_speed: float
        step size for updating the global probability `p`

    max_p: maximum allowed value for `p`

    target_real_acc: target Discriminator accuracy to guide `p` adjustments


    ema_lambda: EMA smoothing factor. The real accuracy EMA is what's used to determine the `p` update

    update_every: `p` update frequency (in steps)

    erasing_scale: scale range used for `RandomErasing` if default augmentations are used

    erasing_ratio: aspect ratio range used for `RandomErasing` if default augmentations are used

    erasing_fill_value: fill value used in `RandomErasing`

    same_on_batch: apply the same transformation across the batch

    data_keys: input types to apply augmentations on


    **kwargs: Additional keyword arguments passed to `AugmentationSequential`


Examples:
    >>> from kornia.augmentation.presets.ada import AdaptiveDiscriminatorAugmentation
    >>> original = torch.randn(2, 3, 16, 16)
    >>> ada = AdaptiveDiscriminatorAugmentation()
    >>> augmented = ada(original)

This example demonstrates using default augmentations with AdaptiveDiscriminatorAugmentation in a GAN training loop.


    >>> import kornia.augmentation as K
    >>> from kornia.augmentation.presets.ada import AdaptiveDiscriminatorAugmentation
    >>> originals = torch.randn(2, 3, 5, 6)
    >>> aug_list = [
    ...     K.RandomRotation90(times=(0, 3), p=1),
    ...     K.RandomAffine(degrees=10, translate=(.1, .1), scale=(.9, 1.1), p=1),
    ...     K.ColorJitter(brightness=.2, contrast=.2, saturation=.2, hue=.1, p=1),
    ... ]

    >>> ada = AdaptiveDiscriminatorAugmentation(*aug_list)
    >>> augmented = ada(original)

This example demonstrates using custom augmentations with AdaptiveDiscriminatorAugmentation.
gh㈵>g{Gz?g?g333333?gGz?   )g{Gz?gQ?)g333333?gffffff
@g        NF)	initial_padjustment_speedmax_ptarget_real_acc
ema_lambdaupdate_everyerasing_scaleerasing_ratioerasing_fill_value	data_keyssame_on_batchargsr   r   r   r   r   r   r   r    r!   r"   r#   kwargsreturnc                X  > U(       d  U R                  XxU	5      n[        TU ]  " UU
b  U
OS/US.UD6  US::  a  [        SU S35      eSUs=::  a  S::  d  O  [        SU S35      eSUs=::  a  S::  d  O  [        S	U S35      eUS:  a  [        S
U S35      eSUs=::  a  S::  d  O  [        SU S35      eSUs=::  a  S::  d  O  [        SU S35      eX:  a  [        R
                  " SU SU S3SS9  UnXl        X l        X0l        X@l	        XPl
        X`l        SU l        SU l        g )Ninput)r"   r#   r   zInvalid `adjustment_speed` (u   ) — must be greater than 0   zInvalid `target_real_acc` (u   ) — must be in [0, 1]zInvalid `ema_lambda` (zInvalid `update_every` (u   ) — must be at least 1zInvalid `max_p` (zInvalid `initial_p` (z`initial_p` (z) is greater than `max_p` (z#), resetting `initial_p` to `max_p`r
   )
stacklevelg      ?)default_ada_transfromssuper__init__
ValueErrorwarningswarnpr   r   r   r   r   real_acc_ema
_num_calls)selfr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   	__class__s                 Y/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/augmentation/presets/ada.pyr-   *AdaptiveDiscriminatorAugmentation.__init__f   sz     ..}M_`D$    (		
 		
 q ;<L;MMijkkO(q(:?:KKbcddJ#!#5j\AXYZZ!7~E]^__EQ07NOPPI""4YK?VWXXMM	{*EeWLop I 0
.$(#&    scaleratiovalue.c                 |    [        SS9[        SSS9[        XUSS9[        SS	S
SS9[	        SSSSSS9[        SSS94$ )a4  Return the default augmentation stack used by ADA.

Args:
    scale: Erase-area range passed to :class:`RandomErasing`.
    ratio: Erase-aspect-ratio range passed to :class:`RandomErasing`.
    value: Fill value used by :class:`RandomErasing`.

Returns:
    Tuple of augmentation modules applied inside ADA.
r)   )r1   )r      g      ?)timesr1   ?)r9   r:   r;   r1   
   )皙?rA   )r?   g?)degrees	translater9   r1   g?rA   )
brightnesscontrast
saturationhuer1   )stdr1   )r   r   r   r   r   r   )r4   r9   r:   r;   s       r6   r+   8AdaptiveDiscriminatorAugmentation.default_ada_transfroms   sU    $ !1%6S1%3GzsS3#QTUC3/
 	
r8   real_accc                    U =R                   S-  sl         U R                   U R                  :  a  gSU l         U R                  U R                  -  SU R                  -
  U-  -   U l        U R                  U R                  :  a)  [        SU R                  U R                  -
  5      U l        g[        U R                  U R                  -   U R                  5      U l        g)aI  Update internal params `p` once every `update_every` calls based on discriminator accuracy.

the update is based on an exponential moving average of `real_acc`
`p` is updated by adding or subtracting `adjustment_speed` from it and clamp it at [0, `max_p`]

Args:
    real_acc: the Discriminator's accuracy labeling real samples.
r)   Nr   )
r3   r   r   r2   r   maxr1   r   minr   )r4   rJ   s     r6   update(AdaptiveDiscriminatorAugmentation.update   s     	1??T... OOd.?.??1tCVZbBbbt333DFFT%:%::;DF$"7"77DDFr8   inputsc                     [        U[        5      (       a)  US   nX   R                  S5      nX   R                  nXE4$ UR                  S5      nUR                  nXE4$ )Nr   )
isinstancedictsizedevice)r4   rP   r"   key
batch_sizerU   s         r6   _get_inputs_metadata6AdaptiveDiscriminatorAugmentation._get_inputs_metadata   se     fd##A,C))!,J[''F
 !!  QJ]]F!!r8   p_tensorc                 n    [        U[        5      (       a  U Vs0 s H
  oDX   U   _M     sn$ X   $ s  snf )N)rR   rS   )r4   rP   r"   rZ   rV   s        r6   _sample_inputs0AdaptiveDiscriminatorAugmentation._sample_inputs   s=    fd##:CD)3X..)DD## Es   2original	augmentedc                    [        U[        5      (       aL  [        U[        5      (       a7  0 nUR                  5        H  nX   R                  5       nX%   Xc'   XdU'   M!     U$ [        U[        R
                  5      (       a5  [        U[        R
                  5      (       a  UR                  5       nX$U'   U$ [        S[        U5       S[        U5       S35      e)NzCoriginal inputs and augmented inputs aren't of the same type (type(z), type(z)))rR   rS   keysclonetorchTensor	TypeErrortype)r4   r^   r_   rZ   mergedrV   merged_tensors          r6   _merge_inputs/AdaptiveDiscriminatorAugmentation._merge_inputs   s     h%%*Y*E*EF}} ( 3 3 5*3.'+s '  %,,//Jy%,,4W4W^^%F(8 	 h(i0AE r8   paramsc           	      >  > Ub  U R                  U5        U R                  S:X  a  U$ Uc6  U R                  b&  U R                   Vs/ s H  oUR                  PM     snOS/nU R	                  XS9u  pg[
        R                  " [
        R                  " U4U R                  [
        R                  US95      R                  5       nUR                  5       (       d  U$ U R                  XUS9n	[        [        [        TU ]=  U	UUS95      n
U R!                  XU5      $ s  snf )aG  Apply augmentations to a subset of input tensors with global probability `p`.

This method applies the augmentation pipeline to a subset of input samples, randomly selected
via a Bernoulli distribution with probability `p`

if `real_acc` is provided, the internal probability `p` is updated via the `update` method.
Non-augmented samples retain their original values, and the output matches the input structure.

`real_acc` is the Discriminator's accuracy on real images; for example,
`(real_logits > 0).float().mean().item()` if using logits andn assuming real labels are positive.
r   r(   )r"   )dtyperU   )r"   rZ   )rk   r"   )rN   r1   r"   namerX   rc   	bernoullifullfloat32boolanyr\   r	   _inputs_typer,   forwardri   )r4   rP   rk   r"   rJ   krW   rU   rZ   selected_inputsaugmented_inputsr5   s              r6   ru   )AdaptiveDiscriminatorAugmentation.forward   s   $ KK!66Q;M >>- "&0A0   "66v6S
??5::zmTVV5==ag#hinnp||~~M(,(;(;Fbj(;(kGO#  
 !!&HEE1 1s   D)r3   r   r   r   r1   r2   r   r   )NNN)__name__
__module____qualname____firstlineno____doc__r   r   r   floatintrc   rd   r   r   _data_keys_typerr   r   r-   r+   rN   rt   strrU   rX   r\   ri   r   r   ru   __static_attributes____classcell__)r5   s   @r6   r   r   (   sw   ;@  "&!% BNBL$'/3(->&78> >  	>
 > > > > U\\5+>>?> U\\5+>>?> "> O,>  ~> > 
> >@
U\\5#667
 U\\5#667
 	

 
u&78#=	>
4Eu E E,"""/>"	sHU3#4566	7"$\ $o $Y^YeYe $jv $   ,,	
 
4 -1/3$(2F2F i)2F O,	2F
 5/2F 
2F 2Fr8   r   )r/   typingr   r   r   r   r   r   r	   rc    r   r   r   r   r   r   r   r   baser   container.paramsr   r   r   rd   rt   r    r8   r6   <module>r      sh   $  @ @ @ 	 	 	 % (s)U\\4U\\(9#::;JF(> JFr8   