.. 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.

Legacy
======

This document hosts API for legacy modules that are being deprecated in MXNet 2.x.

.. container:: cards

   .. card::
      :title: NDArray API
      :link: ndarray/index.html

      Imperative APIs to manipulate multi-dimensional arrays.

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

      Symbolic APIs for multi-dimensional arrays and neural network layers

   .. card::
      :title: mxnet.callback
      :link: callback/index.html

      Functions to track various statuses during an epoch.

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

      Data iterators for common data formats and utility functions.

   .. card::
      :title: mxnet.recordio
      :link: recordio/index.html

      Read and write for the RecordIO data format.

   .. card::
      :title: mxnet.image
      :link: image/index.html

      Image iterators and image augmentation functions.

   .. card::
      :title: mxnet.visualization
      :link: visualization/index.html

      Functions for Symbol visualization.


.. toctree::
   :hidden:
   :glob:

   */index*
