46template <
typename Graph,
typename Mapping,
typename Fn>
47 requires HasKeyType<Graph>
49 using Vec = std::valarray<double>;
50 using node_t =
typename Graph::key_type;
51 using Cut = std::pair<Vec, double>;
67 Ratio(
const Graph& gra, Fn get_cost) : _gra{gra}, _get_cost{std::move(get_cost)} {}
70 explicit Ratio(
const Ratio&) =
default;
98 auto eval(
const auto& edge,
const Vec& x)
const ->
double {
99 const auto [aij, aji] = this->_get_cost(edge);
100 return std::min(x[0] - aji, aij - x[1]);
134 auto grad(
const auto& edge,
const Vec& x)
const -> Vec {
135 const auto [aij, aji] = this->_get_cost(edge);
136 return (x[0] - aji < aij - x[1]) ? Vec{1., 0.} : Vec{0., -1.};
148 : _network(gra, utx, Ratio{gra, get_cost}) {}
195 return {*cut,
false};
197 auto s = x[0] - x[1];
201 return {{Vec{1., -1.}, 0.},
true};
203 return {{Vec{1., -1.}, fj},
false};
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
Oracle for Optimal Matrix Scaling.
Definition optscaling_oracle.hpp:48
OptScalingOracle & operator=(const OptScalingOracle &)=default
auto assess_optim(const Vec &x, double &t) -> std::tuple< Cut, bool >
Assess optimality at point x (cutting plane interface)
Definition optscaling_oracle.hpp:192
OptScalingOracle(OptScalingOracle &&)=default
OptScalingOracle & operator=(OptScalingOracle &&)=default
OptScalingOracle(const OptScalingOracle &)=default
Copy constructor.
OptScalingOracle(const Graph &gra, Mapping &utx, Fn get_cost)
Construct a new optscaling oracle object.
Definition optscaling_oracle.hpp:147
auto operator()(const Vec &x, double &t) -> std::tuple< Cut, bool >
Function call operator for cutting_plane_optim()
Definition optscaling_oracle.hpp:210
~OptScalingOracle()=default
Oracle for Parametric Network Problems.