20#include "absl/container/flat_hash_map.h"
21#include "absl/strings/string_view.h"
22#include "absl/types/span.h"
26#include "ortools/math_opt/solution.pb.h"
32template <
typename Key>
33IdMap<Key, double> ValuesFrom(
const ModelStorage*
const model,
34 const SparseDoubleVectorProto& vars_proto) {
35 return IdMap<Key, double>(
39template <
typename Key>
40IdMap<Key, BasisStatus> BasisValues(
41 const ModelStorage*
const model,
42 const SparseBasisStatusVector& basis_proto) {
43 absl::flat_hash_map<typename Key::IdType, BasisStatus> id_map;
44 for (
const auto& [
id, basis_status_proto] :
MakeView(basis_proto)) {
51 const std::optional<BasisStatus> basis_status =
52 EnumFromProto(
static_cast<BasisStatusProto
>(basis_status_proto));
53 CHECK(basis_status.has_value());
54 id_map[
static_cast<typename Key::IdType
>(id)] = *basis_status;
56 return IdMap<Key, BasisStatus>(
model, std::move(id_map));
69 return "undetermined";
80 return absl::MakeConstSpan(kSolutionStatusValues);
89 return "at_lower_bound";
91 return "at_upper_bound";
101 static constexpr BasisStatus kBasisStatusValues[] = {
106 return absl::MakeConstSpan(kBasisStatusValues);
111 const PrimalSolutionProto& primal_solution_proto) {
114 ValuesFrom<Variable>(
model, primal_solution_proto.variable_values());
115 primal_solution.
objective_value = primal_solution_proto.objective_value();
121 return primal_solution;
125 const PrimalRayProto& primal_ray_proto) {
127 ValuesFrom<Variable>(
model, primal_ray_proto.variable_values())};
134 ValuesFrom<LinearConstraint>(
model, dual_solution_proto.dual_values());
136 ValuesFrom<Variable>(
model, dual_solution_proto.reduced_costs());
137 if (dual_solution_proto.has_objective_value()) {
145 return dual_solution;
149 const DualRayProto& dual_ray_proto) {
151 ValuesFrom<LinearConstraint>(
model, dual_ray_proto.dual_values()),
153 ValuesFrom<Variable>(
model, dual_ray_proto.reduced_costs())};
157 const BasisProto& basis_proto) {
160 BasisValues<LinearConstraint>(
model, basis_proto.constraint_status());
162 BasisValues<Variable>(
model, basis_proto.variable_status());
172 const SolutionProto& solution_proto) {
174 if (solution_proto.has_primal_solution()) {
178 if (solution_proto.has_dual_solution()) {
182 if (solution_proto.has_basis()) {
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(const P proto_value)
Collection of objects used to extend the Constraint Solver library.
VariableMap< BasisStatus > variable_status
LinearConstraintMap< BasisStatus > constraint_status
static Basis FromProto(const ModelStorage *model, const BasisProto &basis_proto)
SolutionStatus basic_dual_feasibility
LinearConstraintMap< double > dual_values
static DualRay FromProto(const ModelStorage *model, const DualRayProto &dual_ray_proto)
SolutionStatus feasibility_status
static DualSolution FromProto(const ModelStorage *model, const DualSolutionProto &dual_solution_proto)
LinearConstraintMap< double > dual_values
VariableMap< double > reduced_costs
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 PrimalRay FromProto(const ModelStorage *model, const PrimalRayProto &primal_ray_proto)
static PrimalSolution FromProto(const ModelStorage *model, const PrimalSolutionProto &primal_solution_proto)
VariableMap< double > variable_values
SolutionStatus feasibility_status
static Solution FromProto(const ModelStorage *model, const SolutionProto &solution_proto)
std::optional< DualSolution > dual_solution
std::optional< PrimalSolution > primal_solution
std::optional< Basis > basis