NLPInterfacePack: C++ Interfaces and Implementation for Non-Linear Programs  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
NLPInterfacePack_NLPObjGrad.cpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
5 // Copyright (2003) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #include "NLPInterfacePack_NLPObjGrad.hpp"
43 #include "AbstractLinAlgPack_VectorMutable.hpp"
44 
45 namespace {
46  const char name_Gf[] = "Gf";
47 } // end namespace
48 
49 namespace NLPInterfacePack {
50 
51 // constructors
52 
54  : Gf_(NULL)
55 {}
56 
57 void NLPObjGrad::initialize(bool test_setup) {
58  num_Gf_evals_ = 0;
59  NLP::initialize(test_setup);
60 }
61 
62 // Information
63 
65 {
66  return true;
67 }
68 
70 {
71  return false;
72 }
73 
74 // <<std aggr>> members for Gf
75 
77 {
78  Gf_ = Gf;
79 }
80 
82 {
83  return StandardCompositionRelationshipsPack::get_role_name(Gf_, false, name_Gf);
84 }
85 
87 {
88  return StandardCompositionRelationshipsPack::role_name(Gf_, false, name_Gf);
89 }
90 
92 {
93  return StandardCompositionRelationshipsPack::role_name(Gf_, false, name_Gf);
94 }
95 
97 {
99  Gf_ = NULL;
100 }
101 
102 // calculations
103 
104 void NLPObjGrad::calc_Gf(const Vector& x, bool newx) const
105 {
106  StandardCompositionRelationshipsPack::assert_role_name_set(Gf_, "NLP::calc_Gf()", name_Gf);
107  imp_calc_Gf(x,newx,obj_grad_info());
108  num_Gf_evals_++;
109 }
110 
111 value_type NLPObjGrad::calc_Gf_prod(const Vector& x, const Vector& d, bool newx) const
112 {
114  true,std::logic_error
115  ,"Error, the function calc_Gf_prod(...) is not implemented for the class "
116  << typeName(*this) << "!"
117  );
118 
119  //execution should never reach this point, but compilers expect a non-void
120  //function to return something. So we'll create a dummy value to use in a
121  //return statement.
122  //(a better design would not require function bodies for unimplemented
123  //functions like this...)
124  value_type* dummy = NULL;
125  return(*dummy);
126 }
127 
129 {
130  return num_Gf_evals_;
131 }
132 
133 } // end namespace NLPInterfacePack
void initialize(bool test_setup)
Initialize the NLP for its first use.
void unset_quantities()
Call to unset all storage quantities (both in this class and all subclasses).
virtual size_type num_Gf_evals() const
Objective gradient evaluations count.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
const ObjGradInfo obj_grad_info() const
Return objective gradient and zero order information.
NLPObjGrad()
Initialize to no reference set to calculation quanities.
virtual VectorMutable * get_Gf()
Return pointer passed to this->set_Gf().
virtual void unset_quantities()
Call to unset all storage quantities (both in this class and all subclasses).
size_t size_type
virtual bool supports_Gf_prod() const
Determine if the objective gradient product is supported or not.
virtual void imp_calc_Gf(const Vector &x, bool newx, const ObjGradInfo &obj_grad_info) const =0
Overridden to compute f(x) and perhaps c(x) (if multiple calculaiton = true).
virtual VectorMutable & Gf()
Returns non-const *this->get_Gf().
virtual void initialize(bool test_setup=false)
Initialize the NLP before it is used.
virtual void set_Gf(VectorMutable *Gf)
Set a pointer to a vector to be updated when this->calc_Gf() is called.
virtual void calc_Gf(const Vector &x, bool newx=true) const
Update the vector for Gf at the point x and put it in the stored reference.
virtual bool supports_Gf() const
Determine if the objective gradient is supported or not.
std::string typeName(const T &t)
virtual value_type calc_Gf_prod(const Vector &x, const Vector &d, bool newx=true) const
Calculate the inner product Gf(x)'*d at the point x and put it in the stored reference.