o
    "j6                     @   s\   d dl Z d dlZd dlmZ ddlmZ ddlmZmZm	Z	 G dd dZ
G dd	 d	ZdS )
    N)Variable   )OperatorDistAttr)__no_shape_var_type__convert_to_shard_specverify_shard_specc                   @   sd   e Zd ZdddZedd Zedd Zejdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdS )DistributedOperatorNc                 C   sZ   || _ |d urt|trt|| _|| j _n|d u s J | | j j| _i | _i | _d S N)	
_serial_op
isinstancer   copydeepcopy
_dist_attr	dist_attr_serial_inputs_serial_outputs)self	serial_opr    r   p/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/auto_parallel/static/dist_op.py__init__   s   


zDistributedOperator.__init__c                 C      | j S r	   )r
   r   r   r   r   r   ,      zDistributedOperator.serial_opc                 C   r   r	   )r   r   r   r   r   r   0   r   zDistributedOperator.dist_attrc                 C   s   || _ || j_d S r	   )r   r
   r   )r   r   r   r   r   r   4   s   c                 C   s@   | j jdkr
d }|S | j j|d ur| j j|}|S d }|S )NZcreate_py_reader)r
   typeblockZ_find_var_recursive_var_recursiver   nametensorr   r   r   get_serial_input:   s   z$DistributedOperator.get_serial_inputc                 C   s   | j j|}|S r	   )r
   r   r   r   r   r   r   get_serial_outputC   s   z%DistributedOperator.get_serial_outputc                 C   s  d| j jv sd| j jkrdS | j jD ]f}| j|}|j}| |jtv r(g }n| |j}t	|t	|kr9 dS t
t	|D ]}|| dk sR|| t	| jjjkrV  dS q?t
t	| jjjD ]}||dkrm  dS q`| jj|jkrx dS q| j jD ]f}| j|}|j}| |jtv rg }n| |j}t	|t	|kr dS t
t	|D ]}|| dk s|| t	| jjjkr  dS qt
t	| jjjD ]}||dkr  dS q| jj|jkr dS q}dS )NreadwhileTFr   )r   r   input_arg_namesr   get_input_dist_attrdims_mappingr    r   shapelenrangeprocess_meshcountoutput_arg_namesget_output_dist_attrr!   )r   r   input_dist_attrr'   r(   ioutput_dist_attrr   r   r   validate_dist_attrG   sZ   z&DistributedOperator.validate_dist_attrc           	   
   C   s  d | jj | jj | jj }| jdrd}nd}|d| d| jj 7 }| jj	 D ]U}z| j
|}W n tyM   td || jj w | j|rWd}nd}| |d url| |jrid}nd	}nd	}| j|}t| }|d
 |||||7 }q0| jj D ]U}z| j|}W n ty   td || jj w | j|rd}nd}| |d ur| |jrd}nd	}nd	}| j|}t| }|d |||||7 }q|d | jj| jj| jj7 }|S )Nz,{{op type: {}, op id: {}, op original_id: {}r+   Z	annotatedznon-annotatedz, process_mesh (z): z:There is not input var '{}''s dist_attr in current op '{}'Z	parameterznon-parameterz<; {}'s dims_mapping (input, {}, {}): {}, partial on dims: {}z;There is not output var '{}''s dist_attr in current op '{}'z=; {}'s dims_mapping (output, {}, {}): {}, partial on dims: {}z9, dist_impl idx: {} , dist_impl type: {}, chunk_id: {} }})formatr   descr   idZoriginal_idr   Zis_annotatedr+   r%   Zget_input_dims_mapping
IndexErrorZis_annotated_input_dims_mappingr    Zis_parameterr&   sortedZ_partial_dimsr-   Zget_output_dims_mappingZ is_annotated_output_dims_mappingr!   r.   Zimpl_idxZ	impl_typechunk_id)	r   strZannotated_strZarg_namer'   Zis_parameter_strr/   Zpartial_dimsr1   r   r   r   __str__s   s   


	zDistributedOperator.__str__c                 C   sn   | j }||}||t| < | j D ]!\}}|dks#|dks#|dkr*t||| qt||t|| q|S )Nr
   r   r   )	__class____new__r5   __dict__itemssetattrr   r   )r   memoclsresultkvr   r   r   __deepcopy__   s   
z DistributedOperator.__deepcopy__r	   )__name__
__module____qualname__r   propertyr   r   setterr    r!   r2   r:   rE   r   r   r   r   r      s    



	,^r   c                   @   s   e Zd Zdd Zdd ZdS )DistributedOperatorHelperc                 C   s8   || _ || _|| _|| _d|v r|d | _d S d| _d S )Nr8   r   )r
   _process_mesh_in_dims_mappings_out_dims_mappings	_chunk_id)r   r   r+   Zin_dims_mappingsZout_dims_mappingskwargsr   r   r   r      s
    z"DistributedOperatorHelper.__init__c              	   O   sd  i }d}| j r%t|t| t| j ks%J dt| j t|t| |D ]}t|tr9| j r9| j | ||j< |d7 }q'| oD| j D ]}t|trT| j | ||j< |d7 }qEtj	 }|
 }t|j}| j|i |}	t|j}
t|	ttfrt|	}nt|	tr|	g}ntd| jrt|t| jksJ dt| jt|t|D ]\}}t|tr| jr| j| ||j< qddlm} | }t||
D ]}|j| }t|}|jjD ]U}|| v r1||}|j|}|| }|d u rg }n|jtv rg }n|j}|d ur1|| }t|| j }t!||| j s)J d|||| j ||_"|#d q|jj$D ]W}|| v r|%|}|j&|}|| }|d u rVg }n|jtv r_g }n|j}|d ur|| }t|| j }t!||| j sJ d|||| j ||_"|#d q6| j |j_'| j(|j_)| j d ur|j#d |*| |+| j  q|	S )	Nr   zEThe length of dims_mapping {} does not matching the length output {}.r   zUnrecognized output.)get_default_distributed_contextzQFor tensor {}, shard_spec {} is invalid with tensor_shape {} and process_mesh {}.r'   r+   ),rM   r)   r3   r   r   r   valuespaddleZstaticZdefault_main_programZcurrent_blockopsr
   tuplelist
ValueErrorrN   	enumerateZdist_contextrQ   r*   r   r   r%   keysr    r   r&   r   r   r(   r   rL   r   r'   Zmark_annotatedr-   r!   r.   r+   rO   r8   Zadd_dist_op_for_programZadd_process_mesh)r   argsrP   Ztensor_to_dims_mappingindexargZdefault_progZ	cur_blockZop_sizeoutputZnew_op_sizeZ
new_outputr0   itemrQ   Zdefault_dist_ctxidxopZdist_opr   r   Ztensor_dist_attrr'   Ztensor_shapeZ
shard_specr   r   r   __call__   s   




















z"DistributedOperatorHelper.__call__N)rF   rG   rH   r   ra   r   r   r   r   rK      s    rK   )r   rS   Zpaddle.staticr   Zdist_attributer   utilsr   r   r   r   rK   r   r   r   r   <module>   s    F