255 virtual void evalModelImpl(
272 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
273 DefaultDerivLinearOpSupport;
275 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
276 DefaultDerivMvAdjointSupport;
278 typedef ModelEvaluatorDefaultBaseTypes::MultiVectorAdjointPair<Scalar>
279 MultiVectorAdjointPair;
295 bool default_W_support_;
302 void lazyInitializeDefaultBase()
const;
304 void assert_l(
const int l)
const;
306 void assert_j(
const int j)
const;
311 static DefaultDerivLinearOpSupport
312 determineDefaultDerivLinearOpSupport(
317 createDefaultLinearOp(
318 const DefaultDerivLinearOpSupport &defaultLinearOpSupport,
324 updateDefaultLinearOpSupport(
326 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
330 getOutArgImplForDefaultLinearOpSupport(
332 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
335 static DefaultDerivMvAdjointSupport
336 determineDefaultDerivMvAdjointSupport(
343 updateDefaultDerivMvAdjointSupport(
345 const DefaultDerivMvAdjointSupport &defaultMvAdjointSupport
359#include "Thyra_ModelEvaluatorHelpers.hpp"
360#include "Thyra_DefaultScaledAdjointLinearOp.hpp"
361#include "Thyra_DetachedMultiVectorView.hpp"
362#include "Teuchos_Assert.hpp"
371template<
class Scalar>
374 lazyInitializeDefaultBase();
375 return prototypeOutArgs_.Np();
379template<
class Scalar>
382 lazyInitializeDefaultBase();
383 return prototypeOutArgs_.Ng();
387template<
class Scalar>
391 lazyInitializeDefaultBase();
392 if (default_W_support_)
393 return this->get_W_factory()->createOp();
398template<
class Scalar>
402 lazyInitializeDefaultBase();
406 const DefaultDerivLinearOpSupport
407 defaultLinearOpSupport = DfDp_default_op_support_[l];
408 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
409 return createDefaultLinearOp(
410 defaultLinearOpSupport,
415 return this->create_DfDp_op_impl(l);
419template<
class Scalar>
423 lazyInitializeDefaultBase();
427 const DefaultDerivLinearOpSupport
428 defaultLinearOpSupport = DgDx_dot_default_op_support_[j];
429 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
430 return createDefaultLinearOp(
431 defaultLinearOpSupport,
432 this->get_g_space(j),
436 return this->create_DgDx_dot_op_impl(j);
440template<
class Scalar>
444 lazyInitializeDefaultBase();
448 const DefaultDerivLinearOpSupport
449 defaultLinearOpSupport = DgDx_default_op_support_[j];
450 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
451 return createDefaultLinearOp(
452 defaultLinearOpSupport,
453 this->get_g_space(j),
457 return this->create_DgDx_op_impl(j);
461template<
class Scalar>
465 lazyInitializeDefaultBase();
470 const DefaultDerivLinearOpSupport
471 defaultLinearOpSupport = DgDp_default_op_support_[j][l];
472 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
473 return createDefaultLinearOp(
474 defaultLinearOpSupport,
475 this->get_g_space(j),
479 return this->create_DgDp_op_impl(j,l);
483template<
class Scalar>
487 lazyInitializeDefaultBase();
488 return prototypeOutArgs_;
492template<
class Scalar>
499 using Teuchos::outArg;
502 lazyInitializeDefaultBase();
504 const int l_Np = outArgs.
Np();
505 const int l_Ng = outArgs.
Ng();
512 assertInArgsEvalObjects(*
this,inArgs);
513 assertOutArgsEvalObjects(*
this,outArgs,&inArgs);
521 MEB::OutArgs<Scalar> outArgsImpl = this->createOutArgsImpl();
526 outArgsImpl.setArgs(outArgs,
true);
529 if (outArgsImpl.supports(MEB::OUT_ARG_f)) {
530 for (
int l = 0; l < l_Np; ++l ) {
531 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
532 DfDp_default_op_support_[l];
533 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
534 outArgsImpl.set_DfDp( l,
535 getOutArgImplForDefaultLinearOpSupport(
536 outArgs.
get_DfDp(l), defaultLinearOpSupport
547 for (
int j = 0; j < l_Ng; ++j ) {
548 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
549 DgDx_dot_default_op_support_[j];
550 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
551 outArgsImpl.set_DgDx_dot( j,
552 getOutArgImplForDefaultLinearOpSupport(
563 for (
int j = 0; j < l_Ng; ++j ) {
564 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
565 DgDx_default_op_support_[j];
566 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
567 outArgsImpl.set_DgDx( j,
568 getOutArgImplForDefaultLinearOpSupport(
569 outArgs.
get_DgDx(j), defaultLinearOpSupport
579 for (
int j = 0; j < l_Ng; ++j ) {
581 DgDp_default_op_support_[j];
583 DgDp_default_mv_support_[j];
584 for (
int l = 0; l < l_Np; ++l ) {
585 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
586 DgDp_default_op_support_j[l];
587 const DefaultDerivMvAdjointSupport defaultMvAdjointSupport =
588 DgDp_default_mv_support_j[l];
589 MEB::Derivative<Scalar> DgDp_j_l;
590 if (!outArgs.
supports(MEB::OUT_ARG_DgDp,j,l).none())
593 defaultLinearOpSupport.provideDefaultLinearOp()
594 && !is_null(DgDp_j_l.getLinearOp())
597 outArgsImpl.set_DgDp( j, l,
598 getOutArgImplForDefaultLinearOpSupport(
599 DgDp_j_l, defaultLinearOpSupport
604 defaultMvAdjointSupport.provideDefaultAdjoint()
605 && !is_null(DgDp_j_l.getMultiVector())
609 DgDp_j_l.getMultiVector();
611 defaultMvAdjointSupport.mvAdjointCopyOrientation()
613 DgDp_j_l.getMultiVectorOrientation()
620 createMembers(DgDp_j_l_mv->domain(), DgDp_j_l_mv->range()->dim());
621 outArgsImpl.set_DgDp( j, l,
622 MEB::Derivative<Scalar>(
624 getOtherDerivativeMultiVectorOrientation(
625 defaultMvAdjointSupport.mvAdjointCopyOrientation()
632 MultiVectorAdjointPair(DgDp_j_l_mv, DgDp_j_l_mv_adj)
649 if ( default_W_support_ && !is_null(W=outArgs.
get_W()) ) {
651 W_factory = this->get_W_factory();
654 uninitializeOp<Scalar>(*W_factory, W.
ptr(), outArg(W_op_const));
656 if (!is_null(W_op_const)) {
666 W_op = this->create_W_op();
668 outArgsImpl.set_W_op(W_op);
677 this->evalModelImpl( inArgs, outArgsImpl );
684 const int numMvAdjointCopies = DgDp_temp_adjoint_copies.
size();
685 for (
int adj_copy_i = 0; adj_copy_i < numMvAdjointCopies; ++adj_copy_i ) {
686 const MultiVectorAdjointPair adjPair =
687 DgDp_temp_adjoint_copies[adj_copy_i];
688 doExplicitMultiVectorAdjoint( *adjPair.mvImplAdjoint, &*adjPair.mvOuter );
694 if ( default_W_support_ && !is_null(W=outArgs.
get_W()) ) {
696 W_factory = this->get_W_factory();
697 W_factory->setOStream(this->getOStream());
698 W_factory->setVerbLevel(this->getVerbLevel());
699 initializeOp<Scalar>(*W_factory, outArgsImpl.get_W_op().
getConst(), W.
ptr());
711template<
class Scalar>
718 isInitialized_ =
false;
719 default_W_support_ =
false;
725 const MEB::InArgs<Scalar> inArgs = this->createInArgs();
726 const MEB::OutArgs<Scalar> outArgsImpl = this->createOutArgsImpl();
733 assertInArgsOutArgsSetup( this->description(), inArgs, outArgsImpl );
740 const int l_Ng = outArgsImpl.Ng();
741 const int l_Np = outArgsImpl.Np();
744 MEB::OutArgsSetup<Scalar> outArgs;
745 outArgs.setModelEvalDescription(this->description());
746 outArgs.set_Np_Ng(l_Np,l_Ng);
747 outArgs.setSupports(outArgsImpl);
750 DfDp_default_op_support_.clear();
751 if (outArgs.supports(MEB::OUT_ARG_f)) {
752 for (
int l = 0; l < l_Np; ++l ) {
753 const MEB::DerivativeSupport DfDp_l_impl_support =
754 outArgsImpl.supports(MEB::OUT_ARG_DfDp,l);
755 const DefaultDerivLinearOpSupport DfDp_l_op_support =
756 determineDefaultDerivLinearOpSupport(DfDp_l_impl_support);
757 DfDp_default_op_support_.push_back(DfDp_l_op_support);
759 MEB::OUT_ARG_DfDp, l,
760 updateDefaultLinearOpSupport(
761 DfDp_l_impl_support, DfDp_l_op_support
768 DgDx_dot_default_op_support_.clear();
769 for (
int j = 0; j < l_Ng; ++j ) {
770 const MEB::DerivativeSupport DgDx_dot_j_impl_support =
771 outArgsImpl.supports(MEB::OUT_ARG_DgDx_dot,j);
772 const DefaultDerivLinearOpSupport DgDx_dot_j_op_support =
773 determineDefaultDerivLinearOpSupport(DgDx_dot_j_impl_support);
774 DgDx_dot_default_op_support_.push_back(DgDx_dot_j_op_support);
776 MEB::OUT_ARG_DgDx_dot, j,
777 updateDefaultLinearOpSupport(
778 DgDx_dot_j_impl_support, DgDx_dot_j_op_support
784 DgDx_default_op_support_.clear();
785 for (
int j = 0; j < l_Ng; ++j ) {
786 const MEB::DerivativeSupport DgDx_j_impl_support =
787 outArgsImpl.supports(MEB::OUT_ARG_DgDx,j);
788 const DefaultDerivLinearOpSupport DgDx_j_op_support =
789 determineDefaultDerivLinearOpSupport(DgDx_j_impl_support);
790 DgDx_default_op_support_.push_back(DgDx_j_op_support);
792 MEB::OUT_ARG_DgDx, j,
793 updateDefaultLinearOpSupport(
794 DgDx_j_impl_support, DgDx_j_op_support
800 DgDp_default_op_support_.clear();
801 DgDp_default_mv_support_.clear();
802 for (
int j = 0; j < l_Ng; ++j ) {
805 for (
int l = 0; l < l_Np; ++l ) {
806 const MEB::DerivativeSupport DgDp_j_l_impl_support =
807 outArgsImpl.supports(MEB::OUT_ARG_DgDp,j,l);
809 const DefaultDerivLinearOpSupport DgDp_j_l_op_support =
810 determineDefaultDerivLinearOpSupport(DgDp_j_l_impl_support);
811 DgDp_default_op_support_[j].push_back(DgDp_j_l_op_support);
813 MEB::OUT_ARG_DgDp, j, l,
814 updateDefaultLinearOpSupport(
815 DgDp_j_l_impl_support, DgDp_j_l_op_support
819 const DefaultDerivMvAdjointSupport DgDp_j_l_mv_support =
820 determineDefaultDerivMvAdjointSupport(
821 DgDp_j_l_impl_support, *this->get_g_space(j), *this->get_p_space(l)
823 DgDp_default_mv_support_[j].push_back(DgDp_j_l_mv_support);
825 MEB::OUT_ARG_DgDp, j, l,
826 updateDefaultDerivMvAdjointSupport(
827 outArgs.supports(MEB::OUT_ARG_DgDp, j, l),
837 default_W_support_ =
false;
838 if ( outArgsImpl.supports(MEB::OUT_ARG_W_op) && !is_null(this->get_W_factory())
839 && !outArgsImpl.supports(MEB::OUT_ARG_W) )
841 default_W_support_ =
true;
842 outArgs.setSupports(MEB::OUT_ARG_W);
843 outArgs.set_W_properties(outArgsImpl.get_W_properties());
850 prototypeOutArgs_ = outArgs;
851 isInitialized_ =
true;
855template<
class Scalar>
858 isInitialized_ =
false;
864template<
class Scalar>
869 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
871 outArgs.supports(MEB::OUT_ARG_DfDp,l).supports(MEB::DERIV_LINEAR_OP),
873 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
874 " supports the LinearOpBase form of DfDp("<<l<<
") (as determined from its"
875 " OutArgs object created by createOutArgsImpl())"
876 " but this function create_DfDp_op_impl(...) has not been overridden"
877 " to create such an object!"
883template<
class Scalar>
884RCP<LinearOpBase<Scalar> >
885ModelEvaluatorDefaultBase<Scalar>::create_DgDx_dot_op_impl(
int j)
const
887 typedef ModelEvaluatorBase MEB;
888 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
890 outArgs.supports(MEB::OUT_ARG_DgDx_dot,j).supports(MEB::DERIV_LINEAR_OP),
892 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
893 " supports the LinearOpBase form of DgDx_dot("<<j<<
") (as determined from"
894 " its OutArgs object created by createOutArgsImpl())"
895 " but this function create_DgDx_dot_op_impl(...) has not been overridden"
896 " to create such an object!"
902template<
class Scalar>
903RCP<LinearOpBase<Scalar> >
904ModelEvaluatorDefaultBase<Scalar>::create_DgDx_op_impl(
int j)
const
906 typedef ModelEvaluatorBase MEB;
907 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
909 outArgs.supports(MEB::OUT_ARG_DgDx,j).supports(MEB::DERIV_LINEAR_OP),
911 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
912 " supports the LinearOpBase form of DgDx("<<j<<
") (as determined from"
913 " its OutArgs object created by createOutArgsImpl())"
914 " but this function create_DgDx_op_impl(...) has not been overridden"
915 " to create such an object!"
921template<
class Scalar>
922RCP<LinearOpBase<Scalar> >
923ModelEvaluatorDefaultBase<Scalar>::create_DgDp_op_impl(
int j,
int l)
const
925 typedef ModelEvaluatorBase MEB;
926 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
928 outArgs.supports(MEB::OUT_ARG_DgDp,j,l).supports(MEB::DERIV_LINEAR_OP),
930 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
931 " supports the LinearOpBase form of DgDp("<<j<<
","<<l<<
")"
932 " (as determined from its OutArgs object created by createOutArgsImpl())"
933 " but this function create_DgDp_op_impl(...) has not been overridden"
934 " to create such an object!"
940template<
class Scalar>
941RCP<const VectorSpaceBase<Scalar> >
944 return this->get_f_space();
947template<
class Scalar>
951 return this->get_g_space(j);
954#ifdef Thyra_BUILD_HESSIAN_SUPPORT
956template<
class Scalar>
963template<
class Scalar>
964RCP<LinearOpBase<Scalar> >
965ModelEvaluatorDefaultBase<Scalar>::create_hess_f_xp(
int l)
const
970template<
class Scalar>
971RCP<LinearOpBase<Scalar> >
972ModelEvaluatorDefaultBase<Scalar>::create_hess_f_pp(
int l1,
int l2 )
const
977template<
class Scalar>
978RCP<LinearOpBase<Scalar> >
979ModelEvaluatorDefaultBase<Scalar>::create_hess_g_xx(
int j)
const
984template<
class Scalar>
985RCP<LinearOpBase<Scalar> >
986ModelEvaluatorDefaultBase<Scalar>::create_hess_g_xp(
int j,
int l )
const
991template<
class Scalar>
992RCP<LinearOpBase<Scalar> >
993ModelEvaluatorDefaultBase<Scalar>::create_hess_g_pp(
int j,
int l1,
int l2 )
const
1003template<
class Scalar>
1005 :isInitialized_(false), default_W_support_(false)
1012template<
class Scalar>
1015 if (!isInitialized_)
1020template<
class Scalar>
1021void ModelEvaluatorDefaultBase<Scalar>::assert_l(
const int l)
const
1027template<
class Scalar>
1028void ModelEvaluatorDefaultBase<Scalar>::assert_j(
const int j)
const
1037template<
class Scalar>
1038ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
1039ModelEvaluatorDefaultBase<Scalar>::determineDefaultDerivLinearOpSupport(
1040 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl
1043 typedef ModelEvaluatorBase MEB;
1046 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1048 derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW)
1051 !derivSupportImpl.supports(MEB::DERIV_LINEAR_OP)
1054 return DefaultDerivLinearOpSupport(
1055 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1056 ? MEB::DERIV_MV_BY_COL
1057 : MEB::DERIV_TRANS_MV_BY_ROW
1060 return DefaultDerivLinearOpSupport();
1064template<
class Scalar>
1065RCP<LinearOpBase<Scalar> >
1066ModelEvaluatorDefaultBase<Scalar>::createDefaultLinearOp(
1067 const DefaultDerivLinearOpSupport &defaultLinearOpSupport,
1068 const RCP<
const VectorSpaceBase<Scalar> > &fnc_space,
1069 const RCP<
const VectorSpaceBase<Scalar> > &var_space
1072 using Teuchos::rcp_implicit_cast;
1073 typedef LinearOpBase<Scalar> LOB;
1074 typedef ModelEvaluatorBase MEB;
1075 switch(defaultLinearOpSupport.mvImplOrientation()) {
1076 case MEB::DERIV_MV_BY_COL:
1078 return createMembers(fnc_space, var_space->dim());
1079 case MEB::DERIV_TRANS_MV_BY_ROW:
1081 return nonconstAdjoint<Scalar>(
1082 rcp_implicit_cast<LOB>(createMembers(var_space, fnc_space->dim()))
1093template<
class Scalar>
1094ModelEvaluatorBase::DerivativeSupport
1095ModelEvaluatorDefaultBase<Scalar>::updateDefaultLinearOpSupport(
1096 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1097 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
1100 typedef ModelEvaluatorBase MEB;
1101 MEB::DerivativeSupport derivSupport = derivSupportImpl;
1102 if (defaultLinearOpSupport.provideDefaultLinearOp())
1103 derivSupport.plus(MEB::DERIV_LINEAR_OP);
1104 return derivSupport;
1108template<
class Scalar>
1109ModelEvaluatorBase::Derivative<Scalar>
1110ModelEvaluatorDefaultBase<Scalar>::getOutArgImplForDefaultLinearOpSupport(
1111 const ModelEvaluatorBase::Derivative<Scalar> &deriv,
1112 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
1116 using Teuchos::rcp_dynamic_cast;
1117 typedef ModelEvaluatorBase MEB;
1118 typedef MultiVectorBase<Scalar> MVB;
1119 typedef ScaledAdjointLinearOpBase<Scalar> SALOB;
1124 if (
is_null(deriv.getLinearOp()))
1129 switch(defaultLinearOpSupport.mvImplOrientation()) {
1130 case MEB::DERIV_MV_BY_COL: {
1131 return MEB::Derivative<Scalar>(
1132 rcp_dynamic_cast<MVB>(deriv.getLinearOp(),
true),
1133 MEB::DERIV_MV_BY_COL
1136 case MEB::DERIV_TRANS_MV_BY_ROW: {
1137 return MEB::Derivative<Scalar>(
1138 rcp_dynamic_cast<MVB>(
1139 rcp_dynamic_cast<SALOB>(deriv.getLinearOp(),
true)->getNonconstOrigOp()
1141 MEB::DERIV_TRANS_MV_BY_ROW
1150 return ModelEvaluatorBase::Derivative<Scalar>();
1155template<
class Scalar>
1156ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
1157ModelEvaluatorDefaultBase<Scalar>::determineDefaultDerivMvAdjointSupport(
1158 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1159 const VectorSpaceBase<Scalar> &fnc_space,
1160 const VectorSpaceBase<Scalar> &var_space
1163 typedef ModelEvaluatorBase MEB;
1166 const bool implSupportsMv =
1167 ( derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1168 || derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW) );
1169 const bool implLacksMvOrientSupport =
1170 ( !derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1171 || !derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW) );
1172 const bool bothSpacesHaveInCoreViews =
1173 ( fnc_space.hasInCoreView() && var_space.hasInCoreView() );
1174 if ( implSupportsMv && implLacksMvOrientSupport && bothSpacesHaveInCoreViews ) {
1175 return DefaultDerivMvAdjointSupport(
1176 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1177 ? MEB::DERIV_TRANS_MV_BY_ROW
1178 : MEB::DERIV_MV_BY_COL
1182 return DefaultDerivMvAdjointSupport();
1186template<
class Scalar>
1187ModelEvaluatorBase::DerivativeSupport
1188ModelEvaluatorDefaultBase<Scalar>::updateDefaultDerivMvAdjointSupport(
1189 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1190 const DefaultDerivMvAdjointSupport &defaultMvAdjointSupport
1193 typedef ModelEvaluatorBase MEB;
1194 MEB::DerivativeSupport derivSupport = derivSupportImpl;
1195 if (defaultMvAdjointSupport.provideDefaultAdjoint())
1196 derivSupport.plus(defaultMvAdjointSupport.mvAdjointCopyOrientation());
1197 return derivSupport;