OR-Tools  9.6
quadratic_program_io.cc
Go to the documentation of this file.
1 // Copyright 2010-2022 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
15 
16 #include <algorithm>
17 #include <cmath>
18 #include <cstdint>
19 #include <limits>
20 #include <string>
21 #include <utility>
22 #include <vector>
23 
24 #include "Eigen/Core"
25 #include "Eigen/SparseCore"
26 #include "absl/base/casts.h"
27 #include "absl/container/flat_hash_map.h"
28 #include "absl/log/check.h"
29 #include "absl/status/status.h"
30 #include "absl/status/statusor.h"
31 #include "absl/strings/match.h"
33 #include "ortools/base/file.h"
34 #include "ortools/base/helpers.h"
35 #include "ortools/base/logging.h"
36 #include "ortools/base/mathutil.h"
37 #include "ortools/base/options.h"
39 #include "ortools/linear_solver/linear_solver.pb.h"
43 #include "ortools/util/file_util.h"
44 
45 namespace operations_research::pdlp {
46 
47 // TODO(user): Update internal helper functions to use references instead of
48 // pointers.
49 
50 QuadraticProgram ReadQuadraticProgramOrDie(const std::string& filename,
51  bool include_names) {
52  if (absl::EndsWith(filename, ".mps") || absl::EndsWith(filename, ".mps.gz") ||
53  absl::EndsWith(filename, ".mps.bz2")) {
54  return ReadMpsLinearProgramOrDie(filename, include_names);
55  }
56  if (absl::EndsWith(filename, ".pb") ||
57  absl::EndsWith(filename, ".textproto") ||
58  absl::EndsWith(filename, ".json") ||
59  absl::EndsWith(filename, ".json.gz")) {
60  return ReadMPModelProtoFileOrDie(filename, include_names);
61  }
62  LOG(QFATAL) << "Invalid filename suffix in " << filename
63  << ". Valid suffixes are .mps, .mps.gz, .pb, .textproto,"
64  << ".json, and .json.gz";
65 }
66 
67 QuadraticProgram ReadMpsLinearProgramOrDie(const std::string& lp_file,
68  bool include_names) {
69  absl::StatusOr<MPModelProto> lp_proto =
71  QCHECK_OK(lp_proto);
72  // `MpsFileToMPModelProto` sometimes fails silently if the file isn't read
73  // properly.
74  QCHECK_GT(lp_proto->variable_size(), 0)
75  << "No variables in LP. Error reading file? " << lp_file;
76  auto result = QpFromMpModelProto(*lp_proto, /*relax_integer_variables=*/true,
77  include_names);
78  QCHECK_OK(result);
79  return *std::move(result);
80 }
81 
83  const std::string& mpmodel_proto_file, bool include_names) {
84  MPModelProto lp_proto;
85  QCHECK(ReadFileToProto(mpmodel_proto_file, &lp_proto)) << mpmodel_proto_file;
86  auto result = QpFromMpModelProto(lp_proto, /*relax_integer_variables=*/true,
87  include_names);
88  QCHECK_OK(result);
89  return *std::move(result);
90 }
91 
92 absl::Status WriteLinearProgramToMps(const QuadraticProgram& linear_program,
93  const std::string& mps_file) {
94  if (!IsLinearProgram(linear_program)) {
95  return absl::InvalidArgumentError(
96  "'linear_program' has a quadratic objective");
97  }
98  ASSIGN_OR_RETURN(MPModelProto proto, QpToMpModelProto(linear_program));
99  ASSIGN_OR_RETURN(std::string mps_export, ExportModelAsMpsFormat(proto));
100  File* file;
101  RETURN_IF_ERROR(file::Open(mps_file, "w", &file, file::Defaults()));
102  auto status = file::WriteString(file, mps_export, file::Defaults());
103  status.Update(file->Close(file::Defaults()));
104  return status;
105 }
106 
108  const QuadraticProgram& quadratic_program,
109  const std::string& mpmodel_proto_file) {
110  ASSIGN_OR_RETURN(MPModelProto proto, QpToMpModelProto(quadratic_program));
111 
112  return file::SetBinaryProto(mpmodel_proto_file, proto, file::Defaults());
113 }
114 
115 } // namespace operations_research::pdlp
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
Definition: base/file.h:33
CpModelProto proto
absl::Status status
Definition: g_gurobi.cc:41
absl::Status WriteString(File *file, const absl::string_view &contents, int flags)
Definition: base/file.cc:194
Options Defaults()
Definition: base/file.h:123
absl::Status SetBinaryProto(const absl::string_view &filename, const google::protobuf::Message &proto, int flags)
Definition: base/file.cc:322
absl::Status Open(const absl::string_view &filename, const absl::string_view &mode, File **f, int flags)
Definition: base/file.cc:143
absl::StatusOr< MPModelProto > MpsFileToMPModelProto(const std::string &mps_file)
Definition: mps_reader.cc:1201
absl::StatusOr< QuadraticProgram > QpFromMpModelProto(const MPModelProto &proto, bool relax_integer_variables, bool include_names)
absl::Status WriteQuadraticProgramToMPModelProto(const QuadraticProgram &quadratic_program, const std::string &mpmodel_proto_file)
absl::StatusOr< MPModelProto > QpToMpModelProto(const QuadraticProgram &qp)
bool IsLinearProgram(const QuadraticProgram &qp)
absl::Status WriteLinearProgramToMps(const QuadraticProgram &linear_program, const std::string &mps_file)
QuadraticProgram ReadMPModelProtoFileOrDie(const std::string &mpmodel_proto_file, bool include_names)
QuadraticProgram ReadQuadraticProgramOrDie(const std::string &filename, bool include_names)
QuadraticProgram ReadMpsLinearProgramOrDie(const std::string &lp_file, bool include_names)
absl::StatusOr< std::string > ExportModelAsMpsFormat(const MPModelProto &model, const MPModelExportOptions &options)
Outputs the current model (variables, constraints, objective) as a string encoded in MPS file format,...
bool ReadFileToProto(absl::string_view filename, google::protobuf::Message *proto)
Definition: file_util.cc:47