/* Copyright (c) LinBox
 * ========LICENCE========
 * This file is part of the library LinBox.
 *
 * LinBox is free software: you can redistribute it and/or modify
 * it under the terms of the  GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * ========LICENCE========
 *.
 */


/** \ingroup linbox
  \defgroup blackbox blackbox
  \brief These matrix classes adhere to the simple blackbox interface.

  Blackbox matrix algorithms require of the matrix only it's
  property of being a linear operator.  That is, such algorithms exploit only the
  capacity to apply the matrix to a vector (column vector on right or row vector on left).
  The advantage is efficient generic methods particularly applicable to sparse and
  structured matrix classes in which matrix vector product is fast.  Importantly,
  these methods are also space efficient, typically, for an n by n matrix using only O(n) space
  beyond the matrix representation itself.

  These classes all implement the very simple black box
  interface as it is defined in the
  LinBox::BlackboxArchetype  base class.  Thus blackbox matrix algorithms may be used on
  objects of any of these classes.  In contrast, classes representing matrices in such
  a way that elimination and other operations can be performed on them
  adhere to more extensive interfaces defined in the \ref matrix directory.

  Some of the classes are intended for general use, some are designed to support specific
  needs of algorithms, and some are primarily for testing purposes.

  Users are most likely to be interested in the sparse matrix classes (SparseMatrix, TriplesBB), the class DenseMatrix,
  and structured matrix classes such as Toeplitz.  Consult the constructors and/or read() member
  function documentation to see how to create them.  To use a blackbox of class BB in a code:

  Classes designed to be used as preconditioners in algorithms or for testing typically also provide
  functionality to generate random instances of the class.
  Examples are Diagonal and Butterfly for preconditioners, xxx for testing.

  Some of the classes provide a rudimentary basis of blackbox operators for a "blackbox calculus."
  These include <code>Compose, Sum, Dif, Submatrix, DirectSum, Inverse, MoorePenrose</code>.

\note Developers: All black box matrices should be derived from the
\link LinBox::BlackboxArchetype BlackboxArchetype \endlink, so that they may be used as parameters to
functions compiled with the blackbox archetype.

 */

// vim:syn=doxygen
