a
    d                     @   st   d dl Z d dl mZ d dlmZ d dlmZ eee je jedddZ	eeeedd	d
Z
deeeed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          @)torchZarangeexp	unsqueezesum)r   r   r   r   Zcoordsg r   j/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torchmetrics/functional/image/vif.py_filter   s
    (r   )predstarget
sigma_n_sqr	   c                 C   sV  | 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 }qj|| S )Nr   g|=r
      r      r   r   g        )ming      ?)r   r      )Zdim)r   r   r   r   Ztensorzerosranger   r   clamplog10r   )r   r   r   r   r   ZepsZ	preds_vifZ
target_vifZscalenkernelZ	mu_targetZmu_predsZmu_target_sqZmu_preds_sqZmu_target_predsZsigma_target_sqZsigma_preds_sqZsigma_target_predsr   Z
sigma_v_sqmaskZpreds_vif_scaler   r   r   _vif_per_channel!   sL    

""
**

&r$   r   c                    s     ddk s  ddk r>td  d d  d d ddk sZ 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)r$   ).0ir   r   r   r   r   
<listcomp>r       z/visual_information_fidelity.<locals>.<listcomp>r   Zelementwise_mean)size
ValueErrorr   r   r   cat)r   r   r   Zper_channelr   r,   r   visual_information_fidelityV   s    " r2   )r   )r   r   Ztorch.nn.functionalr   Z"torchmetrics.utilities.distributedr   floatr   r   r   r$   r2   r   r   r   r   <module>   s   5