1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay
3a7e14dcfSSatish Balay /*@
465ba42b6SBarry Smith TaoSetVariableBounds - Sets the upper and lower bounds for the optimization problem
5a7e14dcfSSatish Balay
620f4b53cSBarry Smith Logically Collective
7a7e14dcfSSatish Balay
8a7e14dcfSSatish Balay Input Parameters:
947450a7bSBarry Smith + tao - the `Tao` context
10a7e14dcfSSatish Balay . XL - vector of lower bounds
11a7e14dcfSSatish Balay - XU - vector of upper bounds
12a7e14dcfSSatish Balay
13a7e14dcfSSatish Balay Level: beginner
14a7e14dcfSSatish Balay
151cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetVariableBounds()`
16a7e14dcfSSatish Balay @*/
TaoSetVariableBounds(Tao tao,Vec XL,Vec XU)17d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU)
18d71ae5a4SJacob Faibussowitsch {
19a7e14dcfSSatish Balay PetscFunctionBegin;
20441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
217721a36fSStefano Zampini if (XL) PetscValidHeaderSpecific(XL, VEC_CLASSID, 2);
227721a36fSStefano Zampini if (XU) PetscValidHeaderSpecific(XU, VEC_CLASSID, 3);
239566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)XL));
249566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)XU));
259566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->XL));
269566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->XU));
27a7e14dcfSSatish Balay tao->XL = XL;
28a7e14dcfSSatish Balay tao->XU = XU;
297721a36fSStefano Zampini tao->bounded = (PetscBool)(XL || XU);
303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
31a7e14dcfSSatish Balay }
3245cf516eSBarry Smith
33a7e14dcfSSatish Balay /*@C
3465ba42b6SBarry Smith TaoSetVariableBoundsRoutine - Sets a function to be used to compute lower and upper variable bounds for the optimization
35a7e14dcfSSatish Balay
3620f4b53cSBarry Smith Logically Collective
37a7e14dcfSSatish Balay
38a7e14dcfSSatish Balay Input Parameters:
3947450a7bSBarry Smith + tao - the `Tao` context
40a7e14dcfSSatish Balay . func - the bounds computation routine
4147450a7bSBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be `NULL`)
42a7e14dcfSSatish Balay
4320f4b53cSBarry Smith Calling sequence of `func`:
4447450a7bSBarry Smith + tao - the `Tao` solver
45a7e14dcfSSatish Balay . xl - vector of lower bounds
46a7e14dcfSSatish Balay . xu - vector of upper bounds
47a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
48a7e14dcfSSatish Balay
49a7e14dcfSSatish Balay Level: beginner
50a7e14dcfSSatish Balay
5165ba42b6SBarry Smith Note:
5265ba42b6SBarry Smith The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`.
53a7e14dcfSSatish Balay
541cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
55a7e14dcfSSatish Balay @*/
TaoSetVariableBoundsRoutine(Tao tao,PetscErrorCode (* func)(Tao tao,Vec xl,Vec xu,PetscCtx ctx),PetscCtx ctx)56*2a8381b2SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao tao, Vec xl, Vec xu, PetscCtx ctx), PetscCtx ctx)
57d71ae5a4SJacob Faibussowitsch {
58a7e14dcfSSatish Balay PetscFunctionBegin;
59441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
60a7e14dcfSSatish Balay tao->user_boundsP = ctx;
61a7e14dcfSSatish Balay tao->ops->computebounds = func;
627721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE;
633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
64a7e14dcfSSatish Balay }
65a7e14dcfSSatish Balay
667721a36fSStefano Zampini /*@
6765ba42b6SBarry Smith TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()`
687721a36fSStefano Zampini
6920f4b53cSBarry Smith Not Collective
707721a36fSStefano Zampini
717721a36fSStefano Zampini Input Parameter:
7247450a7bSBarry Smith . tao - the `Tao` context
737721a36fSStefano Zampini
74d5b43468SJose E. Roman Output Parameters:
757721a36fSStefano Zampini + XL - vector of lower bounds
767721a36fSStefano Zampini - XU - vector of upper bounds
777721a36fSStefano Zampini
787721a36fSStefano Zampini Level: beginner
797721a36fSStefano Zampini
801cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
817721a36fSStefano Zampini @*/
TaoGetVariableBounds(Tao tao,Vec * XL,Vec * XU)82d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
83d71ae5a4SJacob Faibussowitsch {
84a7e14dcfSSatish Balay PetscFunctionBegin;
85441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
867721a36fSStefano Zampini if (XL) *XL = tao->XL;
877721a36fSStefano Zampini if (XU) *XU = tao->XU;
883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
89a7e14dcfSSatish Balay }
90a7e14dcfSSatish Balay
91cc4c1da9SBarry Smith /*@
92a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the
9365ba42b6SBarry Smith routine set by `TaoSetVariableBoundsRoutine()`.
94a7e14dcfSSatish Balay
95c3339decSBarry Smith Collective
96a7e14dcfSSatish Balay
977721a36fSStefano Zampini Input Parameter:
9847450a7bSBarry Smith . tao - the `Tao` context
99a7e14dcfSSatish Balay
100a7e14dcfSSatish Balay Level: developer
101a7e14dcfSSatish Balay
1021cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()`
103a7e14dcfSSatish Balay @*/
TaoComputeVariableBounds(Tao tao)104d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao)
105d71ae5a4SJacob Faibussowitsch {
106a7e14dcfSSatish Balay PetscFunctionBegin;
107441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
10876be6f4fSStefano Zampini if (tao->ops->computebounds) {
10976be6f4fSStefano Zampini if (!tao->XL) {
1109566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL));
1119566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
11276be6f4fSStefano Zampini }
11376be6f4fSStefano Zampini if (!tao->XU) {
1149566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU));
1159566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY));
116a7e14dcfSSatish Balay }
117792fecdfSBarry Smith PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP));
1187721a36fSStefano Zampini }
1193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
120a7e14dcfSSatish Balay }
121a7e14dcfSSatish Balay
122a7e14dcfSSatish Balay /*@
123a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds
124a7e14dcfSSatish Balay
12520f4b53cSBarry Smith Logically Collective
126a7e14dcfSSatish Balay
127a7e14dcfSSatish Balay Input Parameters:
12847450a7bSBarry Smith + tao - the `Tao` context
129a7e14dcfSSatish Balay . IL - vector of lower bounds
130a7e14dcfSSatish Balay - IU - vector of upper bounds
131a7e14dcfSSatish Balay
132a7e14dcfSSatish Balay Level: beginner
133a7e14dcfSSatish Balay
1341cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
135a7e14dcfSSatish Balay @*/
TaoSetInequalityBounds(Tao tao,Vec IL,Vec IU)136d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
137d71ae5a4SJacob Faibussowitsch {
138a7e14dcfSSatish Balay PetscFunctionBegin;
139441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1407721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2);
1417721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3);
1429566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL));
1439566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU));
1449566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL));
1459566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU));
146a7e14dcfSSatish Balay tao->IL = IL;
147a7e14dcfSSatish Balay tao->IU = IU;
1487721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU);
1493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
150a7e14dcfSSatish Balay }
151a7e14dcfSSatish Balay
1527721a36fSStefano Zampini /*@
15365ba42b6SBarry Smith TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()`
1547721a36fSStefano Zampini
15520f4b53cSBarry Smith Logically Collective
1567721a36fSStefano Zampini
1577721a36fSStefano Zampini Input Parameter:
15847450a7bSBarry Smith . tao - the `Tao` context
1597721a36fSStefano Zampini
1607721a36fSStefano Zampini Output Parameters:
1617721a36fSStefano Zampini + IL - vector of lower bounds
1627721a36fSStefano Zampini - IU - vector of upper bounds
1637721a36fSStefano Zampini
1647721a36fSStefano Zampini Level: beginner
1657721a36fSStefano Zampini
1661cc06b55SBarry Smith .seealso: [](ch_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1677721a36fSStefano Zampini @*/
TaoGetInequalityBounds(Tao tao,Vec * IL,Vec * IU)168d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
169d71ae5a4SJacob Faibussowitsch {
170a7e14dcfSSatish Balay PetscFunctionBegin;
171441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1727721a36fSStefano Zampini if (IL) *IL = tao->IL;
1737721a36fSStefano Zampini if (IU) *IU = tao->IU;
1743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
175a7e14dcfSSatish Balay }
176a7e14dcfSSatish Balay
177cc4c1da9SBarry Smith /*@
178a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the
17965ba42b6SBarry Smith routine set by `TaoSetConstraintsRoutine()`.
180a7e14dcfSSatish Balay
181c3339decSBarry Smith Collective
182a7e14dcfSSatish Balay
183a7e14dcfSSatish Balay Input Parameters:
18420f4b53cSBarry Smith + tao - the `Tao` context
18520f4b53cSBarry Smith - X - location to evaluate the constraints
18620f4b53cSBarry Smith
18720f4b53cSBarry Smith Output Parameter:
18820f4b53cSBarry Smith . C - the constraints
189a7e14dcfSSatish Balay
190a7e14dcfSSatish Balay Level: developer
191a7e14dcfSSatish Balay
1921cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
193a7e14dcfSSatish Balay @*/
TaoComputeConstraints(Tao tao,Vec X,Vec C)194d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
195d71ae5a4SJacob Faibussowitsch {
196a7e14dcfSSatish Balay PetscFunctionBegin;
197441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
198a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
199064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C, VEC_CLASSID, 3);
200a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2);
201a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, C, 3);
2029566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, C, NULL));
203792fecdfSBarry Smith PetscCallBack("Tao callback constraints", (*tao->ops->computeconstraints)(tao, X, C, tao->user_conP));
2049566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, C, NULL));
205a7e14dcfSSatish Balay tao->nconstraints++;
2063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
207a7e14dcfSSatish Balay }
208a7e14dcfSSatish Balay
209a7e14dcfSSatish Balay /*@C
2101cc06b55SBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details
211a7e14dcfSSatish Balay
21220f4b53cSBarry Smith Logically Collective
213a7e14dcfSSatish Balay
214a7e14dcfSSatish Balay Input Parameters:
21547450a7bSBarry Smith + tao - the `Tao` context
216a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation
217a7e14dcfSSatish Balay . func - the bounds computation routine
21820f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be `NULL`)
219a7e14dcfSSatish Balay
22020f4b53cSBarry Smith Calling sequence of `func`:
22147450a7bSBarry Smith + tao - the `Tao` solver
222a7e14dcfSSatish Balay . x - point to evaluate constraints
22347450a7bSBarry Smith . c - vector constraints evaluated at `x`
224a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
225a7e14dcfSSatish Balay
226a7e14dcfSSatish Balay Level: intermediate
227a7e14dcfSSatish Balay
2281cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
229a7e14dcfSSatish Balay @*/
TaoSetConstraintsRoutine(Tao tao,Vec c,PetscErrorCode (* func)(Tao tao,Vec x,Vec c,PetscCtx ctx),PetscCtx ctx)230*2a8381b2SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao tao, Vec x, Vec c, PetscCtx ctx), PetscCtx ctx)
231d71ae5a4SJacob Faibussowitsch {
232a7e14dcfSSatish Balay PetscFunctionBegin;
233441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2347721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c, VEC_CLASSID, 2);
2359566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c));
2369566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints));
2377721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE;
238a7e14dcfSSatish Balay tao->constraints = c;
239a7e14dcfSSatish Balay tao->user_conP = ctx;
240a7e14dcfSSatish Balay tao->ops->computeconstraints = func;
2413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
242a7e14dcfSSatish Balay }
243a7e14dcfSSatish Balay
244a7e14dcfSSatish Balay /*@
245a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
246a7e14dcfSSatish Balay of the variables
247a7e14dcfSSatish Balay
248c3339decSBarry Smith Collective
249a7e14dcfSSatish Balay
250f899ff85SJose E. Roman Input Parameter:
25147450a7bSBarry Smith . tao - the `Tao` context
252a7e14dcfSSatish Balay
253d8d19677SJose E. Roman Output Parameters:
254a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
255a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
256a7e14dcfSSatish Balay
257a7e14dcfSSatish Balay Level: advanced
258a7e14dcfSSatish Balay
259a7e14dcfSSatish Balay Note:
260a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling
26120f4b53cSBarry Smith this routine after using an unconstrained solver, `DL` and `DU` are set to all
262a7e14dcfSSatish Balay zeros.
263a7e14dcfSSatish Balay
2641cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()`
265a7e14dcfSSatish Balay @*/
TaoComputeDualVariables(Tao tao,Vec DL,Vec DU)266d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
267d71ae5a4SJacob Faibussowitsch {
268a7e14dcfSSatish Balay PetscFunctionBegin;
269441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
270a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL, VEC_CLASSID, 2);
271064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU, VEC_CLASSID, 3);
272a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DL, 2);
273a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DU, 3);
274a7e14dcfSSatish Balay if (tao->ops->computedual) {
275dbbe0bcdSBarry Smith PetscUseTypeMethod(tao, computedual, DL, DU);
276a7e14dcfSSatish Balay } else {
2779566063dSJacob Faibussowitsch PetscCall(VecSet(DL, 0.0));
2789566063dSJacob Faibussowitsch PetscCall(VecSet(DU, 0.0));
279a7e14dcfSSatish Balay }
2803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
281a7e14dcfSSatish Balay }
282a7e14dcfSSatish Balay
283a7e14dcfSSatish Balay /*@
28465ba42b6SBarry Smith TaoGetDualVariables - Gets the dual vectors
285a7e14dcfSSatish Balay
286c3339decSBarry Smith Collective
287a7e14dcfSSatish Balay
288f899ff85SJose E. Roman Input Parameter:
28947450a7bSBarry Smith . tao - the `Tao` context
290a7e14dcfSSatish Balay
291d8d19677SJose E. Roman Output Parameters:
292a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
293a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
294a7e14dcfSSatish Balay
295a7e14dcfSSatish Balay Level: advanced
296a7e14dcfSSatish Balay
2971cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoComputeDualVariables()`
298a7e14dcfSSatish Balay @*/
TaoGetDualVariables(Tao tao,Vec * DE,Vec * DI)299d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
300d71ae5a4SJacob Faibussowitsch {
301a7e14dcfSSatish Balay PetscFunctionBegin;
302441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3037721a36fSStefano Zampini if (DE) *DE = tao->DE;
3047721a36fSStefano Zampini if (DI) *DI = tao->DI;
3053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
306a7e14dcfSSatish Balay }
307a7e14dcfSSatish Balay
308a7e14dcfSSatish Balay /*@C
3091cc06b55SBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details
310a7e14dcfSSatish Balay
31120f4b53cSBarry Smith Logically Collective
312a7e14dcfSSatish Balay
313a7e14dcfSSatish Balay Input Parameters:
31447450a7bSBarry Smith + tao - the `Tao` context
315a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation
316a7e14dcfSSatish Balay . func - the bounds computation routine
31720f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be `NULL`)
318a7e14dcfSSatish Balay
31920f4b53cSBarry Smith Calling sequence of `func`:
32047450a7bSBarry Smith + tao - the `Tao` solver
321a7e14dcfSSatish Balay . x - point to evaluate equality constraints
322a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x
323a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
324a7e14dcfSSatish Balay
325a7e14dcfSSatish Balay Level: intermediate
326a7e14dcfSSatish Balay
3271cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
328a7e14dcfSSatish Balay @*/
TaoSetEqualityConstraintsRoutine(Tao tao,Vec ce,PetscErrorCode (* func)(Tao tao,Vec x,Vec ce,PetscCtx ctx),PetscCtx ctx)329*2a8381b2SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao tao, Vec x, Vec ce, PetscCtx ctx), PetscCtx ctx)
330d71ae5a4SJacob Faibussowitsch {
331a7e14dcfSSatish Balay PetscFunctionBegin;
332441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3337721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2);
3349566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce));
3359566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality));
3367721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
337a7e14dcfSSatish Balay tao->constraints_equality = ce;
338a7e14dcfSSatish Balay tao->user_con_equalityP = ctx;
339a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func;
3403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
341a7e14dcfSSatish Balay }
342a7e14dcfSSatish Balay
343a7e14dcfSSatish Balay /*@C
3441b4e8d38Spaul.kuehner TaoGetEqualityConstraintsRoutine - Gets the function used to compute equality constraints.
3451b4e8d38Spaul.kuehner
3461b4e8d38Spaul.kuehner Not Collective
3471b4e8d38Spaul.kuehner
3481b4e8d38Spaul.kuehner Input Parameter:
3491b4e8d38Spaul.kuehner . tao - the `Tao` context
3501b4e8d38Spaul.kuehner
3511b4e8d38Spaul.kuehner Output Parameters:
3521b4e8d38Spaul.kuehner + ci - the vector to internally hold the constraint computation
3531b4e8d38Spaul.kuehner . func - the bounds computation routine
3541b4e8d38Spaul.kuehner - ctx - the (optional) user-defined context
3551b4e8d38Spaul.kuehner
3561b4e8d38Spaul.kuehner Calling sequence of `func`:
3571b4e8d38Spaul.kuehner + tao - the `Tao` solver
3581b4e8d38Spaul.kuehner . x - point to evaluate equality constraints
3591b4e8d38Spaul.kuehner . ci - vector of equality constraints evaluated at x
3601b4e8d38Spaul.kuehner - ctx - the (optional) user-defined function context
3611b4e8d38Spaul.kuehner
3621b4e8d38Spaul.kuehner Level: intermediate
3631b4e8d38Spaul.kuehner
3641b4e8d38Spaul.kuehner .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetHessian()`, `TaoGetObjectiveAndGradient()`, `TaoGetInequalityConstraintsRoutine()`
3651b4e8d38Spaul.kuehner @*/
TaoGetEqualityConstraintsRoutine(Tao tao,Vec * ci,PetscErrorCode (** func)(Tao tao,Vec x,Vec ci,PetscCtx ctx),PetscCtxRt ctx)366*2a8381b2SBarry Smith PetscErrorCode TaoGetEqualityConstraintsRoutine(Tao tao, Vec *ci, PetscErrorCode (**func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtxRt ctx)
3671b4e8d38Spaul.kuehner {
3681b4e8d38Spaul.kuehner PetscFunctionBegin;
3691b4e8d38Spaul.kuehner PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3701b4e8d38Spaul.kuehner if (ci) *ci = tao->constraints_equality;
3711b4e8d38Spaul.kuehner if (func) *func = tao->ops->computeequalityconstraints;
372*2a8381b2SBarry Smith if (ctx) *(void **)ctx = tao->user_con_equalityP;
3731b4e8d38Spaul.kuehner PetscFunctionReturn(PETSC_SUCCESS);
3741b4e8d38Spaul.kuehner }
3751b4e8d38Spaul.kuehner
3761b4e8d38Spaul.kuehner /*@C
3771cc06b55SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details
378a7e14dcfSSatish Balay
37920f4b53cSBarry Smith Logically Collective
380a7e14dcfSSatish Balay
381a7e14dcfSSatish Balay Input Parameters:
38247450a7bSBarry Smith + tao - the `Tao` context
383a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation
384a7e14dcfSSatish Balay . func - the bounds computation routine
38520f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be `NULL`)
386a7e14dcfSSatish Balay
38720f4b53cSBarry Smith Calling sequence of `func`:
38847450a7bSBarry Smith + tao - the `Tao` solver
389a7e14dcfSSatish Balay . x - point to evaluate inequality constraints
390a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x
391a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
392a7e14dcfSSatish Balay
393a7e14dcfSSatish Balay Level: intermediate
394a7e14dcfSSatish Balay
395e056e8ceSJacob Faibussowitsch .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
396a7e14dcfSSatish Balay @*/
TaoSetInequalityConstraintsRoutine(Tao tao,Vec ci,PetscErrorCode (* func)(Tao tao,Vec x,Vec ci,PetscCtx ctx),PetscCtx ctx)397*2a8381b2SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtx ctx)
398d71ae5a4SJacob Faibussowitsch {
399a7e14dcfSSatish Balay PetscFunctionBegin;
400441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
4017721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2);
4029566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci));
4039566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality));
404a7e14dcfSSatish Balay tao->constraints_inequality = ci;
4057721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
406a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx;
407a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func;
4083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
409a7e14dcfSSatish Balay }
410a7e14dcfSSatish Balay
411434d79ddSpaul.kuehner /*@C
412434d79ddSpaul.kuehner TaoGetInequalityConstraintsRoutine - Gets the function used to compute inequality constraints.
413434d79ddSpaul.kuehner
414434d79ddSpaul.kuehner Not Collective
415434d79ddSpaul.kuehner
416434d79ddSpaul.kuehner Input Parameter:
417434d79ddSpaul.kuehner . tao - the `Tao` context
418434d79ddSpaul.kuehner
419434d79ddSpaul.kuehner Output Parameters:
420434d79ddSpaul.kuehner + ci - the vector to internally hold the constraint computation
421434d79ddSpaul.kuehner . func - the bounds computation routine
422434d79ddSpaul.kuehner - ctx - the (optional) user-defined context
423434d79ddSpaul.kuehner
424434d79ddSpaul.kuehner Calling sequence of `func`:
425434d79ddSpaul.kuehner + tao - the `Tao` solver
426434d79ddSpaul.kuehner . x - point to evaluate inequality constraints
427434d79ddSpaul.kuehner . ci - vector of inequality constraints evaluated at x
428434d79ddSpaul.kuehner - ctx - the (optional) user-defined function context
429434d79ddSpaul.kuehner
430434d79ddSpaul.kuehner Level: intermediate
431434d79ddSpaul.kuehner
4321b4e8d38Spaul.kuehner .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetHessian()`, `TaoGetObjectiveAndGradient()`, `TaoGetEqualityConstraintsRoutine()`
433434d79ddSpaul.kuehner @*/
TaoGetInequalityConstraintsRoutine(Tao tao,Vec * ci,PetscErrorCode (** func)(Tao tao,Vec x,Vec ci,PetscCtx ctx),PetscCtxRt ctx)434*2a8381b2SBarry Smith PetscErrorCode TaoGetInequalityConstraintsRoutine(Tao tao, Vec *ci, PetscErrorCode (**func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtxRt ctx)
435434d79ddSpaul.kuehner {
436434d79ddSpaul.kuehner PetscFunctionBegin;
437434d79ddSpaul.kuehner PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
438434d79ddSpaul.kuehner if (ci) *ci = tao->constraints_inequality;
439434d79ddSpaul.kuehner if (func) *func = tao->ops->computeinequalityconstraints;
440*2a8381b2SBarry Smith if (ctx) *(void **)ctx = tao->user_con_inequalityP;
441434d79ddSpaul.kuehner PetscFunctionReturn(PETSC_SUCCESS);
442434d79ddSpaul.kuehner }
443434d79ddSpaul.kuehner
444cc4c1da9SBarry Smith /*@
445a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the
44665ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`.
447a7e14dcfSSatish Balay
448c3339decSBarry Smith Collective
449a7e14dcfSSatish Balay
45065ba42b6SBarry Smith Input Parameter:
45147450a7bSBarry Smith . tao - the `Tao` context
452a7e14dcfSSatish Balay
45365ba42b6SBarry Smith Output Parameters:
454da81f932SPierre Jolivet + X - point the equality constraints were evaluated on
45565ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X
45665ba42b6SBarry Smith
457a7e14dcfSSatish Balay Level: developer
458a7e14dcfSSatish Balay
4591cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()`
460a7e14dcfSSatish Balay @*/
TaoComputeEqualityConstraints(Tao tao,Vec X,Vec CE)461d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
462d71ae5a4SJacob Faibussowitsch {
463a7e14dcfSSatish Balay PetscFunctionBegin;
464441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
465a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
466064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE, VEC_CLASSID, 3);
467a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2);
468a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CE, 3);
4699566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL));
470792fecdfSBarry Smith PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP));
4719566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL));
472a7e14dcfSSatish Balay tao->nconstraints++;
4733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
474a7e14dcfSSatish Balay }
475a7e14dcfSSatish Balay
476cc4c1da9SBarry Smith /*@
477a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the
47865ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`.
479a7e14dcfSSatish Balay
480c3339decSBarry Smith Collective
481a7e14dcfSSatish Balay
48265ba42b6SBarry Smith Input Parameter:
48347450a7bSBarry Smith . tao - the `Tao` context
484a7e14dcfSSatish Balay
48565ba42b6SBarry Smith Output Parameters:
486da81f932SPierre Jolivet + X - point the inequality constraints were evaluated on
487e056e8ceSJacob Faibussowitsch - CI - vector of inequality constraints evaluated at X
48865ba42b6SBarry Smith
489a7e14dcfSSatish Balay Level: developer
490a7e14dcfSSatish Balay
4911cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()`
492a7e14dcfSSatish Balay @*/
TaoComputeInequalityConstraints(Tao tao,Vec X,Vec CI)493d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
494d71ae5a4SJacob Faibussowitsch {
495a7e14dcfSSatish Balay PetscFunctionBegin;
496441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
497a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
498064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI, VEC_CLASSID, 3);
499a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2);
500a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CI, 3);
5019566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL));
502792fecdfSBarry Smith PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP));
5039566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL));
504a7e14dcfSSatish Balay tao->nconstraints++;
5053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
506a7e14dcfSSatish Balay }
507