
    i                     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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 )	z1Compute the IoU matrix between two sets of boxes.      z-Expected preds to be of shape (N, 4) but got z.Expected target to be of shape (N, 4) but got r   )box_iou)devicedtype)
ndimshape
ValueErrortorchvision.opsr   numeltorchzerosr   float32)r   r   r   r	   r   ious         z/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torchmetrics/functional/detection/iou.py_iou_updater      s    zzQ%++b/Q.HVWW{{a6<<+q0I&,,XYY'{{}{{6<<?FLLOFMMY^YfYfgg||~{{5;;q>5;;q>%,,V[VcVcdd
%
 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   _iou_computer#   .   s=    
 #		a388:??YU\\#cjj5YYr   c                 |    t         st        dt        j                   d      t	        | |||      }t        ||      S )a  Compute Intersection over Union 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 iou is aggregated across all box pairs e.g. mean along the diagonal of the IoU matrix:

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

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

        >>> import torch
        >>> from torchmetrics.functional.detection import 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],
        ...     ]
        ... )
        >>> intersection_over_union(preds, target, aggregate=False)
        tensor([[0.6898, 0.0000, 0.0000],
                [0.0000, 0.5086, 0.0000],
                [0.0000, 0.0000, 0.5654]])

    `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   4   sO    L "!'001 2J J
 	
 eV]O
DCY''r   )r   )T)Nr   T)typingr   r   torchmetrics.utilities.importsr   __doctest_skip__Tensorfloatr   boolr#   r    r   r   <module>r/      s      A12 ij<<!&>Fuo`e
\\,Zell Zt Zu|| Z &*L(<<L(LLL( E?L( 	L(
 L( \\L(r   