Ë
    þÍ:j  ã                   óÀ   — 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edede j                  d	e j                  d
ef
d„Zdededed
efd„Z	 	 ddedededed   d
ef
d„Zy)é    N)ÚTensor)Úconv2d)ÚLiteral)Údim_zero_catÚwin_sizeÚsigmaÚdtypeÚdeviceÚreturnc                 ó  — t        j                  | ||¬«      | dz
  dz  z
  }|dz  }t        j                  |j                  d«      |j                  d«      z    d|dz  z  z  «      }|t        j                  |«      z  }|S )N©r	   r
   é   é   r   ç       @)ÚtorchÚarangeÚexpÚ	unsqueezeÚsum)r   r   r	   r
   ÚcoordsÚgs         úv/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchmetrics/functional/image/vif.pyÚ_filterr      sx   € ô
 �\‰\˜(¨%¸Ô?À8ÈaÁ<ÐSTÑBTÑT€FØ�‰	€AÜ�	‰	�A—K‘K “N Q§[¡[°£^Ñ3Ð4¸¸eÀQ¹h¹ÑGÓH€AØŒ�‰�1‹Ñ€AØ€Hó    ÚpredsÚtargetÚ
sigma_n_sqc           
      ó  — | j                   }| j                  }| j                  d«      } |j                  d«      }t        j                  d||¬«      }t        j                  |||¬«      }t        j
                  | j                  d«      ||¬«      }t        j
                  | j                  d«      ||¬«      }t        d«      D �]À  }dd|z
  z  dz   }	t        |	|	dz  ||¬«      d d d d …f   }
|dkD  r:t        ||
«      d d …d d …d d d…d d d…f   }t        | |
«      d d …d d …d d d…d d d…f   } t        ||
«      }t        | |
«      }|dz  }|dz  }||z  }t        j                  t        |dz  |
«      |z
  d	¬
«      }t        j                  t        | dz  |
«      |z
  d	¬
«      }t        || z  |
«      |z
  }|||z   z  }|||z  z
  }||k  }d||<   ||   ||<   d||<   ||k  }d||<   d||<   |dk  }||   ||<   d||<   t        j                  ||¬
«      }|t        j                  t        j                  d|dz  |z  ||z   z  z   «      g d¢¬«      z  }|t        j                  t        j                  d||z  z   «      g d¢¬«      z  }�ŒÃ ||z  S )Nr   g»½×Ùß|Û=r   r   é   r   é   r   g        )Úming      ð?)r   r   é   ©Údim)r	   r
   r   r   ÚtensorÚzerosÚsizeÚranger   r   Úclampr   Úlog10)r   r   r   r	   r
   ÚepsÚ	preds_vifÚ
target_vifÚscaleÚnÚkernelÚ	mu_targetÚmu_predsÚmu_target_sqÚmu_preds_sqÚmu_target_predsÚsigma_target_sqÚsigma_preds_sqÚsigma_target_predsr   Ú
sigma_v_sqÚmasks                         r   Ú_vif_per_channelr;   "   s¯  € Ø�K‰K€EØ�\‰\€Fà�O‰O˜AÓ€EØ×Ñ˜aÓ €Fä
�,‰,�u E°&Ô
9€Cä—‘˜j°¸fÔE€Jä—‘˜EŸJ™J q›M°¸vÔF€IÜ—‘˜UŸZ™Z¨›]°%ÀÔG€Jä�q“ó $`ˆØ�A˜‘IÑ Ñ"ˆÜ˜˜A ™E¨°vÔ>¸tÀTÊ1¸}ÑMˆà�1Š9Ü˜F FÓ+ªAªq±#°A°#±s¸°s¨NÑ;ˆFÜ˜5 &Ó)ª!ªQ±°!°±S°q°S¨.Ñ9ˆEä˜6 6Ó*ˆ	Ü˜% Ó(ˆØ  !‘|ˆØ ‘kˆØ# hÑ.ˆäŸ+™+¤f¨V°Q©Y¸Ó&?À,Ñ&NÐTWÔXˆÜŸ™¤V¨E°1©H°fÓ%=ÀÑ%KÐQTÔUˆÜ# F¨U¡N°FÓ;¸oÑMÐà /°CÑ"7Ñ8ˆØ# aÐ*<Ñ&<Ñ<ˆ
à Ñ$ˆØˆˆ$‰Ø)¨$Ñ/ˆ
�4ÑØ !ˆ˜Ñà Ñ#ˆØˆˆ$‰Øˆ
�4Ñà�1‰uˆØ)¨$Ñ/ˆ
�4ÑØˆˆ$‰Ü—[‘[ °Ô5ˆ
à”U—Y‘YœuŸ{™{¨3°!°S±&¸OÑ1KÈzÐ\fÑOfÑ1gÑ+gÓhÒnwÔxÑxˆ	Ø”e—i‘i¤§¡¨C°/ÀJÑ2NÑ,NÓ OÒU^Ô_Ñ_Š
ðI$`ðL �zÑ!Ð!r   Ú	reduction©ÚmeanÚnonec                 ód  — | j                  d«      dk  s| j                  d«      dk  r0t        d| j                  d«      › d| j                  d«      › d�«      ‚|j                  d«      dk  s|j                  d«      dk  r0t        d|j                  d«      › d|j                  d«      › d�«      ‚| j                  |j                  k7  r&t        d| j                  › d	|j                  › d
�«      ‚|dvrt        d|› �«      ‚t        | j                  d«      «      D �cg c])  }t	        | dd…|dd…dd…f   |dd…|dd…dd…f   |«      ‘Œ+ }}t        | j                  d«      dkD  r&t        j                  |d¬«      j                  d«      n|d   «      }|dk(  r|j                  «       S |S c c}w )a  Compute Pixel-Based Visual Information Fidelity (VIF-P).

    VIF is a full-reference metric that measures the amount of visual information
    preserved in a distorted image compared to the reference image.

    Args:
        preds: Predicted images of shape (N, C, H, W). Height and width must be at least 41.
        target: Ground truth images of shape (N, C, H, W). Must match preds in shape.
        sigma_n_sq: Variance of the visual noise. Default: 2.0.
        reduction: Method for reducing the metric across the batch.
            - "mean": Return a tensor average over the batch.
            - "none": Return a VIF score for each sample as a 1D tensor of shape (N,).

    Returns:
        torch.Tensor: VIF score(s). The shape depends on the `reduction` argument:
            - If ``reduction="mean"``, returns a scalar tensor.
            - If ``reduction="none"``, returns a tensor of shape ``(N,)``.

    Raises:
        ValueError: If input dimensions are smaller than ``41x41``.
        ValueError: If ``preds`` and ``target`` shapes don't match.
        ValueError: If ``reduction`` is not ``"mean"`` or ``"none"``.

    Example:
        >>> from torchmetrics.functional.image import visual_information_fidelity
        >>> preds = torch.randn(4, 3, 41, 41, generator=torch.Generator().manual_seed(42))
        >>> target = torch.randn(4, 3, 41, 41, generator=torch.Generator().manual_seed(43))
        >>> visual_information_fidelity(preds, target, reduction="none")
        tensor([0.0040, 0.0049, 0.0017, 0.0039])

    éÿÿÿÿé)   éþÿÿÿz8Invalid size of preds. Expected at least 41x41, but got Úxú!z9Invalid size of target. Expected at least 41x41, but got z7`preds` and `target` must have the same shape, but got z vs ú.r=   z7Argument `reduction` must be 'mean' or 'none', but got r   Nr   r#   r>   )	r'   Ú
ValueErrorÚshaper(   r;   r   r   Ústackr>   )r   r   r   r<   ÚiÚper_channel_scoresÚvif_per_samples          r   Úvisual_information_fidelityrM   Y   sÉ  € ðR ‡z�z�"ƒ~˜Ò˜eŸj™j¨›n¨rÒ1ÜÐSÐTY×T^ÑT^Ð_aÓTbÐScÐcdÐej×eoÑeoÐprÓesÐdtÐtuÐvÓwÐwà‡{�{�2ƒ˜Ò˜vŸ{™{¨2›°Ò3ÜØGÈÏÉÐTVËÐGXÐXYÐZ`×ZeÑZeÐfhÓZiÐYjÐjkÐló
ð 	
ð ‡{�{�f—l‘lÒ"ÜÐRÐSX×S^ÑS^ÐR_Ð_cÐdj×dpÑdpÐcqÐqrÐsÓtÐtàÐ(Ñ(ÜÐRÐS\ÐR]Ð^Ó_Ð_ô V[Ð[`×[eÑ[eÐfgÓ[hÓUiöØPQÔ˜šq !¢Qª˜zÑ*¨F²1°aººA°:Ñ,>À
ÕKðÐð ô "Ø:?¿*¹*ÀQ»-È!Ò:KŒ�‰Ð&¨AÔ.×3Ñ3°AÔ6ÐQcÐdeÑQfó€Nð �FÒØ×"Ñ"Ó$Ð$ØÐùòs   Ä.F-)r   r>   )r   r   Útorch.nn.functionalr   Útyping_extensionsr   Útorchmetrics.utilities.datar   Úfloatr	   r
   r   r;   rM   © r   r   ú<module>rS      s¯   ðó Ý Ý &Ý %å 4ð	�eð 	 Eð 	°%·+±+ð 	ÀuÇ|Á|ð 	ÐX^ó 	ð4"˜Fð 4"¨Fð 4"Àð 4"È&ó 4"ðt Ø)/ñ	AØðAàðAð ðAð �~Ñ&ð	Að
 ôAr   