MoochoPack : Framework for Large-Scale Optimization Algorithms Version of the Day
MoochoPack_CalcD_vStep_Step.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 <limits>
00043 #include <ostream>
00044 #include <iostream>
00045 
00046 #include "MoochoPack_CalcD_vStep_Step.hpp"
00047 #include "MoochoPack_IpState.hpp"
00048 #include "MoochoPack_moocho_algo_conversion.hpp"
00049 #include "IterationPack_print_algorithm_step.hpp"
00050 //#include "ConstrainedOptPack_print_vector_change_stats.hpp"
00051 #include "AbstractLinAlgPack_MatrixSymDiagStd.hpp"
00052 #include "AbstractLinAlgPack_VectorMutable.hpp"
00053 #include "AbstractLinAlgPack_VectorStdOps.hpp"
00054 #include "AbstractLinAlgPack_VectorAuxiliaryOps.hpp"
00055 #include "AbstractLinAlgPack_VectorOut.hpp"
00056 #include "AbstractLinAlgPack_LinAlgOpPack.hpp"
00057 #include "Teuchos_dyn_cast.hpp"
00058 
00059 
00060 bool MoochoPack::CalcD_vStep_Step::do_step(Algorithm& _algo
00061   , poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss)
00062   {
00063   using Teuchos::dyn_cast;
00064   using IterationPack::print_algorithm_step;
00065   using AbstractLinAlgPack::ele_wise_prod;
00066   using AbstractLinAlgPack::lowerbound_multipliers_step;
00067   using AbstractLinAlgPack::upperbound_multipliers_step;
00068 
00069   NLPAlgo &algo = rsqp_algo(_algo);
00070   IpState  &s    = dyn_cast<IpState>(_algo.state());
00071   NLP      &nlp  = algo.nlp();
00072 
00073   EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level();
00074   std::ostream& out = algo.track().journal_out();
00075 
00076   // print step header.
00077   if( static_cast<int>(olevel) >= static_cast<int>(PRINT_ALGORITHM_STEPS) ) 
00078     {
00079     using IterationPack::print_algorithm_step;
00080     print_algorithm_step( algo, step_poss, type, assoc_step_poss, out );
00081     }
00082 
00083   // Get iteration quantities
00084   const value_type& mu = s.barrier_parameter().get_k(0);
00085   const Vector &d_k = s.d().get_k(0);
00086   const MatrixSymDiagStd& invXl = s.invXl().get_k(0);
00087   const MatrixSymDiagStd& invXu = s.invXu().get_k(0);
00088   const MatrixSymDiagStd& Vl = s.Vl().get_k(0);
00089   const MatrixSymDiagStd& Vu = s.Vu().get_k(0);
00090 
00091   VectorMutable& dvl_k = s.dvl().set_k(0);
00092   VectorMutable& dvu_k = s.dvu().set_k(0);
00093 
00094   lowerbound_multipliers_step(mu, invXl.diag(), Vl.diag(), d_k, &dvl_k);
00095   upperbound_multipliers_step(mu, invXu.diag(), Vu.diag(), d_k, &dvu_k);
00096 
00097   /*
00098   // dvl = mu*invXl*e - vl - invXl*Vl*d_k
00099   dvl_k = 0;
00100   ele_wise_prod(-1.0, invXl.diag(), Vl.diag(), &dvl_k);
00101   ele_wise_prod(1.0, dvl_k, d_k, &dvl_k);
00102 
00103   std::cout << "d_k =\n" << d_k;
00104    std::cout << "-invXl*Vl*d_k = \n" << dvl_k;
00105  
00106   dvl_k.axpy(-1.0, Vl.diag());
00107   
00108    std::cout << "-vl-invXl*Vl*d_k = \n" << dvl_k;
00109 
00110   dvl_k.axpy(mu, invXl.diag());
00111 
00112    std::cout << "dvl_k = \n" << dvl_k;
00113 
00114   // dvu = mu*invXu*e - vu + invXu*Vu*d_k
00115   dvu_k = 0;
00116   ele_wise_prod(1.0, invXu.diag(), Vu.diag(), &dvu_k);
00117   ele_wise_prod(1.0, dvu_k, d_k, &dvu_k);
00118 
00119   dvu_k.axpy(-1.0, Vu.diag());
00120   
00121   dvu_k.axpy(mu, invXu.diag());
00122   */
00123   if( static_cast<int>(olevel) >= static_cast<int>(PRINT_VECTORS) ) 
00124     {
00125     out << "\nx_k = \n" << s.x().get_k(0)
00126       << "\nxl = \n" << nlp.xl()
00127       << "\nxu = \n" << nlp.xu()
00128       << "\ndvl_k = \n" << dvl_k
00129       << "\ndvu_k = \n" << dvu_k;
00130     }
00131 
00132   return true;
00133   }
00134 
00135 void MoochoPack::CalcD_vStep_Step::print_step( const Algorithm& algo
00136   , poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss
00137   , std::ostream& out, const std::string& L ) const
00138 {
00139   out
00140     << L << "*** Calculates the search direction for the dual variables\n"
00141     << L << "dvl_k = mu*invXl_k*e - vl_k - invXl_k*Vl_k*d_k\n"
00142     << L << "dvu_k = mu*invXu_k*e - vu_k + invXu_k*Vu_k*d_k\n";
00143 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends