.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

mxnet.contrib
===============

.. automodule:: mxnet.contrib

Contributed modules
-------------------

.. container:: cards

   .. card::
      :title: contrib.autograd
      :link: autograd/index.html

      Functions for Automatic differentiation.

   .. card::
      :title: contrib.io
      :link: io/index.html

      Data iterators for common data formats and utility functions.

   .. card::
      :title: contrib.ndarray
      :link: ndarray/index.html

      Operations and functions on NDArrays.

   .. card::
      :title: contrib.onnx
      :link: onnx/index.html

      ONNX support.

   .. card::
      :title: contrib.quantization
      :link: quantization/index.html

      Functions for quantization.

   .. card::
      :title: contrib.symbol
      :link: symbol/index.html

      Symbolic API for MXNet.

   .. card::
      :title: contrib.tensorboard
      :link: tensorboard/index.html

      Tensorboard integration.

   .. card::
      :title: contrib.tensorrt
      :link: tensorrt/index.html

      Tensorrt integration.

   .. card::
      :title: contrib.text
      :link: text/index.html

      Functions for manipulating text data.


.. toctree::
   :hidden:
   :maxdepth: 2
   :glob:

   */index
