Skip to content

Commit 49f3a6d

Browse files
committed
mip
1 parent d1335fb commit 49f3a6d

File tree

10 files changed

+156
-45
lines changed

10 files changed

+156
-45
lines changed

check/TestPdlp.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "Highs.h"
44
#include "SpecialLps.h"
55
#include "catch.hpp"
6+
#include <chrono>
67

78
const bool dev_run = false;
89
const double double_equal_tolerance = 1e-3;
@@ -333,30 +334,42 @@ TEST_CASE("pdlp-restart-add-row", "[pdlp]") {
333334
}
334335

335336
TEST_CASE("hi-pdlp", "[pdlp]") {
336-
std::string model = "afiro"; //"adlittle";//"afiro";//
337+
std::string model = "adlittle"; //"adlittle";//"afiro";// shell// stair //25fv47 //fit2p
337338
std::string model_file =
338339
std::string(HIGHS_DIR) + "/check/instances/" + model + ".mps";
339340
Highs h;
340341
// h.setOptionValue("output_flag", dev_run);
341342
REQUIRE(h.readModel(model_file) == HighsStatus::kOk);
342343
h.setOptionValue("solver", kHiPdlpString);
343344
h.setOptionValue("kkt_tolerance", kkt_tolerance);
345+
h.setOptionValue("presolve", "off");
344346

345-
HighsInt pdlp_features_off =
346-
// kPdlpScalingOff +
347-
kPdlpRestartOff + kPdlpAdaptiveStepSizeOff;
347+
HighsInt pdlp_features_off =
348+
//kPdlpScalingOff +
349+
//kPdlpRestartOff
350+
kPdlpAdaptiveStepSizeOff
351+
;
348352
h.setOptionValue("pdlp_features_off", pdlp_features_off);
349353

350354
HighsInt pdlp_scaling = // 0;
351355
kPdlpScalingRuiz
352356
//+ kPdlpScalingL2
353357
+ kPdlpScalingPC;
354358
h.setOptionValue("pdlp_scaling_mode", pdlp_scaling);
355-
h.setOptionValue("pdlp_step_size_strategy", 0);
359+
h.setOptionValue("pdlp_step_size_strategy", 1);
356360
h.setOptionValue("pdlp_restart_strategy", 2);
357-
// h.setOptionValue("pdlp_iteration_limit", 15);
361+
h.setOptionValue("pdlp_iteration_limit",3520);
358362
// h.setOptionValue("log_dev_level", kHighsLogDevLevelVerbose);
363+
auto start_hipdlp = std::chrono::high_resolution_clock::now();
359364
HighsStatus run_status = h.run();
365+
auto end_hipdlp = std::chrono::high_resolution_clock::now();
366+
auto duration_hipdlp = std::chrono::duration_cast<std::chrono::milliseconds>(end_hipdlp - start_hipdlp);
367+
std::cout << "\n--- HiPDLP Results ---" << std::endl;
368+
std::cout << "Status: " << h.modelStatusToString(h.getModelStatus()) << std::endl;
369+
std::cout << "Iterations: " << h.getInfo().pdlp_iteration_count << std::endl;
370+
std::cout << "Wall time: " << duration_hipdlp.count() / 1000.0 << " seconds" << std::endl;
371+
std::cout << "Objective: " << h.getInfo().objective_function_value << std::endl;
372+
360373
// REQUIRE(run_status == HighsStatus::kOk);
361374
// REQUIRE(h.getModelStatus() == HighsModelStatus::kOptimal);
362375
// REQUIRE(h.getInfo().pdlp_iteration_count == 11880);
@@ -365,7 +378,15 @@ TEST_CASE("hi-pdlp", "[pdlp]") {
365378
h.clearSolver();
366379
h.setOptionValue("solver", kCuPdlpString);
367380
h.setOptionValue("pdlp_log_level", 2);
381+
auto start_cupdlp = std::chrono::high_resolution_clock::now();
368382
run_status = h.run();
383+
auto end_cupdlp = std::chrono::high_resolution_clock::now();
384+
auto duration_cupdlp = std::chrono::duration_cast<std::chrono::milliseconds>(end_cupdlp - start_cupdlp);
385+
std::cout << "\n--- cuPDLP Results ---" << std::endl;
386+
std::cout << "Status: " << h.modelStatusToString(h.getModelStatus()) << std::endl;
387+
std::cout << "Iterations: " << h.getInfo().pdlp_iteration_count << std::endl;
388+
std::cout << "Wall time: " << duration_cupdlp.count() / 1000.0 << " seconds" << std::endl;
389+
std::cout << "Objective: " << h.getInfo().objective_function_value << std::endl;
369390
}
370391
h.resetGlobalScheduler(true);
371392
}

cmake/sources-python.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ set(highs_sources_python
242242
highs/pdlp/hipdlp/pdhg.cc
243243
highs/pdlp/hipdlp/restart.cc
244244
highs/pdlp/hipdlp/scaling.cc
245-
highs/pdlp/hipdlp/step.cc
246245
highs/presolve/HighsPostsolveStack.cpp
247246
highs/presolve/HighsSymmetry.cpp
248247
highs/presolve/HPresolve.cpp
@@ -381,7 +380,6 @@ set(highs_headers_python
381380
highs/pdlp/hipdlp/restart.hpp
382381
highs/pdlp/hipdlp/scaling.hpp
383382
highs/pdlp/hipdlp/solver_results.hpp
384-
highs/pdlp/hipdlp/step.hpp
385383
highs/presolve/HighsPostsolveStack.h
386384
highs/presolve/HighsSymmetry.h
387385
highs/presolve/HPresolve.h

cmake/sources.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,6 @@ set(highs_sources
326326
pdlp/hipdlp/pdhg.cc
327327
pdlp/hipdlp/restart.cc
328328
pdlp/hipdlp/scaling.cc
329-
pdlp/hipdlp/step.cc
330329
presolve/HighsPostsolveStack.cpp
331330
presolve/HighsSymmetry.cpp
332331
presolve/HPresolve.cpp
@@ -468,7 +467,6 @@ set(highs_headers
468467
pdlp/hipdlp/restart.hpp
469468
pdlp/hipdlp/scaling.hpp
470469
pdlp/hipdlp/solver_results.hpp
471-
pdlp/hipdlp/step.hpp
472470
presolve/HighsPostsolveStack.h
473471
presolve/HighsSymmetry.h
474472
presolve/HPresolve.h

highs/meson.build

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,6 @@ _srcs = [
259259
'pdlp/hipdlp/pdhg.cc',
260260
'pdlp/hipdlp/restart.cc',
261261
'pdlp/hipdlp/scaling.cc',
262-
'pdlp/hipdlp/step.cc',
263262
'presolve/HPresolve.cpp',
264263
'presolve/HPresolveAnalysis.cpp',
265264
'presolve/HighsPostsolveStack.cpp',

highs/pdlp/HiPdlpWrapper.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ HighsStatus solveLpHiPdlp(const HighsOptions& options, HighsTimer& timer,
5656
std::vector<double> x, y;
5757
x.resize(pdlp.getnCol(),0.0);
5858
y.resize(pdlp.getnRow(), 0.0);
59+
auto solve_start = std::chrono::high_resolution_clock::now();
5960
pdlp.solve(x, y);
61+
auto solve_end = std::chrono::high_resolution_clock::now();
62+
pdlp.timings_.total_time = std::chrono::duration<double>(solve_end - solve_start).count();
63+
pdlp.timings_.print("HiPdlp :");
6064

6165
// 5. Unscale with HiPdlp
6266
pdlp.unscaleSolution(x, y);

highs/pdlp/cupdlp/cupdlp_solver.c

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,24 +1003,23 @@ cupdlp_retcode PDHG_Solve(const cupdlp_int* has_variables, CUPDLPwork *pdhg) {
10031003
}
10041004

10051005
if (PDHG_Check_Termination_Average(pdhg, termination_print)) {
1006-
// cupdlp_printf("Optimal average solution.\n");
1007-
1008-
cupdlp_int iter = pdhg->timers->nIter;
1009-
CUPDLPvec *x = iterates->x[iter % 2];
1010-
CUPDLPvec *y = iterates->y[iter % 2];
1011-
CUPDLPvec *ax = iterates->ax[iter % 2];
1012-
CUPDLPvec *aty = iterates->aty[iter % 2];
1013-
1014-
CUPDLP_COPY_VEC(x->data, iterates->xAverage->data, cupdlp_float, problem->nCols);
1015-
CUPDLP_COPY_VEC(y->data, iterates->yAverage->data, cupdlp_float, problem->nRows);
1016-
CUPDLP_COPY_VEC(ax->data, iterates->axAverage->data, cupdlp_float, problem->nRows);
1017-
CUPDLP_COPY_VEC(aty->data, iterates->atyAverage->data, cupdlp_float, problem->nCols);
1018-
CUPDLP_COPY_VEC(resobj->dSlackPos, resobj->dSlackPosAverage, cupdlp_float, problem->nCols);
1019-
CUPDLP_COPY_VEC(resobj->dSlackNeg, resobj->dSlackNegAverage, cupdlp_float, problem->nCols);
1020-
1021-
resobj->termIterate = AVERAGE_ITERATE;
1022-
resobj->termCode = OPTIMAL;
1023-
break;
1006+
// cupdlp_printf("Optimal average solution.\n");
1007+
cupdlp_int iter = pdhg->timers->nIter;
1008+
CUPDLPvec *x = iterates->x[iter % 2];
1009+
CUPDLPvec *y = iterates->y[iter % 2];
1010+
CUPDLPvec *ax = iterates->ax[iter % 2];
1011+
CUPDLPvec *aty = iterates->aty[iter % 2];
1012+
1013+
CUPDLP_COPY_VEC(x->data, iterates->xAverage->data, cupdlp_float, problem->nCols);
1014+
CUPDLP_COPY_VEC(y->data, iterates->yAverage->data, cupdlp_float, problem->nRows);
1015+
CUPDLP_COPY_VEC(ax->data, iterates->axAverage->data, cupdlp_float, problem->nRows);
1016+
CUPDLP_COPY_VEC(aty->data, iterates->atyAverage->data, cupdlp_float, problem->nCols);
1017+
CUPDLP_COPY_VEC(resobj->dSlackPos, resobj->dSlackPosAverage, cupdlp_float, problem->nCols);
1018+
CUPDLP_COPY_VEC(resobj->dSlackNeg, resobj->dSlackNegAverage, cupdlp_float, problem->nCols);
1019+
1020+
resobj->termIterate = AVERAGE_ITERATE;
1021+
resobj->termCode = OPTIMAL;
1022+
break;
10241023
}
10251024

10261025
if (PDHG_Check_Infeasibility(pdhg, 0) == INFEASIBLE_OR_UNBOUNDED) {
@@ -1061,8 +1060,7 @@ cupdlp_retcode PDHG_Solve(const cupdlp_int* has_variables, CUPDLPwork *pdhg) {
10611060
double debug_pdlp_data_aty_norm = 0.0;
10621061
cupdlp_twoNorm(pdhg, problem->nCols, aty->data, &debug_pdlp_data_aty_norm);
10631062
pdhg->debug_pdlp_data_.aty_norm = debug_pdlp_data_aty_norm;
1064-
1065-
1063+
10661064
// CUPDLP_CALL(PDHG_Update_Iterate(pdhg));
10671065
if (PDHG_Update_Iterate(pdhg) == RETCODE_FAILED) {
10681066
// cupdlp_printf("Time limit reached.\n");

highs/pdlp/hipdlp/defs.hpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,37 @@ namespace pdlp_iterate_ops {
162162
// Compute z_new = z_old -
163163
};
164164

165+
struct DetailedTimings {
166+
double total_time = 0.0;
167+
double iterate_update_time = 0.0;
168+
double matrix_multiply_time = 0.0; // Ax and ATy
169+
double convergence_check_time = 0.0;
170+
double restart_check_time = 0.0;
171+
double average_iterate_time = 0.0;
172+
double projection_time = 0.0;
173+
double step_size_adjustment_time = 0.0;
174+
double other_time = 0.0;
175+
176+
void print(const std::string& solver_name) const {
177+
std::cout << "\n=== " << solver_name << " Detailed Timings ===" << std::endl;
178+
std::cout << "Total time: " << total_time << " s" << std::endl;
179+
std::cout << "Iterate update: " << iterate_update_time
180+
<< " s (" << (iterate_update_time/total_time*100) << "%)" << std::endl;
181+
std::cout << " - Matrix multiply: " << matrix_multiply_time
182+
<< " s (" << (matrix_multiply_time/total_time*100) << "%)" << std::endl;
183+
std::cout << " - Projection: " << projection_time
184+
<< " s (" << (projection_time/total_time*100) << "%)" << std::endl;
185+
std::cout << " - Step size adjust: " << step_size_adjustment_time
186+
<< " s (" << (step_size_adjustment_time/total_time*100) << "%)" << std::endl;
187+
std::cout << "Convergence check: " << convergence_check_time
188+
<< " s (" << (convergence_check_time/total_time*100) << "%)" << std::endl;
189+
std::cout << "Restart check: " << restart_check_time
190+
<< " s (" << (restart_check_time/total_time*100) << "%)" << std::endl;
191+
std::cout << "Average iterate comp: " << average_iterate_time
192+
<< " s (" << (average_iterate_time/total_time*100) << "%)" << std::endl;
193+
std::cout << "Other: " << other_time
194+
<< " s (" << (other_time/total_time*100) << "%)" << std::endl;
195+
}
196+
};
197+
165198
#endif

0 commit comments

Comments
 (0)