Skip to content

Commit 9c29fdb

Browse files
committed
Revert HiPDLP scaling parity changes
1 parent 5a4b356 commit 9c29fdb

3 files changed

Lines changed: 15 additions & 77 deletions

File tree

highs/pdlp/hipdlp/pdhg.cc

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,8 +1361,7 @@ double PDLPSolver::computePrimalFeasibility(
13611361
}
13621362
}
13631363

1364-
return linalg::vectorNorm(primal_residual) /
1365-
scaling_.getConstraintBoundScaling();
1364+
return linalg::vectorNorm(primal_residual);
13661365
}
13671366

13681367
void PDLPSolver::computeDualSlacks(const std::vector<double>& dualResidual,
@@ -1448,8 +1447,7 @@ double PDLPSolver::computeDualFeasibility(const std::vector<double>& ATy_vector,
14481447
}
14491448
}
14501449

1451-
double dual_feasibility = linalg::vectorNorm(dual_residual) /
1452-
scaling_.getObjectiveVectorScaling();
1450+
double dual_feasibility = linalg::vectorNorm(dual_residual);
14531451

14541452
return dual_feasibility;
14551453
}
@@ -1494,7 +1492,7 @@ PDLPSolver::computeDualityGap(const std::vector<double>& x,
14941492
double PDLPSolver::computeDualObjective(const std::vector<double>& y,
14951493
const std::vector<double>& dSlackPos,
14961494
const std::vector<double>& dSlackNeg) {
1497-
double dual_obj = 0.0;
1495+
double dual_obj = lp_.offset_;
14981496

14991497
// Compute b'y (or rhs'y in cuPDLP notation)
15001498
for (HighsInt i = 0; i < lp_.num_row_; ++i) {
@@ -1515,10 +1513,7 @@ double PDLPSolver::computeDualObjective(const std::vector<double>& y,
15151513
}
15161514
}
15171515

1518-
return dual_obj /
1519-
(scaling_.getConstraintBoundScaling() *
1520-
scaling_.getObjectiveVectorScaling()) +
1521-
lp_.offset_;
1516+
return dual_obj;
15221517
}
15231518

15241519
bool PDLPSolver::checkConvergence(
@@ -1541,21 +1536,18 @@ bool PDLPSolver::checkConvergence(
15411536
results.dual_feasibility = dual_feasibility;
15421537

15431538
// Compute objectives
1544-
double primal_obj = 0.0;
1539+
double primal_obj = lp_.offset_;
15451540
for (HighsInt i = 0; i < lp_.num_col_; ++i) {
15461541
primal_obj += lp_.col_cost_[i] * x[i];
15471542
}
1548-
primal_obj /=
1549-
scaling_.getConstraintBoundScaling() *
1550-
scaling_.getObjectiveVectorScaling();
1551-
results.primal_obj = primal_obj + lp_.offset_;
1543+
results.primal_obj = primal_obj;
15521544

15531545
// Pass the now-populated slack vectors to computeDualObjective
15541546
double dual_obj = computeDualObjective(y, dSlackPos, dSlackNeg);
15551547
results.dual_obj = dual_obj;
15561548

15571549
// Compute duality gap
1558-
double duality_gap = results.primal_obj - dual_obj;
1550+
double duality_gap = primal_obj - dual_obj;
15591551
results.duality_gap = std::abs(duality_gap);
15601552

15611553
// Compute relative gap (matching cuPDLP formula)
@@ -1944,11 +1936,10 @@ void PDLPSolver::unscaleSolution(std::vector<double>& x,
19441936
y_current_ = y;
19451937

19461938
const std::vector<double>& col_scale = scaling_.getColScaling();
1947-
const double objective_scale = scaling_.getObjectiveVectorScaling();
19481939
if (!dSlackPos_.empty() && col_scale.size() == dSlackPos_.size()) {
19491940
for (size_t i = 0; i < dSlackPos_.size(); ++i) {
1950-
dSlackPos_[i] *= col_scale[i] / objective_scale;
1951-
dSlackNeg_[i] *= col_scale[i] / objective_scale;
1941+
dSlackPos_[i] *= col_scale[i];
1942+
dSlackNeg_[i] *= col_scale[i];
19521943
}
19531944
}
19541945
}
@@ -2839,16 +2830,13 @@ bool PDLPSolver::checkConvergenceGpu(const HighsInt iter, const double* d_x,
28392830
cudaMemcpyDeviceToHost, gpu_stream_));
28402831
CUDA_CHECK(cudaStreamSynchronize(gpu_stream_));
28412832

2842-
const double constraint_scale = scaling_.getConstraintBoundScaling();
2843-
const double objective_scale = scaling_.getObjectiveVectorScaling();
2844-
const double combined_scale = constraint_scale * objective_scale;
28452833
double primal_feas_sq = h_results[0];
28462834
double dual_feas_sq = h_results[1];
2847-
double primal_obj = h_results[2] / combined_scale + lp_.offset_;
2848-
double dual_obj = h_results[3] / combined_scale + lp_.offset_;
2835+
double primal_obj = h_results[2] + lp_.offset_;
2836+
double dual_obj = h_results[3] + lp_.offset_;
28492837

2850-
results.primal_feasibility = std::sqrt(primal_feas_sq) / constraint_scale;
2851-
results.dual_feasibility = std::sqrt(dual_feas_sq) / objective_scale;
2838+
results.primal_feasibility = std::sqrt(primal_feas_sq);
2839+
results.dual_feasibility = std::sqrt(dual_feas_sq);
28522840
results.primal_obj = primal_obj;
28532841
results.dual_obj = dual_obj;
28542842

highs/pdlp/hipdlp/scaling.cc

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ void Scaling::initialize(const HighsLp& lp) {
2222
col_scale_.assign(lp.num_col_, 1.0);
2323
row_scale_.assign(lp.num_row_, 1.0);
2424
is_scaled_ = false;
25-
constraint_bound_scale_ = 1.0;
26-
objective_vector_scale_ = 1.0;
2725

2826
// use linalg to compute norms
2927
norm_cost_ = linalg::computeCostNorm(lp, 2.0);
@@ -53,10 +51,6 @@ void Scaling::scaleProblem() {
5351
applyL2Scaling();
5452
is_scaled_ = true;
5553
}
56-
57-
highsLogDev(params_->log_options_, HighsLogType::kInfo,
58-
"Applying bound-objective scaling...\n");
59-
applyBoundObjectiveScaling();
6054
}
6155

6256
void Scaling::applyRuizScaling() {
@@ -234,45 +228,6 @@ void Scaling::applyL2Scaling() {
234228
}
235229
}
236230

237-
void Scaling::applyBoundObjectiveScaling() {
238-
double rhs_norm_sq = 0.0;
239-
for (HighsInt i = 0; i < lp_->num_row_; ++i) {
240-
const double lower = lp_->row_lower_[i];
241-
const double upper = lp_->row_upper_[i];
242-
if (std::isfinite(lower) && lower != upper) rhs_norm_sq += lower * lower;
243-
if (std::isfinite(upper)) rhs_norm_sq += upper * upper;
244-
}
245-
246-
const double rhs_norm = std::sqrt(rhs_norm_sq);
247-
const double obj_norm = computeNorm(lp_->col_cost_.data(), lp_->num_col_, 2.0);
248-
249-
constraint_bound_scale_ = 1.0 / (1.0 + rhs_norm);
250-
objective_vector_scale_ = 1.0 / (1.0 + obj_norm);
251-
252-
for (HighsInt i = 0; i < lp_->num_row_; ++i) {
253-
if (lp_->row_lower_[i] > -kHighsInf) {
254-
lp_->row_lower_[i] *= constraint_bound_scale_;
255-
}
256-
if (lp_->row_upper_[i] < kHighsInf) {
257-
lp_->row_upper_[i] *= constraint_bound_scale_;
258-
}
259-
}
260-
261-
for (HighsInt i = 0; i < lp_->num_col_; ++i) {
262-
lp_->col_cost_[i] *= objective_vector_scale_;
263-
if (lp_->col_lower_[i] > -kHighsInf) {
264-
lp_->col_lower_[i] *= constraint_bound_scale_;
265-
}
266-
if (lp_->col_upper_[i] < kHighsInf) {
267-
lp_->col_upper_[i] *= constraint_bound_scale_;
268-
}
269-
}
270-
271-
if (constraint_bound_scale_ != 1.0 || objective_vector_scale_ != 1.0) {
272-
is_scaled_ = true;
273-
}
274-
}
275-
276231
void Scaling::applyScaling(const std::vector<double>& col_scaling,
277232
const std::vector<double>& row_scaling) {
278233
// Scale cost vector: c_scaled = c / col_scaling
@@ -318,12 +273,12 @@ void Scaling::unscaleSolution(std::vector<double>& x,
318273

319274
// Unscale primal variables: x_original = x_scaled / col_scale
320275
for (size_t i = 0; i < x.size(); ++i) {
321-
x[i] /= (col_scale_[i] * constraint_bound_scale_);
276+
x[i] /= col_scale_[i];
322277
}
323278

324279
// Unscale dual variables: y_original = y_scaled / row_scale
325280
for (size_t i = 0; i < y.size(); ++i) {
326-
y[i] /= (row_scale_[i] * objective_vector_scale_);
281+
y[i] /= row_scale_[i];
327282
}
328283
}
329284

highs/pdlp/hipdlp/scaling.hpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ class Scaling {
4141
bool isScaled() const { return is_scaled_; }
4242
const std::vector<double>& getColScaling() const { return col_scale_; }
4343
const std::vector<double>& getRowScaling() const { return row_scale_; }
44-
double getConstraintBoundScaling() const { return constraint_bound_scale_; }
45-
double getObjectiveVectorScaling() const { return objective_vector_scale_; }
4644

4745
double getNormCost() const { return norm_cost_; }
4846
double getNormRhs() const { return norm_rhs_; }
@@ -53,8 +51,6 @@ class Scaling {
5351
std::vector<double> col_scale_;
5452
std::vector<double> row_scale_;
5553
bool is_scaled_ = false;
56-
double constraint_bound_scale_ = 1.0;
57-
double objective_vector_scale_ = 1.0;
5854

5955
double norm_cost_;
6056
double norm_rhs_;
@@ -63,7 +59,6 @@ class Scaling {
6359
void applyRuizScaling();
6460
void applyPockChambolleScaling();
6561
void applyL2Scaling();
66-
void applyBoundObjectiveScaling();
6762

6863
// Helper function to apply scaling factors to the problem
6964
void applyScaling(const std::vector<double>& col_scaling,

0 commit comments

Comments
 (0)