Skip to content

Commit a1abc39

Browse files
committed
started migration to nanobind
1 parent 0889633 commit a1abc39

17 files changed

Lines changed: 967 additions & 927 deletions

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ string(REGEX REPLACE "\n$" "" VERSION_STRING "${VERSION_STRING}")
77
project(ioh
88
VERSION "${VERSION_STRING}"
99
LANGUAGES CXX
10-
)
11-
10+
)
11+
1212
add_compile_definitions(PROJECT_VER="${CMAKE_PROJECT_VERSION}")
1313

1414
set(CMAKE_CXX_STANDARD 17)

ioh/CMakeLists.txt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,42 @@
1-
add_subdirectory(${EXTERNAL_DIR}/pybind11 build)
1+
# add_subdirectory(${EXTERNAL_DIR}/pybind11 build)
22

3+
if (CMAKE_VERSION VERSION_LESS 3.18)
4+
set(DEV_MODULE Development)
5+
else()
6+
set(DEV_MODULE Development.Module)
7+
endif()
8+
9+
find_package(Python 3.8 COMPONENTS Interpreter ${DEV_MODULE} REQUIRED)
10+
11+
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
12+
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
13+
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
14+
endif()
15+
16+
execute_process(
17+
COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
18+
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE nanobind_ROOT)
19+
20+
find_package(nanobind CONFIG REQUIRED)
321

422
file(GLOB SOURCES src/*.cpp)
5-
pybind11_add_module(iohcpp ${SOURCES})
23+
nanobind_add_module(iohcpp
24+
src/empirical_attainment.cpp
25+
# src/integer.cpp
26+
# src/integer_suite.cpp
27+
src/ioh.cpp
28+
src/pch.cpp
29+
# src/logger.cpp
30+
src/problem.cpp
31+
src/problem_helpers.cpp
32+
# src/property.cpp
33+
# src/real.cpp
34+
# src/real_suite.cpp
35+
# src/suite.cpp
36+
# src/suite_helpers.cpp
37+
src/trigger.cpp
38+
)
39+
640

741
target_link_libraries(iohcpp PRIVATE ${PROJECT_NAME})
842
target_compile_definitions(iohcpp PRIVATE VERSION_INFO=${EXAMPLE_VERSION_INFO})

ioh/src/empirical_attainment.cpp

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,73 @@
11
#include "pch.hpp"
22

33
template <typename T>
4-
void define_eah_scale(py::module &m, const std::string &name)
4+
void define_eah_scale(nb::module_ &m, const std::string &name)
55
{
66
using namespace logger::eah;
7+
using BaseScale = Scale<T>;
78

8-
py::class_<Scale<T>, std::shared_ptr<Scale<T>>>(m, name.c_str())
9-
.def_property_readonly("min", &Scale<T>::min)
10-
.def_property_readonly("max", &Scale<T>::max)
11-
.def_property_readonly("size", &Scale<T>::size)
12-
.def_property_readonly("length", &Scale<T>::length)
13-
.def("index", &Scale<T>::index)
14-
.def("bounds", &Scale<T>::bounds)
15-
.def("__repr__", [name](const Scale<T> &s) {
9+
nb::class_<BaseScale>(m, name.c_str())
10+
.def_prop_ro("min", &BaseScale::min)
11+
.def_prop_ro("max", &BaseScale::max)
12+
.def_prop_ro("size", &BaseScale::size)
13+
.def_prop_ro("length", &BaseScale::length)
14+
.def("index", &BaseScale::index)
15+
.def("bounds", &BaseScale::bounds)
16+
.def("__repr__", [name](const BaseScale &s) {
1617
return fmt::format("<{} (({}, {}), {})>", name, s.min(), s.max(), s.size());
1718
});
1819

19-
py::class_<LinearScale<T>, Scale<T>, std::shared_ptr<LinearScale<T>>>(m, ("Linear" + name).c_str())
20-
.def(py::init<T, T, size_t>())
20+
nb::class_<LinearScale<T>, BaseScale>(m, ("Linear" + name).c_str())
21+
.def(nb::init<T, T, size_t>())
2122
.def("step", &LinearScale<T>::step);
22-
py::class_<Log2Scale<T>, Scale<T>, std::shared_ptr<Log2Scale<T>>>(m, ("Log2" + name).c_str())
23-
.def(py::init<T, T, size_t>());
2423

25-
py::class_<Log10Scale<T>, Scale<T>, std::shared_ptr<Log10Scale<T>>>(m, ("Log10" + name).c_str())
26-
.def(py::init<T, T, size_t>());
24+
nb::class_<Log2Scale<T>, BaseScale>(m, ("Log2" + name).c_str())
25+
.def(nb::init<T, T, size_t>());
26+
27+
nb::class_<Log10Scale<T>, BaseScale>(m, ("Log10" + name).c_str())
28+
.def(nb::init<T, T, size_t>());
2729
}
28-
void define_eah(py::module &m)
30+
void define_eah(nb::module_ &m)
2931
{
3032
using namespace logger;
3133
auto eah = m.def_submodule("eah");
3234
define_eah_scale<double>(eah, "RealScale");
3335
define_eah_scale<size_t>(eah, "IntegerScale");
3436

35-
py::class_<EAH, Logger, std::shared_ptr<EAH>>(m, "EAH", "Emperical Attainment Histogram Logger")
36-
.def(py::init<double, double, size_t, size_t, size_t, size_t>(), py::arg("error_min"), py::arg("error_max"),
37-
py::arg("error_buckets"), py::arg("evals_min"), py::arg("evals_max"), py::arg("evals_buckets"))
38-
.def(py::init<eah::LinearScale<double> &, eah::LinearScale<size_t> &>(), py::arg("error_scale"),
39-
py::arg("eval_scale"))
40-
.def(py::init<eah::Log2Scale<double> &, eah::Log2Scale<size_t> &>(), py::arg("error_scale"),
41-
py::arg("eval_scale"))
42-
.def(py::init<eah::Log10Scale<double> &, eah::Log10Scale<size_t> &>(), py::arg("error_scale"),
43-
py::arg("eval_scale"))
37+
nb::class_<EAH, Logger>(m, "EAH", "Emperical Attainment Histogram Logger")
38+
.def(nb::init<double, double, size_t, size_t, size_t, size_t>(), nb::arg("error_min"), nb::arg("error_max"),
39+
nb::arg("error_buckets"), nb::arg("evals_min"), nb::arg("evals_max"), nb::arg("evals_buckets"))
40+
.def(nb::init<eah::LinearScale<double> &, eah::LinearScale<size_t> &>(), nb::arg("error_scale"),
41+
nb::arg("eval_scale"))
42+
.def(nb::init<eah::Log2Scale<double> &, eah::Log2Scale<size_t> &>(), nb::arg("error_scale"),
43+
nb::arg("eval_scale"))
44+
.def(nb::init<eah::Log10Scale<double> &, eah::Log10Scale<size_t> &>(), nb::arg("error_scale"),
45+
nb::arg("eval_scale"))
4446
.def("at", &logger::EAH::at)
45-
.def_property_readonly("data", &logger::EAH::data)
46-
.def_property_readonly("size", &logger::EAH::size)
47-
.def_property_readonly("error_range", &logger::EAH::error_range, py::return_value_policy::reference)
48-
.def_property_readonly("eval_range", &logger::EAH::eval_range, py::return_value_policy::reference)
47+
.def_prop_ro("data", &logger::EAH::data)
48+
.def_prop_ro("size", &logger::EAH::size)
49+
.def_prop_ro("error_range", &logger::EAH::error_range, nb::rv_policy::reference)
50+
.def_prop_ro("eval_range", &logger::EAH::eval_range, nb::rv_policy::reference)
4951
.def("__repr__", [](const logger::EAH &l) { return fmt::format("<EAH {}>", l.size()); });
5052
}
5153

52-
void define_eaf(py::module &m)
54+
void define_eaf(nb::module_ &m)
5355
{
5456
using namespace logger;
5557

5658
auto eaf = m.def_submodule("eaf");
57-
py::class_<eaf::Point, std::shared_ptr<eaf::Point>>(eaf, "Point")
58-
.def(py::init<double, size_t>())
59+
nb::class_<eaf::Point>(eaf, "Point")
60+
.def(nb::init<double, size_t>())
5961
.def("__repr__", [](const eaf::Point &p) { return fmt::format("<Point {} {}>", p.qual, p.time); });
6062

61-
py::class_<eaf::RunPoint, eaf::Point, std::shared_ptr<eaf::RunPoint>>(eaf, "RunPoint")
62-
.def(py::init<double, size_t, size_t>())
63+
nb::class_<eaf::RunPoint, eaf::Point>(eaf, "RunPoint")
64+
.def(nb::init<double, size_t, size_t>())
6365
.def("__repr__",
6466
[](const eaf::RunPoint &p) { return fmt::format("<RunPoint {} {} {}>", p.qual, p.time, p.run); });
6567

66-
py::class_<EAF, Logger, std::shared_ptr<EAF>>(m, "EAF", "Emperical Attainment Function Logger")
67-
.def(py::init<>())
68-
.def_property_readonly("data", py::overload_cast<>(&EAF::data, py::const_))
68+
nb::class_<EAF, Logger>(m, "EAF", "Emperical Attainment Function Logger")
69+
.def(nb::init<>())
70+
.def_prop_ro("data", nb::overload_cast<>(&EAF::data, nb::const_))
6971
.def("at", [](EAF &f, std::string suite_name, int pb, int dim, int inst, size_t run) {
7072
const auto cursor = EAF::Cursor(suite_name, pb, dim, inst, run);
7173
return f.data(cursor);

0 commit comments

Comments
 (0)