|
ConstrainedOptPack: C++ Tools for Constrained (and Unconstrained) Optimization
Version of the Day
|
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
1.7.6.1