|
MoochoPack : Framework for Large-Scale Optimization Algorithms
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 #include <fstream> 00043 00044 #include "MoochoPack_ReducedHessianSerialization_Step.hpp" 00045 #include "MoochoPack_moocho_algo_conversion.hpp" 00046 #include "MoochoPack_Exceptions.hpp" 00047 #include "IterationPack_print_algorithm_step.hpp" 00048 #include "AbstractLinAlgPack_VectorSpace.hpp" 00049 #include "AbstractLinAlgPack_VectorStdOps.hpp" 00050 #include "AbstractLinAlgPack_VectorMutable.hpp" 00051 #include "AbstractLinAlgPack_VectorOut.hpp" 00052 #include "AbstractLinAlgPack_MatrixSymOpNonsing.hpp" 00053 #include "AbstractLinAlgPack_MatrixSymInitDiag.hpp" 00054 #include "AbstractLinAlgPack_MatrixOpOut.hpp" 00055 #include "AbstractLinAlgPack_LinAlgOpPack.hpp" 00056 #include "SerializationPack_Serializable.hpp" 00057 #include "Teuchos_dyn_cast.hpp" 00058 00059 namespace MoochoPack { 00060 00061 ReducedHessianSerialization_Step::ReducedHessianSerialization_Step( 00062 const std::string &reduced_hessian_input_file_name 00063 ,const std::string &reduced_hessian_output_file_name 00064 ) 00065 :reduced_hessian_input_file_name_(reduced_hessian_input_file_name) 00066 ,reduced_hessian_output_file_name_(reduced_hessian_output_file_name) 00067 {} 00068 00069 // Overridden from AlgorithmStep 00070 00071 bool ReducedHessianSerialization_Step::do_step( 00072 Algorithm& _algo, poss_type step_poss, IterationPack::EDoStepType type 00073 ,poss_type assoc_step_poss 00074 ) 00075 { 00076 using Teuchos::dyn_cast; 00077 using SerializationPack::Serializable; 00078 00079 NLPAlgo &algo = rsqp_algo(_algo); 00080 NLPAlgoState &s = algo.rsqp_state(); 00081 00082 EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level(); 00083 EJournalOutputLevel ns_olevel = algo.algo_cntr().null_space_journal_output_level(); 00084 std::ostream& out = algo.track().journal_out(); 00085 00086 // print step header. 00087 if( static_cast<int>(olevel) >= static_cast<int>(PRINT_ALGORITHM_STEPS) ) { 00088 using IterationPack::print_algorithm_step; 00089 print_algorithm_step( _algo, step_poss, type, assoc_step_poss, out ); 00090 } 00091 00092 IterQuantityAccess<MatrixSymOp> &rHL_iq = s.rHL(); 00093 00094 if( !rHL_iq.updated_k(0) && reduced_hessian_input_file_name().length() ) { 00095 int k_last_offset = rHL_iq.last_updated(); 00096 if( k_last_offset == IterQuantity::NONE_UPDATED ) { 00097 if( (int)olevel >= (int)PRINT_ALGORITHM_STEPS ) { 00098 out 00099 << "\nNo previous matrix rHL was found!\n" 00100 << "\nReading in the matrix rHL_k from the file \""<<reduced_hessian_input_file_name()<<"\" ...\n"; 00101 } 00102 MatrixSymOp &rHL_k = rHL_iq.set_k(0); 00103 Serializable &rHL_serializable = dyn_cast<Serializable>(rHL_k); 00104 std::ifstream reduced_hessian_input_file(reduced_hessian_input_file_name().c_str()); 00105 TEUCHOS_TEST_FOR_EXCEPTION( 00106 !reduced_hessian_input_file, std::logic_error 00107 ,"ReducedHessianSerialization_Step::do_step(...): Error, the file \""<<reduced_hessian_input_file_name()<<"\"" 00108 " could not be opened or contains no input!" 00109 ); 00110 rHL_serializable.unserialize(reduced_hessian_input_file); 00111 if( (int)ns_olevel >= (int)PRINT_ALGORITHM_STEPS ) { 00112 out << "\nrHL_k.rows() = " << rHL_k.rows() << std::endl; 00113 out << "\nrHL_k.cols() = " << rHL_k.cols() << std::endl; 00114 if(algo.algo_cntr().calc_matrix_norms()) 00115 out << "\n||rHL_k||inf = " << rHL_k.calc_norm(MatrixOp::MAT_NORM_INF).value << std::endl; 00116 if(algo.algo_cntr().calc_conditioning()) { 00117 const MatrixSymOpNonsing 00118 *rHL_ns_k = dynamic_cast<const MatrixSymOpNonsing*>(&rHL_k); 00119 if(rHL_ns_k) 00120 out << "\ncond_inf(rHL_k) = " << rHL_ns_k->calc_cond_num(MatrixOp::MAT_NORM_INF).value << std::endl; 00121 } 00122 } 00123 if( (int)ns_olevel >= (int)PRINT_ITERATION_QUANTITIES ) 00124 out << "\nrHL_k = \n" << rHL_k; 00125 // Validate the space 00126 const MatrixOp &Z_k = s.Z().get_k(0); 00127 const VectorSpace &null_space = Z_k.space_rows(); 00128 TEUCHOS_TEST_FOR_EXCEPTION( 00129 !null_space.is_compatible(rHL_k.space_cols()) || !null_space.is_compatible(rHL_k.space_rows()) 00130 ,std::runtime_error 00131 ,"ReducedHessianSerialization_Step::do_step(...): Error, the read-in reduced Hessian of dimension " 00132 << rHL_k.rows() << " x " << rHL_k.cols() << " is not compatible with the null space of dimension " 00133 "Z_k.cols() = " << Z_k.cols() << "!" 00134 ); 00135 } 00136 } 00137 00138 return true; 00139 00140 } 00141 00142 void ReducedHessianSerialization_Step::finalize_step( 00143 Algorithm& _algo, poss_type step_poss, IterationPack::EDoStepType type 00144 ,poss_type assoc_step_poss 00145 ) 00146 { 00147 using Teuchos::dyn_cast; 00148 using SerializationPack::Serializable; 00149 00150 const NLPAlgo &algo = rsqp_algo(_algo); 00151 const NLPAlgoState &s = algo.rsqp_state(); 00152 00153 EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level(); 00154 std::ostream& out = algo.track().journal_out(); 00155 00156 const IterQuantityAccess<MatrixSymOp> &rHL_iq = s.rHL(); 00157 00158 int k_last_offset = rHL_iq.last_updated(); 00159 00160 if( k_last_offset != IterQuantity::NONE_UPDATED && reduced_hessian_output_file_name().length() ) { 00161 if( (int)olevel >= (int)PRINT_ALGORITHM_STEPS ) { 00162 out 00163 << "\nSerializing the matrix rHL_k("<<k_last_offset<<") to the file " 00164 << "\""<<reduced_hessian_output_file_name()<<"\" ...\n"; 00165 } 00166 const MatrixSymOp &rHL_k = rHL_iq.get_k(k_last_offset); 00167 const Serializable &rHL_serializable = dyn_cast<const Serializable>(rHL_k); 00168 std::ofstream reduced_hessian_output_file(reduced_hessian_output_file_name().c_str()); 00169 TEUCHOS_TEST_FOR_EXCEPTION( 00170 !reduced_hessian_output_file, std::logic_error 00171 ,"ReducedHessianSerialization_Step::finalize_step(...): Error, the file \""<<reduced_hessian_output_file_name()<<"\"" 00172 " could not be opened!" 00173 ); 00174 rHL_serializable.serialize(reduced_hessian_output_file); 00175 } 00176 } 00177 00178 void ReducedHessianSerialization_Step::print_step( 00179 const Algorithm& algo, poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss 00180 ,std::ostream& out, const std::string& L 00181 ) const 00182 { 00183 out 00184 << L << "*** Read in the reduced Hessian of the Lagrangian rHL from a file.\n" 00185 << L << "if (rHL_k is not updated and reduced_hessian_input_file_name != \"\") then\n" 00186 << L << " k_last_offset = last iteration rHL was updated for\n" 00187 << L << " if k_last_offset==NONE_UPDATED then\n" 00188 << L << " rHL_serializable = dyn_cast<Serializable>(rHL_k) *** Throws exception if fails!\n" 00189 << L << " Unserialize into rHL_serializable from the file \""<<reduced_hessian_input_file_name()<<"\"\n" 00190 << L << " else\n" 00191 << L << " *** There is some reduced Hessian that exists for some past iteration so\n" 00192 << L << " *** we will let some other step object initialize itQ\n" 00193 << L << " end\n" 00194 << L << "end\n" 00195 << L << "*** Note: On finalization, this step object will serialize rHL_k to the file:\n" 00196 << L << "*** \""<<reduced_hessian_output_file_name()<<"\"" 00197 ; 00198 } 00199 00200 } // end namespace MoochoPack
1.7.6.1