diff --git a/core/config/config_helper.hpp b/core/config/config_helper.hpp index ea171336645..be18b32b305 100644 --- a/core/config/config_helper.hpp +++ b/core/config/config_helper.hpp @@ -139,9 +139,10 @@ get_value(const pnode& config) * This is specialization for integral type */ template -inline - typename std::enable_if::value, IndexType>::type - get_value(const pnode& config) +inline typename std::enable_if::value && + !std::is_same::value, + IndexType>::type +get_value(const pnode& config) { auto val = config.get_integer(); GKO_THROW_IF_INVALID( diff --git a/core/config/solver_config.cpp b/core/config/solver_config.cpp index 4e446cfeefd..43b00965a48 100644 --- a/core/config/solver_config.cpp +++ b/core/config/solver_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017-2023 The Ginkgo authors +// SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors // // SPDX-License-Identifier: BSD-3-Clause @@ -19,7 +19,7 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" #include "core/config/dispatch.hpp" #include "core/config/solver_config.hpp" @@ -28,18 +28,18 @@ namespace gko { namespace config { // for valuetype only -#define PARSE(_type) \ - template <> \ - deferred_factory_parameter \ - parse(const pnode& config, \ - const registry& context, \ - gko::config::type_descriptor td) \ - { \ - auto updated = update_type(config, td); \ - return dispatch( \ - config, context, updated, \ - make_type_selector(updated.get_value_typestr(), \ - value_type_list())); \ +#define PARSE(_type) \ + template <> \ + deferred_factory_parameter \ + parse(const pnode& config, \ + const registry& context, \ + const type_descriptor& td) \ + { \ + auto updated = update_type(config, td); \ + return dispatch( \ + config, context, updated, \ + make_type_selector(updated.get_value_typestr(), \ + value_type_list())); \ } PARSE(Cg) @@ -55,40 +55,37 @@ PARSE(CbGmres) template <> -deferred_factory_parameter -parse(const pnode& config, - const registry& context, - gko::config::type_descriptor td) +deferred_factory_parameter parse( + const pnode& config, const registry& context, const type_descriptor& td) { auto updated = update_type(config, td); return dispatch( - config, context, updated, make_type_selector(updated.get_value_typestr(), value_type_list()), make_type_selector(updated.get_index_typestr(), index_type_list()) - ); + config, context, updated, + make_type_selector(updated.get_value_typestr(), value_type_list()), + make_type_selector(updated.get_index_typestr(), index_type_list())); } template <> -deferred_factory_parameter -parse(const pnode& config, - const registry& context, - gko::config::type_descriptor td) +deferred_factory_parameter parse( + const pnode& config, const registry& context, const type_descriptor& td) { auto updated = update_type(config, td); return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), make_type_selector(updated.get_index_typestr(), index_type_list())); + config, context, updated, + make_type_selector(updated.get_value_typestr(), value_type_list()), + make_type_selector(updated.get_index_typestr(), index_type_list())); } template <> -deferred_factory_parameter -parse(const pnode& config, - const registry& context, - gko::config::type_descriptor td) +deferred_factory_parameter parse( + const pnode& config, const registry& context, const type_descriptor& td) { auto updated = update_type(config, td); return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), make_type_selector(updated.get_index_typestr(), index_type_list())); + config, context, updated, + make_type_selector(updated.get_value_typestr(), value_type_list()), + make_type_selector(updated.get_index_typestr(), index_type_list())); } diff --git a/core/config/solver_config.hpp b/core/config/solver_config.hpp index e06272e3357..d3aced34ac2 100644 --- a/core/config/solver_config.hpp +++ b/core/config/solver_config.hpp @@ -10,7 +10,7 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" #include "core/config/dispatch.hpp" namespace gko { diff --git a/core/solver/bicg.cpp b/core/solver/bicg.cpp index 0cf4093cbbb..b9be569f902 100644 --- a/core/solver/bicg.cpp +++ b/core/solver/bicg.cpp @@ -36,7 +36,7 @@ GKO_REGISTER_OPERATION(step_2, bicg::step_2); template typename Bicg::parameters_type Bicg::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Bicg::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/bicgstab.cpp b/core/solver/bicgstab.cpp index b4e0debf1bf..36c9c758371 100644 --- a/core/solver/bicgstab.cpp +++ b/core/solver/bicgstab.cpp @@ -38,10 +38,9 @@ GKO_REGISTER_OPERATION(finalize, bicgstab::finalize); template -typename Bicgstab::parameters_type -Bicgstab::parse(const config::pnode& config, - const config::registry& context, - config::type_descriptor td_for_child) +typename Bicgstab::parameters_type Bicgstab::parse( + const config::pnode& config, const config::registry& context, + const config::type_descriptor& td_for_child) { auto factory = solver::Bicgstab::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/cb_gmres.cpp b/core/solver/cb_gmres.cpp index 2133b796db0..6e2608e5c47 100644 --- a/core/solver/cb_gmres.cpp +++ b/core/solver/cb_gmres.cpp @@ -160,10 +160,9 @@ struct helper> { template -typename CbGmres::parameters_type -CbGmres::parse(const config::pnode& config, - const config::registry& context, - config::type_descriptor td_for_child) +typename CbGmres::parameters_type CbGmres::parse( + const config::pnode& config, const config::registry& context, + const config::type_descriptor& td_for_child) { auto factory = solver::CbGmres::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/cg.cpp b/core/solver/cg.cpp index 82d05132243..663b3b43694 100644 --- a/core/solver/cg.cpp +++ b/core/solver/cg.cpp @@ -38,7 +38,7 @@ GKO_REGISTER_OPERATION(step_2, cg::step_2); template typename Cg::parameters_type Cg::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Cg::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/cgs.cpp b/core/solver/cgs.cpp index 0e136b89a5f..90962b44861 100644 --- a/core/solver/cgs.cpp +++ b/core/solver/cgs.cpp @@ -39,7 +39,7 @@ GKO_REGISTER_OPERATION(step_3, cgs::step_3); template typename Cgs::parameters_type Cgs::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Cgs::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/direct.cpp b/core/solver/direct.cpp index 76f57168347..c4c65ca132a 100644 --- a/core/solver/direct.cpp +++ b/core/solver/direct.cpp @@ -13,7 +13,7 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" namespace gko { @@ -23,9 +23,9 @@ namespace solver { template typename Direct::parameters_type -Direct::parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) +Direct::parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child) { auto factory = Direct::build(); if (auto& obj = config.get("num_rhs")) { diff --git a/core/solver/fcg.cpp b/core/solver/fcg.cpp index 994a1c453f4..316b7a3466b 100644 --- a/core/solver/fcg.cpp +++ b/core/solver/fcg.cpp @@ -37,7 +37,7 @@ GKO_REGISTER_OPERATION(step_2, fcg::step_2); template typename Fcg::parameters_type Fcg::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Fcg::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/gcr.cpp b/core/solver/gcr.cpp index 55b6fb77acf..92e3233bc7a 100644 --- a/core/solver/gcr.cpp +++ b/core/solver/gcr.cpp @@ -40,7 +40,7 @@ GKO_REGISTER_OPERATION(step_1, gcr::step_1); template typename Gcr::parameters_type Gcr::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Gcr::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/gmres.cpp b/core/solver/gmres.cpp index b546e83f78c..8bec63d6376 100644 --- a/core/solver/gmres.cpp +++ b/core/solver/gmres.cpp @@ -44,7 +44,7 @@ GKO_REGISTER_OPERATION(multi_axpy, gmres::multi_axpy); template typename Gmres::parameters_type Gmres::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Gmres::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/idr.cpp b/core/solver/idr.cpp index ee88f2dfa05..fb42b184463 100644 --- a/core/solver/idr.cpp +++ b/core/solver/idr.cpp @@ -39,7 +39,7 @@ GKO_REGISTER_OPERATION(compute_omega, idr::compute_omega); template typename Idr::parameters_type Idr::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Idr::build(); common_solver_configure(factory, config, context, td_for_child); diff --git a/core/solver/ir.cpp b/core/solver/ir.cpp index 78f48fc788d..1dfe871ac05 100644 --- a/core/solver/ir.cpp +++ b/core/solver/ir.cpp @@ -10,7 +10,7 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" #include "core/distributed/helpers.hpp" #include "core/solver/ir_kernels.hpp" #include "core/solver/solver_base.hpp" @@ -33,7 +33,7 @@ GKO_REGISTER_OPERATION(initialize, ir::initialize); template typename Ir::parameters_type Ir::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = solver::Ir::build(); if (auto& obj = config.get("criteria")) { @@ -47,7 +47,7 @@ typename Ir::parameters_type Ir::parse( } if (auto& obj = config.get("generated_solver")) { factory.with_generated_solver( - gko::config::get_pointer(obj, context, td_for_child)); + gko::config::get_stored_obj(obj, context)); } if (auto& obj = config.get("relaxation_factor")) { factory.with_relaxation_factor(gko::config::get_value(obj)); diff --git a/core/solver/lower_trs.cpp b/core/solver/lower_trs.cpp index 339ab7aabc8..932602c3f27 100644 --- a/core/solver/lower_trs.cpp +++ b/core/solver/lower_trs.cpp @@ -14,7 +14,7 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" #include "core/solver/lower_trs_kernels.hpp" @@ -38,7 +38,7 @@ template typename LowerTrs::parameters_type LowerTrs::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = LowerTrs::build(); // duplicate? diff --git a/core/solver/upper_trs.cpp b/core/solver/upper_trs.cpp index c0eda15b996..089513c5d97 100644 --- a/core/solver/upper_trs.cpp +++ b/core/solver/upper_trs.cpp @@ -14,7 +14,7 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" #include "core/solver/upper_trs_kernels.hpp" @@ -38,7 +38,7 @@ template typename UpperTrs::parameters_type UpperTrs::parse( const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child) + const config::type_descriptor& td_for_child) { auto factory = UpperTrs::build(); // duplicate? diff --git a/core/test/config/solver.cpp b/core/test/config/solver.cpp index ed1737a4d28..c2a53214e2f 100644 --- a/core/test/config/solver.cpp +++ b/core/test/config/solver.cpp @@ -26,7 +26,8 @@ #include -#include "core/config/config.hpp" +#include "core/config/config_helper.hpp" +#include "core/config/registry_accessor.hpp" #include "core/test/utils.hpp" @@ -56,14 +57,16 @@ struct SolverConfigTest { { config_map["generated_preconditioner"] = pnode{"linop"}; param.with_generated_preconditioner( - reg.search_data("linop")); + detail::registry_accessor::get_data(reg, "linop")); if (from_reg) { config_map["criteria"] = pnode{"criterion_factory"}; - param.with_criteria(reg.search_data( - "criterion_factory")); + param.with_criteria( + detail::registry_accessor::get_data< + gko::stop::CriterionFactory>(reg, "criterion_factory")); config_map["preconditioner"] = pnode{"linop_factory"}; param.with_preconditioner( - reg.search_data("linop_factory")); + detail::registry_accessor::get_data( + reg, "linop_factory")); } else { config_map["criteria"] = pnode{ std::map{{"Type", pnode{"Iteration"}}}}; @@ -154,18 +157,21 @@ struct Ir : SolverConfigTest, gko::solver::Ir> { std::shared_ptr exec) { config_map["generated_solver"] = pnode{"linop"}; - param.with_generated_solver(reg.search_data("linop")); + param.with_generated_solver( + detail::registry_accessor::get_data(reg, "linop")); config_map["relaxation_factor"] = pnode{1.2}; param.with_relaxation_factor(decltype(param.relaxation_factor){1.2}); config_map["default_initial_guess"] = pnode{"zero"}; param.with_default_initial_guess(gko::solver::initial_guess_mode::zero); if (from_reg) { config_map["criteria"] = pnode{"criterion_factory"}; - param.with_criteria(reg.search_data( - "criterion_factory")); + param.with_criteria( + detail::registry_accessor::get_data< + gko::stop::CriterionFactory>(reg, "criterion_factory")); config_map["solver"] = pnode{"linop_factory"}; param.with_solver( - reg.search_data("linop_factory")); + detail::registry_accessor::get_data( + reg, "linop_factory")); } else { config_map["criteria"] = pnode{ std::map{{"Type", pnode{"Iteration"}}}}; @@ -358,7 +364,8 @@ struct Direct if (from_reg) { config_map["factorization"] = pnode{"linop_factory"}; param.with_factorization( - reg.search_data("linop_factory")); + detail::registry_accessor::get_data( + reg, "linop_factory")); } else { config_map["factorization"] = pnode{{{"Type", pnode{"Cg"}}, {"ValueType", pnode{"double"}}}}; @@ -445,7 +452,7 @@ class Solver : public ::testing::Test { solver_factory(DummySolver::build().on(exec)), stop_factory(DummyStop::build().on(exec)), td("double", "int"), - reg(generate_config_map()) + reg() { reg.emplace("linop", mtx); reg.emplace("linop_factory", solver_factory); diff --git a/include/ginkgo/core/config/registry.hpp b/include/ginkgo/core/config/registry.hpp index fc2b4151089..923bc6b9534 100644 --- a/include/ginkgo/core/config/registry.hpp +++ b/include/ginkgo/core/config/registry.hpp @@ -186,9 +186,6 @@ class registry final { * {"cg", cg_shared_ptr} * }} * ``` - * @param build_map the build map to dispatch the class base. Ginkgo - * provides `generate_config_map()` in config.hpp to provide the ginkgo - * build map. Users can extend this map to fit their own LinOpFactory. */ registry( const std::unordered_map& stored_map, diff --git a/include/ginkgo/core/solver/bicg.hpp b/include/ginkgo/core/solver/bicg.hpp index 268a899b99a..0e52542e607 100644 --- a/include/ginkgo/core/solver/bicg.hpp +++ b/include/ginkgo/core/solver/bicg.hpp @@ -82,9 +82,9 @@ class Bicg GKO_ENABLE_LIN_OP_FACTORY(Bicg, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/bicgstab.hpp b/include/ginkgo/core/solver/bicgstab.hpp index 7cfbc9eb59c..c256cf6dabe 100644 --- a/include/ginkgo/core/solver/bicgstab.hpp +++ b/include/ginkgo/core/solver/bicgstab.hpp @@ -80,9 +80,9 @@ class Bicgstab GKO_ENABLE_LIN_OP_FACTORY(Bicgstab, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/cb_gmres.hpp b/include/ginkgo/core/solver/cb_gmres.hpp index 6b57ce0e51b..a49750d79fe 100644 --- a/include/ginkgo/core/solver/cb_gmres.hpp +++ b/include/ginkgo/core/solver/cb_gmres.hpp @@ -147,9 +147,9 @@ class CbGmres : public EnableLinOp>, GKO_ENABLE_LIN_OP_FACTORY(CbGmres, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/cgs.hpp b/include/ginkgo/core/solver/cgs.hpp index 5eeaf5c22e8..23ed5fccaa9 100644 --- a/include/ginkgo/core/solver/cgs.hpp +++ b/include/ginkgo/core/solver/cgs.hpp @@ -73,9 +73,9 @@ class Cgs GKO_ENABLE_LIN_OP_FACTORY(Cgs, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/direct.hpp b/include/ginkgo/core/solver/direct.hpp index 7f9f1c72ea4..b16094bc2a5 100644 --- a/include/ginkgo/core/solver/direct.hpp +++ b/include/ginkgo/core/solver/direct.hpp @@ -67,9 +67,9 @@ class Direct : public EnableLinOp>, GKO_ENABLE_LIN_OP_FACTORY(Direct, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); /** Creates a copy of the solver. */ Direct(const Direct&); diff --git a/include/ginkgo/core/solver/fcg.hpp b/include/ginkgo/core/solver/fcg.hpp index 06eac148adb..78609543da8 100644 --- a/include/ginkgo/core/solver/fcg.hpp +++ b/include/ginkgo/core/solver/fcg.hpp @@ -81,9 +81,9 @@ class Fcg GKO_ENABLE_LIN_OP_FACTORY(Fcg, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/gcr.hpp b/include/ginkgo/core/solver/gcr.hpp index 34085341984..5a58f1c48da 100644 --- a/include/ginkgo/core/solver/gcr.hpp +++ b/include/ginkgo/core/solver/gcr.hpp @@ -93,9 +93,9 @@ class Gcr GKO_ENABLE_LIN_OP_FACTORY(Gcr, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/gmres.hpp b/include/ginkgo/core/solver/gmres.hpp index 8c8df73620d..3e12819ed9e 100644 --- a/include/ginkgo/core/solver/gmres.hpp +++ b/include/ginkgo/core/solver/gmres.hpp @@ -98,9 +98,9 @@ class Gmres GKO_ENABLE_LIN_OP_FACTORY(Gmres, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/idr.hpp b/include/ginkgo/core/solver/idr.hpp index 2cd1466aaf1..eb4e3e160db 100644 --- a/include/ginkgo/core/solver/idr.hpp +++ b/include/ginkgo/core/solver/idr.hpp @@ -196,9 +196,9 @@ class Idr GKO_ENABLE_LIN_OP_FACTORY(Idr, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/ir.hpp b/include/ginkgo/core/solver/ir.hpp index bfa78812b1e..43ed2466da0 100644 --- a/include/ginkgo/core/solver/ir.hpp +++ b/include/ginkgo/core/solver/ir.hpp @@ -184,9 +184,9 @@ class Ir : public EnableLinOp>, GKO_ENABLE_LIN_OP_FACTORY(Ir, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); protected: void apply_impl(const LinOp* b, LinOp* x) const override; diff --git a/include/ginkgo/core/solver/triangular.hpp b/include/ginkgo/core/solver/triangular.hpp index 16212a02138..017822974a2 100644 --- a/include/ginkgo/core/solver/triangular.hpp +++ b/include/ginkgo/core/solver/triangular.hpp @@ -108,9 +108,9 @@ class LowerTrs : public EnableLinOp>, GKO_ENABLE_LIN_OP_FACTORY(LowerTrs, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); /** * Copy-assigns a triangular solver. Preserves the executor, shallow-copies @@ -262,9 +262,9 @@ class UpperTrs : public EnableLinOp>, GKO_ENABLE_LIN_OP_FACTORY(UpperTrs, parameters, Factory); GKO_ENABLE_BUILD_METHOD(Factory); - static parameters_type parse( - const config::pnode& config, const config::registry& context, - config::type_descriptor td_for_child); + static parameters_type parse(const config::pnode& config, + const config::registry& context, + const config::type_descriptor& td_for_child); /** * Copy-assigns a triangular solver. Preserves the executor, shallow-copies