o
    .wi                  
   @   s   d dl 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
dZ	dededed	efddZ
ddededed	efddZdS )    N)Tensor)conv2d)reducewin_sizesigmadtypedevicereturnc                 C   s^   t j| ||d| d d  }|d }t |d|d  d|d   }|t | }|S )Nr   r         r          @)torcharangeexp	unsqueezesum)r   r   r   r   coordsg r   ^/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/torchmetrics/functional/image/vif.py_filter   s
   (r   predstarget
sigma_n_sqc                 C   sR  | j }| j}| d} |d}tjd||d}tj|||d}tjd||dtjd||d}}tdD ]}dd|  d }	t|	|	d ||dd d d d f }
|dk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 }|d }|| }tj	t|d |
| d	d
}tj	t| d |
| d	d
}t||  |
| }|||  }|||  }||k }d||< || ||< d||< ||k }d||< d||< |dk }|| ||< d||< tj	||d
}t
d|d | ||   }|tj|g dd }|tjt
d||  g dd }q5|| S )Nr   g|=r
      r      r   r   g        )ming      ?)r   r      )dim)r   r   r   r   tensorzerosranger   r   clamplog10r   )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maskpreds_vif_scaler   r   r   _vif_per_channel!   sL   

""**

&r6   r   c                    s     ddk s  ddk rtd  d d  d d ddk s- ddk r>td d d d d fdd	t  d
D }tt|dS )a  Compute Pixel Based Visual Information Fidelity (VIF_).

    Args:
        preds: predicted images of shape ``(N,C,H,W)``. ``(H, W)`` has to be at least ``(41, 41)``.
        target: ground truth images of shape ``(N,C,H,W)``. ``(H, W)`` has to be at least ``(41, 41)``
        sigma_n_sq: variance of the visual noise

    Return:
        Tensor with vif-p score

    Raises:
        ValueError:
            If ``data_range`` is neither a ``tuple`` nor a ``float``

    )   z8Invalid size of preds. Expected at least 41x41, but got x!z9Invalid size of target. Expected at least 41x41, but got c              
      sH   g | ] }t  d d |d d d d f d d |d d d d f qS )N)r6   ).0ir   r   r   r   r   
<listcomp>r   s   H z/visual_information_fidelity.<locals>.<listcomp>r   elementwise_mean)size
ValueErrorr"   r   r   cat)r   r   r   per_channelr   r>   r   visual_information_fidelityV   s   " rE   )r   )r   r   torch.nn.functionalr   "torchmetrics.utilities.distributedr   floatr   r   r   r6   rE   r   r   r   r   <module>   s   " 5