§
    �žjj  ã                   óô  — d Z ddlZddlZddlZddlZddlmZmZmZm	Z	  ej
        d¦  «        Zdedeee                  fd„Zdeee                  d	eee                  deee                  fd
„Zdee         dee         deee                  fd„Zdeee                  dee         dee         fd„Zdee         dee         defd„Zdeee                  deee                  fd„Z G d„ d¦  «        ZdS )uD  
Bá»™ NÃ£o ThÃ­ch á»¨ng Trá»±c Tuyáº¿n: Contextual Bandit (LinUCB with Online Learning)
Ra quyáº¿t Ä‘á»‹nh hÃ nh Ä‘á»™ng tá»‘i Æ°u trong chiáº¿n Ä‘áº¥u vÃ  tá»± há»�c qua tá»«ng tráº£i nghiá»‡m thá»±c chiáº¿n.
Thiáº¿t káº¿ thuáº§n Python 3.11 (Zero Dependency / No NumPy required) Ä‘áº£m báº£o siÃªu nháº¹ vÃ  khÃ´ng crash.
é    N)ÚDictÚListÚOptionalÚTupleÚContextualBanditÚdÚreturnc                 ó:   ‡ — ˆ fd„t          ‰ ¦  «        D ¦   «         S )Nc                 óH   •‡— g | ]Šˆfd „t          ‰¦  «        D ¦   «         ‘ŒS )c                 ó$   •— g | ]}‰|k    rd nd‘ŒS ©ç      ð?ç        © ©Ú.0ÚjÚis     €ú9C:\Projects\AutoPOE2\src\agentic_engine\bandit_advisor.pyú
<listcomp>z/_create_identity.<locals>.<listcomp>.<listcomp>   s%   ø€ Ð6Ð6Ð6¨�A˜’F�FˆSˆS Ð6Ð6Ð6ó    ©Úrange)r   r   r   s    @€r   r   z$_create_identity.<locals>.<listcomp>   s5   øø€ ÐIÐIÐI¸1Ð6Ð6Ð6Ð6­U°1©X¬XÐ6Ñ6Ô6ÐIÐIÐIr   r   ©r   s   `r   Ú_create_identityr      s#   ø€ ØIÐIÐIÐIÅÀaÁÄÐIÑIÔIÐIr   ÚAÚBc                 ó`   ‡ ‡‡— t          ‰ ¦  «        Šˆ ˆˆfd„t          ‰¦  «        D ¦   «         S )Nc                 óL   •‡— g | ]Šˆˆˆfd „t          ‰¦  «        D ¦   «         ‘Œ S )c                 óJ   •— g | ]}‰‰         |         ‰‰         |         z   ‘Œ S r   r   )r   r   r   r   r   s     €€€r   r   z'_mat_add.<locals>.<listcomp>.<listcomp>   s.   ø€ Ð1Ð1Ð1 1ˆQˆqŒT�!ŒW�q˜”t˜A”wÑÐ1Ð1Ð1r   r   )r   r   r   r   r   s    @€€€r   r   z_mat_add.<locals>.<listcomp>   s;   øø€ ÐDÐDÐD°aÐ1Ð1Ð1Ð1Ð1Ð1­¨a©¬Ð1Ñ1Ô1ÐDÐDÐDr   ©Úlenr   )r   r   r   s   ``@r   Ú_mat_addr#      ó6   øøø€ ÝˆA‰Œ€AØDÐDÐDÐDÐDÐD½5À¹8¼8ÐDÑDÔDÐDr   ÚxÚyc                 ó`   ‡ ‡‡— t          ‰ ¦  «        Šˆˆ ˆfd„t          ‰¦  «        D ¦   «         S )Nc                 óL   •‡— g | ]Šˆˆˆfd „t          ‰¦  «        D ¦   «         ‘Œ S )c                 ó2   •— g | ]}‰‰         ‰|         z  ‘ŒS r   r   )r   r   r   r%   r&   s     €€€r   r   z-_outer_product.<locals>.<listcomp>.<listcomp>   s%   ø€ Ð+Ð+Ð+˜QˆQˆqŒT�A�a”D‰[Ð+Ð+Ð+r   r   )r   r   r   r%   r&   s    @€€€r   r   z"_outer_product.<locals>.<listcomp>   s;   øø€ Ð>Ð>Ð>°Ð+Ð+Ð+Ð+Ð+Ð+¥%¨¡(¤(Ð+Ñ+Ô+Ð>Ð>Ð>r   r!   )r%   r&   r   s   ``@r   Ú_outer_productr*      s6   øøø€ ÝˆA‰Œ€AØ>Ð>Ð>Ð>Ð>Ð>µU¸1±X´XÐ>Ñ>Ô>Ð>r   c                 ó`   ‡ ‡‡— t          ‰ ¦  «        Šˆ ˆˆfd„t          ‰¦  «        D ¦   «         S )Nc                 óf   •‡— g | ],Št          ˆˆˆfd „t          ‰¦  «        D ¦   «         ¦  «        ‘Œ-S )c              3   óF   •K  — | ]}‰‰         |         ‰|         z  V — Œd S ©Nr   )r   r   r   r   r%   s     €€€r   ú	<genexpr>z*_mat_vec_mul.<locals>.<listcomp>.<genexpr>    s3   øè è € Ð1Ð1 1��!”�Q”˜!˜Aœ$‘Ð1Ð1Ð1Ð1Ð1Ð1r   )Úsumr   )r   r   r   r   r%   s    @€€€r   r   z _mat_vec_mul.<locals>.<listcomp>    sC   øø€ ÐDÐDÐD°a�CÐ1Ð1Ð1Ð1Ð1Ð1­¨a©¬Ð1Ñ1Ô1Ñ1Ô1ÐDÐDÐDr   r!   )r   r%   r   s   ``@r   Ú_mat_vec_mulr1      r$   r   c                 óP   — t          d„ t          | |¦  «        D ¦   «         ¦  «        S )Nc              3   ó&   K  — | ]\  }}||z  V — Œd S r.   r   )r   ÚaÚbs      r   r/   z_vec_dot.<locals>.<genexpr>$   s*   è è € Ð+Ð+™˜˜Aˆq�1‰uÐ+Ð+Ð+Ð+Ð+Ð+r   )r0   Úzip)r%   r&   s     r   Ú_vec_dotr7   #   s'   € ÝÐ+Ð+¥ Q¨¡¤Ð+Ñ+Ô+Ñ+Ô+Ð+r   c           	      ó*  ‡	— t          | ¦  «        Š	ˆ	fd„t          | ¦  «        D ¦   «         }t          ‰	¦  «        D �]J}|}t          ||         |         ¦  «        }t          |dz   ‰	¦  «        D ]>}t          ||         |         ¦  «        |k    rt          ||         |         ¦  «        }|}Œ?|dk     r||         |xx         dz  cc<   ||k    r||         ||         c||<   ||<   ||         |         }t          d‰	z  ¦  «        D ]}||         |xx         |z  cc<   Œt          ‰	¦  «        D ]V}||k    rN||         |         }|dk    r:t          d‰	z  ¦  «        D ]'}||         |xx         |||         |         z  z  cc<   Œ(ŒW�ŒLˆ	fd„|D ¦   «         S )u`   Ä�áº£o ma tráº­n kÃ­ch thÆ°á»›c nhá»� báº±ng phÆ°Æ¡ng phÃ¡p Gauss-Jordan vá»›i Partial Pivoting.c                 ód   •‡— g | ]+\  Š}|d d …         ˆfd„t          ‰¦  «        D ¦   «         z   ‘Œ,S )Nc                 ó$   •— g | ]}‰|k    rd nd‘ŒS r   r   r   s     €r   r   z-_invert_matrix.<locals>.<listcomp>.<listcomp>*   s%   ø€ Ð>Ð>Ð>°˜A šF˜F�S�S¨Ð>Ð>Ð>r   r   )r   Úrowr   Úns     @€r   r   z"_invert_matrix.<locals>.<listcomp>*   sF   øø€ Ð
ZÐ
ZÐ
ZÁ6À1Àcˆ3ˆqˆqˆqŒ6Ð>Ð>Ð>Ð>µU¸1±X´XÐ>Ñ>Ô>Ñ>Ð
ZÐ
ZÐ
Zr   é   gê-�™—q=gñhãˆµøä>é   r   c                 ó$   •— g | ]}|‰d …         ‘ŒS r.   r   )r   r;   r<   s     €r   r   z"_invert_matrix.<locals>.<listcomp>E   s!   ø€ Ð#Ð#Ð#˜ˆC���ŒGÐ#Ð#Ð#r   )r"   Ú	enumerater   Úabs)
r   ÚaugÚcolÚ	pivot_rowÚmax_valÚrÚpivotÚcÚfactorr<   s
            @r   Ú_invert_matrixrJ   '   sÔ  ø€ åˆA‰Œ€AØ
ZÐ
ZÐ
ZÐ
ZÍYÐWXÉ\Ì\Ð
ZÑ
ZÔ
Z€Cå�Q‰xŒxð :ñ :ˆØˆ	Ý�c˜#”h˜s”mÑ$Ô$ˆÝ�s˜Q‘w Ñ"Ô"ð 	ð 	ˆAÝ�3�q”6˜#”;ÑÔ 'Ò)Ð)Ý˜c !œf SœkÑ*Ô*�Ø�	øà�UŠ?ˆ?Ø�ŒH�SˆMˆMŒM˜TÑ!ˆMˆM‰Mà˜ÒÐØ'*¨9¤~°s¸3´xÐ$ˆC�‰H�c˜)‘nà�C”˜”ˆÝ�q˜1‘u‘”ð 	!ð 	!ˆAØ�ŒH�QˆKˆKŒK˜5Ñ ˆKˆK‰KˆKå�q‘”ð 	:ð 	:ˆAØ�CŠxˆxØ˜Qœ œ�Ø˜S’=�=Ý" 1 q¡5™\œ\ð :ð :˜Ø˜Aœ˜q˜	˜	œ	 V¨c°#¬h°q¬kÑ%9Ñ9˜	˜	™	˜	øñ	:ð $Ð#Ð#Ð#˜sÐ#Ñ#Ô#Ð#r   c                   ó  — e Zd ZdZg d¢Z	 	 	 	 d#deee                  ded	e	d
efd„Z
de	de	dede	de	dede	de	dee	         fd„Zdee	         deee	eee	f         f         fd„Zdedee	         de	ddfd„Zdede	de	dedede	fd „Zd$d!„Zd$d"„ZdS )%ÚLinUCBTacticalAdvisoruk   
    Bá»™ thuáº­t toÃ¡n Contextual Bandit theo trÆ°á»�ng phÃ¡i LinUCB (Linear Upper Confidence Bound).
    )ÚAGGRESSIVE_BURSTÚKITE_STABILIZEÚRETREAT_SAFEÚEMERGENCY_PORTALÚLOOT_WINDOWNé   çš™™™™™é?úcaptures/bandit_model.jsonÚactionsÚfeature_dimÚalphaÚ
model_pathc                 óä   ‡ — |p‰ j         ‰ _        |‰ _        |‰ _        |‰ _        ˆ fd„‰ j        D ¦   «         ‰ _        ˆ fd„‰ j        D ¦   «         ‰ _        d‰ _        ‰                      ¦   «          d S )Nc                 ó:   •— i | ]}|t          ‰j        ¦  «        “ŒS r   )r   r   ©r   r4   Úselfs     €r   ú
<dictcomp>z2LinUCBTacticalAdvisor.__init__.<locals>.<dictcomp>a   s'   ø€ Ð/bÐ/bÐ/bÐPQ°Õ3CÀDÄFÑ3KÔ3KÐ/bÐ/bÐ/br   c                 ó(   •— i | ]}|d g‰j         z  “ŒS )r   r   r[   s     €r   r]   z2LinUCBTacticalAdvisor.__init__.<locals>.<dictcomp>b   s#   ø€ Ð)RÐ)RÐ)RÀ¨!¨c¨U°T´V©^Ð)RÐ)RÐ)Rr   r   )	ÚDEFAULT_ACTIONSrU   r   rW   rX   r   r5   Údecision_countÚ_load_model)r\   rU   rV   rW   rX   s   `    r   Ú__init__zLinUCBTacticalAdvisor.__init__U   s…   ø€ ð Ð6 $Ô"6ˆŒØˆŒØˆŒ
Ø$ˆŒà/bÐ/bÐ/bÐ/bÐUYÔUaÐ/bÑ/bÔ/bˆŒØ)RÐ)RÐ)RÐ)RÀTÄ\Ð)RÑ)RÔ)RˆŒØˆÔØ×ÒÑÔÐÐÐr   Úhp_pctÚes_pctÚmonster_countÚboss_poise_pctÚflask_charges_pctÚmap_tierÚ
recent_dpsÚdamage_taken_rater	   c	                 óú   — dt           dt           fd„}	 |	|dz  ¦  «         |	|dz  ¦  «         |	|dz  ¦  «         |	|dz  ¦  «         |	|dz  ¦  «         |	|dz  ¦  «         |	|dz  ¦  «         |	|dz  ¦  «        gS )NÚvr	   c           	      óX   — t          dt          dt          | ¦  «        ¦  «        ¦  «        S )Nr   r   )ÚmaxÚminÚfloat)rl   s    r   Úclampz4LinUCBTacticalAdvisor.extract_context.<locals>.clampq   s"   € Ý�s�C ¥U¨1¡X¤XÑ.Ô.Ñ/Ô/Ð/r   g      Y@g      4@g      0@g     jè@)rp   )
r\   rc   rd   re   rf   rg   rh   ri   rj   rq   s
             r   Úextract_contextz%LinUCBTacticalAdvisor.extract_contextf   s¿   € ð	0•Uð 	0�uð 	0ð 	0ð 	0ð 	0ð ˆE�&˜5‘.Ñ!Ô!ØˆE�&˜5‘.Ñ!Ô!ØˆE�- $Ñ&Ñ'Ô'ØˆE�. 5Ñ(Ñ)Ô)ØˆEÐ# eÑ+Ñ,Ô,ØˆE�(˜T‘/Ñ"Ô"ØˆE�*˜wÑ&Ñ'Ô'ØˆEÐ# eÑ+Ñ,Ô,ð	
ð 		
r   Úcontext_vectorc                 óÜ  — | j         d         }t          d¦  «         }i }| j         D ]±}t          | j        |         ¦  «        }t	          || j        |         ¦  «        }t          ||¦  «        }t	          ||¦  «        }	t          dt          ||	¦  «        ¦  «        }
|| j        t          j
        |
¦  «        z  z   }t          |d¦  «        ||<   ||k    r|}|}Œ²| xj        dz  c_        |||fS )Nr   Úinfr   é   r=   )rU   rp   rJ   r   r1   r5   r7   rn   rW   ÚmathÚsqrtÚroundr`   )r\   rs   Úbest_actionÚ	max_scoreÚscoresÚactionÚA_invÚthetaÚmean_rewardÚA_inv_xÚvarianceÚ	ucb_scores               r   Úrecommend_actionz&LinUCBTacticalAdvisor.recommend_action   sô   € Ø”l 1”oˆÝ˜5‘\”\�Mˆ	Ø#%ˆà”lð 	%ð 	%ˆFÝ" 4¤6¨&¤>Ñ2Ô2ˆEÝ  ¨¬¨v¬Ñ7Ô7ˆEå" 5¨.Ñ9Ô9ˆKÝ" 5¨.Ñ9Ô9ˆGÝ˜3¥¨¸Ñ AÔ AÑBÔBˆHØ# d¤jµ4´9¸XÑ3FÔ3FÑ&FÑFˆIå" 9¨aÑ0Ô0ˆF�6‰NØ˜9Ò$Ð$Ø%�	Ø$�øàÐÔ˜qÑ ÐÔØ˜I vÐ-Ð-r   r}   Úrewardc                 ó@  — || j         vrd S t          ||¦  «        }t          | j         |         |¦  «        | j         |<   t          | j        ¦  «        D ]&}| j        |         |xx         |||         z  z  cc<   Œ'| j        dz  dk    r|                      ¦   «          d S d S )Né   r   )r   r*   r#   r   r   r5   r`   Ú_save_model)r\   r}   rs   r…   Úouterr   s         r   Úupdate_feedbackz%LinUCBTacticalAdvisor.update_feedback•   s·   € Ø˜œÐÐØˆFå˜~¨~Ñ>Ô>ˆÝ! $¤&¨¤.°%Ñ8Ô8ˆŒˆv‰å�t”v‘”ð 	<ð 	<ˆAØŒF�6ŒN˜1ÐÐÔ ¨.¸Ô*;Ñ!;Ñ;ÐÐÑÐàÔ Ñ# qÒ(Ð(Ø×ÒÑÔÐÐÐð )Ð(r   Úaction_takenÚ
hp_end_pctÚdamage_dealtÚmonsters_clearedÚis_player_slainc                 óö   — |rdS d}|dk    r|dz  }n|dk     r|dz  }|t          d|dz  ¦  «        z  }|t          d|dz  ¦  «        z  }|d	k    r|d
k    r|dz  }n|dv r|dk    r|dz  }t          |d¦  «        S )Ng      .Àr   g     €Q@g      ø?g      >@g       @g      à?g     ˆÓ@rM   g      I@r   )rN   rO   g      D@rS   é   )ro   ry   )r\   r‹   rŒ   r�   rŽ   r�   r…   s          r   Úcompute_combat_rewardz+LinUCBTacticalAdvisor.compute_combat_reward¢   sÄ   € ð ð 	Ø�5àˆØ˜ÒÐØ�c‰MˆFˆFØ˜$ÒÐØ�c‰MˆFà•#�cÐ+¨cÑ1Ñ2Ô2Ñ2ˆØ•#�c˜<¨'Ñ1Ñ2Ô2Ñ2ˆàÐ-Ò-Ð-°*¸tÒ2CÐ2CØ�c‰MˆFˆFØÐ?Ð?Ð?ÀJÐRVÒDVÐDVØ�c‰MˆFå�V˜QÑÔÐr   c                 ó¦  — t          j        t           j                             | j        ¦  «        pdd¬¦  «         	 | j        | j        | j        | j        dœ}t          | j        dd¬¦  «        5 }t          j        ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r(}t                               d|› �¦  «         Y d }~d S d }~ww xY w)	Nú.T)Úexist_ok)r`   rU   r   r5   Úwúutf-8©Úencodingu%   [ContextualBandit] Lá»—i lÆ°u model: )ÚosÚmakedirsÚpathÚdirnamerX   r`   rU   r   r5   ÚopenÚjsonÚdumpÚ	ExceptionÚloggerÚerror)r\   ÚdataÚfÚes       r   rˆ   z!LinUCBTacticalAdvisor._save_model½   s/  € Ý
Œ•B”G—O’O D¤OÑ4Ô4Ð;¸ÀdÐKÑKÔKÐKð
	Fà"&Ô"5Øœ<Ø”VØ”Vð	ð ˆDõ �d”o s°WÐ=Ñ=Ô=ð #ÀÝ”	˜$ Ñ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #øåð 	Fð 	Fð 	FÝ�LŠLÐDÀÐDÐDÑEÔEÐEÐEÐEÐEÐEÐEÐEøøøøð	Føøøs;   ¼2B Á.BÂB ÂBÂB ÂBÂB Â
CÂ(CÃCc                 óJ  — t           j                             | j        ¦  «        rþ	 t	          | j        dd¬¦  «        5 }t          j        |¦  «        }|                     dd¦  «        | _        | j	        D ]^}||                     di ¦  «        v r|d         |         | j
        |<   ||                     di ¦  «        v r|d         |         | j        |<   Œ_	 d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r(}t                               d|› �¦  «         Y d }~d S d }~ww xY wd S )	NrF   r—   r˜   r`   r   r   r5   u'   [ContextualBandit] Lá»—i Ä‘á»�c model: )rš   rœ   ÚexistsrX   rž   rŸ   ÚloadÚgetr`   rU   r   r5   r¡   r¢   r£   )r\   r¥   r¤   r4   r¦   s        r   ra   z!LinUCBTacticalAdvisor._load_modelË   sŠ  € ÝŒ7�>Š>˜$œ/Ñ*Ô*ð 	Lð
LÝ˜$œ/¨3¸ÐAÑAÔAð 5ÀQÝœ9 Q™<œ<�DØ*.¯(ª(Ð3CÀQÑ*GÔ*G�DÔ'Ø!œ\ð 5ð 5˜Ø §¢¨¨bÑ 1Ô 1Ð1Ð1Ø(,¨S¬	°!¬˜DœF 1™IØ §¢¨¨bÑ 1Ô 1Ð1Ð1Ø(,¨S¬	°!¬˜DœF 1™Iøð	5ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð 5ð 5øõ ð Lð Lð LÝ—’ÐJÀqÐJÐJÑKÔKÐKÐKÐKÐKÐKÐKÐKøøøøðLøøøð	Lð 	Ls;   ¦C. ½BC!ÃC. Ã!C%Ã%C. Ã(C%Ã)C. Ã.
D Ã8DÄD )NrR   rS   rT   )r	   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r_   r   r   ÚstrÚintrp   rb   rr   r   r   r„   rŠ   Úboolr’   rˆ   ra   r   r   r   rL   rL   H   sê  € € € € € ðð ðð ð €Oð (,ØØØ6ðð à˜$˜sœ)Ô$ðð ðð ð	ð
 ðð ð ð ð"
àð
ð ð
ð ð	
ð
 ð
ð !ð
ð ð
ð ð
ð !ð
ð 
ˆeŒð
ð 
ð 
ð 
ð2.¨t°E¬{ð .¸uÀSÈ%ÐQUÐVYÐ[`ÐV`ÔQaÐEaÔ?bð .ð .ð .ð .ð, cð ¸4À¼;ð ÐPUð ÐZ^ð ð ð ð ð àð ð ð ð ð	 ð
 ð ð ð ð 
ð ð  ð  ð  ð6Fð Fð Fð FðLð Lð Lð Lð Lð Lr   rL   )r®   rŸ   Úloggingrw   rš   Útypingr   r   r   r   Ú	getLoggerr¢   r°   rp   r   r#   r*   r1   r7   rJ   rL   r   r   r   ú<module>rµ      s  ððð ð €€€Ø €€€Ø €€€Ø 	€	€	€	Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à	ˆÔ	Ð-Ñ	.Ô	.€ðJ˜ð J  T¨%¤[Ô 1ð Jð Jð Jð JðE��T˜%”[Ô!ð E d¨4°¬;Ô&7ð E¸DÀÀeÄÔ<Mð Eð Eð Eð Eð
?�d˜5”kð ? d¨5¤kð ?°d¸4À¼;Ô6Gð ?ð ?ð ?ð ?ð
E�D˜˜eœÔ%ð E¨$¨u¬+ð E¸$¸u¼+ð Eð Eð Eð Eð
,��U”ð ,  U¤ð ,°ð ,ð ,ð ,ð ,ð$�d˜4 œ;Ô'ð $¨D°°e´Ô,=ð $ð $ð $ð $ðBOLð OLð OLð OLð OLñ OLô OLð OLð OLð OLr   