
    #i                     h    S r SSKrSSKrSSKrSSKJrJr  \R                  " \5      r	 " S S5      r
g)zGPreference parser for converting LLM output into structured parameters.    N)DictAnyc                       \ rS rSrSrSSSSS.rSS	\\\4   4S
 jjr	SS	\\\4   S\\\4   4S jjr
S\S\\\4   4S jrS\S\4S jrS\S\\\4   4S jrS\\\4   S\\\4   4S jrSrg)PreferenceParser   z?Parser for extracting structured parameters from LLM responses.g333333?   
confidenceg      ?)min_participationmax_pattern_sizeprioritymin_confidenceNdefault_paramsc                 0    U R                  U5      U l        g)z_Initialize parser with default parameters.

Args:
    default_params: Default parameter values
N)_normalize_default_paramsr   )selfr   s     D   /home/ubuntu/codebase/yexijia/保研/iCoLoc/src/preference/parser.py__init__PreferenceParser.__init__   s     #<<^L    returnc                     U R                   R                  5       nU(       d  U$ SSSSS.nUR                  5        H  u  pEUR                  XD5      nXRU'   M     U$ )z0Normalize config defaults to parser schema keys.r
   r   r   r   )default_min_participationdefault_max_pattern_sizedefault_prioritydefault_min_confidence)DEFAULT_PARAMScopyitemsget)r   r   
normalizedkey_mappingkeyvalue
target_keys          r   r   *PreferenceParser._normalize_default_params   si    ((--/
 *=(: *&6	
 )..0JC$2J%*z" 1 r   textc                 8   U R                  U5      nU(       a(   [        R                  " U5      nU R                  U5      $ U R                  U5      nU R                  U5      $ ! [        R                   a"  n[
        R                  SU 35         SnANSSnAff = f)zParse LLM output into structured parameters.

Args:
    text: Raw LLM response text
    
Returns:
    Dictionary with parsed parameters
zJSON decode error: N)_extract_jsonjsonloads_validate_and_fill_defaultsJSONDecodeErrorloggerwarning_extract_with_regex)r   r&   
json_matchparamses        r   parse_preference!PreferenceParser.parse_preference0   s     ''-
:J/77??
 ))$///77 '' :!4QC899:s   &A# #B7BBc                     Sn[         R                  " X![         R                  5      nU H  n [        R                  " U5        Us  $    g! [        R
                   a     M8  f = f)zdExtract JSON from text.

Args:
    text: Input text
    
Returns:
    Extracted JSON string or None
z\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}N)refindallDOTALLr)   r*   r,   )r   r&   json_patternmatchesmatchs        r   r(   PreferenceParser._extract_jsonF   s\     :**\;E

5!	   '' s   AA#"A#c                   ^ 0 n/ SQnU HO  n[         R                  " XA[         R                  5      nU(       d  M1   [        UR	                  S5      5      US'     O   / SQnU HO  n[         R                  " XA[         R                  5      nU(       d  M1   [        UR	                  S5      5      US'     O   SS/n/ SQ/ S	Q/ S
QS.nU H  n[         R                  " XA[         R                  5      nU(       d  M1  UR	                  S5      R                  5       mUR                  5        H&  u  p[        U4S jU
 5       5      (       d  M!  XS'     M     M     U$ ! [
         a     GM\  f = f! [
         a     GM  f = f)z|Extract parameters using regex patterns.

Args:
    text: Input text
    
Returns:
    Dictionary with extracted parameters
)z%min[_\s]*participation[:\s]*([0-9.]+)u   参与率[:\s]*([0-9.]+)zparticipation[:\s]*([0-9.]+)   r
   )z%max[_\s]*pattern[_\s]*size[:\s]*(\d+)u   模式大小[:\s]*(\d+)zpattern[_\s]*size[:\s]*(\d+)u   (\d+)[阶个]r   zpriority[:\s]*["\']?(\w+)["\']?u    优先级[:\s]*["\']?(\w+)["\']?)r	   u	   置信度conf)participationu	   参与率part)sizeu   大小u   规模r	   r@   rB   c              3   ,   >#    U  H	  oT;   v   M     g 7fN ).0kwr#   s     r   	<genexpr>7PreferenceParser._extract_with_regex.<locals>.<genexpr>   s     :2;s   r   )
r6   search
IGNORECASEfloatgroup
ValueErrorintlowerr   any)r   r&   r1   participation_patternspatternr;   size_patternspriority_patternspriority_keywordsr"   keywordsr#   s              @r   r/   $PreferenceParser._extract_with_regex]   sa    "

 .GIIgR]];Eu27A2GF./ .
 %GIIgR]];Eu14U[[^1DF-. % //

 >C0
 )GIIgR]];EuA,,.%6%<%<%>MC::::-0z* &?	 ) O "   " s#   EE*
E'&E'*
E98E9r1   c                    U R                   R                  5       nSU;   a=   [        US   5      nSUs=::  a  S::  a  O  OX2S'   O[        R	                  SU 35         SU;   a=   [        US   5      nSUs=::  a  S::  a  O  OX2S'   O[        R	                  S	U 35         SU;   aC  [        US   5      R                  5       n/ SQnX4;   a  X2S'   U$ [        R	                  SU 35        U$ ! [
        [        4 a    [        R	                  SUS    35         Nf = f! [
        [        4 a    [        R	                  S
US    35         Nf = f)zValidate parameters and fill missing ones with defaults.

Args:
    params: Parsed parameters
    
Returns:
    Validated and complete parameter dictionary
r
   g        g      ?z min_participation out of range: zInvalid min_participation: r   r>      zmax_pattern_size out of range: zInvalid max_pattern_size: r   rC   zInvalid priority: )
r   r   rM   r-   r.   rO   	TypeErrorrP   strrQ   )r   r1   resultvalvalid_prioritiess        r   r+   ,PreferenceParser._validate_and_fill_defaults   sg    $$))+ &(\F#678#$$25./NN%EcU#KL
 'Z&!345>r>14-.NN%DSE#JK
 fZ()//1CF&%(z"  !3C59:/ 	* \!<VDW=X<YZ[\ 	* Z!;FCU<V;WXYZs/   "C, C, %"D D ,+DD+E
E)r   rE   )__name__
__module____qualname____firstlineno____doc__r   r   r]   r   r   r   r3   r(   r/   r+   __static_attributes__rF   r   r   r   r      s    I ! 	NMtCH~ MS#X RVWZ\_W_R` &8S 8T#s(^ 8,# # .> >S#X >@*$sCx. *T#s(^ *r   r   )rf   r)   loggingr6   typingr   r   	getLoggerrb   r-   r   rF   r   r   <module>rk      s0    M   	 			8	$| |r   