o
    'jy                     @   sD   d dl mZ d dlmZ d dlZd dlZd dlZG dd deZ	dS )    )SamplerNc                   @   sN   e Zd Zddddgddddfdd	Zd
d Zdd ZdefddZdd ZdS )MultiScaleSampler   T      g?g      ~@Nc
           !         s  || _ t|j| _|j| _|j| _| jr|j| _|j| _t| j | _	|| _
|| _t|d tr?dd |D }
dd |D }nt|d trJ|}
|}|
d }|d }|}t }t }t| j	d | }dd t| j	D }d| _|r fdd|
D }
 fd	d|D }t }|| | }t||
D ]\}}|r|}nttd
|||  }||||f q|| _d| _n|||fg| _|| _|| _d| _|| _|| _g | _d| _|| }| j| j|| j }| j| jk r6| jD ]C\}}}t| j| | j}|| j| }t|}||kr||d||  7 }|  j|7  _t|dkr/||t|g} | j|  q| j| jk st | j t| j| _!| " | _#dd tt| j#D | _$dS )a  
            multi scale samper
            Args:
                data_source(dataset)
                scales(list): several scales for image resolution
                first_bs(int): batch size for the first scale in scales
                divided_factor(list[w, h]): ImageNet models down-sample images by a factor, ensure that width and height dimensions are multiples are multiple of devided_factor.
                is_training(boolean): mode 
        r   c                 S      g | ]}|d  qS r    .0ir	   r	   i/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/ppocr/data/multi_scale_sampler.py
<listcomp>*       z.MultiScaleSampler.__init__.<locals>.<listcomp>c                 S   r      r	   r
   r	   r	   r   r   +   r   g      ?c                 S      g | ]}|qS r	   r	   )r   idxr	   r	   r   r   9   s    Fc                    $   g | ]}t | d    d   qS r   int)r   wdivided_factorr	   r   r   @       c                    r   r   r   )r   hr   r	   r   r   D   r   r   TNc                 S   r   r	   r	   r
   r	   r	   r   r   q   s    )%data_sourcenparrayZdata_idx_order_listds_widthseedwh_ratiowh_ratio_sortlenZn_data_samplesratio_whmax_w
isinstancelistr   distZget_world_sizeZget_rankrangeshufflezipmaxappendimg_batch_pairsimg_indicesn_samples_per_replicaepochranknum_replicas
batch_listcurrentminrandomlengthiterbatchs_in_one_epochbatchs_in_one_epoch_id)!selfr   scalesZfirst_bsZfix_bsr   Zis_trainingr$   r%   r    Z
width_dimsZheight_dimsZ	base_im_wZ	base_im_hZbase_batch_sizer3   r2   Znum_samples_per_replicar/   r.   Zbase_elementsr   r   Z
batch_sizeZ
last_indexindices_rank_icurr_wcurr_hcurr_bsz	end_index	batch_idsn_batch_samplesbatchr	   r   r   __init__
   s   





zMultiScaleSampler.__init__c                 c   s\    | j d u rt | j |  jd7  _nt | j  t| j | jD ]}| j| V  q#d S )Nr   )r    r7   r1   r*   r;   r:   )r<   Zbatch_tuple_idr	   r	   r   __iter__u   s   

zMultiScaleSampler.__iter__c                    sT  | j r2| jd urt| j nt| j | jst | j t | j | j| jt| j| j	 }n| j| jt| j| j	 }d}g }| j
D ]a}|\ }t|| | j}||| }t|}||krm||d ||  7 }||7 }t|dkr| jr| j| j|  }	|	   | jk rn| j  nd  fdd|D }
||
 qF|S )Nr   c                    s   g | ]} |fqS r	   r	   )r   Zb_idr@   r?   Zratio_currentr	   r   r      s    z*MultiScaleSampler.iter.<locals>.<listcomp>)r*   r    r7   r1   r   r/   r.   r2   r#   r3   r4   r6   r0   r!   r"   meanr%   r-   )r<   r>   start_indexr:   Zbatch_tuplerA   rB   rC   rD   Zwh_ratio_currentrE   r	   rH   r   r9      sJ   



zMultiScaleSampler.iterr1   c                 C   s
   || _ d S N)r1   )r<   r1   r	   r	   r   	set_epoch   s   
zMultiScaleSampler.set_epochc                 C   s   | j S rK   )r8   )r<   r	   r	   r   __len__   s   zMultiScaleSampler.__len__)	__name__
__module____qualname__rF   rG   r9   r   rL   rM   r	   r	   r	   r   r   	   s    
k
(r   )
Z	paddle.ior   Zpaddle.distributeddistributedr(   numpyr   r7   mathr   r	   r	   r	   r   <module>   s    