Skip to content

Commit

Permalink
Attach the C++ implementation to the Python symbols.
Browse files Browse the repository at this point in the history
  • Loading branch information
Dimitri Rusin committed Feb 1, 2024
1 parent 2eb95ab commit 54f8995
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -320,3 +320,8 @@ We get `CMake Deprecation Warning`s for these GitHub repos:
external/json/CMakeLists.txt
external/pybind11/CMakeLists.txt
```
Run Unit tests:
```sh
python -m unittest -v
```
88 changes: 88 additions & 0 deletions ioh/src/problem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,93 @@ void define_bbob_problems(py::module &mi, const std::string &name = "BBOB", cons
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));
}


void define_cec_problems(py::module &m)
{
py::class_<CEC, RealSingleObjective, std::shared_ptr<CEC>>(
m,
"CEC",
R"pbdoc(
Functions from the CEC 2022 conference.
)pbdoc"
)
.def_static(
"create",
[](const std::string &name, int iid, int dim) {
return ioh::common::Factory<CEC, int, int>::instance().create(name, iid, dim);
},
py::arg("problem_name"), py::arg("instance_id"), py::arg("dimension"),
R"pbdoc(
Create a problem instance
Parameters
----------
problem_name: str
a string indicating the problem name.
instance_id: int
an integer identifier of the problem instance
dimension: int
the dimensionality of the search space
)pbdoc")
.def_static(
"create",
[](int id, int iid, int dim) {
return ioh::common::Factory<CEC, int, int>::instance().create(id, iid, dim);
},
py::arg("problem_id"), py::arg("instance_id"), py::arg("dimension"),
R"pbdoc(
Create a problem instance
Parameters
----------
problem_id: int
a number indicating the problem numeric identifier.
instance_id: int
an integer identifier of the problem instance
dimension: int
the dimensionality of the search space
)pbdoc")
.def_property_readonly_static(
"problems", [](py::object) { return ioh::common::Factory<CEC, int, int>::instance().map(); },
"All registered problems");

py::class_<cec::CEC_Zakharov, CEC, std::shared_ptr<cec::CEC_Zakharov>>(m, "CEC_Zakharov", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_Rosenbrock, CEC, std::shared_ptr<cec::CEC_Rosenbrock>>(m, "CEC_Rosenbrock", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_ExpandedSchafferF7, CEC, std::shared_ptr<cec::CEC_ExpandedSchafferF7>>(m, "CEC_ExpandedSchafferF7", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_Rastrigin, CEC, std::shared_ptr<cec::CEC_Rastrigin>>(m, "CEC_Rastrigin", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_Levy, CEC, std::shared_ptr<cec::CEC_Levy>>(m, "CEC_Levy", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_HybridFunction1, CEC, std::shared_ptr<cec::CEC_HybridFunction1>>(m, "CEC_HybridFunction1", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_HybridFunction2, CEC, std::shared_ptr<cec::CEC_HybridFunction2>>(m, "CEC_HybridFunction2", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_HybridFunction3, CEC, std::shared_ptr<cec::CEC_HybridFunction3>>(m, "CEC_HybridFunction3", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_CompositionFunction1, CEC, std::shared_ptr<cec::CEC_CompositionFunction1>>(m, "CompositionFunction1", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_CompositionFunction2, CEC, std::shared_ptr<cec::CEC_CompositionFunction2>>(m, "CompositionFunction2", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_CompositionFunction3, CEC, std::shared_ptr<cec::CEC_CompositionFunction3>>(m, "CompositionFunction3", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));

py::class_<cec::CEC_CompositionFunction4, CEC, std::shared_ptr<cec::CEC_CompositionFunction4>>(m, "CompositionFunction4", py::is_final())
.def(py::init<int, int>(), py::arg("instance"), py::arg("n_variables"));
}

void define_problem_bases(py::module &m)
{
define_base_class<RealSingleObjective, double>(m, "RealSingleObjective");
Expand Down Expand Up @@ -1463,6 +1550,7 @@ void define_problem(py::module &m)
define_bbob_problems<ioh::problem::BBOB>(m);
define_bbob_problems<ioh::problem::SBOX>(m, "SBOX", true);
define_pbo_problems(m);
define_cec_problems(m);
define_wmodels(m);
define_submodular_problems(m);
define_star_discrepancy_problems(m);
Expand Down
100 changes: 100 additions & 0 deletions tests/python/test_cec_functions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import ioh

print("ioh.problem.RealSingleObjective.problems")
print(ioh.problem.RealSingleObjective.problems)

f1 = ioh.get_problem(1001, 1, 2)
x1 = [2, 31]
y1 = f1(x1)
print()
print("function 1001")
print(x1)
print(y1)

f2 = ioh.get_problem(1002, 1, 2)
x2 = [2, 31]
y2 = f2(x2)
print()
print("function 1002")
print(x2)
print(y2)

f3 = ioh.get_problem(1003, 1, 2)
x3 = [2, 31]
y3 = f3(x3)
print()
print("function 1003")
print(x3)
print(y3)

f4 = ioh.get_problem(1004, 1, 2)
x4 = [2, 31]
y4 = f4(x4)
print()
print("function 1004")
print(x4)
print(y4)

f = ioh.get_problem(1005, 1, 2)
x = [2, 31]
y = f(x)
print()
print("function 1005")
print(x)
print(y)

f = ioh.get_problem(1006, 1, 20)
x = [1,2,5,3,22,2,2,7,6,5,5,4,34,1,2,-13,4,5,6,7]
y = f(x)
print()
print("function 1006")
print(x)
print(y)

f = ioh.get_problem(1007, 1, 20)
x = [1,2,5,3,22,2,2,7,6,5,5,4,34,1,2,-13,4,5,6,7]
y = f(x)
print()
print("function 1007")
print(x)
print(y)

f = ioh.get_problem(1008, 1, 20)
x = [1,2,5,3,22,2,2,7,6,5,5,4,34,1,2,-13,4,5,6,7]
y = f(x)
print()
print("function 1008")
print(x)
print(y)

f = ioh.get_problem(1009, 1, 2)
x = [2, 31]
y = f(x)
print()
print("function 1009")
print(x)
print(y)

f = ioh.get_problem(1010, 1, 2)
x = [2, 31]
y = f(x)
print()
print("function 1010")
print(x)
print(y)

f = ioh.get_problem(1011, 1, 2)
x = [2, 31]
y = f(x)
print()
print("function 1011")
print(x)
print(y)

f = ioh.get_problem(1012, 1, 2)
x = [2, 31]
y = f(x)
print()
print("function 1012")
print(x)
print(y)

0 comments on commit 54f8995

Please sign in to comment.