o
    oi                     @   s4   d dl Z d dlZd dlmZmZ G dd deZdS )    N)ModuleTensorc                	       s|   e Zd ZdZdeddf fddZdedefdd	Z	
	ddedededefddZ	e
		ddededefddZ  ZS )DiscreteSteerera  Module for discrete rotation steerers.

    A steerer rotates keypoint descriptions in latent space as if they were obtained from rotated images.

    Args:
        generator: [N, N] tensor where N is the descriptor dimension.

    Example:
        >>> desc = torch.randn(512, 128)
        >>> generator = torch.randn(128, 128)
        >>> steerer = DiscreteSteerer(generator)
        >>> # steer 3 times:
        >>> steered_desc = steerer.steer_descriptions(desc, steerer_power=3, normalize=True)

    	generatorreturnNc                    s   t    tj|| _d S N)super__init__torchnn	Parameterr   )selfr   	__class__ K/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/steerers.pyr	   *   s   
zDiscreteSteerer.__init__xc                 C   s   t jj|| jS r   )r
   r   
functionallinearr   )r   r   r   r   r   forward.   s   zDiscreteSteerer.forward   Fdescriptionssteerer_power	normalizec                 C   s2   t |D ]}| |}q|rtjjj|dd}|S )N)dim)ranger   r
   r   r   r   )r   r   r   r   _r   r   r   steer_descriptions1   s
   z"DiscreteSteerer.steer_descriptionsC4   generator_typesteerer_orderc                 C   s  d}|dkr't g dg dg dg dg}t j|g|d   }| | S |dkr|d	 }d
| }|| }g }	|dkrE|	t | dtj | }
tddD ]'}||
 }t	|}t
|}t j||g| |ggt jd}|	|g|  qQt j|	 }| | S td| )a  Create a steerer for pretrained DeDoDe descriptors int the "C-setting"
            from the paper https://arxiv.org/abs/2312.02152, where descriptors were
            trained for fixed steerers.

        Args:
            generator_type: The type of steerer generator.
                One of 'C4', 'SO2', default is 'C4'.
                These can be used with the DeDoDe descriptors in Kornia
                with C4 or SO2 in the name respectively (so called C-setting steerers).
            steerer_order: The discretisation order for SO2-steerers (NOT used for C4-steerers).

        Returns:
            The pretrained model.

           r   )g        r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r      SO2      r      r      )dtypezUnknown generator_type: )r
   tensor
block_diagevalappendeyemathpir   cossinfloat32extend
ValueError)clsr!   r"   descriptor_dimc4_blockr   num_rot_blocks_per_freqdim_rotdim_trivialblocks
angle_stepjtheta	cos_theta	sin_theta
rot_matrixr   r   r   create_dedode_default=   s2   "


z%DiscreteSteerer.create_dedode_default)r   F)r   r    )__name__
__module____qualname____doc__r   r	   r   intboolr   classmethodstrr   rD   __classcell__r   r   r   r   r      s2    
r   )r0   r
   kornia.corer   r   r   r   r   r   r   <module>   s   