o
    ߥiJ*                     @   sV   d dl Z d dlZd dlZdd Zdd ZG dd deZG dd	 d	eZe	d	 dS )
    Nc                    s   t | tr fdd| D S t | tr fdd|  D S t | tjrc| d} dgt| j } |d< | j	}| 
 } | j| } | jd | jd  gt| jdd   }| j| } tj| |d} | S | S )	Nc                       g | ]}t | qS  repeat.0xtimesr   _/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/space/model/generator.py
<listcomp>       zrepeat.<locals>.<listcomp>c                       i | ]
\}}|t | qS r   r   r   kvr	   r   r   
<dictcomp>       zrepeat.<locals>.<dictcomp>   r      dtype)
isinstancelistdictitemstorchTensor	unsqueezelenshaper   floatr   reshapetensor)varr
   expand_timesr   r    r   r	   r   r   	   s    



(
r   c                    s^   t | tr fdd| D S t | tr fdd|  D S t | tjr-| jd d}|S | S )Nc                    r   r   gatherr   idxr   r   r      r   zgather.<locals>.<listcomp>c                    r   r   r&   r   r(   r   r   r   !   r   zgather.<locals>.<dictcomp>r   )dimindex)r   r   r   r   r   r   index_select)r$   r)   outr   r(   r   r'      s   

r'   c                   @   sJ   e Zd ZdZe Zedd Zedd Z	edd Z
dd	 Zd
d ZdS )SpaceGeneratorz Genrator class. c                 C   s   | t j|< d S Nr.   	_registry)clsnamer   r   r   register.   s   
zSpaceGenerator.registerc                 C   s
   t j|  S r/   r0   )r3   r   r   r   by_name3   s   
zSpaceGenerator.by_namec                 O   s$   t | jj}|| g|R i |S )z Create generator. )r.   r5   	Generator	generator)configargskwargsgenerator_clsr   r   r   create7   s   zSpaceGenerator.createc                 C   sx   |j | _ |j| _|j| _|j| _|j| _|jj| _|jj| _|j| _t	j
 r*d| _d| j  kr7| jks:J  J d S )NTr   )
vocab_sizebos_ideos_idunk_idpad_idr6   min_gen_lenmax_gen_lenuse_gpur   cudais_availableselfr8   readerr   r   r   __init__=   s   


 zSpaceGenerator.__init__c                 C   s   t )zRunning generation.

        Args:
            step_fn (`function`) : decoding one step
            state(`dict`) : initial state
        )NotImplementedError)rH   step_fnstater   r   r   __call__K   s   zSpaceGenerator.__call__N)__name__
__module____qualname____doc__r   r1   classmethodr4   staticmethodr5   r<   rJ   rN   r   r   r   r   r.   )   s    


r.   c                       s2   e Zd ZdZ fddZ				dddZ  ZS )
BeamSearchz BeamSearch generator. c                    s:   t  || |jj| _|jj| _|jj| _|jj| _d S r/   )superrJ   r6   	beam_sizelength_averagelength_penalty
ignore_unkrG   	__class__r   r   rJ   X   s   



zBeamSearch.__init__Nc           !      C   s\  |durt |trytttdd |}tt||f| j}t|D ]\}	}
|
||	dt|
f< q#t	
|}| jr>| }t|D ]5}	|dd|	f dd|d< |	dkrqt	|d | j |d< |d |d   |d< ||\}}qBn9t |t	jsJ t|D ],\}	}|d	d	d	|d< |	dkrt	|d | j |d< |d d	 |d< ||\}}q|d
 }| j}t	jd|d	t	jd| }|d	}|du r| j}|du r| j}t	j||d	gt	jd| }| jr| }| }|dddd	f |d< |durt	|d | j |d< |d d	 |d< ||\}}tj| jdd}d|| j< t	
|}tj| jdd}d||< t	
|}tj| jddd}d|| j< t	
|}| jrb| }| }| }| jrj|| }|| }t	|| j\}}t	j||dgdd}t ||}|du r| j!}td|d	 D ]"}|ddddddf }|"|| d	d	|d< t	|d | j |d< |d d	 |d< ||\}}| jr|| }|| j#kr|| }|"||| j}d	t	||  d	t	|| j   }|d	|  | d	d	| j|  }| j$r2|d	| d	d	|    }|d| }|d	| d	|   }|| }n2| j%dkrd|d	| t&'d| d|  | j%  }|| }|d	| t&'d	d|  | j%  }|| }||d }|"||| j }t	||\}}|(| j}|| j }|| }|"|| }t)||}|}|"|| |}t)||}|"|||}t	j||dgdd}q|dddddf }d	t	||  d	t	|| j   }|| d	| d  }t	j*|d	d}|| }|"d}|"|| }|"|| d}t)||}t)||}|"||}|"||d}|dddf |dddf d} | S )z
        Running beam search.

        Args:
            step_fn(`function`) : decoding one step
            state(`dict`) : initial state
        Nc                 S   s   t | S r/   )r   )r   r   r   r   <lambda>q   s    z%BeamSearch.__call__.<locals>.<lambda>
pred_tokenr   	pred_maskpred_posr   
batch_sizer   float32g    _r   )r*   g              )predsscores)+r   r   maxmapnpfullr   rA   	enumerater   
from_numpyrD   rE   ranger   	not_equalr!   intr   expandrW   arangeint64r>   r?   oneszerosr=   r@   rZ   topkcatr   rC   r"   rB   rX   rY   mathpowfloor_divider'   argsort)!rH   rL   rM   start_idr?   rC   
prev_inputlengthprev_input_numpyir   prev_input_tensor_inputrb   rW   	pos_indexpredictionsrg   unk_penaltyeos_penaltyscores_after_endsequence_scoresrf   steppre_idspre_eos_maskscaled_valuetopk_scorestopk_indices
parent_idxindicesresultsr   r   r   rN   `   sL  






















zBeamSearch.__call__)NNNN)rO   rP   rQ   rR   rJ   rN   __classcell__r   r   r[   r   rU   U   s    rU   )
rx   numpyrj   r   r   r'   objectr.   rU   r4   r   r   r   r   <module>   s   , G