@@ -53,11 +53,75 @@ HighsStatus solveLpHiPdlp(const HighsOptions& options, HighsTimer& timer,
5353 PrimalDualParams params{};
5454
5555 getHiPpdlpParamsFromOptions (options, timer, params);
56- std::vector<double > x, y;
57- PDLPSolver pdlp (logger);
5856
5957 Timer total_timer;
60- pdlp.Solve ((HighsLp&)lp, params, x, y);
58+ /* ** Order of operations
59+ * Presolve with HiGHS
60+ * Preprocess with HiPdlp
61+ * Scale with HiPdlp
62+ * Solve with HiPdlp
63+ * Unscale with HiPdlp
64+ * Postprocess with HiPDLP
65+ * Postsolve with HiGHS
66+ * ***/
67+ // 1. Presolve with HiGHS
68+ Highs highs;
69+ highs.passModel (lp);
70+ HighsLp presolved_lp;
71+ HighsSolution presolve_solution;
72+ bool do_presolve = (options.presolve != " off" );
73+
74+ if (do_presolve) {
75+ HighsStatus presolve_status = highs.presolve ();
76+ if (presolve_status != HighsStatus::kOk ) {
77+ return HighsStatus::kError ; // Handle presolve errors
78+ }
79+
80+ // If the problem is solved during presolve, get the solution and return.
81+ if (highs.getModelStatus () == HighsModelStatus::kOptimal ||
82+ highs.getModelStatus () == HighsModelStatus::kInfeasible ||
83+ highs.getModelStatus () == HighsModelStatus::kUnbounded ) {
84+ presolve_solution = highs.getSolution ();
85+ highs_info.pdlp_iteration_count = 0 ;
86+ highs_solution = presolve_solution;
87+ model_status = highs.getModelStatus ();
88+ return HighsStatus::kOk ;
89+ }
90+
91+ // Get the presolved LP for the next steps.
92+ presolved_lp = highs.getLp ();
93+ } else {
94+ // If presolve is off, the problem to solve is the original LP.
95+ presolved_lp = lp;
96+ }
97+
98+ // 2. Preprocess with HiPdlp
99+ PDLPSolver pdlp (logger);
100+ HighsLp preprocessed_lp;
101+ // logger_.info("Preprocessing LP to handle ranged constraints...");
102+ pdlp.PreprocessLp (presolved_lp, preprocessed_lp);
103+
104+ // 3. Scale with HiPdlp
105+ pdlp.scaling_ .ScaleProblem (preprocessed_lp, params);
106+
107+ // 4. Solve with HiPdlp
108+ std::vector<double > x, y;
109+ pdlp.Solve (preprocessed_lp, params, x, y);
110+
111+ // 5. Unscale with HiPdlp
112+ pdlp.scaling_ .UnscaleSolution (x, y);
113+
114+ // 6. Postprocess with HiPDLP
115+ HighsSolution pdlp_solution;
116+ pdlp.Postsolve (presolved_lp, preprocessed_lp, x, y, pdlp_solution);
117+
118+ // 7. Postsolve with HiGHS
119+ if (do_presolve) {
120+ logger.info (" Postsolving with HiGHS..." );
121+ highs.postsolve (pdlp_solution);
122+ } else {
123+ pdlp_solution = pdlp_solution; // No presolve, so nothing to do
124+ }
61125
62126 // --- Print Summary ---
63127 logger.print_summary (pdlp.GetResults (), pdlp.GetIterationCount (),
0 commit comments