§
    V¬j„  ã                  ó¶   — d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZmZ ddlmZmZmZ ddlmZ e G d„ d	¦  «        ¦   «         Z G d
„ d¦  «        ZdS )u*  AutoPOE2 - Atlas Graph Pathfinder & Route Optimizer (Doc 56 / Doc 65 / Doc 69).
=================================================================================
Thuáº­t toÃ¡n tÃ¬m Ä‘Æ°á»�ng trÃªn Ä‘á»“ thá»‹ Atlas G = (V, E) phá»¥c vá»¥ tiáº¿n trÃ¬nh má»Ÿ khÃ³a toÃ n bá»™ nodes:
- TÃ¬m Ä‘Æ°á»�ng ngáº¯n nháº¥t Dijkstra / A* tá»›i cÃ¡c Node má»¥c tiÃªu (Citadels, Quest Nodes, Unique Maps).
- TÃ¬m kiáº¿m má»Ÿ rá»™ng biÃªn (Frontier Search) hÆ°á»›ng dáº«n bot má»Ÿ khÃ³a full 115+ nodes Atlas.
- HÃ m chi phÃ­ Ä‘a má»¥c tiÃªu (Multi-Objective Cost Function) káº¿t há»£p Tier, Bonus, Nguy hiá»ƒm vÃ  Encounter.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Cold Path Tier 2 (Python 3.11).
- Rule 4: Module hÃ³a, tráº§n file < 500 dÃ²ng.
- Rule 8: Báº¥t biáº¿n kiáº¿n trÃºc INV-ATLAS-FARM-NODE & INV-ATLAS-QUEST-PROG.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTuple)Ú
AtlasGraphÚAtlasGraphNodeÚNodeProgressionState)ÚEncounterMatcherc                  ó„   — e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   dZd	ed<   edd„¦   «         Zedd„¦   «         ZdS )ÚAtlasPathResultu>   Káº¿t quáº£ tÃ­nh toÃ¡n Ä‘Æ°á»�ng Ä‘i trÃªn Ä‘á»“ thá»‹ Atlas.z	List[str]Úpath_node_idsÚfloatÚ
total_costÚintÚtotal_tiers_traversedÚuncompleted_nodes_countÚstrÚtarget_node_idÚ Útarget_node_nameÚreturnc                ó*   — t          | j        ¦  «        S ©N©Úlenr   ©Úselfs    ú;C:\Projects\AutoPOE2\src\assistant_tool\atlas\pathfinder.pyÚlengthzAtlasPathResult.length"   s   € å�4Ô%Ñ&Ô&Ð&ó    úOptional[str]c                óš   — t          | j        ¦  «        dk    r| j        d         S t          | j        ¦  «        dk    r| j        d         S dS )uG   Node káº¿ tiáº¿p cáº§n kÃ­ch hoáº¡t Ä‘á»ƒ di chuyá»ƒn theo lá»™ trÃ¬nh.é   é   r   Nr    r"   s    r$   Únext_hop_node_idz AtlasPathResult.next_hop_node_id&   sQ   € õ ˆtÔ!Ñ"Ô" aÒ'Ð'ØÔ% aÔ(Ð(Ý�Ô#Ñ$Ô$¨Ò)Ð)ØÔ% aÔ(Ð(Øˆtr&   N)r   r   )r   r'   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úpropertyr%   r+   © r&   r$   r   r      s¨   € € € € € € àHÐHØÐÐÑØÐÐÑØÐÐÑØ Ð Ð Ñ ØÐÐÑØÐÐÐÐÑàð'ð 'ð 'ñ „Xð'ð ðð ð ñ „Xðð ð r&   r   c                  ó>   — e Zd ZdZ	 	 	 ddd	„Zdd„Zdd„Z	 dd d„ZdS )!ÚAtlasPathfinderuO   Bá»™ Ä‘á»‹nh tuyáº¿n vÃ  tÃ¬m Ä‘Æ°á»�ng tá»‘i Æ°u trÃªn cÃ¢y báº£n Ä‘á»“ Atlas.ç333333Ó?çš™™™™™é?ç333333ó?Útier_weightr   Úuncompleted_bonus_incentiveÚdanger_penaltyc                ó0   — || _         || _        || _        d S r   )r8   r9   r:   )r#   r8   r9   r:   s       r$   Ú__init__zAtlasPathfinder.__init__3   s"   € ð 'ˆÔØ+FˆÔ(Ø,ˆÔÐÐr&   Úur   Úvr   c                óf  — d}|j         rd}n$|j        rd}n|j        t          j        k    rd}nd}t          |j        |j        z
  ¦  «        | j        z  }t          j	        |j
        |j        ¦  «        }t          d|dz
  dz  ¦  «        }t          d||z   |z   |z
  ¦  «        }t          |d¦  «        S )	uŸ   
        HÃ m chi phÃ­ cáº¡nh (Edge Cost) cÃ³ trá»�ng sá»‘:
        Cost(u, v) = Base + TierDelta * w_tier - EncounterScore * w_enc + UncompletedDelta
        g      ð?g      à?gš™™™™™É?g333333ã?g       @g333333Ã?gš™™™™™¹?é   )Úis_bonus_completedÚis_frontierÚprogression_stater   Ú	COMPLETEDÚabsÚtierr8   r   Úcalculate_scoreÚ
encountersÚtower_coverage_countÚminÚmaxÚround)	r#   r=   r>   Ú	base_costÚ
state_costÚ	tier_costÚ	enc_scoreÚenc_discountr   s	            r$   Úcalculate_edge_costz#AtlasPathfinder.calculate_edge_cost=   sÊ   € ð
 ˆ	ð Ôð 	ØˆJˆJØŒ]ð 	àˆJˆJØÔ Õ$8Ô$BÒBÐBØˆJˆJàˆJõ ˜œ ¤™Ñ(Ô(¨4Ô+;Ñ;ˆ	õ %Ô4°Q´\À1ÔCYÑZÔZˆ	Ý˜3 ¨S¡°DÑ 8Ñ9Ô9ˆå˜˜i¨*Ñ4°yÑ@À<ÑOÑPÔPˆ
Ý�Z Ñ#Ô#Ð#r&   Úgraphr   Ústart_idr   Ú	target_idúOptional[AtlasPathResult]c           	     ó®  ‡‡— ‰                      |¦  «        }‰                      |¦  «        }|r|sdS ||k    r$t          |gdd|j        rdnd||j        ¬¦  «        S d||gfg}|di}|�rjt	          j        |¦  «        \  }}	Š|	|k    rzt          ˆfd„‰D ¦   «         ¦  «        }
t          ˆˆfd„t          dt          ‰¦  «        ¦  «        D ¦   «         ¦  «        }t          ‰t          |d¦  «        ||
||j        ¬¦  «        S || 
                    |	t          d	¦  «        ¦  «        k    rŒÃ‰                      |	¦  «        }|sŒÛ‰                     |	¦  «        D ]y}|                      ||¦  «        }||z   }|| 
                    |j        t          d	¦  «        ¦  «        k     r0|||j        <   t	          j        |||j        ‰|j        gz   f¦  «         Œz|�°jdS )
uP   Thuáº­t toÃ¡n Dijkstra tÃ¬m lá»™ trÃ¬nh tá»‘i Æ°u tá»« start_id tá»›i target_id.Ng        r   r*   )r   r   r   r   r   r   c              3  óz   •K  — | ]5}‰                      |¦  «        ¯‰                      |¦  «        j        °1d V — Œ6dS ©r*   N)Úget_noderA   )Ú.0ÚnidrS   s     €r$   ú	<genexpr>z5AtlasPathfinder.find_shortest_path.<locals>.<genexpr>x   s`   øè è € ð "ð "ØØ—~’~ cÑ*Ô*ð"à38·>²>À#Ñ3FÔ3FÔ3Yð"Øð"ð "ð "ð "ð "ð "r&   c           	   3  ó,  •K  — | ]Ž}‰                      ‰|         ¦  «        ¯‰                      ‰|d z
           ¦  «        ¯;t          ‰                      ‰|         ¦  «        j        ‰                      ‰|d z
           ¦  «        j        z
  ¦  «        V — Œ�dS rY   )rZ   rE   rF   )r[   ÚirS   Úpaths     €€r$   r]   z5AtlasPathfinder.find_shortest_path.<locals>.<genexpr>|   s¢   øè è € ð ð àØ—~’~ d¨1¤gÑ.Ô.ðð 49·>²>À$ÀqÈ1ÁuÄ+Ñ3NÔ3NðÝ˜Ÿš t¨A¤wÑ/Ô/Ô4°u·~²~ÀdÈ1ÈqÉ5ÄkÑ7RÔ7RÔ7WÑWÑXÔXðð ð ð ð ð r&   r@   Úinf)rZ   r   rA   ÚnameÚheapqÚheappopÚsumÚranger!   rL   Úgetr   Úget_neighborsrR   Únode_idÚheappush)r#   rS   rT   rU   Ú
start_nodeÚtarget_nodeÚpqÚvisitedÚcostÚcurr_idÚuncompletedÚtiersÚ	curr_nodeÚnbrÚ	edge_costÚnew_costr`   s    `              @r$   Úfind_shortest_pathz"AtlasPathfinder.find_shortest_pathY   sc  øø€ ð —^’^ HÑ-Ô-ˆ
Ø—n’n YÑ/Ô/ˆØð 	 ð 	Ø�4à�yÒ Ð Ý"Ø'˜jØØ&'Ø-7Ô-JÐ(Q¨¨ÐPQØ(Ø!,Ô!1ðñ ô ð ð 47¸À8À*Ð2MÐ1NˆØ%-¨s Oˆàñ $	VÝ"'¤-°Ñ"3Ô"3ÑˆD�'˜4à˜)Ò#Ð#å!ð "ð "ð "ð "Ø!%ð"ñ "ô "ñ ô �õ ð ð ð ð ð å" 1¥c¨$¡i¤iÑ0Ô0ðñ ô ñ ô �õ
 'Ø"&Ý$ T¨1™~œ~Ø*/Ø,7Ø#,Ø%0Ô%5ðñ ô ð ð �g—k’k '­5°©<¬<Ñ8Ô8Ò8Ð8ØàŸš wÑ/Ô/ˆIØð Øà×*Ò*¨7Ñ3Ô3ð Vð V�Ø ×4Ò4°YÀÑDÔD�	Ø )Ñ+�à˜gŸkšk¨#¬+µu¸U±|´|ÑDÔDÒDÐDØ+3�G˜CœKÑ(Ý”N 2¨°#´+¸tÀsÄ{ÀmÑ?SÐ'TÑUÔUÐUøðI ñ $	VðL ˆtr&   NÚ
current_idÚpreferred_tierúOptional[int]c                óþ   ‡— |                      ¦   «         }|sdS ‰�|                     ˆfd„¬¦  «         d}t          d¦  «        }|D ]4}|                      |||j        ¦  «        }|r|j        |k     r	|j        }|}Œ5|S )u}   
        TÃ¬m kiáº¿m node biÃªn (Frontier Node) gáº§n nháº¥t chÆ°a hoÃ n thÃ nh Ä‘á»ƒ má»Ÿ rá»™ng lÃ£nh thá»• Atlas.
        Nc                ó2   •— t          | j        ‰z
  ¦  «        S r   )rE   rF   )Únry   s    €r$   ú<lambda>z7AtlasPathfinder.find_nearest_frontier.<locals>.<lambda>ª   s   ø€ ­¨Q¬V°nÑ-DÑ)EÔ)E€ r&   )Úkeyra   )Úget_frontier_nodesÚsortr   rw   ri   r   )	r#   rS   rx   ry   Ú	frontiersÚ	best_pathÚmin_costÚf_nodeÚpath_ress	      `     r$   Úfind_nearest_frontierz%AtlasPathfinder.find_nearest_frontier›   sª   ø€ ð ×,Ò,Ñ.Ô.ˆ	Øð 	Ø�4ð Ð%Ø�NŠNÐEÐEÐEÐEˆNÑFÔFÐFà/3ˆ	Ý˜‘<”<ˆàð 	%ð 	%ˆFØ×.Ò.¨u°jÀ&Ä.ÑQÔQˆHØð %˜HÔ/°(Ò:Ð:Ø#Ô.�Ø$�	øàÐr&   )r5   r6   r7   )r8   r   r9   r   r:   r   )r=   r   r>   r   r   r   )rS   r   rT   r   rU   r   r   rV   r   )rS   r   rx   r   ry   rz   r   rV   )r,   r-   r.   r/   r<   rR   rw   r‡   r2   r&   r$   r4   r4   0   s‰   € € € € € ØYÐYð !Ø-0Ø #ð	-ð -ð -ð -ð -ð$ð $ð $ð $ð8@ð @ð @ð @ðL )-ð	ð ð ð ð ð ð r&   r4   )r/   Ú
__future__r   rc   Údataclassesr   r   Útypingr   r   r   r	   r
   r   r   Úsrc.assistant_tool.atlas.graphr   r   r   Ú*src.assistant_tool.atlas.encounter_matcherr   r   r4   r2   r&   r$   ú<module>r�      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bà [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ø GÐ GÐ GÐ GÐ GÐ Gð ðð ð ð ð ñ ô ñ „ðð.Eð Eð Eð Eð Eñ Eô Eð Eð Eð Er&   