294 const bool printToStream =
true,
295 std::ostream & outStream = std::cout )
const {
301 std::vector<Real> vCheck;
305 ROL::Ptr<std::ostream> pStream;
307 pStream = ROL::makePtrFromRef(outStream);
309 pStream = ROL::makePtrFromRef(bhs);
313 ROL::nullstream oldFormatState, headerFormatState;
314 oldFormatState.copyfmt(*pStream);
316 ROL::Ptr<Vector> v = this->
clone();
317 ROL::Ptr<Vector> vtmp = this->
clone();
318 ROL::Ptr<Vector> xtmp = x.
clone();
319 ROL::Ptr<Vector> ytmp = y.
clone();
321 *pStream <<
"\n" << std::setw(width) << std::left << std::setfill(
'*') <<
"********** Begin verification of linear algebra. " <<
"\n\n";
322 headerFormatState.copyfmt(*pStream);
325 v->set(*
this); xtmp->set(x); ytmp->set(y);
326 v->plus(x); xtmp->plus(*
this); v->axpy(-one, *xtmp); vCheck.push_back(v->norm());
327 *pStream << std::scientific << std::setprecision(12) << std::setfill(
'>');
328 *pStream << std::setw(width) << std::left <<
"Commutativity of addition. Consistency error: " <<
" " << vCheck.back() <<
"\n";
331 v->set(*
this); xtmp->set(x); ytmp->set(y);
332 ytmp->plus(x); v->plus(*ytmp); xtmp->plus(*
this); xtmp->plus(y); v->axpy(-one, *xtmp); vCheck.push_back(v->norm());
333 *pStream << std::setw(width) << std::left <<
"Associativity of addition. Consistency error: " <<
" " << vCheck.back() <<
"\n";
336 v->set(*
this); xtmp->set(x); ytmp->set(y);
337 v->zero(); v->plus(x); v->axpy(-one, x); vCheck.push_back(v->norm());
338 *pStream << std::setw(width) << std::left <<
"Identity element of addition. Consistency error: " <<
" " << vCheck.back() <<
"\n";
341 v->set(*
this); xtmp->set(x); ytmp->set(y);
342 v->scale(-one); v->plus(*
this); vCheck.push_back(v->norm());
343 *pStream << std::setw(width) << std::left <<
"Inverse elements of addition. Consistency error: " <<
" " << vCheck.back() <<
"\n";
346 v->set(*
this); xtmp->set(x); ytmp->set(y);
347 v->scale(one); v->axpy(-one, *
this); vCheck.push_back(v->norm());
348 *pStream << std::setw(width) << std::left <<
"Identity element of scalar multiplication. Consistency error: " <<
" " << vCheck.back() <<
"\n";
351 v->set(*
this); vtmp->set(*
this);
352 v->scale(b); v->scale(a); vtmp->scale(a*b); v->axpy(-one, *vtmp); vCheck.push_back(v->norm());
353 *pStream << std::setw(width) << std::left <<
"Consistency of scalar multiplication with field multiplication. Consistency error: " <<
" " << vCheck.back() <<
"\n";
356 v->set(*
this); vtmp->set(*
this);
357 v->scale(a+b); vtmp->scale(a); vtmp->axpy(b, *
this); v->axpy(-one, *vtmp); vCheck.push_back(v->norm());
358 *pStream << std::setw(width) << std::left <<
"Distributivity of scalar multiplication with respect to field addition. Consistency error: " <<
" " << vCheck.back() <<
"\n";
361 v->set(*
this); xtmp->set(x); ytmp->set(y);
362 v->plus(x); v->scale(a); xtmp->scale(a); xtmp->axpy(a, *
this); v->axpy(-one, *xtmp); vCheck.push_back(v->norm());
363 *pStream << std::setw(width) << std::left <<
"Distributivity of scalar multiplication with respect to vector addition. Consistency error: " <<
" " << vCheck.back() <<
"\n";
366 vCheck.push_back(std::abs(this->
dot(x) - x.
dot(*
this)));
367 *pStream << std::setw(width) << std::left <<
"Commutativity of dot (inner) product over the field of reals. Consistency error: " <<
" " << vCheck.back() <<
"\n";
371 xtmp->plus(y); vCheck.push_back(std::abs(this->
dot(*xtmp) - this->
dot(x) - this->
dot(y))/std::max({
static_cast<Real
>(std::abs(this->
dot(*xtmp))),
static_cast<Real
>(std::abs(this->
dot(x))),
static_cast<Real
>(std::abs(this->
dot(y))), one}));
372 *pStream << std::setw(width) << std::left <<
"Additivity of dot (inner) product. Consistency error: " <<
" " << vCheck.back() <<
"\n";
376 Real vnorm = v->norm();
379 vCheck.push_back(std::abs(v->norm() -
zero));
382 vCheck.push_back(std::abs(v->norm() - one));
384 *pStream << std::setw(width) << std::left <<
"Consistency of scalar multiplication and norm. Consistency error: " <<
" " << vCheck.back() <<
"\n";
388 xtmp = ROL::constPtrCast<Vector>(ROL::makePtrFromRef(this->
dual()));
389 ytmp = ROL::constPtrCast<Vector>(ROL::makePtrFromRef(xtmp->dual()));
390 v->axpy(-one, *ytmp); vCheck.push_back(v->norm());
391 *pStream << std::setw(width) << std::left <<
"Reflexivity. Consistency error: " <<
" " << vCheck.back() <<
"\n";
396 Real vx = v->apply(*xtmp);
397 Real vxd = v->dot(xtmp->dual());
398 Real vdx = xtmp->dot(v->dual());
400 vCheck.push_back(std::max(std::abs(vx-vxd),std::abs(vx-vdx)));
403 vCheck.push_back(std::max(std::abs(vx-vxd),std::abs(vx-vdx))/std::abs(vx));
405 *pStream << std::setw(width) << std::left <<
"Consistency of apply and dual:" <<
" " << vCheck.back() <<
"\n\n";
410 pStream->copyfmt(headerFormatState);
411 *pStream << std::setw(width) << std::left <<
"********** End verification of linear algebra. " <<
"\n\n";
414 pStream->copyfmt(oldFormatState);