Ë
    Fêñièg  ã                  óä   — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlZddlZddlmZmZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZ ddl m!Z!  G d„ d«      Z"y)a5  
Module provides functionalities for hyperparameter tuning of the Ultralytics YOLO models for object detection, instance
segmentation, image classification, pose estimation, and multi-object tracking.

Hyperparameter tuning is the process of systematically searching for the optimal set of hyperparameters
that yield the best model performance. This is particularly crucial in deep learning models like YOLO,
where small changes in hyperparameters can lead to significant differences in model accuracy and efficiency.

Examples:
    Tune hyperparameters for YOLO26n on COCO8 at imgsz=640 and epochs=10 for 300 tuning iterations.
    >>> from ultralytics import YOLO
    >>> model = YOLO("yolo26n.pt")
    >>> model.tune(data="coco8.yaml", epochs=10, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)
é    )ÚannotationsN)ÚCounter)Údatetime)ÚPath)ÚCFG_INT_KEYSÚget_cfgÚget_save_dir)ÚDEFAULT_CFGÚLOGGERÚYAMLÚ	callbacksÚcolorstrÚremove_colorstr)Úcheck_requirements)Ú
torch_load)Úplot_tune_resultsc                  ó  — e Zd ZdZedfdd„Zddd„Zdd„Zddd„Ze	d„ «       Z
	 d	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 	 dd	„Zd
„ Zdd„Zddd„Zdd„Ze	dd„«       Ze	d d„«       Ze	d!d"d„«       Z	 	 	 d#	 	 	 	 	 	 	 d$d„Zd%d&d„Zy)'ÚTuneraS  A class for hyperparameter tuning of YOLO models.

    The class evolves YOLO model hyperparameters over a given number of iterations by mutating them according to the
    search space and retraining the model to evaluate their performance. Supports both local NDJSON storage and
    distributed MongoDB Atlas coordination for multi-machine hyperparameter optimization.

    Attributes:
        space (dict[str, tuple]): Hyperparameter search space containing bounds and scaling factors for mutation.
        tune_dir (Path): Directory where evolution logs and results will be saved.
        tune_file (Path): Path to the NDJSON file where evolution logs are saved.
        args (SimpleNamespace): Configuration arguments for the tuning process.
        callbacks (dict): Callback functions to be executed during tuning.
        prefix (str): Prefix string for logging messages.
        mongodb (MongoClient): Optional MongoDB client for distributed tuning.
        collection (Collection): MongoDB collection for storing tuning results.

    Methods:
        _mutate: Mutate hyperparameters based on bounds and scaling factors.
        __call__: Execute the hyperparameter evolution across multiple iterations.

    Examples:
        Tune hyperparameters for YOLO26n on COCO8 at imgsz=640 and epochs=10 for 300 tuning iterations.
        >>> from ultralytics import YOLO
        >>> model = YOLO("yolo26n.pt")
        >>> model.tune(
        >>>     data="coco8.yaml",
        >>>     epochs=10,
        >>>     iterations=300,
        >>>     plots=False,
        >>>     save=False,
        >>>     val=False
        >>> )

        Tune with distributed MongoDB Atlas coordination across multiple machines:
        >>> model.tune(
        >>>     data="coco8.yaml",
        >>>     epochs=10,
        >>>     iterations=300,
        >>>     mongodb_uri="mongodb+srv://user:pass@cluster.mongodb.net/",
        >>>     mongodb_db="ultralytics",
        >>>     mongodb_collection="tune_results"
        >>> )

        Tune with custom search space:
        >>> model.tune(space={"lr0": (1e-5, 1e-2), "momentum": (0.7, 0.98)})
    Nc                óº  — |j                  dd«      xsA i dd“dd“dd“d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d
dddddddd!d"œ	¥| _        |j                  d#d«      }|j                  d$d%«      }|j                  d&d'«      }t        |¬(«      | _        | j                  j                  | j                  _        t        | j                  | j                  j                  xs d)¬*«      | _        d+\  | j                  _        | j                  _        | j                  _        | j                  d,z  | _	        |xs t        j                  «       | _
        t        d-«      | _        t        j                  | «       d| _        |r| j!                  |||«       t#        j$                  | j                  › d.| j                  › d/| j                  › d0�«       y)1zçInitialize the Tuner with configurations.

        Args:
            args (dict): Configuration for hyperparameter evolution.
            _callbacks (dict | None, optional): Callback functions to be executed during tuning.
        ÚspaceNÚlr0)gñhãˆµøä>ç{®Gáz„?Úlrf)r   ç      ð?Úmomentum)gffffffæ?g\�Âõ(\ï?g333333Ó?Úweight_decay)ç        gü©ñÒMbP?Úwarmup_epochs)r   g      @Úwarmup_momentum)r   gffffffî?Úbox)r   g      4@Úcls)çš™™™™™¹?ç      @Úcls_pw)r   r   Údfl)gš™™™™™Ù?g      (@Úhsv_h)r   r"   Úhsv_s)r   gÍÌÌÌÌÌì?Úhsv_vÚdegrees)r   g     €F@Ú	translateÚscaleÚshear)r   g      $@)	ÚperspectiveÚflipudÚfliplrÚbgrÚmosaicÚmixupÚcutmixÚ
copy_pasteÚclose_mosaicÚmongodb_uriÚ
mongodb_dbÚultralyticsÚmongodb_collectionÚtuner_results)Ú	overridesÚtune©Úname)NFFztune_results.ndjsonzTuner: z*Initialized Tuner instance with 'tune_dir=z'
uT   ðŸ’¡ Learn about tuning at https://docs.ultralytics.com/guides/hyperparameter-tuning)Úpopr   r   ÚargsÚresumeÚexist_okr	   r>   Útune_dirÚ	tune_filer   Úget_default_callbacksr   ÚprefixÚadd_integration_callbacksÚmongodbÚ_init_mongodbr   Úinfo)Úselfr@   Ú
_callbacksr6   r7   r9   s         úZ/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/engine/tuner.pyÚ__init__zTuner.__init__W   s6  € ð —X‘X˜g tÓ,ò 
ð 1
à�<ð1
ð �;ð1
ð Ð(ð	1
ð
 ˜Lð1
ð ˜Zð1
ð ˜{ð1
ð �;ð1
ð �:ð1
ð �jð1
ð �;ð1
ð �Zð1
ð �Zð1
ð �Zð1
ð �{ð1
ð  ˜ð!1
ð" �[ð#1
ð$ �[ð%1
ð& (Ø Ø ØØ ØØ Ø$Ø'ò71
ˆŒ
ð: —h‘h˜}¨dÓ3ˆØ—X‘X˜l¨MÓ:ˆ
Ø!ŸX™XÐ&:¸OÓLÐä dÔ+ˆŒ	Ø!ŸY™Y×-Ñ-ˆ�	‰	ÔÜ$ T§Y¡Y°T·Y±Y·^±^Ò5MÀvÔNˆŒØ?SÑ<ˆ�	‰	Œ˜Ÿ	™	Ô*¨D¯I©IÔ,<ØŸ™Ð)>Ñ>ˆŒØ#ÒH¤y×'FÑ'FÓ'HˆŒÜ˜yÓ)ˆŒÜ×+Ñ+¨DÔ1ð ˆŒÙØ×Ñ˜{¨JÐ8JÔKä�‰Ø�{‰{ˆmÐEÀdÇmÁmÀ_ÐTWØ�{‰{ˆmÐoðqõ	
ó    c                ó¼  — t        d«       ddlm} ddlm}m} t        |«      D ]Z  }	  ||dddddd	d
d¬«	      }|j                  j                  d«       t        j                  | j                  › d|dz   › d�«       |c S  y# ||f$ rQ ||dz
  k(  r‚ d|z  }t        j                  | j                  › d|dz   › d|› d�«       t        j                  |«       Y Œµw xY w)af  Create MongoDB client with exponential backoff retry on connection failures.

        Args:
            uri (str): MongoDB connection string with credentials and cluster information.
            max_retries (int): Maximum number of connection attempts before giving up.

        Returns:
            (MongoClient): Connected MongoDB client instance.
        Úpymongor   )ÚMongoClient)ÚConnectionFailureÚServerSelectionTimeoutErrori0u  i N  i@œ  Té   é   i`ê  )ÚserverSelectionTimeoutMSÚconnectTimeoutMSÚsocketTimeoutMSÚretryWritesÚ
retryReadsÚmaxPoolSizeÚminPoolSizeÚmaxIdleTimeMSÚpingz$Connected to MongoDB Atlas (attempt é   ú)é   z#MongoDB connection failed (attempt z), retrying in zs...N)r   rQ   rR   Úpymongo.errorsrS   rT   ÚrangeÚadminÚcommandr   rJ   rF   ÚwarningÚtimeÚsleep)	rK   ÚuriÚmax_retriesrR   rS   rT   ÚattemptÚclientÚ	wait_times	            rM   Ú_connectzTuner._connect’   sü   € ô 	˜9Ô%å'ßQä˜[Ó)ò 	&ˆGð&Ù$ØØ-2Ø%*Ø$)Ø $Ø#Ø "Ø !Ø"'ô
�ð —‘×$Ñ$ VÔ,Ü—‘˜tŸ{™{˜mÐ+OÐPWÐZ[ÑP[È}Ð\]Ð^Ô_Ø’ñ	&øð  &Ð'BÐCò &Ø˜k¨A™oÒ-ØØ˜w™J�	Ü—‘Ø—{‘{�mÐ#FÀwÐQRÁ{ÀmÐSbÐclÐbmÐmqÐrôô —
‘
˜9Ö%ð&ús   ©ABÂACÃCc                óÞ   — | j                  |«      | _        | j                  |   |   | _        | j                  j                  dgd¬«       t	        j
                  | j                  › d�«       y)a  Initialize MongoDB connection for distributed tuning.

        Connects to MongoDB Atlas for distributed hyperparameter optimization across multiple machines. Each worker
        saves results to a shared collection and reads the latest best hyperparameters from all workers for evolution.

        Args:
            mongodb_uri (str): MongoDB connection string, e.g. 'mongodb+srv://username:password@cluster.mongodb.net/'.
            mongodb_db (str, optional): Database name.
            mongodb_collection (str, optional): Collection name.

        Notes:
            - Creates a fitness index for fast queries of top results
            - Falls back to local NDJSON mode if connection fails
            - Uses connection pooling and retry logic for production reliability
        )ÚfitnesséÿÿÿÿT)Ú
backgroundz*Using MongoDB Atlas for distributed tuningN)ro   rH   Ú
collectionÚcreate_indexr   rJ   rF   )rK   r6   r7   r9   s       rM   rI   zTuner._init_mongodbº   s\   € ð  —}‘} [Ó1ˆŒØŸ,™, zÑ2Ð3EÑFˆŒØ�‰×$Ñ$ oÐ%6À4Ð$ÔHÜ�‰�t—{‘{�mÐ#MÐNÕOrO   c                óª   — 	 t        | j                  j                  «       j                  dd«      j	                  |«      «      S # t
        $ r g cY S w xY w)zïGet top N results from MongoDB sorted by fitness.

        Args:
            n (int): Number of top results to retrieve.

        Returns:
            (list[dict]): List of result documents with fitness scores and hyperparameters.
        rq   rr   )Úlistrt   ÚfindÚsortÚlimitÚ	Exception)rK   Úns     rM   Ú_get_mongodb_resultszTuner._get_mongodb_resultsÏ   sK   € ð	Ü˜Ÿ™×,Ñ,Ó.×3Ñ3°I¸rÓB×HÑHÈÓKÓLÐLøÜò 	ØŠIð	ús   ‚AA ÁAÁAc                óP   — t        | d«      r| j                  «       S t        | «      S )z2Convert tensor-like values for JSON serialization.Úitem)Úhasattrr   Ústr)Úxs    rM   Ú_json_defaultzTuner._json_defaultÝ   s"   € ô # 1 fÔ-ˆq�v‰v‹xÐ9´3°q³6Ð9rO   c                ó6   — |t        |d«      ||dœ}|r||d<   |S )z%Build one local tuning result record.é   )Ú	iterationrq   ÚhyperparametersÚdatasetsÚ	save_dirs)Úround)rK   r†   rq   r‡   rˆ   r‰   Úresults          rM   Ú_result_recordzTuner._result_recordâ   s2   € ð #Ü˜W aÓ(Ø.Ø ñ	
ˆñ Ø"+ˆF�;ÑØˆrO   c                ój  — 	 | j                   j                  ||j                  «       D ��ci c]$  \  }}|t        |d«      r|j	                  «       n|“Œ& c}}||t        j                  «       |dœ«       yc c}}w # t        $ r.}t        j                  | j                  › d|› �«       Y d}~yd}~ww xY w)aà  Save results to MongoDB with proper type conversion.

        Args:
            fitness (float): Fitness score achieved with these hyperparameters.
            hyperparameters (dict[str, float]): Dictionary of hyperparameter values.
            metrics (dict): Complete training metrics dictionary (mAP, precision, recall, losses, etc.).
            datasets (dict[str, dict]): Per-dataset metrics for the iteration.
            iteration (int): Current iteration number.
        r   )rq   r‡   Úmetricsrˆ   Ú	timestampr†   zMongoDB save failed: N)rt   Ú
insert_oneÚitemsr€   r   r   Únowr{   r   rg   rF   )	rK   rq   r‡   rŽ   rˆ   r†   ÚkÚvÚes	            rM   Ú_save_to_mongodbzTuner._save_to_mongodbõ   s¢   € ð"	EØ�O‰O×&Ñ&à&Ø_n×_tÑ_tÓ_v×'wÑW[ÐWXÐZ[¨¼ÀÀ6Ô8J¨A¯F©F¬HÐPQÑ(QÓ'wØ&Ø (Ü!)§¡£Ø!*ñõ	ùó (xøô ò 	EÜ�N‰N˜dŸk™k˜]Ð*?À¸sÐC×DÑDûð	Eús(   ‚)A; «)A5Á A; Á5A; Á;	B2Â$B-Â-B2c                óN  — 	 t        | j                  j                  «       j                  dd«      «      }|syt	        | j
                  dd¬«      5 }|D ]�  }|j                  t        j                  | j                  |d   |d   xs d|j                  d	i «      |j                  d
i «      |j                  d«      «      | j                  ¬«      dz   «       Œƒ 	 ddd«       y# 1 sw Y   yxY w# t        $ r.}t        j                  | j                  › d|› �«       Y d}~yd}~ww xY w)a  Sync MongoDB results to the local NDJSON tuning log.

        Downloads all results from MongoDB and writes them to the local NDJSON file in chronological order. This keeps
        resume, mutation, and plotting on the same local source of truth when using distributed tuning.
        r†   r`   NÚwúutf-8©Úencodingrq   r   r‡   rˆ   r‰   ©Údefaultú
zMongoDB to NDJSON sync failed: )rw   rt   rx   ry   ÚopenrD   ÚwriteÚjsonÚdumpsrŒ   Úgetrƒ   r{   r   rg   rF   )rK   Úall_resultsÚfr‹   r•   s        rM   Ú_sync_mongodb_to_filezTuner._sync_mongodb_to_file  s  € ð	OÜ˜tŸ™×3Ñ3Ó5×:Ñ:¸;ÈÓJÓKˆKÙØä�d—n‘n c°GÔ<ð ÀØ)ò �FØ—G‘GÜŸ
™
Ø ×/Ñ/Ø & {Ñ 3Ø & yÑ 1Ò 8°SØ &§
¡
Ð+<¸bÓ AØ &§
¡
¨:°rÓ :Ø &§
¡
¨;Ó 7óð %)×$6Ñ$6ô	ð ñ
õñ÷÷ ñ ûô  ò 	OÜ�N‰N˜dŸk™k˜]Ð*IÈ!ÈÐM×NÑNûð	Oús;   ‚5C- ¸C- ÁBC!ÃC- Ã!C*Ã&C- Ã*C- Ã-	D$Ã6$DÄD$c                ó  — | j                   j                  «       sg S t        | j                   d¬«      5 }|D �cg c](  }|j                  «       sŒt	        j
                  |«      ‘Œ* c}cddd«       S c c}w # 1 sw Y   yxY w)z.Load local tuning results from the NDJSON log.r™   rš   N)rD   ÚexistsrŸ   Ústripr¡   Úloads)rK   r¥   Úlines      rM   Ú_load_local_resultszTuner._load_local_results2  sh   € à�~‰~×$Ñ$Ô&ØˆIÜ�$—.‘.¨7Ô3ð 	D°qØ12ÖC¨°d·j±jµl”D—J‘J˜tÕ$ÒC÷	Dñ 	DùÚC÷	Dð 	Dús"   ´A7¹A2ÁA2Á&A7Á2A7Á7B c                ó†  — |syt        j                  |D ��cg c]d  }|j                  dd«      g| j                  D �cg c]8  }|j                  di «      j                  |t	        | j
                  |«      «      ‘Œ: c}z   ‘Œf c}}t        ¬«      }|€|S t        j                  |dd…df    «      }||   d| S c c}w c c}}w )zKConvert local NDJSON records to a fitness-plus-hyperparameters numpy array.Nrq   r   r‡   )Údtyper   )ÚnpÚarrayr£   r   Úgetattrr@   ÚfloatÚargsort)rK   Úresultsr|   Úrr“   r‚   Úorders          rM   Ú_local_results_to_arrayzTuner._local_results_to_array9  sÁ   € áØÜ�H‰Hð !÷ð ð —‘�y #Ó&Ð'ØW[×WaÑWaÖbÐRS�1—5‘5Ð*¨BÓ/×3Ñ3°A´w¸t¿y¹yÈ!Ó7LÕMÒbócóô
 ô
ˆð ˆ9ØˆHÜ—
‘
˜Aša ˜d™G˜8Ó$ˆØ�‰x˜˜ˆ|Ðùò cùós   ˜%B=
½=B8Á:B=
Â8B=
c                óÄ   — t        | j                  dd¬«      5 }|j                  t        j                  || j
                  ¬«      dz   «       ddd«       y# 1 sw Y   yxY w)z1Append one tuning result to the local NDJSON log.Úar™   rš   rœ   rž   N)rŸ   rD   r    r¡   r¢   rƒ   )rK   r‹   r¥   s      rM   Ú_save_local_resultzTuner._save_local_resultJ  sO   € ä�$—.‘. #°Ô8ð 	K¸AØ�G‰G”D—J‘J˜v¨t×/AÑ/AÔBÀTÑIÔJ÷	K÷ 	Kñ 	Kús   ™4AÁAc           
     ó2  — | j                  di «      }t        |«      dk(  r"t        t        |j	                  «       «      «      S t        |«      dkD  rA|j                  «       D ��ci c]%  \  }}|t        |j                  d«      xs dd«      “Œ' c}}S yc c}}w )z*Summarize best-result metrics for logging.rˆ   r`   rq   r   r…   N)r£   ÚlenÚnextÚiterÚvaluesr‘   rŠ   )r‹   rˆ   r“   r”   s       rM   Ú_best_metricszTuner._best_metricsO  s‚   € ð —:‘:˜j¨"Ó-ˆÜˆx‹=˜AÒÜœ˜XŸ_™_Ó.Ó/Ó0Ð0Üˆx‹=˜1ÒØEMÇ^Á^ÓEU×V¹T¸QÀ�A”u˜QŸU™U 9Ó-Ò4°°aÓ8Ñ8ÓVÐVØùó Ws   Á$*Bc                ó  — | D �cg c]   }t        t        |«      «      j                  ‘Œ" }}t        |«      t        «       }}g }|D ]2  }||xx   dz  cc<   |j	                  ||   dkD  r
|› d||   › �n|«       Œ4 |S c c}w )zGCreate stable unique dataset names for logging and per-run directories.r`   ú-)r   r�   Ústemr   Úappend)ÚdataÚdÚstemsÚtotalsÚseenÚnamesrÃ   s          rM   Ú_dataset_nameszTuner._dataset_namesY  s‹   € ð -1Ö1 q””c˜!“f“×"Ó"Ð1ˆÐ1Ü˜u“~¤w£y�ˆØˆØò 	OˆDØ�‹J˜!‰O‹JØ�L‰L°6¸$±<À!Ò3C˜D˜6  4¨¡: ,Ñ/ÈÕNð	Oð ˆùò 2s   …%A<c                óè  — t        |t        | «      «      }| dd…df   | dd…df   j                  «       z
  dz   }t        j                  |«      j	                  «       r|j                  «       dk(  rt        j                  |«      }t        j                  t        t        | «      «      ||¬«      }t        j                  |D �cg c]
  }| |   dd ‘Œ c}d«      }|j                  d«      |j                  d«      }}||z
  }	t        j                  |	dk(  t        j                  j                  dd|	j                  «      |	«      }	t        j                  j                  |||	z  z
  |||	z  z   «      S c c}w )uG   BLX-Î± crossover from up to top-k parents (x[:,0]=fitness, rest=genes).Nr   g�íµ ÷Æ°>)Úweightsr“   r`   r   r"   )Úminr¼   r¯   ÚisfiniteÚallÚsumÚ	ones_likeÚrandomÚchoicesrd   ÚstackÚmaxÚwhereÚuniformÚshape)
r‚   Úalphar“   rÍ   ÚidxsÚiÚparents_matÚloÚhiÚspans
             rM   Ú
_crossoverzTuner._crossoverd  s&  € ô �”3�q“6‹Nˆà’A�q�D‘'˜Aša ˜d™GŸK™K›MÑ)¨DÑ0ˆÜ�{‰{˜7Ó#×'Ñ'Ô)¨W¯[©[«]¸aÒ-?Ü—l‘l 7Ó+ˆGÜ�~‰~œe¤C¨£F›m°WÀÔBˆÜ—h‘h°$Ö7¨Q  !¡ Q R¢Ò7¸Ó;ˆØ—‘ Ó# [§_¡_°QÓ%7ˆBˆØ�B‰wˆä�x‰x˜ ™	¤2§9¡9×#4Ñ#4°T¸3ÀÇ
Á
Ó#KÈTÓRˆÜ�y‰y× Ñ   e¨d¡lÑ!2°B¸À¹Ñ4EÓFÐFùò  8s   ÃE/c                óÔ  — d}| j                   �r | j                  |«      x}rt        j                  |D ��cg c]]  }|d   g| j                  j                  «       D �cg c]0  }|d   j                  || j                  j                  |«      «      ‘Œ2 c}z   ‘Œ_ c}}«      }nŽ| j                  j                  | j                  j                  j                  «       v rTt        j                  dg| j                  j                  «       D �cg c]  }t        | j                  |«      ‘Œ c}z   g«      }|€!| j                  | j                  «       |¬«      }|��¾t        j                  j!                  t#        t%        j$                  «       «      «       t'        | j                  «      }| j)                  |«      }	t        j                  | j                  j+                  «       D �
cg c]  }
t'        |
«      dk(  r|
d   nd‘Œ c}
«      }t        j,                  |«      }t        j.                  |d	k(  «      ršt        j                  j                  |«      |k  }t        j                  j1                  |«      ||z  z  }t        j2                  |t        j4                  |«      d«      j7                  d
d«      }t        j.                  |d	k(  «      rŒšt9        | j                  j                  «       «      D ��ci c]  \  }}|t;        |	|   ||   z  «      “Œ }}}n<| j                  j                  «       D �ci c]  }|t        | j                  |«      “Œ }}| j                  j=                  «       D ]1  \  }}t?        tA        tC        ||   |d   «      |d	   «      d«      ||<   Œ3 d|v rt?        |d   «      |d<   d|v rt?        |d   «      |d<   |S c c}w c c}}w c c}w c c}
w c c}}w c c}w )a¶  Mutate hyperparameters based on bounds and scaling factors specified in `self.space`.

        Args:
            n (int): Number of top parents to consider.
            mutation (float): Probability of a parameter mutation in any given iteration.
            sigma (float): Standard deviation for Gaussian random number generator.

        Returns:
            (dict[str, float]): A dictionary containing mutated hyperparameters.
        Nrq   r‡   r   )r|   rV   rb   r   r`   g      Ð?r#   r   r…   r5   Úepochs)"rH   r}   r¯   r°   r   Úkeysr£   r@   rt   r>   ÚdatabaseÚlist_collection_namesr±   r·   r¬   rÓ   ÚseedÚintrh   r¼   rá   r¿   ÚonesrÐ   Úrandnr×   ÚexpÚclipÚ	enumerater²   r‘   rŠ   rÎ   rÖ   )rK   r|   ÚmutationÚsigmar‚   r´   rµ   r“   ÚngÚgenesr”   ÚgainsÚfactorsÚmaskÚsteprÜ   ÚhypÚboundss                     rM   Ú_mutatezTuner._mutatet  s:  € ð  ˆð �<‹<Ø×3Ñ3°AÓ6Ð6ˆwÐ6ä—H‘Hð ")÷àð ˜9™˜Ðae×akÑak×apÑapÓarÖ)sÐ\]¨!Ð,=Ñ*>×*BÑ*BÀ1ÀdÇiÁiÇmÁmÐTUÓFVÕ*WÒ)sÓsóó‘ð —‘×%Ñ%¨¯©×)AÑ)A×)WÑ)WÓ)YÑYÜ—H‘H˜s˜eÀdÇjÁjÇoÁoÓFWÖ&XÀ¤w¨t¯y©y¸!Õ'<Ò&XÑXÐYÓZ�ð ˆ9Ø×,Ñ,¨T×-EÑ-EÓ-GÈ1Ð,ÓMˆAð ‰=Ü�I‰I�N‰Nœ3œtŸy™y›{Ó+Ô,Ü�T—Z‘Z“ˆBð —O‘O AÓ&ˆEô —H‘HÀDÇJÁJ×DUÑDUÓDWÖX¸q¤c¨!£f°¢k˜a šd°sÑ:ÒXÓYˆEÜ—g‘g˜b“kˆGÜ—&‘&˜ A™Ô&Ü—y‘y×'Ñ'¨Ó+¨hÑ6�Ü—y‘y—‘ rÓ*¨e°e©mÑ<�ÜŸ(™( 4¬¯©°«°sÓ;×@Ñ@ÀÀsÓK�ô —&‘&˜ A™Õ&ô @IÈÏÉÏÉÓIZÓ?[×\±t°q¸!�1”e˜E !™H w¨q¡zÑ1Ó2Ñ2Ð\ˆCÒ\à59·Z±Z·_±_Ó5FÖG°�1”g˜dŸi™i¨Ó+Ñ+ÐGˆCÐGð Ÿ™×)Ñ)Ó+ò 	F‰IˆAˆvÜœ3œs 3 q¡6¨6°!©9Ó5°v¸a±yÓAÀ1ÓEˆC�ŠFð	Fð ˜SÑ Ü"'¨¨NÑ(;Ó"<ˆC�ÑØ�s‰?Ü! # h¡-Ó0ˆC�‰Màˆ
ùòQ *tùóùò 'Yùò Yùó ]ùâGs/   ·&O
Á5O
ÂO
Ä	O
Ç!OË1OÌ0O%Ï
O
c                óò  — t        j                   «       }| j                  j                  dd¬«       | j                  dz  j                  dd¬«       i }| j                  r| j	                  «        d}| j
                  j                  «       rNt        | j                  «       «      }t        j                  | j                  › d| j                  › d|dz   › d�«       t        ||«      D �]C  }t        |d	z  d
«      }dd|z  z
  }| j                  |¬«      }	t        j                  | j                  › d|dz   › d|› d|	› �«       i t        | j                   «      ¥|	¥}
|
j#                  d«      }t%        |t&        t(        f«      s|g}| j+                  |«      }t        |«      dk(  rt-        t/        |
«      «      gn#|D �cg c]  }t-        t/        |
«      |¬«      ‘Œ c}}|D �cg c]  }|dz  ‘Œ	 }}i }g }i }t1        t3        ||«      «      D �]-  \  }\  }}i }	 ||
d<   t5        ||   «      |
d<   t7        d«      j8                  ddg}g |¢d‘d„ |
j;                  «       D «       ¢}t=        j>                  |d¬«      j@                  }||   ||   dz  j                  «       rdndz  }tC        |«      d   }|}|dk(  sJ d«       ‚t        jD                  d«       tG        jH                  «        tJ        jL                  jO                  «        |xs d!d"i||<   |jU                  ||   jW                  d!«      xs d"«       �Œ0 tY        |«      t        |«      z  }| j[                  |dz   ||	|t3        ||«      D ��ci c]  \  }}|t5        |«      “Œ c}}«      }d#}| j                  rK| j]                  ||	|||dz   «       | j	                  «        | j^                  ja                  i «      } | |k\  rd}n| jc                  |«       | j                  «       }!| je                  |!«      }"|"d d …df   }|jg                  «       }#|!|#   }$|$jW                  d$i «      }%|#|k(  }&|&rÆ|r?|ji                  «       D ],  }||%ji                  «       vsŒtk        jl                  |d¬%«       Œ. t3        ||«      D ]s  \  }}'t        |«      dk(  r| j                  dz  n| j                  dz  |z  }(|(j                  dd¬«       |'jo                  d&«      D ]  })tk        jp                  |)|(«       Œ Œu |%}n"|r |D ]  }tk        jl                  |d¬%«       Œ |%}ts        t5        | j
                  «      «       | j                  › |dz   › d|› d't        j                   «       |z
  d(›d)| j                  › d*tu        d+| j                  «      › d| j                  › d,||#   › d-|#dz   › d| j                  › d.| jw                  |$«      › d| j                  › d/t        |$jW                  d0i «      «      dk(  r| j                  dz  nd1› �}*t        j                  d|*z   «       t3        | jx                  j{                  «       |"|#dd …f   «      D �+�,ci c]$  \  }+},|+|+t|        v rt        |,«      n
t�        |,«      “Œ& }}+},tƒ        j„                  | j                  d2z  |t‡        |*j‰                  | j                  d3«      «      dz   ¬4«       tƒ        jŠ                  | j                  d2z  «       |s�Œt        j                  | j                  › d5|› d6 › d7�«        y  y c c}w c c}w # tP        $ r)}t        jR                  d|dz   › d|› �«       Y d }~�Œad }~ww xY wc c}}w c c},}+w )8a÷  Execute the hyperparameter evolution process when the Tuner instance is called.

        This method iterates through the specified number of iterations, performing the following steps:
        1. Sync MongoDB results to local NDJSON (if using distributed mode)
        2. Mutate hyperparameters using the best previous results or defaults
        3. Train a YOLO model with the mutated hyperparameters
        4. Log fitness scores and hyperparameters to MongoDB and/or NDJSON
        5. Track the best performing configuration across all iterations

        Args:
            iterations (int): The number of generations to run the evolution for.
            cleanup (bool): Whether to delete iteration weights to reduce storage space during tuning.
        T)ÚparentsrB   rÍ   r   zResuming tuning run z from iteration r`   z...g     Àr@r   çš™™™™™É?r"   )rï   zStarting iteration ú/z with hyperparameters: rÅ   r=   Úsave_dirÚsysz-mzultralytics.cfg.__init__Útrainc              3  ó0   K  — | ]  \  }}|› d |› �–— Œ y­w)ú=N© )Ú.0r“   r”   s      rM   ú	<genexpr>z!Tuner.__call__.<locals>.<genexpr>ó  s   è ø€ Ò.Y¹d¸aÀ°!°°A°a°S¬zÑ.Yùs   ‚)Úcheckzbest.ptzlast.ptÚtrain_metricsztraining failedz5training failure for hyperparameter tuning iteration rž   Nrq   r   Fr‰   )Úignore_errorsz*.ptu    iterations complete âœ… (z.2fzs)
zResults saved to ÚboldzBest fitness=z observed at iteration zBest fitness metrics are zBest fitness model is rˆ   z"not saved for multi-dataset tuningzbest_hyperparameters.yamlz# )rÅ   ÚheaderzTarget iterations (z) reached in MongoDB (z). Stopping.)Frh   rC   ÚmkdirrH   r¦   rD   r¨   r¼   r¬   r   rJ   rF   rd   rÎ   rø   Úvarsr@   r?   Ú
isinstancerw   ÚtuplerË   r	   r   rí   Úzipr�   Ú
__import__Ú
executabler‘   Ú
subprocessÚrunÚ
returncoder   ri   ÚgcÚcollectÚtorchÚcudaÚempty_cacher{   ÚerrorrÄ   r£   rÑ   rŒ   r–   rt   Úcount_documentsrº   r·   Úargmaxr¿   ÚshutilÚrmtreeÚglobÚcopy2r   r   rÀ   r   rä   r   rè   r²   r   Úsaver   ÚreplaceÚprint)-rK   Ú
iterationsÚcleanupÚt0Úbest_save_dirsÚstartrÜ   ÚfracÚsigma_iÚmutated_hypÚ
train_argsrÅ   Údataset_namesr>   rý   ÚsÚweights_dirrŽ   Úall_fitnessÚdataset_metricsÚjrÆ   ÚdatasetÚ	metrics_iÚlaunchÚcmdÚreturn_codeÚ	ckpt_filer•   rq   r‹   Ústop_after_iterationÚtotal_mongo_iterationsr´   r‚   Úbest_idxÚbest_resultÚcurrent_best_save_dirsÚbest_is_currentÚ
weight_dirÚbest_weights_dirÚckptr	  r“   r”   s-                                                rM   Ú__call__zTuner.__call__¶  sn  € ô �Y‰Y‹[ˆØ�‰×Ñ D°4ÐÔ8Ø	�‰˜Ñ	"×)Ñ)°$ÀÐ)ÔFØˆð �<Š<Ø×&Ñ&Ô(àˆØ�>‰>× Ñ Ô"Ü˜×0Ñ0Ó2Ó3ˆEÜ�K‰K˜4Ÿ;™;˜-Ð';¸D¿M¹M¸?ÐJZÐ[`ÐcdÑ[dÐZeÐehÐiÔjÜ�u˜jÓ)ó x	ˆAä�q˜5‘y #Ó&ˆDØ˜C $™JÑ&ˆGð Ÿ,™,¨W˜,Ó5ˆKÜ�K‰K˜4Ÿ;™;˜-Ð':¸1¸q¹5¸'ÀÀ:À,ÐNeÐfqÐerÐsÔtà;œD §¡›OÐ;¨{Ð;ˆJØ—>‘> &Ó)ˆDÜ˜d¤T¬5 MÔ2Ø�v�Ø ×/Ñ/°Ó5ˆMô �t“9 ’>ô œg jÓ1Ó2Ñ3àO\Ö]Àt”l¤7¨:Ó#6¸TÖBÒ]ð ð
 3;Ö;¨Q˜1˜y›=Ð;ˆKÐ;ØˆGØˆKØ ˆOÜ#,¬S°°}Ó-EÓ#Fó S‘�‘<�A�wØ�	ðgØ)*�J˜vÑ&Ü-0°¸!±Ó-=�J˜zÑ*ô # 5Ó)×4Ñ4ØØ2ð�Fð
 [˜FÐZ GÐZÑ.YÀj×FVÑFVÓFXÔ.YÐZ�CÜ",§.¡.°¸DÔ"A×"LÑ"L�KØ +¨A¡ÀÈAÁÐQZÑ@Z×?bÑ?bÔ?d±)ÐjsÑ t�IÜ *¨9Ó 5°oÑ F�IØ'�GØ&¨!Ò+Ð>Ð->Ó>Ð+ô —J‘J˜q”MÜ—J‘J”LÜ—J‘J×*Ñ*Ô,ð ,5Ò+H¸ÀCÐ8H� Ñ(Ø×"Ñ" ?°7Ñ#;×#?Ñ#?À	Ó#JÒ#QÈcÖRð9Sô: ˜+Ó&¬¨[Ó)9Ñ9ˆGØ×(Ñ(Ø�A‘ØØØÜ36°}ÀhÓ3O×P¡Z W¨a�œ#˜a›&‘ÓPóˆFð $)Ð Ø�|Š|Ø×%Ñ% g¨{¸GÀ_ÐVWÐZ[ÑV[Ô\Ø×*Ñ*Ô,Ø)-¯©×)HÑ)HÈÓ)LÐ&Ø)¨ZÒ7Ø+/Ñ(à×'Ñ'¨Ô/ð ×.Ñ.Ó0ˆGØ×,Ñ,¨WÓ5ˆAØš˜1˜‘gˆGØ—~‘~Ó'ˆHØ! (Ñ+ˆKØ%0§_¡_°[À"Ó%EÐ"Ø&¨!™mˆOÙÙØ+×2Ñ2Ó4ò A˜ØÐ$:×$AÑ$AÓ$CÒCÜ"ŸM™M¨!¸4Ö@ðAô ,/¨}¸kÓ+Jò =Ñ'�G˜Zä58¸³YÀ!²^˜Ÿ™¨	Ò1ÈÏÉÐYbÑIbÐelÑIlð %ð %×*Ñ*°4À$Ð*ÔGØ *§¡°Ó 7ò =˜ÜŸ™ TÐ+;Õ<ñ=ð=ð "8‘ÙØ!ò 9�AÜ—M‘M !°4Ö8ð9à!7�ô œc $§.¡.Ó1Ô2ð —;‘;�-  A¡˜w a¨
 |Ð3MÌdÏiÉiËkÐ\^ÑN^Ð_bÐMcÐcgØ—;‘;�-Ð0´¸&À$Ç-Á-Ó1PÐ0QÐQSØ—;‘;�-˜}¨W°XÑ->Ð,?Ð?VÐW_ÐbcÑWcÐVdÐdfØ—;‘;�-Ð8¸×9KÑ9KÈKÓ9XÐ8YÐY[Ø—;‘;�-Ð5Ü03°K·O±OÀJÐPRÓ4SÓ0TÐXYÒ0Y�4—=‘= 9Ò,ð  `Dð  EðFð ô �K‰K˜˜v™Ô&ÜMPÐQU×Q[ÑQ[×Q`ÑQ`ÓQbÐdeÐfnÐpqÑprÐfrÑdsÓMt×uÁTÀQÈ�A ¤lÑ!2”s˜1”v¼¸a»Ñ@ÐuˆDÑuÜ�I‰IØ—‘Ð ;Ñ;ØÜ& v§~¡~°d·k±kÀ4Ó'HÓIÈDÑPõô
 �J‰J�t—}‘}Ð'BÑBÔCÛ#Ü—‘Ø—{‘{�mÐ#6°z°lÐBXÐYoÐXpÐp|Ð}ôñ ñqx	ùò" ^ùâ;øô6 !ò gÜ—L‘LÐ#XÐYZÐ]^ÑY^ÐX_Ð_aÐbcÐadÐ!e×fÒfûðgüó Qùóf vs1   Æ;\.Ç\3ÈC/\8Í1]-Ù%)]3Ü8	]*Ý]%Ý%]*)rL   údict | None)z4mongodb+srv://username:password@cluster.mongodb.net/rV   )rj   r�   rk   rè   )Ú rC  rC  )r…   )r|   rè   Úreturnrw   )N)r†   rè   rq   r²   r‡   údict[str, float]rˆ   údict[str, dict]r‰   zdict[str, str] | NonerD  Údict)
rq   r²   r‡   rE  rŽ   rG  rˆ   rF  r†   rè   )rD  ú
list[dict])r´   rH  r|   z
int | NonerD  znp.ndarray | None)r‹   rG  )r‹   rG  rD  rB  )rÅ   rw   rD  z	list[str])rû   é	   )r‚   ú
np.ndarrayrÚ   r²   r“   rè   rD  rJ  )rI  g      à?rû   )r|   rè   rî   r²   rï   r²   rD  rE  )é
   T)r#  rè   r$  Úbool)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   rN   ro   rI   r}   Ústaticmethodrƒ   rŒ   r–   r¦   r¬   r·   rº   rÀ   rË   rá   rø   rA  r  rO   rM   r   r   '   sP  „ ñ-ð^ (À4ô 9
ôv&&óPPô*ð ñ:ó ð:ð ,0ðàðð ðð *ð	ð
 "ðð )ðð 
óð&EàðEð *ðEð ð	Eð
 "ðEð óEò>Oó<Dôó"Kð
 òó ðð òó ðð óGó ðGð" ØØð	@àð@ð ð@ð ð	@ð
 
ó@õDSrO   r   )#rP  Ú
__future__r   r  r¡   rÓ   r  r  rh   Úcollectionsr   r   Úpathlibr   Únumpyr¯   r  Úultralytics.cfgr   r   r	   Úultralytics.utilsr
   r   r   r   r   r   Úultralytics.utils.checksr   Úultralytics.utils.patchesr   Úultralytics.utils.plottingr   r   r  rO   rM   ú<module>r[     sQ   ðñõ #ã 	Û Û Û Û Û Ý Ý Ý ã Û ç ?Ñ ?ß ]× ]Ý 7Ý 0Ý 8÷bò brO   