Skip to content

Commit a16bd6e

Browse files
committed
Simplify options
1 parent 2caf6d9 commit a16bd6e

File tree

10 files changed

+70
-109
lines changed

10 files changed

+70
-109
lines changed

highs/ipm/IpxWrapper.cpp

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -502,14 +502,7 @@ HighsStatus solveLpHipo(const HighsOptions& options, HighsTimer& timer,
502502
hipo_options.max_iter =
503503
options.ipm_iteration_limit - highs_info.ipm_iteration_count;
504504

505-
if (options.run_crossover == kHighsOnString)
506-
hipo_options.crossover = hipo::kOptionCrossoverOn;
507-
else if (options.run_crossover == kHighsOffString)
508-
hipo_options.crossover = hipo::kOptionCrossoverOff;
509-
else {
510-
assert(options.run_crossover == kHighsChooseString);
511-
hipo_options.crossover = hipo::kOptionCrossoverChoose;
512-
}
505+
hipo_options.crossover = options.run_crossover;
513506

514507
// Potentially control if ipx is used for refinement and if it is displayed
515508
// hipo_options.refine_with_ipx = true;
@@ -538,19 +531,16 @@ HighsStatus solveLpHipo(const HighsOptions& options, HighsTimer& timer,
538531
hipo_options.parallel = hipo::kOptionParallelChoose;
539532
}
540533

541-
// Parse hipo_system option
542-
if (options.hipo_system == kHipoAugmentedString) {
543-
hipo_options.nla = hipo::kOptionNlaAugmented;
544-
} else if (options.hipo_system == kHipoNormalEqString) {
545-
hipo_options.nla = hipo::kOptionNlaNormEq;
546-
} else if (options.hipo_system == kHighsChooseString) {
547-
hipo_options.nla = hipo::kOptionNlaChoose;
548-
} else {
534+
// Linear system
535+
if (options.hipo_system != kHipoAugmentedString &&
536+
options.hipo_system != kHipoNormalEqString &&
537+
options.hipo_system != kHighsChooseString) {
549538
highsLogUser(options.log_options, HighsLogType::kError,
550539
"Unknown value of option %s\n", kHipoSystemString.c_str());
551540
model_status = HighsModelStatus::kSolveError;
552541
return HighsStatus::kError;
553542
}
543+
hipo_options.nla = options.hipo_system;
554544

555545
// Reordering heuristic
556546
if (options.hipo_ordering != kHipoMetisString &&
@@ -564,16 +554,15 @@ HighsStatus solveLpHipo(const HighsOptions& options, HighsTimer& timer,
564554
}
565555
hipo_options.ordering = options.hipo_ordering;
566556

567-
if (options.hipo_scaling == kHipoCRscaling) {
568-
hipo_options.scaling = hipo::kOptionCRscaling;
569-
} else if (options.hipo_scaling == kHipoNormScaling) {
570-
hipo_options.scaling = hipo::kOptionNormScaling;
571-
} else {
557+
// Scaling strategy
558+
if (options.hipo_scaling != kHipoCRscaling &&
559+
options.hipo_scaling != kHipoNormScaling) {
572560
highsLogUser(options.log_options, HighsLogType::kError,
573561
"Unknown value of option %s\n", kHipoScalingString.c_str());
574562
model_status = HighsModelStatus::kSolveError;
575563
return HighsStatus::kError;
576564
}
565+
hipo_options.scaling = options.hipo_scaling;
577566

578567
// block size option
579568
hipo_options.block_size = options.hipo_block_size;

highs/ipm/hipo/ipm/FactorHiGHSSolver.cpp

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ Int FactorHiGHSSolver::setup() {
391391
Int FactorHiGHSSolver::chooseNla() {
392392
// Choose whether to use augmented system or normal equations.
393393

394-
assert(options_.nla == kOptionNlaChoose);
394+
assert(options_.nla == kHighsChooseString);
395395

396396
Symbolic symb_NE{};
397397
Symbolic symb_AS{};
@@ -436,10 +436,10 @@ Int FactorHiGHSSolver::chooseNla() {
436436

437437
// Decision may be forced by failures
438438
if (failure_NE && !failure_AS) {
439-
options_.nla = kOptionNlaAugmented;
439+
options_.nla = kHipoAugmentedString;
440440
log_stream << textline("Newton system:") << "AS preferred (NE failed)\n";
441441
} else if (failure_AS && !failure_NE) {
442-
options_.nla = kOptionNlaNormEq;
442+
options_.nla = kHipoNormalEqString;
443443
log_stream << textline("Newton system:") << "NE preferred (AS failed)\n";
444444
} else if (failure_AS && failure_NE) {
445445
if (overflow_AS && overflow_NE)
@@ -467,18 +467,18 @@ Int FactorHiGHSSolver::chooseNla() {
467467

468468
if (NE_much_more_expensive ||
469469
(sn_AS_larger_than_NE && AS_not_too_expensive)) {
470-
options_.nla = kOptionNlaAugmented;
470+
options_.nla = kHipoAugmentedString;
471471
log_stream << textline("Newton system:") << "AS preferred\n";
472472
} else {
473-
options_.nla = kOptionNlaNormEq;
473+
options_.nla = kHipoNormalEqString;
474474
log_stream << textline("Newton system:") << "NE preferred\n";
475475
}
476476
}
477477

478478
log_.print(log_stream);
479479

480480
if (status == kStatusOk) {
481-
if (options_.nla == kOptionNlaAugmented) {
481+
if (options_.nla == kHipoAugmentedString) {
482482
S_ = std::move(symb_AS);
483483
freeNEmemory();
484484
} else {
@@ -588,33 +588,30 @@ Int FactorHiGHSSolver::chooseOrdering(const std::vector<Int>& rows,
588588
Int FactorHiGHSSolver::setNla() {
589589
std::stringstream log_stream;
590590

591-
switch (options_.nla) {
592-
case kOptionNlaAugmented: {
593-
if (analyseAS(S_)) {
594-
log_.printe("AS requested, failed analyse phase\n");
595-
return kStatusErrorAnalyse;
596-
}
597-
log_stream << textline("Newton system:") << "AS requested\n";
598-
break;
591+
if (options_.nla == kHipoAugmentedString) {
592+
Int status = analyseAS(S_);
593+
if (status == kStatusOverflow) {
594+
log_.printe("AS requested, integer overflow\n");
595+
return kStatusOverflow;
596+
} else if (status) {
597+
log_.printe("AS requested, failed analyse phase\n");
598+
return kStatusErrorAnalyse;
599599
}
600-
601-
case kOptionNlaNormEq: {
602-
Int status = analyseNE(S_);
603-
if (status == kStatusOverflow) {
604-
log_.printe("NE requested, integer overflow\n");
605-
return kStatusOverflow;
606-
} else if (status) {
607-
log_.printe("NE requested, failed analyse phase\n");
608-
return kStatusErrorAnalyse;
609-
}
610-
log_stream << textline("Newton system:") << "NE requested\n";
611-
break;
600+
log_stream << textline("Newton system:") << "AS requested\n";
601+
602+
} else if (options_.nla == kHipoNormalEqString) {
603+
Int status = analyseNE(S_);
604+
if (status == kStatusOverflow) {
605+
log_.printe("NE requested, integer overflow\n");
606+
return kStatusOverflow;
607+
} else if (status) {
608+
log_.printe("NE requested, failed analyse phase\n");
609+
return kStatusErrorAnalyse;
612610
}
611+
log_stream << textline("Newton system:") << "NE requested\n";
613612

614-
case kOptionNlaChoose: {
615-
if (Int status = chooseNla()) return status;
616-
break;
617-
}
613+
} else {
614+
if (Int status = chooseNla()) return status;
618615
}
619616

620617
log_.print(log_stream);

highs/ipm/hipo/ipm/Info.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct Info {
3434
Int correctors;
3535

3636
// Nla option used
37-
OptionNla option_nla;
37+
std::string option_nla;
3838

3939
// Parallel option used
4040
OptionParallel option_par;

highs/ipm/hipo/ipm/Iterate.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ void Iterate::extract(std::vector<double>& x_user, std::vector<double>& xl_user,
300300
zu_user = std::vector<double>(zu.begin(), zu.begin() + model.n_orig());
301301

302302
// force unused entries to have correct value
303-
for (int i = 0; i < model.n_orig(); ++i) {
303+
for (Int i = 0; i < model.n_orig(); ++i) {
304304
if (!model.hasLb(i)) {
305305
xl_user[i] = kHighsInf;
306306
zl_user[i] = 0.0;
@@ -625,12 +625,12 @@ void Iterate::finalResiduals(Info& info) const {
625625
}
626626
}
627627

628-
void Iterate::setReg(LinearSolver& LS, OptionNla opt) {
628+
void Iterate::setReg(LinearSolver& LS, const std::string& nla) {
629629
// extract regularisation
630630
LS.getReg(total_reg);
631631

632632
// easy access to primal/dual regularisation
633-
if (opt == kOptionNlaNormEq) {
633+
if (nla == kHipoNormalEqString) {
634634
Rp = nullptr;
635635
Rd = total_reg.data();
636636
} else {

highs/ipm/hipo/ipm/Iterate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ struct Iterate {
196196
// ===================================================================================
197197
void residuals6x6(const NewtonDir& d);
198198

199-
void setReg(LinearSolver& LS, OptionNla opt);
199+
void setReg(LinearSolver& LS, const std::string& nla);
200200
};
201201

202202
} // namespace hipo

highs/ipm/hipo/ipm/Model.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ namespace hipo {
99
Int Model::init(const Int num_var, const Int num_con, const double* obj,
1010
const double* rhs, const double* lower, const double* upper,
1111
const Int* A_ptr, const Int* A_rows, const double* A_vals,
12-
const char* constraints, double offset, OptionScaling opt) {
12+
const char* constraints, double offset,
13+
const std::string& scaling) {
1314
// copy the input into the model
1415

1516
if (checkData(num_var, num_con, obj, rhs, lower, upper, A_ptr, A_rows, A_vals,
@@ -45,7 +46,7 @@ Int Model::init(const Int num_var, const Int num_con, const double* obj,
4546
constraints_ = std::vector<char>(constraints, constraints + m_);
4647

4748
preprocess();
48-
scale(opt);
49+
scale(scaling);
4950
reformulate();
5051
denseColumns();
5152
computeNorms();
@@ -317,7 +318,7 @@ void Model::print(const LogHighs& log) const {
317318
}
318319
if (std::isinf(bmin)) bmin = 0.0;
319320

320-
// compute max and min inerval for bounds
321+
// compute max and min interval for bounds
321322
double boundmin = kHighsInf;
322323
double boundmax = 0.0;
323324
for (Int i = 0; i < n_; ++i) {
@@ -409,7 +410,7 @@ static double roundToPowerOf2(double d) {
409410
return std::ldexp(1.0, exp);
410411
}
411412

412-
void Model::scale(OptionScaling opt) {
413+
void Model::scale(const std::string& scaling) {
413414
// Compute scaling:
414415
// A -> R * A * C
415416
// b -> R * b
@@ -422,9 +423,9 @@ void Model::scale(OptionScaling opt) {
422423
colscale_.resize(n_, 1.0);
423424
rowscale_.resize(m_, 1.0);
424425

425-
if (opt == kOptionCRscaling) {
426+
if (scaling == kHipoCRscaling) {
426427
CRscaling();
427-
} else if (opt == kOptionNormScaling) {
428+
} else if (scaling == kHipoNormScaling) {
428429
const Int num_passes = 2;
429430
for (Int pass = 0; pass < num_passes; ++pass) {
430431
onePassNormScaling();

highs/ipm/hipo/ipm/Model.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class Model {
8181
const char* constraints) const;
8282
void computeNorms();
8383

84-
void scale(OptionScaling opt);
84+
void scale(const std::string& scaling);
8585
void applyScaling();
8686
void CRscaling();
8787
void onePassNormScaling();
@@ -92,7 +92,7 @@ class Model {
9292
Int init(const Int num_var, const Int num_con, const double* obj,
9393
const double* rhs, const double* lower, const double* upper,
9494
const Int* A_ptr, const Int* A_rows, const double* A_vals,
95-
const char* constraints, double offset, OptionScaling opt);
95+
const char* constraints, double offset, const std::string& scaling);
9696

9797
// Print information of model
9898
void print(const LogHighs& log) const;

highs/ipm/hipo/ipm/Options.h

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,10 @@
33

44
#include "Parameters.h"
55
#include "io/HighsIO.h"
6+
#include "lp_data/HighsOptions.h"
67

78
namespace hipo {
89

9-
enum OptionNla {
10-
kOptionNlaMin = 0,
11-
kOptionNlaAugmented = kOptionNlaMin,
12-
kOptionNlaNormEq,
13-
kOptionNlaChoose,
14-
kOptionNlaMax = kOptionNlaChoose,
15-
kOptionNlaDefault = kOptionNlaChoose
16-
};
17-
18-
enum OptionCrossover {
19-
kOptionCrossoverMin = 0,
20-
kOptionCrossoverOff = kOptionCrossoverMin,
21-
kOptionCrossoverOn,
22-
kOptionCrossoverChoose,
23-
kOptionCrossoverMax = kOptionCrossoverChoose,
24-
kOptionCrossoverDefault = kOptionCrossoverOff
25-
};
26-
2710
enum OptionParallel {
2811
kOptionParallelMin = 0,
2912
kOptionParallelOff = kOptionParallelMin, // tree off node off
@@ -35,21 +18,13 @@ enum OptionParallel {
3518
kOptionParallelDefault = kOptionParallelChoose
3619
};
3720

38-
enum OptionScaling {
39-
kOptionScalingMin = 0,
40-
kOptionCRscaling = kOptionScalingMin,
41-
kOptionNormScaling,
42-
kOptionScalingMax = kOptionNormScaling,
43-
kOptionScalingDefault = kOptionCRscaling
44-
};
45-
4621
struct Options {
4722
// Solver options
48-
OptionNla nla = kOptionNlaDefault;
49-
OptionCrossover crossover = kOptionCrossoverDefault;
50-
OptionParallel parallel = kOptionParallelDefault;
23+
std::string nla = kHighsChooseString;
24+
std::string crossover = kHighsOffString;
5125
std::string ordering = kHighsChooseString;
52-
OptionScaling scaling = kOptionScalingDefault;
26+
std::string scaling = kHipoCRscaling;
27+
OptionParallel parallel = kOptionParallelDefault;
5328

5429
// Ipm parameters
5530
Int max_iter = kMaxIterDefault;

0 commit comments

Comments
 (0)