    {-# LANGUAGE TypeOperators #-}

    --------------------------------------------------------------------------------
    {- |
    Module      :  Numeric.LinearAlgebra.Data
    Copyright   :  (c) Alberto Ruiz 2015
    License     :  BSD3
    Maintainer  :  Alberto Ruiz
    Stability   :  provisional

    This module provides functions for creation and manipulation of vectors and matrices, IO, and other utilities.

    -}
    --------------------------------------------------------------------------------

    module Numeric.LinearAlgebra.Data(

        -- * Elements
        R,C,I,Z,type(./.),

        -- * Vector
        {- | 1D arrays are storable vectors directly reexported from the vector package.
        -}

        fromList, toList, (|>), vector, range, idxs,

        -- * Matrix

        {- | The main data type of hmatrix is a 2D dense array defined on top of
             a storable vector. The internal representation is suitable for direct
             interface with standard numeric libraries.
        -}

        (><), matrix, tr, tr',

        -- * Dimensions

        size, rows, cols,

        -- * Conversion from\/to lists

        fromLists, toLists,
        row, col,

        -- * Conversions vector\/matrix

        flatten, reshape, asRow, asColumn,
        fromRows, toRows, fromColumns, toColumns,

        -- * Indexing

        atIndex,
        Indexable(..),

        -- * Construction
        scalar, Konst(..), Build(..), assoc, accum, linspace,  -- ones, zeros,

        -- * Diagonal
        ident, diag, diagl, diagRect, takeDiag,

        -- * Vector extraction
        subVector, takesV, vjoin,

        -- * Matrix extraction
        Extractor(..), (??),

        (?), (¿), fliprl, flipud,

        subMatrix, takeRows, dropRows, takeColumns, dropColumns,

        remap,

        -- * Block matrix
        fromBlocks, (|||), (===), diagBlock, repmat, toBlocks, toBlocksEvery,

        -- * Mapping functions
        conj, cmap, cmod,

        step, cond,

        -- * Find elements
        find, maxIndex, minIndex, maxElement, minElement,
        sortVector, sortIndex,

        -- * Sparse
        AssocMatrix, toDense,
        mkSparse, mkDiagR, mkDense,

        -- * IO
        disp,
        loadMatrix, loadMatrix', saveMatrix,
        latexFormat,
        dispf, disps, dispcf, format,
        dispDots, dispBlanks, dispShort,
    -- * Element conversion
        Convert(..),
        roundVector,
        fromInt,toInt,fromZ,toZ,
        -- * Misc
        arctan2,
        separable,
        fromArray2D,
        module Data.Complex,
        Mod,
        Vector, Matrix, GMatrix, nRows, nCols

    ) where

    import Internal.Vector
    import Internal.Vectorized
    import Internal.Matrix hiding (size)
    import Internal.Element
    import Internal.IO
    import Internal.Numeric
    import Internal.Container
    import Internal.Util hiding ((&))
    import Data.Complex
    import Internal.Sparse
    import Internal.Modular