Skip to content

Commit e2d0e59

Browse files
committed
Make barrier_dual_initial_point itself ENUM
Signed-off-by: yuwenchen95 <yuwchen@nvidia.com>
1 parent 40789ae commit e2d0e59

10 files changed

Lines changed: 47 additions & 42 deletions

File tree

cpp/include/cuopt/mathematical_optimization/pdlp/solver_settings.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ class pdlp_solver_settings_t {
294294
i_t augmented{-1};
295295
i_t dualize{-1};
296296
i_t ordering{-1};
297-
i_t barrier_dual_initial_point{-1};
297+
barrier_dual_initial_point_t barrier_dual_initial_point{barrier_dual_initial_point_t::Automatic};
298298
i_t postsolve_info{-1};
299299
i_t barrier_presolve_bound_free_variables{-1}; // -1 automatic, 0 disabled, 1 enabled
300300
// Ruiz equilibration for QCQP (barrier) scaling: -1 automatic (row/column

cpp/include/cuopt/mathematical_optimization/utilities/internals.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,20 @@ enum presolver_t : int {
142142
PSLP = CUOPT_PRESOLVE_PSLP
143143
};
144144

145+
/**
146+
* @brief Barrier primal-dual initial-point strategy.
147+
*
148+
* Automatic: use Lustig-Marsten-Shanno for LP/QP; Sturm/SeDuMi mu-based point for conic problems.
149+
* LustigMarstenShanno: Mehrotra-style dual start (Lustig, Marsten, Shanno, SIAM J. Optim. 1992).
150+
* DualLeastSquares: solve augmented or ADAT dual least-squares system.
151+
* SedumiMu: Sturm/SeDuMi mu-based primal+dual point (no factorization).
152+
*/
153+
enum barrier_dual_initial_point_t : int {
154+
Automatic = CUOPT_BARRIER_DUAL_INITIAL_POINT_AUTOMATIC,
155+
LustigMarstenShanno = CUOPT_BARRIER_DUAL_INITIAL_POINT_LUSTIG_MARSTEN_SHANNO,
156+
DualLeastSquares = CUOPT_BARRIER_DUAL_INITIAL_POINT_DUAL_LEAST_SQUARES,
157+
SedumiMu = CUOPT_BARRIER_DUAL_INITIAL_POINT_SEDUMI_MU
158+
};
159+
145160
} // namespace mathematical_optimization
146161
} // namespace cuopt

cpp/src/barrier/barrier.cu

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,8 +2204,7 @@ int barrier_solver_t<i_t, f_t>::initial_point(iteration_data_t<i_t, f_t>& data)
22042204
const bool use_augmented = data.use_augmented;
22052205
const bool has_direct_free_linear = data.n_direct_free_linear > 0;
22062206

2207-
const barrier_dual_initial_point_t input_strategy =
2208-
static_cast<barrier_dual_initial_point_t>(settings.barrier_dual_initial_point);
2207+
const barrier_dual_initial_point_t input_strategy = settings.barrier_dual_initial_point;
22092208

22102209
const barrier_dual_initial_point_t init_strategy =
22112210
(data.has_cones() && input_strategy == barrier_dual_initial_point_t::Automatic)

cpp/src/barrier/barrier.hpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <linear_algebra/dense_vector.hpp>
1010

1111
#include <cuopt/mathematical_optimization/constants.h>
12+
#include <cuopt/mathematical_optimization/utilities/internals.hpp>
1213
#include <dual_simplex/presolve.hpp>
1314
#include <dual_simplex/simplex_solver_settings.hpp>
1415
#include <dual_simplex/solution.hpp>
@@ -21,21 +22,6 @@
2122
#include <utility>
2223
namespace cuopt::mathematical_optimization::barrier {
2324

24-
/**
25-
* @brief Barrier primal-dual initial-point strategy.
26-
*
27-
* Automatic: use Lustig-Marsten-Shanno for LP/QP; Sturm/SeDuMi mu-based point for conic problems.
28-
* LustigMarstenShanno: Mehrotra-style dual start (Lustig, Marsten, Shanno, SIAM J. Optim. 1992).
29-
* DualLeastSquares: solve augmented or ADAT dual least-squares system.
30-
* SedumiMu: Sturm/SeDuMi mu-based primal+dual point (no factorization).
31-
*/
32-
enum barrier_dual_initial_point_t : int {
33-
Automatic = CUOPT_BARRIER_DUAL_INITIAL_POINT_AUTOMATIC,
34-
LustigMarstenShanno = CUOPT_BARRIER_DUAL_INITIAL_POINT_LUSTIG_MARSTEN_SHANNO,
35-
DualLeastSquares = CUOPT_BARRIER_DUAL_INITIAL_POINT_DUAL_LEAST_SQUARES,
36-
SedumiMu = CUOPT_BARRIER_DUAL_INITIAL_POINT_SEDUMI_MU
37-
};
38-
3925
/** Validates SOC layout on an simplex::lp_problem_t before barrier presolve/solve. */
4026
template <typename i_t, typename f_t>
4127
bool validate_barrier_cone_layout(const simplex::lp_problem_t<i_t, f_t>& problem,

cpp/src/dual_simplex/simplex_solver_settings.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <cuopt/mathematical_optimization/mip/diving_hyper_params.hpp>
1111
#include <cuopt/mathematical_optimization/mip/submip_hyper_params.hpp>
12+
#include <cuopt/mathematical_optimization/utilities/internals.hpp>
1213

1314
#include <dual_simplex/logger.hpp>
1415
#include <math_optimization/types.hpp>
@@ -77,7 +78,7 @@ struct simplex_solver_settings_t {
7778
augmented(0),
7879
dualize(-1),
7980
ordering(-1),
80-
barrier_dual_initial_point(-1),
81+
barrier_dual_initial_point(barrier_dual_initial_point_t::Automatic),
8182
postsolve_info(-1),
8283
barrier_presolve_bound_free_variables(-1),
8384
qcqp_ruiz_equilibration(-1),
@@ -173,7 +174,8 @@ struct simplex_solver_settings_t {
173174
i_t augmented; // -1 automatic, 0 to solve with ADAT, 1 to solve with augmented system
174175
i_t dualize; // -1 automatic, 0 to not dualize, 1 to dualize
175176
i_t ordering; // -1 automatic, 0 to use nested dissection, 1 to use AMD
176-
i_t barrier_dual_initial_point; // -1 automatic, 0 Lustig-Marsten-Shanno,
177+
barrier_dual_initial_point_t
178+
barrier_dual_initial_point; // -1 automatic, 0 Lustig-Marsten-Shanno,
177179
// 1 dual least squares, 2 SeDuMi mu-based
178180
i_t postsolve_info; // -1 automatic (disabled), 0 disabled, 1 enabled
179181
i_t barrier_presolve_bound_free_variables; // -1 automatic, 0 disabled, 1 enabled

cpp/src/grpc/codegen/field_registry.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ pdlp_settings:
534534
- barrier_dual_initial_point:
535535
field_num: 26
536536
type: int32
537+
from_proto_cast: "barrier_dual_initial_point_t"
537538
optional: true
538539
- eliminate_dense_columns:
539540
field_num: 27

cpp/src/grpc/codegen/generated/generated_pdlp_settings_to_proto.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
pb_settings->set_augmented(settings.augmented);
3232
pb_settings->set_dualize(settings.dualize);
3333
pb_settings->set_ordering(settings.ordering);
34-
pb_settings->set_barrier_dual_initial_point(settings.barrier_dual_initial_point);
34+
pb_settings->set_barrier_dual_initial_point(static_cast<int32_t>(settings.barrier_dual_initial_point));
3535
pb_settings->set_eliminate_dense_columns(settings.eliminate_dense_columns);
3636
pb_settings->set_barrier_iterative_refinement(settings.barrier_iterative_refinement);
3737
pb_settings->set_barrier_step_scale(settings.barrier_step_scale);

cpp/src/grpc/codegen/generated/generated_proto_to_pdlp_settings.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
settings.ordering = pb_settings.ordering();
6969
}
7070
if (pb_settings.has_barrier_dual_initial_point()) {
71-
settings.barrier_dual_initial_point = pb_settings.barrier_dual_initial_point();
71+
settings.barrier_dual_initial_point = static_cast<barrier_dual_initial_point_t>(pb_settings.barrier_dual_initial_point());
7272
}
7373
if (pb_settings.has_eliminate_dense_columns()) {
7474
settings.eliminate_dense_columns = pb_settings.eliminate_dense_columns();

cpp/src/math_optimization/solver_settings.cu

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ solver_settings_t<i_t, f_t>::solver_settings_t() : pdlp_settings(), mip_settings
137137
{CUOPT_FOLDING, &pdlp_settings.folding, -1, 1, -1},
138138
{CUOPT_DUALIZE, &pdlp_settings.dualize, -1, 1, -1},
139139
{CUOPT_ORDERING, &pdlp_settings.ordering, -1, 1, -1},
140-
{CUOPT_BARRIER_DUAL_INITIAL_POINT, &pdlp_settings.barrier_dual_initial_point, -1, 2, -1},
140+
{CUOPT_BARRIER_DUAL_INITIAL_POINT, reinterpret_cast<int*>(&pdlp_settings.barrier_dual_initial_point), -1, 2, -1},
141141
{CUOPT_POSTSOLVE_INFO, &pdlp_settings.postsolve_info, -1, 1, -1},
142142
{CUOPT_MIP_CUT_PASSES, &mip_settings.max_cut_passes, -1, std::numeric_limits<i_t>::max(), 10},
143143
{CUOPT_MIP_MIXED_INTEGER_ROUNDING_CUTS, &mip_settings.mir_cuts, -1, 1, -1},

cpp/tests/linear_programming/grpc/grpc_client_test.cpp

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,24 +2224,25 @@ TEST(MapperRoundtrip, PDLPSettingsAllFields)
22242224
orig.tolerances.absolute_primal_tolerance = 5e-7;
22252225
orig.tolerances.relative_primal_tolerance = 6e-7;
22262226

2227-
orig.time_limit = 99.5;
2228-
orig.iteration_limit = 10000;
2229-
orig.log_to_console = false;
2230-
orig.detect_infeasibility = true;
2231-
orig.strict_infeasibility = true;
2232-
orig.pdlp_solver_mode = pdlp_solver_mode_t::Fast1;
2233-
orig.method = method_t::Barrier;
2234-
orig.presolver = presolver_t::Default;
2235-
orig.dual_postsolve = true;
2236-
orig.crossover = true;
2237-
orig.num_gpus = 4;
2238-
orig.per_constraint_residual = true;
2239-
orig.cudss_deterministic = true;
2240-
orig.folding = 1;
2241-
orig.augmented = 1;
2242-
orig.dualize = 1;
2243-
orig.ordering = 2;
2244-
orig.barrier_dual_initial_point = 1;
2227+
orig.time_limit = 99.5;
2228+
orig.iteration_limit = 10000;
2229+
orig.log_to_console = false;
2230+
orig.detect_infeasibility = true;
2231+
orig.strict_infeasibility = true;
2232+
orig.pdlp_solver_mode = pdlp_solver_mode_t::Fast1;
2233+
orig.method = method_t::Barrier;
2234+
orig.presolver = presolver_t::Default;
2235+
orig.dual_postsolve = true;
2236+
orig.crossover = true;
2237+
orig.num_gpus = 4;
2238+
orig.per_constraint_residual = true;
2239+
orig.cudss_deterministic = true;
2240+
orig.folding = 1;
2241+
orig.augmented = 1;
2242+
orig.dualize = 1;
2243+
orig.ordering = 2;
2244+
orig.barrier_dual_initial_point =
2245+
cuopt::mathematical_optimization::barrier_dual_initial_point_t::LustigMarstenShanno;
22452246
orig.eliminate_dense_columns = true;
22462247
orig.barrier_iterative_refinement = false; // not the default true, to detect overwrite-on-decode
22472248
orig.barrier_step_scale = 0.75; // not the default 0.9
@@ -2282,7 +2283,8 @@ TEST(MapperRoundtrip, PDLPSettingsAllFields)
22822283
EXPECT_EQ(restored.augmented, 1);
22832284
EXPECT_EQ(restored.dualize, 1);
22842285
EXPECT_EQ(restored.ordering, 2);
2285-
EXPECT_EQ(restored.barrier_dual_initial_point, 1);
2286+
EXPECT_EQ(restored.barrier_dual_initial_point,
2287+
cuopt::mathematical_optimization::barrier_dual_initial_point_t::LustigMarstenShanno);
22862288
EXPECT_EQ(restored.eliminate_dense_columns, true);
22872289
EXPECT_EQ(restored.barrier_iterative_refinement, false);
22882290
EXPECT_DOUBLE_EQ(restored.barrier_step_scale, 0.75);

0 commit comments

Comments
 (0)