1 #ifndef _Minimizers_h_
2 #define _Minimizers_h_
3 /* Minimizers.h
4 *
5 * Copyright (C) 1993-2019 David Weenink, 2015-2018 Paul Boersma
6 *
7 * This code is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or (at
10 * your option) any later version.
11 *
12 * This code is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this work. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "Data.h"
22 #include "Graphics.h"
23
24 /*********** deferred class Minimizer **********************************/
25
Thing_define(Minimizer,Thing)26 Thing_define (Minimizer, Thing) {
27 integer numberOfParameters;
28 autoVEC p; /* the parameters */
29 double minimum; /* current minimum */
30 autoVEC history; /* previous minima */
31 double tolerance; /* stopping criterion */
32 Daata object; /* reference to the object that uses this Minimizer */
33 integer numberOfFunctionCalls; /* the number of times 'func' has been called */
34 bool success; /* indicates whether I'm done */
35 //integer start; /* start iteration series */
36 integer maximumNumberOfIterations; /* the current maximum number of iterations */
37 integer iteration; /* the current number of iterations */
38 void (*afterHook) (Minimizer me, Thing boss); /* to be called after each iteration */
39 Thing afterBoss;
40 Graphics gmonitor; /* graphics to monitor the minimization process */
41
42 void v_info ()
43 override { }
44
45 virtual void v_minimize () { } /* does the work */
46 virtual void v_reset () { }
47 };
48
49 void Minimizer_init (Minimizer me, integer numberOfParameters, Daata object);
50 /*
51 Preconditions:
52 numberOfParameters > 0;
53 */
54
55 void Minimizer_reset (Minimizer me, constVEC const& guess);
56 /* reset the start values for the minimizer
57 *
58 * Post conditions:
59 * p [] = guess [];
60 * my minimum = 1e308;
61 * success = maximumNumberOfIterations = iteration = numberOfFunctionCalls = 0;
62 * reset (me);
63 */
64
65 void Minimizer_minimize (Minimizer me, integer maximumNumberOfIterations, double tolerance, int monitor);
66 /* Minimizes during maximally maximumNumberOfIterations. The gmonitor is initialized
67 * before minimization and cleared afterwards.
68 * Preconditions:
69 * maximumNumberOfIterations >= 0;
70 * tolerance > 0.0;
71 * Postconditions:
72 * if (reset) Minimizer_reset called with xopt as initial guess.
73 * after each function call: numberOfFunctionCalls++
74 * after each iteration: iteration++
75 */
76
77 void Minimizer_minimizeManyTimes (Minimizer me, integer maxIterationsPerTime, integer numberOfTimes, double tolerance);
78
79 void Minimizer_drawHistory (Minimizer me, Graphics g, integer itmin, integer itmax, double minimum, double maximum, bool garnish);
80
81 double Minimizer_getMinimum (Minimizer me);
82
83 /********** deferred class LineMinimizer ************************************/
84
Thing_define(LineMinimizer,Minimizer)85 Thing_define (LineMinimizer, Minimizer) {
86 /* the function to be minimized */
87 double (*func) (Daata object, VEC const& p);
88 double maxLineStep; // maximum step in line search direction
89 autoVEC direction; // search direction vector
90 autoVEC ptry; // point in search direction
91
92 //virtual void v_linmin (double p [], double fp, double direction [], double *fret);
93 };
94
95 void LineMinimizer_init (LineMinimizer me, integer numberOfParameters, Daata object, double (*func) (Daata object, VEC const& p));
96
97 /****************** class SteepestDescentMinimizer**************************/
98
99 typedef struct structSteepestDescentMinimizer_parameters {
100 double eta, momentum;
101 } *SteepestDescentMinimizer_parameters;
102
Thing_define(SteepestDescentMinimizer,Minimizer)103 Thing_define (SteepestDescentMinimizer, Minimizer) {
104 double eta, momentum;
105 double (*func) (Daata object, VEC const& p);
106 void (*dfunc) (Daata object, VEC const& p, VEC const& dp);
107 /* calculates gradient at position p */
108
109 void v_minimize ()
110 override;
111 };
112
113 autoSteepestDescentMinimizer SteepestDescentMinimizer_create (integer numberOfParameters, Daata object, double (*func) (Daata object, VEC const& p), void (*dfunc) (Daata object, VEC const& p, VEC const& dp));
114
115
116 /********** class VDSmagtMinimizer ********************************/
117
118 typedef struct structVDSmagtMinimizer_parameters {
119 double lineSearchGradient;
120 integer lineSearchMaxNumOfIterations;
121 } *VDSmagtMinimizer_parameters;
122
Thing_define(VDSmagtMinimizer,Minimizer)123 Thing_define (VDSmagtMinimizer, Minimizer) {
124 double (*func) (Daata object, VEC const& p);
125 void (*dfunc) (Daata object, VEC const& p, VEC const& dp);
126 autoVEC dp;
127 double lineSearchGradient;
128 integer lineSearchMaxNumOfIterations;
129 double gr0, gropt, df, alplim, alpha, dalpha, alphamin;
130 autoVEC pc; /* position of current point */
131 autoVEC gc; /* gradient of current point */
132 autoVEC g0; /* gradient at beginning of line search */
133 autoVEC s; /* search direction for line search */
134 autoVEC srst; /* search direction for first iteration after restart */
135 autoVEC grst; /* gradient for first iteration after restart */
136 double fc, grc, fch, gr2s, temp, grs, beta, gcg0;
137 double gamma, gamma_in, f0, gsq, gopt_sq;
138 integer lineSearch_iteration, flag, again, one_up, restart;
139 bool restart_flag;
140
141 void v_minimize ()
142 override;
143 void v_reset ()
144 override;
145 };
146
147 autoVDSmagtMinimizer VDSmagtMinimizer_create (integer dimension, Daata object, double (*func) (Daata object, VEC const& p), void (*dfunc) (Daata object, VEC const& p, VEC const& dp));
148
149 #endif /* _Minimizer_h_ */
150