56 #include "Teuchos_GlobalMPISession.hpp"
71 for(
int k=0; k<
m_; ++k ) {
73 if( k<
n_ )
y_[k] += x[k]*x[k];
74 if( k>0 )
y_[k] -= 2*x[k-1];
82 RealT& tol )
override {
83 for(
int k=0; k<
m_; ++k ) c[k] = std::cos(
y_[k]);
89 RealT& tol )
override {
90 for(
int k=0; k<
m_; ++k ) {
92 if( k<
n_ ) jv[k] -= 2*v[k]*x[k]*
sin_[k];
93 if( k>0 ) jv[k] += 2*v[k-1]*sin_[k];
100 RealT& tol )
override {
101 for(
int i=0; i<
n_; ++i ) {
102 ajl[i] = 2*(l[i+1]*
sin_[i+1] - l[i]*x[i]*
sin_[i]);
110 RealT& tol )
override {
111 ahlv[0] = -4*
cos_[0]*l[0]*v[0]*x[0]*x[0] - 4*
cos_[1]*l[1]*v[0] + 4*
cos_[1]*l[1]*v[1]*x[1] - 2*l[0]*
sin_[0]*v[0];
112 for(
int i=0; i<
n_-1; ++i) {
113 ahlv[i] = 4*
cos_[i]*l[i]*v[i-1]*x[i] - 4*
cos_[i]*l[i]*v[i]*x[i]*x[i] - 4*
cos_[i+1]*l[i+1]*v[i] + 4*
cos_[i+1]*l[i+1]*v[i+1]*x[i+1] - 2*l[i]*
sin_[i]*v[i];
115 ahlv[n_-1] = 4*
cos_[n_-1]*l[n_-1]*v[n_-2]*x[n_-1] - 4*
cos_[n_-1]*l[n_-1]*v[n_-1]*x[n_-1]*x[n_-1] - 4*
cos_[
n_]*l[
n_]*v[n_-1] - 2*l[n_-1]*
sin_[n_-1]*v[n_-1];
131 int iter )
override {
132 for(
int i=0; i<
m_; ++i)
133 d_[i] = -x[i] + 2*x[i+1] - x[i+2];
138 RealT& tol )
override {
139 for(
int i=0; i<
m_; ++i)
146 RealT& tol )
override {
147 for(
int i=0; i<
m_; ++i)
148 jv[i] = 2*
d_[i]*(-v[i]+2*v[i+1]-v[i+2]);
154 RealT& tol )
override {
155 for(
int i=0; i<
n_; ++i) {
157 for(
int j=0; j<
m_; ++j ) {
158 if( j == i-1 ) ajl[i] += 4*
d_[j]*l[j];
159 else if( std::abs(i-j-1) == 1) ajl[i] -= 2*
d_[j]*l[j];
168 RealT& tol )
override {
169 for(
int i=0; i<
m_; ++i)
170 dv_[i] = -v[i] + 2*v[i+1] - v[i+2];
171 for(
int i=0; i<
n_; ++i) {
173 for(
int j=0; j<
m_; ++j ) {
174 if( j == i-1 ) ahlv[i] += 4*
dv_[j]*l[j];
175 else if( std::abs(i-j-1) == 1) ahlv[i] -= 2*
dv_[j]*l[j];
189 int main(
int argc,
char *argv[]) {
191 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
194 int iprint = argc - 1;
195 ROL::Ptr<std::ostream> outStream;
198 outStream = ROL::makePtrFromRef(std::cout);
200 outStream = ROL::makePtrFromRef(bhs);
204 oldFormatState.copyfmt(std::cout);
215 int ci_dim = x_dim + 1;
216 int co_dim = x_dim - 1;
218 auto inner_con = ROL::makePtr<InnerConstraint>(x_dim);
219 auto outer_con = ROL::makePtr<OuterConstraint>(ci_dim);
221 auto x = ROL::makePtr<ROL::StdVector<RealT>>(x_dim);
222 auto v = ROL::makePtr<ROL::StdVector<RealT>>(x_dim);
223 auto y = ROL::makePtr<ROL::StdVector<RealT>>(ci_dim);
224 auto w = ROL::makePtr<ROL::StdVector<RealT>>(ci_dim);
225 auto ci = ROL::makePtr<ROL::StdVector<RealT>>(ci_dim);
226 auto co = ROL::makePtr<ROL::StdVector<RealT>>(co_dim);
228 auto cr_con = ROL::makePtr<ROL::ChainRuleConstraint<RealT>>(outer_con,inner_con,*x,*ci);
237 *outStream <<
"\n\nInner Constraint Check:\n\n";
239 inner_con->checkApplyJacobian(*x,*v,*ci,
true,*outStream,7,4);
240 inner_con->checkAdjointConsistencyJacobian(*ci,*v,*x,
true,*outStream);
241 inner_con->checkApplyAdjointHessian(*x,*ci,*v,*x,
true,*outStream,7,4);
243 *outStream <<
"\n\nOuter Constraint Check:\n\n";
244 outer_con->checkApplyJacobian(*y,*w,*co,
true,*outStream,7,4);
245 outer_con->checkAdjointConsistencyJacobian(*co,*w,*y,
true,*outStream);
246 outer_con->checkApplyAdjointHessian(*y,*co,*w,*y,
true,*outStream,7,4);
248 *outStream <<
"\n\nChain Rule Constraint Check:\n\n";
249 cr_con->checkApplyJacobian(*x,*v,*co,
true,*outStream,7,4);
250 cr_con->checkAdjointConsistencyJacobian(*co,*v,*x,
true,*outStream);
251 cr_con->checkApplyAdjointHessian(*x,*co,*v,*x,
true,*outStream,7,4);
254 catch (std::logic_error& err) {
255 *outStream << err.what() <<
"\n";
260 std::cout <<
"End Result: TEST FAILED\n";
262 std::cout <<
"End Result: TEST PASSED\n";
void applyAdjointJacobian(VectorT &ajl, const VectorT &l, const VectorT &x, RealT &tol) override
void applyJacobian(VectorT &jv, const VectorT &v, const VectorT &x, RealT &tol) override
void applyAdjointHessian(VectorT &ahlv, const VectorT &l, const VectorT &v, const VectorT &x, RealT &tol) override
void update(const VectorT &x, ROL::UpdateType type, int iter) override
void RandomizeVector(Vector< Real > &x, const Real &lower=0.0, const Real &upper=1.0)
Fill a ROL::Vector with uniformly-distributed random numbers in the interval [lower,upper].
Defines the equality constraint operator interface for StdVectors.
Defines a no-output stream class ROL::NullStream and a function makeStreamPtr which either wraps a re...
void value(VectorT &c, const VectorT &x, RealT &tol) override
std::vector< RealT > VectorT
void value(VectorT &c, const VectorT &x, RealT &tol) override
void update(const VectorT &x, ROL::UpdateType type, int iter) override
void applyJacobian(VectorT &jv, const VectorT &v, const VectorT &x, RealT &tol) override
void applyAdjointHessian(VectorT &ahlv, const VectorT &l, const VectorT &v, const VectorT &x, RealT &tol) override
void applyAdjointJacobian(VectorT &ajl, const VectorT &l, const VectorT &x, RealT &tol) override
basic_nullstream< char, char_traits< char >> nullstream
int main(int argc, char *argv[])