Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
D
dlib
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
钟尚武
dlib
Commits
5d259cd7
Commit
5d259cd7
authored
Nov 19, 2017
by
Davis King
Browse files
Options
Browse Files
Download
Plain Diff
merged
parents
f9f69185
532e2a3e
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
42 additions
and
29 deletions
+42
-29
global_function_search.cpp
dlib/global_optimization/global_function_search.cpp
+40
-27
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
temp
=
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