Files
TBgen_App/autoline/__pycache__/test_history.cpython-312.pyc

191 lines
25 KiB
Plaintext
Raw Normal View History

2026-03-30 16:46:48 +08:00
<EFBFBD>
<0F>i<EFBFBD>M<00><00>4<00>dZddlZddlZddlZddlmZmZmZmZm Z m
Z
ddl m Z m Z mZddlmZddlmZddlZddlZej(e<15>Ze Gd<07>d<08><00>Ze Gd <09>d
<EFBFBD><00>Ze Gd <0B>d <0C><00>ZGd <0A>d<0E>ZGd<0F>d<10>Zddedefd<13>Zy)a
Description : Test History Manager (Layer 1 Support Module)
- Store and manage test case history
- Support sequence pattern analysis
- Provide diversity statistics
Author : CGA Enhancement Project
Time : 2026/03/16
<EFBFBD>N)<06>List<73>Dict<63>Optional<61>Any<6E>Tuple<6C>Set)<03> dataclass<73>field<6C>asdict)<01>datetime)<01> defaultdictc<00>`<00>eZdZUdZeed<ee<07><03>Ze e
e e fed<defd<06>Z defd<07>Zy) <09> InputSequenceu<65>
输入序列记录
Attributes:
signal_name: 信号名称
values: 赋值序列 [(time, value), ...]
<20> signal_name<6D><01>default_factory<72>values<65>returnc<00>F<00>djd<02>|jD<00><00>S)u*转换为模式字符串仅包含值z->c3<00>8K<00>|]}t|d<00><00><01><00>y<01>w<01><02>N)<01>str)<02>.0<EFBFBD>vs <20>;/home/zhang/CorrectBench/TBgen_App/autoline/test_history.py<70> <genexpr>z2InputSequence.to_pattern_string.<locals>.<genexpr>)s<00><00><><00>8<>q<EFBFBD><13>Q<EFBFBD>q<EFBFBD>T<EFBFBD><19>8<>s<00>)<02>joinr<00><01>selfs r<00>to_pattern_stringzInputSequence.to_pattern_string's<00><00><13>y<EFBFBD>y<EFBFBD>8<>D<EFBFBD>K<EFBFBD>K<EFBFBD>8<>8<>8<>c<00><><00>tj|j<00>j<00><00>j <00>ddS)u获取序列哈希值N<E580BC>)<05>hashlib<69>md5r!<00>encode<64> hexdigestrs r<00>get_hashzInputSequence.get_hash+s3<00><00><16>{<7B>{<7B>4<EFBFBD>1<>1<>3<>:<3A>:<3A><<3C>=<3D>G<>G<>I<>"<22>1<EFBFBD>M<>Mr"N)<0F>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__r<00>__annotations__r
<00>listrrr<00>intrr!r)<00>r"rrrsE<00><00><08><15><14>$)<29>$<24>$?<3F>F<EFBFBD>D<EFBFBD><15>s<EFBFBD>C<EFBFBD>x<EFBFBD><1F> !<21>?<3F>9<>3<EFBFBD>9<>N<01>#<23>Nr"rc<00>"<00>eZdZUdZeed<dZeed<ee<08><05>Z e
e ed<dZ eed<ee<08><05>Z e
eed<ee<08><05>Ze
eed <d
Zeed <ee<12><05>Zeeefed <d Zeed<ed<0F><00><05>Zeed<dZeed<deeeffd<14>Zy)<16>
TestRecordu<EFBFBD>
测试用例记录
Attributes:
test_id: 测试ID
code: 生成的测试代码
input_sequences: 输入信号序列列表
target_function: 目标功能点
covered_lines: 覆盖的代码行
covered_functions: 覆盖的功能点
coverage_score: 覆盖率分数
diversity_scores: 多样性得分字典
iteration: 迭代次数
timestamp: 时间戳
success: 是否成功
<20>test_id<69><00>coder<00>input_sequences<65>target_function<6F> covered_lines<65>covered_functions<6E><00>coverage_score<72>diversity_scoresr<00> iterationc<00>F<00>tj<00>j<00>S<00>N)r <00>now<6F> isoformatr1r"r<00><lambda>zTestRecord.<lambda>Ks<00><00>8<EFBFBD><<3C><<3C>><3E>3K<33>3K<33>3M<33>r"<00> timestampF<70>successrc<00>r<00>|jD<00>cic]}|j|j<00><00><02>c}Scc}w)u!获取所有输入序列的模式)r7rr!)r <00>seqs r<00>get_sequence_patternsz TestRecord.get_sequence_patternsNs.<00><00>DH<44>DX<44>DX<44>Y<>S<EFBFBD><03><0F><0F><13>!6<>!6<>!8<>8<>Y<>Y<><59>Ys<00>"4N)r*r+r,r-rr.r6r
r/r7rrr8r9r0r:r<<00>float<61>dictr=rr>rDrE<00>boolrHr1r"rr3r30s<><00><00><08> <11>L<EFBFBD><12>D<EFBFBD>#<23>N<EFBFBD>+0<><14>+F<>O<EFBFBD>T<EFBFBD>-<2D>(<28>F<><1D>O<EFBFBD>S<EFBFBD><1D>$<24>T<EFBFBD>:<3A>M<EFBFBD>4<EFBFBD><03>9<EFBFBD>:<3A>#(<28><14>#><3E><15>t<EFBFBD>C<EFBFBD>y<EFBFBD>><3E><1F>N<EFBFBD>E<EFBFBD><1F>).<2E>t<EFBFBD>)D<><14>d<EFBFBD>3<EFBFBD><05>:<3A>&<26>D<><16>I<EFBFBD>s<EFBFBD><16><1A>+M<>N<>I<EFBFBD>s<EFBFBD>N<><19>G<EFBFBD>T<EFBFBD><19>Z<01>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>Zr"r3c<00>l<00>eZdZUdZeed<dZeed<dZeed<e e
<EFBFBD><07>Z e eed<d d ed
e fd <0B>Zy )<0E>SequencePatternu<6E>
序列模式统计
Attributes:
pattern: 模式字符串
count: 出现次数
signal_name: 所属信号
test_ids: 关联的测试ID列表
<20>patternr<00>countr5rr<00>test_ids<64> thresholdrc<00> <00>|j|k\S)u判断是否过度使用<E4BDBF>rO)r rQs r<00> is_overusedzSequencePattern.is_overusedcs<00><00><13>z<EFBFBD>z<EFBFBD>Y<EFBFBD>&<26>&r"N<><01>)r*r+r,r-rr.rOr0rr
r/rPrrKrTr1r"rrMrMSsG<00><00><08><11>L<EFBFBD><12>E<EFBFBD>3<EFBFBD>N<EFBFBD><19>K<EFBFBD><13><19><1F><04>5<>H<EFBFBD>d<EFBFBD>3<EFBFBD>i<EFBFBD>5<>'<27>S<EFBFBD>'<27><14>'r"rMc<00>N<00>eZdZdZgd<02>ZdZdZd<05>Zdee fd<07>Z
de d ee fd
<EFBFBD>Z y ) <0C>SequenceExtractorul
从测试代码中提取输入序列
解析Verilog测试代码提取信号赋值序列
)z8(\w+)\s*=\s*([0-9]+\'[bdh][0-9a-fA-FxXzZ_]+|\d+|x|z)\s*;z9(\w+)\s*<=\s*([0-9]+\'[bdh][0-9a-fA-FxXzZ_]+|\d+|x|z)\s*;z(\w+)\s*=\s*(\d+)\s*;z #\s*(\d+)\s*;z8repeat\s*\(\s*(\d+)\s*\)\s*@\s*\(\s*posedge\s+(\w+)\s*\)c<00>"<00>t<00>|_yr@<00><02>set<65> known_signalsrs r<00>__init__zSequenceExtractor.__init__<5F>s <00><00>'*<2A>u<EFBFBD><04>r"<00>signalsc<00>$<00>t|<01>|_y)u*设置已知信号列表用于过滤NrZ)r r^s r<00>set_known_signalsz#SequenceExtractor.set_known_signals<6C>s<00><00> <20><17>\<5C><04>r"r6rc<00>j<00>i}d}|jd<02>}|D<00>]<5D>}|j<00>}|r|jd<03>r<01>(tj|j
|<05>}|r|t |jd<04><00>z }<03>htj|j|tj<00>}|r#t |jd<04><00>}||dzz }<03><>|jD]<5D>} tj| |tj<00>}
|
D]<5D>} | jd<04>} | jd<06>} |jr| |jvr<01>@| j<00>dvr<01>S| |vrt| <0C><08>|| <|| jj!|| f<02>|dz }<03><><00><><00><01><>t#|j<00><00>S) u<>
从代码中提取输入序列
Args:
code: Verilog测试代码
Returns:
输入序列列表
r<00>
z//r<00>
<00>)<06>i<>j<>k<>cntrO<00>temp)r)<12>split<69>strip<69>
startswith<EFBFBD>re<72>search<63> DELAY_PATTERNr0<00>group<75>CLOCK_WAIT_PATTERN<52>
IGNORECASE<EFBFBD>ASSIGNMENT_PATTERNS<4E>finditerr\<00>lowerrr<00>appendr/)r r6<00> sequences<65> current_time<6D>lines<65>line<6E> delay_match<63> clock_match<63>cyclesrN<00>matches<65>match<63>signal<61>values r<00>extractzSequenceExtractor.extract<63>s<><00><00><17> <09><18> <0C><15>
<EFBFBD>
<EFBFBD>4<EFBFBD> <20><05><19>' &<26>D<EFBFBD><17>:<3A>:<3A><<3C>D<EFBFBD><18>4<EFBFBD>?<3F>?<3F>4<EFBFBD>0<><18><1D>)<29>)<29>D<EFBFBD>$6<>$6<><04>=<3D>K<EFBFBD><1A><1C><03>K<EFBFBD>$5<>$5<>a<EFBFBD>$8<> 9<>9<> <0C><18><1D>)<29>)<29>D<EFBFBD>$;<3B>$;<3B>T<EFBFBD>2<EFBFBD>=<3D>=<3D>Q<>K<EFBFBD><1A><1C>[<5B>.<2E>.<2E>q<EFBFBD>1<>2<><06><1C><06><12> <0B>+<2B> <0C><18> <20>3<>3<> &<26><07><1C>+<2B>+<2B>g<EFBFBD>t<EFBFBD>R<EFBFBD>]<5D>]<5D>C<><07>$<24>&<26>E<EFBFBD>"<22>[<5B>[<5B><11>^<5E>F<EFBFBD>!<21>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>E<EFBFBD><1C>)<29>)<29>f<EFBFBD>D<EFBFBD><N<><N<>.N<> <20><1E>|<7C>|<7C>~<7E>)P<>P<> <20><1D>Y<EFBFBD>.<2E>,9<>f<EFBFBD>,M<> <09>&<26>)<29><1D>f<EFBFBD>%<25>,<2C>,<2C>3<>3<>\<5C>5<EFBFBD>4I<34>J<> <20>A<EFBFBD>%<25>L<EFBFBD>!&<26> &<26>+' &<26>R<14>I<EFBFBD>$<24>$<24>&<26>'<27>'r"N) r*r+r,r-rsrorqr]rrr`rr<>r1r"rrXrXlsL<00><00><08><06><17>%<25>M<EFBFBD>U<01><16>-<2D>*<2A><14>c<EFBFBD><19>*<2A>9(<28>C<EFBFBD>9(<28>D<EFBFBD><1D>$7<>9(r"rXc<00><><00>eZdZdZd)defd<04>Z d*dedededeed eed
ed ed e d eede
fd<0F>Z dede e
fd<10>Z d+dedee
fd<12>Zdee
fd<13>Zde
fd<15>Zd,dedeefd<17>Zd-dedeeeeffd<19>Zdedeefd<1B>Zdeedefd<1D>Zdedefd<1F>Zd ed!edefd"<22>Zd#<23>Zdeeeffd$<24>Zdefd%<25>Zd)d&efd'<27>Zd&efd(<28>Z y).<2E>TestHistoryManageru<72>
测试历史管理器
管理已生成测试用例的历史记录,支持:
- 测试用例存储和检索
- 序列模式统计分析
- 多样性分布统计
N<> history_filec<00><><00>||_g|_i|_tt<00>|_t <00>|_ddddd<03>|_|r2tjj|<01>r|j|<01>yyy)uV
Args:
history_file: 历史记录文件路径(可选)
rr;)<04> total_tests<74>successful_tests<74>total_coverage<67> avg_diversityN) r<><00>records<64>patternsr r/<00>signal_patternsrX<00>sequence_extractor<6F>stats<74>os<6F>path<74>exists<74>load)r r<>s rr]zTestHistoryManager.__init__<5F>sp<00><00>)<29><04><19>)+<2B><04> <0C>46<34><04> <0A>5@<40><14>5F<35><04><1C>"3<>"5<><04><1F><1D> !<21>!<21> <20> 
<EFBFBD><04>
<EFBFBD> <18>B<EFBFBD>G<EFBFBD>G<EFBFBD>N<EFBFBD>N<EFBFBD><<3C>8<> <10>I<EFBFBD>I<EFBFBD>l<EFBFBD> #<23>9<><r"r6r4r8r9r:r<r>rEr\rc
<00><><00>|<02><dt|j<00><00>dtj<00>j d<03><00><00>}| r|j
j | <09>|j
j|<01>}
t|||
||xsg|xsg|||<08><04> } |jj| <0B>|j| <0B>|j<00>tjd|<02>dt|
<EFBFBD><00><00><04>| S)u
添加测试记录
Args:
code: 测试代码
test_id: 测试ID自动生成如果未提供
target_function: 目标功能点
covered_lines: 覆盖的代码行
covered_functions: 覆盖的功能点
coverage_score: 覆盖率分数
iteration: 迭代次数
success: 是否成功
known_signals: 已知信号列表
Returns:
创建的测试记录
<20>test_<74>_z%H%M%S) r4r6r7r8r9r:r<r>rEzAdded test record: z , sequences: )<0E>lenr<6E>r rA<00>strftimer<65>r`r<>r3rv<00>_update_patterns<6E> _update_stats<74>logger<65>debug) r r6r4r8r9r:r<r>rEr\r7<00>records r<00>
add_recordzTestHistoryManager.add_record<72>s<><00><00>6 <13>?<3F><1D>c<EFBFBD>$<24>,<2C>,<2C>/<2F>0<><01>(<28>,<2C>,<2C>.<2E>2I<32>2I<32>(<28>2S<32>1T<31>U<>G<EFBFBD> <19> <10> #<23> #<23> 5<> 5<>m<EFBFBD> D<><1E>1<>1<>9<>9<>$<24>?<3F><0F><1C><1B><15>+<2B>+<2B>'<27>-<2D>2<EFBFBD>/<2F>5<>2<EFBFBD>)<29><1F><1B>

<EFBFBD><06> <0A> <0C> <0C><1B><1B>F<EFBFBD>#<23> <0A><1D><1D>f<EFBFBD>%<25> <0A><1A><1A><1C><0E> <0C> <0C>*<2A>7<EFBFBD>)<29>=<3D><13>_<EFBFBD>AU<41>@V<>W<>X<><15> r"c<00>L<00>|jD]}|j|k(s<01>|cSy)u根据ID获取记录N)r<>r4)r r4r<>s r<00>
get_recordzTestHistoryManager.get_record+s+<00><00><1A>l<EFBFBD>l<EFBFBD> <1E>F<EFBFBD><15>~<7E>~<7E><17>(<28><1D> <0A> <1E>r"<00>nc<00>j<00>t|j<00>|k\r|j| dS|jS)u获取最近的N条记录N)r<>r<>)r r<>s r<00>get_recent_recordsz%TestHistoryManager.get_recent_records2s.<00><00>$'<27><04> <0C> <0C>$5<><11>$:<3A>t<EFBFBD>|<7C>|<7C>Q<EFBFBD>B<EFBFBD>C<EFBFBD> <20>L<><04> <0C> <0C>Lr"c<00>Z<00>|jD<00>cgc]}|js<01>|<01><02>c}Scc}w)u获取所有成功的记录)r<>rE)r <00>rs r<00>get_successful_recordsz)TestHistoryManager.get_successful_records6s <00><00><1F><<3C><<3C>5<>a<EFBFBD>1<EFBFBD>9<EFBFBD>9<EFBFBD><01>5<>5<><35>5s<00>(<04>(r<>c<00><00>|jD]<5D>}|j<00>}|j<00>}||jvr2t |d|j
|j g<01><02>|j|<nT|j|xjdz c_|j|jj|j <00>||j|j
vs<01><>|j|j
j|<04><00><>y)u更新序列模式统计r)rNrOrrPN) r7r!r)r<>rMrr4rOrPrvr<>)r r<>rG<00> pattern_str<74> pattern_hashs rr<>z#TestHistoryManager._update_patterns<s<><00><00><19>)<29>)<29> K<01>C<EFBFBD><1D>/<2F>/<2F>1<>K<EFBFBD><1E><<3C><<3C>><3E>L<EFBFBD><1B>4<EFBFBD>=<3D>=<3D>0<>.=<3D>'<27><1B> #<23><0F><0F>$<24>n<EFBFBD>n<EFBFBD>-<2D> /<12><04> <0A> <0A>l<EFBFBD>+<2B><15> <0A> <0A>l<EFBFBD>+<2B>1<>1<>Q<EFBFBD>6<>1<><14> <0A> <0A>l<EFBFBD>+<2B>4<>4<>;<3B>;<3B>F<EFBFBD>N<EFBFBD>N<EFBFBD>K<><1C>4<EFBFBD>#7<>#7<><03><0F><0F>#H<>H<><14>$<24>$<24>S<EFBFBD>_<EFBFBD>_<EFBFBD>5<><<3C><<3C>\<5C>J<># Kr"rQc<00><><00>|jj<00>D<00>cgc]}|j|<01>s<01>|<02><02>c}Scc}w)u<>
获取过度使用的模式
Args:
threshold: 过度使用阈值
Returns:
过度使用的模式列表
)r<>rrT)r rQ<00>ps r<00>get_overused_patternsz(TestHistoryManager.get_overused_patternsQs0<00><00> <20>=<3D>=<3D>/<2F>/<2F>1<>N<>a<EFBFBD>Q<EFBFBD>]<5D>]<5D>9<EFBFBD>5M<35><01>N<>N<><4E>Ns<00>;<04>;<04>top_nc<00><><00>t|jj<00>d<01>d<02><03>}|d|D<00>cgc] }|dj|djf<02><02>"c}Scc}w)u<>
获取最常见的模式
Args:
top_n: 返回数量
Returns:
[(pattern, count), ...]
c<00> <00>|djS)NrrS)<01>xs rrCz8TestHistoryManager.get_common_patterns.<locals>.<lambda>is<00><00>!<21>A<EFBFBD>$<24>*<2A>*<2A>r"T)<02>key<65>reverseNr)<05>sortedr<64><00>itemsrNrO)r r<><00>sorted_patternsr<73>s r<00>get_common_patternsz&TestHistoryManager.get_common_patterns]sW<00><00>!<21> <10>M<EFBFBD>M<EFBFBD> <1F> <1F> !<21>$<24><18>
<EFBFBD><0F>
5D<01>F<EFBFBD>U<EFBFBD>4K<34>L<>q<EFBFBD><11>1<EFBFBD><14><1C><1C>q<EFBFBD><11>t<EFBFBD>z<EFBFBD>z<EFBFBD>*<2A>L<>L<><4C>Ls<00>%Arc<00><><00>|jj|g<00>}|D<00>cgc] }||jvs<01>|j|<00><02>"c}Scc}w)u!获取特定信号的所有模式)r<><00>getr<74>)r r<00>pattern_hashes<65>hs r<00>get_pattern_for_signalz)TestHistoryManager.get_pattern_for_signalnsB<00><00><1D>-<2D>-<2D>1<>1<>+<2B>r<EFBFBD>B<><0E>*8<>O<>Q<EFBFBD>A<EFBFBD><14><1D><1D><N<><04> <0A> <0A>a<EFBFBD> <20>O<>O<><4F>Os
<00>A <04>A <04> new_sequencesc<00><><00><00><00>jsy|sy|D<00>chc]}|j<00><00><02>}}t|<03>}|dk(ryt<00>fd<04>|D<00><00>}||z }|Scc}w)u<>
计算新序列与历史记录的多样性得分
Args:
new_sequences: 新的输入序列列表
Returns:
多样性得分 (0.0 - 1.0)
<20><00>?r;rc3<00>@<00>K<00>|]}|<01>jvs<01>d<00><01><00>y<01>wr)r<>)rr<>r s <20>rrzBTestHistoryManager.calculate_sequence_diversity.<locals>.<genexpr><3E>s<00><><00><><00>R<>a<EFBFBD>1<EFBFBD>D<EFBFBD>M<EFBFBD>M<EFBFBD>;Q<><01>R<>s<00><01>)r<>r)r<><00>sum)r r<>rG<00> new_patterns<6E>total_patterns<6E>new_pattern_count<6E>pattern_diversitys` r<00>calculate_sequence_diversityz/TestHistoryManager.calculate_sequence_diversityusp<00><><00><14>|<7C>|<7C><16><1C><16>3@<01>@<40>3<EFBFBD><03> <0C> <0C><0E>@<40> <0C>@<40><1C>\<5C>*<2A><0E> <19>Q<EFBFBD> <1E><16> <20>R<><<3C>R<>R<><19>-<2D><0E>><3E><19> <20> <20><>As<00>A<04>new_codec<00><00>|jsy|jd<02>}td<03>}|D]*}|j||j<00>}t ||<05>}<03>,t t|<01>t d<04>|D<00><00><00>}|dk(ry||z S)uf
基于编辑距离计算多样性
使用简化的编辑距离计算
r<><00><00>infc3<00>FK<00>|]}t|j<00><00><01><00>y<00>wr@)r<>r6<00>rr<>s rrzGTestHistoryManager.calculate_edit_distance_diversity.<locals>.<genexpr><3E>s<00><00><><00>(M<><11><13>Q<EFBFBD>V<EFBFBD>V<EFBFBD><1B>(M<>s<00>!rr;)r<>r<>rI<00>_levenshtein_distancer6<00>min<69>maxr<78>)r r<><00>recent_records<64> min_distancer<65><00>distance<63>max_lens r<00>!calculate_edit_distance_diversityz4TestHistoryManager.calculate_edit_distance_diversity<74>s<><00><00> <14>|<7C>|<7C><16><1E>0<>0<><11>3<><0E><1C>U<EFBFBD>|<7C> <0C>$<24> 7<>F<EFBFBD><1B>1<>1<>(<28>F<EFBFBD>K<EFBFBD>K<EFBFBD>H<>H<EFBFBD><1E>|<7C>X<EFBFBD>6<>L<EFBFBD> 7<>
<16>c<EFBFBD>(<28>m<EFBFBD>S<EFBFBD>(M<>n<EFBFBD>(M<>%M<>N<><07> <12>a<EFBFBD><<3C><16><1B>g<EFBFBD>%<25>%r"<00>s1<73>s2c <00><><00>t|<01>t|<02>kr|j||<01>St|<02>dk(r t|<01>St|<01>dkDr|dd}t|<02>dkDr|dd}tt|<02>dz<00>}t|<01>D]Z\}}|dzg}t|<02>D]?\}}||dzdz} ||dz}
||||k7z} |j t | |
| <0B><00><00>A|}<03>\|dS)u,计算Levenshtein编辑距离简化版ri<>Nr<00><><EFBFBD><EFBFBD><EFBFBD>)r<>r<><00>range<67> enumeratervr<>) r r<>r<><00> previous_rowre<00>c1<63> current_rowrf<00>c2<63>
insertions<EFBFBD> deletions<6E> substitutionss rr<>z(TestHistoryManager._levenshtein_distance<63>s<00><00> <0E>r<EFBFBD>7<EFBFBD>S<EFBFBD><12>W<EFBFBD> <1C><17>-<2D>-<2D>b<EFBFBD>"<22>5<> 5<> <0E>r<EFBFBD>7<EFBFBD>a<EFBFBD><<3C><16>r<EFBFBD>7<EFBFBD>N<EFBFBD> <0F>r<EFBFBD>7<EFBFBD>S<EFBFBD>=<3D><13>D<EFBFBD>S<EFBFBD><18>B<EFBFBD> <0E>r<EFBFBD>7<EFBFBD>S<EFBFBD>=<3D><13>D<EFBFBD>S<EFBFBD><18>B<EFBFBD><1C>S<EFBFBD><12>W<EFBFBD>q<EFBFBD>[<5B>)<29> <0C><1E>r<EFBFBD>]<5D> '<27>E<EFBFBD>A<EFBFBD>r<EFBFBD><1C>q<EFBFBD>5<EFBFBD>'<27>K<EFBFBD>"<22>2<EFBFBD><1D> N<01><05><01>2<EFBFBD>)<29>!<21>a<EFBFBD>%<25>0<>1<EFBFBD>4<>
<EFBFBD>'<27><01>N<EFBFBD>Q<EFBFBD>.<2E> <09> ,<2C>Q<EFBFBD><0F>2<EFBFBD><12>8<EFBFBD> <<3C> <0A><1B>"<22>"<22>3<EFBFBD>z<EFBFBD>9<EFBFBD>m<EFBFBD>#L<>M<>  N<01>
'<27>L<EFBFBD> '<27><1C>B<EFBFBD><1F>r"c<00>j<00>t|j<00>|jd<td<02>|jD<00><00>|jd<|jr\td<04>|jD<00><00>|jd<|jdt|j<00>z |jd<yy)u更新统计信息r<E681AF>c3<00>:K<00>|]}|js<01>d<00><01><00>y<01>wr)rEr<>s rrz3TestHistoryManager._update_stats.<locals>.<genexpr><3E>s<00><00><><00>,R<>1<EFBFBD><01> <09> <09>Q<EFBFBD>,R<>s<00><01>r<>c3<00>4K<00>|]}|j<00><01><00>y<00>wr@)r<r<>s rrz3TestHistoryManager._update_stats.<locals>.<genexpr><3E>s<00><00><><00>.V<>A<EFBFBD>q<EFBFBD>/?<3F>/?<3F>.V<>s<00>r<><00> avg_coverageN)r<>r<>r<>r<>rs rr<>z TestHistoryManager._update_stats<74>s<><00><00>$'<27><04> <0C> <0C>$5<><04>
<EFBFBD>
<EFBFBD>=<3D>!<21>),<2C>,R<><04> <0C> <0C>,R<>)R<><04>
<EFBFBD>
<EFBFBD>%<25>&<26> <0F><<3C><<3C>+.<2E>.V<><14><1C><1C>.V<>+V<>D<EFBFBD>J<EFBFBD>J<EFBFBD>'<27> (<28>)-<2D><1A><1A>4D<34>)E<><03>D<EFBFBD>L<EFBFBD>L<EFBFBD>HY<48>)Y<>D<EFBFBD>J<EFBFBD>J<EFBFBD>~<7E> &<26> r"c<00><><00>i|j<00>t|j<00>t|j<00><00>t|j<00>d<01><03>S)u获取统计信息)r<><00>overused_patterns<6E>unique_signals)r<>r<>r<>r<>r<>rs r<00>get_statisticsz!TestHistoryManager.get_statistics<63>sH<00><00>
<EFBFBD><12>j<EFBFBD>j<EFBFBD>
<EFBFBD>!<21>$<24>-<2D>-<2D>0<>!$<24>T<EFBFBD>%?<3F>%?<3F>%A<>!B<>!<21>$<24>"6<>"6<>7<> 
<EFBFBD>
r"c
<00>F<00>g}|jd<01>|jd<02>|jd<01>|jd|jd<00><00><02>|jd|jd<00><00><02>|jdt|j<00><00><00><02>|jd<08>|jd <09>|j d
<EFBFBD>}t |d <0B>D]&\}\}}|jd |<03>d |dd<00>d|<05>d<11><07><00>(|j <00>}|rh|jd<08>|jd<12>|dd
D]>}|jd|j<00>d|jdd<00>d|j<00>d<17><07><00>@|jd<01>dj|<01>S)u生成多样性报告z2==================================================zTEST HISTORY DIVERSITY REPORTz Total Tests: r<>zSuccessful Tests: r<>zTotal Patterns: r5zTOP 5 COMMON PATTERNS:r<>rz z. N<>(z... (x<>)z)OVERUSED PATTERNS (need diversification):z - z: <20>z
... (used z times)rb) rvr<>r<>r<>r<>r<>r<>rrNrOr)r ry<00>commonrerNrO<00>overusedr<64>s r<00>get_diversity_reportz'TestHistoryManager.get_diversity_report<72>s<><00><00><12><05> <0A> <0C> <0C>X<EFBFBD><1E> <0A> <0C> <0C>4<>5<> <0A> <0C> <0C>X<EFBFBD><1E> <0A> <0C> <0C>}<7D>T<EFBFBD>Z<EFBFBD>Z<EFBFBD> <0A>%><3E>$?<3F>@<40>A<> <0A> <0C> <0C>)<29>$<24>*<2A>*<2A>5G<35>*H<>)I<>J<>K<> <0A> <0C> <0C>'<27><03>D<EFBFBD>M<EFBFBD>M<EFBFBD>(:<3A>';<3B><<3C>=<3D> <0A> <0C> <0C>R<EFBFBD><18> <0E> <0C> <0C>-<2D>.<2E><15>)<29>)<29>!<21>,<2C><06>#,<2C>V<EFBFBD>Q<EFBFBD>#7<> A<01> <1F>A<EFBFBD><1F><07><15> <11>L<EFBFBD>L<EFBFBD>2<EFBFBD>a<EFBFBD>S<EFBFBD><02>7<EFBFBD>3<EFBFBD>B<EFBFBD><<3C>.<2E><06>u<EFBFBD>g<EFBFBD>Q<EFBFBD>?<3F> @<40> A<01><18>-<2D>-<2D>/<2F><08> <13> <11>L<EFBFBD>L<EFBFBD><12> <1C> <11>L<EFBFBD>L<EFBFBD>D<> E<><1D>b<EFBFBD>q<EFBFBD>\<5C> a<01><01><15> <0C> <0C>t<EFBFBD>A<EFBFBD>M<EFBFBD>M<EFBFBD>?<3F>"<22>Q<EFBFBD>Y<EFBFBD>Y<EFBFBD>s<EFBFBD><02>^<5E>4D<34>J<EFBFBD>q<EFBFBD>w<EFBFBD>w<EFBFBD>i<EFBFBD>W^<5E>_<>`<60> a<01> <0E> <0C> <0C>X<EFBFBD><1E><13>y<EFBFBD>y<EFBFBD><15><1F>r"<00>filepathc <00><><00>|xs |j}|syg}|jD]<5D>}|j|jg|j|j
|j |j|j|j|j|jd<02> }|jD]-}|dj|j|jd<04><02><00>/|j|<04><00><>||j d<05>}t#|dd<07><08>5}t%j&||d d
<EFBFBD> <0B>ddd<01>t(j+d |<01><00><02>y#1swY<00>"xYw) u保存历史记录到文件N) r4r6r7r8r9r:r<r=r>rDrEr7)rr)r<>r<><00>w<>utf-8<><01>encodingrdF)<02>indent<6E> ensure_asciizTest history saved to )r<>r<>r4r6r8r9r:r<r=r>rDrEr7rvrrr<><00>open<65>json<6F>dumpr<70><00>info)r r<><00> records_datar<61><00> record_dictrG<00>data<74>fs r<00>savezTestHistoryManager.save<76>s8<00><00><1B>0<>t<EFBFBD>0<>0<><08><17> <12><1A> <0C><15><1C><1C> -<2D>A<EFBFBD><1C>9<EFBFBD>9<EFBFBD><19><06><06>#%<25>#$<24>#4<>#4<>!"<22><1F><1F>%&<26>%8<>%8<>"#<23>"2<>"2<>$%<25>$6<>$6<><1E>[<5B>[<5B><1E>[<5B>[<5B><1C>9<EFBFBD>9<EFBFBD> <0E>K<EFBFBD><19>(<28>(<28> <13><03><1B>-<2D>.<2E>5<>5<>#&<26>?<3F>?<3F>!<21>j<EFBFBD>j<EFBFBD>7<12><13> <13>
<19> <1F> <1F> <0B> ,<2C>) -<2D>.$<24><19>Z<EFBFBD>Z<EFBFBD>
<EFBFBD><04>
<12>(<28>C<EFBFBD>'<27> 2<> =<3D>a<EFBFBD> <10>I<EFBFBD>I<EFBFBD>d<EFBFBD>A<EFBFBD>a<EFBFBD>e<EFBFBD> <<3C> =<3D> <0F> <0B> <0B>,<2C>X<EFBFBD>J<EFBFBD>7<>8<> =<3D> =<3D>s <00>D><03>>Ec<00>X<00>tjj|<01>syt|dd<03><04>5}t j
|<02>}ddd<01>g|_jdg<00>D]<5D>}|jdg<00>D<00>cgc] }tdi|<05><01><01><02>}}t|d|d||jd d
<EFBFBD>|jd g<00>|jd g<00>|jd d<0E>|jdd<10>|jdd
<EFBFBD>|jdd<13><00><14>
}|j j|<07>|j|<07><00><>|jd|j<00>|_ tjdt|j <00><00>d|<01><00><04>y#1swY<00><01>WxYwcc}w)u从文件加载历史记录Nr<4E>r<>r<>r<>r7r4r6r8r5r9r:r<r;r>rrDrEF)
r4r6r7r8r9r:r<r>rDrEr<>zLoaded z test records from r1)r<>r<>r<>r<>r<>r<>r<>r<>rr3rvr<>r<>r<>r<>r<>)r r<>r<>r<>r<><00>srwr<>s rr<>zTestHistoryManager.loadsz<00><00><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27> <12> <11>(<28>C<EFBFBD>'<27> 2<> <20>a<EFBFBD><17>9<EFBFBD>9<EFBFBD>Q<EFBFBD><<3C>D<EFBFBD> <20><1A><04> <0C><15><18><18>)<29>R<EFBFBD>(<28> *<2A>A<EFBFBD>,-<2D>E<EFBFBD>E<EFBFBD>2C<32>R<EFBFBD>,H<><0E>'(<28> <0A>"<22><01>"<22><0E>I<EFBFBD><0E> <20><19>)<29> <0C><16>v<EFBFBD>Y<EFBFBD> )<29> !<21><05><05>&7<><12> <<3C><1F>e<EFBFBD>e<EFBFBD>O<EFBFBD>R<EFBFBD>8<>"#<23>%<25>%<25>(;<3B>R<EFBFBD>"@<40> <20>u<EFBFBD>u<EFBFBD>%5<>s<EFBFBD>;<3B><1B>%<25>%<25> <0B>Q<EFBFBD>/<2F><1B>%<25>%<25> <0B>R<EFBFBD>0<><19><05><05>i<EFBFBD><15>/<2F> <0E>F<EFBFBD> <11>L<EFBFBD>L<EFBFBD> <1F> <1F><06> '<27> <10> !<21> !<21>&<26> )<29># *<2A>&<1A>X<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>z<EFBFBD>z<EFBFBD>2<><04>
<EFBFBD><0E> <0B> <0B>g<EFBFBD>c<EFBFBD>$<24>,<2C>,<2C>/<2F>0<>0C<30>H<EFBFBD>:<3A>N<>O<>1 <20> <20><>
s<00>F<03>=F'<06>F$r@)Nr5NNr;rFN)rcrU)r<>)!r*r+r,r-rr]rr0rIrKr3r<>rr<>r<>r<>r<>rMr<>rr<>r<>rr<>r<>r<>r<>rrr<>r<>rr<>r1r"rr<>r<><00>s<><00><00><08>$<24>S<EFBFBD>$<24>:#'<27>*,<2C>.2<EFBFBD>26<EFBFBD>+.<2E>$%<25>#(<28>.2<EFBFBD>:<16><1C>:<16><1F>:<16>%(<28>:<16>#'<27>s<EFBFBD>)<29> :<16>
'+<2B>3<EFBFBD>i<EFBFBD> :<16> $)<29> :<16>"<22>:<16>!<21>:<16>#'<27>s<EFBFBD>)<29>:<16>8B<01>:<16>x<14>#<23><14>(<28>:<3A>*><3E><14>M<01>C<EFBFBD>M<01><14>j<EFBFBD>1A<31>M<01>6<><04>Z<EFBFBD>(8<>6<> K<01>z<EFBFBD>K<01>*
O<01>s<EFBFBD>
O<01>4<EFBFBD><0F>;P<>
O<01>M<01><13>M<01>T<EFBFBD>%<25><03>S<EFBFBD><08>/<2F>5J<35>M<01>"P<01>#<23>P<01>$<24><EFBFBD>:O<>P<01>!<21>$<24>}<7D>:M<>!<21>RW<52>!<21>:&<26>#<23>&<26>%<25>&<26>0 <20><03> <20><13> <20><13> <20>8Z<01>
<EFBFBD><04>S<EFBFBD>#<23>X<EFBFBD><0E>
<EFBFBD> <20>c<EFBFBD> <20><&9<>S<EFBFBD>&9<>PP<01>S<EFBFBD>Pr"r<>r<>rc<00><00>t|<00><01>S)u创建测试历史管理器<E79086>r<>)r<>rs r<00>create_test_historyrBs <00><00> <1D><<3C> 8<>8r"r@)r-r<>r<><00>logging<6E>typingrrrrrr<00> dataclassesr r
r r <00> collectionsr r%rm<00> getLoggerr*r<>rr3rMrXr<>rrr1r"r<00><module>r s<><00><01><04> <0C> <09><0E>8<>8<>0<>0<><1D>#<23><0E> <09> <1A><17> <1A> <1A>8<EFBFBD> $<24><06> <0B>N<01>N<01> <0B>N<01>( <0B>Z<01>Z<01> <0B>Z<01>D <0B>'<27>'<27> <0B>'<27>0W(<28>W(<28>|qP<01>qP<01>p 9<>c<EFBFBD>9<>5G<35>9r"