§
    kŠtjÜ:  ã                   ó  — 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 d dlmZ d dl	m
Z
 d dlZd dlZd dlmZmZmZ d dlmZ d dlZ ej        e¦  «        ZdZdZ G d	„ d
e¦  «        Zd„ Zd„ Zd„ Zedk    r e¦   «          dS dS )é    N)Údeque)Údatetime)ÚPath)Ú
ModelProtoÚTensorProtoÚnumpy_helper)Ú	OnnxModelÚconstant_shape_opt__Úreshape_input_shape__c                   óÂ   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd
„Z
	 dd„Zd„ Zd„ Zdefd„Zdee         fd„Z	 	 	 	 ddededededededee         dz  fd„Zˆ xZS )ÚBertOnnxModelShapeOptimizerz£
    This optimizer will replace Shape output or the shape input of Reshape node by initializer. Currently, it requires
    model inputs to have static shape.
    c                 óT   •— t          ¦   «                              |j        ¦  «         d S )N)ÚsuperÚ__init__Úmodel)ÚselfÚ
onnx_modelÚ	__class__s     €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/shape_optimizer.pyr   z$BertOnnxModelShapeOptimizer.__init__'   s$   ø€ Ý‰Œ×Ò˜Ô)Ñ*Ô*Ð*Ð*Ð*ó    c                 ó
  — t          j        |t           j        ¬¦  «        }|                      dt          ¦  «        }t
          j                             |t          j	        |j
        |¬¦  «        }|                      |¦  «         |S )z8
        Add an initializer for constant shape.
        ©ÚdtypeÚConstant)ÚnameÚ	data_typeÚdimsÚvals)ÚnpÚasarrayÚint64Úcreate_node_nameÚCONSTANT_SHAPE_NAME_PREFIXÚonnxÚhelperÚmake_tensorr   ÚINT64ÚshapeÚadd_initializer)r   r(   Úshape_valueÚconstant_shape_nameÚtensors        r   Úadd_shape_initializerz1BertOnnxModelShapeOptimizer.add_shape_initializer*   sz   € õ ”j ­b¬hÐ7Ñ7Ô7ˆØ"×3Ò3°JÕ@ZÑ[Ô[ÐÝ”×(Ò(Ø$Ý!Ô'ØÔ"Øð	 )ñ 
ô 
ˆð 	×Ò˜VÑ$Ô$Ð$Øˆr   c                 óÎ   — |                       ¦   «         }g }| j        j        j        D ]<}|j        dk    r/|j        d         |v r |                     |j        d         ¦  «         Œ=|S )zD
        Returns a list of output names of all Shape nodes.
        ÚShaper   )Úinput_name_to_nodesr   ÚgraphÚnodeÚop_typeÚoutputÚappend)r   r0   Úoutputsr2   s       r   Úget_shape_outputsz-BertOnnxModelShapeOptimizer.get_shape_outputs9   so   € ð #×6Ò6Ñ8Ô8ÐàˆØ”JÔ$Ô)ð 	3ð 	3ˆDØŒ|˜wÒ&Ð&Ø”;˜q”>Ð%8Ð8Ð8Ø—N’N 4¤;¨q¤>Ñ2Ô2Ð2øàˆr   c                 ó°   — |                       ¦   «          g }| j        j        j        D ]-}|j        dk    r |                     |j        d         ¦  «         Œ.|S )zG
        Returns a list of shape input names of Reshape nodes.
        ÚReshapeé   )Úoutput_name_to_noder   r1   r2   r3   r5   Úinput)r   Úshape_inputsr2   s      r   Úget_reshape_shape_inputsz4BertOnnxModelShapeOptimizer.get_reshape_shape_inputsG   s`   € ð 	× Ò Ñ"Ô"Ð"àˆØ”JÔ$Ô)ð 	3ð 	3ˆDØŒ|˜yÒ(Ð(Ø×#Ò# D¤J¨q¤MÑ2Ô2Ð2øàÐr   c                 ób  — g }g }| j         j        j        D ]ƒ}|j        dk    rv|j        d         }|                      dt          ¦  «        }t          j         	                    d|g|g¬¦  «        }| 
                    |¦  «         | 
                    |¦  «         Œ„|                      |¦  «         |S )zˆ
        For each Reshape node, create a Shape node for its first input.
        Returns the output names of these Shape nodes.
        r9   r   ÚReshape_Inputr/   )Úinputsr6   )r   r1   r2   r3   r<   r"   ÚRESHAPE_INPUT_SHAPE_PREFIXr$   r%   Ú	make_noder5   Ú	add_nodes)r   Úoutput_namesÚnodes_to_addr2   r<   Úoutput_nameÚ
shape_nodes          r   Úadd_shape_for_reshape_inputz7BertOnnxModelShapeOptimizer.add_shape_for_reshape_inputT   s¶   € ð
 ˆØˆØ”JÔ$Ô)ð 	1ð 	1ˆDØŒ|˜yÒ(Ð(Øœ
 1œ�Ø"×3Ò3°OÕE_Ñ`Ô`�Ý!œ[×2Ò2°7ÀEÀ7ÐU`ÐTaÐ2ÑbÔb�
Ø×#Ò# JÑ/Ô/Ð/Ø×#Ò# KÑ0Ô0Ð0øà�Š�|Ñ$Ô$Ð$ØÐr   c                 óf  — g }d„ | j         j        j        D ¦   «         }|D ]�}|                      |¦  «        �Œ|                     |¦  «         ||vr_t
          j                             ¦   «         }||_        | j         j        j         	                    |g¦  «         |                     |¦  «         Œ‘|S )z=
        Add a list of output names to graph output.
        c                 ó   — g | ]	}|j         ‘Œ
S © ©r   ©Ú.0r4   s     r   ú
<listcomp>zFBertOnnxModelShapeOptimizer.add_extra_graph_output.<locals>.<listcomp>k   s   € ÐJÐJÐJ¨˜œÐJÐJÐJr   )
r   r1   r4   Úget_initializerr5   r$   r%   ÚValueInfoProtor   Úextend)r   Úextra_outputsÚnames_to_evaluaterE   r   Úoutput_infos         r   Úadd_extra_graph_outputz2BertOnnxModelShapeOptimizer.add_extra_graph_outputf   s¾   € ð ÐØJÐJ°$´*Ô2BÔ2IÐJÑJÔJˆØ!ð 		*ð 		*ˆDØ×#Ò# DÑ)Ô)Ð5ØØ×$Ò$ TÑ*Ô*Ð*à˜<Ð'Ð'Ý"œk×8Ò8Ñ:Ô:�Ø#'�Ô Ø”
Ô Ô'×.Ò.°¨}Ñ=Ô=Ð=Ø×#Ò# DÑ)Ô)Ð)øà Ð r   r:   é€   c                 ó„  — | j         j        j        D ]­}|j        |v r¢|j        j        j        j        d         }||_        |j        j        j        j        d         }| 	                    d¦  «        r||_        Œg| 	                    d¦  «        r1|j        |k    r&t          d|› dd› d|j        › d|j        › d	�	¦  «        ‚Œ®d
S )z_
        Update the model to use static axes instead of dynamic axes for graph inputs.
        r   r:   Ú	dim_paramÚ	dim_valuez!Unable to set dimension value to z
 for axis z of z'. Contradicts existing dimension value ú.N)r   r1   r<   r   ÚtypeÚtensor_typer(   Údimr[   ÚHasFieldÚ
ValueError)r   rA   Ú
batch_sizeÚmax_seq_lenr<   Ú	dim_protos         r   Úuse_static_inputz,BertOnnxModelShapeOptimizer.use_static_inputz   s  € ð ”ZÔ%Ô+ð 
	ð 
	ˆEØŒz˜VÐ#Ð#Ø!œJÔ2Ô8Ô<¸QÔ?�	Ø&0�	Ô#Ø!œJÔ2Ô8Ô<¸QÔ?�	Ø×%Ò% kÑ2Ô2ð Ø*5�IÔ'Ð'Ø×'Ò'¨Ñ4Ô4ð ¸Ô9LÐP[Ò9[Ð9[Ý$ð d¸Kð  dð  dÐSTð  dð  dÐZ_ÔZdð  dð  dð  NWô  Nað  dð  dð  dñô ð øð
	ð 
	r   é   c                 ó  — |dv sJ ‚t           j                             |||ft           j        ¬¦  «        }t          j        ||ft           j        ¬¦  «        }	t          j        ||ft           j        ¬¦  «        }
|dk    r=t          j        |¦  «        }t          j        |	¦  «        }	t          j        |
¦  «        }
nB|dk    r<t          j        |¦  «        }t          j        |	¦  «        }	t          j        |
¦  «        }
||||	||
i}|S )z›
        Create dummy data for model inputs. If the model has more than 3 inputs, please update this function accordingly before running the tool.
        )r:   é   é   )Úsizer   r   r:   ri   )r   ÚrandomÚrandintÚint32ÚonesÚzerosÚfloat32r!   )r   Ú	input_idsÚsegment_idsÚ
input_maskrb   Úsequence_lengthÚ	elem_typeÚdictionary_sizeÚinput_1Úinput_2Úinput_3rA   s               r   Úcreate_dummy_inputsz/BertOnnxModelShapeOptimizer.create_dummy_inputsŠ   sù   € ð ˜IÐ%Ð%Ð%Ð%õ ”)×#Ò# O¸:ÀÐ:WÕ_aÔ_gÐ#ÑhÔhˆÝ”'˜: Ð7½r¼xÐHÑHÔHˆÝ”(˜J¨Ð8ÅÄÐIÑIÔIˆð ˜Š>ˆ>Ý”j Ñ)Ô)ˆGÝ”j Ñ)Ô)ˆGÝ”j Ñ)Ô)ˆGˆGØ˜!Š^ˆ^Ý”h˜wÑ'Ô'ˆGÝ”h˜wÑ'Ô'ˆGÝ”h˜wÑ'Ô'ˆGà˜W j°'¸;ÈÐPˆØˆr   c                 ó>  — |||g| _         g }|r'|                     |                      ¦   «         ¦  «         |	rR|                      ¦   «         }|                      ¦   «         }|                     |¦  «         |                     |¦  «         t          |¦  «        dk    rd S |                      |¦  «        }|                      | j         ||¦  «         t          |d¦  «        5 }| 	                    | j
                             ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        ¦   «         }t          j        j        |_        t          j        ||ddg¬¦  «        }d}| j
        j        j        D ]}|j        |k    r|j        j        j        }Œ|                      ||||||¦  «        }|                     ||¦  «        }i }t5          |¦  «        D ]\  }}||         ||<   Œt6                               d|› �¦  «         |	r5t5          |¦  «        D ]%\  }}||         }|                      ||||
¦  «         Œ&|                     ¦   «         D ]5\  }}|                      |¦  «        }|                       ||j        ¦  «         Œ6|  !                    |¦  «         d S )Nr   ÚwbÚCUDAExecutionProviderÚCPUExecutionProvider)Ú	providersri   zshapes=)"Úbert_inputsrS   r7   r>   rI   ÚlenrW   re   ÚopenÚwriter   ÚSerializeToStringÚonnxruntimeÚSessionOptionsÚGraphOptimizationLevelÚORT_DISABLE_ALLÚgraph_optimization_levelÚInferenceSessionr1   r<   r   r]   r^   ru   rz   ÚrunÚ	enumerateÚloggerÚdebugÚupdate_target_shapeÚitemsr-   Úreplace_input_of_all_nodesÚprune_graph)r   Útemp_model_pathrq   rr   rs   rE   rb   rt   Úenable_shape_optÚenable_reshape_optÚverboserT   Úreshape_shape_inputsÚreshape_input_shapesrU   ÚoutÚsess_optionsÚsessionru   r<   rA   r6   ÚshapesÚir   Úshape_inputÚinput_shaper(   r,   s                                r   Úshape_optimizationz.BertOnnxModelShapeOptimizer.shape_optimization«   s  € ð & {°JÐ?ˆÔàˆØð 	;Ø× Ò  ×!7Ò!7Ñ!9Ô!9Ñ:Ô:Ð:àð 	7Ø#'×#@Ò#@Ñ#BÔ#BÐ Ø#'×#CÒ#CÑ#EÔ#EÐ Ø× Ò Ð!5Ñ6Ô6Ð6Ø× Ò Ð!5Ñ6Ô6Ð6åˆ}ÑÔ Ò"Ð"ØˆFà ×7Ò7¸ÑFÔFÐð 	×Ò˜dÔ.°
¸OÑLÔLÐLå�/ 4Ñ(Ô(ð 	6¨CØ�IŠI�d”j×2Ò2Ñ4Ô4Ñ5Ô5Ð5ð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6å"Ô1Ñ3Ô3ˆÝ0;Ô0RÔ0bˆÔ-ÝÔ.ØØØ.Ð0FÐGð
ñ 
ô 
ˆð ˆ	Ø”ZÔ%Ô+ð 	=ð 	=ˆEØŒz˜YÒ&Ð&Ø!œJÔ2Ô<�	øØ×)Ò)¨)°[À*ÈjÐZiÐktÑuÔuˆà—+’+Ð/°Ñ8Ô8ˆØˆÝ Ð!2Ñ3Ô3ð 	&ð 	&‰GˆAˆtØ" 1œ:ˆF�4‰LˆLå�ŠÐ'˜vÐ'Ð'Ñ(Ô(Ð(àð 	TÝ"+Ð,@Ñ"AÔ"Að Tð T‘��;Ø2°1Ô5�Ø×(Ò(¨°¸kÈ7ÑSÔSÐSÐSà!Ÿ<š<™>œ>ð 	?ð 	?‰KˆD�%Ø×/Ò/°Ñ6Ô6ˆFØ×+Ò+¨D°&´+Ñ>Ô>Ð>Ð>ð 	×Ò˜Ñ&Ô&Ð&Ð&Ð&s   Ã -DÄDÄ Dc                 ó   — ||v r	||         }n-|                       |¦  «        }|€J ‚t          j        |¦  «        }||v r	||         }n-|                       |¦  «        }|€J ‚t          j        |¦  «        }g }t          |¦  «        D ]O\  }	}
|	t	          |¦  «        k     r"||	         |
k    r|                     d¦  «         Œ:|                     |
¦  «         ŒP|||<   t                               d|› d|› d|› �¦  «         dS )zð
        Update the target shape to use 0 to represent that dimension value does not change.
        For example, shape of source data is (2, 5, 8) and target shape is (2, 5, 4, 2), the target shape will be updated to (0, 0, 4, 2).
        Nr   zsource_shape=z, target_shape=z, new_target_shape=)rQ   r   Úto_arrayrŒ   r�   r5   r�   rŽ   )r   rœ   rž   rŸ   r–   Útarget_shapeÚinitializerÚsource_shapeÚnew_target_shaper�   r[   s              r   r�   z/BertOnnxModelShapeOptimizer.update_target_shapeï   s<  € ð
 ˜&Ð Ð Ø! +Ô.ˆLˆLà×.Ò.¨{Ñ;Ô;ˆKØÐ*Ð*Ð*Ý'Ô0°Ñ=Ô=ˆLà˜&Ð Ð Ø! +Ô.ˆLˆLà×.Ò.¨{Ñ;Ô;ˆKØÐ*Ð*Ð*Ý'Ô0°Ñ=Ô=ˆLàÐÝ% lÑ3Ô3ð 	3ð 	3‰LˆAˆyØ•3�|Ñ$Ô$Ò$Ð$¨°a¬¸IÒ)EÐ)EØ ×'Ò'¨Ñ*Ô*Ð*Ð*à ×'Ò'¨	Ñ2Ô2Ð2Ð2Ø.ˆˆ{Ñå�ŠÐu \ÐuÐuÀ,ÐuÐuÐcsÐuÐuÑvÔvÐvÐvÐvr   r<   c                 ó�   — |                       |¦  «        s0d„ | j        j        j        D ¦   «         }t	          d|› d|› �¦  «        ‚d S )Nc                 ó   — g | ]	}|j         ‘Œ
S rL   rM   )rO   r<   s     r   rP   z>BertOnnxModelShapeOptimizer.validate_input.<locals>.<listcomp>  s   € ÐJÐJÐJ¨%˜5œ:ÐJÐJÐJr   zInput z% does not exist in the graph inputs: )Úfind_graph_inputr   r1   r<   Ú	Exception)r   r<   Úvalid_namess      r   Úvalidate_inputz*BertOnnxModelShapeOptimizer.validate_input  s`   € Ø×$Ò$ UÑ+Ô+ð 	`ØJÐJ°4´:Ô3CÔ3IÐJÑJÔJˆKÝÐ^ UÐ^Ð^ÐQ\Ð^Ð^Ñ_Ô_Ð_ð	`ð 	`r   rE   c                 óx   — d„ | j         j        j        D ¦   «         }|D ]}||vrt          d|› d|› �¦  «        ‚Œd S )Nc                 ó   — g | ]	}|j         ‘Œ
S rL   rM   rN   s     r   rP   z@BertOnnxModelShapeOptimizer.validate_outputs.<locals>.<listcomp>  s   € ÐIÐIÐI v�v”{ÐIÐIÐIr   zOutput z& does not exist in the graph outputs: )r   r1   r4   rª   )r   rE   r«   r   s       r   Úvalidate_outputsz,BertOnnxModelShapeOptimizer.validate_outputs  sj   € ØIÐI°´Ô1AÔ1HÐIÑIÔIˆØ ð 	eð 	eˆDØ˜;Ð&Ð&ÝÐ c¨$Ð cÐ cÐVaÐ cÐ cÑdÔdÐdð 'ð	eð 	er   NFÚoutput_pathrq   rr   rs   r”   r•   c                 óº  — | j         j        j        D ]>}|j                             t
          ¦  «        rt                               d¦  «          d S Œ?|                      |¦  «         |                      |¦  «         |                      |¦  «         |�*|  	                    |¦  «         |  
                    |¦  «         d„ | j         j        j        D ¦   «         }|s|�r&t          |                      ¦   «         ¦  «        dk    rt                               d¦  «         d S t          j        ¦   «         5 }d                     t#          j        ¦   «                              d¦  «        ¦  «        }|
rdn|}t(          j                             ||¦  «        }|                      |||||||	|||
¦
  «
         d d d ¦  «         n# 1 swxY w Y   t                               d|› �¦  «         t                               d	|› d
|	› �¦  «         |�Wt5          |d¦  «        5 }|                     | j                              ¦   «         ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S d S )Nz5Skip shape optimization since it has been done beforec                 ó   — g | ]	}|j         ‘Œ
S rL   rM   rN   s     r   rP   z8BertOnnxModelShapeOptimizer.optimize.<locals>.<listcomp>2  s   € ÐOÐOÐO¨V˜Vœ[ÐOÐOÐOr   é   z9Skip shape optimization since graph input number is not 3ztemp_{}.onnxz%m_%d-%H_%M_%Sr\   z$Temp model with additional outputs: zZShape optimization is done. The optimized model might only work for input with batch_size=z sequence_length=r|   )r   r1   r¤   r   Ú
startswithr#   r�   Úinfor¬   r¯   r’   r4   r�   Ú'get_graph_inputs_excluding_initializersÚtempfileÚTemporaryDirectoryÚformatr   ÚnowÚstrftimeÚosÚpathÚjoinr    rŽ   Úwarningr‚   rƒ   r„   )r   r°   rq   rr   rs   r”   r•   rE   rb   rt   r–   r,   Úremaining_outputsÚtemp_dirÚtemp_file_nameÚdirÚ	temp_filer™   s                     r   Úoptimizez$BertOnnxModelShapeOptimizer.optimize  s   € ð ”jÔ&Ô2ð 	ð 	ˆFØŒ{×%Ò%Õ&@ÑAÔAð Ý—’ÐSÑTÔTÐTØ��ðð 	×Ò˜IÑ&Ô&Ð&Ø×Ò˜KÑ(Ô(Ð(Ø×Ò˜JÑ'Ô'Ð'àÐ#Ø×!Ò! ,Ñ/Ô/Ð/Ø×Ò˜\Ñ*Ô*Ð*àOÐO°t´zÔ7GÔ7NÐOÑOÔOÐàð 	Ð1ñ 	Ý�4×?Ò?ÑAÔAÑBÔBÀaÒGÐGÝ—’ÐWÑXÔXÐXØ�åÔ,Ñ.Ô.ð °(Ø!/×!6Ò!6µx´|±~´~×7NÒ7NÐO_Ñ7`Ô7`Ñ!aÔ!a�Ø$Ð2�c�c¨(�ÝœGŸLšL¨¨nÑ=Ô=�	Ø×'Ò'ØØØØØ%ØØ#Ø$Ø&Øñô ð ð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ  �LŠLÐKÀ	ÐKÐKÑLÔLÐLÝ�NŠNð \Ðmwð  \ð  \ð  KZð  \ð  \ñô ð ð Ð"Ý�k 4Ñ(Ô(ð :¨CØ—	’	˜$œ*×6Ò6Ñ8Ô8Ñ9Ô9Ð9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð :ð :ð #Ð"s%   Ä0A>F:Æ:F>ÇF>È-IÉIÉI)r:   rX   )rf   )Nr:   rX   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r-   r7   r>   rI   rW   re   rz   r    r�   Ústrr¬   Úlistr¯   ÚboolrÅ   Ú__classcell__)r   s   @r   r   r   !   s˜  ø€ € € € € ðð ð
+ð +ð +ð +ð +ðð ð ðð ð ðð ð ðð ð ð$!ð !ð !ð(ð ð ð ð0 ðð ð ð ðBB'ð B'ð B'ðHwð wð wð:` Cð `ð `ð `ð `ð
e¨T°#¬Yð eð eð eð eð *.ØØØð9:ð 9:àð9:ð ð9:ð ð	9:ð
 ð9:ð ð9:ð !ð9:ð ˜3”i $Ñ&ð9:ð 9:ð 9:ð 9:ð 9:ð 9:ð 9:ð 9:r   r   c                  ó>  — t          j        ¦   «         } |                      ddt          ¬¦  «         |                      ddt          ¬¦  «         |                      ddt          ¬¦  «         |                      ddt          ¬¦  «         |                      ddt          ¬¦  «         |                      dd	t          d ¬
¦  «         |                      dd	t          d¬
¦  «         |                      dd	t          d¬
¦  «         |                      dd	d¬¦  «         |                      d	¬¦  «         |                      dd	d¬¦  «         |                      d	¬¦  «         |                      dd	d¬¦  «         |                      d	¬¦  «         |                      ¦   «         }|S )Nz--inputT)Úrequiredr]   z--outputz--input_idsz--segment_idsz--input_maskz--output_namesF)rÏ   r]   Údefaultz--batch_sizer:   z--sequence_lengthrX   z--enable_shape_optÚ
store_true)rÏ   Úaction)r”   z--enable_reshape_opt)r•   z	--verbose)r–   )ÚargparseÚArgumentParserÚadd_argumentrÊ   ÚintÚset_defaultsÚ
parse_args)ÚparserÚargss     r   Úparse_argumentsrÛ   S  sž  € ÝÔ$Ñ&Ô&€FØ
×Ò˜	¨DµsÐÑ;Ô;Ð;Ø
×Ò˜
¨T½ÐÑ<Ô<Ð<Ø
×Ò˜°½3ÐÑ?Ô?Ð?Ø
×Ò˜°$½SÐÑAÔAÐAØ
×Ò˜°½CÐÑ@Ô@Ð@Ø
×ÒÐ(°5½sÈDÐÑQÔQÐQØ
×Ò˜°½SÈ!ÐÑLÔLÐLØ
×ÒÐ+°eÅ#ÈsÐÑSÔSÐSØ
×ÒÐ,°uÀ\ÐÑRÔRÐRØ
×Ò¨ÐÑ/Ô/Ð/Ø
×ÒÐ.¸À|ÐÑTÔTÐTØ
×Ò¨5ÐÑ1Ô1Ð1Ø
×Ò˜¨e¸LÐÑIÔIÐIØ
×Ò ÐÑ&Ô&Ð&Ø×ÒÑÔ€DØ€Kr   c                 ó¦  — t          j        t          j        ¦  «        }| r4|                     t          j        d¦  «        ¦  «         t           j        }n3|                     t          j        d¦  «        ¦  «         t           j        }|                     |¦  «         t           
                    |¦  «         t                               |¦  «         d S )Nz8[%(filename)s:%(lineno)s - %(funcName)20s()] %(message)sz%(filename)20s: %(message)s)ÚloggingÚStreamHandlerÚsysÚstdoutÚsetFormatterÚ	FormatterÚDEBUGÚINFOÚsetLevelr�   Ú
addHandler)r–   Úlog_handlerÚlogging_levels      r   Úsetup_loggingré   g  s¬   € ÝÔ'­¬
Ñ3Ô3€KØð %Ø× Ò ¥Ô!2Ð3mÑ!nÔ!nÑoÔoÐoÝœˆˆà× Ò ¥Ô!2Ð3PÑ!QÔ!QÑRÔRÐRÝœˆØ×Ò˜Ñ'Ô'Ð'Ý
×Ò�kÑ"Ô"Ð"Ý
‡O‚O�MÑ"Ô"Ð"Ð"Ð"r   c                  ó&  — t          ¦   «         } t          | j        ¦  «         | j        €d n| j                             d¦  «        }t          ¦   «         }t          | j        d¦  «        5 }|                     | 	                    ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   t          |¦  «        }t          |¦  «        }|                     | j        | j        | j        | j        | j        | j        || j        | j        | j        ¦
  «
         d S )Nú;Úrb)rÛ   ré   r–   rE   Úsplitr   r‚   r<   ÚParseFromStringÚreadr	   r   rÅ   r4   rq   rr   rs   r”   r•   rb   rt   )rÚ   rE   r   Ú
input_filer   Ú	optimizers         r   Úmainrò   t  s;  € ÝÑÔ€DÝ�$”,ÑÔÐàÔ,Ð4�4�4¸$Ô:K×:QÒ:QÐRUÑ:VÔ:V€Lå‰LŒL€EÝ	ˆdŒj˜$Ñ	Ô	ð 1 :Ø×Ò˜jŸošoÑ/Ô/Ñ0Ô0Ð0ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1å˜5Ñ!Ô!€Jå+¨JÑ7Ô7€Ià×ÒØŒØŒØÔØŒØÔØÔØØŒØÔØŒñô ð ð ð s   Á)(BÂB!Â$B!Ú__main__)rÓ   rÝ   r¼   Úrerß   r·   Úcollectionsr   r   Úpathlibr   Únumpyr   r$   r   r   r   r   r	   r…   Ú	getLoggerrÆ   r�   r#   rB   r   rÛ   ré   rò   rL   r   r   ú<module>rù      sf  ðð €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €€€Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€à3Ð Ø4Ð ðo:ð o:ð o:ð o:ð o: )ñ o:ô o:ð o:ðd	ð ð ð(
#ð 
#ð 
#ðð ð ð6 ˆzÒÐØ€D�F„F€F€F€Fð Ðr   