§
    ïÿ­jíP  ã                  óÖ   — d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZ ddlmZmZmZ  G d„ dee¦  «        Ze G d	„ d
¦  «        ¦   «         Z	 	 ddd„Z G d„ d¦  «        ZdS )uw  AutoPOE2 - Atlas Graph Data Structure (Doc 56 / Doc 65 / Doc 69).
===================================================================
MÃ´ hÃ¬nh hÃ³a toÃ n bá»™ cÃ¢y báº£n Ä‘á»“ Atlas POE2 v0.5.5+ dÆ°á»›i dáº¡ng Ä�á»“ thá»‹ VÃ´ hÆ°á»›ng G = (V, E).
Quáº£n lÃ½ tráº¡ng thÃ¡i tiáº¿n trÃ¬nh (LOCKED -> REACHABLE_FRONTIER -> COMPLETED / BONUS_COMPLETED),
liÃªn káº¿t ká»� cáº­n, phÃ¢n vÃ¹ng vÃ  má»Ÿ rá»™ng biÃªn (Frontier Progression).

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.
é    )Úannotations)Ú	dataclassÚfield)ÚEnum)ÚAnyÚDictÚListÚOptionalÚSetÚTuple)ÚAtlasKnowledgeBaseÚAtlasNodeTypeÚAtlasNodeProfilec                  ó"   — e Zd ZdZdZdZdZdZdS )ÚNodeProgressionStateu>   Tráº¡ng thÃ¡i tiáº¿n trÃ¬nh má»Ÿ khÃ³a cá»§a Node trÃªn Atlas.ÚLOCKEDÚREACHABLE_FRONTIERÚ	COMPLETEDÚBONUS_COMPLETEDN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   © ó    ú6C:\Projects\AutoPOE2\src\assistant_tool\atlas\graph.pyr   r      s)   € € € € € ØHÐHØ€FØ-ÐØ€IØ'€O€O€Or   r   c                  ó^  — e Zd ZU dZded<   ded<   ded<   dZded<   d	Zd
ed<   dZd
ed<   ej	        Z
ded<   ej        Zded<    ee¬¦  «        Zded<   dZded<    ee¬¦  «        Zded<   dZded<   dZded<   dZd
ed<   ed)d!„¦   «         Zed)d"„¦   «         Zed)d#„¦   «         Z	 	 d*d+d(„Zd$S ),ÚAtlasGraphNodeuh   Ä�á»‰nh cá»§a Ä�á»“ thá»‹ Atlas Ä‘áº¡i diá»‡n cho má»™t báº£n Ä‘á»“ hoáº·c Ä‘á»‹a Ä‘iá»ƒm Ä‘áº·c biá»‡t.ÚstrÚnode_idÚnameÚintÚtierÚCentralÚregiong      Ž@ÚfloatÚscreen_xg     à€@Úscreen_yr   Ú	node_typer   Úprogression_state)Údefault_factoryz	List[str]Ú
encountersr   Útower_coverage_countzSet[str]Ú	neighborszComplete with Rare WaystoneÚbonus_conditioné   Úatlas_points_rewardg      ð?Úweight_modifierÚreturnÚboolc                ó@   — | j         t          j        t          j        fv S ©N)r*   r   r   r   ©Úselfs    r   Úis_completedzAtlasGraphNode.is_completed0   s#   € àÔ%Ý Ô*Ý Ô0ð*
ð 
ð 	
r   c                ó,   — | j         t          j        k    S r6   )r*   r   r   r7   s    r   Úis_bonus_completedz!AtlasGraphNode.is_bonus_completed7   s   € àÔ%Õ)=Ô)MÒMÐMr   c                ó,   — | j         t          j        k    S r6   )r*   r   r   r7   s    r   Úis_frontierzAtlasGraphNode.is_frontier;   s   € àÔ%Õ)=Ô)PÒPÐPr   NÚpreferred_mapsúOptional[List[str]]Úignored_mapsc                ó&   — t          | ||¬¦  «        S )uz   TÃ­nh Ä‘iá»ƒm trá»�ng sá»‘ Æ°u tiÃªn lá»±a chá»�n báº£n Ä‘á»“ cho Monk CI Tier 15 (Doc 56 / Doc 70 / INV-ATLAS-FARM-NODE).)r>   r@   )Úcalculate_node_weight)r8   r>   r@   s      r   Úcalculate_weightzAtlasGraphNode.calculate_weight?   s   € õ % T¸.ÐWcÐdÑdÔdÐdr   )r3   r4   ©NN)r>   r?   r@   r?   r3   r&   )r   r   r   r   Ú__annotations__r%   r'   r(   r   ÚREGULAR_WAYSTONE_MAPr)   r   r   r*   r   Úlistr,   r-   Úsetr.   r/   r1   r2   Úpropertyr9   r;   r=   rC   r   r   r   r   r      s£  € € € € € € àrÐrØ€L€L�LØ€I€I�IØ€I€I�IØ€FÐÐÐÑØ€HÐÐÐÑØ€HÐÐÐÑØ,ÔA€IÐAÐAÐAÑAØ.BÔ.IÐÐIÐIÐIÑIØ!˜E°$Ð7Ñ7Ô7€JÐ7Ð7Ð7Ñ7Ø !ÐÐ!Ð!Ð!Ñ!Ø˜%°Ð4Ñ4Ô4€IÐ4Ð4Ð4Ñ4Ø8€OÐ8Ð8Ð8Ñ8Ø ÐÐ Ð Ð Ñ Ø €OÐ Ð Ð Ñ àð
ð 
ð 
ñ „Xð
ð ðNð Nð Nñ „XðNð ðQð Qð Qñ „XðQð
 /3Ø,0ðeð eð eð eð eð eð er   r   NÚnoder>   r?   r@   r3   r&   c                óÚ  ‡— | j                              ¦   «                              ¦   «         }| j        t          j        k    s!d|v sd|v st          j        | j         ¦  «        rdS |r5|D ]2}|                     ¦   «         | j                              ¦   «         v r dS Œ3d}| j                              ¦   «         Šd‰v r|dz  }nhd‰v r|d	z  }n^d
‰v r|dz  }nTd‰v r|dz  }nJd‰v r|dz  }n@d‰v r|dz  }n6d‰v r|dz  }n,d‰v r|dz  }n"|r t          ˆfd„|D ¦   «         ¦  «        r|dz  }| j
        dk    r|dz  }n9| j
        dk    r|dz  }n(| j
        dk    r|dz  }n|t          | j
        ¦  «        z  }|t          | j        ¦  «        dz  z  }|| j        dz  z  }| j        dk    s| j        j                              d ¦  «        r|dz  }| j        s|dz  }t%          || j        z  d!¦  «        S )"uô  TÃ­nh Ä‘iá»ƒm trá»�ng sá»‘ Æ°u tiÃªn lá»±a chá»�n báº£n Ä‘á»“ cho Monk CI Tier 15 (Doc 56 / Doc 70 / INV-ATLAS-FARM-NODE).
    
    Quy chuáº©n trá»�ng sá»‘ SSoT:
    1. Node bá»‹ cáº¥m (The Burning Monolith / Arbiter of Ash / Pinnacle Arenas / khÃ´ng nháº­n Waystone):
       Tráº£ vá»� -1000.0 (Fail-Closed, tuyá»‡t Ä‘á»‘i cáº¥m).
    2. Danh sÃ¡ch Ä‘en (ignored_maps: Vaal Pyramid, Overgrown Ruin, Maze...): Tráº£ vá»� -500.0.
    3. Tráº­t tá»± Æ°u tiÃªn layout má»Ÿ an toÃ n cho Monk CI (Deserted > Fortress > Mineshaft > Creek > Marsh > Dunes):
       - Deserted: +100.0
       - Fortress: +80.0
       - Mineshaft: +60.0
       - Creek: +40.0
       - Marsh: +25.0
       - Dunes: +15.0
       - CÃ¡c map khÃ¡c trong preferred_maps: +10.0
    4. Trá»�ng sá»‘ Tier:
       - Tier 15: +30.0 (Tier vÃ ng cho Monk CI Endgame)
       - Tier 14: +20.0
       - Tier 16: +10.0
       - Tier khÃ¡c: tier * 1.0
    5. CÆ¡ cháº¿ cÃ³ giÃ¡ trá»‹ (Breach, Delirium, Ritual, Expedition): +5.0 má»—i cÆ¡ cháº¿.
    6. ThÃ¡p Tiá»�n ThÃ¢n bao phá»§ (tower_coverage_count): +8.0 má»—i thÃ¡p.
    7. Ä�iá»ƒm thÆ°á»Ÿng ná»™i táº¡i Atlas (atlas_points_reward > 1 hoáº·c Quest Node): +20.0 incentive.
    8. Node chÆ°a láº¥y bonus (is_bonus_completed == False): +15.0 incentive.
    zBURNING MONOLITHzARBITER OF ASHg     @�Àg     @Àç        Údesertedç      Y@Úfortressg      T@Ú
strongholdg     ÀR@Úcryptg     €Q@Ú	mineshaftg      N@Úcreekg      D@Úmarshg      9@Údunesg      .@c              3  óD   •K  — | ]}|                      ¦   «         ‰v V — Œd S r6   )Úlower)Ú.0ÚpÚ
name_lowers     €r   ú	<genexpr>z(calculate_node_weight.<locals>.<genexpr>ˆ   s0   øè è € ÐPÐP¸A §¢¡	¤	¨ZÐ 7ÐPÐPÐPÐPÐPÐPr   g      $@é   g      >@é   g      4@é   g      @g       @r0   ÚQUEST_é   )r!   ÚupperÚstripr)   r   ÚBURNING_MONOLITHr   Ú!is_forbidden_for_waystone_farmingrW   Úanyr#   r&   Úlenr,   r-   r1   Ú
startswithr;   Úroundr2   )rJ   r>   r@   Ú
name_upperÚignÚscorerZ   s         @r   rB   rB   H   s‹  ø€ ð< ”—’Ñ"Ô"×(Ò(Ñ*Ô*€JàŒ�-Ô8Ò8Ð8Ø Ð+Ð+Ø˜zÐ)Ð)ÝÔ?ÀÄ	ÑJÔJð *ð ˆwð ð Øð 	ð 	ˆCØ�yŠy‰{Œ{˜dœiŸošoÑ/Ô/Ð/Ð/Ø�v�vð 0ð €EØ”—’Ñ"Ô"€JØ�ZÐÐØ�‰ˆˆØ	�zÐ	!Ð	!Ø�‰ˆˆØ	˜Ð	#Ð	#Ø�‰ˆˆØ	�JÐ	Ð	Ø�‰ˆˆØ	˜
Ð	"Ð	"Ø�‰ˆˆØ	�JÐ	Ð	Ø�‰ˆˆØ	�JÐ	Ð	Ø�‰ˆˆØ	�JÐ	Ð	Ø�‰ˆˆØ	ð �CÐPÐPÐPÐPÀÐPÑPÔPÑPÔPð Ø�‰ˆð „y�B‚€Ø�‰ˆˆØ	Œ�bŠˆØ�‰ˆˆØ	Œ�bŠˆØ�‰ˆˆà•�t”yÑ!Ô!Ñ!ˆð 
�S�”Ñ!Ô! CÑ'Ñ'€Eð 
ˆTÔ&¨Ñ,Ñ,€Eð Ô !Ò#Ð# t¤~Ô':×'EÒ'EÀhÑ'OÔ'OÐ#Ø�‰ˆð Ô"ð Ø�‰ˆå�˜Ô-Ñ-¨qÑ1Ô1Ð1r   c                  ó®   — e Zd ZdZd„ Zed'd„¦   «         Zd(d	„Zd)d*d„Zd+d„Z	d,d„Z
d)d-d„Zd.d„Zd.d„Zd.d„Zd/d„Zd0d„Zd0d„Zd1d!„Zed2d3d%„¦   «         Zd&S )4Ú
AtlasGraphu�   
    Ä�á»“ thá»‹ Atlas G = (V, E) quáº£n trá»‹ tiáº¿n trÃ¬nh má»Ÿ khÃ³a toÃ n bá»™ cÃ¢y báº£n Ä‘á»“ (Full Node Progression).
    c                ó:   — i | _         t          ¦   «         | _        d S r6   )Ú_nodesrH   Ú_gateway_nodesr7   s    r   Ú__init__zAtlasGraph.__init__¬   s   € Ø13ˆŒÝ(+©¬ˆÔÐÐr   r3   r"   c                ó*   — t          | j        ¦  «        S r6   )rf   ro   r7   s    r   Útotal_nodeszAtlasGraph.total_nodes°   s   € å�4”;ÑÔÐr   rJ   r   ÚNonec                óv  — t          j        |j        ¦  «        }|j        t          j        k    r:|j        t          j        k    r%|j        |_        |j        dk    r|j        nd|_        || j        |j	        <   |j        t          j
        k    s|j        dk    r!| j                             |j	        ¦  «         dS dS )uh   ThÃªm má»™t node vÃ o Ä‘á»“ thá»‹. Tá»± Ä‘á»™ng liÃªn káº¿t há»“ sÆ¡ tri thá»©c tá»« AtlasKnowledgeBase.r   r0   N)r   Úclassify_noder!   r)   r   rF   ÚUNKNOWNr1   ro   r    ÚGATEWAY_CHECKPOINTr#   rp   Úadd)r8   rJ   Úprofiles      r   Úadd_nodezAtlasGraph.add_node´   s®   € å$Ô2°4´9Ñ=Ô=ˆØŒ>�]Ô?Ò?Ð?ÀGÔDUÕYfÔYnÒDnÐDnØ$Ô.ˆDŒNØFMÔFaÐdeÒFeÐFe wÔ'BÐ'BÐklˆDÔ$à$(ˆŒ�D”LÑ!ØŒ>�]Ô=Ò=Ð=ÀÄÈaÂÀØÔ×#Ò# D¤LÑ1Ô1Ð1Ð1Ð1ð BPÀr   TÚu_idr   Úv_idÚbidirectionalr4   c                óò   — || j         vs	|| j         vrt          d|› d|› d�¦  «        ‚| j         |         j                             |¦  «         |r'| j         |         j                             |¦  «         dS dS )u1   Thiáº¿t láº­p cáº¡nh káº¿t ná»‘i giá»¯a hai node.u"   KhÃ´ng thá»ƒ táº¡o cáº¡nh giá»¯a 'u   ' vÃ  'u-   ': Node khÃ´ng tá»“n táº¡i trong Ä‘á»“ thá»‹.N)ro   ÚKeyErrorr.   ry   )r8   r|   r}   r~   s       r   Úadd_edgezAtlasGraph.add_edge¿   s¬   € à�t”{Ð"Ð" d°$´+Ð&=Ð&=Ýð  AÀð  Að  AÈTð  Að  Að  Añ  Bô  Bð  BàŒ�DÔÔ#×'Ò'¨Ñ-Ô-Ð-Øð 	2ØŒK˜ÔÔ'×+Ò+¨DÑ1Ô1Ð1Ð1Ð1ð	2ð 	2r   r    úOptional[AtlasGraphNode]c                ó6   — | j                              |¦  «        S r6   )ro   Úget)r8   r    s     r   Úget_nodezAtlasGraph.get_nodeÈ   s   € ØŒ{�Š˜wÑ'Ô'Ð'r   úList[AtlasGraphNode]c                ó\   ‡ — ‰                       |¦  «        }|sg S ˆ fd„|j        D ¦   «         S )Nc                ó<   •— g | ]}|‰j         v ¯‰j         |         ‘ŒS r   )ro   )rX   Únbr_idr8   s     €r   ú
<listcomp>z,AtlasGraph.get_neighbors.<locals>.<listcomp>Ï   s,   ø€ ÐZÐZÐZ¨ÀFÈdÌkÐDYÐDY�”˜FÔ#ÐDYÐDYÐDYr   )r…   r.   )r8   r    rJ   s   `  r   Úget_neighborszAtlasGraph.get_neighborsË   s=   ø€ Ø�}Š}˜WÑ%Ô%ˆØð 	ØˆIØZÐZÐZÐZ°$´.ÐZÑZÔZÐZr   Úbonusc                ó  — |                       |¦  «        }|sdS |rt          j        nt          j        |_        |j        D ]?}|                       |¦  «        }|r&|j        t          j        k    rt          j        |_        Œ@dS )uú   
        Ä�Ã¡nh dáº¥u hoÃ n thÃ nh má»™t node vÃ  kÃ­ch hoáº¡t cÆ¡ cháº¿ Má»Ÿ rá»™ng biÃªn (Frontier Expansion):
        Má»�i node lÃ¢n cáº­n Ä‘ang á»Ÿ tráº¡ng thÃ¡i LOCKED sáº½ tá»± Ä‘á»™ng Ä‘Æ°á»£c thÄƒng háº¡ng thÃ nh REACHABLE_FRONTIER.
        N)r…   r   r   r   r*   r.   r   r   )r8   r    rŒ   rJ   r‰   Únbrs         r   Úmark_node_completedzAtlasGraph.mark_node_completedÑ   s™   € ð
 �}Š}˜WÑ%Ô%ˆØð 	ØˆFð 5:Ð]Õ Ô0Ð0Õ?SÔ?]ð 	Ôð
 ”nð 	Pð 	PˆFØ—-’- Ñ'Ô'ˆCØð P�sÔ,Õ0DÔ0KÒKÐKÝ(<Ô(O�Ô%øð	Pð 	Pr   c                óH   — d„ | j                              ¦   «         D ¦   «         S )uY   Láº¥y toÃ n bá»™ cÃ¡c node biÃªn sáºµn sÃ ng Ä‘Æ°á»£c cÃ y Ä‘á»ƒ má»Ÿ rá»™ng báº£n Ä‘á»“.c                ó    — g | ]}|j         ¯	|‘ŒS r   ©r=   ©rX   Úns     r   rŠ   z1AtlasGraph.get_frontier_nodes.<locals>.<listcomp>æ   s   € ÐAÐAÐA�a°1´=ÐA�ÐAÐAÐAr   ©ro   Úvaluesr7   s    r   Úget_frontier_nodeszAtlasGraph.get_frontier_nodesä   s$   € àAÐA˜4œ;×-Ò-Ñ/Ô/ÐAÑAÔAÐAr   c                óH   — d„ | j                              ¦   «         D ¦   «         S )uZ   Láº¥y toÃ n bá»™ cÃ¡c node chÆ°a hoÃ n thÃ nh hoáº·c chÆ°a Ä‘áº¡t Ä‘iá»ƒm thÆ°á»Ÿng bonus.c                ó    — g | ]}|j         °	|‘ŒS r   ©r;   r“   s     r   rŠ   z4AtlasGraph.get_uncompleted_nodes.<locals>.<listcomp>ê   s    € ÐLÐLÐL�a°qÔ7KÐL�ÐLÐLÐLr   r•   r7   s    r   Úget_uncompleted_nodesz AtlasGraph.get_uncompleted_nodesè   s$   € àLÐL˜4œ;×-Ò-Ñ/Ô/ÐLÑLÔLÐLr   c                óH   — d„ | j                              ¦   «         D ¦   «         S )u@   Láº¥y toÃ n bá»™ cÃ¡c node Ä‘Ã£ hoÃ n thÃ nh Ã­t nháº¥t 1 láº§n.c                ó    — g | ]}|j         ¯	|‘ŒS r   ©r9   r“   s     r   rŠ   z2AtlasGraph.get_completed_nodes.<locals>.<listcomp>î   s   € ÐBÐBÐB�a°1´>ÐB�ÐBÐBÐBr   r•   r7   s    r   Úget_completed_nodeszAtlasGraph.get_completed_nodesì   s$   € àBÐB˜4œ;×-Ò-Ñ/Ô/ÐBÑBÔBÐBr   r#   c                óN   ‡— ˆfd„| j                              ¦   «         D ¦   «         S )Nc                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r   )r#   )rX   r”   r#   s     €r   rŠ   z0AtlasGraph.get_nodes_by_tier.<locals>.<listcomp>ñ   s    ø€ ÐBÐBÐB�a°1´6¸T²>°>�°>°>°>r   r•   )r8   r#   s    `r   Úget_nodes_by_tierzAtlasGraph.get_nodes_by_tierð   s+   ø€ ØBÐBÐBÐB˜4œ;×-Ò-Ñ/Ô/ÐBÑBÔBÐBr   úDict[str, Any]c           
     ó’  — t          | j        ¦  «        }|dk    rdddddddddœS t          d„ | j                             ¦   «         D ¦   «         ¦  «        }t          d„ | j                             ¦   «         D ¦   «         ¦  «        }t          d„ | j                             ¦   «         D ¦   «         ¦  «        }t          d„ | j                             ¦   «         D ¦   «         ¦  «        }t          d„ | j                             ¦   «         D ¦   «         ¦  «        }|||||t	          ||z  d	z  d
¦  «        t	          ||z  d	z  d
¦  «        |dœS )u\   TÃ­nh toÃ¡n cÃ¡c chá»‰ sá»‘ Ä‘á»‹nh lÆ°á»£ng vá»� tiáº¿n trÃ¬nh má»Ÿ khÃ³a toÃ n bá»™ Atlas.r   rL   )rs   Úcompleted_countÚbonus_completed_countÚfrontier_countÚlocked_countÚcompletion_rateÚbonus_completion_rateÚtotal_atlas_passive_pointsc              3  ó(   K  — | ]}|j         ¯	d V — ŒdS ©r0   Nrž   r“   s     r   r[   z2AtlasGraph.get_completion_stats.<locals>.<genexpr>  s)   è è € ÐJÐJ˜a¸1¼>ÐJ˜ÐJÐJÐJÐJÐJÐJr   c              3  ó(   K  — | ]}|j         ¯	d V — ŒdS r­   rš   r“   s     r   r[   z2AtlasGraph.get_completion_stats.<locals>.<genexpr>  s*   è è € ÐQÐQ˜q¸AÔ<PÐQ˜ÐQÐQÐQÐQÐQÐQr   c              3  ó(   K  — | ]}|j         ¯	d V — ŒdS r­   r’   r“   s     r   r[   z2AtlasGraph.get_completion_stats.<locals>.<genexpr>  s)   è è € ÐHÐH˜Q¸!¼-ÐH�qÐHÐHÐHÐHÐHÐHr   c              3  óD   K  — | ]}|j         t          j        k    ¯d V — ŒdS r­   )r*   r   r   r“   s     r   r[   z2AtlasGraph.get_completion_stats.<locals>.<genexpr>  s3   è è € ÐkÐk˜1¸Ô8KÕOcÔOjÒ8jÐ8j�QÐ8jÐ8jÐ8jÐ8jÐkÐkr   c              3  ó2   K  — | ]}|j         ¯	|j        V — Œd S r6   )r;   r1   r“   s     r   r[   z2AtlasGraph.get_completion_stats.<locals>.<genexpr>  s-   è è € ÐaÐa¨qÈAÔL`Ða�QÔ*ÐaÐaÐaÐaÐaÐar   rN   r0   )rf   ro   Úsumr–   rh   )r8   ÚtotalÚ	completedÚ
bonus_compÚfrontierÚlockedÚpointss          r   Úget_completion_statszAtlasGraph.get_completion_statsó   sf  € å�D”KÑ Ô ˆØ�AŠ:ˆ:à Ø#$Ø)*Ø"#Ø !Ø#&Ø),Ø./ð	ð 	ð 	õ ÐJÐJ 4¤;×#5Ò#5Ñ#7Ô#7ÐJÑJÔJÑJÔJˆ	ÝÐQÐQ D¤K×$6Ò$6Ñ$8Ô$8ÐQÑQÔQÑQÔQˆ
ÝÐHÐH $¤+×"4Ò"4Ñ"6Ô"6ÐHÑHÔHÑHÔHˆÝÐkÐk ¤× 2Ò 2Ñ 4Ô 4ÐkÑkÔkÑkÔkˆÝÐaÐa°D´K×4FÒ4FÑ4HÔ4HÐaÑaÔaÑaÔaˆð !Ø(Ø%/Ø&Ø"Ý$ i°%Ñ&7¸5Ñ%@À!ÑDÔDÝ%*¨J¸Ñ,>À%Ñ+GÈÑ%KÔ%KØ*0ð	
ð 	
ð 		
r   c                ór   — d„ | j                              ¦   «         D ¦   «         |                      ¦   «         dœS )uO   Xuáº¥t tráº¡ng thÃ¡i Ä‘á»“ thá»‹ Ä‘á»ƒ lÆ°u trá»¯ hoáº·c phá»¥c vá»¥ telemetry.c                ó    — i | ]K\  }}||j         |j        |j        j        t	          |j        ¦  «        |j        |j        |j        |j	        d œ“ŒLS ))r!   r#   Ústater.   r,   Útower_coverager'   r(   )
r!   r#   r*   ÚvaluerG   r.   r,   r-   r'   r(   )rX   r    r”   s      r   ú
<dictcomp>z0AtlasGraph.export_state_dict.<locals>.<dictcomp>  sm   € ð ð ð ñ �G˜Qð ØœFØœFØÔ0Ô6Ý!% a¤kÑ!2Ô!2Ø"#¤,Ø&'Ô&<Ø !¤
Ø !¤
ð	ð 	ðð ð r   )ÚnodesÚstats)ro   Úitemsr¹   r7   s    r   Úexport_state_dictzAtlasGraph.export_state_dict  sN   € ðð ð #'¤+×"3Ò"3Ñ"5Ô"5ðñ ô ð ×.Ò.Ñ0Ô0ð
ð 
ð 	
r   Údatac                ó®  — |                      di ¦  «        }|                     ¦   «         D ]©\  }}|| j        v r›t          |                      dt          j        j        ¦  «        ¦  «        | j        |         _        |                      dg ¦  «        | j        |         _        t          |                      dd¦  «        ¦  «        | j        |         _	        ŒªdS )uL   Náº¡p tráº¡ng thÃ¡i Ä‘á»“ thá»‹ tá»« dict (phá»¥c há»“i phiÃªn lÃ m viá»‡c).rÀ   r¼   r,   r½   r   N)
r„   rÂ   ro   r   r   r¾   r*   r,   r"   r-   )r8   rÄ   Ú
nodes_datar    Ún_infos        r   Úload_state_dictzAtlasGraph.load_state_dict&  sÇ   € à—X’X˜g rÑ*Ô*ˆ
Ø)×/Ò/Ñ1Ô1ð 	að 	a‰OˆG�VØ˜$œ+Ð%Ð%Ý9MØ—J’J˜wÕ(<Ô(CÔ(IÑJÔJñ:ô :�”˜GÔ$Ô6ð 39·*²*¸\È2Ñ2NÔ2N�”˜GÔ$Ô/Ý<?ÀÇ
Â
ÐK[Ð]^Ñ@_Ô@_Ñ<`Ô<`�”˜GÔ$Ô9øð	að 	ar   és   Útotal_target_nodesú'AtlasGraph'c           
     óô  —  | ¦   «         }g d¢}g d¢}d}d„ t          dd¦  «        D ¦   «         }t          |¦  «        D �]o\  }}||dz
  k    r �n_t          dt          d|dz  dz   ¦  «        ¦  «        }	||t	          |¦  «        z           }
d	|                     ¦   «                              d
d¦  «        › d|	› �}g }|dz  dk    r|                     d¦  «         n\|dz  dk    r|                     d¦  «         n=|dz  dk    r|                     d¦  «         n|dz  dk    r|                     d¦  «         |dz  dk    rdnd}|dk    rt          j	        nt          j
        }t          |||	|
|||¬¦  «        }|                     |¦  «         ||	                              |¦  «         |dz  }�Œqdddt          j        fdddt          j        fdddt          j        fdddt          j        fd d!d"t          j        fg}|D ]W\  }}}}t          |||d#t          j
        |d¬$¦  «        }|                     |¦  «         ||                              |¦  «         ŒXg d%¢}|D ]`\  }}}t          |||d&t          j
        t          j        d'¬$¦  «        }|                     |¦  «         ||                              |¦  «         Œad(d)d*t          j        fd+d,d*t          j        fd-d.d*t          j        fd/d0d*t          j        fd1d2d*t          j        fg}|D ]V\  }}}}t          |||d3t          j
        |¬4¦  «        } |                     | ¦  «         |d*                              |¦  «         ŒWt          dd¦  «        D ]Q}!||!         }"t          t	          |"¦  «        dz
  ¦  «        D ]'}#|                     |"|#         |"|#dz            ¦  «         Œ(ŒRt          dd*¦  «        D ]Z}!||!         }$||!dz            }%t          |$¦  «        D ]5\  }#}&|%r.|%|#t	          |%¦  «        z           }'|                     |&|'¦  «         Œ6Œ[t1          |j                             ¦   «         ¦  «        d         }(|                     |(j        d5¬6¦  «         |S )7u§  
        Khá»Ÿi táº¡o cÃ¢y báº£n Ä‘á»“ Atlas POE2 v0.5.5+ chuáº©n má»±c vá»›i 115+ nodes:
        - PhÃ¢n bá»• tá»« Tier 1 tá»›i Tier 16 trÃªn cÃ¡c vÃ¹ng lÃ£nh thá»• (Regions).
        - TÃ­ch há»£p cÃ¡c Quest Nodes (+1 Point), Unique Maps (+2 Points), Citadels vÃ  Special Encounters.
        - Node khá»Ÿi Ä‘áº§u (Beach T1) máº·c Ä‘á»‹nh BONUS_COMPLETED; cÃ¡c node ká»� cáº­n tá»± Ä‘á»™ng lÃ  REACHABLE_FRONTIER.
        )ÚOasisÚTundraÚJungleÚVolcanoúCitadel Core)rÚBeachÚDunesÚ	GraveyardÚLookoutz	Arid LakezFlooded StrandÚMarshesÚ	PeninsulaÚPortÚStrandrÐ   ÚCanyonÚChasmÚDesertedÚFortressÚCreekzSandswept MarshÚ	RiverbankÚBarrowsÚBogzBurial ChambersÚCemeteryzCoral RuinsÚCraterÚCryptÚ
ExcavationÚGeodeÚGlacierÚIcebergzInfested ValleyÚ
Laboratoryz	Lava LakeÚLairÚ	MausoleumÚMesaz
Mud GeyserÚOrchardzOvergrown ShrineÚPhantasmagoriaÚPlazaÚ
RacecourseÚRampartsÚReefÚShorezSunken CityÚTempleÚThicketzUnderground RiverzVaal PyramidÚVaultz
Waste PoolÚ	WaterwaysÚWharfz
Ashen WoodÚAtollÚBelfryzBramble ValleyÚCalderaÚCarcasszCastle RuinsÚChateauÚ	ColosseumÚ	ColonnadeÚCoreÚCoveszCrimson TemplezDark ForestzDefiled CathedralzDesert SpringÚDigÚDungeonÚEstuaryÚFieldsÚFoundryÚGardensÚGhettoÚGrottozHaunted MansionzIvory TemplezJungle ValleyzLava ChamberÚLeylineÚ
LighthouseÚMalformationzMineral PoolszMoon TempleÚMuseumÚ
NecropolisÚParkÚPillarÚPitÚPlateauzPrimordial BlocksÚ	PromenadezRelic ChambersÚ	ResidenceÚScripÚ	SepulchreÚShrineÚSiegeÚSilozSpider ForestzSpider LairÚ
StagnationzSulphur VentsÚSummitÚTerraceÚTowerzToxic SewerzUnderground SeazVaal TempleÚVillaÚWandzForbidden Woodsr   c                ó   — i | ]}|g “ŒS r   r   )rX   Úts     r   r¿   z;AtlasGraph.create_canonical_atlas_graph.<locals>.<dictcomp>T  s   € Ð1NÐ1NÐ1N¸A°!°RÐ1NÐ1NÐ1Nr   r0   é   r\   é   Únode_ú Ú_é	   ÚBreaché   ÚDeliriumé   ÚRitualé   Ú
Expeditioné   )r    r!   r#   r%   r*   r,   r-   Únode_enigma_chamberzEnigma Chamberé   Únode_corrupted_nexuszCorrupted NexusÚnode_great_beast_lairzGreat Beast LairÚnode_withered_willowzThe Withered Willowé   Únode_kingsmarch_ruinszRuins of Kingsmarchr]   zCentral Quest)r    r!   r#   r%   r*   r)   r1   ))Únode_untainted_paradisezUntainted Paradiser#  )Únode_moment_of_zenzMoment of Zenr'  )Únode_vaults_of_kamasazVaults of Kamasaé
   )Únode_the_fractured_lakezThe Fractured Lakeé   )Únode_the_silent_cavezThe Silent Caver]   zUnique Clusterr`   Únode_iron_citadelzIron Citadelr^   Únode_copper_citadelzCopper CitadelÚnode_stone_citadelzStone CitadelÚnode_burning_monolithzThe Burning MonolithÚnode_origin_towerzOrigin TowerrÑ   )r    r!   r#   r%   r*   r)   T)rŒ   )ÚrangeÚ	enumerateÚminÚmaxrf   rW   ÚreplaceÚappendr   r   r   r   r{   r   ÚQUEST_ENIGMA_CHAMBERÚQUEST_CORRUPTED_NEXUSÚQUEST_GREAT_BEASTÚQUEST_WITHERED_WILLOWÚQUEST_KINGSMARCH_RUINSÚ
UNIQUE_MAPÚCITADEL_BOSSrc   ÚORIGIN_TOWERr�   rG   ro   r–   r�   r    ))ÚclsrÊ   ÚgraphÚregionsÚbase_map_namesÚcreated_countÚnode_ids_by_tierÚidxr!   r#   r%   r    r,   ÚcoverageÚinitial_staterJ   Úquest_specsÚq_idÚq_nameÚq_tierÚq_typeÚq_nodeÚunique_specsr|   Úu_nameÚu_tierÚu_nodeÚpinnacle_specsÚp_idÚp_nameÚp_tierÚp_typeÚp_noder!  Út_nodesÚiÚ
curr_nodesÚ
next_nodesÚc_idÚtarget_nextÚ
first_nodes)                                            r   Úcreate_canonical_atlas_graphz'AtlasGraph.create_canonical_atlas_graph1  s\  € ð �‘”ˆàJÐJÐJˆð
ð 
ð 
ˆð. ˆØ1NÐ1NÅÀqÈ"ÁÄÐ1NÑ1NÔ1NÐå" >Ñ2Ô2ð "	ñ "	‰IˆC�ØÐ 2°RÑ 7Ò7Ð7Ø‘å�r�3˜q 3¨!¡8¨q¡.Ñ1Ô1Ñ2Ô2ˆDØ˜S¥3 w¡<¤<Ñ/Ô0ˆFØE˜dŸjšj™lœl×2Ò2°3¸Ñ<Ô<ÐEÐE¸tÐEÐEˆGàˆJØ�Q‰w˜!Š|ˆ|Ø×!Ò! (Ñ+Ô+Ð+Ð+Ø�q‘˜A’�Ø×!Ò! *Ñ-Ô-Ð-Ð-Ø�q‘˜A’�Ø×!Ò! (Ñ+Ô+Ð+Ð+Ø�r‘˜Q’�Ø×!Ò! ,Ñ/Ô/Ð/à  1™W¨š\˜\�q�q°ˆHð EHÈ1ÂHÀHÕ0Ô@Ð@ÕRfÔRmˆMå!ØØØØØ"/Ø%Ø%-ðñ ô ˆDð �NŠN˜4Ñ Ô Ð Ø˜TÔ"×)Ò)¨'Ñ2Ô2Ð2Ø˜QÑˆM‰Mð #Ð$4°a½Ô9[Ð\Ø#Ð%6¸½=Ô;^Ð_Ø$Ð&8¸"½mÔ>]Ð^Ø#Ð%:¸BÅÔ@cÐdØ$Ð&;¸RÅÔAeÐfð
ˆð -8ð 	2ð 	2Ñ(ˆD�&˜& &Ý#ØØØØ&Ý"6Ô"=Ø Ø$%ðñ ô ˆFð �NŠN˜6Ñ"Ô"Ð"Ø˜VÔ$×+Ò+¨DÑ1Ô1Ð1Ð1ð
ð 
ð 
ˆð %1ð 	2ð 	2Ñ ˆD�&˜&Ý#ØØØØ'Ý"6Ô"=Ý'Ô2Ø$%ðñ ô ˆFð �NŠN˜6Ñ"Ô"Ð"Ø˜VÔ$×+Ò+¨DÑ1Ô1Ð1Ð1ð ! .°"µmÔ6PÐQØ"Ð$4°b½-Ô:TÐUØ! ?°B½Ô8RÐSØ$Ð&<¸bÅ-ÔB`ÐaØ  .°"µmÔ6PÐQð
ˆð -;ð 
	.ð 
	.Ñ(ˆD�&˜& &Ý#ØØØØ%Ý"6Ô"=Ø ðñ ô ˆFð �NŠN˜6Ñ"Ô"Ð"Ø˜RÔ ×'Ò'¨Ñ-Ô-Ð-Ð-õ �q˜"‘”ð 	;ð 	;ˆAØ& qÔ)ˆGÝ�3˜w™<œ<¨!Ñ+Ñ,Ô,ð ;ð ;�Ø—’˜w qœz¨7°1°q±5¬>Ñ:Ô:Ð:Ð:ð;õ �q˜"‘”ð 	6ð 	6ˆAØ)¨!Ô,ˆJØ)¨!¨a©%Ô0ˆJÝ$ ZÑ0Ô0ð 6ð 6‘��4Øð 6Ø",¨Qµ°Z±´Ñ-@Ô"A�KØ—N’N 4¨Ñ5Ô5Ð5øð6õ ˜%œ,×-Ò-Ñ/Ô/Ñ0Ô0°Ô3ˆ
Ø×!Ò! *Ô"4¸DÐ!ÑAÔAÐAàˆr   N)r3   r"   )rJ   r   r3   rt   )T)r|   r   r}   r   r~   r4   r3   rt   )r    r   r3   r‚   )r    r   r3   r†   )r    r   rŒ   r4   r3   rt   )r3   r†   )r#   r"   r3   r†   )r3   r£   )rÄ   r£   r3   rt   )rÉ   )rÊ   r"   r3   rË   )r   r   r   r   rq   rI   rs   r{   r�   r…   r‹   r�   r—   r›   rŸ   r¢   r¹   rÃ   rÈ   Úclassmethodrq  r   r   r   rm   rm   §   s‘  € € € € € ðð ð.ð .ð .ð ð ð  ð  ñ „Xð ð	2ð 	2ð 	2ð 	2ð2ð 2ð 2ð 2ð 2ð(ð (ð (ð (ð[ð [ð [ð [ðPð Pð Pð Pð Pð&Bð Bð Bð BðMð Mð Mð MðCð Cð Cð CðCð Cð Cð Cð
ð 
ð 
ð 
ð@
ð 
ð 
ð 
ð&	að 	að 	að 	að ðZð Zð Zð Zñ „[ðZð Zð Zr   rm   rD   )rJ   r   r>   r?   r@   r?   r3   r&   )r   Ú
__future__r   Údataclassesr   r   Úenumr   Útypingr   r   r	   r
   r   r   Ú'src.assistant_tool.atlas_knowledge_baser   r   r   r   r   r   rB   rm   r   r   r   ú<module>rx     sg  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gð(ð (ð (ð (ð (˜3 ñ (ô (ð (ð ð&eð &eð &eð &eð &eñ &eô &eñ „ð&eðV +/Ø(,ð[2ð [2ð [2ð [2ð [2ð~eð eð eð eð eñ eô eð eð eð er   