§
    Aj®jEQ  ã                  ól  — d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
Z
ddlmZmZmZmZmZmZmZmZ ddlZ	 ddlmZ n# e$ r dZY nw xY wdd	lmZmZmZmZmZmZm Z   G d
„ de	¦  «        Z!e G d„ d¦  «        ¦   «         Z"e G d„ d¦  «        ¦   «         Z#dZ$ G d„ d¦  «        Z% G d„ d¦  «        Z&dS )u  AutoPOE2 - Minimap Fog of War & Frontier Grid Exploration Engine (Doc 69 Â§3.4).
===================================================================================
Module nháº­n diá»‡n sÆ°Æ¡ng mÃ¹ Minimap vÃ  Ä‘á»‹nh tuyáº¿n thÃ¡m hiá»ƒm biÃªn má»Ÿ rá»™ng:
- PhÃ¢n tÃ­ch áº£nh Minimap / lÆ°á»›i Ä‘á»‹a hÃ¬nh Ä‘á»ƒ trÃ­ch xuáº¥t vÃ¹ng chÆ°a má»Ÿ (Fog of War).
- XÃ¡c Ä‘á»‹nh vÃ  phÃ¢n cá»¥m cÃ¡c mÃ©p biÃªn thÃ¡m hiá»ƒm (Frontier Clusters).
- Ä�á»‹nh tuyáº¿n má»¥c tiÃªu khÃ¡m phÃ¡ tá»‘i Æ°u qua hÃ m tiá»‡n Ã­ch tá»•ng há»£p (Information Gain,
  Distance, Visit Heatmap Penalty, vÃ  QuÃ¡n tÃ­nh di chuyá»ƒn Frontier Momentum).
- Cáº¯t tá»‰a triá»‡t Ä‘á»ƒ ngÃµ cá»¥t Ä‘Ã£ dá»�n sáº¡ch (Dead-End Topological Pruning) Ä‘á»ƒ chá»‘ng backtrack.
- Tá»± Ä‘á»™ng Ä‘Ã¡nh giÃ¡ tiÃªu chÃ­ hoÃ n thÃ nh dá»�n Map (Coverage >= 95% monsters/tiles).
- TÆ°Æ¡ng thÃ­ch toÃ n diá»‡n vá»›i Dynamic Resolution Scaler (Windowed 1189x891 PID 22632,
  1440p QHD, 1080p SSoT, 720p).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Python 3.11 Cold Path Tier 2.
- Rule 4: Module hÃ³a Ä‘á»™c láº­p táº¡i src/assistant_tool/navigation/.
- Rule 5: 100% artifact tháº­t tá»« captures/.
- Rule 16: Google Docstrings chuáº©n má»±c.
- Báº¥t biáº¿n: INV-NAV-FRONTIER-MOMENTUM, INV-SCALE-IDEMPOTENT-1PX, INV-WASD-NO-BLIND-LMB.
é    )Úannotations)Údeque)Ú	dataclassÚfield)ÚIntEnumN)ÚAnyÚDictÚListÚOptionalÚSequenceÚSetÚTupleÚUnion)ÚImage)ÚCoordinateScalerÚ
ResolutionÚScalingModeÚ	RES_1080PÚ	RES_1440PÚRES_WINDOWED_DEFAULTÚresolve_resolutionc                  ó&   — e Zd ZdZdZdZdZdZdZdS )ÚFogCellStateu?   Tráº¡ng thÃ¡i táº¿ bÃ o trÃªn lÆ°á»›i thÃ¡m hiá»ƒm sÆ°Æ¡ng mÃ¹.r   é   é   é   é   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
UNEXPLOREDÚEXPLOREDÚWALL_OBSTACLEÚFRONTIERÚDEAD_END© ó    úJC:\Projects\AutoPOE2\src\assistant_tool\navigation\minimap_fog_explorer.pyr   r   /   s-   € € € € € ØIÐIØ€JØ€HØ€MØ€HØ€H€H€Hr(   r   c                  óX   — e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   d	Zd
ed<   dS )ÚFrontierClusteruJ   Cá»¥m cÃ¡c Ä‘iá»ƒm biÃªn giá»›i tiáº¿p giÃ¡p sÆ°Æ¡ng mÃ¹ chÆ°a khÃ¡m phÃ¡.ÚintÚ
cluster_idúList[Tuple[int, int]]ÚcellsúTuple[float, float]Úcenter_gridÚsizeç        ÚfloatÚinformation_gainÚavg_visit_countN)r   r   r    r!   Ú__annotations__r5   r6   r'   r(   r)   r+   r+   8   se   € € € € € € àTÐTØ€O€O�OØ Ð Ð Ñ Ø$Ð$Ð$Ñ$Ø€I€I�IØ!ÐÐ!Ð!Ð!Ñ!Ø €OÐ Ð Ð Ñ Ð Ð r(   r+   c                  ón   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   dS )ÚExplorationTargetu9   Má»¥c tiÃªu thÃ¡m hiá»ƒm Ä‘Æ°á»£c lá»±a chá»�n tá»‘i Æ°u.zTuple[int, int]Útarget_grid_xyÚtarget_minimap_xyÚtarget_screen_xyr0   Údirection_vectorr4   Úutility_scoreÚcoverage_ratioÚboolÚis_fully_exploredr,   Úactive_clusters_countÚdead_ends_pruned_countN)r   r   r    r!   r7   r'   r(   r)   r9   r9   C   s„   € € € € € € àCÐCØ#Ð#Ð#Ñ#Ø&Ð&Ð&Ñ&Ø%Ð%Ð%Ñ%Ø)Ð)Ð)Ñ)ØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr(   r9   )g     Ð–@g      4@g     °�@g     €v@c                  óZ   — e Zd ZdZ	 	 	 	 d d!d„Zd"d„Zd#d$d„Zd%d„Zd&d„Z	 d'd(d„Z	d)d„Z
dS )*ÚExplorationGridui   LÆ°á»›i táº¿ bÃ o quáº£n trá»‹ tráº¡ng thÃ¡i sÆ°Æ¡ng mÃ¹, báº£n Ä‘á»“ nhiá»‡t vÃ  cáº¯t tá»‰a ngÃµ cá»¥t.é@   ç      .@ç     €f@Ú
grid_widthr,   Úgrid_heightÚdark_thresholdr4   Úwall_thresholdÚreturnÚNonec                óp  — || _         || _        || _        || _        t	          j        | j        | j         ft          j        t          j        ¬¦  «        | _	        t	          j
        | j        | j         ft          j        ¬¦  «        | _        t	          j
        | j        | j         ft          ¬¦  «        | _        dS )u‹  Khá»Ÿi táº¡o lÆ°á»›i thÃ¡m hiá»ƒm.

        Args:
            grid_width: Sá»‘ cá»™t cá»§a lÆ°á»›i táº¿ bÃ o.
            grid_height: Sá»‘ hÃ ng cá»§a lÆ°á»›i táº¿ bÃ o.
            dark_threshold: NgÆ°á»¡ng Ä‘á»™ sÃ¡ng tá»‘i Ä‘a Ä‘á»ƒ phÃ¢n loáº¡i lÃ  sÆ°Æ¡ng mÃ¹ chÆ°a má»Ÿ.
            wall_threshold: NgÆ°á»¡ng Ä‘á»™ sÃ¡ng tá»‘i thiá»ƒu Ä‘á»ƒ phÃ¢n loáº¡i lÃ  tÆ°á»�ng/váº­t cáº£n.
        ©ÚdtypeN)ÚgwÚghrK   rL   ÚnpÚfullr   r"   Úuint8r/   ÚzerosÚuint16Úvisit_countsr@   Ú	dead_ends)ÚselfrI   rJ   rK   rL   s        r)   Ú__init__zExplorationGrid.__init__Y   s�   € ð ˆŒØˆŒØ,ˆÔØ,ˆÔå”W˜dœg t¤wÐ/µÔ1HÕPRÔPXÐYÑYÔYˆŒ
ÝœH d¤g¨t¬wÐ%7½r¼yÐIÑIÔIˆÔÝœ 4¤7¨D¬GÐ"4½DÐAÑAÔAˆŒˆˆr(   Ú	img_inputúUnion[np.ndarray, Image.Image]c                ó0  — t          |t          j        ¦  «        rt          j        |¦  «        }n|}|j        dd…         \  }}|j        dk    r#|ddd…f         }t          j        |d¬¦  «        }n|                     t          ¦  «        }t          ��Wt          |t          j        ¦  «        rt          j        |¦  «        }n|}|j        dk    r>t          j        |ddd…f         d¬¦  «                             t          j	        ¦  «        }n|                     t          j	        ¦  «        }t          j
        |¦  «                             | j        | j        ft          j        j        ¦  «        }t          j        |t          j        ¬¦  «        }|| j        k     }	|| j        k    }
|	 |
 z  }t(          j        | j        |	<   t(          j        | j        |
<   t(          j        | j        |<   dS t3          d|| j        z  ¦  «        }t3          d|| j        z  ¦  «        }t5          | j        ¦  «        D ]æ}||z  }t7          ||dz   |z  ¦  «        }||k    rŒ$t5          | j        ¦  «        D ]­}||z  }t7          ||dz   |z  ¦  «        }||k    rŒ$|||…||…f         }t          t          j        |¦  «        ¦  «        }|| j        k     rt(          j        | j        ||f<   Œu|| j        k    rt(          j        | j        ||f<   Œ—t(          j        | j        ||f<   Œ®ŒçdS )uV   PhÃ¢n tÃ­ch áº£nh Minimap vÃ  cáº­p nháº­t tráº¡ng thÃ¡i cÃ¡c táº¿ bÃ o trÃªn lÆ°á»›i.Nr   r   .)ÚaxisrP   r   )Ú
isinstancer   rT   ÚarrayÚshapeÚndimÚmeanÚastyper4   rV   Ú	fromarrayÚresizerR   rS   Ú
ResamplingÚBOXÚasarrayÚfloat32rK   rL   r   r"   r/   r$   r#   ÚmaxÚrangeÚmin)r[   r]   ÚarrÚihÚiwÚrgbÚgrayÚpil_grayÚ	gray_gridÚunexplored_maskÚ	wall_maskÚexplored_maskÚblock_hÚblock_wÚgyÚy_startÚy_endÚgxÚx_startÚx_endÚpatchÚmean_brightnesss                         r)   Úload_from_minimap_imagez'ExplorationGrid.load_from_minimap_imageq   sø  € õ
 �i¥¤Ñ-Ô-ð 	Ý”(˜9Ñ%Ô%ˆCˆCàˆCà”˜2˜A˜2”‰ˆˆBØŒ8�qŠ=ˆ=Ø�c˜2˜A˜2�g”,ˆCÝ”7˜3 QÐ'Ñ'Ô'ˆDˆDà—:’:�eÑ$Ô$ˆDõ ÑÝ˜)¥U¤[Ñ1Ô1ð  Ý”h˜yÑ)Ô)��à�àŒx˜1Š}ˆ}Ý”w˜s 3¨¨¨ 7œ|°!Ð4Ñ4Ô4×;Ò;½B¼HÑEÔE��à—z’z¥"¤(Ñ+Ô+�å” tÑ,Ô,×3Ò3°T´W¸d¼gÐ4FÍÔHXÔH\Ñ]Ô]ˆHÝœ
 8µ2´:Ð>Ñ>Ô>ˆIà'¨$Ô*=Ò=ˆOØ! DÔ$7Ò7ˆIØ-Ð-°9°*Ñ=ˆMå*6Ô*AˆDŒJ�Ñ'Ý$0Ô$>ˆDŒJ�yÑ!Ý(4Ô(=ˆDŒJ�}Ñ%ØˆFõ �a˜˜tœw™Ñ'Ô'ˆÝ�a˜˜tœw™Ñ'Ô'ˆå˜œ‘.”.ð 	?ð 	?ˆBØ˜7‘lˆGÝ˜˜R !™V wÑ.Ñ/Ô/ˆEØ˜%ÒÐØå˜DœG‘n”nð ?ð ?�Ø˜w™,�Ý˜B  a¡¨7Ñ 2Ñ3Ô3�Ø˜eÒ#Ð#Øà˜W U˜]¨G°E¨MÐ9Ô:�Ý"'­¬°©¬Ñ"7Ô"7�ð # TÔ%8Ò8Ð8Ý)5Ô)@�D”J˜r 2˜vÑ&Ð&Ø$ tÔ':Ò:Ð:Ý)5Ô)C�D”J˜r 2˜vÑ&Ð&å)5Ô)>�D”J˜r 2˜vÑ&Ð&ð?ð	?ð 	?r(   r   r   r|   Úradiusc           	     ó´  — t          t          d||z
  ¦  «        t          | j        ||z   dz   ¦  «        ¦  «        D ]œ}t          t          d||z
  ¦  «        t          | j        ||z   dz   ¦  «        ¦  «        D ]_}t          d| j        ||f         dz   ¦  «        | j        ||f<   | j        ||f         t          j        k    rt          j	        | j        ||f<   Œ`Œ�dS )u8   Ghi nháº­n váº¿t bÆ°á»›c chÃ¢n vÃ o báº£n Ä‘á»“ nhiá»‡t.r   r   iÿÿ  N)
rn   rm   ro   rS   rR   rY   r/   r   r"   r#   )r[   r   r|   r…   ÚyÚxs         r)   Úrecord_visitzExplorationGrid.record_visitµ   sà   € å•s˜1˜b 6™kÑ*Ô*­C°´¸¸f¹Àq¹Ñ,IÔ,IÑJÔJð 	=ð 	=ˆAÝ�3˜q " v¡+Ñ.Ô.µ°D´G¸RÀ&¹[È1¹_Ñ0MÔ0MÑNÔNð =ð =�Ý*-¨e°TÔ5FÀqÈ!ÀtÔ5LÈqÑ5PÑ*QÔ*Q�Ô! ! Q $Ñ'Ø”:˜a ˜dÔ#¥|Ô'>Ò>Ð>Ý'3Ô'<�D”J˜q !˜tÑ$øð=ð	=ð 	=r(   c                óÜ   — t          j        | j        t          j        k    ¦  «        }t          j        | j        t          j        k    ¦  «        }||z   }|dk    rdS t          ||z  ¦  «        S )uR   TÃ­nh toÃ¡n tá»· lá»‡ Ä‘Ã£ khÃ¡m phÃ¡ trÃªn tá»•ng sá»‘ Ã´ cÃ³ thá»ƒ Ä‘i Ä‘Æ°á»£c.r   ç      ð?)rT   Úsumr/   r   r#   r"   r4   )r[   ÚexploredÚ
unexploredÚtotal_traversables       r)   Úget_coverage_ratioz"ExplorationGrid.get_coverage_ratio½   sc   € å”6˜$œ*­Ô(=Ò=Ñ>Ô>ˆÝ”V˜DœJ­,Ô*AÒAÑBÔBˆ
Ø$ zÑ1ÐØ Ò!Ð!Ø�3Ý�XÐ 1Ñ1Ñ2Ô2Ð2r(   r.   c                ó|  — | j         t          j        k    }t          j        | j        | j        ft          ¬¦  «        }|dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   | j         t          j        k    | j	         z  |z  }t          j
        |¦  «        \  }}t          t          |                     ¦   «         |                     ¦   «         ¦  «        ¦  «        S )uO   XÃ¡c Ä‘á»‹nh danh sÃ¡ch cÃ¡c Ã´ Frontier (Ã´ explored tiáº¿p giÃ¡p unexplored).rP   r   Néÿÿÿÿ)r/   r   r"   rT   rW   rS   rR   r@   r#   rZ   ÚwhereÚlistÚzipÚtolist)r[   Úis_unexpÚ	has_unexpÚis_frontierÚysÚxss         r)   Úextract_frontier_cellsz&ExplorationGrid.extract_frontier_cellsÆ   si  € à”J¥,Ô"9Ò9ˆÝ”H˜dœg t¤wÐ/µtÐ<Ñ<Ô<ˆ	Ø�!�"�"�a�a�a�%ÐÐÔ˜H S b S¨!¨!¨! VÔ,Ñ,ÐÐÑØ�#�2�#�q�q�q�&ÐÐÔ˜X a b b¨!¨!¨! eœ_Ñ,ÐÐÑØ�!�!�!�Q�R�R�%ÐÐÔ˜H Q Q Q¨¨¨ VÔ,Ñ,ÐÐÑØ�!�!�!�S�b�S�&ÐÐÔ˜X a a a¨¨¨ eœ_Ñ,ÐÐÑà”z¥\Ô%:Ò:ÀÄ¸ÑOÐR[Ñ[ˆÝ”˜+Ñ&Ô&‰ˆˆBÝ•C˜Ÿ	š	™œ R§Y¢Y¡[¤[Ñ1Ô1Ñ2Ô2Ð2r(   ç      @Úfrontier_cellsÚmax_distúList[FrontierCluster]c                ó  ‡ — |sg S t          |¦  «        }t          ¦   «         }g }d}|D �]V}||v rŒg }t          |g¦  «        }	|                     |¦  «         |	rƒ|	                     ¦   «         \  }
}|                     |
|f¦  «         dD ]P}dD ]K}|dk    r|dk    rŒ|
|z   ||z   f}||v r.||vr*|                     |¦  «         |	                     |¦  «         ŒLŒQ|	°ƒt          d„ |D ¦   «         ¦  «        t          t          |¦  «        ¦  «        z  }t          d„ |D ¦   «         ¦  «        t          t          |¦  «        ¦  «        z  }d}t          ¦   «         }|D ]v\  }
}t          dd¦  «        D ]`}t          dd¦  «        D ]M}|
|z   ||z   }}d|cxk    r‰ j	        k     r/n Œ!d|cxk    r‰ j
        k     rn Œ6|                     ||f¦  «         ŒNŒaŒw|D ]'\  }}‰ j        ||f         t          j        k    r|dz  }Œ(t          ˆ fd„|D ¦   «         ¦  «        }|t          t          |¦  «        ¦  «        z  }|                     t          ||||ft          |¦  «        t          |¦  «        |¬	¦  «        ¦  «         |dz  }�ŒX|S )
uN   Gom nhÃ³m cÃ¡c Ã´ Frontier ká»� nhau thÃ nh cÃ¡c cá»¥m (Connected Components).r   )r’   r   r   c              3  ó&   K  — | ]}|d          V — ŒdS )r   Nr'   ©Ú.0Úcs     r)   ú	<genexpr>z4ExplorationGrid.cluster_frontiers.<locals>.<genexpr>ø   ó&   è è € Ð<Ð< ˜˜!œÐ<Ð<Ð<Ð<Ð<Ð<r(   c              3  ó&   K  — | ]}|d          V — ŒdS )r   Nr'   r£   s     r)   r¦   z4ExplorationGrid.cluster_frontiers.<locals>.<genexpr>ù   r§   r(   éþÿÿÿr   r   c              3  óN   •K  — | ]}‰j         |d          |d         f         V — Œ dS )r   r   N)rY   )r¤   r¥   r[   s     €r)   r¦   z4ExplorationGrid.cluster_frontiers.<locals>.<genexpr>
  s7   øè è € Ð\Ð\À˜tÔ0°°1´°q¸´t°Ô<Ð\Ð\Ð\Ð\Ð\Ð\r(   )r-   r/   r1   r2   r5   r6   )Úsetr   ÚaddÚpopleftÚappendrŒ   r4   Úlenrn   rR   rS   r/   r   r"   r+   )r[   rž   rŸ   Úcell_setÚvisitedÚclustersr-   Ú
start_cellÚcurrent_cluster_cellsÚqueueÚcxÚcyÚdyÚdxÚnbrÚavg_xÚavg_yÚunexplored_countÚneighbor_boxesÚnxÚnyÚtotal_visitsÚavg_heats   `                      r)   Úcluster_frontiersz!ExplorationGrid.cluster_frontiersÓ   sE  ø€ ð ð 	ØˆIå�~Ñ&Ô&ˆÝ(+©¬ˆØ*,ˆØˆ
à(ð 6	ñ 6	ˆJØ˜WÐ$Ð$Øà;=Ð!Ý˜:˜,Ñ'Ô'ˆEØ�KŠK˜
Ñ#Ô#Ð#àð .ØŸš™œ‘��BØ%×,Ò,¨b°"¨XÑ6Ô6Ð6ð %ð .ð .�BØ(ð .ð .˜Ø š7˜7 r¨Q¢w wØ$Ø! B™w¨¨R©Ð0˜Ø (˜?˜?¨s¸'Ð/AÐ/AØ#ŸKšK¨Ñ,Ô,Ð,Ø!ŸLšL¨Ñ-Ô-Ð-øð.ð ð .õ Ð<Ð<Ð&;Ð<Ñ<Ô<Ñ<Ô<½uÅSÐI^ÑE_ÔE_Ñ?`Ô?`Ñ`ˆEÝÐ<Ð<Ð&;Ð<Ñ<Ô<Ñ<Ô<½uÅSÐI^ÑE_ÔE_Ñ?`Ô?`Ñ`ˆEð  !ÐÝ36±5´5ˆNØ/ð 9ð 9‘��BÝ  A™,œ,ð 9ð 9�BÝ# B¨™lœlð 9ð 9˜Ø!# b¡¨"¨r©'˜B˜Ø Ð,Ð,Ò,Ð, T¤WÒ,Ð,Ð,Ð,Ð,°°bÐ1BÐ1BÒ1BÐ1B¸4¼7Ò1BÐ1BÐ1BÐ1BÐ1BØ*×.Ò.°°B¨xÑ8Ô8Ð8øð9ð9ð )ð *ð *‘��BØ”:˜b "˜fÔ%­Ô)@Ò@Ð@Ø$¨Ñ)Ð$øõ Ð\Ð\Ð\Ð\ÐF[Ð\Ñ\Ô\Ñ\Ô\ˆLØ#¥e­CÐ0EÑ,FÔ,FÑ&GÔ&GÑGˆHà�OŠOÝØ)Ø/Ø!&¨ ÝÐ2Ñ3Ô3Ý%*Ð+;Ñ%<Ô%<Ø$,ðñ ô ñ	ô 	ð 	ð ˜!‰OˆJ‰Jàˆr(   c                óø  — d}| j         t          j        k    }t          j        | j        | j        ft          ¬¦  «        }|dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   d}t          d¦  «        D �] }| j         t          j	        k    | j
         z  }t          j        | j        | j        ft          j        ¬¦  «        }|dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   |dd…dd…fxx         |dd…dd…f         z  cc<   || z  |dk    z  }t          t          j        |¦  «        ¦  «        }|dk    r n| xj
        |z  c_
        ||z  }�Œ"|S )uÀ   Cáº¯t tá»‰a ngÃµ cá»¥t topological: TÃ¬m cÃ¡c Ã´ Ä‘Ã£ khÃ¡m phÃ¡ khÃ´ng cÃ²n Ä‘Æ°á»�ng má»Ÿ.

        Returns:
            int: Sá»‘ lÆ°á»£ng Ã´ ngÃµ cá»¥t má»›i Ä‘Æ°á»£c cáº¯t tá»‰a.
        r   rP   r   Nr’   é2   )r/   r   r"   rT   rW   rS   rR   r@   rn   r#   rZ   Úint8r,   Úcount_nonzero)	r[   Ú
new_prunedr—   r˜   Ú_Úis_openÚ	nbr_countÚto_pruneÚcnts	            r)   Úprune_dead_endszExplorationGrid.prune_dead_ends  s¥  € ð ˆ
Ø”J¥,Ô"9Ò9ˆÝ”H˜dœg t¤wÐ/µtÐ<Ñ<Ô<ˆ	Ø�!�"�"�a�a�a�%ÐÐÔ˜H S b S¨!¨!¨! VÔ,Ñ,ÐÐÑØ�#�2�#�q�q�q�&ÐÐÔ˜X a b b¨!¨!¨! eœ_Ñ,ÐÐÑØ�!�!�!�Q�R�R�%ÐÐÔ˜H Q Q Q¨¨¨ VÔ,Ñ,ÐÐÑØ�!�!�!�S�b�S�&ÐÐÔ˜X a a a¨¨¨ eœ_Ñ,ÐÐÑàˆ
Ý�r‘”ð 	ñ 	ˆAØ”z¥\Ô%:Ò:ÀÄ¸ÑOˆGÝœ $¤'¨4¬7Ð!3½2¼7ÐCÑCÔCˆIØ�a�b�b˜!˜!˜!�eÐÐÔ ¨¨¨¨Q¨Q¨Q¨¤Ñ/ÐÐÑØ�c�r�c˜1˜1˜1�fÐÐÔ ¨¨¨¨Q¨Q¨Q¨¤Ñ/ÐÐÑØ�a�a�a˜˜˜�eÐÐÔ ¨¨¨¨3¨B¨3¨¤Ñ/ÐÐÑØ�a�a�a˜˜"˜�fÐÐÔ ¨¨¨¨A¨B¨B¨¤Ñ/ÐÐÑà 9 *Ñ-°¸a²Ñ@ˆHÝ•bÔ& xÑ0Ô0Ñ1Ô1ˆCØ�aŠxˆxØ�ØˆNŒN˜hÑ&ˆNŒNØ˜#ÑˆJ‰JàÐr(   N)rF   rF   rG   rH   )
rI   r,   rJ   r,   rK   r4   rL   r4   rM   rN   )r]   r^   rM   rN   )r   )r   r,   r|   r,   r…   r,   rM   rN   )rM   r4   )rM   r.   )r�   )rž   r.   rŸ   r4   rM   r    )rM   r,   )r   r   r    r!   r\   r„   r‰   r�   rœ   rÃ   rÎ   r'   r(   r)   rE   rE   V   sØ   € € € € € ØsÐsð ØØ $Ø %ðBð Bð Bð Bð Bð0B?ð B?ð B?ð B?ðH=ð =ð =ð =ð =ð3ð 3ð 3ð 3ð3ð 3ð 3ð 3ð  ðFð Fð Fð Fð FðPð ð ð ð ð r(   rE   c                  óN   — e Zd ZdZddedddddfd(d„Zd)d„Z	 d*d+d„Z	 	 d,d-d'„Zd S ).ÚMinimapFogExploreruQ   Bá»™ Ä‘iá»�u phá»‘i thÃ¡m hiá»ƒm sÆ°Æ¡ng mÃ¹ Minimap & Frontier Grid Exploration.rF   g       @r‹   g      @g      ø?gffffffî?rI   r,   rJ   Útarget_resolutionú"Union[Resolution, Tuple[int, int]]Úweight_infor4   Úweight_distÚweight_heatÚweight_momentumÚtarget_coveragerM   rN   c	                ó<  — t          ||¬¦  «        | _        t          |¦  «        | _        t	          t
          | j        ¬¦  «        | _        || _        || _        || _	        || _
        || _        t          \  }	}
}}| j                             |	|
||¦  «        | _        dS )uÚ  Khá»Ÿi táº¡o bá»™ thÃ¡m hiá»ƒm.

        Args:
            grid_width: KÃ­ch thÆ°á»›c chiá»�u ngang lÆ°á»›i thÃ¡m hiá»ƒm.
            grid_height: KÃ­ch thÆ°á»›c chiá»�u dá»�c lÆ°á»›i thÃ¡m hiá»ƒm.
            target_resolution: Ä�á»™ phÃ¢n giáº£i mÃ n hÃ¬nh Ä‘ang cháº¡y.
            weight_info: Trá»�ng sá»‘ Æ°u tiÃªn má»Ÿ rá»™ng thÃ´ng tin sÆ°Æ¡ng mÃ¹ má»›i.
            weight_dist: Trá»�ng sá»‘ pháº¡t khoáº£ng cÃ¡ch xa.
            weight_heat: Trá»�ng sá»‘ pháº¡t Ä‘i vÃ o vÃ¹ng Ä‘Ã£ dáº«m chÃ¢n nhiá»�u láº§n (chá»‘ng loop).
            weight_momentum: Trá»�ng sá»‘ Æ°u tiÃªn giá»¯ hÆ°á»›ng di chuyá»ƒn (chá»‘ng giáº­t cá»¥c).
            target_coverage: NgÆ°á»¡ng hoÃ n thÃ nh báº£n Ä‘á»“ (máº·c Ä‘á»‹nh 95%).
        )rI   rJ   ©Ú
source_resÚ
target_resN)rE   Úgridr   Ú
resolutionr   r   ÚscalerÚw_infoÚw_distÚw_heatÚw_momr×   ÚCANONICAL_MINIMAP_BBOX_1080PÚtransform_bboxÚminimap_screen_bbox)r[   rI   rJ   rÑ   rÓ   rÔ   rÕ   rÖ   r×   Úbx1Úby1Úbx2Úby2s                r)   r\   zMinimapFogExplorer.__init__?  s–   € õ. $¨zÀ{ÐSÑSÔSˆŒ	Ý,Ð->Ñ?Ô?ˆŒÝ&µ)ÈÌÐXÑXÔXˆŒà!ˆŒØ!ˆŒØ!ˆŒØ$ˆŒ
Ø.ˆÔõ :ÑˆˆS�#�sØ#'¤;×#=Ò#=¸cÀ3ÈÈSÑ#QÔ#QˆÔ Ð Ð r(   Ú	res_inputc                óÊ   — t          |¦  «        | _        t          t          | j        ¬¦  «        | _        t
          \  }}}}| j                             ||||¦  «        | _        dS )u^   Cáº­p nháº­t Ä‘á»™ phÃ¢n giáº£i má»¥c tiÃªu má»›i (há»— trá»£ resize cá»­a sá»• game runtime).rÙ   N)r   rÝ   r   r   rÞ   rã   rä   rå   )r[   rê   ræ   rç   rè   ré   s         r)   Úset_target_resolutionz(MinimapFogExplorer.set_target_resolutiond  sY   € å,¨YÑ7Ô7ˆŒÝ&µ)ÈÌÐXÑXÔXˆŒÝ9ÑˆˆS�#�sØ#'¤;×#=Ò#=¸cÀ3ÈÈSÑ#QÔ#QˆÔ Ð Ð r(   ©r3   r3   r²   r    Úplayer_grid_xyr0   Ú
player_velú'Optional[Tuple[FrontierCluster, float]]c                ó.  — |sdS d}t          d¦  «         }|\  }}|\  }}	t          j        ||	¦  «        }
|D ]Ö}|j        \  }}||z
  }||z
  }t          j        ||¦  «        }|dk     rd}d}|
dk    r/||z  ||	z  z   ||
z  z  }t	          dt          d|¦  «        ¦  «        }| j        t          j        |j        ¦  «        z  | j	        |t	          d| j
        j        ¦  «        z  z  z
  | j        |j        z  z
  | j        |z  z   }||k    r|}|}Œ×|�||fS dS )	uà   Lá»±a chá»�n cá»¥m Frontier tá»‘i Æ°u dá»±a trÃªn hÃ m tiá»‡n Ã­ch tá»•ng há»£p.

        HÃ m tiá»‡n Ã­ch:
        U(C) = w_info * InfoGain(C) - w_dist * Dist(P, C) - w_heat * AvgHeat(C) + w_mom * Momentum(P, v, C)
        NÚinfg-Cëâ6?gš™™™™™¹?r3   gü©ñÒMbP?g      ð¿r‹   )r4   ÚmathÚhypotr1   rm   ro   rß   Úlog1pr5   rà   rÜ   rR   rá   r6   râ   )r[   r²   rî   rï   Úbest_clusterÚbest_utilityÚpxÚpyÚvxÚvyÚv_normÚclr¶   r·   r¹   r¸   ÚdistÚmomentum_scoreÚ	cos_thetaÚutilitys                       r)   Úselect_best_frontierz'MinimapFogExplorer.select_best_frontierk  sg  € ð ð 	Ø�4à26ˆÝ˜e™œ�}ˆà‰ˆˆBØ‰ˆˆBÝ”˜B Ñ#Ô#ˆàð 	"ð 	"ˆBØ”^‰FˆB�Ø�b‘ˆBØ�b‘ˆBÝ”:˜b "Ñ%Ô%ˆDØ�dŠ{ˆ{Ø�ð !ˆNØ˜Š}ˆ}Ø "™W r¨B¡wÑ.°4¸&±=ÑA�	Ý!$ T­3¨s°IÑ+>Ô+>Ñ!?Ô!?�ð ”�tœz¨"Ô*=Ñ>Ô>Ñ>Ø”; $­¨S°$´)´,Ñ)?Ô)?Ñ"?Ñ@ñBà”; Ô!3Ñ3ñ5ð ”: Ñ.ñ0ð ð ˜Ò%Ð%Ø&�Ø!�øàÐ#Ø Ð-Ð-Øˆtr(   NÚminimap_imgr^   Úplayer_grid_posúOptional[Tuple[float, float]]Úplayer_velocityr9   c                óú  — | j                              |¦  «         |€| j         j        dz  | j         j        dz  f}t	          t          |d         ¦  «        ¦  «        t	          t          |d         ¦  «        ¦  «        }}| j                              ||d¬¦  «         | j                              ¦   «         }| j                              ¦   «         }| j          	                    |¦  «        }| j          
                    ¦   «         }	|	| j        k    pt          |¦  «        dk    }
|                      |||¬¦  «        }t          |t          j        ¦  «        r|j        \  }}n|j        dd…         \  }}|��|
�s|\  }}t	          t          |j        d         ¦  «        ¦  «        }t	          t          |j        d         ¦  «        ¦  «        }t	          t          |t'          | j         j        ¦  «        z  |z  ¦  «        ¦  «        }t	          t          |t'          | j         j        ¦  «        z  |z  ¦  «        ¦  «        }|dz  }|dz  }t'          ||z
  ¦  «        }t'          ||z
  ¦  «        }t)          j        ||¦  «        }|dk    r||z  ||z  f}n/d	}n,||}}t	          |dz  ¦  «        t	          |dz  ¦  «        }}d	}d
}| j        \  }}}}t/          d||z
  ¦  «        }t/          d||z
  ¦  «        }t	          t          ||t'          |¦  «        z  |z  z   ¦  «        ¦  «        } t	          t          ||t'          |¦  «        z  |z  z   ¦  «        ¦  «        }!t1          ||f||f| |!f|||	|
t          |¦  «        |¬¦	  «	        S )u  Quy trÃ¬nh khÃ©p kÃ­n: Ä�á»�c Minimap -> TrÃ­ch xuáº¥t Frontier -> Cáº¯t tá»‰a ngÃµ cá»¥t -> Ä�á»‹nh tuyáº¿n.

        Args:
            minimap_img: áº¢nh cáº¯t vÃ¹ng Minimap hoáº·c toÃ n bá»™ Minimap canvas.
            player_grid_pos: Vá»‹ trÃ­ ngÆ°á»�i chÆ¡i trÃªn lÆ°á»›i (máº·c Ä‘á»‹nh á»Ÿ trung tÃ¢m lÆ°á»›i).
            player_velocity: Vector váº­n tá»‘c di chuyá»ƒn hiá»‡n táº¡i (vx, vy).

        Returns:
            ExplorationTarget: Má»¥c tiÃªu thÃ¡m hiá»ƒm tá»‘i Æ°u Ä‘Ã£ chuáº©n hÃ³a tá»�a Ä‘á»™ mÃ n hÃ¬nh.
        Ng      à?r   r   r   )r…   )rî   rï   gñhãˆµøä>rí   r3   )	r:   r;   r<   r=   r>   r?   rA   rB   rC   )rÜ   r„   rR   rS   r,   Úroundr‰   rÎ   rœ   rÃ   r�   r×   r¯   r  ra   r   r2   rc   r1   r4   ró   rô   rå   rm   r9   )"r[   r  r  r  ÚpgxÚpgyÚpruned_countÚ	frontiersr²   ÚcoverageÚis_completeÚbest_selectionÚmi_wÚmi_hÚbest_clÚscoreÚtgt_gxÚtgt_gyÚmm_xÚmm_yÚ
p_center_xÚ
p_center_yÚdir_xÚdir_yÚd_normr=   ræ   rç   rè   ré   ÚbwÚbhÚscreen_xÚscreen_ys"                                     r)   Úanalyze_minimap_and_routez,MinimapFogExplorer.analyze_minimap_and_routež  sx  € ð" 	Œ	×)Ò)¨+Ñ6Ô6Ð6ð Ð"Ø#œyœ|¨cÑ1°4´9´<À#Ñ3EÐFˆOå•u˜_¨QÔ/Ñ0Ô0Ñ1Ô1µ3µu¸_ÈQÔ=OÑ7PÔ7PÑ3QÔ3QˆSˆØŒ	×Ò˜s C°ÐÑ2Ô2Ð2ð ”y×0Ò0Ñ2Ô2ˆð ”I×4Ò4Ñ6Ô6ˆ	Ø”9×.Ò.¨yÑ9Ô9ˆð ”9×/Ò/Ñ1Ô1ˆØ 4Ô#7Ò7ÐP½SÀ¹]¼]ÈaÒ=Oˆð ×2Ò2Ø _Àð 3ñ 
ô 
ˆõ
 �k¥5¤;Ñ/Ô/ð 	/Ø$Ô)‰JˆD�$�$à$Ô*¨2¨A¨2Ô.‰JˆD�$àÑ%¨kÑ%Ø+‰NˆG�UÝ�˜wÔ2°1Ô5Ñ6Ô6Ñ7Ô7ˆFÝ�˜wÔ2°1Ô5Ñ6Ô6Ñ7Ô7ˆFõ •u˜f¥u¨T¬Y¬\Ñ':Ô':Ñ:¸dÑBÑCÔCÑDÔDˆDÝ•u˜f¥u¨T¬Y¬\Ñ':Ô':Ñ:¸dÑBÑCÔCÑDÔDˆDð  ™ˆJØ ™ˆJÝ˜$ Ñ+Ñ,Ô,ˆEÝ˜$ Ñ+Ñ,Ô,ˆEÝ”Z  uÑ-Ô-ˆFØ˜Š}ˆ}Ø$)¨F¡N°E¸F±NÐ#CÐ Ð à#-Ð Ð ð ! #�FˆFÝ˜T C™Z™œ­#¨d°S©j©/¬/�$ˆDØ)ÐØˆEð "Ô5ÑˆˆS�#�sÝ��C˜#‘IÑÔˆÝ��C˜#‘IÑÔˆÝ•u˜S D­5°©;¬;Ñ$6¸"Ñ#<Ñ<Ñ=Ô=Ñ>Ô>ˆÝ•u˜S D­5°©;¬;Ñ$6¸"Ñ#<Ñ<Ñ=Ô=Ñ>Ô>ˆå Ø" FÐ+Ø# T˜lØ&¨Ð1Ø-ØØ#Ø)Ý"% h¡-¤-Ø#/ð

ñ 

ô 

ð 
	
r(   )rI   r,   rJ   r,   rÑ   rÒ   rÓ   r4   rÔ   r4   rÕ   r4   rÖ   r4   r×   r4   rM   rN   )rê   rÒ   rM   rN   )rí   )r²   r    rî   r0   rï   r0   rM   rð   )Nrí   )r  r^   r  r  r  r0   rM   r9   )	r   r   r    r!   r   r\   rì   r  r!  r'   r(   r)   rÐ   rÐ   <  s²   € € € € € Ø[Ð[ð ØØ@IØ Ø Ø Ø!$Ø!%ð#Rð #Rð #Rð #Rð #RðJRð Rð Rð Rð +5ð	1ð 1ð 1ð 1ð 1ðl :>Ø/9ð	[
ð [
ð [
ð [
ð [
ð [
ð [
r(   rÐ   )'r!   Ú
__future__r   Úcollectionsr   Údataclassesr   r   Úenumr   ró   Útypingr   r	   r
   r   r   r   r   r   ÚnumpyrT   ÚPILr   ÚImportErrorÚsrc.common.coordinate_transformr   r   r   r   r   r   r   r   r+   r9   rã   rE   rÐ   r'   r(   r)   ú<module>r+     sO  ððð ð( #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø €€€Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ià Ð Ð Ð ðØÐÐÐÐÐÐøØð ð ð Ø€E€E€Eðøøøðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð �7ñ ô ð ð ð!ð !ð !ð !ð !ñ !ô !ñ „ð!ð ð
 ð 
 ð 
 ð 
 ð 
 ñ 
 ô 
 ñ „ð
 ð  =Ð ðcð cð cð cð cñ cô cð cðL}
ð }
ð }
ð }
ð }
ñ }
ô }
ð }
ð }
ð }
s   ºA ÁAÁ
A