1 |
/** |
2 |
This is a header file to be used when calling TRON from C. |
3 |
|
4 |
TRON is written by Chih-Jen Lin and Jorge J. More', but is not |
5 |
included in the ASCEND distribution due to licensing restrictions. |
6 |
*/ |
7 |
#ifndef TRON_H |
8 |
#define TRON_H |
9 |
|
10 |
#ifdef linux |
11 |
# define DTRON dtron_ |
12 |
# define FNAME_LCASE_DECOR |
13 |
#else |
14 |
# error "System-dependent information required" |
15 |
#endif |
16 |
|
17 |
int DTRON(const int *n, double *x, const double *xl, |
18 |
const double *xu, double *f, double *g, double *a, |
19 |
double *adiag, int *acol_ptr, int *arow_ind, |
20 |
double *frtol, double *fatol, double *fmin, double *cgtol, |
21 |
int *itermax, double *delta, char *task, double *b, |
22 |
double *bdiag, int *bcol_ptr, int *brow_ind, |
23 |
double *l, double *ldiag, int *lcol_ptr, int *lrow_ind, |
24 |
double *xc, double *s, int *indfree, int *isave, |
25 |
double *dsave, double *wa, int *iwa |
26 |
); |
27 |
/**< |
28 |
This is the TRON trust region Newton method solver for the |
29 |
solution of large bound-constrained optimization problems |
30 |
|
31 |
min { f(x) : xl <= x <= xu } |
32 |
|
33 |
where the Hessian matrix is sparse. The user must evaluate the |
34 |
function, gradient, and the Hessian matrix. |
35 |
|
36 |
@param n number of variables (in) |
37 |
@param x double precision array of dimension n (in/out) |
38 |
On entry x specifies the vector x. |
39 |
On exit x is the final minimizer. |
40 |
|
41 |
@param xl vector of length n, containing lower bound for each var (in) |
42 |
@param xu vector of length n, containing upper bound for each var (in) |
43 |
|
44 |
@param f double precision variable. |
45 |
On entry f must contain the function at x. |
46 |
On exit f is unchanged. |
47 |
|
48 |
@param g double precision array of dimension n. |
49 |
On entry g must contain the gradient at x. |
50 |
On exit g is unchanged. |
51 |
|
52 |
@param a double precision array of dimension nnz. |
53 |
On entry a must contain the strict lower triangular part |
54 |
of A in compressed column storage. |
55 |
On exit a is unchanged. |
56 |
|
57 |
@param adiag double precision array of dimension n. |
58 |
On entry adiag must contain the diagonal elements of A. |
59 |
On exit adiag is unchanged. |
60 |
|
61 |
@param acol_ptr integer array of dimension n + 1. |
62 |
On entry acol_ptr must contain pointers to the columns of A. |
63 |
The nonzeros in column j of A must be in positions |
64 |
acol_ptr(j), ... , acol_ptr(j+1) - 1. |
65 |
On exit acol_ptr is unchanged. |
66 |
|
67 |
@param arow_ind integer array of dimension nnz. |
68 |
On entry arow_ind must contain row indices for the strict |
69 |
lower triangular part of A in compressed column storage. |
70 |
On exit arow_ind is unchanged. |
71 |
|
72 |
@param frtol double precision variable. |
73 |
On entry frtol specifies the relative error desired in the |
74 |
function. Convergence occurs if the estimate of the |
75 |
relative error between f(x) and f(xsol), where xsol |
76 |
local minimizer, is less than frtol. |
77 |
On exit frtol is unchanged. |
78 |
|
79 |
@param fatol double precision variable. |
80 |
On entry fatol specifies the absolute error desired in the |
81 |
function. Convergence occurs if the estimate of the |
82 |
absolute error between f(x) and f(xsol), where xsol |
83 |
is a local minimizer, is less than fatol. |
84 |
On exit fatol is unchanged. |
85 |
|
86 |
@param fmin double precision variable. |
87 |
On entry fmin specifies a lower bound for the function. |
88 |
The subroutine exits with a warning if f < fmin. |
89 |
On exit fmin is unchanged. |
90 |
|
91 |
@param cgtol double precision variable. |
92 |
On entry cgtol specifies the convergence criteria for |
93 |
the conjugate gradient method. |
94 |
On exit cgtol is unchanged. |
95 |
|
96 |
@param itermax max number of conjugate gradient iterations (input) |
97 |
|
98 |
@param delta trust region bound (input) |
99 |
|
100 |
@param task character variable of length at least 60. |
101 |
On initial entry task must be set to 'START'. |
102 |
On exit task indicates the required action: |
103 |
|
104 |
If task(1:1) = 'F' then evaluate the function at x. |
105 |
|
106 |
If task(1:2) = 'GH' then evaluate the gradient and the |
107 |
Hessian matrix at x. |
108 |
|
109 |
If task(1:4) = 'CONV' then the search is successful. |
110 |
|
111 |
If task(1:4) = 'WARN' then the subroutine is not able |
112 |
to satisfy the convergence conditions. The exit value |
113 |
of x contains the best approximation found. |
114 |
|
115 |
--- |
116 |
@param b double precision array of dimension nnz + n*p. |
117 |
On entry b need not be specified. |
118 |
On exit b contains the strict lower triangular part |
119 |
of B in compressed column storage. |
120 |
|
121 |
@param bdiag diagonal elements of B (returned into user-allocated space of size n) |
122 |
|
123 |
@param bcol_ptr integer array of dimension n + 1. |
124 |
On entry bcol_ptr need not be specified |
125 |
On exit bcol_ptr contains pointers to the columns of B. |
126 |
The nonzeros in column j of B are in the |
127 |
bcol_ptr(j), ... , bcol_ptr(j+1) - 1 positions of b. |
128 |
|
129 |
@param brow_ind integer array of dimension nnz. |
130 |
On entry brow_ind need not be specified. |
131 |
On exit brow_ind contains row indices for the strict lower |
132 |
triangular part of B in compressed column storage. |
133 |
--- |
134 |
@param l double precision array of dimension nnz + n*p. |
135 |
On entry l need not be specified. |
136 |
On exit l contains the strict lower triangular part |
137 |
of L in compressed column storage. |
138 |
|
139 |
@param ldiag double precision array of dimension n. |
140 |
On entry ldiag need not be specified. |
141 |
On exit ldiag contains the diagonal elements of L. |
142 |
|
143 |
@param lcol_ptr integer array of dimension n + 1. |
144 |
On entry lcol_ptr need not be specified. |
145 |
On exit lcol_ptr contains pointers to the columns of L. |
146 |
The nonzeros in column j of L are in the |
147 |
lcol_ptr(j), ... , lcol_ptr(j+1) - 1 positions of l. |
148 |
|
149 |
@param lrow_ind integer array of dimension nnz + n*p. |
150 |
On entry lrow_ind need not be specified. |
151 |
On exit lrow_ind contains row indices for the strict lower |
152 |
triangular part of L in compressed column storage. |
153 |
--- |
154 |
|
155 |
@param xc double precision working array of dimension n. |
156 |
|
157 |
@param s double precision working array of dimension n. |
158 |
|
159 |
@param indfree integer working array of dimension n. |
160 |
|
161 |
@param isave integer working array of dimension 3. |
162 |
|
163 |
@param dsave is double precision working array of dimension 3. |
164 |
|
165 |
@param wa double precision work array of dimension 7*n. |
166 |
|
167 |
@param iwa integer work array of dimension 3*n. |
168 |
|
169 |
|
170 |
This subroutine uses reverse communication. |
171 |
The user must choose an initial approximation x to the minimizer, |
172 |
and make an initial call with task set to 'START'. |
173 |
On exit task indicates the required action. |
174 |
|
175 |
A typical invocation has the following outline: |
176 |
|
177 |
Compute a starting vector x. |
178 |
Compute the sparsity pattern of the Hessian matrix and |
179 |
store in compressed column storage in (acol_ptr,arow_ind). |
180 |
|
181 |
char task[60] = "START"; |
182 |
while(search){ |
183 |
|
184 |
if(strcmp(task,'F')==0 || strcmp(task,"START")==0){ |
185 |
|
186 |
// Evaluate the function at x and store in f. |
187 |
|
188 |
} |
189 |
if(strcmp(task,'GH')==0 || strcmp(task,"START")==0){ |
190 |
|
191 |
// Evaluate the gradient at x and store in g. |
192 |
|
193 |
// Evaluate the Hessian at x and store in compressed |
194 |
column storage in (a,adiag,acol_ptr,arow_ind) |
195 |
} |
196 |
|
197 |
dtron(n,x,xl,xu,f,g,a,adiag,acol_ptr,arow_ind, |
198 |
frtol,fatol,fmin,cgtol,itermax,delta,task, |
199 |
b,bdiag,bcol_ptr,brow_ind, |
200 |
l,ldiag,lcol_ptr,lrow_ind, |
201 |
xc,s,indfree, |
202 |
isave,dsave,wa,iwa |
203 |
); |
204 |
|
205 |
if(strncmp(task,"CONV",4)==0)search = FALSE; |
206 |
|
207 |
} |
208 |
|
209 |
NOTE: The user must not alter work arrays between calls. |
210 |
|
211 |
TRON calls the following routines from MINPACK-2: |
212 |
dcauchy, dspcg, dssyax |
213 |
|
214 |
TRON also calls the 'dcopy' routine from Level 1 BLAS: |
215 |
*/ |
216 |
|
217 |
/* the following macros help with dlopening etc */ |
218 |
|
219 |
#define TRON_DTRON_ARGS (const int *n, double *x, const double *xl, \ |
220 |
const double *xu, double *f, double *g, double *a,\ |
221 |
double *adiag, int *acol_ptr, int *arow_ind,\ |
222 |
double *frtol, double *fatol, double *fmin, double *cgtol,\ |
223 |
int *itermax, double *delta, char *task, double *b,\ |
224 |
double *bdiag, int *bcol_ptr, int *brow_ind,\ |
225 |
double *l, double *ldiag, int *lcol_ptr, int *lrow_ind,\ |
226 |
double *xc, double *s, int *indfree, int *isave,\ |
227 |
double *dsave, double *wa, int *iwa) |
228 |
|
229 |
#define TRON_DTRON_VALS (n,x,xl,xu,f,g,a,adiag,acol_ptr,arow_ind,\ |
230 |
frtol,fatol,fmin,cgtol,itermax,delta,task,\ |
231 |
b,bdiag,bcol_ptr,brow_ind,\ |
232 |
l,ldiag,lcol_ptr,lrow_ind,\ |
233 |
xc,s,indfree,\ |
234 |
isave,dsave,wa,iwa) |
235 |
|
236 |
typedef int dtron_fn_t TRON_DTRON_ARGS; |
237 |
|
238 |
#endif /* TRON_H */ |
239 |
|