|
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 #include "ConstrainedOptPack_MeritFuncNLPModL1.hpp" 00043 #include "AbstractLinAlgPack_VectorMutable.hpp" 00044 #include "AbstractLinAlgPack_VectorStdOps.hpp" 00045 #include "Teuchos_Assert.hpp" 00046 00047 namespace ConstrainedOptPack { 00048 00049 MeritFuncNLPModL1::MeritFuncNLPModL1() 00050 : deriv_(0.0) 00051 {} 00052 00053 // Overridden from MeritFuncNLP 00054 00055 value_type MeritFuncNLPModL1::value( 00056 value_type f 00057 ,const Vector *c 00058 ,const Vector *h 00059 ,const Vector *hl 00060 ,const Vector *hu 00061 ) const 00062 { 00063 TEUCHOS_TEST_FOR_EXCEPTION( 00064 h || hl || hu, std::logic_error 00065 ,"MeritFuncNLPModL1::value(...) : Error! general inequalities are not supported!" ); 00066 /* 00067 using DenseLinAlgPack::norm_1; 00068 return f + local_constr_term( mu_, c, "calc_deriv" ); 00069 */ 00070 TEUCHOS_TEST_FOR_EXCEPT(true); // ToDo: Write a reduction operator for the above operation 00071 return 0.0; 00072 } 00073 00074 value_type MeritFuncNLPModL1::deriv() const 00075 { 00076 return deriv_; 00077 } 00078 00079 void MeritFuncNLPModL1::print_merit_func( 00080 std::ostream& out, const std::string& L 00081 ) const 00082 { 00083 out 00084 << L << "*** Define a modified L1 merit funciton that uses different\n" 00085 << L << "*** penalty parameters for each constriant.\n" 00086 << L << "*** (assumes Gc_k'*d_k + c_k = 0):\n" 00087 << L << "phi(f,c) = f + sum( mu(j) * abs(c(j)), j = 1,...,m )\n" 00088 << L << "Dphi(x_k,d_k) = Gf_k' * d_k - sum( mu(j) * abs(c(j)), j = 1,...,m )\n"; 00089 } 00090 00091 // Overridden from MeritFuncNLPDirecDeriv 00092 00093 value_type MeritFuncNLPModL1::calc_deriv( 00094 const Vector &Gf_k 00095 ,const Vector *c_k 00096 ,const Vector *h_k 00097 ,const Vector *hl 00098 ,const Vector *hu 00099 ,const Vector &d_k 00100 ) 00101 { 00102 TEUCHOS_TEST_FOR_EXCEPTION( 00103 h_k || hl || hu, std::logic_error 00104 ,"MeritFuncNLPModL1::value(...) : Error! general inequalities are not supported!" ); 00105 /* 00106 using DenseLinAlgPack::dot; using DenseLinAlgPack::norm_1; 00107 return deriv_ = dot( Gf_k, d_k ) - local_constr_term( mu_, c_k, "calc_deriv" ); 00108 */ 00109 TEUCHOS_TEST_FOR_EXCEPT(true); // ToDo: Write a reduction operator for the above operation 00110 return 0.0; 00111 } 00112 00113 // Overridden from MeritFuncPenaltyParam 00114 00115 void MeritFuncNLPModL1::set_space_c( const VectorSpace::space_ptr_t& space_c ) 00116 { 00117 mu_ = space_c->create_member(); 00118 *mu_ = 0.0; 00119 } 00120 00121 VectorMutable& MeritFuncNLPModL1::set_mu() 00122 { 00123 return *mu_; 00124 } 00125 00126 const Vector& MeritFuncNLPModL1::get_mu() const 00127 { 00128 return *mu_; 00129 } 00130 00131 } // end namespace ConstrainedOptPack 00132 00133 /* ToDo: Write a reduction operator for the following! 00134 00135 namespace { 00136 00137 value_type local_constr_term( const DVector& mu, const DVectorSlice& c 00138 , const char func_name[] ) 00139 { 00140 if( mu.size() != c.size() ) { 00141 std::ostringstream omsg; 00142 omsg 00143 << "MeritFuncNLPModL1::" << func_name << "(...) : " 00144 << "Error, the sizes mu.size() == " << mu.size() 00145 << " != c.size() == " << c.size(); 00146 throw ConstrainedOptPack::MeritFuncNLP::InvalidInitialization(omsg.str()); 00147 } 00148 value_type r = 0.0; 00149 DVector::const_iterator 00150 mu_itr = mu.begin(); 00151 DVectorSlice::const_iterator 00152 c_itr = c.begin(); 00153 while( mu_itr != mu.end() ) 00154 r += *mu_itr++ * ::fabs( *c_itr++ ); 00155 return r; 00156 } 00157 00158 } // end namespace 00159 00160 */
1.7.6.1