Actual source code: ssls.h
1: // Context for SSXLS
2: // -- semismooth (SS) - function not differentiable
3: // - merit function continuously differentiable
4: // - Fischer-Burmeister reformulation of complementarity
5: // - Billups composition for two finite bounds
6: // -- infeasible (I) - iterates not guaranteed to remain within bounds
7: // -- feasible (F) - iterates guaranteed to remain within bounds
8: // -- linesearch (LS) - Armijo rule on direction
9: //
10: // Many other reformulations are possible and combinations of
11: // feasible/infeasible and linesearch/trust region are possible.
12: //
13: // Basic theory
14: // Fischer-Burmeister reformulation is semismooth with a continuously
15: // differentiable merit function and strongly semismooth if the F has
16: // lipschitz continuous derivatives.
17: //
18: // Every accumulation point generated by the algorithm is a stationary
19: // point for the merit function. Stationary points of the merit function
20: // are solutions of the complementarity problem if
21: // a. the stationary point has a BD-regular subdifferential, or
22: // b. the Schur complement F'/F'_ff is a P_0-matrix where ff is the
23: // index set corresponding to the free variables.
24: //
25: // If one of the accumulation points has a BD-regular subdifferential then
26: // a. the entire sequence converges to this accumulation point at
27: // a local q-superlinear rate
28: // b. if in addition the reformulation is strongly semismooth near
29: // this accumulation point, then the algorithm converges at a
30: // local q-quadratic rate.
31: //
32: // The theory for the feasible version follows from the feasible descent
33: // algorithm framework.
34: //
35: // References:
36: // Billups, "Algorithms for Complementarity Problems and Generalized
37: // Equations," Ph.D thesis, University of Wisconsin - Madison, 1995.
38: // De Luca, Facchinei, Kanzow, "A Semismooth Equation Approach to the
39: // Solution of Nonlinear Complementarity Problems," Mathematical
40: // Programming, 75, pages 407-439, 1996.
41: // Ferris, Kanzow, Munson, "Feasible Descent Algorithms for Mixed
42: // Complementarity Problems," Mathematical Programming, 86,
43: // pages 475-497, 1999.
44: // Fischer, "A Special Newton-type Optimization Method," Optimization,
45: // 24, pages 269-284, 1992
46: // Munson, Facchinei, Ferris, Fischer, Kanzow, "The Semismooth Algorithm
47: // for Large Scale Complementarity Problems," Technical Report 99-06,
48: // University of Wisconsin - Madison, 1999.
50: #ifndef __TAO_SSLS_H
52: #include "src/tao_impl.h"
54: typedef struct {
55: TaoVec *g;
57: TaoVec *ff; // fischer function
58: TaoVec *dpsi; // gradient of psi
59:
60: TaoVec *d; // direction
61: TaoVec *w; // linesearch work vector
63: TaoVec *da; // work vector for subdifferential calculation (diag pert)
64: TaoVec *db; // work vector for subdifferential calculation (row scale)
65: TaoVec *dm; // work vector for subdifferential calculation (mu vector)
67: TaoVec *t1; // work vector
68: TaoVec *t2; // work vector
70: TaoVec *xl;
71: TaoVec *xu;
73: double merit; // merit function value (norm(fischer))
74: double merit_eqn;
75: double merit_mu;
77: double delta;
78: double rho;
80: double rtol; // Solution tolerances
81: double atol;
83: double identifier; // Active-set identification
85: // Interior-point method data
86: double mu_init; // initial smoothing parameter value
87: double mu; // smoothing parameter
88: double dmu; // direction in smoothing parameter
89: double mucon; // smoothing parameter constraint
90: double d_mucon; // derivative of smoothing constraint with respect to mu
91: double g_mucon; // gradient of merit function with respect to mu
93: TaoVec *f; // constraint function
94: } TAO_SSLS;
96: int TaoSetUp_SSLS(TAO_SOLVER, void *);
97: int TaoSetDown_SSLS(TAO_SOLVER, void *);
98: int TaoSetOptions_SSLS(TAO_SOLVER, void *);
99: int TaoView_SSLS(TAO_SOLVER, void *);
101: int Tao_SSLS_Function(TAO_SOLVER, TaoVec *, double *, void *);
102: int Tao_SSLS_FunctionGradient(TAO_SOLVER, TaoVec *, double *, TaoVec *, void *);
103: int Tao_ASLS_FunctionGradient(TAO_SOLVER, TaoVec *, double *, TaoVec *, void *);
104: int Tao_ISLS_FunctionGradient(TAO_SOLVER, TaoVec *, double *, TaoVec *, void *);
106: #endif