U
    qht                     @  s4   d dl mZ d dlZd dlmZ G dd deZdS )    )annotationsN)OpRunc                   @  s6   e Zd Zdd Zdd ZddddddddddZdS )	Scanc                   s   t  || t jds0tdt j d fddt jD  _t	 j}|dkrdtd fddt jD  _
t	 j
}|dkrtd	 jj _ jj _d S )
Nrunz0Parameter 'body' must have a method 'run', type .c                   s2   g | ]*} j d ks |t j kr$dn j | qS Nr   )scan_input_directionslen.0iself >/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_scan.py
<listcomp>   s   z!Scan.__init__.<locals>.<listcomp>r   z@Scan is not implemented for other output input_direction than 0.c                   s2   g | ]*} j d ks |t j kr$dn j | qS r   )scan_input_axesr	   r
   r   r   r   r       s   z4Scan is not implemented for other input axes than 0.)r   __init__hasattrbodyRuntimeErrortyperangenum_scan_inputsZinput_directions_maxinput_axes_input_namesoutput_names)r   Z	onnx_nodeZ
run_paramsZ
max_dir_inZ
max_axe_inr   r   r   r      s*    
	



zScan.__init__c                   s   t | j }t || } fddt|D }t|}|dkrHtd fddt|D }t|}|dkrvtd jd  j } jd t | }	 j|d  }
 j|d  }||d  }|d | }||||||||	|
|||fS )Nc                   s2   g | ]*} j d ks |t j kr$dn j | qS r   )scan_output_directionsr	   r
   r   r   r   r   2   s   z*Scan._common_run_shape.<locals>.<listcomp>r   zAScan is not implemented for other output output_direction than 0.c                   s2   g | ]*} j d ks |t j kr$dn j | qS r   )scan_output_axesr	   r
   r   r   r   r   @   s   z5Scan is not implemented for other output axes than 0.)r	   r   r   r   r   r   r   )r   argsnum_loop_state_varsnum_scan_outputsoutput_directionsmax_dir_outoutput_axesmax_axe_outstate_names_instate_names_outscan_names_inscan_names_outscan_valuesstatesr   r   r   _common_run_shape.   sF    
	
zScan._common_run_shapeN)r   r   r   r   r   r   
attributesc                   s\  | j | \}	}
}}}}}}}}}}||	 j| jd  }dd |D }t|D ]}i }t||D ]\}}|||< q^t||D ]\}}|| ||< qzz| |}W n: tk
r } ztdt| j d|W 5 d }~X Y nX t	t| j
|  fdd|D }t|D ]&\}}|| tj | dd qqL|D ]}t|}|| q2| t|S )Nr   c                 S  s   g | ]}g qS r   r   )r   _r   r   r   r      s     zScan._run.<locals>.<listcomp>zUnable to call 'run' for type 'z'.c                   s   g | ]} | qS r   r   )r   nameoutputsr   r   r      s     )Zaxis)r-   shaper   r   zipZ	_run_body	TypeErrorr   r   dictr   	enumerateappendnpZexpand_dimsZvstackZ_check_and_fix_outputstuple) r   r   r   r   r   r   r   r.   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Zmax_iterresultsitinputsr0   valueZoutputs_lister   resZconcr   r1   r   _runc   sL    
"
z	Scan._run)__name__
__module____qualname__r   r-   rA   r   r   r   r   r      s   "8r   )
__future__r   Znumpyr9   Zonnx.reference.op_runr   r   r   r   r   r   <module>   s   