xref: /petsc/include/petsctao.h (revision 661095bbfddda9a1493a32ea0d2305a96eb189ff)
13028902dSLisandro Dalcin #ifndef PETSCTAO_H
23028902dSLisandro Dalcin #define PETSCTAO_H
321ec2d5cSBarry Smith 
4aad13602SShrirang Abhyankar #include <petscsnes.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 
376285c0a3SHansol  Suh /*E
386285c0a3SHansol  Suh      TaoADMMUpdateType - Determine spectral penalty update routine for lagrange augmented term for ADMM.
396285c0a3SHansol  Suh 
406285c0a3SHansol  Suh   Level: advanced
416285c0a3SHansol  Suh 
426285c0a3SHansol  Suh .seealso TaoADMMSetUpdateType()
436285c0a3SHansol  Suh E*/
446285c0a3SHansol  Suh typedef enum {TAO_ADMM_UPDATE_BASIC,TAO_ADMM_UPDATE_ADAPTIVE,TAO_ADMM_UPDATE_ADAPTIVE_RELAXED} TaoADMMUpdateType;
456285c0a3SHansol  Suh PETSC_EXTERN const char *const TaoADMMUpdateTypes[];
466285c0a3SHansol  Suh /*MC
476285c0a3SHansol  Suh      TAO_ADMM_UPDATE_BASIC - Use same spectral penalty set at the beginning. No update
486285c0a3SHansol  Suh 
496285c0a3SHansol  Suh   Level: advanced
506285c0a3SHansol  Suh 
516285c0a3SHansol  Suh   Note: Most basic implementation. Generally slower than adaptive or adaptive relaxed version.
526285c0a3SHansol  Suh 
536285c0a3SHansol  Suh .seealso: TaoADMMSetUpdateType(), TAO_ADMM_UPDATE_ADAPTIVE, TAO_ADMM_UPDATE_ADAPTIVE_RELAXED
546285c0a3SHansol  Suh M*/
556285c0a3SHansol  Suh 
566285c0a3SHansol  Suh /*MC
576285c0a3SHansol  Suh      TAO_ADMM_UPDATE_ADAPTIVE - Adaptively update spectral penalty
586285c0a3SHansol  Suh 
596285c0a3SHansol  Suh   Level: advanced
606285c0a3SHansol  Suh 
616285c0a3SHansol  Suh   Note: Adaptively updates spectral penalty, using both steepest descent and minimum gradient.
626285c0a3SHansol  Suh 
636285c0a3SHansol  Suh .seealso: TaoADMMSetUpdateType(), TAO_ADMM_UPDATE_BASIC, TAO_ADMM_UPDATE_ADAPTIVE_RELAXED
646285c0a3SHansol  Suh M*/
656285c0a3SHansol  Suh 
666285c0a3SHansol  Suh /*MC
676285c0a3SHansol  Suh      ADMM_UPDATE_ADAPTIVE_RELAXED - Adaptively update spectral penalty, and relaxes parameter update
686285c0a3SHansol  Suh 
696285c0a3SHansol  Suh   Level: advanced
706285c0a3SHansol  Suh 
716285c0a3SHansol  Suh   Note: With adaptive spectral penalty update, it also relaxes x vector update by a factor.
726285c0a3SHansol  Suh 
736285c0a3SHansol  Suh .seealso: TaoADMMSetUpdateType(), TAO_ADMM_UPDATE_BASIC, TAO_ADMM_UPDATE_ADAPTIVE
746285c0a3SHansol  Suh M*/
756285c0a3SHansol  Suh 
766285c0a3SHansol  Suh 
776285c0a3SHansol  Suh /*E
786285c0a3SHansol  Suh      TaoADMMRegularizerType - Determine regularizer routine - either user provided or soft threshold
796285c0a3SHansol  Suh 
806285c0a3SHansol  Suh   Level: advanced
816285c0a3SHansol  Suh 
826285c0a3SHansol  Suh .seealso TaoADMMSetRegularizerType()
836285c0a3SHansol  Suh E*/
846285c0a3SHansol  Suh typedef enum {TAO_ADMM_REGULARIZER_USER,TAO_ADMM_REGULARIZER_SOFT_THRESH} TaoADMMRegularizerType;
856285c0a3SHansol  Suh PETSC_EXTERN const char *const TaoADMMRegularizerTypes[];
866285c0a3SHansol  Suh /*MC
876285c0a3SHansol  Suh      TAO_ADMM_REGULARIZER_USER - User provided routines for regularizer part of ADMM
886285c0a3SHansol  Suh 
896285c0a3SHansol  Suh   Level: advanced
906285c0a3SHansol  Suh 
916285c0a3SHansol  Suh   Note: User needs to provided appropriate routines and type for regularizer solver
926285c0a3SHansol  Suh 
936285c0a3SHansol  Suh .seealso: TaoADMMSetRegularizerType(), TAO_ADMM_REGULARIZER_SOFT_THRESH
946285c0a3SHansol  Suh M*/
956285c0a3SHansol  Suh 
966285c0a3SHansol  Suh /*MC
976285c0a3SHansol  Suh      TAO_ADMM_REGULARIZER_SOFT_THRESH - Soft threshold to solve regularizer part of ADMM
986285c0a3SHansol  Suh 
996285c0a3SHansol  Suh   Level: advanced
1006285c0a3SHansol  Suh 
1016285c0a3SHansol  Suh   Note: Utilizes built-in SoftThreshold routines
1026285c0a3SHansol  Suh 
1036285c0a3SHansol  Suh .seealso: TaoSoftThreshold(), TaoADMMSetRegularizerObjectiveAndGradientRoutine(),
1046285c0a3SHansol  Suh           TaoADMMSetRegularizerHessianRoutine(), TaoADMMSetRegularizerType(), TAO_ADMM_REGULARIZER_USER
1056285c0a3SHansol  Suh M*/
1066285c0a3SHansol  Suh 
107*661095bbSAlp Dener /*E
108*661095bbSAlp Dener      TaoALMMType - Determine the augmented Lagrangian formulation used in the TAOALMM subproblem.
109*661095bbSAlp Dener 
110*661095bbSAlp Dener $  TAO_ALMM_CLASSIC - classic augmented Lagrangian definition including slack variables for inequality constraints
111*661095bbSAlp Dener $  TAO_ALMM_PHR     - Powell-Hestenes-Rockafellar formulation without slack variables, uses pointwise min() for inequalities
112*661095bbSAlp Dener 
113*661095bbSAlp Dener   Level: advanced
114*661095bbSAlp Dener 
115*661095bbSAlp Dener .seealso TAOALMM, TaoALMMSetType(), TaoALMMGetType()
116*661095bbSAlp Dener E*/
117*661095bbSAlp Dener typedef enum {TAO_ALMM_CLASSIC,TAO_ALMM_PHR} TaoALMMType;
118*661095bbSAlp Dener PETSC_EXTERN const char *const TaoALMMTypes[];
119*661095bbSAlp Dener 
120441846f8SBarry Smith typedef struct _p_Tao*   Tao;
1211eb8069cSJason Sarich 
1221eb8069cSJason Sarich /*J
1231eb8069cSJason Sarich         TaoType - String with the name of a TAO method
1241eb8069cSJason Sarich 
1251eb8069cSJason Sarich        Level: beginner
1261eb8069cSJason Sarich 
1271eb8069cSJason Sarich J*/
128b625d6c7SJed Brown typedef const char *TaoType;
12958417fe7SBarry Smith #define TAOLMVM     "lmvm"
13058417fe7SBarry Smith #define TAONLS      "nls"
13158417fe7SBarry Smith #define TAONTR      "ntr"
13258417fe7SBarry Smith #define TAONTL      "ntl"
13358417fe7SBarry Smith #define TAOCG       "cg"
13458417fe7SBarry Smith #define TAOTRON     "tron"
13558417fe7SBarry Smith #define TAOOWLQN    "owlqn"
13658417fe7SBarry Smith #define TAOBMRM     "bmrm"
13758417fe7SBarry Smith #define TAOBLMVM    "blmvm"
1386b591159SAlp Dener #define TAOBQNLS    "bqnls"
139ac9112b8SAlp Dener #define TAOBNCG     "bncg"
140eb910715SAlp Dener #define TAOBNLS     "bnls"
141fed79b8eSAlp Dener #define TAOBNTR     "bntr"
142c14b763aSAlp Dener #define TAOBNTL     "bntl"
143e0ed867bSAlp Dener #define TAOBQNKLS   "bqnkls"
144e0ed867bSAlp Dener #define TAOBQNKTR   "bqnktr"
145e0ed867bSAlp Dener #define TAOBQNKTL   "bqnktl"
14658417fe7SBarry Smith #define TAOBQPIP    "bqpip"
14758417fe7SBarry Smith #define TAOGPCG     "gpcg"
14858417fe7SBarry Smith #define TAONM       "nm"
14958417fe7SBarry Smith #define TAOPOUNDERS "pounders"
150737f463aSAlp Dener #define TAOBRGN     "brgn"
15158417fe7SBarry Smith #define TAOLCL      "lcl"
15258417fe7SBarry Smith #define TAOSSILS    "ssils"
15358417fe7SBarry Smith #define TAOSSFLS    "ssfls"
15458417fe7SBarry Smith #define TAOASILS    "asils"
15558417fe7SBarry Smith #define TAOASFLS    "asfls"
15658417fe7SBarry Smith #define TAOIPM      "ipm"
157aad13602SShrirang Abhyankar #define TAOPDIPM    "pdipm"
15883a0a5c3SToby Isaac #define TAOSHELL    "shell"
1596285c0a3SHansol  Suh #define TAOADMM     "admm"
160*661095bbSAlp Dener #define TAOALMM     "almm"
16158417fe7SBarry Smith 
162441846f8SBarry Smith PETSC_EXTERN PetscClassId TAO_CLASSID;
163441846f8SBarry Smith PETSC_EXTERN PetscFunctionList TaoList;
16421ec2d5cSBarry Smith 
165a35d58b8SBarry Smith /*E
166a35d58b8SBarry Smith     TaoConvergedReason - reason a TAO method was said to have converged or diverged
167a35d58b8SBarry Smith 
168a35d58b8SBarry Smith    Level: beginner
169a35d58b8SBarry Smith 
170a35d58b8SBarry Smith    The two most common reasons for divergence are
171a35d58b8SBarry Smith $   1) an incorrectly coded or computed gradient or Hessian
172a35d58b8SBarry Smith $   2) failure or lack of convergence in the linear system (in this case we recommend
173a35d58b8SBarry Smith $      testing with -pc_type lu to eliminate the linear solver as the cause of the problem).
174a35d58b8SBarry Smith 
17595452b02SPatrick Sanan    Developer Notes:
17695452b02SPatrick Sanan     this must match petsc/finclude/petsctao.h
177a35d58b8SBarry Smith 
178a35d58b8SBarry Smith        The string versions of these are in TAOConvergedReasons, if you change any value here you must
179a35d58b8SBarry Smith      also adjust that array.
180a35d58b8SBarry Smith 
181a35d58b8SBarry Smith .seealso: TAOSolve(), TaoGetConvergedReason(), KSPConvergedReason, SNESConvergedReason, TSConvergedReason
182a35d58b8SBarry Smith E*/
18321ec2d5cSBarry Smith typedef enum {/* converged */
18421ec2d5cSBarry Smith   TAO_CONVERGED_GATOL         =  3, /* ||g(X)|| < gatol */
18521ec2d5cSBarry Smith   TAO_CONVERGED_GRTOL         =  4, /* ||g(X)|| / f(X)  < grtol */
18621ec2d5cSBarry Smith   TAO_CONVERGED_GTTOL         =  5, /* ||g(X)|| / ||g(X0)|| < gttol */
18721ec2d5cSBarry Smith   TAO_CONVERGED_STEPTOL       =  6, /* step size small */
18821ec2d5cSBarry Smith   TAO_CONVERGED_MINF          =  7, /* F < F_min */
18921ec2d5cSBarry Smith   TAO_CONVERGED_USER          =  8, /* User defined */
19021ec2d5cSBarry Smith   /* diverged */
19121ec2d5cSBarry Smith   TAO_DIVERGED_MAXITS         = -2,
19221ec2d5cSBarry Smith   TAO_DIVERGED_NAN            = -4,
19321ec2d5cSBarry Smith   TAO_DIVERGED_MAXFCN         = -5,
19421ec2d5cSBarry Smith   TAO_DIVERGED_LS_FAILURE     = -6,
19521ec2d5cSBarry Smith   TAO_DIVERGED_TR_REDUCTION   = -7,
19621ec2d5cSBarry Smith   TAO_DIVERGED_USER           = -8, /* User defined */
19721ec2d5cSBarry Smith   /* keep going */
198e4cb33bbSBarry Smith   TAO_CONTINUE_ITERATING      =  0} TaoConvergedReason;
19921ec2d5cSBarry Smith 
200e4cb33bbSBarry Smith PETSC_EXTERN const char **TaoConvergedReasons;
20121ec2d5cSBarry Smith 
20221ec2d5cSBarry Smith PETSC_EXTERN PetscErrorCode TaoInitializePackage(void);
20321ec2d5cSBarry Smith PETSC_EXTERN PetscErrorCode TaoFinalizePackage(void);
204441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoCreate(MPI_Comm,Tao*);
205441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetFromOptions(Tao);
206441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetUp(Tao);
207b625d6c7SJed Brown PETSC_EXTERN PetscErrorCode TaoSetType(Tao,TaoType);
208b625d6c7SJed Brown PETSC_EXTERN PetscErrorCode TaoGetType(Tao,TaoType *);
209441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetApplicationContext(Tao, void*);
210441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetApplicationContext(Tao, void*);
211441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDestroy(Tao*);
21221ec2d5cSBarry Smith 
213441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetOptionsPrefix(Tao,const char []);
214441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoView(Tao, PetscViewer);
215fe2efc57SMark PETSC_EXTERN PetscErrorCode TaoViewFromOptions(Tao,PetscObject,const char[]);
21621ec2d5cSBarry Smith 
217441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSolve(Tao);
21821ec2d5cSBarry Smith 
219441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoRegister(const char [],PetscErrorCode (*)(Tao));
220441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoRegisterDestroy(void);
22121ec2d5cSBarry Smith 
222e4cb33bbSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetConvergedReason(Tao,TaoConvergedReason*);
223e4cb33bbSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetSolutionStatus(Tao, PetscInt*, PetscReal*, PetscReal*, PetscReal*, PetscReal*, TaoConvergedReason*);
224e4cb33bbSBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConvergedReason(Tao,TaoConvergedReason);
225441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInitialVector(Tao, Vec);
226441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetSolutionVector(Tao, Vec*);
227441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetGradientVector(Tao, Vec*);
228a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoSetGradientNorm(Tao, Mat);
229a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoGetGradientNorm(Tao, Mat*);
230414d97d3SAlp Dener PETSC_EXTERN PetscErrorCode TaoSetLMVMMatrix(Tao, Mat);
231f5766c09SAlp Dener PETSC_EXTERN PetscErrorCode TaoGetLMVMMatrix(Tao, Mat*);
232414d97d3SAlp Dener PETSC_EXTERN PetscErrorCode TaoSetRecycleHistory(Tao, PetscBool);
233414d97d3SAlp Dener PETSC_EXTERN PetscErrorCode TaoGetRecycleHistory(Tao, PetscBool*);
234a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoLMVMSetH0(Tao, Mat);
235a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoLMVMGetH0(Tao, Mat*);
236a9603a14SPatrick Farrell PETSC_EXTERN PetscErrorCode TaoLMVMGetH0KSP(Tao, KSP*);
237b39c12a9SAlp Dener PETSC_EXTERN PetscErrorCode TaoLMVMRecycle(Tao, PetscBool);
238441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetObjectiveRoutine(Tao, PetscErrorCode(*)(Tao, Vec, PetscReal*,void*), void*);
239441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetGradientRoutine(Tao, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
240441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao, PetscErrorCode(*)(Tao, Vec, PetscReal*, Vec, void*), void*);
241ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetHessianRoutine(Tao,Mat,Mat,PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
2424a48860cSAlp Dener PETSC_EXTERN PetscErrorCode TaoSetResidualRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
243737f463aSAlp Dener PETSC_EXTERN PetscErrorCode TaoSetResidualWeights(Tao, Vec, PetscInt, PetscInt*, PetscInt*, PetscReal*);
244441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConstraintsRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
245441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
246441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao, Vec, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
2474ffbe8acSAlp Dener PETSC_EXTERN PetscErrorCode TaoSetJacobianResidualRoutine(Tao, Mat, Mat, PetscErrorCode(*)(Tao, Vec, Mat, Mat, void*), void*);
248ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianRoutine(Tao,Mat,Mat, PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
249ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianStateRoutine(Tao,Mat,Mat,Mat, PetscErrorCode(*)(Tao,Vec, Mat, Mat, Mat, void*), void*);
25094ab13aaSBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianDesignRoutine(Tao,Mat,PetscErrorCode(*)(Tao,Vec, Mat, void*), void*);
251ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianInequalityRoutine(Tao,Mat,Mat,PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
252ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetJacobianEqualityRoutine(Tao,Mat,Mat,PetscErrorCode(*)(Tao,Vec, Mat, Mat, void*), void*);
25321ec2d5cSBarry Smith 
25483a0a5c3SToby Isaac PETSC_EXTERN PetscErrorCode TaoShellSetSolve(Tao, PetscErrorCode(*)(Tao));
25583a0a5c3SToby Isaac PETSC_EXTERN PetscErrorCode TaoShellSetContext(Tao, void*);
25683a0a5c3SToby Isaac PETSC_EXTERN PetscErrorCode TaoShellGetContext(Tao, void**);
25783a0a5c3SToby Isaac 
25825ef9dfeSBarry 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);}
25925ef9dfeSBarry 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);}
260737f463aSAlp Dener 
261441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetStateDesignIS(Tao, IS, IS);
26221ec2d5cSBarry Smith 
263441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeObjective(Tao, Vec, PetscReal*);
2644a48860cSAlp Dener PETSC_EXTERN PetscErrorCode TaoComputeResidual(Tao, Vec, Vec);
265412cdd55SHong Zhang PETSC_EXTERN PetscErrorCode TaoTestGradient(Tao,Vec,Vec);
266441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeGradient(Tao, Vec, Vec);
267441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeObjectiveAndGradient(Tao, Vec, PetscReal*, Vec);
268441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeConstraints(Tao, Vec, Vec);
269441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeInequalityConstraints(Tao, Vec, Vec);
270441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeEqualityConstraints(Tao, Vec, Vec);
271441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultComputeGradient(Tao, Vec, Vec, void*);
272441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoIsObjectiveDefined(Tao,PetscBool*);
273441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoIsGradientDefined(Tao,PetscBool*);
274441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao,PetscBool*);
27521ec2d5cSBarry Smith 
27625ef9dfeSBarry 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);}
2774a48860cSAlp Dener 
27809baa881SHong Zhang PETSC_EXTERN PetscErrorCode TaoTestHessian(Tao);
279ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeHessian(Tao, Vec, Mat, Mat);
280737f463aSAlp Dener PETSC_EXTERN PetscErrorCode TaoComputeResidualJacobian(Tao, Vec, Mat, Mat);
281ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobian(Tao, Vec, Mat, Mat);
282ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianState(Tao, Vec, Mat, Mat, Mat);
283ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianEquality(Tao, Vec, Mat, Mat);
284ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianInequality(Tao, Vec, Mat, Mat);
28594ab13aaSBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeJacobianDesign(Tao, Vec, Mat);
28621ec2d5cSBarry Smith 
287ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessian(Tao, Vec, Mat, Mat, void*);
288ffad9901SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianColor(Tao, Vec, Mat, Mat, void*);
289f4c1ad5cSStefano Zampini PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianMFFD(Tao, Vec, Mat, Mat, void*);
290441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeDualVariables(Tao, Vec, Vec);
291441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetVariableBounds(Tao, Vec, Vec);
292441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetVariableBounds(Tao, Vec*, Vec*);
293441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetDualVariables(Tao, Vec*, Vec*);
294441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInequalityBounds(Tao, Vec, Vec);
295441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetInequalityBounds(Tao, Vec*, Vec*);
296441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetVariableBoundsRoutine(Tao, PetscErrorCode(*)(Tao, Vec, Vec, void*), void*);
297441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoComputeVariableBounds(Tao);
29821ec2d5cSBarry Smith 
299e52336cbSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetTolerances(Tao, PetscReal*, PetscReal*, PetscReal*);
300e52336cbSBarry Smith PETSC_EXTERN PetscErrorCode TaoSetTolerances(Tao, PetscReal, PetscReal, PetscReal);
301441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetConstraintTolerances(Tao, PetscReal*, PetscReal*);
302441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConstraintTolerances(Tao, PetscReal, PetscReal);
303441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetFunctionLowerBound(Tao, PetscReal);
304441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetInitialTrustRegionRadius(Tao, PetscReal);
305441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetMaximumIterations(Tao, PetscInt);
306441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetMaximumFunctionEvaluations(Tao, PetscInt);
307441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetFunctionLowerBound(Tao, PetscReal*);
308441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetInitialTrustRegionRadius(Tao, PetscReal*);
309441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetCurrentTrustRegionRadius(Tao, PetscReal*);
310441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetMaximumIterations(Tao, PetscInt*);
311770232b9SCe Qin PETSC_EXTERN PetscErrorCode TaoGetCurrentFunctionEvaluations(Tao, PetscInt*);
312441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetMaximumFunctionEvaluations(Tao, PetscInt*);
3138931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoGetIterationNumber(Tao, PetscInt*);
3148931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoSetIterationNumber(Tao, PetscInt);
3158931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoGetTotalIterationNumber(Tao, PetscInt*);
3168931d482SJason Sarich PETSC_EXTERN PetscErrorCode TaoSetTotalIterationNumber(Tao, PetscInt);
31779f5d8caSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetResidualNorm(Tao,PetscReal*);
31879f5d8caSBarry Smith PETSC_EXTERN PetscErrorCode TaoGetObjective(Tao,PetscReal*);
3198931d482SJason Sarich 
320441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoAppendOptionsPrefix(Tao, const char p[]);
321441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetOptionsPrefix(Tao, const char *p[]);
322441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoResetStatistics(Tao);
3238fcddce6SStefano Zampini PETSC_EXTERN PetscErrorCode TaoSetUpdate(Tao, PetscErrorCode(*)(Tao, PetscInt, void*), void*);
32421ec2d5cSBarry Smith 
325441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetKSP(Tao, KSP*);
326025e9500SJason Sarich PETSC_EXTERN PetscErrorCode TaoGetLinearSolveIterations(Tao,PetscInt *);
327235fd6e6SBarry Smith 
328235fd6e6SBarry Smith #include <petsctaolinesearch.h>
329235fd6e6SBarry Smith PETSC_EXTERN PetscErrorCode TaoLineSearchUseTaoRoutines(TaoLineSearch, Tao);
330441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGetLineSearch(Tao, TaoLineSearch*);
33121ec2d5cSBarry Smith 
332ae93cb3cSJason Sarich PETSC_EXTERN PetscErrorCode TaoSetConvergenceHistory(Tao,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt,PetscBool);
333ae93cb3cSJason Sarich PETSC_EXTERN PetscErrorCode TaoGetConvergenceHistory(Tao,PetscReal**,PetscReal**,PetscReal**,PetscInt**,PetscInt*);
334441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetMonitor(Tao, PetscErrorCode (*)(Tao,void*),void *,PetscErrorCode (*)(void**));
335441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoCancelMonitors(Tao);
33698ea980cSBarry Smith PETSC_EXTERN PetscErrorCode TaoMonitorDefault(Tao, void*);
33725ef9dfeSBarry Smith PETSC_DEPRECATED_FUNCTION("Use TaoMonitorDefault() (since version 3.9)") PETSC_STATIC_INLINE PetscErrorCode TaoDefaultMonitor(Tao tao, void*ctx) {return TaoMonitorDefault(tao,ctx);}
3388d5ead36SAlp Dener PETSC_EXTERN PetscErrorCode TaoDefaultGMonitor(Tao, void*);
339441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultSMonitor(Tao, void*);
340441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultCMonitor(Tao, void*);
341441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSolutionMonitor(Tao, void*);
342737f463aSAlp Dener PETSC_EXTERN PetscErrorCode TaoResidualMonitor(Tao, void*);
343441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoGradientMonitor(Tao, void*);
344441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoStepDirectionMonitor(Tao, void*);
345441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDrawSolutionMonitor(Tao, void*);
346441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDrawStepMonitor(Tao, void*);
347441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDrawGradientMonitor(Tao, void*);
348441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoAddLineSearchCounts(Tao);
34921ec2d5cSBarry Smith 
350441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoDefaultConvergenceTest(Tao,void*);
351441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoSetConvergenceTest(Tao, PetscErrorCode (*)(Tao, void*),void *);
35221ec2d5cSBarry Smith 
353441846f8SBarry Smith PETSC_EXTERN PetscErrorCode TaoLCLSetStateDesignIS(Tao, IS, IS);
3543ecd9318SAlp Dener PETSC_EXTERN PetscErrorCode TaoMonitor(Tao, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal);
355e882e171SHong Zhang typedef struct _n_TaoMonitorDrawCtx* TaoMonitorDrawCtx;
356e882e171SHong Zhang PETSC_EXTERN PetscErrorCode TaoMonitorDrawCtxCreate(MPI_Comm,const char[],const char[],int,int,int,int,PetscInt,TaoMonitorDrawCtx*);
357e882e171SHong Zhang PETSC_EXTERN PetscErrorCode TaoMonitorDrawCtxDestroy(TaoMonitorDrawCtx*);
358737f463aSAlp Dener 
3598e85b1b3SXiang Huang PETSC_EXTERN PetscErrorCode TaoBRGNGetSubsolver(Tao,Tao *);
360a3c390cfSAlp Dener PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerObjectiveAndGradientRoutine(Tao,PetscErrorCode (*)(Tao,Vec,PetscReal*,Vec,void*),void*);
361a3c390cfSAlp Dener PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerHessianRoutine(Tao,Mat,PetscErrorCode (*)(Tao,Vec,Mat,void*),void*);
362a3c390cfSAlp Dener PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerWeight(Tao,PetscReal);
3638ac80d48SXiang Huang PETSC_EXTERN PetscErrorCode TaoBRGNSetL1SmoothEpsilon(Tao,PetscReal);
3648e85b1b3SXiang Huang PETSC_EXTERN PetscErrorCode TaoBRGNSetDictionaryMatrix(Tao,Mat);
365cd1c4666STristan Konolige PETSC_EXTERN PetscErrorCode TaoBRGNGetDampingVector(Tao,Vec *);
3666285c0a3SHansol  Suh 
3676285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetMisfitSubsolver(Tao,Tao *);
3686285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizationSubsolver(Tao,Tao *);
3696285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetDualVector(Tao,Vec*);
3706285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetSpectralPenalty(Tao,PetscReal*);
3716285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetSpectralPenalty(Tao,PetscReal);
3726285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoGetADMMParentTao(Tao, Tao *);
3736285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetConstraintVectorRHS(Tao,Vec);
3746285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerCoefficient(Tao,PetscReal);
3756285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitConstraintJacobian(Tao,Mat, Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
3766285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerConstraintJacobian(Tao,Mat, Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
3776285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerHessianRoutine(Tao,Mat,Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
3786285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerObjectiveAndGradientRoutine(Tao,PetscErrorCode (*)(Tao,Vec,PetscReal *,Vec,void*),void*);
3796285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianRoutine(Tao,Mat,Mat,PetscErrorCode (*)(Tao,Vec,Mat,Mat,void*),void*);
3806285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitObjectiveAndGradientRoutine(Tao,PetscErrorCode (*)(Tao,Vec,PetscReal *,Vec,void*),void*);
3816285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianChangeStatus(Tao, PetscBool);
3826285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegHessianChangeStatus(Tao, PetscBool);
3836285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetMinimumSpectralPenalty(Tao, PetscReal);
3846285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerType(Tao, TaoADMMRegularizerType);
3856285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizerType(Tao, TaoADMMRegularizerType*);
3866285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMSetUpdateType(Tao, TaoADMMUpdateType);
3876285c0a3SHansol  Suh PETSC_EXTERN PetscErrorCode TaoADMMGetUpdateType(Tao, TaoADMMUpdateType*);
388*661095bbSAlp Dener 
389*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMGetType(Tao, TaoALMMType*);
390*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMSetType(Tao, TaoALMMType);
391*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMGetSubsolver(Tao, Tao*);
392*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMSetSubsolver(Tao, Tao);
393*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMGetMultipliers(Tao, Vec*);
394*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMSetMultipliers(Tao, Vec);
395*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMGetPrimalIS(Tao, IS*, IS*);
396*661095bbSAlp Dener PETSC_EXTERN PetscErrorCode TaoALMMGetDualIS(Tao, IS*, IS*);
39721ec2d5cSBarry Smith #endif
398