
    i"              	          d dl mZ d dlmZmZ d dlZd dlZd dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d dlmZ esdgZnd d	lmZmZ  ee      j-                         j.                  d
z  dz  Z G d de	j2                        Z G d dej                  j2                        Zde
de
de
fdZde
deed      de
fdZ	 dde
de
deed      de
fdZy)    )Path)ListOptionalN)Tensor)conv2d)Literal)_TORCHVISION_AVAILABLE+deep_image_structure_and_texture_similarity)VGG16_Weightsvgg16dists_modelsz
weights.ptc            	       R     e Zd ZU dZeed<   ddedededdf fdZd	edefd
Z xZ	S )	L2poolingzL2 pooling layer.filterfilter_sizestridechannelsreturnNc           	      v   t         |           |dz
  dz  | _        || _        || _        t        j                  |      dd }t        j                  |d d d f   |d d d f   z        }|t        j                  |      z  }| j                  d|d d d d d d f   j                  | j                  ddd             y )N      r   )super__init__paddingr   r   nphanningtorchr   sumregister_bufferrepeat)selfr   r   r   ag	__class__s         x/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torchmetrics/functional/image/dists.pyr   zL2pooling.__init__=   s    #aA- JJ{#Ab)LL1d7aaj01		!XqtQ)9':'A'A$--QRTUWX'YZ    tensorc                     |dz  }t        || j                  | j                  | j                  |j                  d         }|dz   j                         S )zForward pass of the layer.r   r   )r   r   groupsg-q=)r   r   r   r   shapesqrt)r"   r(   outs      r&   forwardzL2pooling.forwardG   sI    VT[[dll[a[g[ghi[jke!!##r'   )   r      )
__name__
__module____qualname____doc__r   __annotations__intr   r.   __classcell__r%   s   @r&   r   r   8   sE    N[C [S [ [TX [$f $ $r'   r   c            	            e Zd ZU dZeed<   eed<   eed<   eed<   ddeddf fd	Zd
edee   fdZ	dd
edededefdZ
 xZS )DISTSNetworkzDISTS network.alphabetameanstdload_weightsr   Nc                 ~	   t         |           t        st        d      t	        t
        j                        j                  }t        j                  j                         | _        t        j                  j                         | _        t        j                  j                         | _        t        j                  j                         | _        t        j                  j                         | _        t!        d      D ]*  }| j                  j#                  t%        |      ||          , | j                  j#                  t%        d      t'        d             t!        dd      D ]*  }| j                  j#                  t%        |      ||          , | j                  j#                  t%        d      t'        d             t!        d	d
      D ]*  }| j                  j#                  t%        |      ||          , | j                  j#                  t%        d
      t'        d             t!        dd      D ]*  }| j                  j#                  t%        |      ||          , | j                  j#                  t%        d      t'        d             t!        dd      D ]*  }| j                  j#                  t%        |      ||          , | j)                         D ]	  }d|_         | j-                  dt        j.                  g d      j1                  dddd             | j-                  dt        j.                  g d      j1                  dddd             g d| _        | j5                  dt        j6                  t        j8                  dt;        | j2                        dd                   | j5                  dt        j6                  t        j8                  dt;        | j2                        dd                   | j<                  j>                  jA                  dd       | jB                  j>                  jA                  dd       |rqtD        jG                         stI        dtD               t        jJ                  t%        tD                    }|d   | j<                  _        |d   | jB                  _        y y )Nz]DISTS requires torchvision to be installed. Please install it with `pip install torchvision`.)weights   @   )r   r/   	      
                        Fr=   )g
ףp=
?gv/?gCl?r   r   r>   )gZd;O?gy&1?g?)r0   rC   rE   rH   rK   rK   r;   r<   g?g{Gz?z!The weights file is not found in )&r   r   r	   ModuleNotFoundErrorr   r   DEFAULTfeaturesr   nn
Sequentialstage1stage2stage3stage4stage5range
add_modulestrr   
parametersrequires_gradr    r(   viewchnsregister_parameter	Parameterrandnr   r;   datanormal_r<   _PATH_WEIGHT_DISTSexistsFileNotFoundErrorload)r"   r?   vgg_pretrained_featuresxparamrA   r%   s         r&   r   zDISTSNetwork.__init__V   sf   %%o  #(0E0E"F"O"Ohh))+hh))+hh))+hh))+hh))+qAKK""3q6+B1+EF s1vy"'=>q!AKK""3q6+B1+EF s1vy#'>?r2AKK""3q6+B1+EF s2w	3(?@r2AKK""3q6+B1+EF s2w	3(?@r2AKK""3q6+B1+EF  __&E"'E ' 	VU\\2G%H%M%MaQSUVXY%Z[UELL1F$G$L$LQPRTUWX$YZ/	ekk!S^UVXY6Z)[\U[[C		NTUWX5Y(Z[

T*		sD)%,,.'*KL^K_(`aajj%7!89G%g.DJJO$V_DIIN r'   ri   c                    || j                   z
  | j                  z  }| j                  |      }|}| j                  |      }|}| j	                  |      }|}| j                  |      }|}| j                  |      }|}||||||gS )zForward pass of the network.)r=   r>   rS   rT   rU   rV   rW   )r"   ri   h	h_relu1_2	h_relu2_2	h_relu3_3	h_relu4_3	h_relu5_3s           r&   forward_oncezDISTSNetwork.forward_once   s    ]dhh&KKN	KKN	KKN	KKN	KKN	9iIyIIr'   yrequire_gradc                    |r#| j                  |      }| j                  |      }n?t        j                         5  | j                  |      }| j                  |      }ddd       t        j                  d|j                        }t        j                  d|j                        }d\  }}	| j
                  j                         | j                  j                         z   }
t        j                  | j
                  |
z  | j                  d      }t        j                  | j                  |
z  | j                  d      }t        t        | j                              D ]  }|   j                  ddgd	
      }|   j                  ddgd	
      }d|z  |z  |z   |dz  |dz  z   |z   z  }|||   |z  j                  dd	
      z   }||   |z
  dz  j                  ddgd	
      }||   |z
  dz  j                  ddgd	
      }||   ||   z  j                  ddgd	
      ||z  z
  }d|z  |	z   ||z   |	z   z  }|||   |z  j                  dd	
      z   } d||z   j                         z
  S # 1 sw Y   xY w)z(Computes DISTS score between two images.Ng        )device)ư>rw   r   )dimr   r0   T)keepdim)rr   r   inference_moder(   rv   r;   r   r<   splitr^   rX   lenr=   squeeze)r"   ri   rs   rt   feats0feats1dist1dist2c1c2w_sumr;   r<   kx_meany_means1x_vary_varxy_covs2s                        r&   r.   zDISTSNetwork.forward   s[   &&q)F&&q)F%%'**1-**1- ( S:S:B

 499==?2DJJ.		qA{{499u,diiQ?s499~&AAY^^QFD^9FAY^^QFD^9Ff*v%*vqy619/Dr/IJBU1X]//4/@@EQi&(Q.44aVT4JEQi&(Q.44aVT4JEQi&)+111a&$1G&SY/YFf*r/eemb&89BT!Wr\..q$.??E ' EEM**,,,+ ('s   #I++I5)T)F)r1   r2   r3   r4   r   r5   boolr   r   rr   r.   r7   r8   s   @r&   r:   r:   N   si    M
L
L	K--T --T --^Jf Jf J- -F -$ -6 -r'   r:   predstargetr   c                 r    t               j                  | j                        } || || j                        S )N)rt   )r:   torv   r\   )r   r   distss      r&   _dists_updater      s-    Nell+EU-@-@AAr'   scores	reduction)r   r=   nonec                     |dk(  r| j                         S |dk(  r| j                         S ||dk(  r| S t        d| d|       )Nr   r=   r   z	Argument z8 is not valid. Choose 'sum', 'mean' or 'none'., but got )r   r=   
ValueError)r   r   s     r&   _dists_computer      sW    Ezz|F{{}I/
y+cdmcno
ppr'   c                 2    t        | |      }t        ||      S )a  Calculates `Deep Image Structure and Texture Similarity`_ (DISTS) score.

    Args:
        preds: Predicted image tensor.
        target: Target image tensor.
        reduction: Reduction method for the output.

    Returns:
        DISTS Similarity score between the two images.

    Example:
        >>> from torch import rand
        >>> preds = rand(5, 3, 256, 256)
        >>> target = rand(5, 3, 256, 256)
        >>> deep_image_structure_and_texture_similarity(preds, target)
        tensor([0.1285, 0.1344, 0.1356, 0.1277, 0.1276], grad_fn=<RsubBackward1>)
        >>> deep_image_structure_and_texture_similarity(preds, target, reduction='mean')
        tensor(0.1308, grad_fn=<MeanBackward0>)

    )r   r   )r   r   r   r   s       r&   r
   r
      s    . 5&)F&),,r'   )N)pathlibr   typingr   r   numpyr   r   torch.nnrQ   r   torch.nn.functionalr   typing_extensionsr   torchmetrics.utilities.importsr	   __doctest_skip__torchvision.modelsr   r   __file__resolveparentrd   Moduler   r:   r   r   r
    r'   r&   <module>r      s   H  !     & % AEF7(^++-44~ET $		 $,a-588?? a-HB B BF B
q6 qhw?T7U.V q[a q Z^--!-.6w?T7U.V--r'   