§
    så®jš+  ã                  ó¼   — d Z ddlmZ ddlmZmZ ddlZddlmZm	Z	m
Z
mZmZmZ e G d„ d¦  «        ¦   «         Ze G d„ d	¦  «        ¦   «         Z G d
„ d¦  «        ZdS )uB  AutoPOE2 - Dynamic Loot Value Density Clusterer (Doc 69 Â§3.4 / SSoT 2026).
=============================================================================
Module gom cá»¥m váº­t pháº©m rÆ¡i theo máº­t Ä‘á»™ giÃ¡ trá»‹ kinh táº¿ (Value Density Score - VDS):
- Triá»‡t tiÃªu 100% hiá»‡n tÆ°á»£ng nhÃ¢n váº­t Ä‘i giáº­t lÃ¹i (Backtracking) Ä‘á»ƒ nháº·t rÃ¡c giÃ¡ trá»‹ tháº¥p:
  - Khi má»™t váº­t pháº©m náº±m ngÆ°á»£c hÆ°á»›ng tiáº¿n trÃ¬nh báº£n Ä‘á»“ (cos Î¸ < -0.30) vÃ  cÃ³ máº­t Ä‘á»™ giÃ¡ trá»‹
    tháº¥p (< 1.5 Chaos/giÃ¢y), thuáº­t toÃ¡n tá»± Ä‘á»™ng gáº¯n cá»� REJECT_BACKTRACK.
  - RÃ o cháº¯n báº£o vá»‡ váº­t pháº©m tá»‘i thÆ°á»£ng (Critical Item Interlock):
    Váº­t pháº©m báº­c SSS (Divine Orb, Mirror of Kalandra, Waystone T15+) Ä‘Æ°á»£c miá»…n trá»« pháº¡t
    ngÆ°á»£c hÆ°á»›ng, láº­p tá»©c kÃ­ch hoáº¡t Ä‘Æ°á»�ng vÃ²ng nháº·t an toÃ n.
- Gom cá»¥m khÃ´ng gian (Spatial Clustering): Gom cÃ¡c mÃ³n Ä‘á»“ trong bÃ¡n kÃ­nh 35u thÃ nh 1 cá»¥m
  Ä‘á»ƒ tá»‘i Æ°u hÃ³a chuá»—i nháº·t Ä‘á»“ liÃªn hoÃ n (Traveling Salesperson cá»¥c bá»™).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Dual-Track Operational Doctrine, Python 3.11 Tier 2.
- Rule 4: Module hÃ³a Ä‘á»™c láº­p, tráº§n file < 500 dÃ²ng.
- Rule 5: 100% test case kiá»ƒm thá»­ thá»±c nghiá»‡m trÃªn taxonomy POE2 tháº­t.
- Báº¥t biáº¿n: INV-WASD-NO-BLIND-LMB, INV-WAYSTONE-ROW1-ONLY.
é    )Úannotations)Ú	dataclassÚfieldN)ÚAnyÚDictÚListÚOptionalÚSetÚTuplec                  óf   — 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Zded<   dS )ÚGroundItemInfou6   ThÃ´ng tin má»™t váº­t pháº©m rÆ¡i trÃªn máº·t Ä‘áº¥t.ÚintÚ	entity_idÚstrÚnameÚfloatÚxÚyr   Úrarityç        Úestimated_chaos_valueFÚboolÚis_criticalN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   © ó    úPC:\Projects\AutoPOE2\src\assistant_tool\pickit\dynamic_loot_density_clusterer.pyr   r      sl   € € € € € € à@Ð@Ø€N€N�NØ€I€I�IØ€H€H�HØ€H€H�HØ€F€O€O€O�OØ#&ÐÐ&Ð&Ð&Ñ&Ø€KÐÐÐÑÐÐr    r   c                  ó�   — 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ed<   d
ed<   dZded<   dS )ÚLootClusterResultu<   Káº¿t quáº£ phÃ¢n tÃ­ch má»™t cá»¥m váº­t pháº©m trÃªn sÃ n.r   Ú
cluster_idúTuple[float, float]Ú
center_posúList[GroundItemInfo]Úitemsr   Útotal_chaos_valuer   Úhas_critical_itemÚdistance_to_playerÚdetour_angle_degÚis_backtrackingÚkinetic_cost_secÚvalue_density_scoreÚshould_pickupÚ r   ÚreasonN)r   r   r   r   r   r2   r   r    r!   r#   r#   '   sª   € € € € € € àFÐFØ€O€O�OØ#Ð#Ð#Ñ#ØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ€FÐÐÐÑÐÐr    r#   c                  óÐ   — e Zd ZU dZi dd“dd“dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#i¥Zd$ed%<   	 	 	 	 	 	 dGdHd4„ZedIdJd;„¦   «         ZdKdB„Z	dLdE„Z
dFS )MÚDynamicLootDensityClustereru]   Ä�á»™ng cÆ¡ gom cá»¥m váº­t pháº©m vÃ  Ä‘Ã¡nh giÃ¡ máº­t Ä‘á»™ kinh táº¿ chá»‘ng quay Ä‘áº§u.zmirror of kalandrag     jè@z
divine orbg      i@zgreater jeweller's orbg     €F@zperfect jeweller's orbg     €f@zexalted orbg      4@z	chaos orbç      ð?zorb of alchemyçš™™™™™É?z	regal orbç      à?zorb of chancegš™™™™™©?zscroll of wisdomgü©ñÒMbP?zportal scrollgü©ñÒMb`?zorb of transmutationç{®Gáz„?zorb of augmentationg{®Gáz”?zblacksmith's whetstonezarmourer's scrapzwaystone (tier 15)ç      .@zwaystone (tier 16)g      9@zwaystone (tier 1)çš™™™™™¹?zDict[str, float]ÚCANONICAL_VALUE_TABLEç     €A@ç      C@ç{®Gáz´?ç      @ç       @Úcluster_radiusr   Úplayer_speedÚpickup_dwell_secÚmin_vds_thresholdÚbacktrack_penalty_factorÚmin_backtrack_chaosÚreturnÚNonec                óZ   — || _         || _        || _        || _        || _        || _        dS )u¡  Khá»Ÿi táº¡o bá»™ phÃ¢n cá»¥m giÃ¡ trá»‹ chiáº¿n lá»£i pháº©m.

        Args:
            cluster_radius: BÃ¡n kÃ­nh gá»™p cÃ¡c mÃ³n Ä‘á»“ vÃ o cÃ¹ng cá»¥m (units).
            player_speed: Tá»‘c Ä‘á»™ di chuyá»ƒn Æ°á»›c tÃ­nh cá»§a nhÃ¢n váº­t (units/sec).
            pickup_dwell_sec: Thá»�i gian trá»… má»—i thao tÃ¡c nháº·t (giÃ¢y).
            min_vds_threshold: NgÆ°á»¡ng máº­t Ä‘á»™ giÃ¡ trá»‹ tá»‘i thiá»ƒu (Chaos/giÃ¢y) Ä‘á»ƒ cháº¥p nháº­n nháº·t.
            backtrack_penalty_factor: Há»‡ sá»‘ pháº¡t thá»�i gian khi di chuyá»ƒn ngÆ°á»£c hÆ°á»›ng map.
            min_backtrack_chaos: GiÃ¡ trá»‹ tá»‘i thiá»ƒu Ä‘á»ƒ cho phÃ©p quay Ä‘áº§u nháº·t Ä‘á»“.
        N)rA   rB   rC   Úmin_vdsÚbacktrack_penaltyrF   )ÚselfrA   rB   rC   rD   rE   rF   s          r!   Ú__init__z$DynamicLootDensityClusterer.__init__Q   s9   € ð& -ˆÔØ(ˆÔØ 0ˆÔØ(ˆŒØ!9ˆÔØ#6ˆÔ Ð Ð r    r   Ú	item_namer   r   r   úTuple[float, bool]c                óÜ   — |                      ¦   «                              ¦   «         }| j                             ¦   «         D ]\  }}||v r|dk    }||fc S Œ|dk    rdS d|v rdS |dk    rdS dS )	u±   Æ¯á»›c tÃ­nh giÃ¡ trá»‹ kinh táº¿ cá»§a váº­t pháº©m theo Chaos Orb.

        Returns:
            Tuple[float, bool]: (GiÃ¡ trá»‹ Chaos, True náº¿u lÃ  Critical Item).
        r9   é   )r@   FÚwaystone)r5   Fé   )r:   F)r8   F)ÚlowerÚstripr;   r(   )ÚclsrN   r   rT   ÚkÚvÚis_crits          r!   Úestimate_item_valuez/DynamicLootDensityClusterer.estimate_item_valuek   s›   € ð —’Ñ!Ô!×'Ò'Ñ)Ô)ˆØÔ-×3Ò3Ñ5Ô5ð 	"ð 	"‰DˆAˆqØ�EˆzˆzØ˜tš)�Ø˜'�zÐ!Ð!Ð!ð ð
 �QŠ;ˆ;Ø�:Ø˜ÐÐØ�:Ø�QŠ;ˆ;Ø�;Øˆ{r    Úground_itemsr'   Ú
player_posr%   Úmap_progression_dirúList[LootClusterResult]c                óx  — |sg S g }|D ]º}d}|D ]›}t          d„ |D ¦   «         ¦  «        t          |¦  «        z  }t          d„ |D ¦   «         ¦  «        t          |¦  «        z  }	t          j        |j        |z
  |j        |	z
  ¦  «        | j        k    r|                     |¦  «         d} nŒœ|s|                     |g¦  «         Œ»|\  }
}|\  }}t          j        ||¦  «        }|dk    r||z  }||z  }nd\  }}g }t          |d¬¦  «        D �]\  }}t          d	„ |D ¦   «         ¦  «        t          |¦  «        z  }t          d
„ |D ¦   «         ¦  «        t          |¦  «        z  }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }||
z
  }||z
  }t          j        ||¦  «        }|dk    rZ||z  }||z  }||z  ||z  z   }t          dt          d|¦  «        ¦  «        }t          j        t          j        |¦  «        ¦  «        }nd}d}|dk     }|t          d| j        ¦  «        z  }t          |¦  «        | j        z  }||z   } |r|s
| | j        z  } |t          d| ¦  «        z  }!d}"d}#|r
d}"d|d›d�}#nl|rB|| j        k    r!|!| j        k    rd}"d|d›d| j        › d|!d›d�}#n>d}"d|d›d|d›d| j        › d�}#n(|!| j        k    s|d k    rd}"d!|!d›d"|d›d#�}#n	d}"d$|!d›d�}#|                     t'          |||f||||||| |!|"|#¬%¦  «        ¦  «         �Œ|                     d&„ d¬'¦  «         |S )(uä  Gom cá»¥m danh sÃ¡ch váº­t pháº©m vÃ  ra quyáº¿t Ä‘á»‹nh nháº·t hay bá»� qua.

        Args:
            ground_items: Danh sÃ¡ch váº­t pháº©m Ä‘ang hiá»ƒn thá»‹ trÃªn sÃ n Ä‘áº¥u.
            player_pos: Tá»�a Ä‘á»™ (X, Y) tháº¿ giá»›i hiá»‡n táº¡i cá»§a ngÆ°á»�i chÆ¡i.
            map_progression_dir: Vector Ä‘á»‹nh hÆ°á»›ng tiáº¿n trÃ¬nh cá»§a map (dx, dy).

        Returns:
            List[LootClusterResult]: Danh sÃ¡ch cÃ¡c cá»¥m váº­t pháº©m kÃ¨m Ä‘iá»ƒm sá»‘ VDS.
        Fc              3  ó$   K  — | ]}|j         V — Œd S ©N©r   ©Ú.0Úits     r!   ú	<genexpr>zCDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<genexpr>š   ó$   è è € Ð+Ð+ "˜œÐ+Ð+Ð+Ð+Ð+Ð+r    c              3  ó$   K  — | ]}|j         V — Œd S ra   ©r   rc   s     r!   rf   zCDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<genexpr>›   rg   r    Tg-Cëâ6?)r5   r   é   )Ústartc              3  ó$   K  — | ]}|j         V — Œd S ra   rb   rc   s     r!   rf   zCDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<genexpr>±   ó$   è è € Ð/Ð/ �r”tÐ/Ð/Ð/Ð/Ð/Ð/r    c              3  ó$   K  — | ]}|j         V — Œd S ra   ri   rc   s     r!   rf   zCDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<genexpr>²   rm   r    c              3  ó$   K  — | ]}|j         V — Œd S ra   )r   rc   s     r!   rf   zCDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<genexpr>³   s%   è è € ÐHÐH¸˜BÔ4ÐHÐHÐHÐHÐHÐHr    c              3  ó$   K  — | ]}|j         V — Œd S ra   )r   rc   s     r!   rf   zCDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<genexpr>´   s$   è è € Ð=Ð=¨b˜2œ>Ð=Ð=Ð=Ð=Ð=Ð=r    g      ð¿r5   r   g333333Ó¿r:   r1   u7   Chá»©a váº­t pháº©m tá»‘i thÆ°á»£ng (GiÃ¡ trá»‹ cá»¥m: z.1fz Chaos)u.   Ä�i ngÆ°á»£c Ä‘Æ°á»�ng há»£p lá»‡ (GiÃ¡ trá»‹ zC >= zC, VDS=z.2fz C/s)u*   Bá»Ž QUA CHá»�NG QUAY Ä�áº¦U: GÃ³c lá»‡ch z.0fu!   Â° ngÆ°á»£c hÆ°á»›ng, giÃ¡ trá»‹ u   C < ngÆ°á»¡ng ÚCr6   u"   CÃ¹ng hÆ°á»›ng tiáº¿n trÃ¬nh (VDS=u    C/s, GÃ³c=u   Â°)u*   Bá»� qua rÃ¡c giÃ¡ trá»‹ quÃ¡ tháº¥p (VDS=)r$   r&   r(   r)   r*   r+   r,   r-   r.   r/   r0   r2   c                ó   — | j         | j        fS ra   )r*   r/   )Úrs    r!   ú<lambda>zBDynamicLootDensityClusterer.cluster_and_evaluate.<locals>.<lambda>ÿ   s   €  AÔ$7¸Ô9NÐ#O€ r    )ÚkeyÚreverse)ÚsumÚlenÚmathÚhypotr   r   rA   ÚappendÚ	enumerateÚanyÚmaxÚminÚdegreesÚacosrB   rC   rK   rF   rJ   r#   Úsort)$rL   r[   r\   r]   ÚclustersÚitemÚassignedÚclÚcxÚcyÚpxÚpyÚp_dxÚp_dyÚp_normÚresultsÚc_idÚcl_itemsÚcl_xÚcl_yÚ	total_valÚhas_critÚvxÚvyÚdistÚuxÚuyÚ	cos_thetaÚ	angle_degr-   Útravel_timeÚpickup_timeÚkinetic_costÚvdsr0   r2   s$                                       r!   Úcluster_and_evaluatez0DynamicLootDensityClusterer.cluster_and_evaluate�   s¾  € ð  ð 	ØˆIð 02ˆØ ð 	(ð 	(ˆDØˆHØð ð �åÐ+Ð+¨Ð+Ñ+Ô+Ñ+Ô+­c°"©g¬gÑ5�ÝÐ+Ð+¨Ð+Ñ+Ô+Ñ+Ô+­c°"©g¬gÑ5�Ý”:˜dœf r™k¨4¬6°B©;Ñ7Ô7¸4Ô;NÒNÐNØ—I’I˜d‘O”O�OØ#�HØ�Eð Oð ð (Ø—’  Ñ'Ô'Ð'øð ‰ˆˆBØ(‰
ˆˆdÝ”˜D $Ñ'Ô'ˆØ�DŠ=ˆ=Ø�F‰NˆDØ�F‰NˆDˆDà!‰JˆD�$à+-ˆõ (¨¸Ð:Ñ:Ô:ð L	ñ L	‰NˆD�(ÝÐ/Ð/ hÐ/Ñ/Ô/Ñ/Ô/µ#°h±-´-Ñ?ˆDÝÐ/Ð/ hÐ/Ñ/Ô/Ñ/Ô/µ#°h±-´-Ñ?ˆDÝÐHÐH¸xÐHÑHÔHÑHÔHˆIÝÐ=Ð=°HÐ=Ñ=Ô=Ñ=Ô=ˆHð ˜‘ˆBØ˜‘ˆBÝ”:˜b "Ñ%Ô%ˆDð �dŠ{ˆ{Ø˜$‘Y�Ø˜$‘Y�Ø ™I¨¨T©	Ñ1�	Ý ¥c¨#¨yÑ&9Ô&9Ñ:Ô:�	Ý œL­¬°9Ñ)=Ô)=Ñ>Ô>�	�	à�	Ø�	ð (¨%Ò/ˆOð ¥ S¨$Ô*;Ñ!<Ô!<Ñ<ˆKÝ˜h™-œ-¨$Ô*?Ñ?ˆKØ&¨Ñ4ˆLàð 7 xð 7à Ô 6Ñ6�ð �c # |Ñ4Ô4Ñ4ˆCð "ˆMØˆFàð Yà $�ØiÐS\ÐiÐiÐiÐi��Ø ð YØ Ô 8Ò8Ð8¸SÀDÄLÒ=PÐ=PØ$(�Mð RÈið  Rð  Rð  RÐbfÔbzð  Rð  Rð  DGð  Rð  Rð  Rð  R�F�Fà$)�Mð sÈ)ð  sð  sð  sð  {Dð  sð  sð  sð  X\ô  Xpð  sð  sð  s�F�Fð ˜$œ,Ò&Ð&¨)°tÒ*;Ð*;Ø$(�MØhÀ#ÐhÐhÐhÐV_ÐhÐhÐhÐh�F�Fà$)�MØXÈ#ÐXÐXÐXÐX�Fà�NŠNÝ!Ø#Ø $ d˜|Ø"Ø&/Ø&.Ø'+Ø%.Ø$3Ø%1Ø(+Ø"/Ø!ðñ ô ñô ð ñ ð$ 	�ŠÐOÐOÐY]ˆÑ^Ô^Ð^Øˆr    rƒ   úOptional[LootClusterResult]c                ó&   — |D ]}|j         r|c S ŒdS )uE   Chá»�n cá»¥m tá»‘i Æ°u nháº¥t Ä‘á»ƒ nháº·t trong nhá»‹p hiá»‡n táº¡i.N)r0   )rL   rƒ   r†   s      r!   Úselect_best_clusterz/DynamicLootDensityClusterer.select_best_cluster  s/   € àð 	ð 	ˆBØÔð Ø�	�	�	ðàˆtr    N)r<   r=   r>   r7   r?   r@   )rA   r   rB   r   rC   r   rD   r   rE   r   rF   r   rG   rH   )r   )rN   r   r   r   rG   rO   )r[   r'   r\   r%   r]   r%   rG   r^   )rƒ   r^   rG   r¡   )r   r   r   r   r;   r   rM   ÚclassmethodrZ   r    r£   r   r    r!   r4   r4   8   s�  € € € € € € ØgÐgð/Ø˜gð/à�eð/ð 	! $ð/ð 	! %ð	/ð
 	�tð/ð 	�Sð/ð 	˜$ð/ð 	�Tð/ð 	˜ð/ð 	˜Eð/ð 	˜ð/ð 	 ð/ð 	˜tð/ð 	! $ð/ð 	˜Dð/ð  	˜dð!/ð" 	˜dð#/ð$ 	˜Tð%/ð /Ðð ð ð ñ ð. !%Ø"Ø"&Ø#'Ø*-Ø%(ð7ð 7ð 7ð 7ð 7ð4 ðð ð ð ñ „[ðð*ð ð ð ðBð ð ð ð ð r    r4   )r   Ú
__future__r   Údataclassesr   r   ry   Útypingr   r   r   r	   r
   r   r   r#   r4   r   r    r!   ú<module>r¨      s  ððð ð& #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð Oð Oð Oð Oð Oñ Oô Oð Oð Oð Or    