Skip to content

feat: add __weakref__ to Model.__slots__#656

Merged
FBumann merged 1 commit into
masterfrom
feat/model-weakref
Apr 20, 2026
Merged

feat: add __weakref__ to Model.__slots__#656
FBumann merged 1 commit into
masterfrom
feat/model-weakref

Conversation

@FBumann
Copy link
Copy Markdown
Collaborator

@FBumann FBumann commented Apr 20, 2026

Summary

  • Add __weakref__ to Model.__slots__ so weakref.ref(model) and WeakKeyDictionary keyed by Model work.
  • Enables third-party accessor-style extensions to attach per-instance state without forcing users to subclass Model or reintroduce __dict__.

Closes #655

Test plan

  • test_model_is_weakrefableweakref.ref(Model()) returns a live reference.
  • test_model_weakkeydict_use_case — entries in a WeakKeyDictionary[Model, ...] are GC'd when the model is deleted.
  • Full test/test_model.py suite still passes (20 tests).

🤖 Generated with Claude Code

Enables weakref.ref() and WeakKeyDictionary-based per-instance storage for
third-party extensions (e.g. accessor-style libraries) without requiring
users to subclass Model.

Closes #655

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@FBumann FBumann force-pushed the feat/model-weakref branch from 19d5427 to bbd7ffb Compare April 20, 2026 07:39
@FBumann FBumann requested a review from FabianHofmann April 20, 2026 07:40
@FBumann
Copy link
Copy Markdown
Collaborator Author

FBumann commented Apr 20, 2026

@FabianHofmann I need this to improve the UX of linopy-yaml. See #561 . Also probably needed for things like #645.

@FBumann FBumann merged commit db8ccde into master Apr 20, 2026
22 checks passed
@FBumann FBumann deleted the feat/model-weakref branch April 20, 2026 08:05
FBumann added a commit that referenced this pull request May 7, 2026
* docs: restructure upcoming release notes and fold in missing PRs

Group the upcoming version block into Features / Performance / Bug Fixes
/ Breaking Changes / Documentation sections so the headline (piecewise)
leads, and add the entries for #589, #595, #601, #614, #619, #635, #656,
#671, #672, #674. Tighten the piecewise block to its final state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: tighten upcoming changelog and drop internal-only entries

Trim verbose phrasing in the piecewise / variables / model / solvers
sections, fold subset-superset sub-bullets into one paragraph, and drop
two entries that aren't user-facing for a release notes audience:
sphinx-copybutton (doc tooling) and Model.__weakref__ (only relevant to
extension authors).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: move align convention from breakpoints() to Slopes in changelog

#673 removed the slopes-mode (and slopes_align kwarg) from breakpoints();
the align kwarg now lives on the Slopes class.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: move SOS reformulation bullet from Variables to Model

SOS reformulation is a model-rewrite/solve-pipeline concern, not a
variable attribute.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: split coord alignment into Expressions, move CPLEX to Bug Fixes

- New *Expressions* subsection holds the subset/superset coord
  harmonization, which was misfiled under *Model*.
- CPLEX quality-attribute handling is a fix for crashes on missing
  attributes, not a new feature — moved to **Bug Fixes**.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: fold as_dataarray MultiIndex fix into add_variables bullet

#659 fixes a regression introduced by #614 in the same release cycle —
no end user ever saw the broken state, so a standalone bullet
overstates the change. Net behavior is captured by extending the
add_variables bullet to mention MultiIndex coords.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: tighter pass on upcoming changelog

Drop implementation details that belong in API docs (numpy-vs-pandas
note, JSON encoding for netCDF, "with no auxiliary variables" piecewise
detail), merge the two OETC bullets, and trim "Add X. Supports Y."
wrappers across most lines.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: rephrase active gating bullet to avoid output-zeroing implication

Previous wording ("zeros all auxiliaries when off") was true at the
auxiliary level but glossed over the bounded-tuple case where the
output is not automatically pinned to 0. Drop the implication and
defer the detail to the docstring.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: drop option-name detail from upcoming changelog

Trim references to specific kwargs/attributes the reader doesn't need
in the high-level summary: method="auto" parens, align="pieces|leading",
deep / include_solution, reformulate_sos="auto", solver_name /
**solver_options, max_dual_infeasibility example, and the
operator-by-operator coord-alignment breakdown.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <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.

Add __weakref__ to Model.__slots__

2 participants