
    i6                     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#generalized_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   )generalized_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/giou.py_giou_updater      s    zzQ%++b/Q.HVWW{{a6<<+q0I&,,XYY3{{}{{6<<?FLLOFMMY^YfYfgg||~{{5;;q>5;;q>%,,V[VcVcdd
eV
,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   _giou_computer#   -   s=    
 #		a388:??YU\\#cjj5YYr   c                 |    t         st        dt        j                   d      t	        | |||      }t        ||      S )aP	  Compute Generalized Intersection over Union (`GIOU`_) 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 giou is aggregated across all box pairs e.g. mean along the diagonal of the gIoU matrix:

        >>> import torch
        >>> from torchmetrics.functional.detection import generalized_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],
        ...     ]
        ... )
        >>> generalized_intersection_over_union(preds, target)
        tensor(0.5638)

    Example::
        By setting `aggregate=False` the full IoU matrix is returned:

        >>> import torch
        >>> from torchmetrics.functional.detection import generalized_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],
        ...     ]
        ... )
        >>> generalized_intersection_over_union(preds, target, aggregate=False)
        tensor([[ 0.6895, -0.4964, -0.4944],
                [-0.5105,  0.4673, -0.3434],
                [-0.6024, -0.4021,  0.5345]])

    `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 "!3<<= >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   