U
    dS                     @   s   d dl Z d dlZd dlmZ d dlmZ G dd deZe ZdddZ	dd	 Z
G d
d deZdddZdddZd ddZdd Zdd Zdd ZddddZddddZdS )!    N)inf)Optionalc                   @   sN   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< d	Z
ee ed
< d	S )__PrinterOptions   	precision  	threshold   	edgeitemsP   	linewidthNsci_mode)__name__
__module____qualname__r   int__annotations__r   floatr
   r   r   r   bool r   r   5/tmp/pip-unpacked-wheel-ua33x9lu/torch/_tensor_str.pyr      s
   
r   c                 C   s   |dk	rl|dkr*dt _dt _dt _dt _nB|dkrLdt _dt _dt _dt _n |d	krldt _tt _dt _dt _| dk	rz| t _|dk	r|t _|dk	r|t _|dk	r|t _|t _dS )
a  Set options for printing. Items shamelessly taken from NumPy

    Args:
        precision: Number of digits of precision for floating point output
            (default = 4).
        threshold: Total number of array elements which trigger summarization
            rather than full `repr` (default = 1000).
        edgeitems: Number of array items in summary at beginning and end of
            each dimension (default = 3).
        linewidth: The number of characters per line for the purpose of
            inserting line breaks (default = 80). Thresholded matrices will
            ignore this parameter.
        profile: Sane defaults for pretty printing. Can override with any of
            the above options. (any one of `default`, `short`, `full`)
        sci_mode: Enable (True) or disable (False) scientific notation. If
            None (default) is specified, the value is defined by
            `torch._tensor_str._Formatter`. This value is automatically chosen
            by the framework.

    Example::

        >>> torch.set_printoptions(precision=2)
        >>> torch.tensor([1.12345])
        tensor([1.12])
        >>> torch.set_printoptions(threshold=5)
        >>> torch.arange(10)
        tensor([0, 1, 2, ..., 7, 8, 9])

    Ndefaultr   r   r	   r   short   full)
PRINT_OPTSr   r   r
   r   r   r   )r   r   r
   r   Zprofiler   r   r   r   set_printoptions   s2    %r   c                 C   s   | j rtjntj}| j|dS )N)dtype)Zis_mpstorchr   doubleto)tr   r   r   r   tensor_totypeS   s    r"   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
_Formatterc           	   	   C   s  |j j| _d| _d| _d| _t  |d}W 5 Q R X | jsj|D ] }d	|}t
| jt|| _qDnt|t||d@ }| dkrd S t| }t| }t|
 }|D ]}|t|krd| _ qq| jr`|| dks|dkr2d| _|D ]*}d		tj	|}t
| jt|| _qn,|D ]&}d
	|}t
| jt|d | _q6n|| dks|dks|dk rd| _|D ]*}d		tj	|}t
| jt|| _qn0|D ]*}d	tj	|}t
| jt|| _qtjd k	rtj| _d S )NTF   {}r   g     @@g    חAz	{{:.{}e}}{:.0f}g-C6?	{{:.{}f}})r   Zis_floating_pointfloating_dtypeint_moder   	max_widthr   no_gradZreshapeformatmaxlenZmasked_selectisfinitenenumelr"   absminceilr   r   )	selfZtensorZtensor_viewvalueZ	value_strZnonzero_finite_valsZnonzero_finite_absZnonzero_finite_minZnonzero_finite_maxr   r   r   __init__X   sV    



z_Formatter.__init__c                 C   s   | j S )N)r+   r6   r   r   r   width   s    z_Formatter.widthc                 C   s   | j rf| jr$d| jtj|}qp| jrRd|}t|sdt	|sd|d7 }qpdtj|}n
d|}| jt
| d | S )Nz{{:{}.{}e}}r'   .r(   r&    )r)   r   r-   r+   r   r   r*   mathisinfisnanr/   )r6   r7   retr   r   r   r-      s    


z_Formatter.formatN)r   r   r   r8   r:   r-   r   r   r   r   r#   W   s   <r#   c                 C   sh   |d k	rVt | j|}t | j|d  }|d dks@|d dkrH|| S |d | S n||  S d S Njr   +-)_scalar_strrealimaglstripr-   item)r6   
formatter1
formatter2real_strimag_strr   r   r   rE      s    rE   c           	         s  |  d }|d k	r$||  d 7 }tdtttj| | | }||fdd |r| ddtj kr fdd| d tj 	 D dg  fd	d| tj d  	 D  n fd
d| 	 D fddt
dtD }dd |D }ddd|d   | d S )Nr   r$   c                 S   sd   |d k	rV| | j}| | jd  }|d dks@|d dkrH|| S |d | S n
| | S d S rA   )r-   rF   rG   rH   )valrJ   rK   rL   rM   r   r   r   _val_formatter   s    z#_vector_str.<locals>._val_formatterr   c                    s   g | ]} |qS r   r   .0rN   rO   r   r   
<listcomp>   s     z_vector_str.<locals>.<listcomp>z ...c                    s   g | ]} |qS r   r   rP   rR   r   r   rS      s     c                    s   g | ]} |qS r   r   rP   rR   r   r   rS      s     c                    s   g | ]} ||  qS r   r   rQ   i)dataelements_per_liner   r   rS      s     c                 S   s   g | ]}d  |qS ), )joinrQ   liner   r   r   rS      s     [,
r<   ])r:   r.   r   r=   floorr   r   sizer
   tolistranger/   rY   )	r6   indent	summarizerJ   rK   Zelement_lengthZchar_per_lineZ
data_lineslinesr   )rO   rV   rW   r   _vector_str   s       rf   c                    s     }|dkrt S |dkr4t S rddtj kr fddtdtjD dg  fddtttj tD  }n& fddtddD }d	d
|d   dd   |}d| d S )Nr   r$   r   c                    s$   g | ]}t | d   qS r$   _tensor_str_with_formatterrT   rJ   rK   rc   r6   rd   r   r   rS      s   z._tensor_str_with_formatter.<locals>.<listcomp>...c                    s$   g | ]}t | d   qS rg   rh   rT   rj   r   r   rS      s   c                    s$   g | ]}t | d   qS rg   rh   rT   rj   r   r   rS      s   ,
r<   r\   r^   )	dimrE   rf   r`   r   r
   rb   r/   rY   )r6   rc   rd   rJ   rK   rn   Zslices
tensor_strr   rj   r   ri      s(    
"ri   c                 C   s   |   dkrdS |  r"| d } |   tjk}|  r@|  } |  rP|  } | j	t
jksh| j	t
jkrp|  } | j	t
jkr|  } | j	jr|  } t|rt| jn| j}t|rt| jn| j}t| ||||S t|rt| n| }t| |||S d S )Nr   [])r2   	has_namesrenamer   r   Z_is_zerotensorcloneZis_negZresolve_negr   r   Zfloat16Zbfloat16r   Z	complex32cfloatZ
is_complexZresolve_conjr#   get_summarized_datarF   rG   ri   )r6   rc   rd   Zreal_formatterZimag_formatter	formatterr   r   r   _tensor_str   s(    
rw   c                 C   s   | g}t | | d d }|D ]`}t |}|sB|| d tjkrf|dd|  |  || }d}q |d|  ||d 7 }q |d d	|S )
Nrm   r$   r   r]   r<   FrX   ) )r/   rfindr   r   appendrY   )ro   suffixesrc   force_newlineZtensor_strsZlast_line_lensuffixZ
suffix_lenr   r   r   _add_suffixes  s    
r   c                    s      }|dkr S |dkrX ddtj krTt d tj  tj d  fS  S  ddtj krć fddtdtjD } fddtt tj t D }tdd || D S tdd  D S d S )	Nr   r$   r   c                    s   g | ]} | qS r   r   rT   r9   r   r   rS   +  s     z'get_summarized_data.<locals>.<listcomp>c                    s   g | ]} | qS r   r   rT   r9   r   r   rS   ,  s   c                 S   s   g | ]}t |qS r   ru   rQ   xr   r   r   rS   .  s     c                 S   s   g | ]}t |qS r   r   r   r   r   r   rS   0  s     )	rn   r`   r   r
   r   catrb   r/   stack)r6   rn   startendr   r9   r   ru   !  s    $
ru   tensor_contentsc             	      s  t | tjkpt | tjjk}| jr*d}n|r4d}nt | j d}t| g }|d k	}|r`|}tjj	
| \}}|jj tj ks|jj dkrtj |jjks|jj dkr|dt|j d  |jj dks|jj d	kr|d
}t tjkrtjntj}	|jt |	tjtjfk}
|jr"|dtt|j  |dt|   |
sl|dt|j  |sd}|   }t!| t| }|" dkr|dtt|j 7 }d}|#   }t!| t| }|" dkr|dtt|j 7 }|| d d   | | d }n|j$tj%tj&tj'tj(hkr0|dtt|j  |dt|   |
s|dt|j  |stj%tjj)tjj*ftj&tjj+tjj,ftj'tjj)tjj*ftj(tjj+tjj,fi|j$ \}}|j$tj%tj'hkr d\}}nd\}}d|d d  d}||  }t!| t| }|" dkr^|dtt|j 7 }|d d  d}||  }t!| t| }|" dkr|dtt|j 7 }d}|-   }t!| t| }|" dkr|dtt|j 7 }|| d d   | | d d   | | d }nz|j.rX|dtt|j  |
sj|dt|j  |dt|/   |/ tj0ks|/ tj1kr|dt|2   |dt|3   nr|/ tj4ks|/ tj5ks|/ tj6kr@|dt|7   |dt|8   |dt|9   |st!|:  }nR|jr|sdd d ; fd!d"tj<j=j>?|dD }d#| d$}n|j@r|dtt|j  |jt kr|dt|j  |sd%}n|" dkrb|jsb|A d&kr2|dtt|j  |jt krV|dt|j  |sd'}nH|
s||dt|j  |s|j$tjBkrt!|C  }n
t!| }|j$tjBkr|d(t|j$  | jDd k	rt | jDj}|d)kr| jDE Fd*d&d+ }|d,G| n| jHr(|d- |I rD|d.G|jJ |d k	r^|d/G| tK|| | |jd0}tL|tjjr|sd1| d}|S )2Nznested_tensor(ztensor((cudaZmpszdevice=''ZxlaZlazycpuzsize=znnz=zdtype=zindices=tensor(r   z, size=zvalues=tensor(z),
r<   rx   )rowcolumn)r   r   cr	   z_indices=tensor(zquantization_scheme=zscale=zzero_point=zaxis=c                 S   s   d dd | dD S )Nrm   c                 s   s   | ]}d | V  qdS )z  Nr   rZ   r   r   r   	<genexpr>  s     z4_str_intern.<locals>.indented_str.<locals>.<genexpr>)rY   split)src   r   r   r   indented_str  s    z!_str_intern.<locals>.indented_strr]   c                 3   s    | ]}t | d  V  qdS )r$   N)str)rQ   r!   rc   r   r   r   r     s     z_str_intern.<locals>.<genexpr>z[
z
]rk   r$   rp   zlayout=ZCppFunctionz::r%   zgrad_fn=<{}>zrequires_grad=Trueznames={}z
tangent={})r}   z
Parameter()Mtyper   ZTensornn	ParameterZ	is_nestedr   r/   ZautogradZ
forward_adZunpack_dualZdeviceZ_CZ_get_default_devicer   Zcurrent_deviceindexr{   r   r    Zget_default_dtyper   Zcdoublert   r   Zint64r   Z	is_sparsetupleshapeZ_nnzZ_indicesdetachrw   r2   Z_valuesZlayoutZ
sparse_csrZ
sparse_cscZ
sparse_bsrZ
sparse_bscZcrow_indicesZcol_indicesZccol_indicesZrow_indicesvaluesZis_quantizedZqschemeZper_tensor_affineZper_tensor_symmetricZq_scaleZq_zero_pointZper_channel_affineZper_channel_symmetricZ per_channel_affine_float_qparamsZq_per_channel_scalesZq_per_channel_zero_pointsZq_per_channel_axisZ
dequantizerY   opsZatenZunbindr   is_metarn   ZstridedZto_denseZgrad_fnnamersplitr-   Zrequires_gradrq   namesr   
isinstance)inpr   Zis_plain_tensorprefixr|   Zcustom_contents_providedro   r6   ZtangentZ_default_complex_dtypeZhas_default_dtypeZindices_prefixindicesZindices_strZvalues_prefixr   Z
values_strZcompressed_indices_methodZplain_indices_methodZcdimnameZpdimnameZcompressed_indices_prefixZcompressed_indicesZcompressed_indices_strZplain_indices_prefixZplain_indicesZplain_indices_strstrsr   Zstring_reprr   r   r   _str_intern2  s(   	


$    
  (




r   c             
   C   s,   t   t| |dW  5 Q R  S Q R X d S )Nr   )r   r,   r   )r6   r   r   r   r   _str  s    
r   )NNNNNN)N)N)N)r=   r   Z
torch._sixr   typingr   objectr   r   r   r"   r#   rE   rf   ri   rw   r   ru   r   r   r   r   r   r   <module>   s.         
@O

$
% .