Thyra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_ModelEvaluatorBase_decl.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) 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 (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef THYRA_MODEL_EVALUATOR_BASE_DECL_HPP
43 #define THYRA_MODEL_EVALUATOR_BASE_DECL_HPP
44 
45 
46 #include "Thyra_LinearOpWithSolveBase.hpp"
47 #include "Teuchos_Describable.hpp"
48 #include "Teuchos_any.hpp"
49 #include "Teuchos_Assert.hpp"
50 
51 #ifdef HAVE_THYRA_ME_POLYNOMIAL
52 # include "Teuchos_Polynomial.hpp"
53 #endif
54 
55 namespace Stokhos {
56  class ProductEpetraVector;
57  class ProductEpetraMultiVector;
58  class ProductEpetraOperator;
59 }
60 
61 namespace Thyra {
62 
63 
84  : virtual public Teuchos::Describable,
85  virtual public Teuchos::VerboseObject<ModelEvaluatorBase>
86 {
87 public:
88 
91 
107  };
109  static const int NUM_E_IN_ARGS_MEMBERS=13;
110 
114  };
115 
158  template<class Scalar>
159  class InArgs : public Teuchos::Describable {
160  public:
164  InArgs();
167  int Np() const;
170  int Ng() const;
172  bool supports(EInArgsMembers arg) const;
174  void set_x_dot_dot( const RCP<const VectorBase<Scalar> > &x_dot_dot );
178  void set_x_dot( const RCP<const VectorBase<Scalar> > &x_dot );
182  void set_x( const RCP<const VectorBase<Scalar> > &x );
185 
187  void set_x_direction( const RCP<const MultiVectorBase<Scalar> > &x_direction );
189  void set_p_direction( int l, const RCP<const MultiVectorBase<Scalar> > &p_direction_l );
194 
196  void set_f_multiplier( const RCP<const VectorBase<Scalar> > &f_multiplier );
200  void set_g_multiplier( int j, const RCP<const VectorBase<Scalar> > &g_multiplier );
203 
205  template<typename ObjectType>
206  bool supports() const;
208  template<typename ObjectType>
209  void set(const RCP<const ObjectType>& uo);
211  template<typename ObjectType>
212  RCP<const ObjectType> get() const;
213 
214 #ifdef HAVE_THYRA_ME_POLYNOMIAL
215 
216  void set_x_poly(
217  const RCP<const Teuchos::Polynomial< VectorBase<Scalar> > > &x_poly );
221  void set_x_dot_poly(
222  const RCP<const Teuchos::Polynomial< VectorBase<Scalar> > > &x_dot_poly );
224  RCP<const Teuchos::Polynomial< VectorBase<Scalar> > > get_x_dot_poly() const;
225 #endif // HAVE_THYRA_ME_POLYNOMIAL
226 
227  void set_p( int l, const RCP<const VectorBase<Scalar> > &p_l );
229  RCP<const VectorBase<Scalar> > get_p(int l) const;
230 
231 
236 
241 
242  void set_p_mp( int l, const RCP<const Stokhos::ProductEpetraVector > &p_mp_l );
243  RCP<const Stokhos::ProductEpetraVector > get_p_mp(int l) const;
245  bool supports(EInArgs_p_mp arg, int l) const;
246 
247 
249  void set_t( ScalarMag t );
251  ScalarMag get_t() const;
253  void set_alpha( Scalar alpha );
255  Scalar get_alpha() const;
257  void set_beta( Scalar beta );
259  Scalar get_beta() const;
261  void set_W_x_dot_dot_coeff( Scalar W_x_dot_dot_coeff );
263  Scalar get_W_x_dot_dot_coeff() const;
265  void set_step_size( Scalar step_size);
267  Scalar get_step_size() const;
269  void set_stage_number( Scalar stage_number);
271  Scalar get_stage_number() const;
274  void setArgs(
275  const InArgs<Scalar>& inArgs, bool ignoreUnsupported = false,
276  bool cloneObjects = false
277  );
279  void assertSameSupport( const InArgs<Scalar> &inArgs ) const;
281  std::string modelEvalDescription() const;
283  std::string description() const;
286  void describe(
287  Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel
288  ) const;
289  protected:
291  void _setModelEvalDescription( const std::string &modelEvalDescription );
293  void _set_Np_Ng(int Np, int Ng);
295  void _setSupports( EInArgsMembers arg, bool supports );
297  void _setSupports( EInArgs_p_mp arg, int l, bool supports );
299  void _setSupports( const InArgs<Scalar>& inputInArgs, const int Np );
301  template<typename ObjectType>
302  void _setSupports( const bool supports );
305  private:
306  // types
309  // data
310  std::string modelEvalDescription_;
311  RCP<const VectorBase<Scalar> > x_dot_dot_;
314  RCP<const MultiVectorBase<Scalar> > x_direction_;
317 
318  RCP<const VectorBase<Scalar> > f_multiplier_;
319  p_t g_multiplier_;
321 #ifdef HAVE_THYRA_ME_POLYNOMIAL
324 #endif // HAVE_THYRA_ME_POLYNOMIAL
325  p_t p_;
326  p_direction_t p_direction_;
327  ScalarMag t_;
328  Scalar alpha_;
329  Scalar beta_;
330  Scalar W_x_dot_dot_coeff_;
331  Scalar step_size_;
332  Scalar stage_number_;
333  bool supports_[NUM_E_IN_ARGS_MEMBERS];
334  Teuchos::Array<bool> supports_p_mp_; //Np
335  // functions
336  void assert_supports(EInArgsMembers arg) const;
337  void assert_supports(EInArgs_p_mp arg, int l) const;
338  void assert_l(int l) const;
339  void assert_j(int j) const;
340 
341  std::map<std::string,Teuchos::any> extended_inargs_;
342  };
343 
345  enum EEvalType {
346  EVAL_TYPE_EXACT = 0,
349  };
350 
357  template<class ObjType>
358  class Evaluation : public RCP<ObjType> {
359  public:
362  : evalType_(EVAL_TYPE_EXACT) {}
364  Evaluation() : evalType_(EVAL_TYPE_EXACT) {}
366  Evaluation( const RCP<ObjType> &obj )
367  : RCP<ObjType>(obj), evalType_(EVAL_TYPE_EXACT) {}
369  Evaluation( const RCP<ObjType> &obj, EEvalType evalType )
370  : RCP<ObjType>(obj), evalType_(evalType) {}
372  EEvalType getType() const { return evalType_; }
374  void reset( const RCP<ObjType> &obj, EEvalType evalType )
375  { this->operator=(obj); evalType_ = evalType; }
376  private:
377  EEvalType evalType_;
378  };
379 
386  };
387 
391  };
392 
396  public:
399  :supportsLinearOp_(false), supportsMVByCol_(false), supportsTransMVByRow_(false)
400  {}
403  :supportsLinearOp_(true), supportsMVByCol_(false), supportsTransMVByRow_(false)
404  {}
407  :supportsLinearOp_(false), supportsMVByCol_(mvOrientation==DERIV_MV_BY_COL)
408  ,supportsTransMVByRow_(mvOrientation==DERIV_TRANS_MV_BY_ROW)
409  {}
412  { supportsLinearOp_ = true; return *this; }
415  {
416  switch(mvOrientation) {
417  case DERIV_MV_BY_COL: supportsMVByCol_ = true; break;
418  case DERIV_TRANS_MV_BY_ROW: supportsTransMVByRow_ = true; break;
419  default: TEUCHOS_TEST_FOR_EXCEPT(true);
420  }
421  return *this;
422  }
424  bool none() const
425  { return ( !supportsLinearOp_ && !supportsMVByCol_ && !supportsTransMVByRow_ ); }
428  { return supportsLinearOp_; }
430  bool supports(EDerivativeMultiVectorOrientation mvOrientation) const
431  {
432  switch(mvOrientation) {
433  case DERIV_MV_BY_COL: return supportsMVByCol_;
434  case DERIV_TRANS_MV_BY_ROW: return supportsTransMVByRow_;
435  default: TEUCHOS_TEST_FOR_EXCEPT(true);
436  }
438  }
440  bool isSameSupport(const DerivativeSupport &derivSupport) const
441  {
442  return (
443  supportsLinearOp_ == derivSupport.supportsLinearOp_
444  && supportsMVByCol_ == derivSupport.supportsMVByCol_
445  && supportsTransMVByRow_ == derivSupport.supportsTransMVByRow_
446  );
447  }
449  std::string description() const;
450  private:
451  bool supportsLinearOp_;
452  bool supportsMVByCol_;
453  bool supportsTransMVByRow_;
454  public:
455  };
456 
462  };
463 
465  enum ERankStatus {
469  };
470 
484  {}
487  EDerivativeLinearity in_linearity, ERankStatus in_rank,
488  bool in_supportsAdjoint
489  )
490  :linearity(in_linearity),rank(in_rank),
491  supportsAdjoint(in_supportsAdjoint)
492  {}
493  };
494 
498  template<class Scalar>
500  public:
503  :orientation_(DERIV_MV_BY_COL)
504  {}
507  const RCP<MultiVectorBase<Scalar> > &mv
509  ) : mv_(mv.assert_not_null()), orientation_(orientation) {}
512  { orientation_ = orientation; };
515  { mv_.assert_not_null(); return *this; }
518  { return mv_; }
521  { return orientation_; }
523  std::string description() const;
525  void describe(
526  Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel
527  ) const;
528  private:
531  };
532 
536  template<class Scalar>
537  class Derivative {
538  public:
543  : lo_(lo.assert_not_null()) {}
546  const RCP<MultiVectorBase<Scalar> > &mv,
548  ) : dmv_(mv,orientation) {}
551  : dmv_(dmv) {}
553  bool isEmpty() const
554  { return ( lo_.get()==NULL && dmv_.getMultiVector().get()==NULL ); }
557  { dmv_.assert_not_null(); lo_.assert_not_null(); return *this; }
560  { return lo_; }
563  { return dmv_.getMultiVector(); }
566  { return dmv_.getOrientation(); }
569  { return dmv_; }
573  bool isSupportedBy( const DerivativeSupport &derivSupport ) const
574  {
575  // If there is not derivative support then we will return false!
576  if (derivSupport.none())
577  return false;
578  if (!is_null(getMultiVector())) {
579  return derivSupport.supports(getMultiVectorOrientation());
580  }
581  else if(!is_null(getLinearOp())) {
582  return derivSupport.supports(DERIV_LINEAR_OP);
583  }
584  // If nothing is set then of course we support that!
585  return true;
586  }
588  std::string description() const;
590  void describe(
591  Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel
592  ) const;
593  private:
596  };
597 
602  public:
605  :orientation_(DERIV_MV_BY_COL)
606  {}
611  ,const Teuchos::Array<int> &paramIndexes = Teuchos::Array<int>()
612  ) : mv_(mv.assert_not_null()), orientation_(orientation), paramIndexes_(paramIndexes) {}
615  { orientation_ = orientation; };
618  { mv_.assert_not_null(); return *this; }
621  { return mv_; }
624  { return orientation_; }
627  { return paramIndexes_; }
629  std::string description() const {return "\n";}
631  void describe(
632  Teuchos::FancyOStream &/* out */, const Teuchos::EVerbosityLevel /* verbLevel */
633  ) const {}
634  private:
637  Teuchos::Array<int> paramIndexes_;
638  };
639 
643  class MPDerivative {
644  public:
649  : lo_(lo.assert_not_null()) {}
654  ) : dmv_(mv,orientation) {}
657  : dmv_(dmv) {}
659  bool isEmpty() const
660  { return ( lo_.get()==NULL && dmv_.getMultiVector().get()==NULL ); }
663  { dmv_.assert_not_null(); lo_.assert_not_null(); return *this; }
666  { return lo_; }
669  { return dmv_.getMultiVector(); }
672  { return dmv_.getOrientation(); }
675  { return dmv_; }
679  bool isSupportedBy( const DerivativeSupport &derivSupport ) const
680  {
681  // If there is not derivative support then we will return false!
682  if (derivSupport.none())
683  return false;
684  if (!is_null(getMultiVector())) {
685  return derivSupport.supports(getMultiVectorOrientation());
686  }
687  else if(!is_null(getLinearOp())) {
688  return derivSupport.supports(DERIV_LINEAR_OP);
689  }
690  // If nothing is set then of course we support that!
691  return true;
692  }
694  std::string description() const {return "\n";}
696  void describe(
697  Teuchos::FancyOStream &/* out */, const Teuchos::EVerbosityLevel /* verbLevel */
698  ) const {}
699  private:
702  };
703 
713  };
715  static const int NUM_E_OUT_ARGS_MEMBERS=7;
716 
720  };
721 
725  };
726 
730  };
731 
735  };
736 
737 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
738 
739  enum EOutArgs_hess_vec_prod_f_xx {
740  OUT_ARG_hess_vec_prod_f_xx
741  };
742 
744  enum EOutArgs_hess_vec_prod_f_xp {
745  OUT_ARG_hess_vec_prod_f_xp
746  };
747 
749  enum EOutArgs_hess_vec_prod_f_px {
750  OUT_ARG_hess_vec_prod_f_px
751  };
752 
754  enum EOutArgs_hess_vec_prod_f_pp {
755  OUT_ARG_hess_vec_prod_f_pp
756  };
757 
759  enum EOutArgs_hess_vec_prod_g_xx {
760  OUT_ARG_hess_vec_prod_g_xx
761  };
762 
764  enum EOutArgs_hess_vec_prod_g_xp {
765  OUT_ARG_hess_vec_prod_g_xp
766  };
767 
769  enum EOutArgs_hess_vec_prod_g_px {
770  OUT_ARG_hess_vec_prod_g_px
771  };
772 
774  enum EOutArgs_hess_vec_prod_g_pp {
775  OUT_ARG_hess_vec_prod_g_pp
776  };
777 
779  enum EOutArgs_hess_f_xx {
780  OUT_ARG_hess_f_xx
781  };
782 
784  enum EOutArgs_hess_f_xp {
785  OUT_ARG_hess_f_xp
786  };
787 
789  enum EOutArgs_hess_f_pp {
790  OUT_ARG_hess_f_pp
791  };
792 
794  enum EOutArgs_hess_g_xx {
795  OUT_ARG_hess_g_xx
796  };
797 
799  enum EOutArgs_hess_g_xp {
800  OUT_ARG_hess_g_xp
801  };
802 
804  enum EOutArgs_hess_g_pp {
805  OUT_ARG_hess_g_pp
806  };
807 
809  enum EOutArgs_H_xx {
810  OUT_ARG_H_xx
811  };
812 
814  enum EOutArgs_H_xp {
815  OUT_ARG_H_xp
816  };
817 
819  enum EOutArgs_H_pp {
820  OUT_ARG_H_pp
821  };
822 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
823 
827  };
828 
832  };
833 
837  };
838 
842  };
843 
847  };
848 
901  template<class Scalar>
902  class OutArgs : public Teuchos::Describable {
903  public:
905  OutArgs();
908  int Np() const;
911  int Ng() const;
913  bool supports(EOutArgsMembers arg) const;
916  const DerivativeSupport& supports(EOutArgsDfDp arg, int l) const;
919  const DerivativeSupport& supports(EOutArgsDgDx_dot arg, int j) const;
922  const DerivativeSupport& supports(EOutArgsDgDx arg, int j) const;
925  const DerivativeSupport& supports(EOutArgsDgDp arg, int j, int l) const;
926 
927 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
928 
929  bool supports(EOutArgs_hess_vec_prod_f_xx arg) const;
932  bool supports(EOutArgs_hess_vec_prod_f_xp arg, int l) const;
935  bool supports(EOutArgs_hess_vec_prod_f_px arg, int l) const;
938  bool supports(EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2) const;
941  bool supports(EOutArgs_hess_vec_prod_g_xx arg, int j) const;
944  bool supports(EOutArgs_hess_vec_prod_g_xp arg, int j, int l) const;
947  bool supports(EOutArgs_hess_vec_prod_g_px arg, int j, int l) const;
950  bool supports(EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2) const;
952  bool supports(EOutArgs_hess_f_xx arg) const;
955  bool supports(EOutArgs_hess_f_xp arg, int l) const;
958  bool supports(EOutArgs_hess_f_pp arg, int l1, int l2) const;
961  bool supports(EOutArgs_hess_g_xx arg, int j) const;
964  bool supports(EOutArgs_hess_g_xp arg, int j, int l) const;
967  bool supports(EOutArgs_hess_g_pp arg, int j, int l1, int l2) const;
969  bool supports(EOutArgs_H_xx arg) const;
972  bool supports(EOutArgs_H_xp arg, int l) const;
975  bool supports(EOutArgs_H_pp arg, int l1, int l2) const;
976 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
977 
979  void set_f( const Evaluation<VectorBase<Scalar> > &f );
983  void set_g( int j, const Evaluation<VectorBase<Scalar> > &g_j );
985  Evaluation<VectorBase<Scalar> > get_g(int j) const;
987  void set_W( const RCP<LinearOpWithSolveBase<Scalar> > &W );
990 
992  template<typename ObjectType>
993  bool supports() const;
995  template<typename ObjectType>
996  void set(const RCP<const ObjectType>& uo);
998  template<typename ObjectType>
999  RCP<const ObjectType> get() const;
1000 
1001  const DerivativeSupport& supports(EOutArgsDfDp_mp arg, int l) const;
1002  bool supports(EOutArgs_g_mp arg, int j) const;
1003  const DerivativeSupport& supports(EOutArgsDgDx_dot_mp arg, int j) const;
1004  const DerivativeSupport& supports(EOutArgsDgDx_mp arg, int j) const;
1005  const DerivativeSupport& supports(EOutArgsDgDp_mp arg, int j, int l) const;
1007  void set_f_mp( const RCP<Stokhos::ProductEpetraVector> &f_mp );
1011  void set_g_mp( int j, const RCP<Stokhos::ProductEpetraVector> &g_mp_j );
1015  void set_W_mp( const RCP<Stokhos::ProductEpetraOperator> &W_mp );
1018 
1020  void set_W_op( const RCP<LinearOpBase<Scalar> > &W_op );
1024  void set_W_prec( const RCP<PreconditionerBase<Scalar> > &W_prec );
1031  void set_DfDp(int l, const Derivative<Scalar> &DfDp_l);
1033  Derivative<Scalar> get_DfDp(int l) const;
1038  void set_DgDx_dot(int j, const Derivative<Scalar> &DgDx_dot_j);
1040  Derivative<Scalar> get_DgDx_dot(int j) const;
1045  void set_DgDx(int j, const Derivative<Scalar> &DgDx_j);
1047  Derivative<Scalar> get_DgDx(int j) const;
1052  void set_DgDp( int j, int l, const Derivative<Scalar> &DgDp_j_l );
1054  Derivative<Scalar> get_DgDp(int j, int l) const;
1057  DerivativeProperties get_DgDp_properties(int j, int l) const;
1058 
1059 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1060 
1062  void set_hess_vec_prod_f_xx(const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_xx);
1064  void set_hess_vec_prod_f_xp(int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_xp_l);
1066  void set_hess_vec_prod_f_px(int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_px_l);
1068  void set_hess_vec_prod_f_pp(int l1, int l2, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_pp_l1_l2);
1069 
1071  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_xx() const;
1073  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_xp(int l) const;
1075  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_px(int l) const;
1077  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_pp(int l1, int l2) const;
1078 
1080  void set_hess_vec_prod_g_xx(int j, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_xx_j);
1082  void set_hess_vec_prod_g_xp(int j, int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_xp_j_l);
1084  void set_hess_vec_prod_g_px(int j, int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_px_j_l);
1086  void set_hess_vec_prod_g_pp(int j, int l1, int l2, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_pp_j_l1_l2);
1087 
1089  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_xx(int j) const;
1091  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_xp(int j, int l) const;
1093  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_px(int j, int l) const;
1095  RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_pp(int j, int l1, int l2) const;
1096 
1098  void set_hess_f_xx(const RCP<LinearOpBase<Scalar> > &hess_f_xx);
1100  void set_hess_f_xp(int l, const RCP<LinearOpBase<Scalar> > &hess_f_xp_l);
1102  void set_hess_f_pp(int l1, int l2, const RCP<LinearOpBase<Scalar> > &hess_f_pp_l1_l2);
1104  void set_hess_g_xx(int j, const RCP<LinearOpBase<Scalar> > &hess_g_xx_j);
1106  void set_hess_g_xp(int j, int l, const RCP<LinearOpBase<Scalar> > &hess_g_xp_j_l);
1108  void set_hess_g_pp(int j, int l1, int l2, const RCP<LinearOpBase<Scalar> > &hess_g_pp_j_l1_l2);
1110  void set_H_xx(const RCP<LinearOpBase<Scalar> > &H_xx);
1112  void set_H_xp(int l, const RCP<LinearOpBase<Scalar> > &H_xp_l);
1114  void set_H_pp(int l1, int l2, const RCP<LinearOpBase<Scalar> > &H_pp_l1_l2);
1115 
1117  RCP<LinearOpBase<Scalar> > get_hess_f_xx() const;
1119  RCP<LinearOpBase<Scalar> > get_hess_f_xp(int l) const;
1121  RCP<LinearOpBase<Scalar> > get_hess_f_pp(int l1, int l2) const;
1123  RCP<LinearOpBase<Scalar> > get_hess_g_xx(int j) const;
1125  RCP<LinearOpBase<Scalar> > get_hess_g_xp(int j, int l) const;
1127  RCP<LinearOpBase<Scalar> > get_hess_g_pp(int j, int l1, int l2) const;
1129  RCP<LinearOpBase<Scalar> > get_H_xx() const;
1131  RCP<LinearOpBase<Scalar> > get_H_xp(int l) const;
1133  RCP<LinearOpBase<Scalar> > get_H_pp(int l1, int l2) const;
1134 
1135 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1136 
1137  void set_DfDp_mp(int l, const MPDerivative &DfDp_mp_l);
1138  MPDerivative get_DfDp_mp(int l) const;
1139  DerivativeProperties get_DfDp_mp_properties(int l) const;
1140  void set_DgDx_dot_mp(int j, const MPDerivative &DgDx_dot_mp_j);
1141  MPDerivative get_DgDx_dot_mp(int j) const;
1142  DerivativeProperties get_DgDx_dot_mp_properties(int j) const;
1143  void set_DgDx_mp(int j, const MPDerivative &DgDx_mp_j);
1144  MPDerivative get_DgDx_mp(int j) const;
1145  DerivativeProperties get_DgDx_mp_properties(int j) const;
1146  void set_DgDp_mp( int j, int l, const MPDerivative &DgDp_mp_j_l );
1147  MPDerivative get_DgDp_mp(int j, int l) const;
1148  DerivativeProperties get_DgDp_mp_properties(int j, int l) const;
1149 
1150 #ifdef HAVE_THYRA_ME_POLYNOMIAL
1151 
1152  void set_f_poly( const RCP<Teuchos::Polynomial< VectorBase<Scalar> > > &f_poly );
1154  RCP<Teuchos::Polynomial< VectorBase<Scalar> > > get_f_poly() const;
1155 #endif // HAVE_THYRA_ME_POLYNOMIAL
1156 
1161  void setArgs( const OutArgs<Scalar>& outArgs, bool ignoreUnsupported = false );
1173  void setFailed() const;
1179  bool isFailed() const;
1181  bool isEmpty() const;
1183  void assertSameSupport( const OutArgs<Scalar> &outArgs ) const;
1185  std::string modelEvalDescription() const;
1187  std::string description() const;
1190  void describe(
1191  Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel
1192  ) const;
1193  protected:
1195  void _setModelEvalDescription( const std::string &modelEvalDescription );
1197  void _set_Np_Ng(int Np, int Ng);
1199  void _setSupports( EOutArgsMembers arg, bool supports );
1201  template<typename ObjectType>
1202  void _setSupports( const bool supports );
1204  void _setSupports( EOutArgsDfDp arg, int l, const DerivativeSupport& );
1206  void _setSupports( EOutArgsDgDx_dot arg, int j, const DerivativeSupport& );
1208  void _setSupports( EOutArgsDgDx arg, int j, const DerivativeSupport& );
1210  void _setSupports( EOutArgsDgDp arg, int j, int l, const DerivativeSupport& );
1211 
1212 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1213 
1215  void _setSupports( EOutArgs_hess_vec_prod_f_xx arg, bool supports );
1217  void _setSupports( EOutArgs_hess_vec_prod_f_xp arg, int l, bool supports );
1219  void _setSupports( EOutArgs_hess_vec_prod_f_px arg, int l, bool supports );
1221  void _setSupports( EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2, bool supports );
1223  void _setSupports( EOutArgs_hess_vec_prod_g_xx arg, int j, bool supports );
1225  void _setSupports( EOutArgs_hess_vec_prod_g_xp arg, int j, int l, bool supports );
1227  void _setSupports( EOutArgs_hess_vec_prod_g_px arg, int j, int l, bool supports );
1229  void _setSupports( EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2, bool supports );
1230 
1232  void _setSupports( EOutArgs_hess_f_xx arg, bool supports );
1234  void _setSupports( EOutArgs_hess_f_xp arg, int l, bool supports );
1236  void _setSupports( EOutArgs_hess_f_pp arg, int l1, int l2, bool supports );
1238  void _setSupports( EOutArgs_hess_g_xx arg, int j, bool supports );
1240  void _setSupports( EOutArgs_hess_g_xp arg, int j, int l, bool supports );
1242  void _setSupports( EOutArgs_hess_g_pp arg, int j, int l1, int l2, bool supports );
1244  void _setSupports( EOutArgs_H_xx arg, bool supports );
1246  void _setSupports( EOutArgs_H_xp arg, int l, bool supports );
1248  void _setSupports( EOutArgs_H_pp arg, int l1, int l2, bool supports );
1249 
1250 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1251 
1252  void _setSupports( EOutArgs_g_mp arg, int j, bool supports );
1253  void _setSupports( EOutArgsDfDp_mp arg, int l, const DerivativeSupport& );
1254  void _setSupports( EOutArgsDgDx_dot_mp arg, int j, const DerivativeSupport& );
1255  void _setSupports( EOutArgsDgDx_mp arg, int j, const DerivativeSupport& );
1256  void _setSupports( EOutArgsDgDp_mp arg, int j, int l, const DerivativeSupport& );
1257 
1259  void _set_W_properties( const DerivativeProperties &properties );
1261  void _set_DfDp_properties( int l, const DerivativeProperties &properties );
1263  void _set_DgDx_dot_properties( int j, const DerivativeProperties &properties );
1265  void _set_DgDx_properties( int j, const DerivativeProperties &properties );
1267  void _set_DgDp_properties( int j, int l, const DerivativeProperties &properties );
1268 
1269  void _set_DfDp_mp_properties( int l, const DerivativeProperties &properties );
1270  void _set_DgDx_dot_mp_properties( int j, const DerivativeProperties &properties );
1271  void _set_DgDx_mp_properties( int j, const DerivativeProperties &properties );
1272  void _set_DgDp_mp_properties( int j, int l, const DerivativeProperties &properties );
1273 
1275  void _setSupports( const OutArgs<Scalar>& inputOutArgs );
1280 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1281 
1282  void _setHessianSupports( const bool supports );
1283 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1284 
1285  private:
1286  // types
1291 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1292  typedef Teuchos::Array<RCP<LinearOpBase<Scalar> > > hess_t;
1293  typedef Teuchos::Array<RCP<MultiVectorBase<Scalar> > > hess_vec_t;
1294  typedef Teuchos::Array<bool> hess_supports_t;
1295 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1296 
1297  // data
1298  std::string modelEvalDescription_;
1299  bool supports_[NUM_E_OUT_ARGS_MEMBERS];
1300  supports_t supports_DfDp_; // Np
1301  supports_t supports_DgDx_dot_; // Ng
1302  supports_t supports_DgDx_; // Ng
1303  supports_t supports_DgDp_; // Ng x Np
1304 
1305 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1306 
1307  bool supports_hess_f_xx_;
1308  hess_supports_t supports_hess_f_xp_;
1309  hess_supports_t supports_hess_f_pp_;
1310  hess_supports_t supports_hess_g_xx_;
1311  hess_supports_t supports_hess_g_xp_;
1312  hess_supports_t supports_hess_g_pp_;
1313  bool supports_H_xx_;
1314  hess_supports_t supports_H_xp_;
1315  hess_supports_t supports_H_pp_;
1316 
1317  bool supports_hess_vec_prod_f_xx_;
1318  hess_supports_t supports_hess_vec_prod_f_xp_;
1319  hess_supports_t supports_hess_vec_prod_f_px_;
1320  hess_supports_t supports_hess_vec_prod_f_pp_;
1321  hess_supports_t supports_hess_vec_prod_g_xx_;
1322  hess_supports_t supports_hess_vec_prod_g_xp_;
1323  hess_supports_t supports_hess_vec_prod_g_px_;
1324  hess_supports_t supports_hess_vec_prod_g_pp_;
1325 
1326 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1327 
1329  g_t g_; // Ng
1331  RCP<LinearOpBase<Scalar> > W_op_;
1333  DerivativeProperties W_properties_;
1334  deriv_t DfDp_; // Np
1335  deriv_properties_t DfDp_properties_; // Np
1336  deriv_t DgDx_dot_; // Ng
1337  deriv_t DgDx_; // Ng
1338  deriv_properties_t DgDx_dot_properties_; // Ng
1339  deriv_properties_t DgDx_properties_; // Ng
1340  deriv_t DgDp_; // Ng x Np
1341  deriv_properties_t DgDp_properties_; // Ng x Np
1342 
1343 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1344 
1345  RCP<LinearOpBase<Scalar> > hess_f_xx_;
1346  hess_t hess_f_xp_;
1347  hess_t hess_f_pp_;
1348  hess_t hess_g_xx_;
1349  hess_t hess_g_xp_;
1350  hess_t hess_g_pp_;
1351  RCP<LinearOpBase<Scalar> > H_xx_;
1352  hess_t H_xp_;
1353  hess_t H_pp_;
1354 
1355  RCP<MultiVectorBase<Scalar> > hess_vec_prod_f_xx_;
1356  hess_vec_t hess_vec_prod_f_xp_; // Np
1357  hess_vec_t hess_vec_prod_f_px_; // Np
1358  hess_vec_t hess_vec_prod_f_pp_; // Np x Np
1359 
1360  hess_vec_t hess_vec_prod_g_xx_; // Ng
1361  hess_vec_t hess_vec_prod_g_xp_; // Ng x Np
1362  hess_vec_t hess_vec_prod_g_px_; // Ng x Np
1363  hess_vec_t hess_vec_prod_g_pp_; // Ng x Np x Np
1364 
1365 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1366 
1367  Teuchos::Array<bool> supports_g_mp_; //Ng
1368  supports_t supports_DfDp_mp_; // Np_mp
1369  supports_t supports_DgDx_dot_mp_; // Ng_mp
1370  supports_t supports_DgDx_mp_; // Ng_mp
1371  supports_t supports_DgDp_mp_; // Ng_mp x Np_mp
1376  Teuchos::Array<MPDerivative> DgDx_dot_mp_;
1379  deriv_properties_t DfDp_mp_properties_;
1380  deriv_properties_t DgDx_dot_mp_properties_;
1381  deriv_properties_t DgDx_mp_properties_;
1382  deriv_properties_t DgDp_mp_properties_;
1383 
1384 #ifdef HAVE_THYRA_ME_POLYNOMIAL
1386 #endif // HAVE_THYRA_ME_POLYNOMIAL
1387  mutable bool isFailed_;
1388 
1389  std::map<std::string,Teuchos::any> extended_outargs_;
1390 
1391  // functions
1392  void assert_supports(EOutArgsMembers arg) const;
1393  void assert_supports(
1394  EOutArgsDfDp arg, int l,
1395  const Derivative<Scalar> &deriv = Derivative<Scalar>()
1396  ) const;
1397  void assert_supports(
1398  EOutArgsDgDx_dot arg, int j,
1399  const Derivative<Scalar> &deriv = Derivative<Scalar>()
1400  ) const;
1401  void assert_supports(
1402  EOutArgsDgDx arg, int j,
1403  const Derivative<Scalar> &deriv = Derivative<Scalar>()
1404  ) const;
1405  void assert_supports(
1406  EOutArgsDgDp arg, int j, int l,
1407  const Derivative<Scalar> &deriv = Derivative<Scalar>()
1408  ) const;
1409 
1410 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1411 
1412  void assert_supports(
1413  EOutArgs_hess_vec_prod_f_xx arg
1414  ) const;
1415  void assert_supports(
1416  EOutArgs_hess_vec_prod_f_xp arg, int l
1417  ) const;
1418  void assert_supports(
1419  EOutArgs_hess_vec_prod_f_px arg, int l
1420  ) const;
1421  void assert_supports(
1422  EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2
1423  ) const;
1424  void assert_supports(
1425  EOutArgs_hess_vec_prod_g_xx arg, int j
1426  ) const;
1427  void assert_supports(
1428  EOutArgs_hess_vec_prod_g_xp arg, int j, int l
1429  ) const;
1430  void assert_supports(
1431  EOutArgs_hess_vec_prod_g_px arg, int j, int l
1432  ) const;
1433  void assert_supports(
1434  EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2
1435  ) const;
1436 
1437  void assert_supports(
1438  EOutArgs_hess_f_xx arg
1439  ) const;
1440  void assert_supports(
1441  EOutArgs_hess_f_xp arg, int l
1442  ) const;
1443  void assert_supports(
1444  EOutArgs_hess_f_pp arg, int l1, int l2
1445  ) const;
1446  void assert_supports(
1447  EOutArgs_hess_g_xx arg, int j
1448  ) const;
1449  void assert_supports(
1450  EOutArgs_hess_g_xp arg, int j, int l
1451  ) const;
1452  void assert_supports(
1453  EOutArgs_hess_g_pp arg, int j, int l1, int l2
1454  ) const;
1455  void assert_supports(
1456  EOutArgs_H_xx arg
1457  ) const;
1458  void assert_supports(
1459  EOutArgs_H_xp arg, int l
1460  ) const;
1461  void assert_supports(
1462  EOutArgs_H_pp arg, int l1, int l2
1463  ) const;
1464 
1465 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1466 
1467  void assert_supports(EOutArgs_g_mp arg, int j) const;
1468  void assert_supports(
1469  EOutArgsDfDp_mp arg, int l,
1470  const MPDerivative &deriv = MPDerivative()
1471  ) const;
1472  void assert_supports(
1473  EOutArgsDgDx_dot_mp arg, int j,
1474  const MPDerivative &deriv = MPDerivative()
1475  ) const;
1476  void assert_supports(
1477  EOutArgsDgDx_mp arg, int j,
1478  const MPDerivative &deriv = MPDerivative()
1479  ) const;
1480  void assert_supports(
1481  EOutArgsDgDp_mp arg, int j, int l,
1482  const MPDerivative &deriv = MPDerivative()
1483  ) const;
1484 
1485  void assert_l(int l) const;
1486  void assert_j(int j) const;
1487  };
1488 
1490 
1491 // Added since at least gcc 3.3.4 does not do the right thing here!
1492 #ifdef HAVE_PROTECTED_NESTED_TEMPLATE_CLASS_ACCESS
1493 protected:
1494 #endif
1495 
1498 
1506  template<class Scalar>
1507  class InArgsSetup : public InArgs<Scalar> {
1508  public:
1510  InArgsSetup();
1512  InArgsSetup( const InArgs<Scalar>& );
1514  void setModelEvalDescription( const std::string &modelEvalDescription );
1516  void set_Np(int Np);
1518  void set_Np_Ng(int Np, int Ng);
1520  void setSupports( EInArgsMembers arg, bool supports = true );
1522  void setSupports( const InArgs<Scalar>& inputInArgs, const int Np = -1 );
1524  template<typename ObjectType>
1525  void setSupports(const bool supports = true);
1528 
1529  void setSupports( EInArgs_p_mp arg, int l, bool supports);
1530  };
1531 
1539  template<class Scalar>
1540  class OutArgsSetup : public OutArgs<Scalar> {
1541  public:
1543  OutArgsSetup();
1545  OutArgsSetup( const OutArgs<Scalar>& );
1547  void setModelEvalDescription( const std::string &modelEvalDescription );
1549  void set_Np_Ng(int Np, int Ng);
1551  void setSupports( EOutArgsMembers arg, bool supports = true );
1553  void setSupports(EOutArgsDfDp arg, int l, const DerivativeSupport& );
1555  void setSupports(EOutArgsDgDx_dot arg, int j, const DerivativeSupport& );
1557  void setSupports(EOutArgsDgDx arg, int j, const DerivativeSupport& );
1559  void setSupports(EOutArgsDgDp arg, int j, int l, const DerivativeSupport& );
1560 
1561 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1562 
1563  void setSupports(EOutArgs_hess_vec_prod_f_xx arg, bool supports = true );
1565  void setSupports(EOutArgs_hess_vec_prod_f_xp arg, int l, bool supports = true );
1567  void setSupports(EOutArgs_hess_vec_prod_f_px arg, int l, bool supports = true );
1569  void setSupports(EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2, bool supports = true );
1571  void setSupports(EOutArgs_hess_vec_prod_g_xx arg, int j, bool supports = true );
1573  void setSupports(EOutArgs_hess_vec_prod_g_xp arg, int j, int l, bool supports = true );
1575  void setSupports(EOutArgs_hess_vec_prod_g_px arg, int j, int l, bool supports = true );
1577  void setSupports(EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2, bool supports = true );
1579  void setSupports(EOutArgs_hess_f_xx arg, bool supports = true );
1581  void setSupports(EOutArgs_hess_f_xp arg, int l, bool supports = true );
1583  void setSupports(EOutArgs_hess_f_pp arg, int l1, int l2, bool supports = true );
1585  void setSupports(EOutArgs_hess_g_xx arg, int j, bool supports = true );
1587  void setSupports(EOutArgs_hess_g_xp arg, int j, int l, bool supports = true );
1589  void setSupports(EOutArgs_hess_g_pp arg, int j, int l1, int l2, bool supports = true );
1591  void setSupports(EOutArgs_H_xx arg, bool supports = true );
1593  void setSupports(EOutArgs_H_xp arg, int l, bool supports = true );
1595  void setSupports(EOutArgs_H_pp arg, int l1, int l2, bool supports = true );
1596 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1597 
1599  template<typename ObjectType>
1600  void setSupports(const bool supports = true);
1601 
1602  void setSupports( EOutArgs_g_mp arg, int j, bool supports);
1603  void setSupports(EOutArgsDfDp_mp arg, int l, const DerivativeSupport& );
1604  void setSupports(EOutArgsDgDx_dot_mp arg, int j, const DerivativeSupport& );
1605  void setSupports(EOutArgsDgDx_mp arg, int j, const DerivativeSupport& );
1606  void setSupports(EOutArgsDgDp_mp arg, int j, int l, const DerivativeSupport& );
1607 
1609  void set_W_properties( const DerivativeProperties &properties );
1611  void set_DfDp_properties( int l, const DerivativeProperties &properties );
1613  void set_DgDx_dot_properties( int j, const DerivativeProperties &properties );
1615  void set_DgDx_properties( int j, const DerivativeProperties &properties );
1617  void set_DgDp_properties( int j, int l, const DerivativeProperties &properties );
1618 
1619  void set_DfDp_mp_properties( int l, const DerivativeProperties &properties );
1620  void set_DgDx_dot_mp_properties( int j, const DerivativeProperties &properties );
1621  void set_DgDx_mp_properties( int j, const DerivativeProperties &properties );
1622  void set_DgDp_mp_properties( int j, int l, const DerivativeProperties &properties );
1623 
1625  void setSupports( const OutArgs<Scalar>& inputOutArgs );
1630 
1631 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
1632 
1633  void setHessianSupports( const bool supports = true );
1634 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1635  };
1636 
1638 
1641 
1644 
1646 
1647 private:
1648  // Not defined and not to be called
1650  ModelEvaluatorBase& operator=(const ModelEvaluatorBase&);
1651 
1652 }; // ModelEvaluatorBase
1653 
1654 
1657 
1658 
1661 
1662 
1664 std::string toString(
1666  );
1667 
1668 
1671 getOtherDerivativeMultiVectorOrientation(
1673  );
1674 
1675 
1676 } // namespace Thyra
1677 
1678 
1679 // //////////////////////////////////
1680 // Inline Defintions
1681 
1682 // Extended InArgs
1683 template<class Scalar>
1684 template<typename ObjectType>
1686 {
1687  std::map<std::string,Teuchos::any>::const_iterator search =
1688  extended_inargs_.find(typeid(ObjectType).name());
1689 
1690  if (search == extended_inargs_.end())
1691  return false;
1692 
1693  return true;
1694 }
1695 
1696 template<class Scalar>
1697 template<typename ObjectType>
1699 {
1700  std::map<std::string,Teuchos::any>::iterator search = extended_inargs_.find(typeid(ObjectType).name());
1701  TEUCHOS_TEST_FOR_EXCEPTION(search == extended_inargs_.end(),
1702  std::runtime_error,
1703  "ERROR: InArgs::set<ObjectType>() was called with unsupported extended data type \""
1704  << typeid(ObjectType).name() << "\"!");
1705 
1706  search->second = Teuchos::any(eo);
1707 }
1708 
1709 template<class Scalar>
1710 template<typename ObjectType>
1713 {
1714  std::map<std::string,Teuchos::any>::const_iterator search = extended_inargs_.find(typeid(ObjectType).name());
1715  TEUCHOS_TEST_FOR_EXCEPTION(search == extended_inargs_.end(),
1716  std::runtime_error,
1717  "ERROR: InArgs::get<ObjectType>() was called with unsupported extended data type \""
1718  << typeid(ObjectType).name() << "\"!");
1719 
1720  return Teuchos::any_cast<Teuchos::RCP<const ObjectType> >(search->second);
1721 }
1722 
1723 template<class Scalar>
1724 template<class ObjectType>
1726 setSupports(const bool in_supports)
1727 {
1728  this->template _setSupports<ObjectType>(in_supports);
1729 }
1730 
1731 template<class Scalar>
1732 template<class ObjectType>
1734 _setSupports(const bool in_supports)
1735 {
1736  if (in_supports)
1737  // When supports() is called, the map is searched to check for
1738  // supporting a type. If we support the type, we will insert an
1739  // empty placholder for now so that the search is successful for
1740  // support checks.
1741  this->extended_inargs_[typeid(ObjectType).name()] = Teuchos::any();
1742  else {
1743  // if false, remove the entry
1744  std::map<std::string,Teuchos::any>::iterator search =
1745  this->extended_inargs_.find(typeid(ObjectType).name());
1746 
1747  if (search != this->extended_inargs_.end())
1748  this->extended_inargs_.erase(typeid(ObjectType).name());
1749  }
1750 }
1751 
1752 // Extended OutArgs
1753 template<class Scalar>
1754 template<typename ObjectType>
1756 {
1757  std::map<std::string,Teuchos::any>::const_iterator search =
1758  extended_outargs_.find(typeid(ObjectType).name());
1759 
1760  if (search == extended_outargs_.end())
1761  return false;
1762 
1763  return true;
1764 }
1765 
1766 template<class Scalar>
1767 template<typename ObjectType>
1769 {
1770  std::map<std::string,Teuchos::any>::iterator search = extended_outargs_.find(typeid(ObjectType).name());
1771  TEUCHOS_TEST_FOR_EXCEPTION(search == extended_outargs_.end(),
1772  std::runtime_error,
1773  "ERROR: OutArgs::set<ObjectType>() was called with unsupported extended data type \""
1774  << typeid(ObjectType).name() << "\"!");
1775 
1776  search->second = Teuchos::any(eo);
1777 }
1778 
1779 template<class Scalar>
1780 template<typename ObjectType>
1783 {
1784  std::map<std::string,Teuchos::any>::const_iterator search = extended_outargs_.find(typeid(ObjectType).name());
1785  TEUCHOS_TEST_FOR_EXCEPTION(search == extended_outargs_.end(),
1786  std::runtime_error,
1787  "ERROR: OutArgs::get<ObjectType>() was called with unsupported extended data type \""
1788  << typeid(ObjectType).name() << "\"!");
1789 
1790  return Teuchos::any_cast<Teuchos::RCP<const ObjectType> >(search->second);
1791 }
1792 
1793 template<class Scalar>
1794 template<class ObjectType>
1796 setSupports(const bool in_supports)
1797 {
1798  this->template _setSupports<ObjectType>(in_supports);
1799 }
1800 
1801 template<class Scalar>
1802 template<class ObjectType>
1804 _setSupports(const bool in_supports)
1805 {
1806  if (in_supports)
1807  // When supports() is called, the map is searched to check for
1808  // supporting a type. If we support the type, we will insert an
1809  // empty placholder for now so that the search is successful for
1810  // support checks.
1811  this->extended_outargs_[typeid(ObjectType).name()] = Teuchos::any();
1812  else {
1813  // if false, remove the entry
1814  std::map<std::string,Teuchos::any>::iterator search =
1815  this->extended_outargs_.find(typeid(ObjectType).name());
1816 
1817  if (search != this->extended_outargs_.end())
1818  this->extended_outargs_.erase(typeid(ObjectType).name());
1819  }
1820 }
1821 
1822 //
1823 // Thyra_MEB_helper_functions_grp
1824 //
1825 
1826 
1827 inline
1829 {
1830  switch(arg) {
1831  case ModelEvaluatorBase::IN_ARG_x_dot_dot:
1832  return "IN_ARG_x_dot_dot";
1833  case ModelEvaluatorBase::IN_ARG_x_dot:
1834  return "IN_ARG_x_dot";
1835  case ModelEvaluatorBase::IN_ARG_x:
1836  return "IN_ARG_x";
1837  case ModelEvaluatorBase::IN_ARG_x_dot_poly:
1838  return "IN_ARG_x_dot_poly";
1839  case ModelEvaluatorBase::IN_ARG_x_poly:
1840  return "IN_ARG_x_poly";
1841  case ModelEvaluatorBase::IN_ARG_x_dot_mp:
1842  return "IN_ARG_x_dot_mp";
1843  case ModelEvaluatorBase::IN_ARG_x_mp:
1844  return "IN_ARG_x_mp";
1845  case ModelEvaluatorBase::IN_ARG_t:
1846  return "IN_ARG_t";
1847  case ModelEvaluatorBase::IN_ARG_alpha:
1848  return "IN_ARG_alpha";
1849  case ModelEvaluatorBase::IN_ARG_beta:
1850  return "IN_ARG_beta";
1851  case ModelEvaluatorBase::IN_ARG_W_x_dot_dot_coeff:
1852  return "IN_ARG_W_x_dot_dot_coeff";
1853  case ModelEvaluatorBase::IN_ARG_step_size:
1854  return "IN_ARG_step_size";
1855  case ModelEvaluatorBase::IN_ARG_stage_number:
1856  return "IN_ARG_stage_number";
1857 #ifdef TEUCHOS_DEBUG
1858  default:
1860 #endif
1861  }
1862  return ""; // Will never be executed!
1863 }
1864 
1865 
1866 inline
1867 std::string Thyra::toString(ModelEvaluatorBase::EOutArgsMembers arg)
1868 {
1869  switch(arg) {
1870  case ModelEvaluatorBase::OUT_ARG_f:
1871  return "OUT_ARG_f";
1872  case ModelEvaluatorBase::OUT_ARG_W:
1873  return "OUT_ARG_W";
1874  case ModelEvaluatorBase::OUT_ARG_f_mp:
1875  return "OUT_ARG_f_mp";
1876  case ModelEvaluatorBase::OUT_ARG_W_mp:
1877  return "OUT_ARG_W_mp";
1878  case ModelEvaluatorBase::OUT_ARG_W_op:
1879  return "OUT_ARG_W_op";
1880  case ModelEvaluatorBase::OUT_ARG_W_prec:
1881  return "OUT_ARG_W_prec";
1882  case ModelEvaluatorBase::OUT_ARG_f_poly:
1883  return "OUT_ARG_f_poly";
1884 #ifdef TEUCHOS_DEBUG
1885  default:
1887 #endif
1888  }
1889  return ""; // Will never be executed!
1890 }
1891 
1892 
1893 inline
1894 std::string Thyra::toString(
1895  ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
1896  )
1897 {
1898  switch(orientation) {
1899  case ModelEvaluatorBase::DERIV_MV_BY_COL:
1900  return "DERIV_MV_BY_COL";
1901  case ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW:
1902  return "DERIV_TRANS_MV_BY_ROW";
1903 #ifdef TEUCHOS_DEBUG
1904  default:
1906 #endif
1907  }
1908  return ""; // Should never execute this!
1909 }
1910 
1911 
1912 inline
1914 Thyra::getOtherDerivativeMultiVectorOrientation(
1915  ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
1916  )
1917 {
1918  switch(orientation) {
1919  case ModelEvaluatorBase::DERIV_MV_BY_COL:
1920  return ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW;
1921  case ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW:
1922  return ModelEvaluatorBase::DERIV_MV_BY_COL;
1923 #ifdef TEUCHOS_DEBUG
1924  default:
1926 #endif
1927  }
1928  return ModelEvaluatorBase::DERIV_MV_BY_COL; // Should never execute this!
1929 }
1930 
1931 
1932 #endif // THYRA_MODEL_EVALUATOR_BASE_DECL_HPP
Protected subclass of InArgs that only ModelEvaluator subclasses can access to set up the selection o...
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng &gt;= 0).
bool supports(EDerivativeMultiVectorOrientation mvOrientation) const
EDerivativeMultiVectorOrientation getOrientation() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Create a more detailed description along about this object and the ModelEvaluator that created it...
RCP< Stokhos::ProductEpetraMultiVector > getMultiVector() const
RCP< MultiVectorBase< Scalar > > getMultiVector() const
void set_DgDx_properties(int j, const DerivativeProperties &properties)
MPDerivative(const RCP< Stokhos::ProductEpetraOperator > &lo)
void set_DfDp_properties(int l, const DerivativeProperties &properties)
Base class for all linear operators that can support a high-level solve operation.
bool is_null(const boost::shared_ptr< T > &p)
void set_step_size(Scalar step_size)
Precondition: supports(IN_ARG_step_size)==true.
Scalar get_beta() const
Precondition: supports(IN_ARG_beta)==true.
RCP< const VectorBase< Scalar > > get_f_multiplier() const
Precondition: supports(IN_ARG_x)==true.
RCP< Stokhos::ProductEpetraVector > get_g_mp(int j) const
Precondition: supports(OUT_ARG_g_mp)==true..
void set_x_dot_dot(const RCP< const VectorBase< Scalar > > &x_dot_dot)
Precondition: supports(IN_ARG_x_dot_dot)==true.
void setArgs(const OutArgs< Scalar > &outArgs, bool ignoreUnsupported=false)
Set all arguments fron outArgs into *this.
bool supports() const
Determines if an extended input argument of type ObjectType is supported.
ScalarMag get_t() const
.Precondition: supports(IN_ARG_t)==true
void _set_DfDp_properties(int l, const DerivativeProperties &properties)
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...
Derivative< Scalar > get_DfDp(int l) const
Precondition: supports(OUT_ARG_DfDp,l)==true.
void set_g(int j, const Evaluation< VectorBase< Scalar > > &g_j)
Precondition: supports(OUT_ARG_g)==true.
RCP< const VectorBase< Scalar > > get_x_dot() const
Precondition: supports(IN_ARG_x_dot)==true.
MPDerivative(const RCP< Stokhos::ProductEpetraMultiVector > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
void setModelEvalDescription(const std::string &modelEvalDescription)
void set_W_mp(const RCP< Stokhos::ProductEpetraOperator > &W_mp)
Precondition: supports(OUT_ARG_W_mp)==true.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
void _set_DgDx_dot_properties(int j, const DerivativeProperties &properties)
void set_W_prec(const RCP< PreconditionerBase< Scalar > > &W_prec)
Precondition: supports(OUT_ARG_W_op)==true.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Create a more detailed description along about this object and the ModelEvaluator that created it...
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void set(const RCP< const ObjectType > &uo)
Set an extended output argument of type ObjectType in OutArgs. Precondition: supports()==true.
void changeOrientation(const EDerivativeMultiVectorOrientation orientation)
void describe(Teuchos::FancyOStream &, const Teuchos::EVerbosityLevel) const
void set_x_dot_mp(const RCP< const Stokhos::ProductEpetraVector > &x_dot_mp)
Precondition: supports(IN_ARG_x_dot_mp)==true.
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
void set(const RCP< const ObjectType > &uo)
Set an extended input object of type ObjectType in the InArgs. Precondition: supports()==true.
bool isSameSupport(const DerivativeSupport &derivSupport) const
Evaluation< VectorBase< Scalar > > get_g(int j) const
Precondition: supports(OUT_ARG_g)==true..
DerivativeMultiVector(const RCP< MultiVectorBase< Scalar > > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
Evaluation< VectorBase< Scalar > > get_f() const
Precondition: supports(OUT_ARG_f)==true.
Jacobian form DhDz (nz columns of h_space vectors)
T * get() const
RCP< const ObjectType > get() const
Get an extended input object of type ObjectType&gt;/tt&gt; from the InArgs. Precondition: supports()==true...
RCP< const Stokhos::ProductEpetraVector > get_x_mp() const
Precondition: supports(IN_ARG_x_mp)==true.
void _setSupports(EOutArgsMembers arg, bool supports)
MPDerivative(const MPDerivativeMultiVector &dmv)
Derivative(const RCP< MultiVectorBase< Scalar > > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
Evaluation(const RCP< ObjType > &obj)
Implicit conversion from RCP&lt;ObjType&gt;.
Simple interface class to access a precreated preconditioner as one or more linear operators objects ...
DerivativeProperties get_DgDx_dot_properties(int j) const
Return the know properties of DgDx_dot(j) (precondition: supports(OUT_ARG_DgDx_dot,j)==true).
DerivativeSupport & plus(EDerivativeMultiVectorOrientation mvOrientation)
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
Derivative< Scalar > get_DgDp(int j, int l) const
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
bool isSupportedBy(const DerivativeSupport &derivSupport) const
Returns true if the form of the derivative contained here is supported by deriveSupport.
void changeOrientation(const EDerivativeMultiVectorOrientation orientation)
RCP< const ObjectType > get() const
Get an extended output argument of type ObjectType from OutArgs. Precondition: supports()==true.
Gradient form DhDz^T (nh columns of z_space vectors)
bool isSupportedBy(const DerivativeSupport &derivSupport) const
Returns true if the form of the derivative contained here is supported by deriveSupport.
DerivativeProperties get_DgDx_properties(int j) const
Return the know properties of DgDx(j) (precondition: supports(OUT_ARG_DgDx,j)==true).
Evaluation(const RCP< ObjType > &obj, EEvalType evalType)
MPDerivativeMultiVector getDerivativeMultiVector() const
void set_W_properties(const DerivativeProperties &properties)
void setSupports(EInArgsMembers arg, bool supports=true)
int Np() const
Return the number of parameter subvectors p(l) supported (Np &gt;= 0).
void set_stage_number(Scalar stage_number)
Precondition: supports(IN_ARG_stage_number)==true.
void set_x(const RCP< const VectorBase< Scalar > > &x)
Precondition: supports(IN_ARG_x)==true.
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
Interface for a collection of column vectors called a multi-vector.
void setArgs(const InArgs< Scalar > &inArgs, bool ignoreUnsupported=false, bool cloneObjects=false)
Set non-null arguments (does not overwrite non-NULLs with NULLs) .
void set_DgDp(int j, int l, const Derivative< Scalar > &DgDp_j_l)
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
EDerivativeMultiVectorOrientation getMultiVectorOrientation() const
void set_DgDp_properties(int j, int l, const DerivativeProperties &properties)
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
RCP< Stokhos::ProductEpetraOperator > getLinearOp() const
DerivativeSupport(EDerivativeMultiVectorOrientation mvOrientation)
DerivativeMultiVector< Scalar > getDerivativeMultiVector() const
RCP< const Stokhos::ProductEpetraVector > get_x_dot_mp() const
Precondition: supports(IN_ARG_x_dotmp)==true.
void set_g_multiplier(int j, const RCP< const VectorBase< Scalar > > &g_multiplier)
Precondition: supports(IN_ARG_x)==true.
Derivative(const DerivativeMultiVector< Scalar > &dmv)
void _setModelEvalDescription(const std::string &modelEvalDescription)
Abstract interface for finite-dimensional dense vectors.
TEUCHOSCORE_LIB_DLL_EXPORT std::string toString(const EVerbosityLevel verbLevel)
Simple public strict containing properties of a derivative object.
void _setSupports(EInArgsMembers arg, bool supports)
void describe(Teuchos::FancyOStream &, const Teuchos::EVerbosityLevel) const
RCP< T > & operator=(const RCP< T > &r_ptr)
void assertSameSupport(const OutArgs< Scalar > &outArgs) const
Assert that two OutArgs objects have the same support.
Scalar get_W_x_dot_dot_coeff() const
Precondition: supports(IN_ARG_W_x_dot_dot_coeff)==true.
void set_x_dot(const RCP< const VectorBase< Scalar > > &x_dot)
Precondition: supports(IN_ARG_x_dot)==true.
Base class for all linear operators.
RCP< Stokhos::ProductEpetraOperator > get_W_mp() const
Precondition: supports(OUT_ARG_W_mp)==true.
DerivativeProperties get_DgDp_properties(int j, int l) const
Return the know properties of DgDp(j,l) (precondition: supports(OUT_ARG_DgDp,j,l)==true).
Derivative(const RCP< LinearOpBase< Scalar > > &lo)
void set_DgDx_dot_properties(int j, const DerivativeProperties &properties)
bool isFailed() const
Return if the evaluation failed or not.
const RCP< T > & assert_not_null() const
void _set_DgDx_properties(int j, const DerivativeProperties &properties)
void set_g_mp(int j, const RCP< Stokhos::ProductEpetraVector > &g_mp_j)
Precondition: supports(OUT_ARG_g_mp)==true.
DerivativeProperties(EDerivativeLinearity in_linearity, ERankStatus in_rank, bool in_supportsAdjoint)
Base subclass for ModelEvaluator that defines some basic types.
void set_t(ScalarMag t)
Precondition: supports(IN_ARG_t)==true.
void set_p_direction(int l, const RCP< const MultiVectorBase< Scalar > > &p_direction_l)
Precondition: supports(IN_ARG_x)==true.
void set_x_mp(const RCP< const Stokhos::ProductEpetraVector > &x_mp)
Precondition: supports(IN_ARG_x_mp)==true.
void set_DgDx_dot(int j, const Derivative< Scalar > &DgDx_dot_j)
Precondition: supports(OUT_ARG_DgDx_dot,j)==true.
void assertSameSupport(const InArgs< Scalar > &inArgs) const
Assert that two InArgs objects have the same support.
void set_p(int l, const RCP< const VectorBase< Scalar > > &p_l)
Set p(l) where 0 &lt;= l &amp;&amp; l &lt; this-&gt;Np().
void setSupports(EOutArgsMembers arg, bool supports=true)
RCP< LinearOpWithSolveBase< Scalar > > get_W() const
Precondition: supports(OUT_ARG_W)==true.
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
void _set_DgDp_properties(int j, int l, const DerivativeProperties &properties)
void set_W(const RCP< LinearOpWithSolveBase< Scalar > > &W)
Precondition: supports(OUT_ARG_W)==true.
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng &gt;= 0).
Scalar get_alpha() const
Precondition: supports(IN_ARG_alpha)==true.
void setFailed() const
Set that the evaluation as a whole failed.
bool supports() const
Determines if an extended output argument of type ObjectType is supported.
RCP< Stokhos::ProductEpetraMultiVector > getMultiVector() const
Scalar get_stage_number() const
Precondition: supports(IN_ARG_stage_number)==true.
RCP< Stokhos::ProductEpetraVector > get_f_mp() const
Precondition: supports(OUT_ARG_f_mp)==true.
void set_alpha(Scalar alpha)
Precondition: supports(IN_ARG_alpha)==true.
void set_f_multiplier(const RCP< const VectorBase< Scalar > > &f_multiplier)
Precondition: supports(IN_ARG_x)==true.
void _set_W_properties(const DerivativeProperties &properties)
Derivative< Scalar > get_DgDx_dot(int j) const
Precondition: supports(OUT_ARG_DgDx_dot,j)==true.
void set_DfDp(int l, const Derivative< Scalar > &DfDp_l)
Precondition: supports(OUT_ARG_DfDp,l)==true.
EDerivativeMultiVectorOrientation getOrientation() const
RCP< PreconditionerBase< Scalar > > get_W_prec() const
Precondition: supports(OUT_ARG_W_op)==true.
const Derivative< Scalar > & assert_not_null() const
void set_f_mp(const RCP< Stokhos::ProductEpetraVector > &f_mp)
Precondition: supports(OUT_ARG_f_mp)==true.
void set_x_direction(const RCP< const MultiVectorBase< Scalar > > &x_direction)
Precondition: supports(IN_ARG_x)==true.
Determines the forms of a general derivative that are supported.
int Np() const
Return the number of parameter subvectors p(l) supported (Np &gt;= 0).
Scalar get_step_size() const
Precondition: supports(IN_ARG_step_size)==true.
RCP< const MultiVectorBase< Scalar > > get_p_direction(int l) const
Get p(l) where 0 &lt;= l &amp;&amp; l &lt; this-&gt;Np().
RCP< const VectorBase< Scalar > > get_x_dot_dot() const
Precondition: supports(IN_ARG_x_dot_dot)==true.
RCP< const VectorBase< Scalar > > get_g_multiplier(int j) const
Precondition: supports(IN_ARG_x)==true.
void set_f(const Evaluation< VectorBase< Scalar > > &f)
Precondition: supports(OUT_ARG_f)==true.
void set_beta(Scalar beta)
Precondition: supports(IN_ARG_beta)==true.
void set_DgDx(int j, const Derivative< Scalar > &DgDx_j)
Precondition: supports(OUT_ARG_DgDx,j)==true.
void setModelEvalDescription(const std::string &modelEvalDescription)
Type to embed evaluation accuracy with an RCP-managed object.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
const DerivativeMultiVector< Scalar > & assert_not_null() const
void set_W_x_dot_dot_coeff(Scalar W_x_dot_dot_coeff)
Precondition: supports(IN_ARG_W_x_dot_dot_coeff)==true.
MPDerivativeMultiVector(const RCP< Stokhos::ProductEpetraMultiVector > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL, const Teuchos::Array< int > &paramIndexes=Teuchos::Array< int >())
RCP< LinearOpBase< Scalar > > get_W_op() const
Precondition: supports(OUT_ARG_W_op)==true.
RCP< const MultiVectorBase< Scalar > > get_x_direction() const
Precondition: supports(IN_ARG_x)==true.
void set_W_op(const RCP< LinearOpBase< Scalar > > &W_op)
Precondition: supports(OUT_ARG_W_op)==true.
EDerivativeMultiVectorOrientation getMultiVectorOrientation() const
DerivativeProperties get_DfDp_properties(int l) const
Return the know properties of DfDp(l) (precondition: supports(OUT_ARG_DfDp,l)==true).
RCP< const VectorBase< Scalar > > get_x() const
Precondition: supports(IN_ARG_x)==true.
void _setModelEvalDescription(const std::string &modelEvalDescription)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
RCP< LinearOpBase< Scalar > > getLinearOp() const
RCP< const VectorBase< Scalar > > get_p(int l) const
Get p(l) where 0 &lt;= l &amp;&amp; l &lt; this-&gt;Np().
Protected subclass of OutArgs that only ModelEvaluator subclasses can access to set up the selection ...
DerivativeProperties get_W_properties() const
Return the known properties of W (precondition: supports(OUT_ARG_f)==true).
RCP< MultiVectorBase< Scalar > > getMultiVector() const
Derivative< Scalar > get_DgDx(int j) const
Precondition: supports(OUT_ARG_DgDx,j)==true.
void reset(const RCP< ObjType > &obj, EEvalType evalType)
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object...