MOOCHO (Single Doxygen Collection) Version of the Day
ConstrainedOptPack_MatrixKKTFullSpaceRelaxed.hpp
Go to the documentation of this file.
00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
00005 //                  Copyright (2003) Sandia Corporation
00006 // 
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 // 
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 
00038 // 
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 #ifndef MATRIX_KKT_FULL_SPACE_RELAXED_H
00043 #define MATRIX_KKT_FULL_SPACE_RELAXED_H
00044 
00045 #include "ConstrainedOptPack_Types.hpp"
00046 #include "AbstractLinAlgPack/src/MatrixWithOpFactorized.hpp"
00047 #include "AbstractLinAlgPack/src/MatrixConvertToSparseFortranCompatible.hpp"
00048 #include "Teuchos_StandardCompositionMacros.hpp"
00049 
00050 namespace ConstrainedOptPack {
00051 
00094 class MatrixKKTFullSpaceRelaxed
00095   : public MatrixWithOpFactorized
00096   , public MatrixConvertToSparseFortranCompatible
00097 {
00098 public:
00099   
00101   typedef AbstractLinAlgPack::DirectSparseFortranCompatibleSolver
00102     DirectSparseFortranCompatibleSolver;
00103 
00105   class NotInitializedException : public std::logic_error
00106   {public: NotInitializedException (const std::string& what_arg) : std::logic_error(what_arg) {}};
00107 
00109   class SingularMatrixException : public std::logic_error
00110   {public: SingularMatrixException (const std::string& what_arg) : std::logic_error(what_arg) {}};
00111 
00113   class InvalidMatrixType : public std::logic_error
00114   {public: InvalidMatrixType (const std::string& what_arg) : std::logic_error(what_arg) {}};
00115 
00117   enum ERunTests { RUN_TESTS, NO_TESTS };
00118 
00120   enum EPrintMoreOrLess { PRINT_MORE, PRINT_LESS };
00121 
00123   STANDARD_COMPOSITION_MEMBERS( DirectSparseFortranCompatibleSolver, direct_solver );
00124 
00126   MatrixKKTFullSpaceRelaxed( const direct_solver_ptr_t& direct_solver = 0 );
00127 
00164 
00168   void initialize( const MatrixOp& G, const MatrixOp& A
00169     , std::ostream* out = 0, EPrintMoreOrLess print_what = PRINT_LESS
00170     , ERunTests test_what = NO_TESTS );
00171 
00177   void initialize_relaxed( const MatrixOp& G, const MatrixOp& A
00178     , const DVectorSlice& c, value_type bigM = 1e+10
00179     , std::ostream* out = 0, EPrintMoreOrLess print_what = PRINT_LESS
00180     , ERunTests test_what = NO_TESTS );
00181 
00192   void set_uninitialized();
00193 
00200   void release_memory();
00201 
00203 
00204   // /////////////////////////////////////////////////////
00205   // Overridden from Matrix
00206 
00208   size_type rows() const;
00209 
00211   size_type cols() const;
00212 
00213   // /////////////////////////////////////////////////////////
00214   // Overridden from MatrixOp
00215 
00217   std::ostream& output(std::ostream& out) const;
00218 
00220   MatrixOp& operator=(const MatrixOp& m);
00221 
00223   void Vp_StMtV(DVectorSlice* vs_lhs, value_type alpha, BLAS_Cpp::Transp trans_rhs1
00224     , const DVectorSlice& vs_rhs2, value_type beta) const;
00225 
00226   // ////////////////////////////////////////////////////////////
00227   // Overridden from MatrixFactorized
00228 
00230   void V_InvMtV( DVectorSlice* v_lhs, BLAS_Cpp::Transp trans_rhs1
00231     , const DVectorSlice& vs_rhs2) const;
00232 
00233   // ////////////////////////////////////////////////////////////
00234   // Overridden from MatrixConvertToSparseFortranCompatible
00235 
00237   FortranTypes::f_int num_nonzeros( EExtractRegion extract_region ) const;
00238 
00240   void coor_extract_nonzeros(
00241       EExtractRegion extract_region
00242     , const FortranTypes::f_int len_Aval
00243       , FortranTypes::f_dbl_prec Aval[]
00244     , const FortranTypes::f_int len_Aij
00245       , FortranTypes::f_int Arow[]
00246       , FortranTypes::f_int Acol[]
00247       , const FortranTypes::f_int row_offset
00248       , const FortranTypes::f_int col_offset
00249      ) const;
00250 
00251 private:
00252 
00253   // //////////////////////////////
00254   // Private data members
00255 
00256   bool        initialized_;
00257   size_type     n_;   // Number of rows and columns in G and number of rows in A.
00258   size_type     m_;   // Number of columns in A
00259   bool        use_relaxation_;
00260   value_type      bigM_;
00261   EPrintMoreOrLess  print_what_;
00262   ERunTests     test_what_;
00263   std::ostream    *out_;
00264   const MatrixOp  *G_;
00265   const MatrixConvertToSparseFortranCompatible
00266             *convG_;
00267   size_type     G_nz_;  // Remember the number of nonzeros of G
00268   const MatrixOp  *A_;
00269   const MatrixConvertToSparseFortranCompatible
00270             *convA_;
00271   size_type     A_nz_;  // Remember the number of nonzeros of A
00272 
00273   // //////////////////////////////
00274   // Private member functions
00275 
00277   void assert_matrices_set() const;
00278 
00280   void assert_initialized() const;
00281 
00285   void validate_and_set_matrices( const MatrixOp& G, const MatrixOp& A );
00286 
00287 };  // end class MatrixKKTFullSpaceRelaxed
00288 
00289 } // end namespace ConstrainedOptPack
00290 
00291 #endif  // MATRIX_KKT_FULL_SPACE_RELAXED_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines