class_docstr: This function implements quaternion-valued 1d convolution.
  
  Arguments
  ---------
  input_shape : tuple
      The shape of the input.
  out_channels : int
      Number of output channels. Please note
      that these are quaternion-valued neurons. If 256
      channels are specified, the output dimension
      will be 1024.
  kernel_size : int
      Kernel size of the convolutional filters.
  stride : int, optional
      Stride factor of the convolutional filters (default 1).
  dilation : int, optional
      Dilation factor of the convolutional filters (default 1).
  padding : str, optional
      (same, valid, causal). If "valid", no padding is performed.
      If "same" and stride is 1, output shape is same as input shape.
      "causal" results in causal (dilated) convolutions (default "same").
  padding_mode : str, optional
      This flag specifies the type of padding. See torch.nn documentation
      for more information (default "reflect").
  groups : int, optional
      Default: 1
      This option specifies the convolutional groups. See torch.nn
      documentation for more information (default 1).
  bias : bool, optional
      If True, the additive bias b is adopted (default True).
  init_criterion : str , optional
      (glorot, he).
      This parameter controls the initialization criterion of the weights.
      It is combined with weights_init to build the initialization method of
      the quaternion-valued weights (default "glorot").
  weight_init : str, optional
      (quaternion, unitary).
      This parameter defines the initialization procedure of the
      quaternion-valued weights. "quaternion" will generate random quaternion
      weights following the init_criterion and the quaternion polar form.
      "unitary" will normalize the weights to lie on the unit circle (default "quaternion").
      More details in: "Quaternion Recurrent Neural Networks",
      Parcollet T. et al.
  spinor : bool, optional
      When True, the layer will be turned into a spinor layer. More precisely
      W*x will be turned into W*x*W-1. The input x will be rotated by W such
      as in a spinor neural network. However, x MUST be a quaternion with
      the real part equal to zero. (0 + xi + yj + zk). Indeed, the rotation
      operation only acts on the vector part. Note that W will always be
      normalized before the rotation to ensure the quaternion algebra (default False).
      More details in: "Quaternion neural networks", Parcollet T.
  vector_scale : bool, optional
      The vector_scale is only used when spinor = True. In the context of a
      spinor neural network, multiple rotations of the input vector x are
      performed and summed. Hence, the norm of the output vector always
      increases with the number of layers, making the neural network instable
      with deep configurations. The vector_scale parameters are learnable
      parameters that acts like gates by multiplying the output vector with
      a small trainable parameter (default False).
  
  Example
  -------
  >>> inp_tensor = torch.rand([10, 16, 40])
  >>> cnn_1d = QConv1d(
  ...     input_shape=inp_tensor.shape, out_channels=12, kernel_size=3
  ... )
  >>> out_tensor = cnn_1d(inp_tensor)
  >>> out_tensor.shape
  torch.Size([10, 16, 48])
class_docstr_tok: ["This","function","implements","quaternion-valued","1d","convolution",".","Arguments","--","--","--","--","-","input_shape",":","tuple","The","shape","of","the","input",".","out_channels",":","int","Number","of","output","channels",".","Please","note","that","these","are","quaternion-valued","neurons",".","If","256","channels","are","specified",",","the","output","dimension","will","be","1024.","kernel_size",":","int","Kernel","size","of","the","convolutional","filters",".","stride",":","int",",","optional","Stride","factor","of","the","convolutional","filters","(","default","1",")",".","dilation",":","int",",","optional","Dilation","factor","of","the","convolutional","filters","(","default","1",")",".","padding",":","str",",","optional","(","same",",","valid",",","causal",")",".","If","``","valid","''",",","no","padding","is","performed",".","If","``","same","''","and","stride","is","1",",","output","shape","is","same","as","input","shape",".","``","causal","''","results","in","causal","(","dilated",")","convolutions","(","default","``","same","''",")",".","padding_mode",":","str",",","optional","This","flag","specifies","the","type","of","padding",".","See","torch.nn","documentation","for","more","information","(","default","``","reflect","''",")",".","groups",":","int",",","optional","Default",":","1","This","option","specifies","the","convolutional","groups",".","See","torch.nn","documentation","for","more","information","(","default","1",")",".","bias",":","bool",",","optional","If","True",",","the","additive","bias","b","is","adopted","(","default","True",")",".","init_criterion",":","str",",","optional","(","glorot",",","he",")",".","This","parameter","controls","the","initialization","criterion","of","the","weights",".","It","is","combined","with","weights_init","to","build","the","initialization","method","of","the","quaternion-valued","weights","(","default","``","glorot","''",")",".","weight_init",":","str",",","optional","(","quaternion",",","unitary",")",".","This","parameter","defines","the","initialization","procedure","of","the","quaternion-valued","weights",".","``","quaternion","''","will","generate","random","quaternion","weights","following","the","init_criterion","and","the","quaternion","polar","form",".","``","unitary","''","will","normalize","the","weights","to","lie","on","the","unit","circle","(","default","``","quaternion","''",")",".","More","details","in",":","``","Quaternion","Recurrent","Neural","Networks","''",",","Parcollet","T.","et","al",".","spinor",":","bool",",","optional","When","True",",","the","layer","will","be","turned","into","a","spinor","layer",".","More","precisely","W","*","x","will","be","turned","into","W","*","x","*","W-1",".","The","input","x","will","be","rotated","by","W","such","as","in","a","spinor","neural","network",".","However",",","x","MUST","be","a","quaternion","with","the","real","part","equal","to","zero",".","(","0","+","xi","+","yj","+","zk",")",".","Indeed",",","the","rotation","operation","only","acts","on","the","vector","part",".","Note","that","W","will","always","be","normalized","before","the","rotation","to","ensure","the","quaternion","algebra","(","default","False",")",".","More","details","in",":","``","Quaternion","neural","networks","''",",","Parcollet","T.","vector_scale",":","bool",",","optional","The","vector_scale","is","only","used","when","spinor","=","True",".","In","the","context","of","a","spinor","neural","network",",","multiple","rotations","of","the","input","vector","x","are","performed","and","summed",".","Hence",",","the","norm","of","the","output","vector","always","increases","with","the","number","of","layers",",","making","the","neural","network","instable","with","deep","configurations",".","The","vector_scale","parameters","are","learnable","parameters","that","acts","like","gates","by","multiplying","the","output","vector","with","a","small","trainable","parameter","(","default","False",")",".","Example","--","--","--","-",">",">",">","inp_tensor","=","torch.rand","(","[","10",",","16",",","40","]",")",">",">",">","cnn_1d","=","QConv1d","(","...","input_shape=inp_tensor.shape",",","out_channels=12",",","kernel_size=3","...",")",">",">",">","out_tensor","=","cnn_1d","(","inp_tensor",")",">",">",">","out_tensor.shape","torch.Size","(","[","10",",","16",",","48","]",")"]
code: def __init__(
      self,
      out_channels,
      kernel_size,
      input_shape=None,
      stride=1,
      dilation=1,
      padding="same",
      groups=1,
      bias=True,
      padding_mode="reflect",
      init_criterion="glorot",
      weight_init="quaternion",
      spinor=False,
      vector_scale=False,
  ):
      super().__init__()
      self.input_shape = input_shape
      self.out_channels = out_channels
      self.kernel_size = kernel_size
      self.stride = stride
      self.dilation = dilation
      self.padding = padding
      self.groups = groups
      self.bias = bias
      self.padding_mode = padding_mode
      self.unsqueeze = False
      self.init_criterion = init_criterion
      self.weight_init = weight_init
      self.spinor = spinor
      self.vector_scale = vector_scale
  
      self.in_channels = self._check_input(input_shape) // 4
  
      # Managing the weight initialization and bias by directly setting the
      # correct function
  
      (self.k_shape, self.w_shape) = self._get_kernel_and_weight_shape()
  
      self.r_weight = torch.nn.Parameter(torch.Tensor(*self.w_shape))
      self.i_weight = torch.nn.Parameter(torch.Tensor(*self.w_shape))
      self.j_weight = torch.nn.Parameter(torch.Tensor(*self.w_shape))
      self.k_weight = torch.nn.Parameter(torch.Tensor(*self.w_shape))
  
      # Spinor specific parameters
      if self.spinor:
          self.zero_kernel = torch.nn.Parameter(
              torch.zeros(self.r_weight.shape), requires_grad=False
          )
      else:
          self.zero_kernel = torch.Tensor(
              self.r_weight.shape
          ).requires_grad_(False)
  
      if self.spinor and self.vector_scale:
          self.scale_param = torch.nn.Parameter(
              torch.Tensor(self.r_weight.shape)
          )
          torch.nn.init.xavier_uniform_(self.scale_param.data)
      else:
          self.scale_param = torch.Tensor(
              self.r_weight.shape
          ).requires_grad_(False)
  
      if self.bias:
          self.b = torch.nn.Parameter(
              torch.Tensor(4 * self.out_channels)
          )
          self.b.data.fill_(0)
      else:
          self.b = torch.Tensor(4 * self.out_channels).requires_grad_(
              False
          )
  
      self.winit = {
          "quaternion": quaternion_init,
          "unitary": unitary_init,
      }[self.weight_init]
  
      # Initialise the weights
      affect_conv_init(
          self.r_weight,
          self.i_weight,
          self.j_weight,
          self.k_weight,
          self.kernel_size,
          self.winit,
          self.init_criterion,
      )
  
imports: import torch
  import torch.nn
  import logging
  import torch.nn.functional
  from speechbrain.nnet.CNN import get_padding_elem
  from speechbrain.nnet.quaternion_networks.q_ops import unitary_init, quaternion_init, affect_conv_init, quaternion_conv_op, quaternion_conv_rotation_op
  from typing import Tuple
label_desc: Use image node_id 1 to create a new QConv1d object from inherited base classes: torch.nn with example: obj = QConv1d(out_channels, kernel_size, input_shape, stride, dilation, padding, groups, bias, padding_mode, init_criterion, weight_init, spinor, vector_scale)