Ë
    cQêjGE  ã                   ó†  — 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Zd dlZd dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZ  ej&                  d«      Zd'd„Z G d„ d	«      Zd
„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zd„ Zddgfdefd„Zd„ Z d„ Z!d„ Z"d„ Z#defd„Z$e%dk(  �rv e«       Z& ee&jN                  «       e&jP                  dk  s+e&jR                  dk  se&jP                  e&jR                  z  dk  rejU                  d«       ejV                  jY                  e&j                  «      rfe&jZ                  sZe&j\                  s e/d e&j                  › d!�«      ‚eja                  d"e&j                  «        ejb                  e&j                  «        ee&jP                  e&jR                  e&j                  «      Z2e&jZ                  s	 e$e2e&«       	  ee2jf                  «      Z4eja                  d$«       e2jf                  jq                  d%d&«      Z9 ee4e9«       yy# e5$ r- ejm                  d#e2jf                  › �«       e2jn                  Z4Y Œiw xY w)(é    N)Úget_ort_environment_variablesÚsetup_logger)Úmain)ÚPRETRAINED_GPT2_MODELSÚ
Gpt2Helper)Ú	OnnxModelÚ c           
      ó  — t        j                  «       }|j                  dddt        ddj	                  t
        «      z   ¬«       |j                  ddt        d	d
¬«       |j                  ddt        dd¬«       |j                  ddt        dd¬«       |j                  dddd¬«       |j                  d¬«       |j                  dddd¬«       |j                  d¬«       |j                  dddd¬«       |j                  d¬«       |j                  ddd¬«       |j                  d¬«       |j                  d ddd!¬«       |j                  d¬"«       |j                  d#ddd$¬«       |j                  d¬%«       |j                  | «      }|S )&Nz-mz--model_name_or_pathTz2Model path, or pretrained model name in the list: z, )ÚrequiredÚtypeÚhelpz--csvFzgpt2_parity_results.csvz#path of csv file to save the result)r   r   Údefaultr   z--test_casesiô  znumber of test cases per runz--runsé(   znumber of repeated runsú	--use_gpuÚ
store_truezuse GPU for inference)r   Úactionr   )Úuse_gpuz--allz'run all combinations of mixed precision)Úallz-eú--use_external_data_format)r   r   )Úuse_external_data_formatz	--verbose)Úverbosez--skip_testzEdo not run test, and only rank experiments based on existing csv file)Ú	skip_testz--overwritezOverwrite existing csv file)Ú	overwrite)	ÚargparseÚArgumentParserÚadd_argumentÚstrÚjoinr   ÚintÚset_defaultsÚ
parse_args)ÚargvÚparserÚargss      úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/gpt2/gpt2_parity.pyÚparse_argumentsr&      sÉ  € Ü×$Ñ$Ó&€Fà
×ÑØØØÜØAÀDÇIÁIÔNdÓDeÑeð ô ð ×ÑØØÜØ)Ø2ð ô ð ×ÑØØÜØØ+ð ô ð ×Ñ˜¨5´sÀBÐMfÐÔgà
×Ñ˜¨e¸LÐOfÐÔgØ
×Ñ ÐÔ&à
×ÑØØØØ6ð	 ô ð ×Ñ˜EÐÔ"à
×Ñ˜Ð:ÀUÐS_ÐÔ`Ø
×Ñ°ÐÔ7à
×Ñ˜¨e¸LÐÔIØ
×Ñ ÐÔ&à
×ÑØØØØTð	 ô ð ×Ñ %ÐÔ(à
×ÑØØØØ*ð	 ô ð ×Ñ %ÐÔ(à×Ñ˜TÓ"€Dà€Kó    c                   ó   — e Zd Zd„ Zd„ Zy)Ú
ParityTaskc                 óJ   — || _         || _        || _        g | _        d| _        y )Nr   )Ú
total_runsÚ
test_casesÚcsv_pathÚresultsÚrun_id)Úselfr,   r+   r-   s       r%   Ú__init__zParityTask.__init__b   s%   € Ø$ˆŒØ$ˆŒØ ˆŒØˆŒØˆ�r'   c                 ó®  — t         j                   j                  «       j                  d«      }|› d| j                  › �}| xj                  dz  c_        	 t	        g |¢d‘| j
                  › ‘d‘| j                  › ‘||| j                  ¬«      }|r| j                  j                  |«       |S # t        $ r t        j                  d|› �«       d }Y |S w xY w)Nz%Y%m%d%H%M%SÚ_é   z-tz-r)Úexperiment_namer/   Úcsv_filenamezFailed to run experiment )ÚdatetimeÚnowÚstrftimer/   r   r,   r+   r-   r.   ÚappendÚ	ExceptionÚloggerÚ	exception)r0   r"   r5   Ú
start_timer/   Úresults         r%   ÚrunzParityTask.runi   sÙ   € Ü×&Ñ&×*Ñ*Ó,×5Ñ5°nÓEˆ
Ø�<˜q §¡ Ð.ˆØ�Š�qÑ�ð	ÜØO�$ÐO˜ÐO §¡Ð 1ÐO°DÐO¸T¿_¹_Ð<MÐOØ /ØØ!Ÿ]™]ô	ˆFñ Ø—‘×#Ñ# FÔ+ð
 ˆøô	 ò 	Ü×ÑÐ8¸Ð8IÐJÔKØ‰Fàˆð		ús   ÁAB- Â-#CÃCN)Ú__name__Ú
__module__Ú__qualname__r1   r@   © r'   r%   r)   r)   a   s   „ òór'   r)   c                 ó®   — g }dd l }t        | d¬«      5 } |j                  |«      }|D ]  }|j                  |«       Œ 	 d d d «       |S # 1 sw Y   |S xY w)Nr   r	   ©Únewline)ÚcsvÚopenÚ
DictReaderr:   )r-   ÚrowsrH   ÚcsvfileÚreaderÚrows         r%   Úload_results_from_csvrO   ~   s_   € Ø€DÛä	ˆh Ô	#ð  wØ�—‘ Ó(ˆØò 	ˆCØ�K‰K˜Õñ	÷ð €K÷	ð €Kús   ”+A
Á
Ac                 óh   — | D ]#  }|j                  d«      sŒt        | |   «      c S  t        d«      ‚)Nzaverage_latency(batch_size=z)Failed to get average_latency from output)Ú
startswithÚfloatÚRuntimeError)rN   Únames     r%   Úget_latencyrU   ‰   s;   € Øò $ˆØ�?‰?Ð8Õ9Ü˜˜T™Ó#Ò#ð$ô ÐBÓ
CÐCr'   c                 ór   — t        | «      }t        | d   «      }t        | d   «      }|dz  |dz  z
  |dz  z
  S )z@Scoring function based on 3 metrics. The larger score is better.Útop1_match_rateÚonnx_size_in_MBiè  é
   éd   )rU   rR   )rN   Úlatency_in_msrW   rX   s       r%   Úscorer\   ‘   sK   € ä Ó$€MÜ˜CÐ 1Ñ2Ó3€OÜ˜CÐ 1Ñ2Ó3€Oà˜TÑ! M°BÑ$6Ñ6¸È3Ñ9NÑNÐNr'   c                 ó(  ‡
— t        «        t        d«       i Š
|D ]
  }|‰
|d   <   Œ t        t        | j                  «       ˆ
fd„d¬«      «      }t        j                  |› d|› �«       t        j                  d|› d�«       d	}d
}t        |j                  «       «      D ]p  \  }\  }}	|	|k7  r|}|	}|D ]Z  }|d   |k(  sŒt        j                  dj                  ||	|t        |«      t        |d   «      |d   |d   t        «       «      «        Œp Œr y )Nz
**********r/   c                 ó0   •— | d   t        ‰| d      «      fS )Nr4   r   )r\   )ÚitemÚrow_maps    €r%   ú<lambda>zprint_wins.<locals>.<lambda>¥   s   ø€ ˜d 1™g¤u¨W°T¸!±WÑ-=Ó'>Ð?€ r'   T)ÚkeyÚreversez Wins:z	Based on z* wins and a scoring function, the ranking:r   éÿÿÿÿza{:02d}: WINs={:02d}, run_id={}, latency={:5.2f}, top1_match={:.4f}, size={}_MB, experiment={}, {}rW   rX   Ú
experiment)ÚprintÚdictÚsortedÚitemsr<   ÚdebugÚinfoÚ	enumerateÚformatrU   rR   r   )ÚwinsrK   Ú	test_namerN   Úsorted_winsÚrankÚprevious_valueÚcountrb   Úvaluer`   s             @r%   Ú
print_winsru   š   s5  ø€ Ü	„GÜ	ˆ(„Oà€GØò %ˆØ!$ˆ��H‘Òð%ô ÜØ�J‰J‹LÛ?Øô	
ó€Kô ‡L�L�I�;˜f [ MÐ2Ô3Ü
‡K�K�)˜I˜;Ð&PÐQÔRà€DØ€NÜ(¨×):Ñ):Ó)<Ó=ò Ñˆ‰|��UØ�NÒ"ØˆDØˆàò 	ˆCØ�8‰} Ó#Ü—‘Øw×~Ñ~ØØØÜ# CÓ(Ü˜cÐ"3Ñ4Ó5ØÐ-Ñ.Ø˜LÑ)Ü5Ó7ó	ôñ ñ	ñr'   c                 ó  — i }i }| D ]  }|d   }d||<   d||<   Œ t        |dd¬«      5 }g d¢}t        j                  ||¬«      }|j                  «        g d¢}	t	        | «      }
t        |
d	z
  «      D �]¼  }| |   }t        |d
   t        «      rt        j                  |d
   «      }n|d
   }t        |d	z   |
d	«      D �]o  }| |   }d}|	D ]  }||   ||   k7  sŒd} n |sŒ$t        |d
   t        «      rt        j                  |d
   «      }n|d
   }	 t        j                  j                  ||dd¬«      \  }}t        j                  j                  ||dd¬«      \  }}|�C|dk  r>t        |d   «      t        |d   «      kD  r||d   xx   d	z  cc<   n||d   xx   d	z  cc<   |dk  r>t        |d   «      t        |d   «      kD  r||d   xx   d	z  cc<   n||d   xx   d	z  cc<   |d   |d   |d   t        |d   «      |d   |d   t        |d   «      ||||dœ}|j!                  |«       �Œr �Œ¿ 	 ddd«       t"        j%                  d|› �«       t'        || d«       t'        || d«       y# t        $ r d}d}Y �ŒFw xY w# 1 sw Y   ŒPxY w)zRun U test and T test.r/   r   Úwr	   rF   )Ú
model_nameÚrun_id_1Úexperiment_1Útop1_match_rate_1Úrun_id_2Úexperiment_2Útop1_match_rate_2ÚU_statisticÚU_pvalueÚT_statisticÚT_pvalue)Ú
fieldnames)rx   r,   Úrunsr4   Útop1_match_rate_per_runTFz	two-sided)Úuse_continuityÚalternativeN)ÚaxisÚ	equal_vargš™™™™™©?rW   rx   re   z(U-Test and T-Test results are output to zU-TestzT-Test)rI   rH   Ú
DictWriterÚwriteheaderÚlenÚrangeÚ
isinstancer   ÚjsonÚloadsÚscipyÚstatsÚmannwhitneyuÚ
ValueErrorÚ	ttest_indrR   Úwriterowr<   rk   ru   )rK   Úoutput_csv_pathÚ
utest_winsÚ
ttest_winsrN   r/   rL   Úcolumn_namesÚwriterÚrequired_match_columnsÚnum_resultsÚiÚresult1ÚaÚjÚresult2Úall_matchedÚcolumnÚbÚutest_statisticÚutest_pvalueÚttest_statisticÚttest_pvalues                          r%   Úrun_significance_testrª   Ä   s  € à€JØ€JØò ˆØ�X‘ˆØˆ
�6ÑØˆ
�6Òðô
 
ˆo˜s¨BÔ	/ð O%°7ò
ˆô —‘ °LÔAˆØ×ÑÔâ!EÐÜ˜$“iˆÜ�{ Q‘Ó'ó ;	%ˆAØ˜1‘gˆGä˜'Ð";Ñ<¼cÔBÜ—J‘J˜wÐ'@ÑAÓB‘àÐ5Ñ6�ä˜1˜q™5 +¨qÓ1ó 3%�Ø˜q™'�à"�Ø4ò �FØ˜v‘¨'°&©/Ó9Ø&+˜Ùðñ #Øä˜gÐ&?Ñ@Ä#ÔFÜŸ
™
 7Ð+DÑ#EÓF‘AàÐ 9Ñ:�Að(Ü49·K±K×4LÑ4LØ˜1¨T¸{ð 5Mó 5Ñ1�O \ô 16·±×0EÑ0EÀaÈÐQUÐaeÐ0EÓ0fÑ-� àÐ+°¸tÒ0CÜ˜WÐ%6Ñ7Ó8¼5ÀÐIZÑA[Ó;\Ò\Ø" 7¨8Ñ#4Ó5¸Ñ:Ô5à" 7¨8Ñ#4Ó5¸Ñ:Ó5à $Ò&Ü˜WÐ%6Ñ7Ó8¼5ÀÐIZÑA[Ó;\Ò\Ø" 7¨8Ñ#4Ó5¸Ñ:Ô5à" 7¨8Ñ#4Ó5¸Ñ:Ó5ð #*¨,Ñ"7Ø '¨Ñ 1Ø$+¨LÑ$9Ü).¨wÐ7HÑ/IÓ)JØ '¨Ñ 1Ø$+¨LÑ$9Ü).¨wÐ7HÑ/IÓ)JØ#2Ø ,Ø#2Ø ,ñ�ð —‘ Ö$òg3%ñ;	%÷)O%ô` ‡K�KÐ:¸?Ð:KÐLÔMÜˆz˜4 Ô*Üˆz˜4 Õ*øôE "ò (Ø&*�OØ#'“Lð(ú÷aO%ð O%ús7   ©B.JÃ9JÄ&I.Ä8C:JÉ.I?	É;JÉ>I?	É?JÊJÚraw_onnx_modelc                 óÖ  — t        j                  | «      }t        |«      }|j                  «       }|j                  j
                  d   j                  |v sJ ‚||j                  j
                  d   j                     }|j                  dk(  r.t        j                  d|j                  › �«       |j                  S t        j                  d|j                  › d|j                  › �«       y )Nr   ÚMatMulz#Found last MatMul node for logits: z-Failed to find MatMul node for logits. Found z	 of node )ÚonnxÚloadr   Úoutput_name_to_nodeÚgraphÚoutputrT   Úop_typer<   rk   Úwarning)r«   ÚmodelÚ
onnx_modelr°   Únodes        r%   Úget_last_matmul_node_namer¸   "  sÄ   € Ü�I‰I�nÓ%€EÜ˜5Ó!€JØ$×8Ñ8Ó:Ðà�;‰;×Ñ˜aÑ ×%Ñ%Ð)<Ñ<Ð<Ð<Ø˜uŸ{™{×1Ñ1°!Ñ4×9Ñ9Ñ:€DØ‡|�|�xÒÜ�‰Ð9¸$¿)¹)¸ÐEÔFØ�y‰yÐä
‡N�NÐBÀ4Ç<Á<À.ÐPYÐZ^×ZcÑZcÐYdÐeÔfØr'   c                 ó¾   — | j                   }d|› d�j                  «       }| j                  r|j                  d«       |ddd|gz  }|r|j	                  dg|¢«       |S )Nú-m ú -o --use_gpu -p fp16r   ú--io_block_listÚlogitsz--node_block_listú--op_block_list)Úmodel_name_or_pathÚsplitr   r:   Úextend)r$   Úlast_matmul_node_nameÚop_block_listrµ   Ú
parameterss        r%   Úget_mixed_precision_parametersrÅ   1  sz   € Ø×#Ñ#€EØ�u�gÐ2Ð3×9Ñ9Ó;€JØ×$Ò$Ø×ÑÐ6Ô7ØØØØØð	ñ €Jñ Ø×ÑÐ,Ð=¨}Ð=Ô>àÐr'   ÚFastGeluÚLayerNormalizationÚtaskc                 ó¾   — t        |||«      }dj                  t        |«      «      }|rd|› d�}nd|› d�}t        «       }|r	|d|› d�z   }| j	                  ||«       y )Nú,úMixed precision baseline + ú in FP32z=Mixed precision baseline (logits output and last MatMul node z	 in FP32)z (ú))rÅ   r   rh   r   r@   )rÈ   r$   rÂ   rÃ   rÄ   Úop_block_list_strrT   Úenv_varss           r%   Úrun_candidaterÐ   C  sw   € ô 0°Ð6KÈ]Ó[€JØŸ™¤¨Ó!6Ó7ÐáØ,Ð->Ð,?¸xÐH‰àNÐOdÐNeÐenÐoˆä,Ó.€HÙØ˜˜8˜* AÐ&Ñ&ˆà‡H�HˆZ˜Õr'   c                 ó   — | j                   }d|› d�j                  «       }| j                  r|j                  d«       | j                  r|j                  d«       d|› d�j                  «       }| j                  r|j                  d«       ||fS )Nrº   z -o -p fp32r   r   r»   )r¿   rÀ   r   r:   r   )r$   rµ   Úfp32_baselineÚfp16_baselines       r%   Úget_baselinesrÔ   X  sŒ   € Ø×#Ñ#€EØ˜%˜ Ð,×2Ñ2Ó4€MØ‡|‚|Ø×Ñ˜[Ô)Ø×$Ò$Ø×ÑÐ9Ô:à˜%˜Ð 5Ð6×<Ñ<Ó>€MØ×$Ò$Ø×ÑÐ9Ô:à˜-Ð'Ð'r'   c                 ó   — ddg}| j                  ||z   d«       dg}| j                  ||z   d«       | j                  ||z   dgz   t        |«      z   dgz   d«       g }|}|D ]L  }dg|D �	cg c]
  }	|	|k7  sŒ	|	‘Œ c}	z   }
| j                  ||z   |
z   d	|› d
�«      }|sŒ<|j                  |«       ŒN t        |d„ ¬«      }t	        d|«       yc c}	w )z:Step 0 is to check which operator in FP16 causes most lossr¼   r½   zFP16 except logitsz--keep_io_typeszGraph I/O FP32, Other FP16r¾   z--force_fp16_initializerszFP32 except weights in FP16zFP32 except z in FP16c                 ó   — | d   S )NrW   rD   )Úys    r%   ra   z"run_tuning_step0.<locals>.<lambda>~  s   € ¸!Ð<MÑ:N€ r'   )rb   z<step 0: optimized operator causes the most loss in precisionN)r@   Úlistr:   Úminrf   )rÈ   rÓ   Úall_opsÚoptimized_opsÚfp32_logitsÚfp32_ioÚoptimized_ops_resultsÚop_listÚopÚorÃ   r?   Ú
min_results                r%   Úrun_tuning_step0rã   g  s  € à$ hÐ/€KØ‡H�Hˆ]˜[Ñ(Ð*>Ô?à Ð!€GØ‡H�Hˆ]˜WÑ$Ð&BÔCð 	‡H�HØ˜ÑÐ#4Ð"5Ñ5¼¸W»ÑEÐIdÐHeÑeØ%ôð
 ÐØ€GØò 1ˆØ*Ð+¸'Ö.M°QÀQÈ"ÃWªqÒ.MÑMˆØ—‘˜-¨'Ñ1°MÑAÀ\ÐRTÐQUÐU]ÐC^Ó_ˆÚØ!×(Ñ(¨Õ0ð	1ô Ð*Ñ0NÔO€JÜ	Ð
HÈ*ÕUùò /Ns   Á*
CÁ5Cc                 óL   — |D ]  }d|g}| j                  ||z   d|› d�«       Œ! y)zKStep 1 is to figure out which optimized operator in FP32 could benefit mostr¾   rË   rÌ   N)r@   )rÈ   Úmixed_precision_baselinerÛ   rà   rÃ   s        r%   Úrun_tuning_step1ræ   ‚  s;   € àò 
ˆØ*¨BÐ/ˆØ�‰Ø$ }Ñ4Ø)¨"¨¨XÐ6õ	
ñ
r'   c           	      óÐ   — g d¢}|D �cg c]	  }||v sŒ|‘Œ }}|D ]D  }||vsŒg |¢|‘}| j                  g |¢d‘|¢dj                  dj                  |«      |«      «       ŒF yc c}w )z�Assumed that you have run step 0 and 1 to figure out that Logits FP32 and some operators shall be in FP32,
    This step will try add one more operator.
    )rÆ   rÇ   ÚSkipLayerNormalizationr¾   z(Mixed precision baseline + {},{} in FP32rÊ   N)r@   rm   r   )rÈ   rå   rÛ   Úcandidate_fp32_opsÚxÚfp32_opsrà   rÃ   s           r%   Úrun_tuning_step2rì   Œ  s‰   € ò VÐØ-ÖD�a°°mÒ1C’ÐD€HÐDØò ˆØ�XÒØ+˜h˜O¨˜OˆMØ�H‰HØNÐ*ÐNÐ,=ÐNÀÐNØ:×AÑAÀ#Ç(Á(È8ÓBTÐVXÓYõñùò Es
   ‰	A#“A#c           	      ó0  ‡
— t        j                  d|j                  |j                  g ¬«      }t	        |«      \  }}| j                  |d«      }g }|rd|v r|d   r|d   j                  d«      }nt        d«      ‚g Š
|rd|v r|d   r|d   j                  d«      Š
nt        d«      ‚|j                  st        j                  d	«       y | j                  |d
«       t        |d   «      }t        | ||g ¬«       ˆ
fd„}|j                  r7t        | |‰
|«       t        ||g ¬«      }	t!        | |	|«       t#        | |	|«       n't        | || |g d¢«      ¬«       t        | ||dg¬«       t        | || |g d¢«      ¬«       t        | || |g d¢«      ¬«       y )NÚonnx_models)Ú
new_folderÚremove_existingzFP32 baselineÚoptimized_operatorsrÊ   z!Failed to get optimized operatorsÚ	operatorszFailed to get operatorsz5skip mixed precision since --use_gpu is not specifiedzFP16 baselineÚraw)rÃ   c                 ó8   •— | D �cg c]	  }|‰v sŒ|‘Œ c}S c c}w ©NrD   )rê   rà   rÚ   s     €r%   Úget_fp32_opsz run_parity.<locals>.get_fp32_ops¿  s   ø€ ØÖ0�r "¨¢-’Ò0Ð0ùÒ0s   †	�)rè   rÇ   ÚAddrÆ   )rÆ   rè   rÇ   r÷   )rÆ   ÚEmbedLayerNormalizationrè   rÇ   r÷   )r   Úget_onnx_pathsr¿   r   rÔ   r@   rÀ   rS   r   r<   rk   r¸   rÐ   r   rã   rÅ   ræ   rì   )rÈ   r$   Úonnx_model_pathsrÒ   rÓ   r?   rÛ   rÂ   rö   rå   rÚ   s             @r%   Ú
run_parityrû   ›  sµ  ø€ Ü!×0Ñ0ØØ×ÑØ×0Ñ0Øô	Ðô $1°Ó#6Ñ €M�=à�X‰X�m _Ó5€Fà€MÙÐ(¨FÑ2¸Ð?TÒ8UØÐ4Ñ5×;Ñ;¸CÓ@‰äÐ>Ó?Ð?à€GÙ�; &Ñ(¨f°[Ò.AØ˜Ñ%×+Ñ+¨CÓ0‰äÐ4Ó5Ð5ð �<Š<Ü�‰ÐKÔLØà‡H�Hˆ]˜OÔ,ä5Ð6FÀuÑ6MÓNÐô �$˜Ð3À2ÕFô1ð ‡x‚xÜ˜˜}¨g°}ÔEÜ#AÀ$ÐH]ÐmoÔ#pÐ Ü˜Ð7¸ÔGÜ˜Ð7¸ÕGäØØØ!Ù&Ò'^Ó_õ		
ô 	�d˜DÐ"7È
À|ÕTô ØØØÙ"Ò#fÓgõ	ô ØØØÙ"Újó
ö	r'   Ú__main__rZ   é   i'  zŽNot enough test cases or runs to get stable results or test significance. Recommend test_cases >= 100, runs >= 20, test_cases * runs >= 10000.zOutput file zK existed. Please remove the file, or use either --skip_test or --overwrite.z6Remove existing file %s since --overwrite is specifiedzFailed to load csv z#Start running significance tests...z.csvz
.stats.csvrõ   ):r   rH   r7   r�   ÚloggingÚosr®   Úscipy.statsr‘   Úbenchmark_helperr   r   Úconvert_to_onnxr   Úgpt2_helperr   r   r¶   r   Ú	getLoggerr<   r&   r)   rO   rU   r\   ru   rª   r   r¸   rÅ   rÐ   rÔ   rã   ræ   rì   rû   rA   r$   r   r,   r„   r´   ÚpathÚexistsr   r   rS   rk   ÚremoverÈ   r-   rK   r;   r=   r.   ÚreplaceÚsummary_csvrD   r'   r%   ú<module>r
     s&  ðó Û 
Û Û Û Û 	ã Û ß HÝ  ß :Ý  à	ˆ×	Ñ	˜2Ó	€ó@÷Fñ ò:òDòOò'òT[+ð|¨có òð, Ð3Ð4ñ	Ø
óò*(òVò6
òðC�Zó CðL ˆzÓÙÓ€DÙ�—‘Ôà‡�˜Ò §	¡	¨B¢°$·/±/ÀDÇIÁIÑ2MÐPUÒ2UØ�‰ðSô	
ð
 
‡w�w‡~�~�d—h‘hÔ¨¯ªØ�~Š~ÙØ˜tŸx™x˜jÐ(sÐtóð ð �K‰KÐPÐRV×RZÑRZÔ[ØˆB�I‰I�d—h‘hÔá�d—o‘o t§y¡y°$·(±(Ó;€Dà�>Š>Ù�4˜ÔðÙ$ T§]¡]Ó3ˆð
 ‡K�KÐ5Ô6Ø—-‘-×'Ñ'¨°Ó=€KÙ˜$ Õ,ðA øð4 ò Ø×ÑÐ.¨t¯}©}¨oÐ>Ô?Ø�|‰|Šðús   ÇH È/I È?I 