class_docstr: Dialect op for N-D FFT. As PyTorch's FFT API has a much more fine-grained control than
  TensorFlow's, the parameters of this dialect op mainly follows `torch.fft.fftn`.
  
  Parameters
  ----------
  data: tensor<\*D, T> (Required)
      * The input tensor.
  shapes: const tensor<rank(data), i32> (Optional. Default=None)
      * Signal size in the transformed dimensions. If given, each dimension ``dims[i]`` will
        either be zero-padded or trimmed to the length ``shapes[i]`` before computing the FFT. If
        a length ``-1`` is specified, no padding is done in that dimension. If not specified, it's
        equivalent to ``shapes = [data.size(dim) for dim in dims]``.
  dims: const tensor<rank(data), i32> (Optional. Default=None)
      * Dimensions to be transformed. If not specified, it's equivalent to all dimensions, or the
        last ``len(shapes)`` dimensions if ``shapes`` is given.
  norm: const str (Optional. Default=``backward``)
      * Normalization mode. For the forward transform (fftn()), these correspond to:
          * "forward" - normalize by 1/n
          * "backward" - no normalization
          * "ortho" - normalize by 1/sqrt(n) (making the FFT orthonormal)
        where ``n = prod(shapes)`` is the logical FFT size. Calling the backward transform
        (ifftn()) with the same normalization mode will apply an overall normalization of 1/n
        between the two transforms. This is required to make ifftn() the exact inverse.
      * Default is "backward" (no normalization).
  
  Returns
  -------
  tensor<\*V, complex64>
      * A complex tensor where real and imag parts have the same shape.
      * If ``shapes`` and ``dims`` are both None, real's and imag's shapes are same as the input.
      * If ``shapes`` or ``dims`` is specified, shape is ``V[dim]=shapes[dim] for dim in dims``.
  
  Attributes
  ----------
  T: fp32, complex64
  
  References
  ----------
  See `torch.fft.fftn <https://pytorch.org/docs/stable/generated/torch.fft.fftn.html>`_.
class_docstr_tok: ["Dialect","op","for","N-D","FFT",".","As","PyTorch","'s","FFT","API","has","a","much","more","fine-grained","control","than","TensorFlow","'s",",","the","parameters","of","this","dialect","op","mainly","follows","`","torch.fft.fftn","`",".","Parameters","--","--","--","--","--","data",":","tensor","<","\\","*","D",",","T",">","(","Required",")","*","The","input","tensor",".","shapes",":","const","tensor","<","rank","(","data",")",",","i32",">","(","Optional",".","Default=None",")","*","Signal","size","in","the","transformed","dimensions",".","If","given",",","each","dimension","``","dims","[","i","]","``","will","either","be","zero-padded","or","trimmed","to","the","length","``","shapes","[","i","]","``","before","computing","the","FFT",".","If","a","length","``","-1","``","is","specified",",","no","padding","is","done","in","that","dimension",".","If","not","specified",",","it's","equivalent","to","``","shapes","=","[","data.size","(","dim",")","for","dim","in","dims","]","``",".","dims",":","const","tensor","<","rank","(","data",")",",","i32",">","(","Optional",".","Default=None",")","*","Dimensions","to","be","transformed",".","If","not","specified",",","it","'s","equivalent","to","all","dimensions",",","or","the","last","``","len","(","shapes",")","``","dimensions","if","``","shapes","``","is","given",".","norm",":","const","str","(","Optional",".","Default=","``","backward","``",")","*","Normalization","mode",".","For","the","forward","transform","(","fftn","(",")",")",",","these","correspond","to",":","*","``","forward","''","-","normalize","by","1\/n","*","``","backward","''","-","no","normalization","*","``","ortho","''","-","normalize","by","1\/sqrt","(","n",")","(","making","the","FFT","orthonormal",")","where","``","n","=","prod","(","shapes",")","``","is","the","logical","FFT","size",".","Calling","the","backward","transform","(","ifftn","(",")",")","with","the","same","normalization","mode","will","apply","an","overall","normalization","of","1\/n","between","the","two","transforms",".","This","is","required","to","make","ifftn","(",")","the","exact","inverse",".","*","Default","is","``","backward","''","(","no","normalization",")",".","Returns","--","--","--","-","tensor","<","\\","*","V",",","complex64",">","*","A","complex","tensor","where","real","and","imag","parts","have","the","same","shape",".","*","If","``","shapes","``","and","``","dims","``","are","both","None",",","real","'s","and","imag","'s","shapes","are","same","as","the","input",".","*","If","``","shapes","``","or","``","dims","``","is","specified",",","shape","is","``","V","[","dim","]","=shapes","[","dim","]","for","dim","in","dims","``",".","Attributes","--","--","--","--","--","T",":","fp32",",","complex64","References","--","--","--","--","--","See","`","torch.fft.fftn","<","https",":","\/\/pytorch.org\/docs\/stable\/generated\/torch.fft.fftn.html",">","`","_","."]
code: def default_inputs(self):
      return DefaultInputs(
          shapes=None,
          dims=None,
          norm="backward",
      )
  
imports: from typing import Optional, Tuple
  import numpy
  from coremltools.converters.mil.mil import Operation, types
  from coremltools.converters.mil.mil.input_type import DefaultInputs, InputSpec, TensorInputType
  from coremltools.converters.mil.mil.ops.registry import SSAOpRegistry
  from coremltools.converters.mil.mil.types.symbolic import any_symbolic, is_symbolic
  from coremltools.converters.mil.mil.types.type_mapping import infer_complex_dtype, infer_fp_dtype_from_complex
  from coremltools.converters.mil.mil.var import ComplexVar, Var
label_desc: Use image node_id 1 for calling the complex_fftn obj's underlying member method code with example usage: obj.default_inputs() and returns: DefaultInputs