§
    ^ ’j1  ã                  ó  — U d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 ddlmZ dd	lmZ dd
lmZmZmZ ddlmZ  ej        d¦  «        Zddddddd ed¦  «        dœddddddd ed¦  «        dœgZded<    G d„ d ¦  «        ZdS )!é    )ÚannotationsN)ÚDecimal)ÚPath)ÚAny)ÚDrawingTakeoffServiceé   )ÚQSDrillEvaluator)ÚGroundTruthLoader)ÚQSDrillDefinitionÚQSDrillScorecardÚTrainingEpochResult)ÚQSRuleSynthesizerzdscons.takeoff_training.trainerzDRILL-NVH-DAITHANG-2026u=   Sá»­a chá»¯a, cáº£i táº¡o NhÃ  vÄƒn hÃ³a ThÃ´n Ä�áº¡i Tháº¯ngzDA-NVH-DAITHANG-2026uE   HÄ�-2026/NVH Ä�áº¡i Tháº¯ng-2026/TK-DT/NVH - DAI THANG 27-6-26_TD.dxfuK   HÄ�-2026/NVH Ä�áº¡i Tháº¯ng-2026/TK-DT/NVH ThÃ´n Ä�áº¡i Tháº¯ng_TD2_8.7.xlsÚCIVIL_BUILDINGu�   BÃ i táº­p kiá»ƒm chuáº©n bÃ³c tÃ¡ch cÃ´ng trÃ¬nh cáº£i táº¡o dÃ¢n dá»¥ng (phÃ¡ dá»¡, Ä‘á»¥c táº©y, trÃ¡t láº¡i, sÆ¡n, cá»‘t thÃ©p gia cá»‘).z95.0)Údrill_idÚproject_nameÚproject_codeÚdrawing_pathÚground_truth_excel_pathÚdomain_typeÚdescriptionÚtarget_accuracy_pctzDRILL-CONG-HUNGKHANH-2026u=   Ä�Æ°á»�ng tá»« nhÃ  Ã´ng Nam Ä‘áº¿n cá»‘ng chÃ¹a HÆ°ng KhÃ¡nhzDA-DUONG-HUNGKHANH-2026uÁ   HÄ�-2026/PhÃ²ng KT xÃ£ Kiáº¿n Minh-2026/Ä�Æ°á»�ng tá»« nhÃ  Ã´ng Nam Ä‘áº¿n cá»‘ng chÃ¹a HÆ°ng KhÃ¡nh/.com-apple-bird-noname-DC66DAD2-960C-4AB2-903A-CA4285287BAD/Dá»± toÃ¡n/1.BD_DAI DONG_ok.dwgu¸   HÄ�-2026/PhÃ²ng KT xÃ£ Kiáº¿n Minh-2026/Ä�Æ°á»�ng tá»« nhÃ  Ã´ng Nam Ä‘áº¿n cá»‘ng chÃ¹a HÆ°ng KhÃ¡nh/.com-apple-bird-noname-DC66DAD2-960C-4AB2-903A-CA4285287BAD/Dá»± toÃ¡n/Du toan.xlsÚROAD_EARTHWORKuw   BÃ i táº­p kiá»ƒm chuáº©n bÃ³c tÃ¡ch Ä‘Æ°á»�ng giao thÃ´ng, san ná»�n Ä‘áº§m nÃ©n K95 vÃ  mÆ°Æ¡ng rÃ£nh thoÃ¡t nÆ°á»›c.zlist[dict[str, Any]]ÚSTANDARD_DRILLSc                  óP   — e Zd ZdZddd„Zedd	„¦   «         Zdd„Zdd„Z	 ddd„Z	dS )ÚQSTrainerLoopub   Ä�iá»�u phá»‘i vÃ²ng láº·p huáº¥n luyá»‡n tá»± trá»‹ vÃ  kiá»ƒm chuáº©n tay nghá»� cho AI Quá»³nh.NÚtakeoff_serviceúDrawingTakeoffService | NoneÚreturnÚNonec                ó0   — |pt          ¦   «         | _        d S ©N)r   r   )Úselfr   s     úSC:\Projects\DSCons\app\modules\takeoff\application\takeoff_training\trainer_loop.pyÚ__init__zQSTrainerLoop.__init__,   s   € Ø.ÐIÕ2GÑ2IÔ2IˆÔÐÐó    úlist[QSDrillDefinition]c                 ó$   — d„ t           D ¦   «         S )uH   Danh sÃ¡ch cÃ¡c bÃ i táº­p kiá»ƒm chuáº©n thá»±c táº¿ tá»« kho HÄ�-2026.c                ó&   — g | ]}t          d i |¤Ž‘ŒS )© )r   )Ú.0Úds     r#   ú
<listcomp>z-QSTrainerLoop.list_drills.<locals>.<listcomp>2   s'   € Ð@Ð@Ð@¨1Õ!Ð&Ð& AÐ&Ð&Ð@Ð@Ð@r%   )r   r)   r%   r#   Úlist_drillszQSTrainerLoop.list_drills/   s   € ð AÐ@µÐ@Ñ@Ô@Ð@r%   r   ÚstrúQSDrillDefinition | Nonec                ó–   — t           D ]@}|d                              ¦   «         |                     ¦   «         k    rt          di |¤Žc S ŒAd S )Nr   r)   )r   Úupperr   )r"   r   r+   s      r#   Ú	get_drillzQSTrainerLoop.get_drill4   sZ   € Ý ð 	.ð 	.ˆAØ�Œ}×"Ò"Ñ$Ô$¨¯ªÑ(8Ô(8Ò8Ð8Ý(Ð-Ð-¨1Ð-Ð-Ð-Ð-Ð-ð 9àˆtr%   r   c                óì  — |                       |¦  «        }|st          d|› �¦  «        ‚t          d¦  «        }||j        z  }||j        z  }t          j        |¦  «        }g }|                     ¦   «         rq	 | j         	                    ||j
        |j        ¬¦  «        }|                     dg ¦  «        }n2# t          $ r%}	t                               d|	¦  «         Y d}	~	nd}	~	ww xY w|sb|r`|dd…         D ]U}
|                     |
j        |
j        |
j        t)          |
j        ¦  «        |
j        pd|
j        › d	|
j        › �d
œ¦  «         ŒVt/          j        |j        |j        |j
        ||¬¦  «        }|S )ui   Cháº¡y má»™t bÃ i kiá»ƒm chuáº©n: Ä‘á»�c báº£n váº½, bÃ³c tÃ¡ch vÃ  cháº¥m Ä‘iá»ƒm so vá»›i Ground Truth.u)   KhÃ´ng tÃ¬m tháº¥y bÃ i táº­p vá»›i mÃ£: zC:/Projects/DSCons)Ú	file_pathÚ
project_idr   Úitemsz&[TRAINER] Takeoff processing error: %sNé   u   DÃ i x Rá»™ng x Cao = ú )Ú	task_nameÚ	norm_codeÚunitÚquantityÚformula_breakdown)r   r   r   Úground_truth_itemsÚai_takeoff_items)r2   Ú
ValueErrorr   r   r   r
   Úload_ground_truth_from_excelÚexistsr   Úprocess_drawing_filer   r   ÚgetÚ	ExceptionÚloggerÚwarningÚappendr9   r:   r;   Úfloatr<   r=   r	   Úevaluate_takeoffr   )r"   r   ÚdrillÚroot_dirÚgt_pathÚdwg_pathÚgt_itemsÚai_itemsÚresÚexcÚitemÚ	scorecards               r#   Úexecute_drillzQSTrainerLoop.execute_drill:   sÜ  € à—’˜xÑ(Ô(ˆØð 	UÝÐSÈÐSÐSÑTÔTÐTåÐ,Ñ-Ô-ˆØ˜UÔ:Ñ:ˆØ˜eÔ0Ñ0ˆõ %ÔAÀ'ÑJÔJˆð *,ˆØ�?Š?ÑÔð 		NðNØÔ*×?Ò?Ø&Ø$Ô1Ø!&Ô!3ð @ñ ô �ð
 Ÿ7š7 7¨BÑ/Ô/��øÝð Nð Nð NÝ—’ÐGÈÑMÔMÐMÐMÐMÐMÐMÐMøøøøðNøøøð ð 	˜Hð 	Ø   " œð 
ð 
�Ø—’à%)¤^Ø%)¤^Ø $¤	Ý$)¨$¬-Ñ$8Ô$8Ø-1Ô-Cð .PØO°D´MÐOÐOÀDÄIÐOÐOðð ñ	ô 	ð 	ð 	õ %Ô5Ø”^ØÔ+ØÔ+Ø'Ø%ð
ñ 
ô 
ˆ	ð Ðs   Á8=B6 Â6
C%Ã C Ã C%é   Ú
max_epochsÚintúlist[TrainingEpochResult]c                ój  — g }t          d|dz   ¦  «        D ]œ}|                      |¦  «        }t          j        |¦  «        }t	          ||||d|› d|j        › d|j        › dt          |¦  «        › d�	¬¦  «        }|                     |¦  «         |j	        rt                               d|¦  «          nŒ�|S )	up   VÃ²ng láº·p tá»± há»�c Ä‘a chu ká»³: BÃ³c tÃ¡ch -> Cháº¥m Ä‘iá»ƒm -> RÃºt bÃ i há»�c Rule -> TÃ¡i luyá»‡n táº­p.r   zEpoch u   : Ä�á»™ chÃ­nh xÃ¡c MAE=u   %, Tá»· lá»‡ cÃ´ng thá»©c=u   %, Ä�Ã£ sinh u    quy táº¯c há»�c má»›i.)Úepochr   rT   Úsynthesized_rulesÚimprovement_notesz/[TRAINER] Target accuracy achieved in epoch %s!)ÚrangerU   r   Úsynthesize_and_save_rulesr   Úvolume_mae_pctÚformula_coverage_pctÚlenrH   Úis_production_readyrF   Úinfo)r"   r   rW   Úresultsr[   rT   r\   Ú	epoch_ress           r#   Úrun_autonomous_training_loopz*QSTrainerLoop.run_autonomous_training_loopm   s  € ð .0ˆå˜1˜j¨1™nÑ-Ô-ð 	ð 	ˆEØ×*Ò*¨8Ñ4Ô4ˆIÝ 1Ô KÈIÑ VÔ VÐå+ØØ!Ø#Ø"3ð #[¨5ð  #[ð  #[È)ÔJbð  #[ð  #[ð  Hô  ]ð  #[ð  #[õ  loð  pAñ  lBô  lBð  #[ð  #[ð  #[ðñ ô ˆIð �NŠN˜9Ñ%Ô%Ð%àÔ,ð Ý—’ÐMÈuÑUÔUÐUØ�ðð ˆr%   r!   )r   r   r   r   )r   r&   )r   r.   r   r/   )r   r.   r   r   )rV   )r   r.   rW   rX   r   rY   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   Ústaticmethodr-   r2   rU   rg   r)   r%   r#   r   r   )   s£   € € € € € ØlÐlðJð Jð Jð Jð Jð ðAð Að Añ „\ðAðð ð ð ð1ð 1ð 1ð 1ðl ðð ð ð ð ð ð r%   r   )Ú
__future__r   ÚloggingÚdecimalr   Úpathlibr   Útypingr   Ú7app.modules.takeoff.application.drawing_takeoff_servicer   Údrill_evaluatorr	   Úground_truth_loaderr
   Úmodelsr   r   r   Úrule_synthesizerr   Ú	getLoggerrF   r   Ú__annotations__r   r)   r%   r#   ú<module>ry      s�  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à YÐ YÐ YÐ YÐ YÐ Yà -Ð -Ð -Ð -Ð -Ð -Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ /Ð /Ð /Ð /Ð /Ð /à	ˆÔ	Ð<Ñ	=Ô	=€ð .ØWØ.Ø_Ø#pØ'ð gØ&˜w v™œð	ð 	ð 0ØWØ1ð \ð $^Ø'ð QØ&˜w v™œð	ð 	ð)€ð ð ð ñ ð0]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]r%   