
    !hl                        d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZd dlZ	d dl Z d dl
Z
d dlmZmZ defdZd Zd Zd Zd	e	j&                  d
eddfdZ G d d      Z ej.                         ZdefdZ G d de      Z G d d      Z G d dej<                        Z G d d      Z  G d de       Z! G d de       Z" G d de       Z# G d de       Z$e#e"e!e$gZ% G d d       Z& G d! d"e&      Z'y)#    N)deepcopy)viewsutilsreturnc                 T    d}t        j                  ||       }|j                  d      S )Nz(\S+)\s+\((\S+)\)   )rematchgroup)	test_nameregexr
   s      /home/xtuchyna/.var/app/com.visualstudio.code/data/virtualenvs/gen-test-bench-v8TMe8KL/lib/python3.12/site-packages/mutpy/controller.pyget_full_test_namer      s%     EHHUI&E;;q>    c                 "    t        fd|       S )z&Get RTF series give test constraint m.c                     | k\  r| S dS Nr    )xrapfd_constraint_ms    r   <lambda>z get_rtf_series.<locals>.<lambda>   s    0A5<1<r   )map)first_killersr   s    `r   get_rtf_seriesr      s    <mLLr   c                 2    | D cg c]  }|d   	 c}S c c}w )zUFrom list of killers for all killed mutants, return the first killer for each mutant.r   r   )kill_order_per_mutationstest_orderss     r   get_first_killersr      s     .FG.F{KN.FGGGs   c                 J    t        d |       }t        t        |            |z  S )z.Get cumulative step sum of covered fault area.c                     | dk7  S r   r   )phis    r   r   z?get_cumulative_step_sum_of_covered_fault_area.<locals>.<lambda>!   s    r   )r   lenlist)
rtf_seriesall_mutantsfaults_detected_by_first_ms      r   -get_cumulative_step_sum_of_covered_fault_arear'      s&    !$%9:!F024{BBr   datafile_full_pathc                 n    t         j                  j                  |      }| j                  |d| d       y)z-Writes/appends into aggregation csv EDA file.aF)modeheaderindexN)ospathisfileto_csv)r(   r)   file_existss      r   write_into_filer4   $   s*    ''..0KKKS[KNr   c                       e Zd Zd Zd Zd Zy)CompareOutputsc                 F    t        j                  d      | _        || _        y )Nen_core_web_sm)spacyloadnlptheta)selfr<   s     r   __init__zCompareOutputs.__init__,   s    ::./
r   c                     t        j                  dd|j                               }t        j                  dd|j                               }||k(  ry| j                  ||      S )N\s+ T)r	   substripis_same_using_cosine)r=   text1text2normalized_text1normalized_text2s        r   is_same_outputzCompareOutputs.is_same_output0   sU    66&#u{{}=66&#u{{}=//(()9;KLLr   c                 n    t        |      }t        |      }|j                  |      }|| j                  kD  S N)r;   
similarityr<   )r=   output_originaloutput_mutantdoc1doc2rL   s         r   rD   z#CompareOutputs.is_same_using_cosineA   s5    ?#=! __T*
DJJ&&r   N)__name__
__module____qualname__r>   rI   rD   r   r   r   r6   r6   *   s    M"'r   r6   c                     t        j                  dd| j                               }t        j                  dd|j                               }||k(  S )Nr@   rA   )r	   rB   rC   )output1output2normalized_output1normalized_output2s       r   rI   rI   M   sB    W]]_=W]]_= !333r   c                       e Zd ZddZy)TestsFailAtOriginalNc                     || _         y rK   )result)r=   r\   s     r   r>   zTestsFailAtOriginal.__init__X   s	    r   rK   )rQ   rR   rS   r>   r   r   r   rZ   rZ   V   s    r   rZ   c                   j    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zed        Zy)MutationScorec                    |j                   |j                  z   D ci c]  }t        |j                        g  c}| _        t        | j                  j                               | _        |j                  | _        d| _	        d| _
        d| _        d| _        d| _        d| _        g | _        i | _        g | _        g | _        d | _        d | _        || _        d | _        y c c}w r   )passedfailedr   namekiller_matrixr"   keys	test_size
test_orderkilled_mutantstimeout_mutantsincompetent_mutantssurvived_mutantscovered_nodes	all_nodesoverall_mutationsper_mutant_statsapfd_bufferr   apfdrapfdr   r$   )r=   r\   r   tests       r   r>   zMutationScore.__init__^   s     :@9V
9Vtyy)",9V
 T//4467 ++ #$  !!# "(*%	
"41
s   Cc                 
   | j                   | j                   S dt        | j                  D cg c]  }|d   	 c}      | j                  | j                  z  z  z
  dd| j                  z  z  z   | _         | j                   S c c}w )N   r   r   )rp   sumr   re   r%   )r=   killer_testss     r   get_apfd_scorezMutationScore.get_apfd_score~   s    99 99151N1NO1N\!_1NO
^^d...0 023q4>>7I2JK	 yy Ps   B 
c                       j                    j                   S  j                  D cg c]  }|d   	 }}t         fd|      S c c}w )Nr   c                 *    j                   | k\  r| S dS r   r   )r   r=   s    r   r   z.MutationScore.get_rtf_series.<locals>.<lambda>   s    $"9"9Q">QEAEr   )r$   r   r   )r=   r   r   s   `  r   r   zMutationScore.get_rtf_series   sK    ??&??";?;X;XY;XKQ;XYE}UU Zs   Ac                     | j                         D cg c]
  }|dk7  s	| }}t        t        |            | j                  z  S c c}w r   )r   r"   r#   r%   )r=   observed_faultr&   s      r   r'   z;MutationScore.get_cumulative_step_sum_of_covered_fault_area   sM    KOK^K^K`%xK`drvwdwnK`"%xD4684;K;KKK &ys
   
AAc                     | j                   | j                   S | j                         }|t        | j                               | j                  | j
                  z  z  z
  | _         | j                   S rK   )rq   r'   ru   r   r   r%   )r=   p_ms     r   get_rapfd_scorezMutationScore.get_rapfd_score   s_    ::!::@@B3 3 3 574;R;RUYUeUe;eff
zzr   c                    t        d| j                  dz         D cg c]  }| }}|j                         }t        j                  |       t        |d      D ci c]  \  }}||
 c}}fd}| j                  j                         D ci c]  \  }}| ||       }	}}g }
| j                  D ]/  }t        |D cg c]  }|   	 c}      }|
j                  |       1 t        |
      }t        || j                        }t        || j                        }|t!        |      | j                  | j                  z  z  z
  S c c}w c c}}w c c}}w c c}w )Nrt   )startc                     |    S rK   r   )original_indexswap_maps    r   get_swapped_indexz?MutationScore.get_random_rapfd_score.<locals>.get_swapped_index   s    N++r   )rangere   copyrandomshuffle	enumeraterf   itemsr   sortedappendr   r   r   r'   r%   ru   )r=   ioriginal_indicesshuffledneworiginalr   kvnew_test_ordernew_killers_orderskiller_orderith_test"new_killer_order_per_killed_mutantr   r$   r~   r   s                    @r   get_random_rapfd_scorez$MutationScore.get_random_rapfd_score   sg    (-Qt~~a/?'@A'@!A'@A $((*x  8AQR7ST7Smc8HcM7ST	, =AOO<Q<Q<ST<SSQq!-a00<ST   99L17]i9j]iQY(8:L]i9j1l.%%&HI : **<=#M43J3JK
 <JHXHXYS*&$*A*ADDTDT*TUUUO B U U :ks   	EE
E E
c                 t    | j                   | j                  z
  }|r| j                  | j                  z   |z  S dS r   r%   ri   rg   rh   r=   bottoms     r   get_mutation_score_as_factorz*MutationScore.get_mutation_score_as_factor   s<    !!D$<$<<JP$$t';';;vEWVWWr   c                 z    | j                   | j                  z
  }|r| j                  | j                  z   |z  dz  S dS )Nd   r   r   r   s     r   countzMutationScore.count   sA    !!D$<$<<RX$%%(<(<<F#M_^__r   c                 .    | xj                   dz  c_         y Nrt   )rg   r=   s    r   
inc_killedzMutationScore.inc_killed   s    q r   c                 .    | xj                   dz  c_         y r   )rh   r   s    r   inc_timeoutzMutationScore.inc_timeout   s    !r   c                 .    | xj                   dz  c_         y r   )ri   r   s    r   inc_incompetentzMutationScore.inc_incompetent   s      A% r   c                 .    | xj                   dz  c_         y r   )rj   r   s    r   inc_survivedzMutationScore.inc_survived   s    "r   c                 X    | xj                   |z  c_         | xj                  |z  c_        y rK   )rk   rl   )r=   rk   rl   s      r   update_coveragezMutationScore.update_coverage   s!    m+)#r   c                 h    | j                   | j                  z   | j                  z   | j                  z   S rK   )rg   rh   ri   rj   r   s    r   r%   zMutationScore.all_mutants   s0    ""T%9%99D<T<TTW[WlWlllr   N)rQ   rR   rS   r>   rw   r   r'   r   r   r   r   r   r   r   r   r   propertyr%   r   r   r   r^   r^   \   s`    @VL*VXX`!"&#$ m mr   r^   c                   (    e Zd Z	 	 d fd	ZdeddfdZddZdeddfdZd Zdeddfd	Z	d
 Z
d Zd Zd Zd Zej                   d        Zd Zej                   d        Zej                   d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )MutationControllerNc                 T   t         |   |       || _        || _        || _        || _        t        j                  |      | _        |	| _	         || j                  | j
                  | j                  |      | _
        i | _        i | _        g | _        t        |
      | _        || _        y )N)r<   )superr>   target_loadertest_loadermutant_generatortimeout_factorr   StdoutManagerstdout_managermutation_numberrunnertest_results_matrixoriginal_failed_testsro   r6   
comparatorr   )r=   
runner_clsr   r   r   r   r   disable_stdoutmutate_coveredr   theta_factorr   	__class__s               r   r>   zMutationController.__init__   s     	*& 0,#11.A. !1!143F3FH[H[]kl#% %'"(|<"4r   folderr   c                    g }| j                   j                  j                         D ]<  \  }}t        |      }|| j                   j                  z  }|j                  ||g       > t        j                  |ddg      }t        ||dz          y )Nr   per_test_score)columnsz/per_test.csv)	scorerc   r   r"   r%   r   pd	DataFramer4   )r=   r   
csv_scoresr   killed_operators
kill_countr   r(   s           r   save_per_testz MutationController.save_per_test   s    
+/::+C+C+I+I+K'I'-.J'$***@*@@Ny.9: ,L
 ||J>N0OPf67r   c                 ,    | |vrdD ]
  }d||    |<    y y )N)killedsurvivedper_test_killsper_test_survivesr   r   )oppost_process_dict
stat_fields      r   initialize_per_mutant_entryz.MutationController.initialize_per_mutant_entry  s+    &&[
45!"%j1 \ 'r   c           	         g }| j                   j                  j                         D ]5  \  }}|d   }|d   }|d   }|j                  | j                  ||||d       7 t        j                  |      }t        ||dz          y )Nr   	generatedr   )test_modulemutant_typer   r   r   z/per_mutant.csv)r   rn   r   r   test_module_namer   r   r4   )	r=   r   r   mutantstatsr   overallr   r(   s	            r   save_per_mutantz"MutationController.save_per_mutant  s    
!ZZ88>>@MFE8_FK(GZ(H#44%$ $  A ||J'f'889r   c                 r    | j                   j                  d   }t        j                  j	                  |      S r   )r   namesr/   r0   basename)r=   	full_paths     r   get_target_file_namez'MutationController.get_target_file_name   s-    &&,,Q/	ww,,r   c                    | j                   | j                         | j                  j                         | j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                         | j                  j                         d}t        j                  |g      }t        ||dz          y )N)r   target_filemutation_scoretime_elapsedr%   r   r   incompetenttimeoutrapfd_scorerandom_rapfd_scorez/per_suite.csv)r   r   r   r   durationr%   rg   rj   ri   rh   r   r   r   r   r4   )r=   r   	csv_scorer(   s       r   save_per_suitez!MutationController.save_per_suite$  s    !%!6!6446"jjEEG MM::11jj//

33 JJ::zz11::557"&**"C"C"E
	 ||YK(f'778r   c                 j    | j                  |       | j                  |       | j                  |       y rK   )r   r   r   )r=   r   s     r   save_edazMutationController.save_eda7  s2     	6" 	V$ 	F#r   c                 p   | j                  | j                  j                  | j                  j                         	 t	        j
                         }| j                          |j                         | _        | j                  | j                  | j                         y # t        $ r:}| j                  |j                         t        j                  d       Y d }~y d }~wt        j                   $ rE}| j#                  |j$                  |j&                         t        j                  d       Y d }~y d }~ww xY w)N)notify_initializer   r   r   r   Timerrun_mutation_processstopr   
notify_endr   rZ   notify_original_tests_failr\   sysexitModulesLoaderExceptionnotify_cant_loadrb   	exception)r=   timererrors      r   runzMutationController.runF  s    t11779I9I9O9OP
	KKME%%'!JJLDMOODJJ6" 	++ELL9HHRLL++ 	!!%**eoo>HHRLL	s$   AB 	D5%0CD50;D00D5c                 t   	 | j                         \  }}}|D cg c]  }|d   	 }}|D cg c]  }|j                  D ]  }|  }}}|D cg c]  }|j                  D ]  }|  }	}}|	D ]&  }t        |j                        }
|| j
                  |
<   ( | j                  ||	       | j                  ||       | j                          | j                  j                  |D cg c]  ^}}| c}}      D ]  \  }}| j                  |||        y c c}w c c}}w c c}}w c c}}w # t        $ r Y y w xY wr   )load_and_check_testsr`   ra   r   rb   r   print_test_resultsnotify_passednotify_startr   r:   mutate_moduleKeyboardInterrupt)r=   test_modulestotal_durationnumber_of_testsmoduleresultsresrr   r`   ra   r   _target_module	to_mutates                 r   r   z'MutationController.run_mutation_processT  s>   	<@<U<U<W9L.//;<|Vvay|G<&-Egs#**$d*dgFE&-Egs#**$d*dgFE.tyy9	8<**95  ##FF3 |_= -1,>,>,C,C^jDk^jPZPVYZV^jDk,l(y""=)^L -m- =EE( El  		sE   D+ DD+ DD+ D)A<D+ %D%
0#D+ D+ +	D76D7c                 \   g }d}d}| j                   j                         D ]  \  }}| j                  ||      \  }}|j                  ||||f       |j                  | _        t        || j                        | _        |j                  | _	        ||j                         z  }||z  } |||fS )Nr   rz   )r   r:   run_testr   rQ   r   r^   r   r   rf   	tests_run)r=   r  r  r  r   target_testr\   r   s           r   r  z'MutationController.load_and_check_testst  s    (,(8(8(=(=(?$K#}}[+FFH
 fk8 LM$/$8$8D! '%)%<%<DJ %//DOv//11Oh&N- )@0 ^_<<r   c                 :    | j                   j                  ||      S rK   )r   r  )r=   r   r  s      r   r  zMutationController.run_test  s    {{##K==r   c                 <   | j                  |      }| j                  ||      \  }}|r' | j                  j                  |j	                           | j
                  j                  ||||      D ]  \  }}| j                  j                  dz   }	| j                  r*| j                  |	k7  r| j                  j                          U| j                  |	|||       | j                  ||      }
|
r| j                  ||
||       | j                  j                           y )Nr  rt   )create_target_astinject_coverager   r   
get_resultr   mutater%   r   r   notify_mutationcreate_mutant_modulerun_tests_with_mutant)r=   r  r  r  
target_astcoverage_injectorcoverage_result	mutations
mutant_astr   mutant_modules              r   r
  z MutationController.mutate_module  s   ++M:
-1-A-A*m-\*?&DJJ&&(9(D(D(FG%)%:%:%A%A*iYjIV &B &X!Iz"jj44q8O##(<(<(O

**,  )]JW 55mZPM**>=)Ude

**,&Xr   c                 :    | j                   j                  ||      S rK   )r   r  )r=   r#  r  s      r   r  z"MutationController.inject_coverage  s    {{**:}EEr   c                     t        |j                        5 }t        j                  |j	                               cd d d        S # 1 sw Y   y xY wrK   )open__file__r   
create_astread)r=   r  r   s      r   r  z$MutationController.create_target_ast  s5    -(()[##K$4$4$67 *))s   #AAc                     	 | j                   5  t        j                  ||j                        cd d d        S # 1 sw Y   y xY w# t        $ r}| j                  d|d       Y d }~y d }~ww xY w)N)ast_nodemodule_namer   )r  )r   r   create_modulerQ   BaseExceptionnotify_incompetent)r=   r  r'  r  s       r   r!  z'MutationController.create_mutant_module  s_    	$$**' - 6 6 %$$
  	##AyA#>	s0   A !9	A AA A 	A,A''A,c                     ||g k(  ry |D cg c]  }t        |j                         }}| j                  j                  j	                  |D cg c]  }| j                  j
                  |    c}       y c c}w c c}w rK   )r   rb   r   r   r   rf   )r=   real_killersr&  rr   mut_killer_test_namests         r   update_apfd_listz#MutationController.update_apfd_list  s}    <2#5 LX X<4!3DII!>< X 	

++22Wl4mWlRSTZZ5J5J15MWl4mo !Y 5ns   A6 A;c                     |D cg c]  }|j                   j                   }}|y g }|j                  D ]  }t        |j                        }|| j
                  v rB| j
                  |   j                  }|j                  }	| j                  j                  ||	      rh|| j                  j                  vrg | j                  j                  |<   | j                  j                  |   j                  |       |j                  |        |S c c}w rK   )operatorrQ   killerr   rb   r   long_messager   rI   r   rc   r   )
r=   r\   r&  mutationmutated_operatorsr6  r<  full_test_namebefore_mutation_outafter_mutation_outs
             r   update_per_test_matrixz)MutationController.update_per_test_matrix  s    IRR	HX..77	R>mmF/<N !;!;; '+&@&@&P&]&]#%+%8%8"??112EGYZ TZZ%=%==;=

((8 JJ$$^4;;<MN') $, ; Ss   Dc                 B   |D cg c]  }|j                   j                   }}| j                  j                  j	                  |       t        |      }|| j                  j                  vrdddd| j                  j                  |<   |t        |      nd}| j                  j                  |   dxx   dz  cc<   | j                  j                  |   dxx   |z  cc<   | j                  j                  |   dxx   | j                  j                  |z
  z  cc<   y c c}w )Nr   )r   r   r   r   rt   r   r   )	r;  rQ   r   rm   r   strrn   r"   re   )r=   r6  r&  r>  r?  	mutant_idkilled_mutss          r   update_mutant_statsz&MutationController.update_mutant_stats  s    HQR	HX..77	R

$$++,=> )*	DJJ7776DJJ''	2 ,8+Cc,'

##I.{;q@;

##I.x8KG8

##I.z:djj>R>RU`>``:# Ss   Dc                     | j                   j                  ||||      \  }}| j                  ||      }| j                  ||       | j	                  ||       | j                  |||       y rK   )r   r"  rC  rH  r9  update_score_and_notify_views)r=   r  r(  r&  r%  r\   r   r6  s           r   r"  z(MutationController.run_tests_with_mutant  sk    ;;<<^]\egvw 2269E  y9lI6 	**68\Jr   c                     |s| j                  |       y |j                  r| j                  ||       y t        |      dk(  r| j	                  ||       y | j                  |||       y r   )update_timeout_mutantis_incompetentupdate_incompetent_mutantr"   update_survived_mutantupdate_killed_mutant)r=   r\   mutant_durationr6  s       r   rJ  z0MutationController.update_score_and_notify_views  s]    &&7
 ""**6?C!#''@%%fo|Lr   c                 Z    | j                  |       | j                  j                          y rK   )notify_timeoutr   r   )r=   r   s     r   rL  z(MutationController.update_timeout_mutant  s     H%

 r   c                     | j                  ||j                  |j                         | j                  j	                          y rK   )r4  r  r  r   r   r=   r\   r   s      r   rN  z,MutationController.update_incompetent_mutant   s0    &*:*:F<L<LM

""$r   c                 p    | j                  ||j                         | j                  j                          y rK   )notify_survivedr  r   r   rU  s      r   rO  z)MutationController.update_survived_mutant$  s(    Xv'7'78

!r   c           	          | j                  |t        |D cg c]  }|j                   c}      |j                  |j                         | j
                  j                          y c c}w rK   )notify_killedrE  rb   exception_tracebackr  r   r   )r=   r\   r   r6  kills        r   rP  z'MutationController.update_killed_mutant(  sR    8S)M$)))M%NPVPjPjlrl|l|}

 *Ns   A%)   FFNg?r\  )r   N)rQ   rR   rS   r>   rE  r   r   r   r   r   r   r  r   r  r  r   TimeRegisterr
  r  r  r!  r9  rC  rH  r"  rJ  rL  rN  rO  rP  __classcell__r   s   @r   r   r      s     `d675(8C 8D 86
:c :d :(-9S 9T 9&$@=<> - -$F 8 8 	 	
p Fa*
KM!%" r   r   c                       e Zd ZddZddZy)HOMStrategyc                     || _         y rK   order)r=   rd  s     r   r>   zHOMStrategy.__init__0  s	    
r   c                 <   |D ]  }|d d  D ]  }|j                   |j                   k(  sa|j                   |j                   j                  v s?|j                   |j                   j                  v s|rc|j                  |j                  k(  s}|j                  |         y rK   )nodechildrenr;  remove)r=   mutations_to_applyavailable_mutationsallow_same_operatorsmutation_to_applyavailable_mutations         r   remove_bad_mutationsz HOMStrategy.remove_bad_mutations3  s    !3&9!&<"$))-?-D-DD)..2D2I2I2R2RR*//3D3I3I3R3RR16G6P6PTfToTo6o'../AB '= "4r   N)r   )T)rQ   rR   rS   r>   rn  r   r   r   ra  ra  .  s    Cr   ra  c                       e Zd ZdZd Zy)FirstToLastHOMStrategyFIRST_TO_LASTc              #   b  K   |d d  }|rg }d}|d d  }t        |      | j                  k  rl|rj	 |j                  |      }|j                  |       |j	                  |       |dk(  rdnd}| j                  ||       t        |      | j                  k  r|rj| |ry y # t
        $ r Y w xY ww)Nr   r   r"   rd  popr   rh  
IndexErrorrn  )r=   r&  ri  r.   rj  r>  s         r   generatezFirstToLastHOMStrategy.generate@  s     aL	!#E"+A,()DJJ6;N266u=H&--h7$$X.!&"A"E ))*<>QR ()DJJ6;N %$  " s4   +B/<B  *,B/B/B/ 	B,)B/+B,,B/NrQ   rR   rS   rb   rv  r   r   r   rp  rp  =  s    D%r   rp  c                       e Zd ZdZd Zy)EachChoiceHOMStrategyEACH_CHOICEc              #   L  K   |d d  }|rg }|d d  }t        |      | j                  k  rc|ra	 |j                  d      }|j                  |       |j	                  |       | j                  ||       t        |      | j                  k  r|ra| |ry y # t
        $ r Y w xY wwr   rs  r=   r&  ri  rj  r>  s        r   rv  zEachChoiceHOMStrategy.generateU  s     aL	!#"+A,()DJJ6;N266q9H&--h7$$X. ))*<>QR ()DJJ6;N %$  " s4   )B$3B ,B$B$B$	B!B$ B!!B$Nrw  r   r   r   ry  ry  R  s    D%r   ry  c                       e Zd ZdZd Zy)BetweenOperatorsHOMStrategyBETWEEN_OPERATORSc              #     K   |D ci c]  }|d c}|d d  }|rg }|d d  }|j                  fd       t        |      | j                  k  rv|rt|j                  d      }|j	                  |       |   s|j                  |       |xx   dz  cc<   | j                  ||d       t        |      | j                  k  r|rt| |ry y c c}w w)Nr   c                     |    S rK   r   )r   usages    r   r   z6BetweenOperatorsHOMStrategy.generate.<locals>.<lambda>n  s	    58r   )keyrt   F)rk  )sortr"   rd  rt  r   rh  rn  )r=   r&  r>  not_usedri  rj  r  s         @r   rv  z$BetweenOperatorsHOMStrategy.generateh  s     -67Y1Y7Q<!#"+A,$$);$<()DJJ6;N.2215"))(3XOOH-h1$))*<>Qhm)n ()DJJ6;N %$  8s   C
CB3CCCNrw  r   r   r   r~  r~  e  s    D%r   r~  c                   B     e Zd ZdZej
                  d fd
Zd Z xZS )RandomHOMStrategyRANDOM)shufflerc                2    t        |   |i | || _        y rK   )r   r>   r  )r=   r  argskwargsr   s       r   r>   zRandomHOMStrategy.__init__|  s    $)&) r   c              #   n  K   |d d  }| j                  |       |rg }|d d  }t        |      | j                  k  rc|ra	 |j                  d      }|j	                  |       |j                  |       | j                  ||       t        |      | j                  k  r|ra| |ry y # t        $ r Y w xY wwr   )r  r"   rd  rt  r   rh  ru  rn  r|  s        r   rv  zRandomHOMStrategy.generate  s     aL	i !#"+A,()DJJ6;N266q9H&--h7$$X. ))*<>QR ()DJJ6;N %$  " s4   :B53B& 0,B5B5$B5&	B2/B51B22B5)	rQ   rR   rS   rb   r   r   r>   rv  r^  r_  s   @r   r  r  y  s    D'-~~ !%r   r  c                       e Zd ZddZddZy)FirstOrderMutatorc                 F    || _         t        j                  |      | _        y rK   )	operatorsr   RandomSamplersampler)r=   r  
percentages      r   r>   zFirstOrderMutator.__init__  s    "**:6r   Nc              #      K   t        j                  | j                        D ]6  } |       j                  ||| j                  ||      D ]  \  }}|g|f  8 y wNr  )r   sort_operatorsr  r  r  )r=   r#  r  r$  r  r   r>  r   s           r   r  zFirstOrderMutator.mutate  sW     &&t~~6B$&DKK
It||UfouK$v &j&(( %w 7s   AA)r   NNN)rQ   rR   rS   r>   r  r   r   r   r  r    s    7)r   r  c                   8     e Zd Zdd fd
ZddZd Zd Z xZS )HighOrderMutatorN)hom_strategyc                N    t        |   |i | |xs t        d      | _        y )Nr   rc  )r   r>   rp  r  )r=   r  r  r  r   s       r   r>   zHighOrderMutator.__init__  s(    $)&)(K,B,Kr   c           
   #     K   | j                  ||||      }| j                  j                  |      D ]  }g }g }|}	|D ]g  }
|
j                         j	                  |	|| j
                  |||
      }	 |j                         \  }}	|j                  |       |j                  |       i ||	f | j                  |        y # t        $ r J d       w xY ww)N)r  r  r$  r  only_mutationzno mutations!)
generate_all_mutationsr  rv  r;  r  r  __next__StopIterationr   finish_generators)r=   r#  r  r$  r  r&  ri  
generatorsapplied_mutationsr   r>  	generatornew_mutations                r   r  zHighOrderMutator.mutate  s     //0A6:W`a	"&"3"3"<"<Y"GJ "F.$--/66' LL&7!"* 7 	2+4+=+=+?(L& "((6!!), / $V++"":.) #H % 21/152s   A-C0C>CCCc                     g }t        j                  | j                        D ]6  } |       j                  ||d ||      D ]  \  }}|j	                  |        8 |S r  )r   r  r  r  r   )	r=   r$  r  r#  r  r&  r   r>  r  s	            r   r  z'HighOrderMutator.generate_all_mutations  s\    	&&t~~6B!t{{:y$HYbh{i!  *  j 7 r   c                 p    t        |      D ]  }	 |j                          J d        y # t        $ r Y (w xY w)Nztoo many mutations!)reversedr  r  )r=   r  r  s      r   r  z"HighOrderMutator.finish_generators  sC    !*-I""$ 0//5 . ! s   )	55r  )rQ   rR   rS   r>   r  r  r  r^  r_  s   @r   r  r    s    +/ L/00r   r  )(r   r   timer   r   r	   r9   r8   pandasr   r/   mutpyr   r   tupler   r   r   r'   r   rE  r4   r6   r:   r;   boolrI   	ExceptionrZ   r^   ViewNotifierr   ra  rp  ry  r~  r  hom_strategiesr  r  r   r   r   <module>r     s+    
   	     	 U 
MHC
O",, O O O' '@ n4 4) Hm HmVD ++ D N
C C%[ %*%K %&%+ %(% %2  		) 	)+0( +0r   