Summary
HiPO's internal hipo::Info struct contains detailed timing data that is valuable for profiling and optimization, but only 4 of 9+ timing fields are currently exposed via HighsInfo.
Currently Exposed (via IpxWrapper.cpp)
These 4 fields are forwarded in solveHipo():
ipm_analyse_time — symbolic analysis (ordering + elimination tree)
ipm_factor_time — numerical factorisation
ipm_solve_time — triangular solves
ipm_matrix_time — matrix assembly
Proposed Additions
The following fields exist in hipo::Info but are not forwarded to HighsInfo:
| hipo::Info field |
Proposed HighsInfo field |
Description |
residual_time |
ipm_residual_time |
Residual computation (primal/dual infeasibility) |
omega_time |
ipm_omega_time |
Omega (scaling weight) computation |
AS_structure_time + NE_structure_time |
ipm_structure_time |
Sparsity structure detection |
factor_number |
ipm_factor_count |
Number of factorisations (integer) |
solve_number |
ipm_solve_count |
Number of triangular solves (integer) |
Use Case
We're benchmarking HiPO on PyPSA DC-OPF problems (168-672h chunks, ~600k constraints). Having detailed timing breakdowns helps us:
- Identify which IPM phases dominate solve time
- Guide optimisation efforts (e.g., symbolic reuse, parallel factorisation)
- Compare HiPO vs IPX phase-by-phase rather than just total time
Implementation
The changes are straightforward:
- Add 5 fields to
HighsInfoStruct in HighsInfo.h
- Register them as
InfoRecord entries in initRecords()
- Forward from
hipo_info in IpxWrapper.cpp::solveHipo()
We have a working implementation on our fork — happy to submit a PR.
Summary
HiPO's internal
hipo::Infostruct contains detailed timing data that is valuable for profiling and optimization, but only 4 of 9+ timing fields are currently exposed viaHighsInfo.Currently Exposed (via IpxWrapper.cpp)
These 4 fields are forwarded in
solveHipo():ipm_analyse_time— symbolic analysis (ordering + elimination tree)ipm_factor_time— numerical factorisationipm_solve_time— triangular solvesipm_matrix_time— matrix assemblyProposed Additions
The following fields exist in
hipo::Infobut are not forwarded toHighsInfo:residual_timeipm_residual_timeomega_timeipm_omega_timeAS_structure_time + NE_structure_timeipm_structure_timefactor_numberipm_factor_countsolve_numberipm_solve_countUse Case
We're benchmarking HiPO on PyPSA DC-OPF problems (168-672h chunks, ~600k constraints). Having detailed timing breakdowns helps us:
Implementation
The changes are straightforward:
HighsInfoStructinHighsInfo.hInfoRecordentries ininitRecords()hipo_infoinIpxWrapper.cpp::solveHipo()We have a working implementation on our fork — happy to submit a PR.