-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathperf_profile.m
More file actions
104 lines (92 loc) · 3.12 KB
/
Copy pathperf_profile.m
File metadata and controls
104 lines (92 loc) · 3.12 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
function hl = perf_profile(H, gate, logplot)
% This subroutine produces a performance profile as described in:
%
% Benchmarking Derivative-Free Optimization Algorithms
% Jorge J. More' and Stefan M. Wild
% SIAM J. Optimization, Vol. 20 (1), pp.172-191, 2009.
%
% The latest version of this subroutine is always available at
% https://github.com/POptUS/BenDFO
% The authors would appreciate feedback and experiences from numerical
% studies conducted using this subroutine.
%
% Performance profiles were originally introduced in
% Benchmarking optimization software with performance profiles,
% E.D. Dolan and J.J. More',
% Mathematical Programming, 91 (2002), 201--213.
%
% The subroutine returns a handle to lines in a performance profile.
%
% H contains a three dimensional array of function values.
% H(f,p,s) = function value # f for problem p and solver s.
% gate is a positive constant reflecting the convergence tolerance.
% logplot=1 is used to indicate that a log (base 2) plot is desired.
%
% Argonne National Laboratory
% Jorge More' and Stefan Wild. January 2008.
[nf, np, ns] = size(H); % Grab the dimensions
% Produce a suitable history array with sorted entries:
for j = 1:ns
for i = 2:nf
H(i, :, j) = min(H(i, :, j), H(i - 1, :, j));
end
end
prob_min = min(min(H), [], 3); % The minimum value seen for each problem
prob_max = H(1, :, 1); % The starting value for each problem
% For each problem and solver, determine the number of evaluations
% required to reach the cutoff value
T = zeros(np, ns);
for p = 1:np
cutoff = prob_min(p) + gate * (prob_max(p) - prob_min(p));
for s = 1:ns
nfevs = find(H(:, p, s) <= cutoff, 1);
if isempty(nfevs)
T(p, s) = NaN;
else
T(p, s) = nfevs;
end
end
end
% Other colors, lines, and markers are easily possible:
colors = ['b' 'r' 'k' 'm' 'c' 'g' 'y'];
lines = {'-' '-.' '--'};
markers = ['s' 'o' '^' 'v' 'p' '<' 'x' 'h' '+' 'd' '*' '<'];
if nargin < 3
logplot = 0;
end
% Compute ratios and divide by smallest element in each row.
r = T ./ repmat(min(T, [], 2), 1, ns);
% Replace all NaN's with twice the max_ratio and sort.
max_ratio = max(max(r));
r(isnan(r)) = 2 * max_ratio;
r = sort(r);
% Plot stair graphs with markers.
hl = zeros(ns, 1);
for s = 1:ns
[xs, ys] = stairs(r(:, s), (1:np) / np);
% Only plot one marker at the intercept
if xs(1) == 1
vv = find(xs == 1, 1, 'last');
xs = xs(vv:end);
ys = ys(vv:end);
end
sl = mod(s - 1, 3) + 1;
sc = mod(s - 1, 7) + 1;
sm = mod(s - 1, 12) + 1;
option1 = [char(lines(sl)) colors(sc) markers(sm)];
if logplot
hl(s) = semilogx(xs, ys, option1);
else
hl(s) = plot(xs, ys, option1);
end
hold on;
end
% Axis properties are set so that failures are not shown, but with the
% max_ratio data points shown. This highlights the "flatline" effect.
if logplot
axis([1 1.1 * max_ratio 0 1]);
twop = floor(log2(1.1 * max_ratio));
set(gca, 'XTick', 2.^[0:twop]);
else
axis([1 1.1 * max_ratio 0 1]);
end