
    i2                     8   d dl mZ d dlZd dlmZ esdgZ	 ddej                  dej                  dee   ded	ej                  f
d
Zddej                  de	d	ej                  fdZ
	 	 	 ddej                  dej                  dee   dede	d	ej                  fdZy)    )OptionalN)_TORCHVISION_AVAILABLE distance_intersection_over_unionpredstargetiou_thresholdreplacement_valreturnc                    | j                   dk7  s| j                  d   dk7  rt        d| j                         |j                   dk7  s|j                  d   dk7  rt        d|j                         ddlm} | j                         dk(  rKt        j                  |j                  d   |j                  d   |j                  t        j                        S |j                         dk(  rKt        j                  | j                  d   | j                  d   | j                  t        j                        S  || |      }|||||k  <   |S )	N      z-Expected preds to be of shape (N, 4) but got z.Expected target to be of shape (N, 4) but got r   )distance_box_iou)devicedtype)
ndimshape
ValueErrortorchvision.opsr   numeltorchzerosr   float32)r   r   r   r	   r   ious         {/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torchmetrics/functional/detection/diou.py_diou_updater      s    zzQ%++b/Q.HVWW{{a6<<+q0I&,,XYY0{{}{{6<<?FLLOFMMY^YfYfgg||~{{5;;q>5;;q>%,,V[VcVcdd
5&
)C #2C- J    r   	aggregatec                     |s| S | j                         dkD  r| j                         j                         S t        j                  d| j
                        S )Nr   g        )r   )r   diagmeanr   tensorr   )r   r   s     r   _diou_computer#   -   s=    
 #		a388:??YU\\#cjj5YYr   c                 |    t         st        dt        j                   d      t	        | |||      }t        ||      S )a[	  Compute Distance Intersection over Union (`DIOU`_) between two sets of boxes.

    Both sets of boxes are expected to be in (x1, y1, x2, y2) format with 0 <= x1 < x2 and 0 <= y1 < y2.

    Args:
        preds:
            The input tensor containing the predicted bounding boxes.
        target:
            The tensor containing the ground truth.
        iou_threshold:
            Optional IoU thresholds for evaluation. If set to `None` the threshold is ignored.
        replacement_val:
            Value to replace values under the threshold with.
        aggregate:
            Return the average value instead of the full matrix of values

    Example::
        By default diou is aggregated across all box pairs e.g. mean along the diagonal of the dIoU matrix:

        >>> import torch
        >>> from torchmetrics.functional.detection import distance_intersection_over_union
        >>> preds = torch.tensor(
        ...     [
        ...         [296.55, 93.96, 314.97, 152.79],
        ...         [328.94, 97.05, 342.49, 122.98],
        ...         [356.62, 95.47, 372.33, 147.55],
        ...     ]
        ... )
        >>> target = torch.tensor(
        ...     [
        ...         [300.00, 100.00, 315.00, 150.00],
        ...         [330.00, 100.00, 350.00, 125.00],
        ...         [350.00, 100.00, 375.00, 150.00],
        ...     ]
        ... )
        >>> distance_intersection_over_union(preds, target)
        tensor(0.5793)

    Example::
        By setting `aggregate=False` the IoU score per prediction and target boxes is returned:

        >>> import torch
        >>> from torchmetrics.functional.detection import distance_intersection_over_union
        >>> preds = torch.tensor(
        ...     [
        ...         [296.55, 93.96, 314.97, 152.79],
        ...         [328.94, 97.05, 342.49, 122.98],
        ...         [356.62, 95.47, 372.33, 147.55],
        ...     ]
        ... )
        >>> target = torch.tensor(
        ...     [
        ...         [300.00, 100.00, 315.00, 150.00],
        ...         [330.00, 100.00, 350.00, 125.00],
        ...         [350.00, 100.00, 375.00, 150.00],
        ...     ]
        ... )
        >>> distance_intersection_over_union(preds, target, aggregate=False)
        tensor([[ 0.6883, -0.2043, -0.3351],
                [-0.2214,  0.4886, -0.1913],
                [-0.3971, -0.1510,  0.5609]])

    `zf` requires that `torchvision` is installed. Please install with `pip install torchmetrics[detection]`.)r   ModuleNotFoundErrorr   __name__r   r#   )r   r   r   r	   r   r   s         r   r   r   3   sO    L "!099: ;J J
 	
 ufm_
ECi((r   )r   )T)Nr   T)typingr   r   torchmetrics.utilities.importsr   __doctest_skip__Tensorfloatr   boolr#   r    r   r   <module>r/      s      A:; ij<<!&>Fuo`e
\\*Zu|| Z Z Z &*L)<<L)LLL) E?L) 	L)
 L) \\L)r   