/[MITgcm]/manual/s_ecco/text/optim.tex
ViewVC logotype

Annotation of /manual/s_ecco/text/optim.tex

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (hide annotations) (download) (as text)
Mon Nov 12 17:46:01 2001 UTC (23 years, 8 months ago) by adcroft
Branch: MAIN
Changes since 1.2: +169 -6 lines
File MIME type: application/x-tex
Had to include flow charts into main doc to make latex2html work.

1 heimbach 1.1 \section{The line search optimisation algorithm
2     \label{sectionoptim}}
3    
4     \subsection{General features}
5    
6     The line search algorithm is based on a quasi-Newton
7     variable storage method which was implemented by
8     \cite{gil-mar:89}.
9    
10     TO BE CONTINUED...
11    
12     \subsection{The online vs. offline version}
13    
14     \begin{itemize}
15     %
16     \item {\bf Online version} \\
17     Every call to {\it simul} refers to an execution of the
18     forward and adjoint model.
19     Several iterations of optimization may thus be performed within
20     a single run of the main program (lsopt\_top).
21     The following cases may occur:
22     %
23     \begin{itemize}
24     \item
25     cold start only (no optimization)
26     \item
27     cold start, followed by one or several iterations of optimization
28     \item
29     warm start from previous cold start with one or several iterations
30     \item
31     warm start from previous warm start with one or several iterations
32     \end{itemize}
33     %
34     \item {\bf Offline version} \\
35     Every call to simul refers to a read procedure which
36     reads the result of a forward and adjoint run
37     Therefore, only one call to simul is allowed,
38     {\tt itmax = 0}, for cold start
39     {\tt itmax = 1}, for warm start
40     Also, at the end, {\bf x(i+1)} needs to be computed and saved
41     to be available for the offline model and adjoint run
42     \end{itemize}
43    
44     In order to achieve minimum difference between the online and offline code
45     {\bf xdiff(i+1)} is stored to file at the end of an (offline) iteration,
46     but recomputed identically at the beginning of the next iteration.
47    
48     \subsection{Number of iterations vs. number of simulations}
49    
50     {\tt - itmax:} controls the max. number of iterations \\
51     {\tt - nfunc:} controls the max. number of simulations
52     within one iteration
53    
54     \paragraph{Summary} ~ \\
55     From one iteration to the next the descent direction changes.
56     Within one iteration more than one forward and adjoint
57     run may be performed.
58     The updated control used as input for these simulations uses the same
59     descent direction, but different step sizes.
60    
61     \paragraph{Description} ~ \\
62     From one iteration to the next the descent direction dd changes using
63     the result for the adjoint vector gg of the previous iteration.
64     In lsline the updated control
65     \[
66     \tt
67     xdiff(i,1) = xx(i-1) + tact(i-1,1)*dd(i-1)
68     \]
69     serves as input for
70     a forward and adjoint model run yielding a new {\tt gg(i,1)}.
71     In general, the new solution passes the 1st and 2nd Wolfe tests
72     so {\tt xdiff(i,1)} represents the solution sought:
73     \[
74     {\tt xx(i) = xdiff(i,1)}
75     \]
76     If one of the two tests fails,
77     an inter- or extrapolation is invoked to determine
78     a new step size {\tt tact(i-1,2)}.
79     If more than one function call is permitted,
80     the new step size is used together
81     with the "old" descent direction {\tt dd(i-1)}
82     (i.e. dd is not updated using the new {\tt gg(i)}),
83     to compute a new
84     \[
85     {\tt xdiff(i,2) = xx(i-1) + tact(i-1,2)*dd(i-1)}
86     \]
87     that serves as input
88     in a new forward and adjoint run, yielding {\tt gg(i,2)}.
89 cnh 1.2 If now, both Wolfe tests are successful,
90 heimbach 1.1 the updated solution is given by
91     \[
92     \tt
93     xx(i) = xdiff(i,2) = xx(i-1) + tact(i-1,2)*dd(i-1)
94     \]
95    
96     In order to save memory both the fields dd and xdiff
97     have a double usage.
98     %
99     \begin{itemize}
100     %
101     \item [{\tt xdiff}] ~\\
102     - in {\it lsopt\_top}: used as {\tt x(i) - x(i-1)} for Hessian update \\
103     - in {\it lsline}: intermediate result for control update
104     {\tt x = x + tact*dd}
105     %
106     \item [{\tt dd}] ~\\
107     - in {\it lsopt\_top, lsline}: descent vector, {\tt dd = -gg}
108     and {\tt hessupd} \\
109     - in {\it dgscale}: intermediate result to compute new preconditioner
110     %
111     \end{itemize}
112    
113     \paragraph{The parameter file lsopt.par}
114    
115     %
116     \begin{itemize}
117     %
118     \item {\bf NUPDATE}
119     max. no. of update pairs {\tt (gg(i)-gg(i-1), xx(i)-xx(i-1))}
120     to be stored in {\tt OPWARMD} to estimate Hessian
121     [pair of current iter. is stored in
122     {\tt (2*jmax+2, 2*jmax+3)}
123     jmax must be > 0 to access these entries]
124     Presently {\tt NUPDATE} must be > 0
125     (i.e. iteration without reference to previous
126     iterations through {\tt OPWARMD} has not been tested)
127     %
128     \item {\bf EPSX}
129     relative precision on xx bellow which xx should not be improved
130     %
131     \item {\bf EPSG}
132     relative precision on gg below which optimization is
133     considered successful
134     %
135     \item {\bf IPRINT}
136     controls verbose (>=1) or non-verbose output
137     %
138     \item {\bf NUMITER}
139     max. number of iterations of optimisation;
140     NUMTER = 0: cold start only, no optimization
141     %
142     \item {\bf ITER\_NUM}
143     index of new restart file to be created (not necessarily = NUMITER!)
144     %
145     \item {\bf NFUNC}
146     max. no. of simulations per iteration
147     (must be > 0);
148     is used if step size {\tt tact} is inter-/extrapolated;
149     in this case, if NFUNC > 1, a new simulation is performed with
150     same gradient but "improved" step size
151     %
152     \item {\bf FMIN}
153     first guess cost function value
154     (only used as long as first iteration not completed,
155     i.e. for jmax <= 0)
156     %
157     \end{itemize}
158    
159     \paragraph{OPWARMI, OPWARMD files}
160     Two files retain values of previous iterations which are
161     used in latest iteration to update Hessian:
162     \begin{itemize}
163     %
164     \item {\bf OPWARMI}: contains index settings and scalar variables
165    
166     {\footnotesize
167     \begin{tabular}{ll}
168     {\tt n = nn} & no. of control variables \\
169     {\tt fc = ff} & cost value of last iteration \\
170     {\tt isize} & no. of bytes per record in OPWARMD \\
171     {\tt m = nupdate} & max. no. of updates for Hessian \\
172     {\tt jmin, jmax} & pointer indices for OPWARMD file (cf. below) \\
173     {\tt gnorm0} & norm of first (cold start) gradient gg \\
174     {\tt iabsiter} & total number of iterations with respect to cold start
175     \end{tabular}
176     }
177     %
178     \item {\bf OPWARMD}: contains vectors (control and gradient)
179    
180     {\scriptsize
181     \begin{tabular}{cll}
182     entry & name & description \\
183     \hline
184     1 & {\tt xx(i)} & control vector of latest iteration \\
185     2 & {\tt gg(i)} & gradient of latest iteration \\
186     3 & {\tt xdiff(i),diag} & preconditioning vector; (1,...,1)
187     for cold start \\
188     2*jmax+2 & {\tt gold=g(i)-g(i-1)} & for last update (jmax) \\
189     2*jmax+3 & {\tt xdiff=tact*d=xx(i)-xx(i-1)} & for last update (jmax)
190     \end{tabular}
191     }
192     %
193     \end{itemize}
194     %
195     \begin{figure}[b!]
196     {\footnotesize
197     \begin{verbatim}
198    
199     Example 1: jmin = 1, jmax = 3, mupd = 5
200    
201     1 2 3 | 4 5 6 7 8 9 empty empty
202     |___|___|___| | |___|___| |___|___| |___|___| |___|___| |___|___|
203     0 | 1 2 3
204    
205     Example 2: jmin = 3, jmax = 7, mupd = 5 ---> jmax = 2
206    
207     1 2 3 |
208     |___|___|___| | |___|___| |___|___| |___|___| |___|___| |___|___|
209     | 6 7 3 4 5
210    
211     \end{verbatim}
212     }
213     \caption{Examples of OPWARM file handling}
214     \label{fig:opwarm}
215     \end{figure}
216    
217     \paragraph{Error handling}
218    
219    
220    
221     \newpage
222    
223 adcroft 1.3 \begin{figure}
224     %\input{part8/lsopt_flow_1}
225     {\scriptsize
226     \begin{verbatim}
227     lsopt_top
228     |
229     |---- check arguments
230     |---- CALL INSTORE
231     | |
232     | |---- determine whether OPWARMI available:
233     | * if no: cold start: create OPWARMI
234     | * if yes: warm start: read from OPWARMI
235     | create or open OPWARMD
236     |
237     |---- check consistency between OPWARMI and model parameters
238     |
239     |---- >>> if COLD start: <<<
240     | | first simulation with f.g. xx_0; output: first ff_0, gg_0
241     | | set first preconditioner value xdiff_0 to 1
242     | | store xx(0), gg(0), xdiff(0) to OPWARMD (first 3 entries)
243     | |
244     | >>> else: WARM start: <<<
245     | read xx(i), gg(i) from OPWARMD (first 2 entries)
246     | for first warm start after cold start, i=0
247     |
248     |
249     |
250     |---- /// if ITMAX > 0: perform optimization (increment loop index i)
251     | (
252     | )---- save current values of gg(i-1) -> gold(i-1), ff -> fold(i-1)
253     | (---- CALL LSUPDXX
254     | ) |
255     | ( |---- >>> if jmax=0 <<<
256     | ) | | first optimization after cold start:
257     | ( | | preconditioner estimated via ff_0 - ff_(first guess)
258     | ) | | dd(i-1) = -gg(i-1)*preco
259     | ( | |
260     | ) | >>> if jmax > 0 <<<
261     | ( | dd(i-1) = -gg(i-1)
262     | ) | CALL HESSUPD
263     | ( | |
264     | ) | |---- dd(i-1) modified via Hessian approx.
265     | ( |
266     | ) |---- >>> if <dd,gg> >= 0 <<<
267     | ( | ifail = 4
268     | ) |
269     | ( |---- compute step size: tact(i-1)
270     | ) |---- compute update: xdiff(i) = xx(i-1) + tact(i-1)*dd(i-1)
271     | (
272     | )---- >>> if ifail = 4 <<<
273     | ( goto 1000
274     | )
275     | (---- CALL OPTLINE / LSLINE
276     | ) |
277     ... ... ...
278     \end{verbatim}
279     }
280 heimbach 1.1 \caption{Flow chart (part 1 of 3)}
281     \label{fig:lsoptflow1}
282     \end{figure}
283    
284 adcroft 1.3 \begin{figure}
285     %\input{part8/lsopt_flow_2}
286     {\scriptsize
287     \begin{verbatim}
288     ... ...
289     | )
290     | (---- CALL OPTLINE / LSLINE
291     | ) |
292     | ( |---- /// loop over simulations
293     | ) (
294     | ( )---- CALL SIMUL
295     | ) ( |
296     | ( ) |---- input: xdiff(i)
297     | ) ( |---- output: ff(i), gg(i)
298     | ( ) |---- >>> if ONLINE <<<
299     | ) ( runs model and adjoint
300     | ( ) >>> if OFFLINE <<<
301     | ) ( reads those values from file
302     | ( )
303     | ) (---- 1st Wolfe test:
304     | ( ) ff(i) <= tact*xpara1*<gg(i-1),dd(i-1)>
305     | ) (
306     | ( )---- 2nd Wolfe test:
307     | ) ( <gg(i),dd(i-1)> >= xpara2*<gg(i-1),dd(i-1)>
308     | ( )
309     | ) (---- >>> if 1st and 2nd Wolfe tests ok <<<
310     | ( ) | 320: update xx: xx(i) = xdiff(i)
311     | ) ( |
312     | ( ) >>> else if 1st Wolfe test not ok <<<
313     | ) ( | 500: INTERpolate new tact:
314     | ( ) | barr*tact < tact < (1-barr)*tact
315     | ) ( | CALL CUBIC
316     | ( ) |
317     | ) ( >>> else if 2nd Wolfe test not ok <<<
318     | ( ) 350: EXTRApolate new tact:
319     | ) ( (1+barmin)*tact < tact < 10*tact
320     | ( ) CALL CUBIC
321     | ) (
322     | ( )---- >>> if new tact > tmax <<<
323     | ) ( | ifail = 7
324     | ( ) |
325     | ) (---- >>> if new tact < tmin OR tact*dd < machine precision <<<
326     | ( ) | ifail = 8
327     | ) ( |
328     | ( )---- >>> else <<<
329     | ) ( update xdiff for new simulation
330     | ( )
331     | ) \\\ if nfunc > 1: use inter-/extrapolated tact and xdiff
332     | ( for new simulation
333     | ) N.B.: new xx is thus not based on new gg, but
334     | ( rather on new step size tact
335     | )
336     | (---- store new values xx(i), gg(i) to OPWARMD (first 2 entries)
337     | )---- >>> if ifail = 7,8,9 <<<
338     | ( goto 1000
339     | )
340     ... ...
341     \end{verbatim}
342     }
343 heimbach 1.1 \caption{Flow chart (part 2 of 3)}
344     \label{fig:lsoptflow2}
345     \end{figure}
346    
347 adcroft 1.3 \begin{figure}
348     %\input{part8/lsopt_flow_3}
349     {\scriptsize
350     \begin{verbatim}
351     ... ...
352     | )
353     | (---- store new values xx(i), gg(i) to OPWARMD (first 2 entries)
354     | )---- >>> if ifail = 7,8,9 <<<
355     | ( goto 1000
356     | )
357     | (---- compute new pointers jmin, jmax to include latest values
358     | ) gg(i)-gg(i-1), xx(i)-xx(i-1) to Hessian matrix estimate
359     | (---- store gg(i)-gg(i-1), xx(i)-xx(i-1) to OPWARMD
360     | ) (entries 2*jmax+2, 2*jmax+3)
361     | (
362     | )---- CALL DGSCALE
363     | ( |
364     | ) |---- call dostore
365     | ( | |
366     | ) | |---- read preconditioner of previous iteration diag(i-1)
367     | ( | from OPWARMD (3rd entry)
368     | ) |
369     | ( |---- compute new preconditioner diag(i), based upon diag(i-1),
370     | ) | gg(i)-gg(i-1), xx(i)-xx(i-1)
371     | ( |
372     | ) |---- call dostore
373     | ( |
374     | ) |---- write new preconditioner diag(i) to OPWARMD (3rd entry)
375     | (
376     |---- \\\ end of optimization iteration loop
377     |
378     |
379     |
380     |---- CALL OUTSTORE
381     | |
382     | |---- store gnorm0, ff(i), current pointers jmin, jmax, iterabs to OPWARMI
383     |
384     |---- >>> if OFFLINE version <<<
385     | xx(i+1) needs to be computed as input for offline optimization
386     | |
387     | |---- CALL LSUPDXX
388     | | |
389     | | |---- compute dd(i), tact(i) -> xdiff(i+1) = x(i) + tact(i)*dd(i)
390     | |
391     | |---- CALL WRITE_CONTROL
392     | | |
393     | | |---- write xdiff(i+1) to special file for offline optim.
394     |
395     |---- print final information
396     |
397     O
398     \end{verbatim}
399     }
400 heimbach 1.1 \caption{Flow chart (part 3 of 3)}
401     \label{fig:lsoptflow3}
402     \end{figure}
403    

  ViewVC Help
Powered by ViewVC 1.1.22