Ë
    þÍ:jÞD  ã                   ó  — d dl Z d dlZd dlmZmZmZmZ d dlZd dlmZm	Z	 d dl
mZ d dlmZ dddd	œZesd
dgZd7dedede	j$                  j&                  j(                  fd„Z G d„ dej                  j,                  «      Z G d„ dej                  j,                  «      Z G d„ dej                  j,                  «      Zd8dededefd„Zd9dedeedf   defd„Zd:dededefd„Zd;ded edefd!„Z  G d"„ d#e	j,                  «      Z! G d$„ d%e	j,                  «      Z" G d&„ d'e	j,                  «      Z# G d(„ d)e#«      Z$d*ed+edefd,„Z%d-ed.ede	j,                  d+edef
d/„Z&d<d0ed1eed2      defd3„Z'	 	 	 d=d-ed.ed4ed5   d1eed2      d+edefd6„Z(y)>é    N)ÚListÚ
NamedTupleÚOptionalÚUnion)ÚTensorÚnn)ÚLiteral)Ú_TORCHVISION_AVAILABLEÚSqueezeNet1_1_WeightsÚAlexNet_WeightsÚVGG16_Weights)Úsqueezenet1_1ÚalexnetÚvgg16Ú)learned_perceptual_image_patch_similarityÚ_get_tv_model_featuresÚnetÚ
pretrainedÚreturnc                 ó"  — t         st        d«      ‚ddl}|rPt        |j                  t
        |    «      } t        |j                  | «      |j                  ¬«      }|j                  S  t        |j                  | «      d¬«      }|j                  S )aA  Get torchvision network.

    Args:
        net: Name of network
        pretrained: If pretrained weights should be used

    >>> _ = _get_tv_model_features("alexnet", pretrained=True)
    >>> _ = _get_tv_model_features("squeezenet1_1", pretrained=True)
    >>> _ = _get_tv_model_features("vgg16", pretrained=True)

    zSTorchvision is not installed. Please install torchvision to use this functionality.r   N)Úweights)r
   ÚModuleNotFoundErrorÚtorchvisionÚgetattrÚmodelsÚ_weight_mapÚDEFAULTÚfeatures)r   r   r   Úmodel_weightsÚmodels        úx/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchmetrics/functional/image/lpips.pyr   r   -   s€   € õ "Ü!Ð"wÓxÐxÛáÜ × 2Ñ 2´KÀÑ4DÓEˆØ0”˜×*Ñ*¨CÓ0¸×9NÑ9NÔOˆð �>‰>Ðð 1”˜×*Ñ*¨CÓ0¸Ô>ˆØ�>‰>Ðó    c                   óB   ‡ — e Zd ZdZd	dededdfˆ fd„Zdedefd„Zˆ xZ	S )
Ú
SqueezeNetzSqueezeNet implementation.Úrequires_gradr   r   Nc           
      ó  •— t         ‰
| �  «        t        d|«      }d| _        g }t	        d«      t	        dd«      t	        dd«      t	        dd«      t	        dd«      t	        dd«      t	        dd	«      g}|D ]V  }t
        j                  j                  «       }|D ]   }|j                  t        |«      ||   «       Œ" |j                  |«       ŒX t        j                  |«      | _        |s| j                  «       D ]	  }	d
|	_        Œ y y )Nr   é   é   é   é   é
   é   é   é   F)ÚsuperÚ__init__r   ÚN_slicesÚrangeÚtorchr   Ú
SequentialÚ
add_moduleÚstrÚappendÚ
ModuleListÚslicesÚ
parametersr%   )Úselfr%   r   Úpretrained_featuresr9   Úfeature_rangesÚfeature_rangeÚseqÚiÚparamÚ	__class__s             €r!   r0   zSqueezeNet.__init__H   sù   ø€ Ü‰ÑÔÜ4°_ÀjÓQÐàˆŒØˆÜ ›(¤E¨!¨Q£K´°q¸!³¼eÀAÀr»lÌEÐRTÐVXËMÔ[`ÐacÐegÓ[hÔjoÐprÐtvÓjwÐxˆØ+ò 	ˆMÜ—(‘(×%Ñ%Ó'ˆCØ"ò ?�Ø—‘œs 1›vÐ':¸1Ñ'=Õ>ð?à�M‰M˜#Õð		ô —m‘m FÓ+ˆŒÙØŸ™Ó*ò ,�Ø&+�Õ#ñ,ð r"   Úxc                 ó‚   —  G d„ dt         «      }g }| j                  D ]  } ||«      }|j                  |«       Œ  ||Ž S )úProcess input.c                   óT   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   y)	ú*SqueezeNet.forward.<locals>._SqueezeOutputÚrelu1Úrelu2Úrelu3Úrelu4Úrelu5Úrelu6Úrelu7N©Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__© r"   r!   Ú_SqueezeOutputrG   ]   s%   … Ø‹MØ‹MØ‹MØ‹MØ‹MØ‹MØŒMr"   rU   )r   r9   r7   )r;   rC   rU   ÚrelusÚslice_s        r!   ÚforwardzSqueezeNet.forwardZ   sI   € ô	œZô 	ð ˆØ—k‘kò 	ˆFÙ�q“	ˆAØ�L‰L˜�Oð	ñ ˜uÐ%Ð%r"   ©FT©
rP   rQ   rR   Ú__doc__Úboolr0   r   r   rX   Ú__classcell__©rB   s   @r!   r$   r$   E   s4   ø„ Ù$ñ, dð ,Àð ,ÐPTõ ,ð$&˜ð & J÷ &r"   r$   c                   óB   ‡ — e Zd ZdZd	dededdfˆ fd„Zdedefd„Zˆ xZ	S )
ÚAlexnetzAlexnet implementation.r%   r   r   Nc                 ó  •— t         ‰| �  «        t        d|«      }t        j                  j                  «       | _        t        j                  j                  «       | _        t        j                  j                  «       | _        t        j                  j                  «       | _	        t        j                  j                  «       | _
        d| _        t        d«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, |s| j                  «       D ]	  }d|_        Œ y y )Nr   r)   r(   r*   r+   r-   F©r/   r0   r   r3   r   r4   Úslice1Úslice2Úslice3Úslice4Úslice5r1   r2   r5   r6   r:   r%   )r;   r%   r   Úalexnet_pretrained_featuresrC   rA   rB   s         €r!   r0   zAlexnet.__init__p   s³  ø€ Ü‰ÑÔÜ&<¸YÈ
Ó&SÐ#ä—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒØˆŒÜ�q“ò 	KˆAØ�K‰K×"Ñ"¤3 q£6Ð+FÀqÑ+IÕJð	Kä�q˜!“ò 	KˆAØ�K‰K×"Ñ"¤3 q£6Ð+FÀqÑ+IÕJð	Kä�q˜!“ò 	KˆAØ�K‰K×"Ñ"¤3 q£6Ð+FÀqÑ+IÕJð	Kä�q˜"“ò 	KˆAØ�K‰K×"Ñ"¤3 q£6Ð+FÀqÑ+IÕJð	Kä�r˜2“ò 	KˆAØ�K‰K×"Ñ"¤3 q£6Ð+FÀqÑ+IÕJð	KáØŸ™Ó*ò ,�Ø&+�Õ#ñ,ð r"   rC   c                 óö   — | j                  |«      }|}| j                  |«      }|}| j                  |«      }|}| j                  |«      }|}| j	                  |«      }|} G d„ dt
        «      } ||||||«      S )rE   c                   ó@   — e Zd ZU eed<   eed<   eed<   eed<   eed<   y)ú(Alexnet.forward.<locals>._AlexnetOutputsrH   rI   rJ   rK   rL   NrO   rT   r"   r!   Ú_AlexnetOutputsrk   •   s   … Ø‹MØ‹MØ‹MØ‹MØŒMr"   rl   ©rc   rd   re   rf   rg   r   )	r;   rC   ÚhÚh_relu1Úh_relu2Úh_relu3Úh_relu4Úh_relu5rl   s	            r!   rX   zAlexnet.forwardˆ   s}   € à�K‰K˜‹NˆØˆØ�K‰K˜‹NˆØˆØ�K‰K˜‹NˆØˆØ�K‰K˜‹NˆØˆØ�K‰K˜‹NˆØˆô	œjô 	ñ ˜w¨°¸'À7ÓKÐKr"   rY   rZ   r^   s   @r!   r`   r`   m   s7   ø„ Ù!ñ, dð ,Àð ,ÐPTõ ,ð0L˜ð L J÷ Lr"   r`   c                   óB   ‡ — e Zd ZdZd	dededdfˆ fd„Zdedefd„Zˆ xZ	S )
ÚVgg16zVgg16 implementation.r%   r   r   Nc                 ó  •— t         ‰| �  «        t        d|«      }t        j                  j                  «       | _        t        j                  j                  «       | _        t        j                  j                  «       | _        t        j                  j                  «       | _	        t        j                  j                  «       | _
        d| _        t        d«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, t        dd«      D ]*  }| j                  j                  t        |«      ||   «       Œ, |s| j                  «       D ]	  }d|_        Œ y y )	Nr   r)   é   é	   é   é   é   Frb   )r;   r%   r   Úvgg_pretrained_featuresrC   rA   rB   s         €r!   r0   zVgg16.__init__¢   s³  ø€ Ü‰ÑÔÜ"8¸À*Ó"MÐä—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒÜ—h‘h×)Ñ)Ó+ˆŒØˆŒÜ�q“ò 	GˆAØ�K‰K×"Ñ"¤3 q£6Ð+BÀ1Ñ+EÕFð	Gä�q˜!“ò 	GˆAØ�K‰K×"Ñ"¤3 q£6Ð+BÀ1Ñ+EÕFð	Gä�q˜"“ò 	GˆAØ�K‰K×"Ñ"¤3 q£6Ð+BÀ1Ñ+EÕFð	Gä�r˜2“ò 	GˆAØ�K‰K×"Ñ"¤3 q£6Ð+BÀ1Ñ+EÕFð	Gä�r˜2“ò 	GˆAØ�K‰K×"Ñ"¤3 q£6Ð+BÀ1Ñ+EÕFð	GáØŸ™Ó*ò ,�Ø&+�Õ#ñ,ð r"   rC   c                 óö   — | j                  |«      }|}| j                  |«      }|}| j                  |«      }|}| j                  |«      }|}| j	                  |«      }|} G d„ dt
        «      } ||||||«      S )rE   c                   ó@   — e Zd ZU eed<   eed<   eed<   eed<   eed<   y)ú"Vgg16.forward.<locals>._VGGOutputsÚrelu1_2Úrelu2_2Úrelu3_3Úrelu4_3Úrelu5_3NrO   rT   r"   r!   Ú_VGGOutputsr   Ç   s   … Ø‹OØ‹OØ‹OØ‹OØŒOr"   r…   rm   )	r;   rC   rn   Ú	h_relu1_2Ú	h_relu2_2Ú	h_relu3_3Ú	h_relu4_3Ú	h_relu5_3r…   s	            r!   rX   zVgg16.forwardº   s}   € à�K‰K˜‹NˆØˆ	Ø�K‰K˜‹NˆØˆ	Ø�K‰K˜‹NˆØˆ	Ø�K‰K˜‹NˆØˆ	Ø�K‰K˜‹NˆØˆ	ô	œ*ô 	ñ ˜9 i°¸IÀyÓQÐQr"   rY   rZ   r^   s   @r!   ru   ru   Ÿ   s7   ø„ Ùñ, dð ,Àð ,ÐPTõ ,ð0R˜ð R J÷ Rr"   ru   Úin_tensÚkeep_dimc                 ó,   — | j                  ddg|¬«      S )z2Spatial averaging over height and width of images.r(   é   )Úkeepdim©Úmean)r‹   rŒ   s     r!   Ú_spatial_averager’   Ñ   s   € à�<‰<˜˜A˜¨ˆ<Ó1Ð1r"   Úout_hw.c                 ó>   —  t        j                  |dd¬«      | «      S )z+Upsample input with bilinear interpolation.ÚbilinearF)ÚsizeÚmodeÚalign_corners)r   ÚUpsample)r‹   r“   s     r!   Ú	_upsamplerš   Ö   s   € àIŒ2�;‰;˜F¨À5ÔIÈ'ÓRÐRr"   Úin_featÚepsc                 ón   — t        j                  |t        j                  | dz  dd¬«      z   «      }| |z  S )zNormalize input tensor.r(   é   T)Údimr�   )r3   ÚsqrtÚsum)r›   rœ   Únorm_factors      r!   Ú_normalize_tensorr£   Û   s1   € ä—*‘*˜S¤5§9¡9¨W°a©Z¸QÈÔ#MÑMÓN€KØ�[Ñ Ð r"   rC   r–   c                 ó  — | j                   d   |kD  r@| j                   d   |kD  r.t        j                  j                  j	                  | ||fd¬«      S t        j                  j                  j	                  | ||fdd¬«      S )zlhttps://github.com/toshas/torch-fidelity/blob/master/torch_fidelity/sample_similarity_lpips.py#L127C22-L132.éÿÿÿÿéþÿÿÿÚarea)r—   r•   F)r—   r˜   )Úshaper3   r   Ú
functionalÚinterpolate)rC   r–   s     r!   Ú_resize_tensorr«   á   sp   € à‡w�wˆr�{�TÒ˜aŸg™g b™k¨DÒ0Ü�x‰x×"Ñ"×.Ñ.¨q°4¸°,ÀVÐ.ÓLÐLÜ�8‰8×Ñ×*Ñ*¨1¨t°T¨lÀÐ[`Ð*ÓaÐar"   c                   óJ   ‡ — e Zd ZU dZeed<   eed<   dˆ fd„Zdedefd„Zˆ xZS )	ÚScalingLayerzScaling layer.ÚshiftÚscaler   c                 óê   •— t         ‰| �  «        | j                  dt        j                  g d¢«      d d d …d d f   d¬«       | j                  dt        j                  g d¢«      d d d …d d f   d¬«       y )Nr®   )g¸…ëQ¸ž¿gºI+‡¶¿gªñÒMbÈ¿F)Ú
persistentr¯   )gZd;ßOÝ?gyé&1¬Ü?gÍÌÌÌÌÌÜ?)r/   r0   Úregister_bufferr3   r   )r;   rB   s    €r!   r0   zScalingLayer.__init__î   sp   ø€ Ü‰ÑÔØ×Ñ˜W¤e§l¡lÒ3KÓ&LÈTÒSTÐVZÐ\`ÐM`Ñ&aÐnsÐÔtØ×Ñ˜W¤e§l¡lÒ3HÓ&IÈ$ÒPQÐSWÐY]ÐJ]Ñ&^ÐkpÐÕqr"   Úinpc                 ó:   — || j                   z
  | j                  z  S ©rE   )r®   r¯   )r;   r³   s     r!   rX   zScalingLayer.forwardó   s   € à�d—j‘jÑ  D§J¡JÑ.Ð.r"   )r   N)	rP   rQ   rR   r[   r   rS   r0   rX   r]   r^   s   @r!   r­   r­   è   s)   ø… ÙàƒMØƒMõrð
/˜6ð / f÷ /r"   r­   c            	       óF   ‡ — e Zd ZdZd
dedededdfˆ fd„Zdedefd	„Zˆ xZ	S )ÚNetLinLayerz,A single linear layer which does a 1x1 conv.Úchn_inÚchn_outÚuse_dropoutr   Nc           	      óÀ   •— t         ‰| �  «        |rt        j                  «       gng }|t        j                  ||dddd¬«      gz  }t        j
                  |Ž | _        y )Nrž   r   F)ÚstrideÚpaddingÚbias)r/   r0   r   ÚDropoutÚConv2dr4   r    )r;   r¸   r¹   rº   ÚlayersrB   s        €r!   r0   zNetLinLayer.__init__û   sV   ø€ Ü‰ÑÔá#.”"—*‘*“,‘°BˆØÜ�I‰I�f˜g q°¸AÀEÔJð
ñ 	
ˆô —]‘] FÐ+ˆ�
r"   rC   c                 ó$   — | j                  |«      S rµ   )r    )r;   rC   s     r!   rX   zNetLinLayer.forward  s   € à�z‰z˜!‹}Ðr"   )rž   F)
rP   rQ   rR   r[   Úintr\   r0   r   rX   r]   r^   s   @r!   r·   r·   ø   s;   ø„ Ù6ñ,˜sð ,¨Sð ,À4ð ,ÐTXõ ,ð˜ð  F÷ r"   r·   c                   ó¨   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 ddeded   dedededed	ee   d
edee   ddfˆ fd„Z	 dde	de	dedede
e	ee	ee	   f   f   f
d„Zˆ xZS )Ú_LPIPSNr   r   ©ÚalexÚvggÚsqueezeÚspatialÚ	pnet_randÚ	pnet_tunerº   Ú
model_pathÚ	eval_modeÚresizer   c
           	      ó.  •— t         ‰| �  «        || _        || _        || _        || _        |	| _        t        «       | _        | j                  dv rt        }
g d¢| _
        n=| j                  dk(  rt        }
g d¢| _
        n| j                  dk(  rt        }
g d¢| _
        t        | j                  «      | _         
| j                   | j                  ¬«      | _        t!        | j                  d   |¬	«      | _        t!        | j                  d
   |¬	«      | _        t!        | j                  d   |¬	«      | _        t!        | j                  d   |¬	«      | _        t!        | j                  d   |¬	«      | _        | j"                  | j$                  | j&                  | j(                  | j*                  g| _        | j                  dk(  rit!        | j                  d   |¬	«      | _        t!        | j                  d   |¬	«      | _        | xj,                  | j.                  | j0                  gz  c_        t3        j4                  | j,                  «      | _        |r‰|€_t6        j8                  j;                  t6        j8                  j=                  t?        j@                  | j                  «      dd|› d�«      «      }| jC                  tE        jF                  |d¬«      d¬«       |r| jI                  «        | j                  s| jK                  «       D ]	  }d|_&        Œ yy)aß  Initializes a perceptual loss torch.nn.Module.

        Args:
            pretrained: This flag controls the linear layers should be pretrained version or random
            net: Indicate backbone to use, choose between ['alex','vgg','squeeze']
            spatial: If input should be spatial averaged
            pnet_rand: If backbone should be random or use imagenet pre-trained weights
            pnet_tune: If backprop should be enabled for both backbone and linear layers
            use_dropout: If dropout layers should be added
            model_path: Model path to load pretained models from
            eval_mode: If network should be in evaluation mode
            resize: If input should be resized to this size

        )rÈ   r   )é@   é€   é   é   rÔ   rÇ   )rÑ   éÀ   é€  rÓ   rÓ   rÉ   )rÑ   rÒ   rÓ   rÖ   rÖ   rÔ   rÔ   )r   r%   r   )rº   rž   r(   rŽ   rw   r)   é   Nz..zlpips_models/z.pthÚcpu)Úmap_locationF)Ústrict)'r/   r0   Ú	pnet_typerÌ   rË   rÊ   rÏ   r­   Úscaling_layerru   Úchnsr`   r$   ÚlenÚLr   r·   Úlin0Úlin1Úlin2Úlin3Úlin4ÚlinsÚlin5Úlin6r   r8   ÚosÚpathÚabspathÚjoinÚinspectÚgetfileÚload_state_dictr3   ÚloadÚevalr:   r%   )r;   r   r   rÊ   rË   rÌ   rº   rÍ   rÎ   rÏ   Únet_typerA   rB   s               €r!   r0   z_LPIPS.__init__
  sH  ø€ ô4 	‰ÑÔàˆŒØ"ˆŒØ"ˆŒØˆŒØˆŒÜ)›^ˆÔà�>‰>Ð-Ñ-ÜˆHÚ0ˆD�IØ�^‰^˜vÒ%ÜˆHÚ0ˆD�IØ�^‰^˜yÒ(Ü!ˆHÚ:ˆDŒIÜ�T—Y‘Y“ˆŒá¨4¯>©>Ð'9ÈÏÉÔXˆŒä §	¡	¨!¡¸+ÔFˆŒ	Ü §	¡	¨!¡¸+ÔFˆŒ	Ü §	¡	¨!¡¸+ÔFˆŒ	Ü §	¡	¨!¡¸+ÔFˆŒ	Ü §	¡	¨!¡¸+ÔFˆŒ	Ø—Y‘Y §	¡	¨4¯9©9°d·i±iÀÇÁÐKˆŒ	Ø�>‰>˜YÒ&Ü# D§I¡I¨a¡L¸kÔJˆDŒIÜ# D§I¡I¨a¡L¸kÔJˆDŒIØ�IŠI˜$Ÿ)™) T§Y¡YÐ/Ñ/�IÜ—M‘M $§)¡)Ó,ˆŒ	áØÐ!ÜŸW™WŸ_™_Ü—G‘G—L‘L¤§¡°·±Ó!?ÀÈÐWZÐV[Ð[_ÐG`Óaó�
ð × Ñ ¤§¡¨JÀUÔ!KÐTYÐ ÔZáØ�I‰IŒKà�~Š~ØŸ™Ó*ò ,�Ø&+�Õ#ñ,ð r"   Úin0Úin1ÚretperlayerÚ	normalizec                 ó^  — |rd|z  dz
  }d|z  dz
  }| j                  |«      | j                  |«      }}| j                  �.t        || j                  ¬«      }t        || j                  ¬«      }| j                  j	                  |«      | j                  j	                  |«      }}i i i }}
}	t        | j                  «      D ]6  }t        ||   «      t        ||   «      c|	|<   |
|<   |	|   |
|   z
  dz  ||<   Œ8 g }t        | j                  «      D ]‰  }| j                  rI|j                  t         | j                  |   ||   «      t        |j                  dd  «      ¬«      «       ŒX|j                  t         | j                  |   ||   «      d¬«      «       Œ‹ t        |«      }|r||fS |S )Nr(   rž   )r–   )r“   T)rŒ   )rÜ   rÏ   r«   r   rX   r2   rß   r£   rÊ   r7   rš   rå   Útupler¨   r’   r¡   )r;   rò   ró   rô   rõ   Ú	in0_inputÚ	in1_inputÚouts0Úouts1Úfeats0Úfeats1ÚdiffsÚkkÚresÚvals                  r!   rX   z_LPIPS.forwardU  s   € ñ Ø�c‘'˜A‘+ˆCØ�c‘'˜A‘+ˆCð  $×1Ñ1°#Ó6¸×8JÑ8JÈ3Ó8O�9ˆ	ð �;‰;Ð"Ü& y°t·{±{ÔCˆIÜ& y°t·{±{ÔCˆIà—x‘x×'Ñ'¨	Ó2°D·H±H×4DÑ4DÀYÓ4OˆuˆØ " B¨˜�ˆä˜Ÿ™“-ò 	7ˆBÜ%6°u¸R±yÓ%AÔCTÐUZÐ[]ÑU^ÓC_Ð"ˆF�2‰J˜˜r™
Ø ™ f¨R¡jÑ0°QÑ6ˆE�"ŠIð	7ð ˆÜ˜Ÿ™“-ò 	VˆBØ�|Š|Ø—
‘
œ9 ] T§Y¡Y¨r¡]°5¸±9Ó%=ÄeÈCÏIÉIÐVWÐVXÈMÓFZÔ[Õ\à—
‘
Ô+¨M¨D¯I©I°b©M¸%À¹)Ó,DÈtÔTÕUð		Vô ˜#“hˆÙØ˜�:ÐØˆ
r"   )	TrÇ   FFFTNTN)FF)rP   rQ   rR   r\   r	   r   r6   rÃ   r0   r   r   r÷   r   rX   r]   r^   s   @r!   rÅ   rÅ   	  sí   ø„ ð  Ø17ØØØØ Ø$(ØØ $ñI,àðI,ð Ð-Ñ.ðI,ð ð	I,ð
 ðI,ð ðI,ð ðI,ð ˜S‘MðI,ð ðI,ð ˜‘ðI,ð 
õI,ðX V[ñ Øð Ø &ð Ø59ð ØNRð à	ˆv�u˜V T¨&¡\Ð1Ñ2Ð2Ñ	3÷ r"   rÅ   c                   ó,   ‡ — e Zd ZdZdedd fˆ fd„Zˆ xZS )Ú_NoTrainLpipsz8Wrapper to make sure LPIPS never leaves evaluation mode.r—   r   c                 ó"   •— t         ‰| �  d«      S )z.Force network to always be in evaluation mode.F)r/   Útrain)r;   r—   rB   s     €r!   r  z_NoTrainLpips.train{  s   ø€ ä‰w‰}˜UÓ#Ð#r"   )rP   rQ   rR   r[   r\   r  r]   r^   s   @r!   r  r  x  s   ø„ ÙBð$˜$ð $ ?÷ $ñ $r"   r  Úimgrõ   c                 óÊ   — |r(| j                  «       dk  xr& | j                  «       dk\  n| j                  «       dk\  }| j                  dk(  xr | j                  d   dk(  xr |S )z1Check that input is a valid image to the network.g      ð?g        r¥   rw   rž   rŽ   )ÚmaxÚminÚndimr¨   )r  rõ   Úvalue_checks      r!   Ú
_valid_imgr  €  sV   € á;D�#—'‘'“)˜sÑ"Ò7 s§w¡w£y°CÒ'7È#Ï'É'Ë)ÐWYÉ/€KØ�8‰8�q‰=Ò>˜SŸY™Y q™\¨QÑ.Ò>°;Ð>r"   Úimg1Úimg2c                 óJ  — t        | |«      rt        ||«      sst        d| j                  › d|j                  › d| j                  «       | j	                  «       g› d|j                  «       |j	                  «       g› d|rddgnddg› d�«      ‚ || ||¬	«      j                  «       S )
NzeExpected both input arguments to be normalized tensors with shape [N, 3, H, W]. Got input with shape z and z and values in range z+ when all values are expected to be in the r   rž   r¥   z range.)rõ   )r  Ú
ValueErrorr¨   r	  r  rÉ   )r  r  r   rõ   s       r!   Ú_lpips_updater  †  s©   € Ü�t˜YÔ'¬J°t¸YÔ,GÜð%Ø%)§Z¡Z L°°d·j±j°\ð BØ—‘“˜TŸX™X›ZÐ(Ð)¨°·±³
¸D¿H¹H»JÐ/GÐ.Hð I&Ù09 q¨!¡fÀÀA¸wÐ%GÀwðPó
ð 	
ñ ˆt�T YÔ/×7Ñ7Ó9Ð9r"   ÚscoresÚ	reduction)r¡   r‘   Únonec                 ó„   — |dk(  r| j                  «       S |dk(  r| j                  «       S |dk(  s|€| S t        d|› �«      ‚)Nr‘   r¡   r  zInvalid reduction type: )r‘   r¡   r  )r  r  s     r!   Ú_lpips_computer  ‘  sO   € Ø�FÒØ�{‰{‹}ÐØ�EÒØ�z‰z‹|ÐØ�FÒ˜iÐ/ØˆÜ
Ð/°	¨{Ð;Ó
<Ð<r"   rñ   rÆ   c                 ó˜   — t        |¬«      j                  | j                  | j                  ¬«      }t	        | |||«      }t        ||«      S )a[  The Learned Perceptual Image Patch Similarity (`LPIPS_`) calculates perceptual similarity between two images.

    LPIPS essentially computes the similarity between the activations of two image patches for some pre-defined network.
    This measure has been shown to match human perception well. A low LPIPS score means that image patches are
    perceptual similar.

    Both input image patches are expected to have shape ``(N, 3, H, W)``. The minimum size of `H, W` depends on the
    chosen backbone (see `net_type` arg).

    Args:
        img1: first set of images
        img2: second set of images
        net_type: str indicating backbone network type to use. Choose between `'alex'`, `'vgg'` or `'squeeze'`
        reduction: str indicating how to reduce over the batch dimension. Choose between `'sum'`, `'mean'`, `'none'`
            or `None`.
        normalize: by default this is ``False`` meaning that the input is expected to be in the [-1,1] range. If set
            to ``True`` will instead expect input to be in the ``[0,1]`` range.

    Example:
        >>> from torch import rand
        >>> from torchmetrics.functional.image.lpips import learned_perceptual_image_patch_similarity
        >>> img1 = (rand(10, 3, 100, 100) * 2) - 1
        >>> img2 = (rand(10, 3, 100, 100) * 2) - 1
        >>> learned_perceptual_image_patch_similarity(img1, img2, net_type='squeeze')
        tensor(0.1005)

        >>> from torch import rand, Generator
        >>> from torchmetrics.functional.image.lpips import learned_perceptual_image_patch_similarity
        >>> gen = Generator().manual_seed(42)
        >>> img1 = (rand(2, 3, 100, 100, generator=gen) * 2) - 1
        >>> img2 = (rand(2, 3, 100, 100, generator=gen) * 2) - 1
        >>> learned_perceptual_image_patch_similarity(img1, img2, net_type='squeeze', reduction='none')
        tensor([0.1024, 0.0938])

    )r   )ÚdeviceÚdtype)r  Útor  r  r  r  )r  r  rñ   r  rõ   r   Úlosss          r!   r   r   ›  sD   € ôT ˜HÔ
%×
(Ñ
(°·±À4Ç:Á:Ð
(Ó
N€CÜ˜˜t S¨)Ó4€DÜ˜$ 	Ó*Ð*r"   )F)T))rÑ   rÑ   )g:Œ0âŽyE>)rÑ   r�   )rÇ   r‘   F))rì   rè   Útypingr   r   r   r   r3   r   r   Útyping_extensionsr	   Útorchmetrics.utilities.importsr
   r   Ú__doctest_skip__r6   r\   ÚmodulesÚ	containerr4   r   ÚModuler$   r`   ru   r’   r÷   rÃ   rš   Úfloatr£   r«   r­   r·   rÅ   r  r  r  r  r   rT   r"   r!   ú<module>r$     s,  ðó2 Û 	ß 4Ó 4ã ß Ý %å Að -Ø Øñ€ñ ØCÐE]Ð^Ðñ ð °ð À"Ç*Á*×BVÑBV×BaÑBaó ô0%&�—‘—‘ô %&ôP/Lˆe�h‰h�o‰oô /Lôd/RˆE�H‰H�O‰Oô /Rñd2˜fð 2°ð 2Àó 2ñ
S�vð S u¨S°#¨X¡ð SÀfó Sñ
!˜vð !¨Eð !¸Vó !ñb�fð b Cð b°ó bô/�2—9‘9ô /ô �"—)‘)ô ô"lˆR�Y‰Yô lô^$�Fô $ð?�Fð ? tð ?°ó ?ð:˜ð : fð :°2·9±9ð :Èð :ÐRXó :ñ=˜6ð =¨h°wÐ?TÑ7UÑ.Vð =Ðdjó =ð 39Ø:@Øñ,+Ø
ð,+à
ð,+ð Ð.Ñ/ð,+ð ˜Ð 5Ñ6Ñ7ð	,+ð
 ð,+ð ô,+r"   