121 -> std::optional<std::pair<Arr, double>> {
123 using Elem =
decltype(*std::declval<const Graph&>().begin());
124 using Nbrs = std::remove_cv_t<std::remove_reference_t<
decltype(_get_val(
125 std::declval<Elem>(), std::declval<const Graph&>()))>>;
126 using NbrElem =
decltype(*std::declval<const Nbrs&>().begin());
127 using Edge = std::remove_cv_t<std::remove_reference_t<
decltype(_get_val(
128 std::declval<NbrElem>(), std::declval<const Nbrs&>()))>>;
131 = [
this, &xval](
const Edge& edge) ->
double {
return this->_h.eval(edge, xval); };
133 for (
auto&& C : this->_S.howard(this->_u, get_weight)) {
134 auto grad = [&]() -> Arr {
135 if constexpr (std::is_arithmetic_v<Arr>) {
138 return Arr(xval.size());
142 for (
auto&& edge : C) {
143 fval -= this->_h.eval(edge, xval);
144 grad -= this->_h.grad(edge, xval);
146 return std::pair{std::move(grad), fval};