| 993 | } |
| 994 | |
| 995 | void register_params(nb::module_& m) { |
| 996 | register_optimization_properties(); |
| 997 | register_dataset_properties(); |
| 998 | |
| 999 | nb::enum_<MaskMode>(m, "MaskMode") |
| 1000 | .value("NONE", MaskMode::None) |
| 1001 | .value("SEGMENT", MaskMode::Segment) |
| 1002 | .value("IGNORE", MaskMode::Ignore) |
| 1003 | .value("SEGMENT_AND_IGNORE", MaskMode::SegmentAndIgnore) |
| 1004 | .value("ALPHA_CONSISTENT", MaskMode::AlphaConsistent); |
| 1005 | |
| 1006 | nb::enum_<BackgroundMode>(m, "BackgroundMode") |
| 1007 | .value("SOLID_COLOR", BackgroundMode::SolidColor) |
| 1008 | .value("MODULATION", BackgroundMode::Modulation) |
| 1009 | .value("IMAGE", BackgroundMode::Image) |
| 1010 | .value("RANDOM", BackgroundMode::Random); |
| 1011 | |
| 1012 | nb::class_<PyOptimizationParams>(m, "OptimizationParams") |
| 1013 | .def(nb::init<>()) |
| 1014 | .def_prop_ro( |
| 1015 | "__property_group__", [](PyOptimizationParams&) { return "optimization"; }, "Property group identifier") |
| 1016 | .def("get", &PyOptimizationParams::get, nb::arg("name"), "Get property value by name") |
| 1017 | .def("set", &PyOptimizationParams::set, nb::arg("name"), nb::arg("value"), "Set property value by name") |
| 1018 | .def("__getattr__", &PyOptimizationParams::get, nb::arg("name"), "Get property value by attribute name") |
| 1019 | .def("prop_info", &PyOptimizationParams::prop_info, nb::arg("prop_id"), |
| 1020 | "Get metadata for a property") |
| 1021 | .def("reset", &PyOptimizationParams::reset, nb::arg("prop_id"), |
| 1022 | "Reset property to default value") |
| 1023 | .def("properties", &PyOptimizationParams::properties, |
| 1024 | "List all properties with their current values") |
| 1025 | .def("get_all_properties", &PyOptimizationParams::get_all_properties, |
| 1026 | "Get all property descriptors as Python Property objects") |
| 1027 | .def("has_params", &PyOptimizationParams::has_params, |
| 1028 | "Check if ParameterManager is available") |
| 1029 | .def( |
| 1030 | "validate", [](PyOptimizationParams& self) { return self.params().validate(); }, |
| 1031 | "Validate parameter consistency, returns empty string if valid") |
| 1032 | .def_prop_rw( |
| 1033 | "iterations", |
| 1034 | [](PyOptimizationParams& self) { return self.params().iterations; }, |
| 1035 | [](PyOptimizationParams&, size_t v) { modify_params([v](auto& p) { p.iterations = v; }); }, |
| 1036 | "Maximum training iterations") |
| 1037 | .def_prop_rw( |
| 1038 | "means_lr", |
| 1039 | [](PyOptimizationParams& self) { return self.params().means_lr; }, |
| 1040 | [](PyOptimizationParams&, float v) { modify_params([v](auto& p) { p.means_lr = v; }); }, |
| 1041 | "Learning rate for gaussian positions") |
| 1042 | .def_prop_rw( |
| 1043 | "means_lr_end", |
| 1044 | [](PyOptimizationParams& self) { return self.params().means_lr_end; }, |
| 1045 | [](PyOptimizationParams&, float v) { modify_params([v](auto& p) { p.means_lr_end = v; }); }, |
| 1046 | "Target end learning rate for gaussian positions") |
| 1047 | .def_prop_rw( |
| 1048 | "shs_lr", |
| 1049 | [](PyOptimizationParams& self) { return self.params().shs_lr; }, |
| 1050 | [](PyOptimizationParams&, float v) { modify_params([v](auto& p) { p.shs_lr = v; }); }, |
| 1051 | "Learning rate for spherical harmonics") |
| 1052 | .def_prop_rw( |
no test coverage detected