code: def __init__(self, c):
      super(Invertible1x1ConvLUS, self).__init__()
      # Sample a random orthonormal matrix to initialize weights
      W, _ = torch.linalg.qr(torch.FloatTensor(c, c).normal_())
      # Ensure determinant is 1.0 not -1.0
      if torch.det(W) < 0:
          W[:, 0] = -1 * W[:, 0]
      p, lower, upper = torch.lu_unpack(*torch.lu(W))
  
      self.register_buffer("p", p)
      # diagonals of lower will always be 1s anyway
      lower = torch.tril(lower, -1)
      lower_diag = torch.diag(torch.eye(c, c))
      self.register_buffer("lower_diag", lower_diag)
      self.lower = nn.Parameter(lower)
      self.upper_diag = nn.Parameter(torch.diag(upper))
      self.upper = nn.Parameter(torch.triu(upper, 1))
  
imports: from typing import Optional, Tuple
  import numpy
  import torch
  from torch import Tensor, nn
  from torch.cuda import amp
  from torch.cuda.amp import autocast
  from torch.nn import functional
  from nemo.collections.tts.modules.submodules import ConvNorm, LinearNorm, MaskedInstanceNorm1d
  from nemo.collections.tts.parts.utils.helpers import get_mask_from_lengths, sort_tensor, unsort_tensor
  from nemo.collections.tts.parts.utils.splines import piecewise_linear_inverse_transform, piecewise_linear_transform, unbounded_piecewise_quadratic_transform
label_desc: Use image node_id 1 to create a new Invertible1x1ConvLUS object from inherited base classes: torch.nn with example: obj = Invertible1x1ConvLUS(c)