File: optimizer_function_count.inc

package info (click to toggle)
dynare 7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 79,248 kB
  • sloc: cpp: 82,011; ansic: 28,583; objc: 12,573; yacc: 5,105; pascal: 2,374; lex: 1,502; python: 1,118; sh: 1,116; makefile: 605; lisp: 162; xml: 18
file content (62 lines) | stat: -rw-r--r-- 2,473 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
profile off;
if ~isoctave
profData = profile('info');
% profile viewer % this opens the GUI

% define the functions to look for that call 'dsge_likelihood.m' during optimization
switch options_.mode_compute
    case {1, 3, 7, 12, 102}
        % These are optimization algorithms provided by MATLAB
        % The direct caller of our function is not documented and can change
        % across MATLAB versions.
        % In any case, we do not have to test that MATLAB optimizers correctly
        % counts function calls, that’s not the purpose of our testsuite.
        fun = {};
    case 2
        fun = {'simulated_annealing'};
    case 4
        fun = {'penalty_objective_function'};
    case 5
        fun = {'penalty_objective_function'};
    case 6
        fun = {'gmhmaxlik','gmhmaxlik_core'};
    case 8
        fun = {'simplex_optimization_routine', 'simplex_optimization_routine>simplex_initialization'};
    case 9
        fun = {'cmaes'};
    case 10
        fun = {'simpsa>CALCULATE_COST'};
    case 101
        if options_.analytic_derivation
            fun = {'analytic_gradient_wrapper'};
        else
            fun = {'solvopt', 'apprgrdn'};
        end
    otherwise
        fun = {'penalty_objective_function'};
end
% find dsge_likelihood function
dsge_idx = find(strcmp({profData.FunctionTable.FunctionName}, 'dsge_likelihood'));
dsge_func = profData.FunctionTable(dsge_idx);
% get all parent function names using their indices
parent_indices = [dsge_func.Parents.Index];
parent_names = {profData.FunctionTable(parent_indices).FunctionName};
% find matching functions and sum their NumCalls
matching_idx = ismember(parent_names, fun);
NumCalls = sum([dsge_func.Parents(matching_idx).NumCalls]);

if options_.analytic_derivation
    fprintf('OPTIMIZATION INFO WITH ANALYTICAL DERIVATIVES\n');
else
    fprintf('OPTIMIZATION INFO\n');
end
fprintf('- funcCount: %d\n', oo_.posterior.optimization.optimization_info.funcCount);
fprintf('- runtime: %s\n', dynsec2hms(oo_.posterior.optimization.optimization_info.runtime));
fprintf('- iterations: %d\n', oo_.posterior.optimization.optimization_info.iterations);
fprintf('- exitflag: %d\n', oo_.posterior.optimization.optimization_info.exitflag);
fprintf('- termination message: %s\n', oo_.posterior.optimization.optimization_info.message);

if ~isempty(fun) && ~isequal(oo_.posterior.optimization.optimization_info.funcCount,NumCalls)
    error('counting of function evaluations is not correct');
end
end