
    @i.                         S r SSKrSSKrSSKJrJrJrJr  SSKr	SSK
Jr  SSKJr  SSKJr  \R                   " \5      r " S S5      rg)	z/Service layer for encapsulating business logic.    N)DictAnyOptionalList)PipelineManager)MemoryStore)PatternEmbedderc                      \ rS rSrSrS\4S jrSS\S\\	   S\
\\4   4S	 jjrS
\	S\S\S\
\\4   4S jr  S S\	S\S\	S\S\
\\4   4
S jjrS\
\\4   4S jrS\
\\4   S\
\\4   4S jrS\
\\4   S\
\\4   4S jrS\S\4S jrS\S\	S\
\\4   4S jrS\S\
\\\   4   S\
\\4   4S jrS\S\
\\4   4S jrSrg)!
WebService   zService layer for web API.managerc                 L    Xl         [        5       U l        [        5       U l        g)zEInitialize web service.

Args:
    manager: PipelineManager instance
N)r   r   memoryr	   embedder)selfr   s     ?   /home/ubuntu/codebase/yexijia/保研/iCoLoc/src/web/services.py__init__WebService.__init__   s     !m')    Nqueryiteration_roundsreturnc                      U R                   R                  XS9nU R                  U5      nSU;   a  UR                  S5      US'   U$ ! [         a  n[
        R                  SU 3SS9  e SnAff = f)zExecute a query and return results.

Args:
    query: Natural language query string
    iteration_rounds: Optional number of iteration rounds (Stage4)
    
Returns:
    Dictionary containing query results
)r   extracted_parametersparamszError processing query: Texc_infoN)r   process_query_clean_resultpop	Exceptionloggererrorr   r   r   resultcleaned_resultes         r   	run_queryWebService.run_query   s}    
	\\///YF!//7N%7+9+=+=>T+Ux(!! 	LL3A37$LG	s   AA 
A/A**A/
pattern_idpatternfeedbackc                     U R                   R                  nU R                  R                  U5      nUS:X  a  U R                  R                  XE5        O0US:X  a  U R                  R                  XE5        O[        SU 35      eU R                  R                  U5      n[        UR                  S/ 5      5      n[        UR                  S/ 5      5      nSSU 3UUS.$ ! [         a  n	[        R                  SU	 3SS	9  e S
n	A	ff = f)zAdd user feedback for a pattern.

Args:
    pattern_id: Pattern identifier
    pattern: Pattern content (list of feature types)
    feedback: "positive" or "negative"
    
Returns:
    Dictionary with feedback status and counts
positivenegativezInvalid feedback type: okzFeedback saved: )statusmessagepositive_countnegative_countzError adding feedback: Tr   N)r   stage3_user_idr   encode_patternr   add_positiveadd_negative
ValueErrorget_user_profilelengetr!   r"   r#   )
r   r*   r+   r,   user_idpattern_vecuser_profiler3   r4   r'   s
             r   add_feedbackWebService.add_feedback2   s   	ll11G --66w?K :%((>Z'((> #:8*!EFF  ;;77@L !1!1*b!ABN !1!1*b!ABN -hZ8"0"0	   	LL21#6LF	s   CC   
D*DDepochslearning_rate
batch_sizemarginc                     U R                   R                  (       d  SS/ SS.$ U R                   R                  (       d  SS/ SS.$ U R                   R                  c  SS/ SS.$ SSKJn  UR                  U R                   R                  R                  R                  5       US9U R                   R                  l	        U R                   R                  R                  UUU R                   R                  S	9nU R                  R                  U R                   R                  5      nU(       a;  [        UR!                  S
/ 5      5      n[        UR!                  S/ 5      5      n	X-   n
OSn
U R                   R#                  XU5        [%        U R                   S5      (       GaP  [&        R(                  R+                  U R                   R                  5      (       Ga   SSKJn  SSKnSn[3        USSS9 nUR5                  U5      nSSS5        U R6                  R                  R9                  5       nWR!                  S0 5      R!                  SS5      nU" UUS9U R                   l        SSKnUR?                  U R                   R                  SS9nU R                   R:                  RA                  US   5        U R                   R:                  RC                  5         [D        RG                  S5        SSUR!                  S/ 5      US.$ ! , (       d  f       GN= f! [H         a"  n[D        RK                  SU 35         SnANPSnAff = f! [H         a1  n[D        RM                  SU 3SS 9  S[O        U5      / SS.s SnA$ SnAff = f)!zRun preference model training.

Args:
    epochs: Number of training epochs
    learning_rate: Learning rate
    batch_size: Batch size
    margin: Margin for triplet loss
    
Returns:
    Dictionary with training status and loss history
r#   zStage3 is not enabledr   )r1   r2   loss_historyrB   z#Contrastive learning is not enabledNzTrainer is not initialized)lr)rB   rD   	save_pathr.   r/   stage3_model_path)PreferenceEncoderzconfig/config.yamlrutf-8encodingstage3
hidden_dim   )	input_dimrQ   cpu)map_locationmodel_state_dictz(Preference model reloaded after trainingz#Failed to reload preference model: r0   zTraining completed successfullylosszError during training: Tr   )(r   stage3_enabledstage3_use_contrastivetrainertorch.optimoptimAdammodel
parameters	optimizertrainrJ   r   r:   r5   r;   r<   _save_training_historyhasattrospathexistsembedding.encoderrK   yamlopen	safe_loadr    get_sentence_embedding_dimensionpreference_modeltorchloadload_state_dictevalr"   infor!   warningr#   str)r   rB   rC   rD   rE   r\   historyr?   r3   r4   total_feedbackrK   rh   config_pathfconfigrS   rQ   rm   
checkpointr'   s                        r   run_trainingWebService.run_trainingZ   s   Y	<<..%6$&	  <<66%D$&	  ||##+%;$&	  (-2ZZ$$**557  .8 .DLL  * ll**00%,,88 1 G  ;;778S8STL!$\%5%5j"%E!F!$\%5%5j"%E!F!/!@!" LL//P t||%899bggnnT\\MkMk>l>lNC"6Kk3AQ!%!2 B $ 3 3 T T VI!'Hb!9!=!=lC!PJ4E"+#-5DLL1
 !!&DLL,J,JY^!_JLL11AA*M_B`aLL11668KK JK
 < 'FB 7 	 # BA ! NNN%H#LMMN  	LL21#6LF!q6 "	 	sr   !M !M M $E8M L 4L
C-L 3M 

LL 
M&M>M MM 
N&N;NNc                 6   SSK nSSKnSnUR                  R                  U5      (       d  S/ 0$  [	        USSS9 nUR                  U5      nSSS5        U$ ! , (       d  f       W$ = f! [         a%  n[        R                  SU 3S	S
9  S/ 0s SnA$ SnAff = f)zUGet training history from logs.

Returns:
    Dictionary containing training history
r   Nzlogs/training_history.json	trainingsrL   rM   rN   z Error reading training history: Tr   )	jsonrd   re   rf   ri   rn   r!   r"   r#   )r   r~   rd   history_pathrw   datar'   s          r   get_training_historyWebService.get_training_history   s     	3ww~~l++$$	%lC':ayy| ;K ;:K 	%LL;A3?$LO$$	%s:   A) A	A) 
A&!A) &A) )
B3BBBr%   c                 R   0 nUR                  5        H  u  p4[        U[        R                  5      (       a  UR	                  5       X#'   M8  [        U[
        5      (       a  U R                  U5      X#'   Mb  [        U[        5      (       a  U R                  U5      X#'   M  XBU'   M     U$ )zClean result dictionary, converting numpy arrays to lists.

Args:
    result: Raw result dictionary
    
Returns:
    Cleaned result dictionary
	items
isinstancenpndarraytolistdict_clean_dictlist_clean_list)r   r%   cleanedkeyvalues        r   r   WebService._clean_result   s      ,,.JC%,,$||~E4((#//6E4((#//6$ ) r   dc                 R   0 nUR                  5        H  u  p4[        U[        R                  5      (       a  UR	                  5       X#'   M8  [        U[
        5      (       a  U R                  U5      X#'   Mb  [        U[        5      (       a  U R                  U5      X#'   M  XBU'   M     U$ )zRecursively clean dictionary.r   )r   r   r   kvs        r   r   WebService._clean_dict   s    GGIDA!RZZ((XXZ
At$$!--a0
At$$!--a0

  r   lc                    / nU H  n[        U[        R                  5      (       a!  UR                  UR	                  5       5        MC  [        U[
        5      (       a"  UR                  U R                  U5      5        Mz  [        U[        5      (       a"  UR                  U R                  U5      5        M  UR                  U5        M     U$ )zRecursively clean list.)	r   r   r   appendr   r   r   r   r   )r   r   r   items       r   r   WebService._clean_list   s    D$

++t{{}-D$''t//56D$''t//56t$  r   c                      U R                   R                  X5      nU R                  U5      nU$ ! [         a  n[        R                  SU 3SS9  e SnAff = f)zStart an interactive iteration session (Stage4).

Args:
    query: User query
    iteration_rounds: Number of iteration rounds
    
Returns:
    Dictionary containing session_id and first round results
zError starting iteration: Tr   N)r   start_iterationr   r!   r"   r#   r$   s         r   r   WebService.start_iteration  s\    	\\11%JF!//7N!! 	LL5aS9DLI	   -0 
AAA
session_idc                      U R                   R                  X5      nU R                  U5      nU$ ! [         a  n[        R                  SU 3SS9  e SnAff = f)zProcess feedback, train model, and return next iteration round (Stage4).

Args:
    session_id: Iteration session ID
    feedback: Dictionary with 'positive' and 'negative' pattern lists
    
Returns:
    Dictionary containing next round results
zError in next iteration: Tr   N)r   next_iterationr   r!   r"   r#   )r   r   r,   r%   r&   r'   s         r   r   WebService.next_iteration  s\    	\\00FF!//7N!! 	LL4QC84LH	r   c                      U R                   R                  U5      nU R                  U5      nU$ ! [         a  n[        R                  SU 3SS9  e SnAff = f)zGet final results after all iterations (Stage4).

Args:
    session_id: Iteration session ID
    
Returns:
    Dictionary containing final results and explanation
zError finalizing iteration: Tr   N)r   finalize_iterationr   r!   r"   r#   )r   r   r%   r&   r'   s        r   r   WebService.finalize_iteration,  s\    	\\44Z@F!//7N!! 	LL7s;dLK	r   )r   r   r   )N)
   gMbP?    g333333?)__name__
__module____qualname____firstlineno____doc__r   r   rs   r   intr   r   r(   r   r@   floatrz   r   r   r   r   r   r   r   r   __static_attributes__ r   r   r   r      s   $* *s hsm tTWY\T\~ ,&s &T &S &TRUWZRZ^ &P EJ:=f3 fE f #f27fBFsCx.fP%d38n %*DcN tCH~ *T#s(^ S#X T d S C DcN $ S$s)^8L QUVY[^V^Q_ $S T#s(^ r   r   )r   loggingrd   typingr   r   r   r   numpyr   controller.managerr   memory.storer   learning.embedderr	   	getLoggerr   r"   r   r   r   r   <module>r      s<    5  	 , ,  . $ -			8	$l lr   