MOOCHO (Single Doxygen Collection) Version of the Day
MoochoPack_ReducedHessianSerialization_Step.cpp
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 #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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines