Ë
    ëÓ^jÕR  ã                   ód   — d Z ddlZddlmc mZ ddlmZ ddlmZ  G d„ dej                  «      Z	y)zGPost-processing module for converting model outputs to COCO API format.é    N)Únn)Úbox_opsc                   ó²  ‡ — e Zd ZdZ	 	 	 d,dedee   dz  deddfˆ fd„Z ej                  «       de
eej                  f   d	ej                  dee
eej                  f      fd
„«       Zedej                  dej                  dz  dej                  dz  d	ej                  ddf
d„«       Zdej                  deej                  ej                  ej                  f   fd„Zedej                  dej                  d	ej                  dej                  fd„«       Zedej                  dej                  dej                  dej                  dej                  d	ej                  dee
eej                  f      fd„«       Zdej                  dej                  dej                  dej                  dej                  d	ej                  dee
eej                  f      fd„Zedej                  dej                  dej                  fd„«       Zedej                  dedeej                  ej                  f   fd„«       Zdej                  dej                  dej                  d ej                  d!ej                  d"ej                  d#ededeej                  ej                  ej                  f   fd$„Zdej                  d%ej                  d&ej                  d'ej                  dej                  f
d(„Zed)ej                  dej                  fd*„«       Zedej                  dej                  dej                  dee
eej                  f      fd+„«       Zˆ xZS )-ÚPostProcessab  Convert raw RF-DETR model outputs into per-image prediction tensors.

    The postprocessor is shared by detection, segmentation, and keypoint inference. It selects top scoring query/class
    pairs, scales boxes back to the requested image sizes, and then delegates to the head-specific private helper for
    masks, keypoints, or box-only results.
    NÚ
num_selectÚnum_keypoints_per_classÚtrace_alphaÚreturnc                 óT   •— t         ‰| �  «        || _        |xs g | _        || _        y )N)ÚsuperÚ__init__r   r   r	   )Úselfr   r   r	   Ú	__class__s       €úd/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/postprocess.pyr   zPostProcess.__init__   s,   ø€ ô 	‰ÑÔØ$ˆŒØ'>Ò'DÀ"ˆÔ$Ø&ˆÕó    ÚoutputsÚtarget_sizesc                 ó\  — |d   |d   }}|j                  dd«      }|j                  dd«      }| j                  ||||«       | j                  |«      \  }}}	| j                  ||	|«      }
|�| j	                  ||||
|	|«      S |�| j                  ||||
|	|«      S | j                  |||
«      S )a5  Convert raw model tensors into per-image detection dictionaries.

        Args:
            outputs: Model output dictionary containing ``pred_logits`` and ``pred_boxes`` plus optional
                ``pred_masks`` or ``pred_keypoints``.
            target_sizes: Per-image ``(height, width)`` tensor. For inference and evaluation this should be the
                original image size so normalized boxes and keypoints are returned in source-image pixel coordinates.

        Returns:
            One dictionary per image. Every dictionary contains ``scores``, ``labels``, and ``boxes`` in absolute
            pixel coordinates clamped to the respective image dimensions. Segmentation outputs also contain
            ``masks``. Keypoint outputs also contain ``keypoints`` and ``keypoint_precision_cholesky``.
        Úpred_logitsÚ
pred_boxesÚ
pred_masksNÚpred_keypoints)ÚgetÚ_validate_outputsÚ_select_topkÚ_gather_and_scale_boxesÚ_postprocess_masksÚ_postprocess_keypointsÚ_postprocess_boxes)r   r   r   Ú
out_logitsÚout_bboxÚ	out_masksÚout_keypointsÚscoresÚlabelsÚ
topk_boxesÚboxess              r   ÚforwardzPostProcess.forward&   sÑ   € ð  ' }Ñ5°w¸|Ñ7L�Hˆ
Ø—K‘K ¨dÓ3ˆ	ØŸ™Ð$4°dÓ;ˆØ×Ñ˜z¨9°mÀ\ÔRà%)×%6Ñ%6°zÓ%BÑ"ˆ�˜
Ø×,Ñ,¨X°zÀ<ÓPˆàÐ Ø×*Ñ*¨9°f¸fÀeÈZÐYeÓfÐfØÐ$Ø×.Ñ.¨}¸fÀfÈeÐU_ÐamÓnÐnØ×&Ñ& v¨v°uÓ=Ð=r   r    r"   r#   c                 ó|   — |�|�t        d«      ‚t        | «      t        |«      k(  sJ ‚|j                  d   dk(  sJ ‚y)aÃ  Validate mutually exclusive output heads and per-image target sizes.

        Args:
            out_logits: Classification logits with shape ``(B, Q, C)``.
            out_masks: Optional mask logits from segmentation models.
            out_keypoints: Optional keypoint predictions from keypoint models.
            target_sizes: Per-image ``(height, width)`` tensor with shape
                ``(B, 2)``.

        Raises:
            ValueError: If both masks and keypoints are present in the model
                outputs at the same time. Mask and keypoint heads are mutually
                exclusive at inference.
            AssertionError: If batch dimensions do not match ``target_sizes``.
        Nz>masks and keypoints cannot be used together in postprocessing.é   é   )Ú
ValueErrorÚlenÚshape)r    r"   r#   r   s       r   r   zPostProcess._validate_outputsC   sK   € ð, Ð  ]Ð%>ÜÐ]Ó^Ð^Ü�:‹¤# lÓ"3Ò3Ð3Ð3Ø×!Ñ! !Ñ$¨Ò)Ð)Ñ)r   c                 ó2  — |j                  «       }|j                  |j                  d   d«      }t        | j                  |j                  d   «      }t        j                  ||d¬«      \  }}|}||j                  d   z  }||j                  d   z  }	||	|fS )a²  Select the highest scoring query/class pairs.

        Args:
            out_logits: Classification logits with shape ``(B, Q, C)``.

        Returns:
            Tuple containing selected scores, class labels, and query indices.
            Scores are sigmoid probabilities before any keypoint uncertainty
            fusion. Labels are class indices and query indices select rows from
            box/mask/keypoint outputs.
        r   éÿÿÿÿr*   ©Údimr+   )ÚsigmoidÚviewr.   Úminr   ÚtorchÚtopk)
r   r    ÚprobÚlogits_for_topkÚnum_to_selectÚtopk_valuesÚtopk_indexesr$   r&   r%   s
             r   r   zPostProcess._select_topk^   sœ   € ð ×!Ñ!Ó#ˆØŸ)™) J×$4Ñ$4°QÑ$7¸Ó<ˆÜ˜DŸO™O¨_×-BÑ-BÀ1Ñ-EÓFˆÜ$)§J¡J¨ÀÐSTÔ$UÑ!ˆ�\ØˆØ! Z×%5Ñ%5°aÑ%8Ñ8ˆ
Ø 
× 0Ñ 0°Ñ 3Ñ3ˆØ�v˜zÐ)Ð)r   r!   r&   c           	      ó¢  — t        j                  | «      }t        j                  |d|j	                  d«      j                  ddd«      «      }|j                  d«      \  }}t        j                  ||||gd¬«      j                  |j                  «      }||dd…ddd…f   z  }|j                  d«      j                  |dd…ddd…f   ¬«      }|S )aë  Gather selected boxes and scale normalized coordinates to pixels.

        Args:
            out_bbox: Normalized ``cxcywh`` boxes with shape ``(B, Q, 4)``.
            topk_boxes: Query indices selected by :meth:`_select_topk`.
            target_sizes: Per-image ``(height, width)`` tensor.

        Returns:
            Absolute ``xyxy`` boxes with shape ``(B, K, 4)`` in pixel units,
            clamped to ``[0, width]`` for x-coordinates and ``[0, height]`` for y-coordinates.
        r*   r0   é   r1   Nç        )Úmax)r   Úbox_cxcywh_to_xyxyr6   ÚgatherÚ	unsqueezeÚrepeatÚunbindÚstackÚtoÚdtypeÚ	clamp_minÚclamp)r!   r&   r   r'   Úimg_hÚimg_wÚ	scale_fcts          r   r   z#PostProcess._gather_and_scale_boxess   s½   € ô" ×*Ñ*¨8Ó4ˆÜ—‘˜U A z×';Ñ';¸BÓ'?×'FÑ'FÀqÈ!ÈQÓ'OÓPˆØ#×*Ñ*¨1Ó-‰ˆˆuÜ—K‘K ¨¨u°eÐ <À!ÔD×GÑGÈÏÉÓTˆ	Ø˜	¢! Tª1 *Ñ-Ñ-ˆà—‘ Ó$×*Ñ*¨yº¸DÂ!¸Ñ/DÐ*ÓEˆØˆr   r$   r%   r'   c                 ó  — g }t        | j                  d   «      D ]ä  }||   ||   ||   dœ}||   }	t        j                  | |   d|	j	                  d«      j	                  d«      j                  d| j                  d   | j                  d   «      «      }
||   j                  «       \  }}t        j                  |
j	                  d«      t        |«      t        |«      fdd¬«      }
|
d	kD  |d
<   |j                  |«       Œæ |S )a§  Attach resized segmentation masks for selected detections.

        Args:
            out_masks: Raw mask logits with shape ``(B, Q, Hm, Wm)``.
            scores: Selected object scores with shape ``(B, K)``.
            labels: Selected class labels with shape ``(B, K)``.
            boxes: Selected absolute boxes with shape ``(B, K, 4)``.
            topk_boxes: Selected query indices with shape ``(B, K)``.
            target_sizes: Per-image ``(height, width)`` tensor used for mask
                resizing.

        Returns:
            One result dict per image containing scores, labels, boxes, and
            boolean masks resized to the target image size.
        r   ©r$   r%   r'   r0   r*   éþÿÿÿÚbilinearF)ÚsizeÚmodeÚalign_cornersr?   Úmasks)Úranger.   r6   rB   rC   rD   ÚtolistÚFÚinterpolateÚintÚappend)r"   r$   r%   r'   r&   r   ÚresultsÚiÚres_iÚk_idxÚmasks_iÚhÚws                r   r   zPostProcess._postprocess_masks�   s  € ð0 ˆÜ�y—‘ qÑ)Ó*ò 	"ˆAØ% a™y°F¸1±IÈÈaÉÑQˆEØ˜q‘MˆEÜ—l‘lØ˜!‘ØØ—‘ Ó#×-Ñ-¨bÓ1×8Ñ8¸¸I¿O¹OÈBÑ<OÐQZ×Q`ÑQ`ÐacÑQdÓeóˆGð
   ‘?×)Ñ)Ó+‰DˆAˆqÜ—m‘mØ×!Ñ! !Ó$¬C°«F´C¸³FÐ+;À*Ð\aôˆGð % s™]ˆE�'‰NØ�N‰N˜5Õ!ð	"ð ˆr   c                 ó–  — g }t        | j                  d¬«      }t        | j                  «      }	t        |j                  d   «      D ]  }
||
   }||
   }||
   }| j                  ||
   ||
   «      }| j                  ||«      \  }}|	dkD  r%|dkD  r | j                  |||||
   |||	|¬«      \  }}}|j                  |||||dœ«       Œ� |S )a‰  Select class-specific keypoints and optionally fuse object scores.

        Args:
            out_keypoints: Raw keypoint predictions with shape
                ``(B, Q, C * max(K_c), D)`` where keypoint slots are padded per
                class.
            scores: Selected object scores before uncertainty fusion.
            labels: Selected class labels.
            boxes: Selected absolute boxes.
            topk_boxes: Selected query indices.
            target_sizes: Per-image ``(height, width)`` tensor.

        Returns:
            One result dict per image containing postprocessed object scores,
            labels, boxes, pixel-space keypoints, and raw precision-Cholesky
            parameters. When ``trace_alpha > 0``, scores for valid keypoint
            classes are multiplied by an uncertainty penalty derived from the
            active keypoints of the predicted class.
        r   )Údefault)Úkeypoints_iÚlabels_iÚscores_iÚtarget_sizeÚoutput_keypointsÚoutput_keypoint_precisionÚnum_keypoint_classesÚmax_num_keypoints)r$   r%   r'   Ú	keypointsÚkeypoint_precision_cholesky)	r@   r   r-   rV   r.   Ú_gather_keypoints_for_queriesÚ_empty_keypoint_outputsÚ_decode_keypoints_for_imager[   )r   r#   r$   r%   r'   r&   r   r\   rl   rk   r]   rf   Úboxes_irg   re   ri   rj   s                    r   r   z"PostProcess._postprocess_keypoints¶   s  € ð8 ˆÜ × <Ñ <ÀaÔHÐÜ" 4×#?Ñ#?Ó@ÐÜ�}×*Ñ*¨1Ñ-Ó.ò 	ˆAØ˜a‘yˆHØ˜A‘hˆGØ˜a‘yˆHØ×<Ñ<¸]È1Ñ=MÈzÐZ[É}Ó]ˆKØ:>×:VÑ:VØØ!ó;Ñ7ÐÐ7ð $ aÒ'Ð,=ÀÒ,AØHL×HhÑHhØ +Ø%Ø%Ø ,¨Q¡Ø%5Ø.GØ)=Ø&7ð Iió 	IÑE�Ð*Ð,Eð �N‰Nà&Ø&Ø$Ø!1Ø3Lñõð+	ð< ˆr   Úout_keypoints_iÚquery_indicesc           
      óÂ   — t        j                  | d|j                  d«      j                  d«      j                  d| j                  d   | j                  d   «      «      S )aj  Gather keypoint predictions for the selected query rows of one image.

        Args:
            out_keypoints_i: Keypoint predictions for one image with shape
                ``(Q, C * max(K_c), D)``.
            query_indices: Top-k query indices for that image.

        Returns:
            Keypoint predictions aligned with the selected detections.
        r   r0   r*   rP   )r6   rB   rC   rD   r.   )rs   rt   s     r   ro   z)PostProcess._gather_keypoints_for_queriesõ   s\   € ô �|‰|ØØØ×#Ñ# BÓ'×1Ñ1°"Ó5×<Ñ<¸QÀ×@UÑ@UÐVXÑ@YÐ[j×[pÑ[pÐqsÑ[tÓuó
ð 	
r   re   rl   c                 ó¢   — | j                  | j                  d   |df«      }| j                  | j                  d   |dft        d«      «      }||fS )a  Create zero/NaN-filled keypoint output tensors for one image.

        Args:
            keypoints_i: Gathered selected keypoint predictions for one image.
            max_num_keypoints: Maximum active keypoint count across classes.

        Returns:
            Tuple of pixel-space keypoint output ``(x, y, confidence)`` and raw
            precision-Cholesky output ``(log_l11, l21, log_l22)``. Inactive
            class-padded keypoints remain zeros for coordinates/confidence and
            NaN for precision.
        r   é   Únan)Ú	new_zerosr.   Únew_fullÚfloat)re   rl   ri   rj   s       r   rp   z#PostProcess._empty_keypoint_outputs  sc   € ð" '×0Ñ0°+×2CÑ2CÀAÑ2FÐHYÐ[\Ð1]Ó^ÐØ$/×$8Ñ$8¸+×:KÑ:KÈAÑ:NÐPaÐcdÐ9eÔglÐmrÓgsÓ$tÐ!ØÐ!:Ð:Ð:r   rf   rg   rh   ri   rj   rk   c          	      óü  — |j                   d   }	|	||z  k7  rt        d|	› d|› d|› d�«      ‚|j                  |j                   d   |||j                   d   «      }
||k  }|j                  «       s|||fS |j	                  d¬	«      d   }||   }|
||f   }| j
                  dkD  r&|j                   d   d
k\  r| j                  ||||«      }|\  }}|j                   d   d
k\  }t        |«      D ]‰  }||k(  }|j                  «       sŒ| j                  |   }|dk  rŒ.||   }||d|…f   }|d   |z  ||d|…df<   |d   |z  ||d|…df<   |d   j                  «       ||d|…df<   |sŒz|ddd
…f   ||d|…f<   Œ‹ |||fS )a  Decode selected keypoints for one image into output tensors.

        Args:
            keypoints_i: Gathered selected keypoint predictions for one image.
            labels_i: Predicted class labels for selected detections.
            scores_i: Object scores before optional keypoint uncertainty fusion.
            target_size: Image ``(height, width)`` tensor.
            output_keypoints: Preallocated keypoint output tensor to fill.
            output_keypoint_precision: Preallocated precision output tensor to
                fill.
            num_keypoint_classes: Number of class slots in the keypoint schema.
            max_num_keypoints: Padded keypoint count per class slot.

        Returns:
            Updated object scores, keypoint outputs, and precision outputs. The
            score tensor is cloned only when uncertainty fusion is applied.

        Raises:
            ValueError: If the padded keypoint dimension of ``keypoints_i`` is
                not equal to ``num_keypoint_classes * max_num_keypoints``.
        r*   z#keypoints_i padded slot dimension (z#) must equal num_keypoint_classes (z) * max_num_keypoints (z).r   r0   T)Úas_tupleé   N).r   ).r*   ©.r+   r+   .r>   )
r.   r,   r4   ÚanyÚnonzeror	   Ú_apply_keypoint_trace_fusionrV   r   r3   )r   re   rf   rg   rh   ri   rj   rk   rl   Útotal_padded_keypoint_slotsÚreshapedÚvalid_class_maskÚvalid_indicesÚselected_labelsÚselected_keypointsrK   rL   Úhas_precisionÚ	class_idxÚ
class_maskÚnum_active_keypointsÚout_idxÚactive_keypointss                          r   rq   z'PostProcess._decode_keypoints_for_image  s[  € ðB '2×&7Ñ&7¸Ñ&:Ð#Ø&Ð*>ÐARÑ*RÒRÜØ5Ð6QÐ5Rð S)Ø)=Ð(>Ð>UÐVgÐUhÐhjðlóð ð ×#Ñ#Ø×Ñ˜aÑ Ð"6Ð8IÈ;×K\ÑK\Ð]_ÑK`ó
ˆð $Ð&:Ñ:ÐØ×#Ñ#Ô%ØÐ-Ð/HÐHÐHà(×0Ñ0¸$Ð0Ó?ÀÑBˆØ" =Ñ1ˆØ% m°_Ð&DÑEÐØ×Ñ˜aÒÐ$6×$<Ñ$<¸RÑ$@ÀAÒ$EØ×8Ñ8¸À=ÐRaÐcuÓvˆHà"‰ˆˆuØ*×0Ñ0°Ñ4¸Ñ9ˆô Ð3Ó4ò 	gˆIØ(¨IÑ5ˆJØ—>‘>Ô#ØØ#'×#?Ñ#?À	Ñ#JÐ Ø# qÒ(Øà# JÑ/ˆGØ1°*Ð>SÐ?SÐ>SÐ2SÑTÐØBRÐSYÑBZÐ]bÑBbÐ˜WÐ&;Ð';Ð&;¸QÐ>Ñ?ØBRÐSYÑBZÐ]bÑBbÐ˜WÐ&;Ð';Ð&;¸QÐ>Ñ?ØBRÐSYÑBZ×BbÑBbÓBdÐ˜WÐ&;Ð';Ð&;¸QÐ>Ñ?ÚØL\Ð]`ÐbcÐdeÐbeÐ]eÑLfÐ)¨'Ð3HÐ4HÐ3HÐ*HÒIð	gð  Ð)Ð+DÐDÐDr   r†   r‡   rˆ   c                 ó”  — t        | j                  «      }|j                  |j                  d   «      }t	        |«      D ]J  }||k(  }|j                  «       sŒ| j                  |   }	|	dk  rŒ.||d|	…f   }
| j                  |
«      ||<   ŒL |j                  «       }||   t        j                  | j                   |z  «      z  ||<   |S )a  Fuse object scores with keypoint localization uncertainty.

        Args:
            scores_i: Object scores for one image before keypoint uncertainty
                fusion.
            valid_indices: Detection indices whose predicted class has a
                keypoint schema slot.
            selected_labels: Class labels corresponding to ``valid_indices``.
            selected_keypoints: Class-selected keypoint predictions for those
                detections.

        Returns:
            A score tensor where valid keypoint detections are multiplied by
            ``exp(-trace_alpha * log_mean_trace)``. The trace is the
            findability-weighted mean expected squared localization error
            implied by the predicted precision-Cholesky parameters.
        r   N)r-   r   ry   r.   rV   r€   Ú_keypoint_log_mean_traceÚcloner6   Úexpr	   )r   rg   r†   r‡   rˆ   rk   Úlog_mean_tracesrŠ   r‹   rŒ   rŽ   s              r   r‚   z(PostProcess._apply_keypoint_trace_fusiong  sê   € ô0  # 4×#?Ñ#?Ó@ÐØ,×6Ñ6°×7LÑ7LÈQÑ7OÓPˆô Ð3Ó4ò 	ZˆIØ(¨IÑ5ˆJØ—>‘>Ô#ØØ#'×#?Ñ#?À	Ñ#JÐ Ø# qÒ(ð à1°*Ð>SÐ?SÐ>SÐ2SÑTÐØ*.×*GÑ*GÐHXÓ*YˆO˜JÒ'ð	Zð —>‘>Ó#ˆØ"*¨=Ñ"9¼E¿I¹IÀt×GWÑGWÐFWÐZiÑFiÓ<jÑ"jˆ�ÑØˆr   rŽ   c                 óÞ  — | d   }| d   }| d   }| d   j                  «       }d|z  }d|z  }dt        j                  |j                  «       j	                  d¬«      «      z  |z   |z   }t        j
                  t        j                  |||gd	¬
«      d	¬
«      }t        j                  |j	                  d¬«      «      }	t        j
                  ||	z   d	¬
«      t        j
                  |	d	¬
«      z
  S )aÚ  Compute log mean covariance trace for active keypoints.

        Args:
            active_keypoints: Active keypoint predictions with shape
                ``(..., K, D)`` where ``K`` is the active keypoint count for the
                detection's class and ``D`` is the per-keypoint feature dim.
                Columns ``4:7`` are ``(log_l11, l21, log_l22)`` precision
                Cholesky parameters and column ``2`` is the findable logit. A
                leading batch dimension is supported so this can be called once
                for an entire class group of detections.

        Returns:
            Tensor with the leading batch dimensions of ``active_keypoints``
            (scalar when called on a single detection). Each entry is the log of
            the findability-weighted arithmetic mean trace of the covariance
            matrix. The computation stays in log space for numerical stability
            with very sharp or very uncertain predictions.
        ).r>   ).é   ).é   r   g       Àg       @gê-�™—q=)r5   r0   r1   )r3   r6   ÚlogÚabsrJ   Ú	logsumexprF   )
rŽ   Úlog_l11Úl21Úlog_l22Úw_findÚlog_t1Úlog_t2Úlog_t3Úlog_trace_sigmaÚ
log_w_finds
             r   r�   z$PostProcess._keypoint_log_mean_trace—  sÚ   € ð( # 6Ñ*ˆØ˜vÑ&ˆØ" 6Ñ*ˆØ! &Ñ)×1Ñ1Ó3ˆØ˜‘ˆØ˜‘ˆØ”u—y‘y §¡£§¡°U Ó!;Ó<Ñ<¸vÑEÈÑNˆÜŸ/™/¬%¯+©+°v¸vÀvÐ6NÐTVÔ*WÐ]_Ô`ˆÜ—Y‘Y˜vŸ|™|°˜|Ó6Ó7ˆ
Ü�‰˜°Ñ;ÀÔDÄuÇÁÐWaÐgiÔGjÑjÐjr   c           	      ó^   — t        | ||«      D ���cg c]  \  }}}|||dœ‘Œ c}}}S c c}}}w )ag  Build detection-only result dictionaries.

        Args:
            scores: Selected object scores with shape ``(B, K)``.
            labels: Selected class labels with shape ``(B, K)``.
            boxes: Selected absolute boxes with shape ``(B, K, 4)``.

        Returns:
            One result dict per image containing scores, labels, and boxes.
        rO   )Úzip)r$   r%   r'   ÚscoreÚlabelÚboxs         r   r   zPostProcess._postprocess_boxes¶  s8   € ô  [^Ð^dÐflÐnsÓZt×uÐuÑEVÀUÈEÐSV˜5¨E¸CÓ@ÔuÐuùÔus   ’()i,  Ngš™™™™™É?)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rZ   Úlistr{   r   r6   Úno_gradÚdictÚstrÚTensorr(   Ústaticmethodr   Útupler   r   r   r   ro   rp   rq   r‚   r�   r   Ú__classcell__)r   s   @r   r   r      sh  ø„ ñð Ø48Ø ñ		'àð	'ð "& c¡¨TÑ!1ð	'ð ð		'ð
 
õ	'ð €U‡]�]ƒ_ð>˜t C¨¯©Ð$5Ñ6ð >ÀeÇlÁlð >ÐW[Ð\`ÐadÐfk×frÑfrÐarÑ\sÑWtò >ó ð>ð8 ð*Ø—L‘Lð*à—<‘< $Ñ&ð*ð —|‘| dÑ*ð*ð —l‘lð	*ð
 
ò*ó ð*ð4* u§|¡|ð *¸¸e¿l¹lÈEÏLÉLÐZ_×ZfÑZfÐ>fÑ8gó *ð* ðØ—,‘,ðà—L‘Lðð —l‘lðð 
�‰ò	ó ðð2 ð&Ø—<‘<ð&à—‘ð&ð —‘ð&ð �|‰|ð	&ð
 —L‘Lð&ð —l‘lð&ð 
ˆd�3˜Ÿ™Ð$Ñ%Ñ	&ò&ó ð&ðP=à—|‘|ð=ð —‘ð=ð —‘ð	=ð
 �|‰|ð=ð —L‘Lð=ð —l‘lð=ð 
ˆd�3˜Ÿ™Ð$Ñ%Ñ	&ó=ð~ ð
°u·|±|ð 
ÐTY×T`ÑT`ð 
Ðej×eqÑeqò 
ó ð
ð" ð;Ø—\‘\ð;àð;ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*ò;ó ð;ð(IEð —\‘\ðIEð —,‘,ð	IEð
 —,‘,ðIEð —\‘\ðIEð  Ÿ,™,ðIEð $)§<¡<ðIEð "ðIEð ðIEð 
ˆu�|‰|˜UŸ\™\¨5¯<©<Ð7Ñ	8óIEðV.à—,‘,ð.ð —|‘|ð.ð Ÿ™ð	.ð
 "ŸL™Lð.ð 
�‰ó.ð` ðk°5·<±<ð kÀEÇLÁLò kó ðkð< ðvØ—‘ðvà—‘ðvð �|‰|ðvð 
ˆd�3˜Ÿ™Ð$Ñ%Ñ	&ò	vó ôvr   r   )
r«   r6   Útorch.nn.functionalr   Ú
functionalrX   Úrfdetr.utilitiesr   ÚModuler   © r   r   ú<module>r¹      s.   ðñ Nã ß Ð Ý å $ôsv�"—)‘)õ svr   