§
    ÔŸ’jK  ã                  óˆ   — d dl mZ d dlZd dlZd dlmZ d dlmZ ddlm	Z	m
Z
mZ  ej        d¦  «        Z G d„ d	¦  «        ZdS )
é    )ÚannotationsN)ÚDecimal)ÚAnyé   )ÚGroundTruthRowÚQSDrillScorecardÚTakeoffItemEvaluationz!dscons.takeoff_training.evaluatorc                  ó*   — e Zd ZdZedd„¦   «         ZdS )ÚQSDrillEvaluatoruR   Bá»™ cháº¥m Ä‘iá»ƒm vÃ  Ä‘Ã¡nh giÃ¡ sai sá»‘ bÃ³c tÃ¡ch BoQ so vá»›i Ground Truth.Údrill_idÚstrÚproject_nameÚproject_codeÚground_truth_itemsúlist[GroundTruthRow]Úai_takeoff_itemsúlist[dict[str, Any]]Úreturnr   c                ó¼
  — |st          |||dd¬¦  «        S g }d}t          d¦  «        }d}	t          ¦   «         }
|D �]Q}d}d}t          |¦  «        D �]"\  }}||
v rŒt	          |                     d¦  «        p|                     d	¦  «        pd
¦  «                             ¦   «         }|j                             ¦   «         }t          j	        d||¦  «         
                    ¦   «         }t	          |                     d¦  «        p|                     d¦  «        pd
¦  «        }|j        rA|r?|j                             ¦   «         |                     ¦   «         k    rt          |d¦  «        }||k    r|}|}�Œ$|dk    �r·|dk    �r°|
                     |¦  «         ||         }t          t	          |                     d¦  «        p|                     d¦  «        pd¦  «        ¦  «        }|j        }|t          d¦  «        k    r(t!          ||z
  ¦  «        }||z  t          d¦  «        z  }n1|t          d¦  «        k    rt          d¦  «        nt          d¦  «        }t#          |                     d¦  «        p|                     d¦  «        ¦  «        }|r|	dz  }	|t          d¦  «        k    rd}d}n|t          d¦  «        k    rd}d}nd}d}|dz  }||z  }|                     t'          |j        |j        |j        ||t+          |d¦  «        ||                     d¦  «        ||¬¦
  «
        ¦  «         �Œø|                     t'          |j        |j        |j        |j        t          d¦  «        t          d¦  «        ddd ¬!¦	  «	        ¦  «         �ŒSt-          |¦  «        }t          t-          |¦  «        d¦  «        }t          t	          t+          ||z  d"z  d¦  «        ¦  «        ¦  «        }t          t	          t+          ||z  d"z  d¦  «        ¦  «        ¦  «        }t          t	          t+          t/          |t          |d¦  «        z  ¦  «        d¦  «        ¦  «        ¦  «        } t          t	          t+          |	|z  d"z  d¦  «        ¦  «        ¦  «        }!|t          d#¦  «        k    r+| t          d¦  «        k    r|!t          d$¦  «        k    rd%}"d&}#nr|t          d$¦  «        k    r| t          d'¦  «        k    rd(}"d&}#nG|t          d)¦  «        k    r| t          d*¦  «        k    rd+}"d}#n|t          d,¦  «        k    rd-}"d}#nd}"d}#t          |||||||| |!|"|#|¬.¦  «        S )/uY   So sÃ¡nh tá»«ng dÃ²ng bÃ³c tÃ¡ch cá»§a AI vá»›i báº£ng dá»± toÃ¡n Ä‘á»‘i chá»©ng chuáº©n.ÚFF)r   r   r   Úoverall_gradeÚis_production_readyr   z0.0éÿÿÿÿg        Ú	task_nameÚ	item_nameÚ NÚ	norm_codeÚcodegffffffî?gš™™™™™á?ÚquantityÚqtyz100.0Úformula_breakdownÚdiendan_congthucr   z3.0ÚEXACT_MATCHz10.0ÚMINOR_DEVIATIONu6   Lá»‡ch lÃ m trÃ²n hoáº·c trá»« giao cáº¥u kiá»‡n nhá»�ÚMAJOR_DEVIATIONuH   Sai lá»‡ch kÃ­ch thÆ°á»›c hÃ¬nh há»�c hoáº·c chÆ°a trá»« cá»�c/lá»— má»Ÿé   )
r   r   ÚunitÚexpected_quantityÚactual_quantityÚdeviation_pctÚformula_presentr!   Úmatch_statusÚerror_causeÚMISSEDu8   Bá»� sÃ³t Ä‘áº§u viá»‡c so vá»›i báº£n váº½ thiáº¿t káº¿)	r   r   r'   r(   r)   r*   r+   r,   r-   éd   z95.0z85.0ÚSTz6.0ÚAz75.0z12.0ÚBz60.0ÚC)r   r   r   Útotal_ground_truth_itemsÚmatched_itemsÚrecall_rate_pctÚprecision_rate_pctÚvolume_mae_pctÚformula_coverage_pctr   r   Úevaluated_items)r   r   ÚsetÚ	enumerater   ÚgetÚlowerr   ÚdifflibÚSequenceMatcherÚratior   ÚupperÚmaxÚaddr   ÚabsÚboolÚappendr	   r'   ÚroundÚlenÚfloat)$Úclsr   r   r   r   r   Úevaluated_listÚmatched_countÚ	total_maeÚformulas_countÚused_ai_indicesÚgtÚbest_match_idxÚbest_similarityÚidxÚai_itemÚai_nameÚgt_nameÚsimÚai_codeÚai_matchÚ
actual_qtyÚexpected_qtyÚdiffÚdev_pctÚ	f_presentÚstatusÚcauseÚtotal_gtÚtotal_aiÚrecallÚ	precisionÚavg_maeÚformula_covÚgradeÚis_readys$                                       úVC:\Projects\DSCons\app\modules\takeoff\application\takeoff_training\drill_evaluator.pyÚevaluate_takeoffz!QSDrillEvaluator.evaluate_takeoff   sÃ  € ð "ð 	Ý#Ø!Ø)Ø)Ø!Ø$)ðñ ô ð ð 79ˆØˆÝ˜E‘N”Nˆ	Øˆõ ™%œ%ˆà$ð Z	ñ Z	ˆBØˆNØ!ˆOå )Ð*:Ñ ;Ô ;ð )ñ )‘��WØ˜/Ð)Ð)ØåØ—K’K Ñ,Ô,ÐN°·²¸KÑ0HÔ0HÐNÈBñô ç’%‘'”'ð ð œ,×,Ò,Ñ.Ô.�õ Ô-¨d°G¸WÑEÔE×KÒKÑMÔM�õ ˜gŸkšk¨+Ñ6Ô6ÐS¸'¿+º+ÀfÑ:MÔ:MÐSÐQSÑTÔT�Ø”<ð ) Gð )°´×0BÒ0BÑ0DÔ0DÈÏÊÉÌÒ0WÐ0WÝ˜c 4™.œ.�Cà˜Ò(Ð(Ø&)�OØ%(�Nùà Ò"Ñ" ¸$Ò'>Ñ'>Ø×#Ò# NÑ3Ô3Ð3Ø+¨NÔ;�Ý$Ý˜Ÿš ZÑ0Ô0ÐL°H·L²LÀÑ4GÔ4GÐLÈ1ÑMÔMñô �
ð  "œ{�à¥'¨%¡.¤.Ò0Ð0Ý˜z¨LÑ8Ñ9Ô9�DØ# lÑ2µg¸gÑ6FÔ6FÑF�G�Gð &­°©¬Ò7Ð7õ   ™œ˜å$ WÑ-Ô-ð õ !Ø—L’LÐ!4Ñ5Ô5ð 8Ø—|’|Ð$6Ñ7Ô7ñô �	ð ð (Ø" aÑ'�Nà�g e™nœnÒ,Ð,Ø*�FØ �E�EØ¥¨¡¤Ò/Ð/Ø.�FØT�E�Eà.�FØf�Eà Ñ"�Ø˜WÑ$�	à×%Ò%Ý)Ø"$¤,Ø"$¤,ØœWØ*6Ø(2Ý&+¨G°QÑ&7Ô&7Ø(1Ø*2¯,ª,Ð7JÑ*KÔ*KØ%+Ø$)ðñ ô ñô ð ñ ð ×%Ò%Ý)Ø"$¤,Ø"$¤,ØœWØ*,¬+Ý(/°©¬Ý&-¨gÑ&6Ô&6Ø(-Ø%-Ø$^ð
ñ 
ô 
ñô ð ñ õ Ð)Ñ*Ô*ˆÝ•sÐ+Ñ,Ô,¨aÑ0Ô0ˆÝ��U M°HÑ$<ÀÑ#CÀQÑGÔGÑHÔHÑIÔIˆÝ�C¥ }°xÑ'?À3Ñ&FÈÑ JÔ JÑKÔKÑLÔLˆ	Ý�#�e¥E¨)µc¸-ÈÑ6KÔ6KÑ*KÑ$LÔ$LÈaÑPÔPÑQÔQÑRÔRˆÝ�c¥%¨¸(Ñ)BÀcÑ(IÈ1Ñ"MÔ"MÑNÔNÑOÔOˆð •g˜f‘o”oÒ%Ð%Ø�7 5™>œ>Ò)Ð)Ø�w v™œÒ.Ð.àˆEØˆHˆHØ•w˜v‘”Ò&Ð&¨7µg¸e±n´nÒ+DÐ+DØˆEØˆHˆHØ•w˜v‘”Ò&Ð&¨7µg¸f±o´oÒ+EÐ+EØˆEØˆHˆHØ•w˜v‘”Ò&Ð&ØˆEØˆHˆHàˆEØˆHåØØ%Ø%Ø%-Ø'Ø"Ø(Ø"Ø!,ØØ (Ø*ð
ñ 
ô 
ð 	
ó    N)r   r   r   r   r   r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodrk   © rl   rj   r   r      s>   € € € € € Ø\Ð\àð_
ð _
ð _
ñ „[ð_
ð _
ð _
rl   r   )Ú
__future__r   r?   ÚloggingÚdecimalr   Útypingr   Úmodelsr   r   r	   Ú	getLoggerÚloggerr   rr   rl   rj   ú<module>rz      sº   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ Kà	ˆÔ	Ð>Ñ	?Ô	?€ðc
ð c
ð c
ð c
ð c
ñ c
ô c
ð c
ð c
ð c
rl   