Skip to content

Feature request: Expose additional HiPO timing fields via HighsInfo #2910

@MaykThewessen

Description

@MaykThewessen

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:

  1. Identify which IPM phases dominate solve time
  2. Guide optimisation efforts (e.g., symbolic reuse, parallel factorisation)
  3. Compare HiPO vs IPX phase-by-phase rather than just total time

Implementation

The changes are straightforward:

  1. Add 5 fields to HighsInfoStruct in HighsInfo.h
  2. Register them as InfoRecord entries in initRecords()
  3. Forward from hipo_info in IpxWrapper.cpp::solveHipo()

We have a working implementation on our fork — happy to submit a PR.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions