82 const ModelProto& model_proto) {
87 const VariablesProto& variables = model_proto.variables();
88 const LinearConstraintsProto& linear_constraints =
89 model_proto.linear_constraints();
90 pdlp_lp.ResizeAndInitialize(variables.ids_size(),
91 linear_constraints.ids_size());
92 if (!model_proto.name().empty()) {
93 pdlp_lp.problem_name = model_proto.name();
95 if (variables.names_size() > 0) {
96 pdlp_lp.variable_names = {variables.names().begin(),
97 variables.names().end()};
99 if (linear_constraints.names_size() > 0) {
100 pdlp_lp.constraint_names = {linear_constraints.names().begin(),
101 linear_constraints.names().end()};
103 for (
int i = 0; i < variables.ids_size(); ++i) {
104 result.var_id_to_pdlp_index_[variables.ids(i)] = i;
105 result.pdlp_index_to_var_id_.push_back(variables.ids(i));
106 pdlp_lp.variable_lower_bounds[i] = variables.lower_bounds(i);
107 pdlp_lp.variable_upper_bounds[i] = variables.upper_bounds(i);
109 for (
int i = 0; i < linear_constraints.ids_size(); ++i) {
110 result.lin_con_id_to_pdlp_index_[linear_constraints.ids(i)] = i;
111 result.pdlp_index_to_lin_con_id_.push_back(linear_constraints.ids(i));
112 pdlp_lp.constraint_lower_bounds[i] = linear_constraints.lower_bounds(i);
113 pdlp_lp.constraint_upper_bounds[i] = linear_constraints.upper_bounds(i);
115 const bool is_maximize = model_proto.objective().maximize();
116 const double obj_scale = is_maximize ? -1.0 : 1.0;
117 pdlp_lp.objective_offset = obj_scale * model_proto.objective().offset();
118 for (
const auto [var_id, coef] :
119 MakeView(model_proto.objective().linear_coefficients())) {
120 pdlp_lp.objective_vector[result.var_id_to_pdlp_index_.at(var_id)] =
123 const SparseDoubleMatrixProto& quadratic_objective =
124 model_proto.objective().quadratic_coefficients();
125 const int obj_nnz = quadratic_objective.row_ids().size();
127 pdlp_lp.objective_matrix.emplace();
128 pdlp_lp.objective_matrix->setZero(variables.ids_size());
130 for (
int i = 0; i < obj_nnz; ++i) {
131 const int64_t row_index =
132 result.var_id_to_pdlp_index_.at(quadratic_objective.row_ids(i));
133 const int64_t column_index =
134 result.var_id_to_pdlp_index_.at(quadratic_objective.column_ids(i));
135 const double value = obj_scale * quadratic_objective.coefficients(i);
136 if (row_index != column_index) {
137 return absl::InvalidArgumentError(
138 "PDLP cannot solve problems with non-diagonal objective matrices");
146 pdlp_lp.objective_matrix->diagonal()[row_index] = 2 * value;
148 pdlp_lp.objective_scaling_factor = obj_scale;
152 std::vector<Eigen::Triplet<double, int64_t>> mat_triplets;
153 const int nnz = model_proto.linear_constraint_matrix().row_ids_size();
154 mat_triplets.reserve(nnz);
155 const SparseDoubleMatrixProto& proto_mat =
156 model_proto.linear_constraint_matrix();
157 for (
int i = 0; i < nnz; ++i) {
158 const int64_t row_index =
159 result.lin_con_id_to_pdlp_index_.at(proto_mat.row_ids(i));
160 const int64_t column_index =
161 result.var_id_to_pdlp_index_.at(proto_mat.column_ids(i));
162 const double value = proto_mat.coefficients(i);
163 mat_triplets.emplace_back(row_index, column_index, value);
165 pdlp_lp.constraint_matrix.setFromTriplets(mat_triplets.begin(),
172 for (int64_t var_index = 0; var_index < pdlp_index_to_var_id_.size();
174 if (pdlp_lp_.variable_lower_bounds[var_index] >
175 pdlp_lp_.variable_upper_bounds[var_index]) {
176 inverted_bounds.
variables.push_back(pdlp_index_to_var_id_[var_index]);
179 for (int64_t lin_con_index = 0;
180 lin_con_index < pdlp_index_to_lin_con_id_.size(); ++lin_con_index) {
181 if (pdlp_lp_.constraint_lower_bounds[lin_con_index] >
182 pdlp_lp_.constraint_upper_bounds[lin_con_index]) {
184 pdlp_index_to_lin_con_id_[lin_con_index]);
187 return inverted_bounds;