Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
dlib
Commits
5d259cd7
Commit
5d259cd7
authored
Nov 18, 2017
by
Davis King
Browse files
merged
parents
f9f69185
532e2a3e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
42 additions
and
29 deletions
+42
-29
dlib/global_optimization/global_function_search.cpp
dlib/global_optimization/global_function_search.cpp
+40
-27
dlib/global_optimization/global_function_search.h
dlib/global_optimization/global_function_search.h
+2
-2
No files found.
dlib/global_optimization/global_function_search.cpp
View file @
5d259cd7
...
@@ -3,7 +3,6 @@
...
@@ -3,7 +3,6 @@
#include "upper_bound_function.h"
#include "upper_bound_function.h"
#include "../optimization.h"
#include "../optimization.h"
#include "../timing.h" // TODO, remove
namespace
dlib
namespace
dlib
{
{
...
@@ -205,7 +204,6 @@ namespace dlib
...
@@ -205,7 +204,6 @@ namespace dlib
const
std
::
vector
<
bool
>&
is_integer_variable
const
std
::
vector
<
bool
>&
is_integer_variable
)
)
{
{
timing
::
block
oaijsdofijas
(
1
,
"pick_next_sample_quad_interp"
);
DLIB_CASSERT
(
samples
.
size
()
>
0
);
DLIB_CASSERT
(
samples
.
size
()
>
0
);
// We don't use the QP to optimize integer variables. Instead, we just fix them at
// We don't use the QP to optimize integer variables. Instead, we just fix them at
// their best observed value and use the QP to optimize the real variables. So the
// their best observed value and use the QP to optimize the real variables. So the
...
@@ -324,21 +322,16 @@ namespace dlib
...
@@ -324,21 +322,16 @@ namespace dlib
max_upper_bound_function
pick_next_sample_max_upper_bound_function
(
max_upper_bound_function
pick_next_sample_max_upper_bound_function
(
dlib
::
rand
&
rnd
,
dlib
::
rand
&
rnd
,
const
std
::
vector
<
function_evaluation
>&
samples
,
const
upper_bound_function
&
ub
,
const
matrix
<
double
,
0
,
1
>&
lower
,
const
matrix
<
double
,
0
,
1
>&
lower
,
const
matrix
<
double
,
0
,
1
>&
upper
,
const
matrix
<
double
,
0
,
1
>&
upper
,
const
std
::
vector
<
bool
>&
is_integer_variable
,
const
std
::
vector
<
bool
>&
is_integer_variable
,
const
double
relative_noise_magnitude
=
0.001
,
const
size_t
num_random_samples
const
size_t
num_random_samples
=
5000
)
)
{
{
timing
::
block
oaijsdofijas
(
0
,
"pick_next_sample_max_upper_bound_function"
);
DLIB_CASSERT
(
ub
.
num_points
()
>
0
);
DLIB_CASSERT
(
samples
.
size
()
>
0
);
// TODO, assert everyone has same dims
// build the upper bound
upper_bound_function
ub
(
samples
,
relative_noise_magnitude
);
// now do a simple random search to find the maximum upper bound
// now do a simple random search to find the maximum upper bound
double
best_ub_so_far
=
-
std
::
numeric_limits
<
double
>::
infinity
();
double
best_ub_so_far
=
-
std
::
numeric_limits
<
double
>::
infinity
();
...
@@ -356,7 +349,7 @@ namespace dlib
...
@@ -356,7 +349,7 @@ namespace dlib
}
}
double
max_value
=
-
std
::
numeric_limits
<
double
>::
infinity
();
double
max_value
=
-
std
::
numeric_limits
<
double
>::
infinity
();
for
(
auto
&
v
:
samples
)
for
(
auto
&
v
:
ub
.
get_points
()
)
max_value
=
std
::
max
(
max_value
,
v
.
y
);
max_value
=
std
::
max
(
max_value
,
v
.
y
);
return
max_upper_bound_function
(
v
,
best_ub_so_far
-
max_value
,
best_ub_so_far
);
return
max_upper_bound_function
(
v
,
best_ub_so_far
-
max_value
,
best_ub_so_far
);
...
@@ -404,18 +397,23 @@ namespace dlib
...
@@ -404,18 +397,23 @@ namespace dlib
namespace
gopt_impl
namespace
gopt_impl
{
{
std
::
vector
<
function_evaluation
>
funct_info
::
all_function_evals
(
upper_bound_function
funct_info
::
build_upper_bound_with_
all_function_evals
(
)
const
)
const
{
{
auto
t
e
mp
=
complete_evals
;
upper_bound_function
tmp
(
ub
)
;
temp
.
reserve
(
temp
.
size
()
+
incomplete_evals
.
size
());
// we are going to add the incomplete evals into this and assume the
// we are going to add the incomplete evals into this and assume the
// incomplete evals are going to take y values equal to their nearest
// incomplete evals are going to take y values equal to their nearest
// neighbor complete evals.
// neighbor complete evals.
for
(
auto
&
eval
:
incomplete_evals
)
for
(
auto
&
eval
:
incomplete_evals
)
temp
.
emplace_back
(
eval
.
x
,
find_nn
(
complete_evals
,
eval
.
x
));
{
function_evaluation
e
;
e
.
x
=
eval
.
x
;
e
.
y
=
find_nn
(
ub
.
get_points
(),
eval
.
x
);
tmp
.
add
(
e
);
}
return
t
e
mp
;
return
tmp
;
}
}
double
funct_info
::
find_nn
(
double
funct_info
::
find_nn
(
...
@@ -521,7 +519,7 @@ namespace dlib
...
@@ -521,7 +519,7 @@ namespace dlib
auto
i
=
std
::
find
(
info
->
incomplete_evals
.
begin
(),
info
->
incomplete_evals
.
end
(),
req
);
auto
i
=
std
::
find
(
info
->
incomplete_evals
.
begin
(),
info
->
incomplete_evals
.
end
(),
req
);
DLIB_CASSERT
(
i
!=
info
->
incomplete_evals
.
end
());
DLIB_CASSERT
(
i
!=
info
->
incomplete_evals
.
end
());
info
->
incomplete_evals
.
erase
(
i
);
info
->
incomplete_evals
.
erase
(
i
);
info
->
complete_evals
.
emplace_back
(
req
.
x
,
y
);
info
->
ub
.
add
(
function_evaluation
(
req
.
x
,
y
)
)
;
// Now do trust region radius maintenance and keep track of the best objective
// Now do trust region radius maintenance and keep track of the best objective
...
@@ -532,6 +530,8 @@ namespace dlib
...
@@ -532,6 +530,8 @@ namespace dlib
// was.
// was.
double
measured_improvement
=
y
-
req
.
anchor_objective_value
;
double
measured_improvement
=
y
-
req
.
anchor_objective_value
;
double
rho
=
measured_improvement
/
std
::
abs
(
req
.
predicted_improvement
);
double
rho
=
measured_improvement
/
std
::
abs
(
req
.
predicted_improvement
);
std
::
cout
<<
"rho: "
<<
rho
<<
std
::
endl
;
std
::
cout
<<
"radius: "
<<
info
->
radius
<<
std
::
endl
;
if
(
rho
<
0.25
)
if
(
rho
<
0.25
)
info
->
radius
*=
0.5
;
info
->
radius
*=
0.5
;
else
if
(
rho
>
0.75
)
else
if
(
rho
>
0.75
)
...
@@ -540,8 +540,9 @@ namespace dlib
...
@@ -540,8 +540,9 @@ namespace dlib
if
(
y
>
info
->
best_objective_value
)
if
(
y
>
info
->
best_objective_value
)
{
{
if
(
length
(
req
.
x
-
info
->
best_x
)
>
info
->
radius
*
1.001
)
if
(
!
req
.
was_trust_region_generated_request
&&
length
(
req
.
x
-
info
->
best_x
)
>
info
->
radius
*
1.001
)
{
{
std
::
cout
<<
"reset radius because of big move, "
<<
length
(
req
.
x
-
info
->
best_x
)
<<
" radius was "
<<
info
->
radius
<<
std
::
endl
;
// reset trust region radius since we made a big move. Doing this will
// reset trust region radius since we made a big move. Doing this will
// cause the radius to be reset to the size of the local region.
// cause the radius to be reset to the size of the local region.
info
->
radius
=
0
;
info
->
radius
=
0
;
...
@@ -578,7 +579,7 @@ namespace dlib
...
@@ -578,7 +579,7 @@ namespace dlib
DLIB_CASSERT
(
functions_
.
size
()
==
initial_function_evals
.
size
());
DLIB_CASSERT
(
functions_
.
size
()
==
initial_function_evals
.
size
());
for
(
size_t
i
=
0
;
i
<
initial_function_evals
.
size
();
++
i
)
for
(
size_t
i
=
0
;
i
<
initial_function_evals
.
size
();
++
i
)
{
{
functions
[
i
]
->
complete_evals
=
initial_function_evals
[
i
];
functions
[
i
]
->
ub
=
upper_bound_function
(
initial_function_evals
[
i
]
)
;
}
}
}
}
...
@@ -609,7 +610,7 @@ namespace dlib
...
@@ -609,7 +610,7 @@ namespace dlib
for
(
size_t
i
=
0
;
i
<
functions
.
size
();
++
i
)
for
(
size_t
i
=
0
;
i
<
functions
.
size
();
++
i
)
{
{
specs
.
emplace_back
(
functions
[
i
]
->
spec
);
specs
.
emplace_back
(
functions
[
i
]
->
spec
);
function_evals
.
emplace_back
(
functions
[
i
]
->
complete_evals
);
function_evals
.
emplace_back
(
functions
[
i
]
->
ub
.
get_points
()
);
}
}
}
}
...
@@ -645,7 +646,7 @@ namespace dlib
...
@@ -645,7 +646,7 @@ namespace dlib
for
(
auto
&
info
:
functions
)
for
(
auto
&
info
:
functions
)
{
{
const
long
dims
=
info
->
spec
.
lower
.
size
();
const
long
dims
=
info
->
spec
.
lower
.
size
();
if
(
info
->
complete_evals
.
size
()
<
std
::
max
<
long
>
(
3
,
dims
))
if
(
info
->
ub
.
num_points
()
<
std
::
max
<
long
>
(
3
,
dims
))
{
{
outstanding_function_eval_request
new_req
;
outstanding_function_eval_request
new_req
;
new_req
.
request_id
=
next_request_id
++
;
new_req
.
request_id
=
next_request_id
++
;
...
@@ -663,10 +664,11 @@ namespace dlib
...
@@ -663,10 +664,11 @@ namespace dlib
auto
info
=
best_function
();
auto
info
=
best_function
();
const
long
dims
=
info
->
spec
.
lower
.
size
();
const
long
dims
=
info
->
spec
.
lower
.
size
();
// if we have enough points to do a trust region step
// if we have enough points to do a trust region step
if
(
info
->
complete_evals
.
size
()
>
dims
+
1
)
if
(
info
->
ub
.
num_points
()
>
dims
+
1
)
{
{
auto
tmp
=
pick_next_sample_quad_interp
(
info
->
complete_evals
,
auto
tmp
=
pick_next_sample_quad_interp
(
info
->
ub
.
get_points
()
,
info
->
radius
,
info
->
spec
.
lower
,
info
->
spec
.
upper
,
info
->
spec
.
is_integer_variable
);
info
->
radius
,
info
->
spec
.
lower
,
info
->
spec
.
upper
,
info
->
spec
.
is_integer_variable
);
std
::
cout
<<
"QP predicted improvement: "
<<
tmp
.
predicted_improvement
<<
std
::
endl
;
if
(
tmp
.
predicted_improvement
>
qp_eps
)
if
(
tmp
.
predicted_improvement
>
qp_eps
)
{
{
do_trust_region_step
=
false
;
do_trust_region_step
=
false
;
...
@@ -696,8 +698,8 @@ namespace dlib
...
@@ -696,8 +698,8 @@ namespace dlib
for
(
auto
&
info
:
functions
)
for
(
auto
&
info
:
functions
)
{
{
auto
tmp
=
pick_next_sample_max_upper_bound_function
(
rnd
,
auto
tmp
=
pick_next_sample_max_upper_bound_function
(
rnd
,
info
->
all_function_evals
(),
info
->
spec
.
lower
,
info
->
spec
.
upper
,
info
->
build_upper_bound_with_
all_function_evals
(),
info
->
spec
.
lower
,
info
->
spec
.
upper
,
info
->
spec
.
is_integer_variable
,
relative_noise_magnitude
,
num_random_samples
);
info
->
spec
.
is_integer_variable
,
num_random_samples
);
if
(
tmp
.
predicted_improvement
>
0
&&
tmp
.
upper_bound
>
best_upper_bound
)
if
(
tmp
.
predicted_improvement
>
0
&&
tmp
.
upper_bound
>
best_upper_bound
)
{
{
best_upper_bound
=
tmp
.
upper_bound
;
best_upper_bound
=
tmp
.
upper_bound
;
...
@@ -757,7 +759,11 @@ namespace dlib
...
@@ -757,7 +759,11 @@ namespace dlib
double
global_function_search
::
double
global_function_search
::
get_relative_noise_magnitude
(
get_relative_noise_magnitude
(
)
const
{
return
relative_noise_magnitude
;
}
)
const
{
return
relative_noise_magnitude
;
}
void
global_function_search
::
void
global_function_search
::
set_relative_noise_magnitude
(
set_relative_noise_magnitude
(
double
value
double
value
...
@@ -765,11 +771,18 @@ namespace dlib
...
@@ -765,11 +771,18 @@ namespace dlib
{
{
DLIB_CASSERT
(
0
<=
value
);
DLIB_CASSERT
(
0
<=
value
);
relative_noise_magnitude
=
value
;
relative_noise_magnitude
=
value
;
// recreate all the upper bound functions with the new relative noise magnitude
for
(
auto
&
f
:
functions
)
f
->
ub
=
upper_bound_function
(
f
->
ub
.
get_points
(),
relative_noise_magnitude
);
}
}
size_t
global_function_search
::
size_t
global_function_search
::
get_monte_carlo_upper_bound_sample_num
(
get_monte_carlo_upper_bound_sample_num
(
)
const
{
return
num_random_samples
;
}
)
const
{
return
num_random_samples
;
}
void
global_function_search
::
void
global_function_search
::
set_monte_carlo_upper_bound_sample_num
(
set_monte_carlo_upper_bound_sample_num
(
size_t
num
size_t
num
...
...
dlib/global_optimization/global_function_search.h
View file @
5d259cd7
...
@@ -53,7 +53,7 @@ namespace dlib
...
@@ -53,7 +53,7 @@ namespace dlib
best_x
=
zeros_matrix
(
spec
.
lower
);
best_x
=
zeros_matrix
(
spec
.
lower
);
}
}
std
::
vector
<
function_evaluation
>
all_function_evals
(
upper_bound_function
build_upper_bound_with_
all_function_evals
(
)
const
;
)
const
;
static
double
find_nn
(
static
double
find_nn
(
...
@@ -65,7 +65,7 @@ namespace dlib
...
@@ -65,7 +65,7 @@ namespace dlib
function_spec
spec
;
function_spec
spec
;
size_t
function_idx
=
0
;
size_t
function_idx
=
0
;
std
::
shared_ptr
<
std
::
mutex
>
m
;
std
::
shared_ptr
<
std
::
mutex
>
m
;
std
::
vector
<
function_evaluation
>
complete_evals
;
upper_bound_function
ub
;
std
::
vector
<
outstanding_function_eval_request
>
incomplete_evals
;
std
::
vector
<
outstanding_function_eval_request
>
incomplete_evals
;
matrix
<
double
,
0
,
1
>
best_x
;
matrix
<
double
,
0
,
1
>
best_x
;
double
best_objective_value
=
-
std
::
numeric_limits
<
double
>::
infinity
();
double
best_objective_value
=
-
std
::
numeric_limits
<
double
>::
infinity
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment