28 requires std::is_floating_point_v<T>
40 requires(!std::is_floating_point_v<T>)
103template <
typename O,
typename S>
104 requires OracleFeas<O, typename S::ArrayType> && SearchSpace<S>
106 -> std::tuple<CuttingPlaneArrayType<S>,
size_t> {
107 for (
auto niter = 0U; niter != options.max_iters; ++niter) {
108 const auto cut = omega.assess_feas(space.xc());
110 return {space.xc(), niter};
112 const auto status = space.update_bias_cut(*cut);
173template <
typename O,
typename S,
typename N>
176 -> std::tuple<CuttingPlaneArrayType<S>,
size_t> {
180 const auto& cut = std::get<0>(
_result1);
182 const auto status = [&]() {
185 return space.update_central_cut(cut);
187 return space.update_bias_cut(cut);
190 return {std::move(x_best),
niter};
193 return {std::move(x_best),
options.max_iters};
231 auto x_best() -> A& {
return this->_x_best; }
242 this->_x_best = std::move(
x);
243 this->_retry =
false;
256 this->_retry =
false;
299template <
typename O,
typename S,
typename N>
303 -> std::tuple<CuttingPlaneArrayType<S>,
size_t> {
309 const auto& cut = std::get<0>(
result1);
342template <
typename Oracle,
typename Space>
344 using ArrayType =
typename Space::ArrayType;
385 this->_omega->update(
gamma);
389 this->_space->set_xc(
x_feas);
411template <
typename O,
typename T>
414 -> std::tuple<T, size_t> {
Binary search adaptor wrapping a cutting-plane feasibility oracle.
Definition cutting_plane.hpp:343
BSearchAdaptor(Oracle &omega, Space &space)
Construct a new bsearch adaptor object.
Definition cutting_plane.hpp:357
BSearchAdaptor(Oracle &omega, Space &space, const Options &options)
Construct a new bsearch adaptor object.
Definition cutting_plane.hpp:366
auto assess_bs(Num &gamma) -> bool
Definition cutting_plane.hpp:383
auto x_best() const -> ArrayType
Get the best x value.
Definition cutting_plane.hpp:374
State machine for the discrete cutting-plane method.
Definition cutting_plane.hpp:211
auto on_update(const CutStatus status, const bool more_alt) -> Result
Transition on the space update result.
Definition cutting_plane.hpp:253
OptimQState(A invalid)
Construct a new OptimQState object.
Definition cutting_plane.hpp:225
Result
Definition cutting_plane.hpp:213
auto x_best() -> A &
Get the best-so-far solution (mutable).
Definition cutting_plane.hpp:231
auto retry() const -> bool
Whether the next assessment is a retry (reuse cached point).
Definition cutting_plane.hpp:234
void on_shrunk(A x)
Transition on a newly obtained (shrunk) best solution.
Definition cutting_plane.hpp:241
auto x_best() const -> const A &
Get the best-so-far solution.
Definition cutting_plane.hpp:228
auto invalid_value() -> T
Return an invalid/sentinel value for type T.
Definition cutting_plane.hpp:27
auto cutting_plane_feas(O &omega, S &space, const Options &options=Options()) -> std::tuple< CuttingPlaneArrayType< S >, size_t >
Find a point in a convex set (defined through a cutting-plane oracle).
Definition cutting_plane.hpp:105
auto cutting_plane_optim_q(O &omega, S &space_q, N &gamma, const Options &options=Options()) -> std::tuple< CuttingPlaneArrayType< S >, size_t >
Cutting-plane method for solving convex discrete optimization problem.
Definition cutting_plane.hpp:301
auto bsearch(O &omega, const std::pair< T, T > &intvl, const Options &options=Options()) -> std::tuple< T, size_t >
Binary search using a cutting-plane oracle.
Definition cutting_plane.hpp:413
auto cutting_plane_optim(O &omega, S &space, N &gamma, const Options &options=Options()) -> std::tuple< CuttingPlaneArrayType< S >, size_t >
Cutting-plane method for solving convex problem.
Definition cutting_plane.hpp:175
typename std::remove_reference_t< S >::ArrayType CuttingPlaneArrayType
Definition cutting_plane.hpp:16
Configuration types and constants for the ellipsoid algorithm.
CutStatus
Status of cutting plane operations.
Definition ell_config.hpp:47
@ NoSoln
No solution exists (infeasible)
@ Success
Cut was successful and ellipsoid was updated.
@ NoEffect
Cut had no effect on ellipsoid.
Utility functions for computing half of non-negative numbers.
auto half_nonnegative(N n) noexcept -> typename std::enable_if_t< std::is_integral< N >::value, N >
Compute half of a non-negative integral number.
Definition half_nonnegative.hpp:43
Configuration options for the ellipsoid algorithm.
Definition ell_config.hpp:19