Skip to content

Rewrite linear constraint consolidation on numpy#689

Open
janosg wants to merge 1 commit into
mainfrom
constraints-refactor-4-numpy-linear-consolidation
Open

Rewrite linear constraint consolidation on numpy#689
janosg wants to merge 1 commit into
mainfrom
constraints-refactor-4-numpy-linear-consolidation

Conversation

@janosg

@janosg janosg commented Jul 4, 2026

Copy link
Copy Markdown
Member

Rewrite of the pandas based linear consolidation machinery:

  • _consolidate_linear_constraints now works on a dense numpy weight matrix and three aligned rhs arrays instead of weights/rhs DataFrames. Every pandas helper has a 1:1 numpy replacement with identical semantics, including first-occurrence order of deduplicated rows (the internal parametrization depends on row order), lower/upper bound swaps under negative rescaling factors, and grouping of rows that only differ in the sign of a zero.
  • The right_hand_side DataFrame in the consolidated linear constraints is replaced by the frozen LinearRightHandSide dataclass.
  • _process_linear_weights is deleted: weights are aligned ndarrays since the typed resolution stage, so the pd.Series wrapping had no remaining purpose.
  • Linear constraints no longer get their index rewritten in _plug_equality_constraints_into_selectors. The rewritten index was unused in the pandas implementation (weights carried their own positions) but would have corrupted the numpy weight scatter. Caught by the characterization harness.

A differential test runs the rewrite against a verbatim copy of the pandas implementation on 200 randomized scenarios (overlapping bundles, fixes, equalities, bounds, negative and duplicate weights, conflicting fixed values) and asserts numerically identical outputs and error parity. It is deleted at the end of the refactoring.

Shape-preserving rewrite of the pandas based linear consolidation machinery:

- _consolidate_linear_constraints now works on a dense numpy weight matrix and
  three aligned rhs arrays instead of weights/rhs DataFrames. Every pandas
  helper has a 1:1 numpy replacement with identical semantics, including
  first-occurrence order of deduplicated rows (the internal parametrization
  depends on row order), lower/upper bound swaps under negative rescaling
  factors, and grouping of rows that only differ in the sign of a zero.
- The right_hand_side DataFrame in the consolidated linear constraints is
  replaced by the frozen LinearRightHandSide dataclass.
- _process_linear_weights is deleted: weights are aligned ndarrays since the
  typed resolution stage, so the pd.Series wrapping had no remaining purpose.
- Linear constraints no longer get their index rewritten in
  _plug_equality_constraints_into_selectors. The rewritten index was unused in
  the pandas implementation (weights carried their own positions) but would
  have corrupted the numpy weight scatter. Caught by the characterization
  harness.

A differential test runs the rewrite against a verbatim copy of the pandas
implementation on 200 randomized scenarios (overlapping bundles, fixes,
equalities, bounds, negative and duplicate weights, conflicting fixed values)
and asserts numerically identical outputs and error parity. It is deleted at
the end of the refactoring.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Jul 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
...rc/optimagic/parameters/consolidate_constraints.py 97.72% <100.00%> (+1.22%) ⬆️
src/optimagic/parameters/process_constraints.py 98.91% <100.00%> (+4.17%) ⬆️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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