U
    qh                     @  sD   d dl mZ d dlZd dlmZ dd Zdd ZG dd	 d	eZdS )
    )annotationsN)OpRunc                 C  s^  t | dk}t| }t| g}t| D ]\}}|dkr`d|d  }d}d}	t||	|}
n&d| }d|d  }d}	t||	|}
|dkr|rt|
|df| }|f|}n t|
|ddf| }|f|}q*|dkr&|rt|
d|f| }|f|}n t|
d|df| }|f|}q*t|
d|f| }|f|}q*tj||rVdnddS )	N      g       @gqh ?r      )Zaxis)lennpzerosZones	enumerateZarangereshapestack)	data_sizealign_cornersZis_2dZ
size_zerosoriginal_gridZdimZdim_sizestepstartstopayzx r   E/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_affine_grid.pyconstruct_original_grid   s8    

r   c                 C  sB  | j dkstd|j dkr| j\}}}|dkr8|dks<t|j\}}}|dksTttt||| |f}t| |}tt|d||||f}	|	tjS |j dkst| j\}}
}|
dkr|dkst|j\}}}}|dksttt||| | |f}t| |}tt|d|||||
f}	|	tjS d S )Nr   z>theta_n shall have shape of (N, 2, 3) for 2D, (N, 3, 4) for 3Dr   )r   r   r      )	ndimAssertionErrorshaper	   Z	transposer   matmulZastypeZfloat32)Ztheta_nZoriginal_grid_homoNZdim_2dZdim_homoHWZoriginal_grid_transposedZgrid_ngridZdim_3dDr   r   r   apply_affine_transform.   s@    
  r%   c                   @  s   e Zd ZdddZdS )
AffineGridNc                 C  s.   |p| j }|^}}}t||}t||}|fS )N)r   r   r%   )selfthetasizer   _r   r   r#   r   r   r   _runV   s
    



zAffineGrid._run)N)__name__
__module____qualname__r+   r   r   r   r   r&   U   s   r&   )	
__future__r   Znumpyr	   Zonnx.reference.op_runr   r   r%   r&   r   r   r   r   <module>   s
   #'