19#include "absl/container/flat_hash_map.h"
20#include "absl/strings/string_view.h"
21#include "absl/types/span.h"
28#include "ortools/math_opt/solution.pb.h"
29#include "ortools/math_opt/sparse_containers.pb.h"
35template <
typename Key>
36IdMap<Key, double> ValuesFrom(
const ModelStorage*
const model,
37 const SparseDoubleVectorProto& vars_proto) {
38 return IdMap<Key, double>(
42template <
typename Key>
43IdMap<Key, BasisStatus> BasisValues(
44 const ModelStorage*
const model,
45 const SparseBasisStatusVector& basis_proto) {
46 absl::flat_hash_map<typename Key::IdType, BasisStatus> id_map;
47 for (
const auto& [
id, basis_status_proto] :
MakeView(basis_proto)) {
54 const std::optional<BasisStatus> basis_status =
55 EnumFromProto(
static_cast<BasisStatusProto
>(basis_status_proto));
56 CHECK(basis_status.has_value());
57 id_map[
static_cast<typename Key::IdType
>(id)] = *basis_status;
59 return IdMap<Key, BasisStatus>(
model, std::move(id_map));
72 return "undetermined";
83 return absl::MakeConstSpan(kSolutionStatusValues);
92 return "at_lower_bound";
94 return "at_upper_bound";
104 static constexpr BasisStatus kBasisStatusValues[] = {
109 return absl::MakeConstSpan(kBasisStatusValues);
114 const PrimalSolutionProto& primal_solution_proto) {
117 ValuesFrom<Variable>(
model, primal_solution_proto.variable_values());
118 primal_solution.
objective_value = primal_solution_proto.objective_value();
124 return primal_solution;
128 const PrimalRayProto& primal_ray_proto) {
130 ValuesFrom<Variable>(
model, primal_ray_proto.variable_values())};
137 ValuesFrom<LinearConstraint>(
model, dual_solution_proto.dual_values());
139 ValuesFrom<Variable>(
model, dual_solution_proto.reduced_costs());
140 if (dual_solution_proto.has_objective_value()) {
148 return dual_solution;
152 const DualRayProto& dual_ray_proto) {
154 ValuesFrom<LinearConstraint>(
model, dual_ray_proto.dual_values()),
156 ValuesFrom<Variable>(
model, dual_ray_proto.reduced_costs())};
160 const BasisProto& basis_proto) {
163 BasisValues<LinearConstraint>(
model, basis_proto.constraint_status());
165 BasisValues<Variable>(
model, basis_proto.variable_status());
175 const SolutionProto& solution_proto) {
177 if (solution_proto.has_primal_solution()) {
181 if (solution_proto.has_dual_solution()) {
185 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