xref: /petsc/include/petsctao.h (revision 6285c0a3eab9179dbf0b284c36c7c0086124b8a4)
13028902dSLisandro Dalcin #ifndef PETSCTAO_H
23028902dSLisandro Dalcin #define PETSCTAO_H
321ec2d5cSBarry Smith 
421ec2d5cSBarry Smith #include <petscksp.h>
521ec2d5cSBarry Smith 
621ec2d5cSBarry Smith PetscErrorCode VecFischer(Vec, Vec, Vec, Vec, Vec);
721ec2d5cSBarry Smith PetscErrorCode VecSFischer(Vec, Vec, Vec, Vec, PetscReal, Vec);
8235fd6e6SBarry Smith PetscErrorCode MatDFischer(Mat, Vec, Vec, Vec, Vec, Vec, Vec, Vec, Vec);
9235fd6e6SBarry Smith PetscErrorCode MatDSFischer(Mat, Vec, Vec, Vec, Vec, PetscReal, Vec, Vec, Vec, Vec, Vec);
108370d7cdSHansol Suh PETSC_EXTERN PetscErrorCode TaoSoftThreshold(Vec, PetscReal, PetscReal, Vec);
1121ec2d5cSBarry Smith 
1221ec2d5cSBarry Smith 
1321ec2d5cSBarry Smith /*E
1421ec2d5cSBarry Smith   TaoSubsetType - PetscInt representing the way TAO handles active sets
1521ec2d5cSBarry Smith 
167dae84e0SHong Zhang + TAO_SUBSET_SUBVEC - TAO uses PETSc's MatCreateSubMatrix and VecGetSubVector
1721ec2d5cSBarry Smith . TAO_SUBSET_MASK - Matrices are zeroed out corresponding to active set entries
1821ec2d5cSBarry Smith - TAO_SUBSET_MATRIXFREE - Same as TAO_SUBSET_MASK, but can be applied to matrix-free operators
1921ec2d5cSBarry Smith 
2021ec2d5cSBarry Smith   Options database keys:
2121ec2d5cSBarry Smith . -different_hessian - TAO will use a copy of the hessian operator for masking.  By default
2221ec2d5cSBarry Smith                        TAO will directly alter the hessian operator.
231eb8069cSJason Sarich   Level: intermediate
2421ec2d5cSBarry Smith 
2521ec2d5cSBarry Smith E*/
261eb8069cSJason Sarich 
2721ec2d5cSBarry Smith typedef enum {TAO_SUBSET_SUBVEC,TAO_SUBSET_MASK,TAO_SUBSET_MATRIXFREE} TaoSubsetType;
2821ec2d5cSBarry Smith PETSC_EXTERN const char *const TaoSubsetTypes[];
291eb8069cSJason Sarich /*S
301eb8069cSJason Sarich      Tao - Abstract PETSc object that manages nonlinear optimization solves
311eb8069cSJason Sarich 
321eb8069cSJason Sarich    Level: advanced
331eb8069cSJason Sarich 
341eb8069cSJason Sarich .seealso TaoCreate(), TaoDestroy(), TaoSetType(), TaoType
351eb8069cSJason Sarich S*/
3621ec2d5cSBarry Smith 
37*6285c0a3SHansol  Suh /*E
38*6285c0a3SHansol  Suh      TaoADMMUpdateType - Determine spectral penalty update routine for lagrange augmented term for ADMM.
39*6285c0a3SHansol  Suh 
40*6285c0a3SHansol  Suh   Level: advanced
41*6285c0a3SHansol  Suh 
42*6285c0a3SHansol  Suh .seealso TaoADMMSetUpdateType()
43*6285c0a3SHansol  Suh E*/
44*6285c0a3SHansol  Suh typedef enum {TAO_ADMM_UPDATE_BASIC,TAO_ADMM_UPDATE_ADAPTIVE,TAO_ADMM_UPDATE_ADAPTIVE_RELAXED} TaoADMMUpdateType;
45*6285c0a3SHansol  Suh PETSC_EXTERN const char *const TaoADMMUpdateTypes[];
46*6285c0a3SHansol  Suh /*MC
47*6285c0a3SHansol  Suh      TAO_ADMM_UPDATE_BASIC - Use same spectral penalty set at the beginning. No update
48*6285c0a3SHansol  Suh 
49*6285c0a3SHansol  Suh   Level: advanced
50*6285c0a3SHansol  Suh 
51*6285c0a3SHansol  Suh   Note: Most basic implementation. Generally slower than adaptive or adaptive relaxed version.
52*6285c0a3SHansol  Suh 
53*6285c0a3SHansol  Suh .seealso: TaoADMMSetUpdateType(), TAO_ADMM_UPDATE_ADAPTIVE, TAO_ADMM_UPDATE_ADAPTIVE_RELAXED
54*6285c0a3SHansol  Suh M*/
55*6285c0a3SHansol  Suh 
56*6285c0a3SHansol  Suh /*MC
57*6285c0a3SHansol  Suh      TAO_ADMM_UPDATE_ADAPTIVE - Adaptively update spectral penalty
58*6285c0a3SHansol  Suh 
59*6285c0a3SHansol  Suh   Level: advanced
60*6285c0a3SHansol  Suh 
61*6285c0a3SHansol  Suh   Note: Adaptively updates spectral penalty, using both steepest descent and minimum gradient.
62*6285c0a3SHansol  Suh 
63*6285c0a3SHansol  Suh .seealso: TaoADMMSetUpdateType(), TAO_ADMM_UPDATE_BASIC, TAO_ADMM_UPDATE_ADAPTIVE_RELAXED
64*6285c0a3SHansol  Suh M*/
65*6285c0a3SHansol  Suh 
66*6285c0a3SHansol  Suh /*MC
67*6285c0a3SHansol  Suh      ADMM_UPDATE_ADAPTIVE_RELAXED - Adaptively update spectral penalty, and relaxes parameter update
68*6285c0a3SHansol  Suh 
69*6285c0a3SHansol  Suh   Level: advanced
70*6285c0a3SHansol  Suh 
71*6285c0a3SHansol  Suh   Note: With adaptive spectral penalty update, it also relaxes x vector update by a factor.
72*6285c0a3SHansol  Suh 
73*6285c0a3SHansol  Suh .seealso: TaoADMMSetUpdateType(), TAO_ADMM_UPDATE_BASIC, TAO_ADMM_UPDATE_ADAPTIVE
74*6285c0a3SHansol  Suh M*/
75*6285c0a3SHansol  Suh 
76*6285c0a3SHansol  Suh 
77*6285c0a3SHansol  Suh /*E
78*6285c0a3SHansol  Suh      TaoADMMRegularizerType - Determine regularizer routine - either user provided or soft threshold
79*6285c0a3SHansol  Suh 
80*6285c0a3SHansol  Suh   Level: advanced
81*6285c0a3SHansol  Suh 
82*6285c0a3SHansol  Suh .seealso TaoADMMSetRegularizerType()
83*6285c0a3SHansol  Suh E*/
84*6285c0a3SHansol  Suh typedef enum {TAO_ADMM_REGULARIZER_USER,TAO_ADMM_REGULARIZER_SOFT_THRESH} TaoADMMRegularizerType;
85*6285c0a3SHansol  Suh PETSC_EXTERN const char *const TaoADMMRegularizerTypes[];
86*6285c0a3SHansol  Suh /*MC
87*6285c0a3SHansol  Suh      TAO_ADMM_REGULARIZER_USER - User provided routines for regularizer part of ADMM
88*6285c0a3SHansol  Suh 
89*6285c0a3SHansol  Suh   Level: advanced
90*6285c0a3SHansol  Suh 
91*6285c0a3SHansol  Suh   Note: User needs to provided appropriate routines and type for regularizer solver
92*6285c0a3SHansol  Suh 
93*6285c0a3SHansol  Suh .seealso: TaoADMMSetRegularizerType(), TAO_ADMM_REGULARIZER_SOFT_THRESH
94*6285c0a3SHansol  Suh M*/
95*6285c0a3SHansol  Suh 
96*6285c0a3SHansol  Suh /*MC
97*6285c0a3SHansol  Suh      TAO_ADMM_REGULARIZER_SOFT_THRESH - Soft threshold to solve regularizer part of ADMM
98*6285c0a3SHansol  Suh 
99*6285c0a3SHansol  Suh   Level: advanced
100*6285c0a3SHansol  Suh 
101*6285c0a3SHansol  Suh   Note: Utilizes built-in SoftThreshold routines
102*6285c0a3SHansol  Suh 
103*6285c0a3SHansol  Suh .seealso: TaoSoftThreshold(), TaoADMMSetRegularizerObjectiveAndGradientRoutine(),
104*6285c0a3SHansol  Suh           TaoADMMSetRegularizerHessianRoutine(), TaoADMMSetRegularizerType(), TAO_ADMM_REGULARIZER_USER
105*6285c0a3SHansol  Suh M*/
106*6285c0a3SHansol  Suh 
107441846f8SBarry Smith typedef struct _p_Tao*   Tao;
1081eb8069cSJason Sarich 
1091eb8069cSJason Sarich /*J
1101eb8069cSJason Sarich         TaoType - String with the name of a TAO method
1111eb8069cSJason Sarich 
1121eb8069cSJason Sarich        Level: beginner
1131eb8069cSJason Sarich 
1141eb8069cSJason Sarich J*/
115b625d6c7SJed Brown typedef const char *TaoType;
11658417fe7SBarry Smith #define TAOLMVM     "lmvm"
11758417fe7SBarry Smith #define TAONLS      "nls"
11858417fe7SBarry Smith #define TAONTR      "ntr"
11958417fe7SBarry Smith #define TAONTL      "ntl"
12058417fe7SBarry Smith #define TAOCG       "cg"
12158417fe7SBarry Smith #define TAOTRON     "tron"
12258417fe7SBarry Smith #define TAOOWLQN    "owlqn"
12358417fe7SBarry Smith #define TAOBMRM     "bmrm"
12458417fe7SBarry Smith #define TAOBLMVM    "blmvm"
1256b591159SAlp Dener #define TAOBQNLS    "bqnls"
126ac9112b8SAlp Dener #define TAOBNCG     "bncg"
127eb910715SAlp Dener #define TAOBNLS     "bnls"
128fed79b8eSAlp Dener #define TAOBNTR     "bntr"
129c14b763aSAlp Dener #define TAOBNTL     "bntl"
130e0ed867bSAlp Dener #define TAOBQNKLS   "bqnkls"
131e0ed867bSAlp Dener #define TAOBQNKTR   "bqnktr"
132e0ed867bSAlp Dener #define TAOBQNKTL   "bqnktl"
13358417fe7SBarry Smith #define TAOBQPIP    "bqpip"
13458417fe7SBarry Smith #define TAOGPCG     "gpcg"
13558417fe7SBarry Smith #define TAONM       "nm"
13658417fe7SBarry Smith #define TAOPOUNDERS "pounders"
137737f463aSAlp Dener #define TAOBRGN     "brgn"
13858417fe7SBarry Smith #define TAOLCL      "lcl"
13958417fe7SBarry Smith #define TAOSSILS    "ssils"
14058417fe7SBarry Smith #define TAOSSFLS    "ssfls"
14158417fe7SBarry Smith #define TAOASILS    "asils"
14258417fe7SBarry Smith #define TAOASFLS    "asfls"
14358417fe7SBarry Smith #define TAOIPM      "ipm"
14483a0a5c3SToby Isaac #define TAOSHELL    "shell"
145*6285c0a3SHansol  Suh #define TAOADMM     "admm"
14658417fe7SBarry Smith 
147441846f8SBarry Smith PETSC_EXTERN PetscClassId TAO_CLASSID;
148441846f8SBarry Smith PETSC_EXTERN PetscFunctionList TaoList;
14921ec2d5cSBarry Smith 
150a35d58b8SBarry Smith /*E
151a35d58b8SBarry Smith     TaoConvergedReason - reason a TAO method was said to have converged or diverged
152a35d58b8SBarry Smith 
153a35d58b8SBarry Smith    Level: beginner
154a35d58b8SBarry Smith 
155a35d58b8SBarry Smith    The two most common reasons for divergence are
156a35d58b8SBarry Smith $   1) an incorrectly coded or computed gradient or Hessian
157a35d58b8SBarry Smith $   2) failure or lack of convergence in the linear system (in this case we recommend
158a35d58b8SBarry Smith $      testing with -pc_type lu to eliminate the linear solver as the cause of the problem).
159a35d58b8SBarry Smith 
16095452b02SPatrick Sanan    Developer Notes:
16195452b02SPatrick Sanan     this must match petsc/finclude/petsctao.h
162a35d58b8SBarry Smith 
163a35d58b8SBarry Smith        The string versions of these are in TAOConvergedReasons, if you change any value here you must
164a35d58b8SBarry Smith      also adjust that array.
165a35d58b8SBarry Smith 
166a35d58b8SBarry Smith .seealso: TAOSolve(), TaoGetConvergedReason(), KSPConvergedReason, SNESConvergedReason, TSConvergedReason
167a35d58b8SBarry Smith E*/
16821ec2d5cSBarry Smith typedef enum {/* converged */
16921ec2d5cSBarry Smith   TAO_CONVERGED_GATOL         =  3, /* ||g(X)|| < gatol */
17021ec2d5cSBarry Smith   TAO_CONVERGED_GRTOL         =  4, /* ||g(X)|| / f(X)  < grtol */
17121ec2d5cSBarry Smith   TAO_CONVERGED_GTTOL         =  5, /* ||g(X)|| / ||g(X0)|| < gttol */
17221ec2d5cSBarry Smith   TAO_CONVERGED_STEPTOL       =  6, /* step size small */
17321ec2d5cSBarry Smith   TAO_CONVERGED_MINF          =  7, /* F < F_min */
17421ec2d5cSBarry Smith   TAO_CONVERGED_USER          =  8, /* User defined */
17521ec2d5cSBarry Smith   /* diverged */
17621ec2d5cSBarry Smith   TAO_DIVERGED_MAXITS         = -2,
17721ec2d5cSBarry Smith   TAO_DIVERGED_NAN            = -4,
17821ec2d5cSBarry Smith   TAO_DIVERGED_MAXFCN         = -5,
17921ec2d5cSBarry Smith   TAO_DIVERGED_LS_FAILURE     = -6,
18021ec2d5cSBarry Smith   TAO_DIVERGED_TR_REDUCTION   = -7,
18121ec2d5cSBarry Smith   TAO_DIVERGED_USER           = -8, /* User defined */
18221ec2d5cSBarry Smith   /* keep going */
183e4cb33bbSBarry Smith   TAO_CONTINUE_ITERATING      =  0} TaoConvergedReason;
18421ec2d5cSBarry Smith 
185e4cb33bbSBarry Smith PETSC_EXTERN const char **TaoConvergedReasons;
18621ec2d5cSBarry Smith 
18721ec2d5cSBarry Smith PETSC_EXTERN PetscErrorCode TaoInitializePackage(void);
18821ec2d5cSBarry Smith PETSC_EXTERN PetscErrorCode TaoFinalizePackage(void);
189441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoCreate(MPI_Comm,Tao*);
190441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetFromOptions(Tao);
191441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetUp(Tao);
192b625d6c7SJed Brown PETSC_EXTERN PetscErrorCode TaoSetType(Tao,TaoType);
193b625d6c7SJed Brown PETSC_EXTERN PetscErrorCode TaoGetType(Tao,TaoType *);
194441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetApplicationContext(Tao, void*);
195441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetApplicationContext(Tao, void*);
196441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDestroy(Tao*);
19721ec2d5cSBarry Smith 
198441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetOptionsPrefix(Tao,const char []);
199441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoView(Tao, PetscViewer);
200fe2efc57SMark PETSC_EXTERN PetscErrorCode TaoViewFromOptions(Tao,PetscObject,const char[]);
20121ec2d5cSBarry Smith 
202441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSolve(Tao);
20321ec2d5cSBarry Smith 
204441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoRegister(const char [],PetscErrorCode (*)(Tao));
205441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoRegisterDestroy(void);
20621ec2d5cSBarry Smith 
207e4cb33bbSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetConvergedReason(Tao,TaoConvergedReason*);
208e4cb33bbSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetSolutionStatus(Tao, PetscInt*, PetscReal*, PetscReal*, PetscReal*, PetscReal*, TaoConvergedReason*);
209e4cb33bbSBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConvergedReason(Tao,TaoConvergedReason);
210441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInitialVector(Tao, Vec);
211441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetSolutionVector(Tao, Vec*);
212441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetGradientVector(Tao, Vec*);
213a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoSetGradientNorm(Tao, Mat);
214a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoGetGradientNorm(Tao, Mat*);
215f5766c09SAlp Dener PETSC_EXTERN PetscErrorCode TaoGetLMVMMatrix(Tao, Mat*);
216a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoLMVMSetH0(Tao, Mat);
217a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoLMVMGetH0(Tao, Mat*);
218a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoLMVMGetH0KSP(Tao, KSP*);
219b39c12a9SAlp Dener PETSC_EXTERN PetscErrorCode TaoLMVMRecycle(Tao, PetscBool);
220441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetObjectiveRoutine(Tao, PetscErrorCode(*)(Tao, Vec, PetscReal*,void*), void*);
221441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetGradientRoutine(Tao, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
222441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao, PetscErrorCode(*)(Tao, Vec, PetscReal*, Vec, void*), void*);
223ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetHessianRoutine(Tao,Mat,Mat,PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
2244a48860cSAlp Dener PETSC_EXTERN PetscErrorCode TaoSetResidualRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
225737f463aSAlp Dener PETSC_EXTERN PetscErrorCode TaoSetResidualWeights(Tao, Vec, PetscInt, PetscInt*, PetscInt*, PetscReal*);
226441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConstraintsRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
227441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
228441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
2294ffbe8acSAlp Dener PETSC_EXTERN PetscErrorCode TaoSetJacobianResidualRoutine(Tao, Mat, Mat, PetscErrorCode(*)(Tao, Vec, Mat, Mat, void*), void*);
230ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianRoutine(Tao,Mat,Mat, PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
231ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianStateRoutine(Tao,Mat,Mat,Mat, PetscErrorCode(*)(Tao,Vec, Mat, Mat, Mat, void*), void*);
23294ab13aaSBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianDesignRoutine(Tao,Mat,PetscErrorCode(*)(Tao,Vec, Mat, void*), void*);
233ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianInequalityRoutine(Tao,Mat,Mat,PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
234ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianEqualityRoutine(Tao,Mat,Mat,PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
23521ec2d5cSBarry Smith 
23683a0a5c3SToby Isaac PETSC_EXTERN PetscErrorCode TaoShellSetSolve(Tao, PetscErrorCode(*)(Tao));
23783a0a5c3SToby Isaac PETSC_EXTERN PetscErrorCode TaoShellSetContext(Tao, void*);
23883a0a5c3SToby Isaac PETSC_EXTERN PetscErrorCode TaoShellGetContext(Tao, void**);
23983a0a5c3SToby Isaac 
24025ef9dfeSBarry Smith PETSC_DEPRECATED_FUNCTION("Use TaoSetResidualRoutine() (since version 3.11)") PETSC_STATIC_INLINE PetscErrorCode TaoSetSeparableObjectiveRoutine(Tao tao, Vec res, PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx) {return TaoSetResidualRoutine(tao, res, func, ctx);}
24125ef9dfeSBarry Smith PETSC_DEPRECATED_FUNCTION("Use TaoSetResidualWeights() (since version 3.11)") PETSC_STATIC_INLINE PetscErrorCode TaoSetSeparableObjectiveWeights(Tao tao, Vec sigma_v, PetscInt n, PetscInt *rows, PetscInt *cols, PetscReal *vals) {return TaoSetResidualWeights(tao, sigma_v, n, rows, cols, vals);}
242737f463aSAlp Dener 
243441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetStateDesignIS(Tao, IS, IS);
24421ec2d5cSBarry Smith 
245441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeObjective(Tao, Vec, PetscReal*);
2464a48860cSAlp Dener PETSC_EXTERN PetscErrorCode TaoComputeResidual(Tao, Vec, Vec);
247412cdd55SHong Zhang PETSC_EXTERN PetscErrorCode TaoTestGradient(Tao,Vec,Vec);
248441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeGradient(Tao, Vec, Vec);
249441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeObjectiveAndGradient(Tao, Vec, PetscReal*, Vec);
250441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeConstraints(Tao, Vec, Vec);
251441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeInequalityConstraints(Tao, Vec, Vec);
252441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeEqualityConstraints(Tao, Vec, Vec);
253441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultComputeGradient(Tao, Vec, Vec, void*);
254441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoIsObjectiveDefined(Tao,PetscBool*);
255441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoIsGradientDefined(Tao,PetscBool*);
256441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao,PetscBool*);
25721ec2d5cSBarry Smith 
25825ef9dfeSBarry Smith PETSC_DEPRECATED_FUNCTION("Use TaoComputeResidual() (since version 3.11)") PETSC_STATIC_INLINE PetscErrorCode TaoComputeSeparableObjective(Tao tao, Vec X, Vec F) {return TaoComputeResidual(tao, X, F);}
2594a48860cSAlp Dener 
26009baa881SHong Zhang PETSC_EXTERN PetscErrorCode TaoTestHessian(Tao);
261ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeHessian(Tao, Vec, Mat, Mat);
262737f463aSAlp Dener PETSC_EXTERN PetscErrorCode TaoComputeResidualJacobian(Tao, Vec, Mat, Mat);
263ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobian(Tao, Vec, Mat, Mat);
264ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianState(Tao, Vec, Mat, Mat, Mat);
265ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianEquality(Tao, Vec, Mat, Mat);
266ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianInequality(Tao, Vec, Mat, Mat);
26794ab13aaSBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianDesign(Tao, Vec, Mat);
26821ec2d5cSBarry Smith 
269ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessian(Tao, Vec, Mat, Mat, void*);
270ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianColor(Tao, Vec, Mat, Mat, void*);
271f4c1ad5cSStefano Zampini PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianMFFD(Tao, Vec, Mat, Mat, void*);
272441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeDualVariables(Tao, Vec, Vec);
273441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetVariableBounds(Tao, Vec, Vec);
274441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetVariableBounds(Tao, Vec*, Vec*);
275441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetDualVariables(Tao, Vec*, Vec*);
276441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInequalityBounds(Tao, Vec, Vec);
277441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetInequalityBounds(Tao, Vec*, Vec*);
278441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetVariableBoundsRoutine(Tao, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
279441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeVariableBounds(Tao);
28021ec2d5cSBarry Smith 
281e52336cbSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetTolerances(Tao, PetscReal*, PetscReal*, PetscReal*);
282e52336cbSBarry Smith PETSC_EXTERN PetscErrorCode TaoSetTolerances(Tao, PetscReal, PetscReal, PetscReal);
283441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetConstraintTolerances(Tao, PetscReal*, PetscReal*);
284441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConstraintTolerances(Tao, PetscReal, PetscReal);
285441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetFunctionLowerBound(Tao, PetscReal);
286441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInitialTrustRegionRadius(Tao, PetscReal);
287441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetMaximumIterations(Tao, PetscInt);
288441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetMaximumFunctionEvaluations(Tao, PetscInt);
289441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetFunctionLowerBound(Tao, PetscReal*);
290441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetInitialTrustRegionRadius(Tao, PetscReal*);
291441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetCurrentTrustRegionRadius(Tao, PetscReal*);
292441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetMaximumIterations(Tao, PetscInt*);
293770232b9SCe Qin PETSC_EXTERN PetscErrorCode TaoGetCurrentFunctionEvaluations(Tao, PetscInt*);
294441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetMaximumFunctionEvaluations(Tao, PetscInt*);
2958931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoGetIterationNumber(Tao, PetscInt*);
2968931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoSetIterationNumber(Tao, PetscInt);
2978931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoGetTotalIterationNumber(Tao, PetscInt*);
2988931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoSetTotalIterationNumber(Tao, PetscInt);
29979f5d8caSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetResidualNorm(Tao,PetscReal*);
30079f5d8caSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetObjective(Tao,PetscReal*);
3018931d482SJason Sarich 
302441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoAppendOptionsPrefix(Tao, const char p[]);
303441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetOptionsPrefix(Tao, const char *p[]);
304441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoResetStatistics(Tao);
3058fcddce6SStefano Zampini PETSC_EXTERN PetscErrorCode TaoSetUpdate(Tao, PetscErrorCode(*)(Tao, PetscInt, void*), void*);
30621ec2d5cSBarry Smith 
307441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetKSP(Tao, KSP*);
308025e9500SJason Sarich PETSC_EXTERN PetscErrorCode TaoGetLinearSolveIterations(Tao,PetscInt *);
309235fd6e6SBarry Smith 
310235fd6e6SBarry Smith #include <petsctaolinesearch.h>
311235fd6e6SBarry Smith PETSC_EXTERN PetscErrorCode TaoLineSearchUseTaoRoutines(TaoLineSearch, Tao);
312441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetLineSearch(Tao, TaoLineSearch*);
31321ec2d5cSBarry Smith 
314ae93cb3cSJason Sarich PETSC_EXTERN PetscErrorCode TaoSetConvergenceHistory(Tao,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt,PetscBool);
315ae93cb3cSJason Sarich PETSC_EXTERN PetscErrorCode TaoGetConvergenceHistory(Tao,PetscReal**,PetscReal**,PetscReal**,PetscInt**,PetscInt*);
316441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetMonitor(Tao, PetscErrorCode (*)(Tao,void*),void *,PetscErrorCode (*)(void**));
317441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoCancelMonitors(Tao);
31898ea980cSBarry Smith PETSC_EXTERN PetscErrorCode TaoMonitorDefault(Tao, void*);
31925ef9dfeSBarry Smith PETSC_DEPRECATED_FUNCTION("Use TaoMonitorDefault() (since version 3.9)") PETSC_STATIC_INLINE PetscErrorCode TaoDefaultMonitor(Tao tao, void*ctx) {return TaoMonitorDefault(tao,ctx);}
3208d5ead36SAlp Dener PETSC_EXTERN PetscErrorCode TaoDefaultGMonitor(Tao, void*);
321441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultSMonitor(Tao, void*);
322441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultCMonitor(Tao, void*);
323441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSolutionMonitor(Tao, void*);
324737f463aSAlp Dener PETSC_EXTERN PetscErrorCode TaoResidualMonitor(Tao, void*);
325441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGradientMonitor(Tao, void*);
326441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoStepDirectionMonitor(Tao, void*);
327441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDrawSolutionMonitor(Tao, void*);
328441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDrawStepMonitor(Tao, void*);
329441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDrawGradientMonitor(Tao, void*);
330441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoAddLineSearchCounts(Tao);
33121ec2d5cSBarry Smith 
332441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultConvergenceTest(Tao,void*);
333441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConvergenceTest(Tao, PetscErrorCode (*)(Tao, void*),void *);
33421ec2d5cSBarry Smith 
335441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSQPCONSetStateDesignIS(Tao, IS, IS);
336441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoLCLSetStateDesignIS(Tao, IS, IS);
3373ecd9318SAlp Dener PETSC_EXTERN PetscErrorCode TaoMonitor(Tao, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal);
338e882e171SHong Zhang typedef struct _n_TaoMonitorDrawCtx* TaoMonitorDrawCtx;
339e882e171SHong Zhang PETSC_EXTERN PetscErrorCode TaoMonitorDrawCtxCreate(MPI_Comm,const char[],const char[],int,int,int,int,PetscInt,TaoMonitorDrawCtx*);
340e882e171SHong Zhang PETSC_EXTERN PetscErrorCode TaoMonitorDrawCtxDestroy(TaoMonitorDrawCtx*);
341737f463aSAlp Dener 
3428e85b1b3SXiang Huang PETSC_EXTERN PetscErrorCode TaoBRGNGetSubsolver(Tao,Tao *);
343a3c390cfSAlp Dener PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerObjectiveAndGradientRoutine(Tao,PetscErrorCode (*)(Tao,Vec,PetscReal*,Vec,void*),void*);
344a3c390cfSAlp Dener PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerHessianRoutine(Tao,Mat,PetscErrorCode (*)(Tao,Vec,Mat,void*),void*);
345a3c390cfSAlp Dener PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerWeight(Tao,PetscReal);
3468ac80d48SXiang Huang PETSC_EXTERN PetscErrorCode TaoBRGNSetL1SmoothEpsilon(Tao,PetscReal);
3478e85b1b3SXiang Huang PETSC_EXTERN PetscErrorCode TaoBRGNSetDictionaryMatrix(Tao,Mat);
348*6285c0a3SHansol  Suh 
349*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetMisfitSubsolver(Tao,Tao *);
350*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizationSubsolver(Tao,Tao *);
351*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetDualVector(Tao,Vec*);
352*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetSpectralPenalty(Tao,PetscReal*);
353*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetSpectralPenalty(Tao,PetscReal);
354*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoGetADMMParentTao(Tao, Tao *);
355*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetConstraintVectorRHS(Tao,Vec);
356*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerCoefficient(Tao,PetscReal);
357*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitConstraintJacobian(Tao,Mat, Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
358*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerConstraintJacobian(Tao,Mat, Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
359*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerHessianRoutine(Tao,Mat,Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
360*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerObjectiveAndGradientRoutine(Tao,PetscErrorCode (*)(Tao,Vec,PetscReal *,Vec,void*),void*);
361*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianRoutine(Tao,Mat,Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
362*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitObjectiveAndGradientRoutine(Tao,PetscErrorCode (*)(Tao,Vec,PetscReal *,Vec,void*),void*);
363*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianChangeStatus(Tao, PetscBool);
364*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegHessianChangeStatus(Tao, PetscBool);
365*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMinimumSpectralPenalty(Tao, PetscReal);
366*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerType(Tao, TaoADMMRegularizerType);
367*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizerType(Tao, TaoADMMRegularizerType*);
368*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetUpdateType(Tao, TaoADMMUpdateType);
369*6285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetUpdateType(Tao, TaoADMMUpdateType*);
37021ec2d5cSBarry Smith #endif
371