NetOptim 1.2.6
Loading...
Searching...
No Matches
network_oracle.hpp
Go to the documentation of this file.
1// -*- coding: utf-8 -*-
2#pragma once
3
4#include <digraphx/neg_cycle.hpp> // import NegCycleFinder
5#include <optional>
6#include <type_traits>
7
8namespace {
9 template <typename T>
10 concept HasKeyType = requires { typename T::key_type; };
11} // namespace
12
53template <typename Graph, typename Mapping, typename Fn>
54 requires HasKeyType<Graph>
56 using node_t = typename Graph::key_type;
57
58 private:
59 const Graph& _gra;
60 Mapping& _u; // vertex potentials
61 NegCycleFinder<Graph> _S;
62 Fn _h;
63
64 public:
69 NetworkOracle(const Graph& gra, Mapping& utx, Fn h)
70 : _gra{gra}, _u{utx}, _S(gra), _h{std::move(h)} {}
71
73 explicit NetworkOracle(const NetworkOracle&) = default;
74
80 template <typename Num> auto update(const Num& gamma) -> void { this->_h.update(gamma); }
81
120 template <typename Arr> auto assess_feas(const Arr& xval)
121 -> std::optional<std::pair<Arr, double>> {
122 // ponytail: deduce Edge type using NegCycleFinder helpers
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&>()))>>;
129
130 auto get_weight
131 = [this, &xval](const Edge& edge) -> double { return this->_h.eval(edge, xval); };
132
133 for (auto&& C : this->_S.howard(this->_u, get_weight)) {
134 auto grad = [&]() -> Arr {
135 if constexpr (std::is_arithmetic_v<Arr>) {
136 return Arr{};
137 } else {
138 return Arr(xval.size());
139 }
140 }();
141 auto fval = 0.0;
142 for (auto&& edge : C) {
143 fval -= this->_h.eval(edge, xval);
144 grad -= this->_h.grad(edge, xval);
145 }
146 return std::pair{std::move(grad), fval};
147 }
148 return {};
149 }
150
157 template <typename Arr> auto operator()(const Arr& xvar)
158 -> std::optional<std::pair<Arr, double>> {
159 return this->assess_feas(xvar);
160 }
161};
Oracle for Parametric Network Problems.
Definition network_oracle.hpp:55
auto assess_feas(const Arr &xval) -> std::optional< std::pair< Arr, double > >
Assess feasibility and generate cutting plane if needed.
Definition network_oracle.hpp:120
NetworkOracle(const NetworkOracle &)=default
Copy constructor.
auto operator()(const Arr &xvar) -> std::optional< std::pair< Arr, double > >
Function call operator for cutting plane methods.
Definition network_oracle.hpp:157
auto update(const Num &gamma) -> void
Update the oracle with a new parameter value.
Definition network_oracle.hpp:80
NetworkOracle(const Graph &gra, Mapping &utx, Fn h)
Construct a new network oracle object.
Definition network_oracle.hpp:69
Definition network_oracle.hpp:10