o
    ‘e~L  ã                   @   s|   d dl mZmZ d dlmZ d dlmZ d dlZd dl	Z
d dlZd dlZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZdS )é    )Ú	GraphNodeÚGraph)Útensor_util)Úattr_value_pb2Nc                       sj   e Zd Zd‡ fdd„	Zedd„ ƒZedd„ ƒZd	d
„ Zedd„ ƒZedd„ ƒZ	edd„ ƒZ
dd„ Z‡  ZS )ÚTFGraphNodeNÚNHWCc                    sŠ   |d u rt t| ƒ ||j dd¡ dd¡ dd¡¡ nt t| ƒ || dd¡ dd¡ dd¡¡ |j| _|| _d| _ddd	d
ddœ| _	d S )Nú/Ú_ú-ú^Ú ZNCHWZfloat32Zint32Zuint8Zint64Úbool)é   é   é   é	   é
   )
Úsuperr   Ú__init__ÚnameÚreplaceÚopÚ
layer_typeÚtf_data_formatZpd_data_formatÚ	dtype_map)ÚselfÚlayerÚ
layer_nameÚdata_format©Ú	__class__© úKD:\Projects\ConvertPro\env\Lib\site-packages\x2paddle/decoder/tf_decoder.pyr      s$   
þ
þûzTFGraphNode.__init__c                 C   sd   | j dks
| j dkr| jjd jj}n| jjd jj}tƒ }|D ]}dd„ |jD ƒ}| |¡ q |S )NÚOneShotIteratorÚ
IteratorV2Zoutput_shapesZ_output_shapesc                 S   ó   g | ]}|j ‘qS r!   ©Úsize©Ú.0Údimr!   r!   r"   Ú
<listcomp>7   ó    z*TFGraphNode.out_shapes.<locals>.<listcomp>)r   r   ÚattrÚlistÚshaper*   Úappend)r   ÚvaluesÚ
out_shapesÚvaluer/   r!   r!   r"   r2   /   s   zTFGraphNode.out_shapesc                 C   sp   g d¢}|D ]}| j j| j}|dkr nq|dkr$| j jd jjd }|| jvr3td || j j¡ƒ‚| j| S )N)ÚdtypeÚTÚDstTZTparamsr   Zoutput_typesz&Dtype[{}] of node({}) not in dtype_map)r   r-   Útyper.   r   Ú	ExceptionÚformatr   ©r   ÚkeysÚkr4   r!   r!   r"   r4   ;   s   ÿ
ÿ
zTFGraphNode.dtypec                 C   sL   d}| j  ¡ D ]
\}}||kr|}q|dkrtd |¡ƒ‚|| jjd _d S )Nr   z Cannot set dtype of node to '{}'r4   )r   Úitemsr8   r9   r   r-   r7   )r   r4   Z	dtype_idxr<   Úvr!   r!   r"   Ú	set_dtypeI   s   €zTFGraphNode.set_dtypec                 C   s2   g d¢}|D ]}| j j| j}|dkr |S q|S )N)r4   ZTidxr5   r6   r   )r   r-   r7   r:   r!   r!   r"   Ú	raw_dtypeR   s   þzTFGraphNode.raw_dtypec                 C   s8   | j dks	J dƒ‚| jjd }t|| d¡ƒ}t |¡S )NÚConstzOnly Const node has value.r3   )r   r   r-   ÚgetattrÚ
WhichOneofr   ZMakeNdarray)r   r-   Úfieldr!   r!   r"   r3   [   s   
zTFGraphNode.valuec                 C   s"   t | dƒr| jd | j¡ S | jS )NÚindexz_p{})Úhasattrr   r9   rE   )r   r!   r!   r"   r   c   s   
zTFGraphNode.namec                 C   sÒ   || j jvrd S | j j| }| d¡}|rt||ƒnd }|dkr&| ¡ s&d S t|tjjƒrgt	| ¡ d d ƒ}t
t|ƒƒD ]'}t|| tƒrNt|| ƒ||< zt|| tƒr^t|| ƒ||< W q=   Y q=|S |S )Nr3   Zsqueeze_dimsr   r   )r   r-   rC   rB   Z
ListFieldsÚ
isinstancer   Z	AttrValueZ	ListValuer.   ÚrangeÚlenÚintÚlong)r   r   r-   rD   r3   ÚresultÚir!   r!   r"   Úget_attri   s(   
€zTFGraphNode.get_attr)Nr   )Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr2   r4   r?   r@   r3   r   rN   Ú__classcell__r!   r!   r   r"   r      s    

	


r   c                       sr   e Zd Zd‡ fdd„	Z‡ fdd„Zd‡ fdd„	Zdd
d„Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚTFGraphr   c                    s2   t t| ƒ |¡ tƒ | _g d¢| _|| _d| _d S )N)ZSplitZSplitVr$   ZUnpackZTFModel)r   rT   r   ÚdictÚidentity_mapÚmulti_out_opsr   Z
graph_name)r   Úmodelr   r   r!   r"   r   ‚   s
   

zTFGraph.__init__c                    sl  | j jD ]}|jdkrqt|| jd| j|j dd¡ dd¡< q| j ¡ D ]L\}}|j	dkr/q%|j
jD ]=}| dd¡ dd¡ dd¡}|| jvrj| ¡  d	¡d
 | jv rb|  | ¡  d	¡d
 |¡ q3td ||¡ƒ‚|  ||¡ q3q%tt| ƒ ¡  | j jD ]&}|jdkr£|jD ]}| dd¡ dd¡}|| jv r¢| j |¡}| j|= q‡q}|  ¡  |  ¡  |  ¡  |  ¡  d S )NÚAssert)r   r   r	   r
   rA   r   r   ú:r   z0input[{}] of node[{}] does not exist in node_map)rX   Únoder   r   r   Únode_mapr   r   r=   r   r   ÚinputÚstripÚsplitÚconnectr8   r9   r   rT   ÚbuildÚoutput_nodesrE   Ú_remove_isolated_nodeÚ_optimize_dialiation_convÚ_remove_identity_nodeÚ_remove_cast_node)r   r   r   r[   Zin_nodeZiptZipt_nameÚidxr   r!   r"   ra   ‰   sL   
ÿÿÿ
ÿ
þõ


€zTFGraph.buildFc                    s¬   |  ¡  d¡}|d  dd¡ dd¡|d< |d | jv r%| j|d  |d< d |¡}tt| ƒ ||¡}|d u r9d S |jdv rEt	|dƒrE|`
t|ƒdkrT|j| jv rTd|_
|S )	NrZ   r   r   r	   r
   )ÚSwitchZReshapeÚSubrE   r   )r^   r_   r   rV   Újoinr   rT   Úget_noder   rF   rE   rI   rW   )r   Ú	node_nameÚcopyr=   Znew_node_namer[   r   r!   r"   rk   ±   s   


zTFGraph.get_noder   c                 C   s$   |j j| }|dkrd}|  ||¡S )Nr   T)r   r]   rk   )r   r[   rg   rm   Zinput_node_namer!   r!   r"   Úget_input_nodeÁ   s   zTFGraph.get_input_nodec                 C   s¬   || j vrtd |¡ƒ‚| j | j}| j | j}| j |d  }|j |¡}|j|= |D ]}| j | }|j |¡}|d |j|< |j |¡ q+| j |= | j |¡}| j|= d S )NzNode[{}] not in graphr   )r\   r8   r9   ÚinputsÚoutputsrE   r0   Ú	topo_sort)r   rl   ro   rp   Ú
input_noderg   Úoutputr[   r!   r!   r"   Úremove_nodeÇ   s   

zTFGraph.remove_nodec           	      C   sÜ   t | j ¡ ƒD ]d}| j| }|jdkrkd}| j|jd  }|jdkr%d}q| j|jd  }|jdkr5d}q| j|jd  }|jdkrEd}q| j|jd  }|jdkrUd}q|rkd|_d|_| j|jd	  }|j ¡ |_	qd S )
NZSpaceToBatchNDTr   Z
ExpandDimsFZConv2DZSqueezeZBatchToSpaceNDr   )
r.   r\   r;   r   rp   Úskipro   r3   ÚtolistZdilation)	r   r   r[   Zis_dilationZ	out_node0Z	out_node1Z	out_node2Z	out_node3Zblock_shaper!   r!   r"   rd   Û   s6   





€çz!TFGraph._optimize_dialiation_convc                 C   s®   t ƒ }| j ¡ D ]}t|  |¡jƒdkr#t|  |¡jƒdkr#| |¡ q|D ].}| j|= || jv r;| j 	|¡}| j|= || j
v rJ| j
 	|¡}| j
|= | j 	|¡}| j|= q&d S ©Nr   )r.   r\   r;   rI   rk   ro   rp   r0   Zinput_nodesrE   rb   rq   )r   Zisolated_nodesrl   rg   r!   r!   r"   rc   ÷   s(   
ÿÿ
€


÷zTFGraph._remove_isolated_nodec                 C   s¾   g d¢}t ƒ }| j ¡ D ]\}}|j|v r| |¡ q|D ]?}|  |¡}|  |jd ¡}|  |¡ |j| j	|< || j
v r\| j
 |¡}|j| j
|< t|jƒdkrV| j
 |¡ q|j| j
|< qd S )N)ZIdentityZStopGradientrh   ZMergeZPlaceholderWithDefaultZIteratorGetNextr   )r.   r\   r=   r   r0   rk   ro   rt   r   rV   rb   rE   rI   rp   Úpop)r   Zidentity_opsZidentity_noderl   r[   rr   rg   r!   r!   r"   re   
  s&   

€


€ózTFGraph._remove_identity_nodec                 C   sÈ   t ƒ }| j ¡ D ]#\}}|jdkr+|  |jd ¡}|jdks%t|jƒdkr&q| |¡ q|D ]3}|  |¡}|  |jd ¡}|j	|j
jd _|  |¡ |j| j|< || jv ra| j |¡}|j| j|< q.d S )NZCastr   ÚPlaceholderr   r4   )r.   r\   r=   r   rk   ro   rI   rp   r0   r@   r   r-   r7   rt   r   rV   rb   rE   )r   Z	cast_noderl   r[   r]   rr   rg   r!   r!   r"   rf   #  s&   

€


€özTFGraph._remove_cast_nodec                 C   sL   | j |j }|j}t|ƒdkrd S |D ]}| j | }|j|_|  |¡ qd S rw   )r\   r   rp   rI   r   Údata_format_propagation)r   r[   Zcurrent_noderp   ÚoutZ	next_noder!   r!   r"   rz   8  s   
ýzTFGraph.data_format_propagation)r   )F)r   F)rO   rP   rQ   r   ra   rk   rn   rt   rd   rc   re   rf   rz   rS   r!   r!   r   r"   rT      s    (
rT   c                   @   s0   e Zd Zddd„Zdd„ Zdd„ Zddd„Zd	S )Ú	TFDecoderr   Fc                 C   s  z	t jj ¡ | _W n	   t  ¡ | _Y tƒ | _|| _t|dƒ8}zt jj 	¡ }W n   t  	¡ }Y | 
| ¡ ¡ |  |¡}|  |¡ | jj ¡  t j|d|d W d   ƒ n1 sZw   Y  zt jj ¡ }W n   t  ¡ }Y | j |¡ t| jjjddd |ƒ| _| j ¡  d S )NÚrbr   )r   Ú	input_mapT)Z
add_shapesr   )ÚtfÚcompatÚv1ÚSessionÚsessrU   Úinputs_infoÚdefine_input_shapeÚopenZGraphDefZParseFromStringÚreadÚ_check_input_shapeÚ_fix_output_shapeÚgraphZ
as_defaultZimport_graph_defZglobal_variables_initializerÚrunrT   Z_as_graph_defZtf_graphra   )r   Zpb_modelr   r…   ÚfÚ	graph_defr~   Zinitializerr!   r!   r"   r   D  s4   


÷
ÿzTFDecoder.__init__c                 C   s>   t t|jƒƒD ]}|j| }|jdkrd|j| jd _qd S )NZ	swish_f32FZ_disable_call_shape_inference)rH   rI   r[   r   r-   Úb)r   rŠ   rM   r[   r!   r!   r"   r‰   `  s   

€ýzTFDecoder._fix_output_shapec              
   C   sÂ  t j d¡ t |¡}tƒ }|jD ]L}|jdkr$|jdkr$|jdkr$qt|ƒ}|j	j
d j}|dkr4qd}| jr<d}n(|j	j
d	 jjsI| d	¡sLd
}n|j	j
d	 j}dd„ |jD ƒ}| d¡d
krdd}|d
krƒz|jd }t|ƒdkr}| d¡dk r}d}W n   Y |dkrGd }| d	¡r |j	j
d	 j }}dd„ |jD ƒ}|d
kr­td |j¡ƒ n|dkr»td ||j¡ƒ n	td ||j¡ƒ tdƒ d}	|	sëztdƒ}W n   tdƒ}Y | d¡d
krçtdƒ nd}	|	rÌdd„ | ¡  d¡D ƒ}| d ¡d
ksJ dƒ‚ztjjj||d |j¡d}
W n   tj||d |j¡d}
Y |
|d |j¡< | d ¡dkr;d|| d ¡< ||f| j d |j¡< q|j	j
d	 j}dd„ |jD ƒ}||f| j |j< q|S ) Né   ry   r#   r$   r4   r   r   r   r/   r   c                 S   r%   r!   r&   r(   r!   r!   r"   r+   {  r,   z0TFDecoder._check_input_shape.<locals>.<listcomp>éÿÿÿÿé   c                 S   r%   r!   r&   r(   r!   r!   r"   r+   ‹  r,   z1Unknown shape for input tensor[tensor name: "{}"]zE
Shape[now is {}] for input tensor[tensor name: "{}"] not support yetz;Define shape[now is {}] for input tensor[tensor name: "{}']z9Use your keyboard type the shape of input tensor below :)Fz%Shape of Input(e.g. None,224,224,3): ÚNonez*Only 1 dimension can be None, type again:)Tc                 S   s    g | ]}|d kr
dnt |ƒ‘qS )r’   N)rJ   r(   r!   r!   r"   r+   ¦  s    ÿÿú,zOnly one dimension can be Nonezx2paddle_{})r4   r/   r   z{}:0c                 S   r%   r!   r&   r(   r!   r!   r"   r+   ½  r,   )!ÚnumpyÚrandomÚseedÚcpÚdeepcopyrU   r[   r   r   r   r-   r7   r…   r/   Zunknown_rankrN   r*   Úcountr2   rI   Úprintr9   r   Ú	raw_inputr]   r^   r_   r   r€   r   ÚplaceholderrE   r„   )r   r   r~   r   Ú
graph_noder4   Zneed_define_shaper3   r/   Zright_shape_been_inputZx2paddle_inputr!   r!   r"   rˆ   f  s¼   
ÿÿÿÿ
€

ÿ
þ
þÿÿ

÷þ

ý
ýÿzTFDecoder._check_input_shapeNTc                 C   s>  t |dƒr|jjd |j¡ }n|jjd }tƒ }|r g d¢}ndg}tƒ }|D ]f}| j ¡ D ]:\}	}
t	 
|
¡\}}| jj |	d ¡}| d¡dkrQ||| d¡< |dkratjjd	d
|d||< q/tj |¡||< q/| jj |¡}|rƒ| | j |g|¡d  ¡ ¡ q(| j |g|¡d   S |d |d	 k}|d	 |d k}| ¡ r­| ¡ r­|d  ¡ S ||k ¡ rt |dk¡ ¡ }|jd d	krÈtdƒ‚d|d |d < t |d dk ¡ ¡ }|jd dkrætdƒ |jd dkr|d ur||d	  dkr	||d	  |d |d	 < n||d  |d |d < |d  ¡ S tdƒ‚)NrE   z:{}z:0)r‘   r   é   r‘   r   r   r   r   r   r&   Fz'There's not only one unstable dimensionz/Warning: More than two dimension less than zeroz0Couldn't infer a stable shape shape tensor value)rF   r   r   r9   rE   rU   r.   r„   r=   r—   r˜   rƒ   rŠ   Zget_tensor_by_namer™   r”   r•   ÚrandintZrandom_sampler0   r‹   ÚflattenÚallrv   Zargwherer/   r8   rš   )r   r   Z	out_shapeZuse_diff_inputsZtensor_nameÚfeedZ
batch_sizeÚresultsrŽ   Z
input_nameÚinfor/   r4   Zinput_tensorZoutput_tensorZ	compare01Z	compare12rE   r!   r!   r"   Úinfer_tensorÄ  sV   


ÿÿzTFDecoder.infer_tensor)r   F)NT)rO   rP   rQ   r   r‰   rˆ   r¥   r!   r!   r!   r"   r|   C  s
    
^r|   )Zx2paddle.core.graphr   r   Ztensorflow.python.frameworkr   Ztensorflow.core.frameworkr   Z
tensorflowr   rm   r—   r”   Úsysr   rT   Úobjectr|   r!   r!   r!   r"   Ú<module>   s   i C