o
    °©iR  ã                   @   s‚   d Z ddlmZ ddlZddlZddlmZmZmZ dej	defdd„Z
dej	d	edefd
d„Zddej	d	ee defdd„ZdS )z(
Convert graphs between k2 and OpenFst.
é    )ÚOptionalN)ÚStdArcÚStdVectorFstÚSymbolTableÚfsaÚreturnc                 C   sF  |   d¡} t| jƒdksJ dƒ‚d| j  ¡ }| j d¡}| j d¡}| ¡ d }|dd… |dd…   ¡ }| ¡ }t	ƒ }| 
|¡ t|ƒD ]}| ¡ }	|	|ksSJ ‚| ||| ¡ qG| j ¡ }
t|ƒD ]"}|
|  ¡ \}}}}|dkrwd}t|||| |d}| ||¡ qed|_| |d d¡ t| d	ƒr¡t | j ¡ ¡|_|S )
z²Convert an acceptor in k2 format to a one in OpenFst format.

    Args:
      fsa:
        An acceptor in k2 format.
    Returns:
      Return an acceptor in OpenFst format.
    Úcpué   úFsaVec is not supportedéÿÿÿÿé   Nr   ©ÚilabelÚolabelÚweightÚ	nextstateÚ
labels_sym)ÚtoÚlenÚshapeÚscoresÚtolistÚarcsÚ
row_splitsÚrow_idsÚnumelr   Úreserve_statesÚrangeÚ	add_stateÚreserve_arcsÚvaluesr   Úadd_arcÚstartÚ	set_finalÚhasattrr   Úfrom_strr   Úto_strÚinput_symbols)r   r   r   r   Ú
num_statesÚarcs_per_stateÚnum_arcsÚfstÚiÚsr   ÚsrcÚdstÚlabelÚ_Úarc© r3   úO/home/ubuntu/.local/lib/python3.10/site-packages/kaldifst/utils/k2_converter.pyÚ_k2_acceptor_to_openfst   s8   
	

ÿ
r5   Úolabelsc                 C   sà  t | |ƒsJ ‚tt| |ƒtjƒrtj| |gd} |  d¡} t| jƒdks(J dƒ‚d| j	  
¡ }| j d¡}| j d¡}t| |ƒ}t|tjƒsHJ ‚| 
¡ }| ¡ d }|dd… |dd…   
¡ }| ¡ }tƒ }	|	 |¡ t|ƒD ]}
|	 ¡ }||
ks|J ‚|	 |
||
 ¡ qp| j ¡ }t|ƒD ]0}
||
  
¡ \}}}}||
 }|dkr®d}|dks¬J |ƒ‚d}t||||
 |d	}|	 ||¡ qŽd|	_|	 |d d¡ t | d
ƒrØt | j ¡ ¡|	_t | |› dƒrît t| |› dƒ ¡ ¡|	_ |	S )a2  Convert a transducer in k2 format to an FST in OpenFst format

    Args:
      fsa:
        The input FSA.
      olabels:
        It specifies which attribute from `fsa` contains output labels.
        In most cases, `olabels` is `aux_labels`.
    Returns:
      Return a transducer in OpenFst format.
    )Úragged_attribute_namesr   r	   r
   r   r   Nr   r   r   Ú_sym)!r$   Ú
isinstanceÚgetattrÚk2ÚRaggedTensorÚexpand_ragged_attributesr   r   r   r   r   r   r   r   ÚtorchÚTensorr   r   r   r   r   r   r    r   r!   r"   r#   r   r%   r   r&   r'   Úoutput_symbols)r   r6   r   r   r   Úoutput_labelsr(   r)   r*   r+   r,   r-   r   r.   r/   r   r1   r   r2   r3   r3   r4   Ú_k2_transducer_to_openfst>   sX   



ü
ÿrB   c                 C   s   |du rt | ƒS t| |ƒS )a  Convert an FSA in k2 format to an FSA in OpenFst format.

    Args:
      fsa:
        An FSA from k2.
        Note:
          Both acceptors and transducers are represented as `k2.Fsa`.
      olabels:
        If it is `None`, we assume the input `fsa` is an acceptor.
        If not `None`, we assume `getattr(fsa, olabel)` contains
        the output labels of arcs. In general, it is calles `aux_labels`
        in k2.
    Return:
     Return an FST in OpenFst format.

    TODO: Also attach symbols, if there are any.
    N)r5   rB   )r   r6   r3   r3   r4   Úk2_to_openfstˆ   s   
rC   )N)Ú__doc__Útypingr   r;   r>   Ú	_kaldifstr   r   r   ÚFsar5   ÚstrrB   rC   r3   r3   r3   r4   Ú<module>   s   1"J