Commit 2b8becae authored by Davis King's avatar Davis King

Added global_function_search unit test

parent c91a0473
......@@ -83,6 +83,75 @@ namespace
}
}
// ----------------------------------------------------------------------------------------
double complex_holder_table ( double x0, double x1)
{
// The regular HolderTable function
//return -std::abs(sin(x0)*cos(x1)*exp(std::abs(1-std::sqrt(x0*x0+x1*x1)/pi)));
// My more complex version of it with discontinuities and more local minima.
double sign = 1;
for (double j = -4; j < 9; j += 0.5)
{
if (j < x0 && x0 < j+0.5)
x0 += sign*0.25;
sign *= -1;
}
// HolderTable function tilted towards 10,10
return -std::abs(sin(x0)*cos(x1)*exp(std::abs(1-std::sqrt(x0*x0+x1*x1)/pi))) +(x0+x1)/10 + sin(x0*10)*cos(x1*10);
}
// ----------------------------------------------------------------------------------------
void test_global_function_search()
{
function_spec spec{{-10,-10}, {10,10}};
function_spec spec2{{-10,-10, -50}, {10,10, 50}};
global_function_search opt({spec, spec, spec2});
dlib::rand rnd;
bool found_optimal_point = false;
for (int i = 0; i < 400 && !found_optimal_point; ++i)
{
print_spinner();
std::vector<function_evaluation_request> nexts;
for (int k = 0; k < rnd.get_integer_in_range(1,4); ++k)
nexts.emplace_back(opt.get_next_x());
for (auto& next : nexts)
{
switch (next.function_idx())
{
case 0: next.set( -complex_holder_table(next.x()(0), next.x()(1))); break;
case 1: next.set( -10*complex_holder_table(next.x()(0), next.x()(1))); break;
case 2: next.set( -2*complex_holder_table(next.x()(0), next.x()(1))); break;
default: DLIB_TEST(false); break;
}
matrix<double,0,1> x;
double y;
size_t function_idx;
opt.get_best_function_eval(x,y,function_idx);
/*
cout << "\ni: "<< i << endl;
cout << "best eval x: "<< trans(x);
cout << "best eval y: "<< y << endl;
cout << "best eval function index: "<< function_idx << endl;
*/
if (std::abs(y - 10*21.9210397) < 0.0001)
{
found_optimal_point = true;
break;
}
}
}
DLIB_TEST(found_optimal_point);
}
// ----------------------------------------------------------------------------------------
class global_optimization_tester : public tester
......@@ -100,6 +169,7 @@ namespace
test_upper_bound_function(0.1, 1e-6);
test_upper_bound_function(0.0, 1e-6);
test_upper_bound_function(0.0, 1e-1);
test_global_function_search();
}
} a;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment