Skip to content

perf: use single-step sparse matrix slicing in MatrixAccessor#618

Open
MaykThewessen wants to merge 1 commit intoPyPSA:masterfrom
MaykThewessen:perf/single-step-sparse-slicing
Open

perf: use single-step sparse matrix slicing in MatrixAccessor#618
MaykThewessen wants to merge 1 commit intoPyPSA:masterfrom
MaykThewessen:perf/single-step-sparse-slicing

Conversation

@MaykThewessen
Copy link

Summary

Replace the double-slicing pattern in MatrixAccessor.A and MatrixAccessor.Q with single-step np.ix_() indexing.

Before:

# matrices.py:147 — two separate sparse slice operations
A[self.clabels][:, self.vlabels]

# matrices.py:181 — same pattern for quadratic objective
expr.to_matrix()[self.vlabels][:, self.vlabels]

After:

A[np.ix_(self.clabels, self.vlabels)]
expr.to_matrix()[np.ix_(self.vlabels, self.vlabels)]

Motivation

The double-slice A[rows][:, cols] creates an intermediate sparse matrix after the first slice, then slices again. np.ix_() expresses the row+column selection as a single operation, avoiding the intermediate allocation. For large constraint matrices (~1.38M rows × ~593K cols), this reduces memory churn.

Context

See #198 (comment) — item 4 in the priority list.

Test plan

  • test_matrices.py — all 4 tests pass (shape validation, masked models, duplicated variables, float coefficients)
  • test_io.py::test_to_highspy — passes
  • test_optimization.py highs-direct — 24/25 pass (one pre-existing failure)

🤖 Generated with Claude Code

Replace double-slicing pattern A[clabels][:, vlabels] with single-step
A[np.ix_(clabels, vlabels)] in MatrixAccessor.A and MatrixAccessor.Q.

The double-slice creates an intermediate sparse matrix (selecting rows
first, then columns), which allocates temporary storage proportional to
the full matrix. np.ix_() performs both row and column selection in a
single operation, avoiding the intermediate allocation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant