o
    wi                     @  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  sZ  t | dk}t| }t| g}t| D ]\}}|dkr/d|d  }d}d}	t||	|}
nd| }d|d  }d}	t||	|}
|dkri|rXt|
|df| }|g|}qt|
|ddf| }|g|}q|dkr|rt|
d|f| }|g|}qt|
d|df| }|g|}qt|
d|f| }|g|}qtj||rddS ddS )	N      g       @gqh ?r      )axis)lennpzerosones	enumeratearangereshapestack)	data_sizealign_cornersis_2d
size_zerosoriginal_griddimdim_sizestepstartstopayzx r   ^/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnx/reference/ops/op_affine_grid.pyconstruct_original_grid   s8   
r!   c                 C  s>  | j dks	J d|j dkrQ| j\}}}|dkr|dksJ |j\}}}|dks*J tt||| |f}t| |}tt|d||||f}	|	tjS |j dksXJ | j\}}
}|
dkrf|dkshJ |j\}}}}|dksuJ tt||| | |f}t| |}tt|d|||||
f}	|	tjS )Nr   z>theta_n shall have shape of (N, 2, 3) for 2D, (N, 3, 4) for 3Dr   )r   r   r      )ndimshaper
   	transposer   matmulastypefloat32)theta_noriginal_grid_homoNdim_2ddim_homoHWoriginal_grid_transposedgrid_ngriddim_3dDr   r   r    apply_affine_transform.   s:   
r5   c                   @  s   e Zd ZdddZdS )
AffineGridNc                 C  s.   |p| j }|^}}}t||}t||}|fS N)r   r!   r5   )selfthetasizer   _r   r   r2   r   r   r    _runV   s
   



zAffineGrid._runr7   )__name__
__module____qualname__r<   r   r   r   r    r6   U   s    r6   )	
__future__r   numpyr
   onnx.reference.op_runr   r!   r5   r6   r   r   r   r    <module>   s   #'