NetOptim 1.2.6
Loading...
Searching...
No Matches
optscaling_oracle.hpp
Go to the documentation of this file.
1// -*- coding: utf-8 -*-
2#pragma once
3
4#include <cassert>
5#include <valarray>
6
7#include "network_oracle.hpp"
8
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>;
52
58 class Ratio {
59 private:
60 const Graph& _gra;
61 Fn _get_cost;
62
63 public:
67 Ratio(const Graph& gra, Fn get_cost) : _gra{gra}, _get_cost{std::move(get_cost)} {}
68
70 explicit Ratio(const Ratio&) = default;
71
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]);
101 }
102
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.};
137 }
138 };
139
141
142 public:
147 OptScalingOracle(const Graph& gra, Mapping& utx, Fn get_cost)
148 : _network(gra, utx, Ratio{gra, get_cost}) {}
149
151 explicit OptScalingOracle(const OptScalingOracle&) = default;
155 ~OptScalingOracle() = default;
156
192 auto assess_optim(const Vec& x, double& t) -> std::tuple<Cut, bool> {
193 const auto cut = this->_network.assess_feas(x);
194 if (cut) {
195 return {*cut, false};
196 }
197 auto s = x[0] - x[1];
198 auto fj = s - t;
199 if (fj < 0) {
200 t = s;
201 return {{Vec{1., -1.}, 0.}, true};
202 }
203 return {{Vec{1., -1.}, fj}, false};
204 }
205
210 auto operator()(const Vec& x, double& t) -> std::tuple<Cut, bool> { return assess_optim(x, t); }
211};
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.