
    :jL                         d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ  ed      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Zy)z*
Optimization strategies for enumeration.
    N)ListTuple)
get_logger   )CharClassSegment)IOptimizationStrategyrefinec                   j    e Zd ZdZddefdZdee   dee   fdZdedefdZ	dee   de
eef   fd	Zy
)GreedyStrategyz5Greedy strategy: select highest value segments first.max_queriesc                     || _         y Nr   selfr   s     8/root/.openclaw/workspace/harvester/refine/strategies.py__init__zGreedyStrategy.__init__   
    &    segmentsreturnc                    |sg S t        |d d      }g }d}|D ]\  }| j                  |      }|dkD  rt        |j                        |z  nd}||z  | j                  k  r|j                  |       ||z  }\ n |xs |d   gS )z"Select segments greedily by value.c                     | j                   S r   valuess    r   <lambda>z0GreedyStrategy.select_segments.<locals>.<lambda>   
    QWW r   Tkeyreverser   r   )sortedcalculate_depthlencharsetr   append)r   r   sorted_segsselectedtotal_queriessegmentdepthqueriess           r   select_segmentszGreedyStrategy.select_segments   s    I X+<dK " 	G((1E7<qyc'//*e3aGw&$*:*::((	 +KN++r   r+   c                 R    t        |j                        }|dk  ry|dk  ry|dk  ryy)z,Calculate optimal depth for greedy strategy.r   
      $      r%   r&   r   r+   charset_sizes      r   r$   zGreedyStrategy.calculate_depth1   s4    7??+1RRr   c                     d}d}|D ]F  }| j                  |      }|dkD  rt        |j                        |z  nd}||z  }||j                  z  }H ||fS )z)Evaluate combination for greedy strategy.r           r   r$   r%   r&   r   r   r   r*   total_valuer+   r,   r-   s          r   evaluate_combinationz#GreedyStrategy.evaluate_combination>   sk     	)G((1E7<qyc'//*e3aGW$M7==(K		) k))r   Ni __name__
__module____qualname____doc__intr   r   r   r.   r$   r   floatr<    r   r   r   r      sg    ?'C ',-=(> ,4HXCY ,0'7 C *T2B-C *cSXjHY *r   r   c                   j    e Zd ZdZddefdZdee   dee   fdZdedefdZ	dee   de
eef   fd	Zy
)BalancedStrategyz9Balanced strategy: balance between value and query count.r   c                     || _         y r   r   r   s     r   r   zBalancedStrategy.__init__O   r   r   r   r   c                    |sg S g }|D ]z  }| j                  |      }|dkD  rt        |j                        |z  nd}|j                  }|dkD  sE|t	        j
                  t        |d            z  }|j                  |||f       | |j                  d d       g }d}	|D ]0  \  }}}|	|z  | j                  k  r|j                  |       |	|z  }	0 n |r|xs	 |d   d   gS g S )z'Select segments with balanced approach.r   r   r3   c                     | d   S )Nr   rE   )xs    r   r   z2BalancedStrategy.select_segments.<locals>.<lambda>c   s
    1Q4 r   Tr    )
r$   r%   r&   r   mathlogmaxr'   sortr   )
r   r   scored_segmentsr+   r,   r-   r   
efficiencyr)   r*   s
             r   r.   z BalancedStrategy.select_segmentsR   s   I  	GG((1E7<qyc'//*e3aGMME{"TXXc'1o%>>
&&W'EF	G 	> ,; 	(GZw&$*:*::((	 7Fx2OA.q12M2Mr   r+   c                     t        |j                        }|j                  }d}|dkD  rd}n|dk  rd}|dk  rt        |dz   d      S |dk  r|S t	        |dz
  d      S )	zCalculate balanced depth.r3   g?r1   g333333?r   r0      r2   )r%   r&   r   minrN   )r   r+   r6   r   
base_depths        r   r$   z BalancedStrategy.calculate_depthr   sr    7??+ 
3;JS[J 2zA~q))RzA~q))r   c                     d}d}|D ]F  }| j                  |      }|dkD  rt        |j                        |z  nd}||z  }||j                  z  }H || j                  dz  kD  r|dz  }||fS )z,Evaluate combination with balanced approach.r   r8   r   r0   g      ?)r$   r%   r&   r   r   r:   s          r   r<   z%BalancedStrategy.evaluate_combination   s     	)G((1E7<qyc'//*e3aGW$M7==(K		) 4++b003Kk))r   Nr=   r>   rE   r   r   rG   rG   L   sk    C'C 'N-=(> N4HXCY N@*'7 *C *(*T2B-C *cSXjHY *r   rG   c                   j    e Zd ZdZddefdZdee   dee   fdZdedefdZ	dee   de
eef   fd	Zy
)ConservativeStrategyzDConservative strategy: minimize query count while maintaining value.r   c                     || _         y r   r   r   s     r   r   zConservativeStrategy.__init__   r   r   r   r   c                 ,    |sg S t        |d       }|gS )zSelect segments conservatively.c                     | j                   S r   r   r   s    r   r   z6ConservativeStrategy.select_segments.<locals>.<lambda>   s
    177 r   )r!   )rN   )r   r   best_segments      r   r.   z$ConservativeStrategy.select_segments   s!    I 8):;~r   r+   c                 F    t        |j                        }|dk  ry|dk  ryy)zCalculate conservative depth.r0   r3   r2   r   r4   r5   s      r   r$   z$ConservativeStrategy.calculate_depth   +    7??+ 2Rr   c                     t        |      dkD  ry|d   }| j                  |      }|dkD  rt        |j                        |z  nd}|j                  }||fS )z$Evaluate combination conservatively.r   )r   r8   r   )r%   r$   r&   r   )r   r   r+   r,   r-   r   s         r   r<   z)ConservativeStrategy.evaluate_combination   sX    x=11+$$W-3819#goo&%/!~r   Nr=   r>   rE   r   r   rX   rX      sg    N'C '-=(> 4HXCY 
'7 
C 
T2B-C cSXjHY r   rX   c                   j    e Zd ZdZddefdZdee   dee   fdZdedefdZ	dee   de
eef   fd	Zy
)AggressiveStrategyz@Aggressive strategy: maximize coverage with higher query counts.r   c                     || _         y r   r   r   s     r   r   zAggressiveStrategy.__init__   r   r   r   r   c           	      H   |sg S t        |d d      }g }d}t        dt        dt        |      dz               D ]]  }t	        j
                  ||      D ]B  }| j                  t        |            \  }}|| j                  k  s0||kD  s6t        |      }|}D _ |xs |d   gS )zSelect segments aggressively.c                     | j                   S r   r   r   s    r   r   z4AggressiveStrategy.select_segments.<locals>.<lambda>   r   r   Tr    r8   r   rS   r   )	r#   rangerT   r%   	itertoolscombinationsr<   listr   )	r   r   r(   best_combination
best_score
combo_sizecombor-   r   s	            r   r.   z"AggressiveStrategy.select_segments   s    I X+<dK 
3q#k*:Q*>#?@ 	'J"//ZH '!%!:!:4;!Gd...5:3E'+E{$!&J	'	'  3KN#33r   r+   c                 F    t        |j                        }|dk  ry|dk  ryy)zCalculate aggressive depth.r0   rS   r2   r1   r3   r4   r5   s      r   r$   z"AggressiveStrategy.calculate_depth   r^   r   c                     d}d}|D ]F  }| j                  |      }|dkD  rt        |j                        |z  nd}||z  }||j                  z  }H t        |      dkD  r|dz  }||fS )z"Evaluate combination aggressively.r   r8   r   g333333?r9   r:   s          r   r<   z'AggressiveStrategy.evaluate_combination   s     	)G((1E7<qyc'//*e3aGW$M7==(K		) x=13Kk))r   Nr=   r>   rE   r   r   ra   ra      sg    J'C '4-=(> 44HXCY 4*
'7 
C 
*T2B-C *cSXjHY *r   ra   )rB   rf   rL   typingr   r   tools.loggerr   r+   r   typesr   loggerr   rG   rX   ra   rE   r   r   <module>rs      sa       # % (	H	6** 6*rI*, I*X&0 &R6*. 6*r   