19 #include "absl/container/flat_hash_map.h"
20 #include "absl/strings/string_view.h"
21 #include "absl/types/span.h"
29 #include "ortools/math_opt/solution.pb.h"
30 #include "ortools/math_opt/sparse_containers.pb.h"
47 return "undetermined";
58 return absl::MakeConstSpan(kSolutionStatusValues);
63 const PrimalSolutionProto& primal_solution_proto) {
68 _ <<
"invalid variable_values");
69 primal_solution.
objective_value = primal_solution_proto.objective_value();
73 return absl::InvalidArgumentError(
"feasibility_status must be specified");
76 return primal_solution;
80 PrimalSolutionProto result;
93 _ <<
"invalid variable_values");
98 PrimalRayProto result;
109 _ <<
"invalid dual_values");
113 _ <<
"invalid reduced_costs");
114 if (dual_solution_proto.has_objective_value()) {
120 return absl::InvalidArgumentError(
"feasibility_status must be specified");
123 return dual_solution;
127 DualSolutionProto result;
138 const DualRayProto& dual_ray_proto) {
143 _ <<
"invalid dual_values");
147 _ <<
"invalid reduced_costs");
159 const BasisProto& basis_proto) {
164 _ <<
"invalid constraint_status");
168 _ <<
"invalid variable_status");
172 return absl::InvalidArgumentError(
173 "basic_dual_feasibility for a basis must be specified");
184 <<
"invalid variable_status";
188 <<
"invalid constraint_status";
189 return absl::OkStatus();
194 *result.mutable_constraint_status() =
204 if (solution_proto.has_primal_solution()) {
208 _ <<
"invalid primal_solution");
210 if (solution_proto.has_dual_solution()) {
214 _ <<
"invalid dual_solution");
216 if (solution_proto.has_basis()) {
219 _ <<
"invalid basis");
225 SolutionProto result;
232 if (
basis.has_value()) {
233 *result.mutable_basis() =
basis->Proto();
#define RETURN_IF_ERROR(expr)
absl::Status CheckModelStorage(const ModelStorage *const storage, const ModelStorage *const expected_storage)
SparseBasisStatusVector VariableBasisToProto(const VariableMap< BasisStatus > &basis_values)
SparseBasisStatusVector LinearConstraintBasisToProto(const LinearConstraintMap< BasisStatus > &basis_values)
absl::StatusOr< LinearConstraintMap< double > > LinearConstraintValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &lin_cons_proto)
SparseDoubleVectorProto LinearConstraintValuesToProto(const LinearConstraintMap< double > &linear_constraint_values)
absl::StatusOr< VariableMap< BasisStatus > > VariableBasisFromProto(const ModelStorage *const model, const SparseBasisStatusVector &basis_proto)
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &vars_proto)
SparseDoubleVectorProto VariableValuesToProto(const VariableMap< double > &variable_values)
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(const P proto_value)
absl::StatusOr< LinearConstraintMap< BasisStatus > > LinearConstraintBasisFromProto(const ModelStorage *const model, const SparseBasisStatusVector &basis_proto)
Enum< E >::Proto EnumToProto(const std::optional< E > value)
Collection of objects used to extend the Constraint Solver library.
VariableMap< BasisStatus > variable_status
LinearConstraintMap< BasisStatus > constraint_status
absl::Status CheckModelStorage(const ModelStorage *expected_storage) const
SolutionStatus basic_dual_feasibility
static absl::StatusOr< Basis > FromProto(const ModelStorage *model, const BasisProto &basis_proto)
static absl::StatusOr< DualRay > FromProto(const ModelStorage *model, const DualRayProto &dual_ray_proto)
LinearConstraintMap< double > dual_values
VariableMap< double > reduced_costs
DualRayProto Proto() const
static absl::StatusOr< DualSolution > FromProto(const ModelStorage *model, const DualSolutionProto &dual_solution_proto)
SolutionStatus feasibility_status
LinearConstraintMap< double > dual_values
VariableMap< double > reduced_costs
DualSolutionProto Proto() const
std::optional< double > objective_value
static std::optional< absl::string_view > ToOptString(E value)
static absl::Span< const E > AllValues()
VariableMap< double > variable_values
static absl::StatusOr< PrimalRay > FromProto(const ModelStorage *model, const PrimalRayProto &primal_ray_proto)
PrimalRayProto Proto() const
static absl::StatusOr< PrimalSolution > FromProto(const ModelStorage *model, const PrimalSolutionProto &primal_solution_proto)
VariableMap< double > variable_values
SolutionStatus feasibility_status
PrimalSolutionProto Proto() const
static absl::StatusOr< Solution > FromProto(const ModelStorage *model, const SolutionProto &solution_proto)
std::optional< DualSolution > dual_solution
std::optional< PrimalSolution > primal_solution
std::optional< Basis > basis
SolutionProto Proto() const
#define OR_ASSIGN_OR_RETURN3(lhs, rexpr, error_expression)