Ë
    þÍ:jú  ã                   ó¼   — d dl Z d dlmZ d dlZd dlmZmZ ddededefd„Zded	ed
ededef
d„Zddededede	eeef   fd„Z
	 ddededeee	eef   f   dedef
d„Zy)é    N)ÚUnion)ÚTensorÚtensorÚxÚ
block_sizeÚreturnc                 ó�  — | j                   \  }}}}|dkD  rt        d|› d�«      ‚t        j                  |dz
  «      }t        j                  t        |dz
  |dz
  |«      «      }t        j                  t        t        |j                  «       «      j                  |j                  «       «      «      «      }t        j                  |dz
  «      }	t        j                  t        |dz
  |dz
  |«      «      }
t        j                  t        t        |	j                  «       «      j                  |
j                  «       «      «      «      }| dd…dd…dd…|f   | dd…dd…dd…|dz   f   z
  j                  d«      j                  «       }| dd…dd…dd…|f   | dd…dd…dd…|dz   f   z
  j                  d«      j                  «       }|| dd…dd…|
dd…f   | dd…dd…|
dz   dd…f   z
  j                  d«      j                  «       z  }|| dd…dd…|dd…f   | dd…dd…|dz   dd…f   z
  j                  d«      j                  «       z  }|||z  z  dz
  }||dz
  z  |z
  }|||z  z  dz
  }||dz
  z  |z
  }|||z   z  }|||z   z  }||kD  r5t        j                  |«      t        j                  t        ||«      «      z  nd}|||z
  z  S )zòCompute block effect.

    Args:
        x: input image
        block_size: integer indication the block size

    Returns:
        Computed block effect

    Raises:
        ValueError:
            If the image is not a grayscale image

    é   z=`psnrb` metric expects grayscale images, but got images with z
 channels.Ng       @r   )ÚshapeÚ
ValueErrorÚtorchÚaranger   ÚrangeÚlistÚsetÚtolistÚsymmetric_differenceÚpowÚsumÚmathÚlog2Úmin)r   r   Ú_ÚchannelsÚheightÚwidthÚhÚh_bÚh_bcÚvÚv_bÚv_bcÚd_bÚd_bcÚn_hbÚn_hbcÚn_vbÚn_vbcÚts                      úx/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchmetrics/functional/image/psnrb.pyÚ_compute_befr+      sš  € ð( 	
�‰ñØ	ØØØà�!‚|ÜÐXÐYaÐXbÐblÐmÓnÐnä�‰�U˜Q‘YÓ€AÜ
�,‰,”u˜Z¨!™^¨U°Q©Y¸
ÓCÓ
D€CÜ�<‰<œœS §¡£›_×AÑAÀ#Ç*Á*Ã,ÓOÓPÓQ€Dä�‰�V˜a‘ZÓ €AÜ
�,‰,”u˜Z¨!™^¨V°a©Z¸ÓDÓ
E€CÜ�<‰<œœS §¡£›_×AÑAÀ#Ç*Á*Ã,ÓOÓPÓQ€DàŠQ’’1�cˆ\‰?˜Qšq¢!¢Q¨¨a©Ð/Ñ0Ñ0×
5Ñ
5°cÓ
:×
>Ñ
>Ó
@€CØŠa’’A�tˆmÑ˜q¢¢A¢q¨$°©(Ð!2Ñ3Ñ3×8Ñ8¸Ó=×AÑAÓC€DØˆAŠa’�Cšˆl‰O˜a¢¢1 c¨A¡gªqÐ 0Ñ1Ñ1×6Ñ6°sÓ;×?Ñ?ÓAÑA€CØˆQŠq’!�Tš1ˆ}Ñ ¢!¢Q¨¨q©²!Ð"3Ñ 4Ñ4×9Ñ9¸#Ó>×BÑBÓDÑD€Dà�U˜ZÑ'Ñ(¨1Ñ,€DØ�u˜q‘yÑ! TÑ)€EØ�F˜ZÑ'Ñ(¨1Ñ,€DØ�f˜q‘jÑ! TÑ)€EØˆ4�$‰;Ñ€CØˆE�E‰MÑ€DØADÀtÂŒ�	‰	�*Ó¤§	¡	¬#¨f°eÓ*<Ó =Ò=ÐQR€AØ��d‘
ÑÐó    Úsum_squared_errorÚbefÚnum_obsÚ
data_rangec                 óN   — | |z  |z   } dt        j                  |dz  | z  «      z  S )zúComputes peak signal-to-noise ratio.

    Args:
        sum_squared_error: Sum of square of errors over all observations
        bef: block effect
        num_obs: Number of predictions or observations
        data_range: the range of the data.

    é
   é   )r   Úlog10)r-   r.   r/   r0   s       r*   Ú_psnrb_computer5   D   s2   € ð *¨GÑ3°cÑ9ÐØ”—‘˜J¨™MÐ,=Ñ=Ó>Ñ>Ð>r,   ÚpredsÚtargetc                 óÈ   — t        j                  t        j                  | |z
  d«      «      }t        |j	                  «       |j
                  ¬«      }t        | |¬«      }|||fS )zØUpdates and returns variables required to compute peak signal-to-noise ratio.

    Args:
        preds: Predicted tensor
        target: Ground truth tensor
        block_size: Integer indication the block size

    r3   )Údevice©r   )r   r   r   r   Únumelr9   r+   )r6   r7   r   r-   r/   r.   s         r*   Ú_psnrb_updater<   W   sQ   € ô Ÿ	™	¤%§)¡)¨E°F©N¸AÓ">Ó?ÐÜ�V—\‘\“^¨F¯M©MÔ:€GÜ
�u¨Ô
4€CØ˜c 7Ð*Ð*r,   c                 ó,  — t        |t        «      rQt        j                  | |d   |d   ¬«      } t        j                  ||d   |d   ¬«      }t	        |d   |d   z
  «      }nt	        t        |«      «      }t        | ||¬«      \  }}}t        ||||«      S )a¼  Computes `Peak Signal to Noise Ratio With Blocked Effect` (PSNRB) metrics.

    .. math::
        \text{PSNRB}(I, J) = 10 * \log_{10} \left(\frac{\max(I)^2}{\text{MSE}(I, J)-\text{B}(I, J)}\right)

    Where :math:`\text{MSE}` denotes the `mean-squared-error`_ function.

    Args:
        preds: estimated signal
        target: ground truth signal
        data_range: the range of the data. If a tuple is provided then the range is calculated as the difference and
            input is clamped between the values.
        block_size: integer indication the block size

    Return:
        Tensor with PSNRB score

    Example:
        >>> from torch import rand
        >>> from torchmetrics.functional.image import peak_signal_noise_ratio_with_blocked_effect
        >>> preds = rand(1, 1, 28, 28)
        >>> target = rand(1, 1, 28, 28)
        >>> peak_signal_noise_ratio_with_blocked_effect(preds, target, data_range=1.0)
        tensor(7.8402)

    r   r
   )r   Úmaxr:   )Ú
isinstanceÚtupler   Úclampr   Úfloatr<   r5   )r6   r7   r0   r   Údata_range_valr-   r.   r/   s           r*   Ú+peak_signal_noise_ratio_with_blocked_effectrD   f   s‘   € ô@ �*œeÔ$Ü—‘˜E z°!¡}¸*ÀQ¹-ÔHˆÜ—‘˜V¨°A©¸JÀq¹MÔJˆÜ 
¨1¡°
¸1±Ñ =Ó>‰ä¤ jÓ 1Ó2ˆä&3°E¸6ÈjÔ&YÑ#Ð�s˜GÜÐ+¨S°'¸>ÓJÐJr,   )é   )r   Útypingr   r   r   r   Úintr+   r5   r@   r<   rB   rD   © r,   r*   ú<module>rI      sá   ðó Ý ã ß  ñ,�Fð ,¨ð ,°Fó ,ð^?Øð?à	ð?ð ð?ð ð	?ð
 ó?ñ&+˜ð +¨ð +¸Sð +ÈÈvÐW]Ð_eÐOeÑIfó +ð& ñ	(KØð(Kàð(Kð �e˜U 5¨% <Ñ0Ð0Ñ1ð(Kð ð	(Kð
 ô(Kr,   