view liboctave/numeric/sparse-qr.h @ 30564:796f54d4ddbf stable

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2021. In all .txi and .texi files except gpl.txi and gpl.texi in the doc/liboctave and doc/interpreter directories, change the copyright to "Octave Project Developers", the same as used for other source files. Update copyright notices for 2022 (not done since 2019). For gpl.txi and gpl.texi, change the copyright notice to be "Free Software Foundation, Inc." and leave the date at 2007 only because this file only contains the text of the GPL, not anything created by the Octave Project Developers. Add Paul Thomas to contributors.in.
author John W. Eaton <jwe@octave.org>
date Tue, 28 Dec 2021 18:22:40 -0500
parents 6f07492c9c20
children e7fc6251b698
line wrap: on
line source

////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2005-2022 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Octave 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Octave; see the file COPYING.  If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

#if ! defined (octave_sparse_qr_h)
#define octave_sparse_qr_h 1

#include "octave-config.h"

#include <memory>

#include "oct-cmplx.h"
#include "MArray-fwd.h"
#include "mx-fwd.h"

namespace octave
{
  namespace math
  {
    // If the sparse matrix classes become templated on the element type
    // (i.e., sparse_matrix<double>), then it might be best to make the
    // template parameter of this class also be the element type instead
    // of the matrix type.

    template <typename SPARSE_T>
    class
    sparse_qr
    {
    public:

      OCTAVE_API sparse_qr (void);

#if (defined (HAVE_SPQR) && defined (HAVE_CHOLMOD))
      // order = 7 selects SPQR default ordering
      OCTAVE_API sparse_qr (const SPARSE_T& a, int order = 7);
#else
      OCTAVE_API sparse_qr (const SPARSE_T& a, int order = 0);
#endif

      sparse_qr (const sparse_qr& a) = default;

      ~sparse_qr (void) = default;

      sparse_qr& operator = (const sparse_qr& a) = default;

      OCTAVE_API bool ok (void) const;

      OCTAVE_API ColumnVector E (void) const;

      // constructs permutation matrix from permutation vector rep -> E()
      OCTAVE_API SparseMatrix E_MAT () const;

      OCTAVE_API SPARSE_T V (void) const;

      OCTAVE_API ColumnVector Pinv (void) const;

      OCTAVE_API ColumnVector P (void) const;

      OCTAVE_API SPARSE_T R (bool econ = false) const;

      OCTAVE_API typename SPARSE_T::dense_matrix_type
      C (const typename SPARSE_T::dense_matrix_type& b, bool econ = false) const;

      OCTAVE_API typename SPARSE_T::dense_matrix_type
      Q (bool econ = false) const;

      template <typename RHS_T, typename RET_T>
      static OCTAVE_API RET_T
      solve (const SPARSE_T& a, const RHS_T& b,
             octave_idx_type& info);

    private:

      template <typename RHS_T, typename RET_T>
      static OCTAVE_API RET_T
      min2norm_solve (const SPARSE_T& a, const RHS_T& b,
                      octave_idx_type& info, int order);

      template <typename RHS_T, typename RET_T>
      OCTAVE_API RET_T
      tall_solve (const RHS_T& b, octave_idx_type& info) const;

      template <typename RHS_T, typename RET_T>
      OCTAVE_API RET_T
      wide_solve (const RHS_T& b, octave_idx_type& info) const;

      //--------
      class sparse_qr_rep;

      std::shared_ptr<sparse_qr_rep> m_rep;
    };

#if defined (__clang__) || defined (_WIN32)
    // extern instantiations with set visibility/export/import attribute

    extern template class OCTAVE_API sparse_qr<SparseMatrix>;

    extern template class OCTAVE_API sparse_qr<SparseComplexMatrix>;
#endif

    // Provide qrsolve for backward compatibility.

    extern OCTAVE_API Matrix
    qrsolve (const SparseMatrix& a, const MArray<double>& b,
             octave_idx_type& info);

    extern OCTAVE_API SparseMatrix
    qrsolve (const SparseMatrix& a, const SparseMatrix& b,
             octave_idx_type& info);

    extern OCTAVE_API ComplexMatrix
    qrsolve (const SparseMatrix& a, const MArray<Complex>& b,
             octave_idx_type& info);

    extern OCTAVE_API SparseComplexMatrix
    qrsolve (const SparseMatrix& a, const SparseComplexMatrix& b,
             octave_idx_type& info);

    extern OCTAVE_API ComplexMatrix
    qrsolve (const SparseComplexMatrix& a, const MArray<double>& b,
             octave_idx_type& info);

    extern OCTAVE_API SparseComplexMatrix
    qrsolve (const SparseComplexMatrix& a, const SparseMatrix& b,
             octave_idx_type& info);

    extern OCTAVE_API ComplexMatrix
    qrsolve (const SparseComplexMatrix& a, const MArray<Complex>& b,
             octave_idx_type& info);

    extern OCTAVE_API SparseComplexMatrix
    qrsolve (const SparseComplexMatrix& a, const SparseComplexMatrix& b,
             octave_idx_type& info);

    typedef sparse_qr<SparseMatrix> SparseQR;
    typedef sparse_qr<SparseComplexMatrix> SparseComplexQR;
  }
}

#endif