o
    *jK*                     @   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   l/var/www/html/Deteccion_Ine/venv/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   reshapeZtensor)varr
   Z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   Z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 Generator 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,   r-   )r0   r   r   r   by_name3   s   
zSpaceGenerator.by_namec                 O   s$   t | jj}|| g|R i |S )z Create generator. )r+   r2   	Generator	generator)configargskwargsZ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_idr3   min_gen_lenmax_gen_lenuse_gpur   cudaZis_availableselfr5   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)rC   step_fnstater   r   r   __call__K   s   zSpaceGenerator.__call__N)__name__
__module____qualname____doc__r   r.   classmethodr1   staticmethodr2   r8   rE   rI   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,   )superrE   r3   	beam_sizelength_averagelength_penalty
ignore_unkrB   	__class__r   r   rE   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>Z
pred_tokenr   Z	pred_maskZpred_posr   
batch_sizer   Zfloat32g    _r   )r(   g              )predsscores)+r   r   maxmapnpfullr   r=   	enumerater   Z
from_numpyr@   rA   ranger   	not_equalr!   intr   expandrR   ZarangeZint64r:   r;   ZonesZzerosr9   r<   rU   Ztopkcatr   r?   r"   r>   rS   rT   mathpowZfloor_divider%   Zargsort)!rC   rG   rH   Zstart_idr;   r?   Z
prev_inputlengthZprev_input_numpyir   Zprev_input_tensor_inputrZ   rR   Z	pos_indexZpredictionsr^   Zunk_penaltyZeos_penaltyZscores_after_endZsequence_scoresr]   stepZpre_idsZpre_eos_maskZscaled_valueZtopk_scoresZtopk_indicesZ
parent_idxindicesresultsr   r   r   rI   `   sL  






















zBeamSearch.__call__)NNNN)rJ   rK   rL   rM   rE   rI   __classcell__r   r   rV   r   rP   U   s    rP   )
ri   numpyra   r   r   r%   objectr+   rP   r1   r   r   r   r   <module>   s   , G