class_docstr: Dialect op for N-D RFFT (rfftn). The FFT of a real signal is Hermitian-symmetric,
  X[i_1, ..., i_n] = conj(X[-i_1, ..., -i_n]) so the full ``complex_fftn`` output contains
  redundant information. ``complex_rfftn`` omits the negative frequencies in the last dimension.
  
  Parameters
  ----------
  See the ``complex_fftn`` op.
  
  Returns
  -------
  tensor<\*V, complex64>
      * Based on the output of N-D FFT, further remove the redundant conjugate part in last dim,
        which means ``V[dims[-1]] = V[dims[-1]] // 2 + 1``.
  
  Attributes
  ----------
  T: fp32
  
  References
  ----------
  See `torch.fft.rfftn <https://pytorch.org/docs/stable/generated/torch.fft.rfftn.html>`_.
class_docstr_tok: ["Dialect","op","for","N-D","RFFT","(","rfftn",")",".","The","FFT","of","a","real","signal","is","Hermitian-symmetric",",","X","[","i_1",",","...",",","i_n","]","=","conj","(","X","[","-i_1",",","...",",","-i_n","]",")","so","the","full","``","complex_fftn","``","output","contains","redundant","information",".","``","complex_rfftn","``","omits","the","negative","frequencies","in","the","last","dimension",".","Parameters","--","--","--","--","--","See","the","``","complex_fftn","``","op",".","Returns","--","--","--","-","tensor","<","\\","*","V",",","complex64",">","*","Based","on","the","output","of","N-D","FFT",",","further","remove","the","redundant","conjugate","part","in","last","dim",",","which","means","``","V","[","dims","[","-1","]","]","=","V","[","dims","[","-1","]","]","\/\/","2","+","1","``",".","Attributes","--","--","--","--","--","T",":","fp32","References","--","--","--","--","--","See","`","torch.fft.rfftn","<","https",":","\/\/pytorch.org\/docs\/stable\/generated\/torch.fft.rfftn.html",">","`","_","."]
code: def type_inference(self):
      output_type = infer_complex_dtype(
          self.data.dtype, self.data.dtype
      )
      output_shape = list(self.data.shape)
      shapes, dims = fft_canonicalize_shapes_dims(
          self.data, self.shapes, self.dims
      )
      for shape, dim in zip(shapes, dims):
          output_shape[dim] = shape
      # The last dim's shape is after removing the redundant conjugate part.
      output_shape[dims[-1]] = output_shape[dims[-1]] // 2 + 1
  
      return types.tensor(output_type, tuple(output_shape))
  
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 2 for calling the complex_rfftn obj's underlying member method code with example usage: obj.type_inference() and returns: types