MoochoPack : Framework for Large-Scale Optimization Algorithms Version of the Day
MoochoPack_CalcReducedGradLagrangianStd_AddedStep.cpp
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 <ostream>
00043 #include "MoochoPack_CalcReducedGradLagrangianStd_AddedStep.hpp"
00044 #include "MoochoPack_NLPAlgoContainer.hpp"
00045 #include "MoochoPack_moocho_algo_conversion.hpp"
00046 #include "IterationPack_print_algorithm_step.hpp"
00047 #include "AbstractLinAlgPack_MatrixOp.hpp"
00048 #include "AbstractLinAlgPack_VectorSpace.hpp"
00049 #include "AbstractLinAlgPack_VectorMutable.hpp"
00050 #include "AbstractLinAlgPack_VectorOut.hpp"
00051 #include "AbstractLinAlgPack_VectorStdOps.hpp"
00052 #include "AbstractLinAlgPack_LinAlgOpPack.hpp"
00053 
00054 namespace LinAlgOpPack {
00055   using AbstractLinAlgPack::Vp_StV;
00056   using AbstractLinAlgPack::Vp_StMtV;
00057 }
00058 
00059 namespace MoochoPack {
00060 
00061 bool CalcReducedGradLagrangianStd_AddedStep::do_step(
00062   Algorithm& _algo, poss_type step_poss, IterationPack::EDoStepType type
00063   ,poss_type assoc_step_poss
00064   )
00065 {
00066   using BLAS_Cpp::trans;
00067   using LinAlgOpPack::V_VpV;
00068   using LinAlgOpPack::V_MtV;
00069   using LinAlgOpPack::Vp_V;
00070   using LinAlgOpPack::Vp_MtV;
00071 
00072   NLPAlgo         &algo  = rsqp_algo(_algo);
00073   NLPAlgoState    &s     = algo.rsqp_state();
00074 
00075   EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level();
00076   EJournalOutputLevel ns_olevel = algo.algo_cntr().null_space_journal_output_level();
00077   std::ostream& out = algo.track().journal_out();
00078 
00079   // print step header.
00080   if( static_cast<int>(ns_olevel) >= static_cast<int>(PRINT_ALGORITHM_STEPS) ) {
00081     using IterationPack::print_algorithm_step;
00082     print_algorithm_step( algo, step_poss, type, assoc_step_poss, out );
00083   }
00084 
00085   // Calculate: rGL = rGf + Z' * nu + Uz' * lambda(equ_undecomp)
00086 
00087   IterQuantityAccess<VectorMutable>
00088     &rGL_iq  = s.rGL(),
00089     &nu_iq   = s.nu(),
00090     &Gf_iq   = s.Gf();
00091 
00092   VectorMutable &rGL_k = rGL_iq.set_k(0);
00093 
00094   if( nu_iq.updated_k(0) && nu_iq.get_k(0).nz() > 0 ) {
00095     // Compute rGL = Z'*(Gf + nu) to reduce the effect of roundoff in this
00096     // catastropic cancelation
00097     const Vector &nu_k = nu_iq.get_k(0);
00098     VectorSpace::vec_mut_ptr_t
00099       tmp = nu_k.space().create_member();
00100 
00101     if( (int)olevel >= (int)PRINT_VECTORS )
00102       out << "\nnu_k = \n" << nu_k;
00103     V_VpV( tmp.get(), Gf_iq.get_k(0), nu_k );
00104     if( (int)olevel >= (int)PRINT_VECTORS )
00105       out << "\nGf_k+nu_k = \n" << *tmp;
00106     V_MtV(  &rGL_k, s.Z().get_k(0), trans, *tmp );
00107     if( (int)ns_olevel >= (int)PRINT_VECTORS )
00108       out << "\nrGL_k = \n" << rGL_k;
00109   }
00110   else {
00111     rGL_k = s.rGf().get_k(0);
00112   }
00113 
00114   // ToDo: Add terms for undecomposed equalities and inequalities!
00115   // + Uz' * lambda(equ_undecomp)
00116 
00117   if( static_cast<int>(ns_olevel) >= static_cast<int>(PRINT_ALGORITHM_STEPS) ) {
00118     out << "\n||rGL_k||inf = " << rGL_k.norm_inf() << "\n";
00119   }
00120 
00121   if( static_cast<int>(ns_olevel) >= static_cast<int>(PRINT_VECTORS) ) {
00122     out << "\nrGL_k = \n" << rGL_k;
00123   }
00124 
00125   return true;
00126 }
00127 
00128 void CalcReducedGradLagrangianStd_AddedStep::print_step(
00129   const Algorithm& algo
00130   ,poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss
00131   ,std::ostream& out, const std::string& L
00132   ) const
00133 {
00134   out
00135     << L << "*** Evaluate the reduced gradient of the Lagrangian\n"
00136     << L << "if nu_k is updated and nu_k.nz() > 0 then\n"
00137     << L << "    rGL_k = Z_k' * (Gf_k + nu_k) + Uz_k' * lambda_k(equ_undecomp)\n"
00138     << L << "else\n"
00139     << L << "    rGL_k = rGf_k + Uz_k' * lambda_k(equ_undecomp)\n"
00140     << L << "end\n";
00141 }
00142 
00143 } // end namespace MoochoPack
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends