17#ifndef ORTOOLS_MATH_OPT_CPP_SOLVE_RESULT_H_
18#define ORTOOLS_MATH_OPT_CPP_SOLVE_RESULT_H_
20#include <initializer_list>
27#include "absl/status/status.h"
28#include "absl/status/statusor.h"
29#include "absl/time/time.h"
90 static absl::StatusOr<ProblemStatus>
FromProto(
113 static absl::StatusOr<SolveStats>
FromProto(
117 absl::StatusOr<SolveStatsProto>
Proto()
const;
354 std::initializer_list<TerminationReason> reasons)
const;
363 double dual_objective_value,
414 std::optional<double> optional_dual_objective = std::nullopt,
435 bool is_maximize,
Limit limit,
double finite_primal_objective,
436 std::optional<double> optional_dual_objective = std::nullopt,
443 static absl::StatusOr<Termination>
FromProto(
444 const TerminationProto& termination_proto);
445 TerminationProto
Proto()
const;
452template <
typename Sink>
454 sink.Append(termination.
ToString());
483 std::vector<Solution> solutions;
520 static absl::StatusOr<SolveResult>
FromProto(
529 absl::StatusOr<SolveResultProto>
Proto()
const;
646std::ostream&
operator<<(std::ostream& out,
const SolveResult& result);
SolveResultProto_PdlpOutput PdlpOutput
#define MATH_OPT_DEFINE_ENUM(CppEnum, proto_unspecified_value)
@ TERMINATION_REASON_OPTIMAL
@ TERMINATION_REASON_OTHER_ERROR
@ TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED
@ TERMINATION_REASON_NO_SOLUTION_FOUND
@ TERMINATION_REASON_FEASIBLE
@ TERMINATION_REASON_NUMERICAL_ERROR
@ TERMINATION_REASON_UNSPECIFIED
@ TERMINATION_REASON_INFEASIBLE
@ TERMINATION_REASON_IMPRECISE
@ TERMINATION_REASON_UNBOUNDED
const ModelStorage *absl_nonnull ModelStorageCPtr
absl::flat_hash_map< Variable, V > VariableMap
absl::flat_hash_map< LinearConstraint, V > LinearConstraintMap
@ FEASIBILITY_STATUS_UNSPECIFIED
@ FEASIBILITY_STATUS_FEASIBLE
@ FEASIBILITY_STATUS_UNDETERMINED
@ FEASIBILITY_STATUS_INFEASIBLE
void AbslStringify(Sink &sink, const RemoteStreamingSolveMode mode)
std::ostream & operator<<(std::ostream &ostr, const SecondOrderConeConstraint &constraint)
static ObjectiveBounds MakeTrivial(bool is_maximize)
ObjectiveBoundsProto Proto() const
static ObjectiveBounds MinimizeMakeTrivial()
static ObjectiveBounds MakeUnbounded(bool is_maximize)
static ObjectiveBounds MinimizeMakeUnbounded()
static ObjectiveBounds MakeOptimal(double objective_value)
static ObjectiveBounds FromProto(const ObjectiveBoundsProto &objective_bounds_proto)
static ObjectiveBounds MaximizeMakeTrivial()
static ObjectiveBounds MaximizeMakeUnbounded()
std::string ToString() const
ProblemStatusProto Proto() const
std::string ToString() const
FeasibilityStatus primal_status
bool primal_or_dual_infeasible
static absl::StatusOr< ProblemStatus > FromProto(const ProblemStatusProto &problem_status_proto)
FeasibilityStatus dual_status
const VariableMap< double > & ray_reduced_costs() const
const LinearConstraintMap< double > & ray_dual_values() const
bool has_dual_ray() const
double objective_value() const
const VariableMap< double > & variable_values() const
static absl::StatusOr< SolveResult > FromProto(ModelStorageCPtr model, const SolveResultProto &solve_result_proto)
double best_objective_bound() const
SolveResultProto::PdlpOutput pdlp_solver_specific_output
double primal_bound() const
bool has_dual_feasible_solution() const
GScipOutput gscip_solver_specific_output
const LinearConstraintMap< BasisStatus > & constraint_status() const
const LinearConstraintMap< double > & dual_values() const
std::vector< DualRay > dual_rays
absl::Duration solve_time() const
const VariableMap< double > & ray_variable_values() const
SolveResult(Termination termination)
bool has_primal_feasible_solution() const
const VariableMap< BasisStatus > & variable_status() const
absl::StatusOr< SolveResultProto > Proto() const
const VariableMap< double > & reduced_costs() const
*All convex optimization solvers(LP, convex QP) return only one *Only MI(Q) P solvers return more than one solution. MIP solvers do not std std::vector< PrimalRay > primal_rays
const PrimalSolution & best_primal_solution() const
double dual_bound() const
int first_order_iterations
absl::StatusOr< SolveStatsProto > Proto() const
std::string ToString() const
absl::Duration solve_time
static absl::StatusOr< SolveStats > FromProto(const SolveStatsProto &solve_stats_proto)
static Termination Unbounded(bool is_maximize, std::string detail={})
TerminationProto Proto() const
Termination(bool is_maximize, TerminationReason reason, std::string detail={})
absl::Status EnsureIsOptimalOrFeasible() const
std::string ToString() const
static Termination InfeasibleOrUnbounded(bool is_maximize, FeasibilityStatus dual_feasibility_status=FeasibilityStatus::kUndetermined, std::string detail={})
absl::Status EnsureReasonIsAnyOf(std::initializer_list< TerminationReason > reasons) const
static Termination Cutoff(bool is_maximize, std::string detail={})
bool limit_reached() const
absl::Status EnsureIsOptimal() const
static absl::StatusOr< Termination > FromProto(const TerminationProto &termination_proto)
static Termination Infeasible(bool is_maximize, FeasibilityStatus dual_feasibility_status=FeasibilityStatus::kUndetermined, std::string detail={})
absl::Status EnsureReasonIs(TerminationReason reason) const
bool IsOptimalOrFeasible() const
ProblemStatus problem_status
static Termination NoSolutionFound(bool is_maximize, Limit limit, std::optional< double > optional_dual_objective=std::nullopt, std::string detail={})
std::optional< Limit > limit
ObjectiveBounds objective_bounds
static Termination Feasible(bool is_maximize, Limit limit, double finite_primal_objective, std::optional< double > optional_dual_objective=std::nullopt, std::string detail={})
static Termination Optimal(double objective_value, std::string detail={})