o
    8wiv                     @   sT   d dl mZ d dlZd dlZd dlmZ ddlmZ ddlmZ G dd deZ	dS )	    )OptionalN)Tensor   )BaseWaveformTransform)
ObjectDictc                       s   e Zd ZdZdZdZdhZ						ddeded	e	e d
e	e
 de	e
 de	e f fddZ				dded
e	e
 de	e de	e
 fddZ				dded
e	e
 de	e de	e
 def
ddZ  ZS )ShuffleChannelsa@  
    Given multichannel audio input (e.g. stereo), shuffle the channels, e.g. so left can become right and vice versa.
    This transform can help combat positional bias in machine learning models that input multichannel waveforms.

    If the input audio is mono, this transform does nothing except emit a warning.
    TFper_example      ?Nmodepp_modesample_ratetarget_rateoutput_typec                    s   t  j||||||d d S )N)r
   r   r   r   r   r   )super__init__)selfr
   r   r   r   r   r   	__class__ q/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/torch_audiomentations/augmentations/shuffle_channels.pyr      s   	
zShuffleChannels.__init__samplestargetsc           	      C   sh   |j d }|j d }|dksJ tj||ftj|jd}t|D ]}tj||jd||< q || jd< d S )Nr         )dtypedevice)r   permutations)shapetorchzerosint64r   rangerandpermtransform_parameters)	r   r   r   r   r   
batch_sizenum_channelsr   ir   r   r   randomize_parameters*   s   

z$ShuffleChannels.randomize_parametersreturnc                 C   s   |j d dkrtd t||||dS t|dD ] }||| jd | f ||< |d ur;||| jd | f ||< qt||||dS )Nr   zrMono audio was passed to ShuffleChannels - there are no channels to shuffle. The input will be returned unchanged.)r   r   r   r   r   r   )r   warningswarnr   r"   sizer$   )r   r   r   r   r   r'   r   r   r   apply_transform;   s*   zShuffleChannels.apply_transform)r   r	   NNNN)NNNN)__name__
__module____qualname____doc__supports_multichannelrequires_sample_ratesupported_modesstrfloatr   intr   r   r(   r   r-   __classcell__r   r   r   r   r      sh    
r   )
typingr   r*   r   r   core.transforms_interfacer   utils.object_dictr   r   r   r   r   r   <module>   s    