
    iu9                     ~    S r SSKrSSKrSSKJr  SSKJrJrJrJr   SSK	r
Sr " S S5      rg! \ a    SrSr
 Nf = f)	z>JSON-based memory store for user feedback and session history.    N)datetime)DictAnyListOptionalTFc            
       H   \ rS rSrSr  S%S\S\S\4S jjrS\\\4   4S jr	S	\S\4S
 jr
S\\\4   4S jrS\\\4   4S jrS\\\4   4S jrS\S\\\4   S\\\\4      S\\\4   4S jrS\\\\4      4S jrS\S\R$                  4S jrS\S\R$                  4S jrS\S\\\\4      4S jr  S&S\S\\\      S\\\      4S jjrS\S\\\\\   4      4S jrS\S\R$                  S \\\4   4S! jrS\S\\\\4      4S" jrS\S\\\\4      4S# jrS$rg)'MemoryStore   zFJSON-based memory store for storing user feedback and session history.pathuser_memory_pathintent_memory_pathc                    Xl         X l        X0l        [        R                  " [        R                   R                  U5      SS9  [        R                  " [        R                   R                  U5      SS9  [        R                  " [        R                   R                  U5      SS9  [        R                   R                  U5      (       d-  [        USSS9 n[        R                  " S/ 0USSS	9  S
S
S
5        [        R                   R                  U5      (       d+  [        USSS9 n[        R                  " 0 USSS	9  S
S
S
5        [        R                   R                  U5      (       d,  [        USSS9 n[        R                  " 0 USSS	9  S
S
S
5        g
g
! , (       d  f       N= f! , (       d  f       Np= f! , (       d  f       g
= f)zInitialize memory store.

Args:
    path: Path to the JSON file storing history
    user_memory_path: Path to the JSON file storing user vectors
    intent_memory_path: Path to the JSON file storing intent vectors
T)exist_okwutf-8encodingsessions   Findentensure_asciiN)
r   r   r   osmakedirsdirnameexistsopenjsondump)selfr   r   r   fs        ?   /home/ubuntu/codebase/yexijia/保研/iCoLoc/src/memory/store.py__init__MemoryStore.__init__   sD    	 0"4
BGGOOD)D9
BGGOO$45E
BGGOO$67$G ww~~d##dC'2a		:r*AaeL 3 ww~~.//&g>!		"a> ? ww~~011(#@A		"a> A@ 2 32 ?> A@s$   F)F+8F<
F(+
F9<
G
returnc                     [        U R                  SSS9 n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f! [        R                   Gap  nSSKnUR                  [        5      nUR                  SUR                   S35        [        U R                  SSS9 nUR                  5       nSSS5        O! , (       d  f       O= fSSKnUR                  SS	W5      nUR                  S
S	U5      n [        R                  " U5      nSU;   aO  UR                  S/ 5       H9  nSU;   d  M  US    H%  n	[        U	[         5      (       d  M  SU	;   d  M"  U	S	 M'     M;     U R#                  U5        UR%                  S5        Us SnA$ ! [        R                   a    UR'                  S5        S/ 0s s SnA$ f = fSnAff = f)zQLoad history from JSON file.

Returns:
    Dictionary containing session history
rr   r   Nr   zJSON file corrupted at z, attempting to fix...z\"embedding\":\s*[^,\n}]*,?\n? z\"embedding\":\s*\nr   shown_patterns	embeddingzJSON file fixed and savedz/Cannot fix JSON file, returning empty structure)r   r   r   loadJSONDecodeErrorlogging	getLogger__name__warningposreadresubloadsget
isinstancedictsaveinfoerror)
r    r!   er-   loggercontentr3   datasessionpatterns
             r"   r+   MemoryStore.load1   sz   %	(diiw71yy| 877## "	(&&x0FNN4QUUG;QRS diiw71&&( 877 ff>GLGff3RAG(zz'*%#'88J#;+w6+23C+D#-gt#<#<PWAW(/(< ,E $< 		$78'' (NO"B''(?"	(s   A 7	A 
AA A GAG*C;	G
C	1G 5F9FF .FG)G=G>GGGGobjc                    [         (       an  [        U[        R                  5      (       a  UR	                  5       $ [        U[        R
                  [        R                  45      (       a  UR                  5       $ [        U[        5      (       a4  UR                  5        VVs0 s H  u  p#X R                  U5      _M     snn$ [        U[        5      (       a!  U Vs/ s H  o@R                  U5      PM     sn$ U$ s  snnf s  snf )zRecursively clean object to make it JSON serializable.

Args:
    obj: Object to clean
    
Returns:
    JSON-serializable object
)NUMPY_AVAILABLEr7   npndarraytolistintegerfloatingitemr8   items_clean_for_jsonlist)r    rC   kvrK   s        r"   rM   MemoryStore._clean_for_json^   s     ?#rzz**zz|#C"**bkk!:;;xxz!c4  ;>99;G;41A++A..;GGT"";>?34((.3??J H @s   "C;Dr?   c                     U R                  U5      n[        U R                  SSS9 n[        R                  " X#SSS9  SSS5        g! , (       d  f       g= f)zRSave history to JSON file.

Args:
    data: Dictionary containing session history
r   r   r   r   Fr   N)rM   r   r   r   r   )r    r?   cleaned_datar!   s       r"   r9   MemoryStore.savex   sB     ++D1$))S73qIIlaeD 433s   A
Ac                     [        U R                  SSS9 n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f)z\Load user memory (vectors) from JSON file.

Returns:
    Dictionary containing user vectors
r'   r   r   N)r   r   r   r+   )r    r!   s     r"   load_user_memoryMemoryStore.load_user_memory   s0     $''w?199Q< @??s	   6
Ac                     [        U R                  SSS9 n[        R                  " XSSS9  SSS5        g! , (       d  f       g= f)z]Save user memory (vectors) to JSON file.

Args:
    data: Dictionary containing user vectors
r   r   r   r   Fr   N)r   r   r   r   )r    r?   r!   s      r"   save_user_memoryMemoryStore.save_user_memory   s5     $''w?1IIdae< @??s	   6
Aqueryparamspatternsfeedbackc                    U R                  5       n/ nU HS  nUR                  5       nSU;   a  US	 SU;   a   SU;  a  US   (       a  US   SS O/ US'   US	 UR                  U5        MU     0 n	UR                  5        H  u  p[	        U[
        5      (       a  / X'   U H  n[	        U[        5      (       a7  UR                  5       nSU;   a  US	 SU;   a  US	 X   R                  U5        MO  [	        U[
        5      (       a  X   R                  U5        My  X   R                  U5        M     M  XU
'   M     [        R                  " 5       R                  S5      UUUU	S.nUS   R                  U5        U R                  U5        g)	zAdd a new session to history.

Args:
    query: User's query
    params: Extracted mining parameters
    patterns: Patterns shown to user
    feedback: User feedback (like/dislike)
r*   table_instancestable_instances_sampleN   %Y-%m-%d %H:%M:%S)timer[   r\   r)   r^   r   )r+   copyappendrL   r7   rN   r8   r   nowstrftimer9   )r    r[   r\   r]   r^   r?   cleaned_patternsrA   pattern_copycleaned_feedbackkeyvaluerK   	item_copyr@   s                  r"   add_sessionMemoryStore.add_session   s    yy{ G"<<>Ll* - L0+<?dp  rC  eD\J[=\]_^_=`  JLL!9: !23##L1   "..*JC%&&(* %!D!$--$(IIK	&)3 )+ 6,	9 )*; <(-44Y?#D$//(-44T:(-44T: " ).%% +* LLN++,?@.(
 	Z(		$    c                 F    U R                  5       nUR                  S/ 5      $ )z@Get all historical sessions.

Returns:
    List of all sessions
r   )r+   r6   )r    r?   s     r"   get_all_sessionsMemoryStore.get_all_sessions   s      yy{xx
B''rq   user_idvectorc                     U R                  5       nX;  a  / / / S.X1'   [        U[        R                  5      (       a  UR	                  5       OUnX1   S   R                  U5        U R                  U5        g)zAdd a positive (liked) pattern vector to user memory.

Args:
    user_id: User identifier
    vector: Pattern embedding vector
positivenegativehistoryry   NrV   r7   rF   rG   rH   rf   rY   r    ru   rv   memoryvector_lists        r"   add_positiveMemoryStore.add_positive   l     &&( FO *4FBJJ)G)GfmmoV
#**;7f%rq   c                     U R                  5       nX;  a  / / / S.X1'   [        U[        R                  5      (       a  UR	                  5       OUnX1   S   R                  U5        U R                  U5        g)zAdd a negative (disliked) pattern vector to user memory.

Args:
    user_id: User identifier
    vector: Pattern embedding vector
rx   rz   Nr|   r}   s        r"   add_negativeMemoryStore.add_negative   r   rq   c                 D    U R                  5       nUR                  U5      $ )zGet user profile (positive and negative vectors).

Args:
    user_id: User identifier
    
Returns:
    Dictionary with 'positive' and 'negative' lists of vectors, or None if user not found
rV   r6   )r    ru   r~   s      r"   get_user_profileMemoryStore.get_user_profile  s!     &&(zz'""rq   Nlikeddislikedc                     U R                  5       nX;  a  / / S.XA'   U(       a  [        U5      O/ U(       a  [        U5      O/ S.XA   S'   U R                  U5        g)zSave user preference feature names (for preference-weighted scoring, e.g. 2025 adaptive fusion).

Args:
    user_id: User identifier
    liked: List of feature names user likes (e.g. POI types)
    disliked: List of feature names user dislikes
)ry   rz   )likedislikepreference_featuresN)rV   rN   rY   )r    ru   r   r   r~   s        r"   save_preference_features$MemoryStore.save_preference_features  sY     &&( +-2>FO#(DKb)1tH~r2
-. 	f%rq   c                 v    U R                  5       nUR                  U5      nU(       d  gUR                  S5      $ )zGet user preference feature names (for preference-weighted scoring).

Args:
    user_id: User identifier
    
Returns:
    Dict with 'like' and 'dislike' lists of feature names, or None if not set
Nr   r   )r    ru   r~   profiles       r"   get_preference_features#MemoryStore.get_preference_features%  s6     &&(**W%{{011rq   u_llmintent_jsonc                     [         R                  R                  U R                  5      (       a5  [	        U R                  SSS9 n[
        R                  " U5      nSSS5        O0 n[        U[        R                  5      (       a  UR                  5       OUnUU[        R                  " 5       R                  S5      S.WU'   [	        U R                  SSS9 n[
        R                  " XTSS	S
9  SSS5        SSKnUR!                  ["        5      nUR%                  SU 35        g! , (       d  f       N= f! , (       d  f       NM= f! [&         a6  n	SSKnUR!                  ["        5      nUR)                  SU	 3SS9   Sn	A	gSn	A	ff = f)zSave intent vector and intent JSON to intent memory.

Args:
    user_id: User identifier
    u_llm: LLM-generated initial user preference vector
    intent_json: Intent JSON from IntentEncoder
r'   r   r   Nrc   )r   intent
created_atr   r   Fr   r   zSaved intent for user zError saving intent: Texc_info)r   r   r   r   r   r   r+   r7   rF   rG   rH   r   rg   rh   r   r-   r.   r/   r:   	Exceptionr;   )
r    ru   r   r   r!   intent_memory
u_llm_listr-   r=   r<   s
             r"   save_intentMemoryStore.save_intent4  sA   	Eww~~d5566$113IQ$(IIaLM JI !# ,6eRZZ+H+HeJ $%&lln556IJ&M'" d--sWE		-15I F &&x0FKK0	:;+ JI  FE  	E&&x0FLL04tLD	EsI   AE D%A<E D6/5E %
D3/E 6
E E 
F,FFc                     [         R                  R                  U R                  5      (       d  g[	        U R                  SSS9 n[
        R                  " U5      nSSS5        WR                  U5      $ ! , (       d  f       N= f! [         a6  nSSK	nUR                  [        5      nUR                  SU 3SS9   SnAgSnAff = f)	zLoad intent vector and intent JSON for a user.

Args:
    user_id: User identifier
    
Returns:
    Dictionary with 'u_llm' (vector as list) and 'intent' (JSON), or None if not found
Nr'   r   r   r   zError loading intent: Tr   )r   r   r   r   r   r   r+   r6   r   r-   r.   r/   r;   )r    ru   r!   r   r<   r-   r=   s          r"   load_intentMemoryStore.load_intent[  s    	77>>$"9"9::d--sWE $		! F !$$W-- FE
  	&&x0FLL1!5LE		s4   .B B A6B 6
B B 
C,CCc                 r    U R                  5       nUR                  U5      nUc  / $ UR                  S/ 5      $ )zGet iteration round history for a user (for Stage4).

Args:
    user_id: User identifier
    
Returns:
    List of round history dictionaries
roundsr   )r    ru   r~   user_profiles       r"   get_round_historyMemoryStore.get_round_historys  s@     &&(zz'*I "--rq   )r   r   r   )zmemory/history.jsonzmemory/user_memory.jsonzmemory/intent_memory.json)NN)r/   
__module____qualname____firstlineno____doc__strr#   r   r   r+   rM   r9   rV   rY   r   ro   rs   rF   rG   r   r   r   r   r   r   r   r   r   __static_attributes__ rq   r"   r	   r	      s   PRk+F?S ?C ?%(?<+(d38n +(Z3 3 4
Ec3h 
E $sCx.  =T#s(^ =: :d38n :!$sCx.1:=A#s(^:x($tCH~"6 (&C & &,&C & &,
# 
#c3h0H 
# SWBF& &HT#Y<O &,4T#Y,?&$2s 2xS$s)^@T7U 2%E3 %Erzz %ESRUX %EN3 8DcN+C 0. .d38n1E .rq   r	   )r   r   r   r   typingr   r   r   r   numpyrF   rE   ImportErrorr	   r   rq   r"   <module>r      sK    D  	  , ,Or. r.  O	Bs   / 
<<