o
    oi                     @   sn   d dl mZ d dlZd dlmZ d dlmZ dededefdd	Zdededefd
dZG dd dejZ	dS )    )partialN)nn)Tensorxfreqreturnc                 C      | |   S N)sinr   r    r   R/home/ubuntu/.local/lib/python3.10/site-packages/kornia/nerf/positional_encoder.py
_torch_sin      r   c                 C   r   r	   )cosr   r   r   r   
_torch_cos   r   r   c                	       sX   e Zd ZdZddedededdf fdd	Zedefd
dZde	de	fddZ
  ZS )PositionalEncoderz0Sine-cosine positional encoder for input points.Fnum_dims	num_freqs	log_spacer   Nc                    s   t    || _dd g| _|rdtd|d | }ntdd|d  |}|D ]}| jtt|d | jtt	|d q)| jt
| j | _dS )	a  Initialize positional encoder.

        Args:
            num_dims: Number of input dimensions (channels): int
            num_freqs: Number of frequency bands for encoding span: int
            log_space: Whether frequency sampling should be log spaced: bool

        c                 S   s   | S r	   r   r   r   r   r   <lambda>0   s    z,PositionalEncoder.__init__.<locals>.<lambda>g       @g           g      ?)r   N)super__init__	_num_dims
_embed_fnstorchlinspaceappendr   r   r   len_num_encoded_dims)selfr   r   r   
freq_bandsr   	__class__r   r   r   %   s   
	zPositionalEncoder.__init__c                 C   s   | j S )zNumber of encoded dimensions.)r!   )r"   r   r   r   num_encoded_dims@   s   z"PositionalEncoder.num_encoded_dimsr   c                    s\    j dk r	td jd | jkrtd jd  d| j tj fdd| jD ddS )	zApply positional encoding to input.

        Args:
            x: Positionsl (or directional) tensor to encode: Tensor

        Returns:
            Tensor with encoded position/direction: Tensor

        r   z Input tensor represents a scalarz"Input tensor number of dimensions z, does not match instantiated dimensionality c                    s   g | ]}| qS r   r   ).0fnr   r   r   
<listcomp>V   s    z-PositionalEncoder.forward.<locals>.<listcomp>)dim)ndim
ValueErrorshaper   r   catr   )r"   r   r   r   r   forwardE   s   

zPositionalEncoder.forward)F)__name__
__module____qualname____doc__intboolr   propertyr&   r   r0   __classcell__r   r   r$   r   r   "   s     r   )
	functoolsr   r   r   kornia.corer   r   r   Moduler   r   r   r   r   <module>   s   