Changelog¶
Each pull request adds its line under ## Upcoming version. A release pull
request renames that heading to the version and the day, such as
## 0.1.0 (2026-10-01), and edits the section into the release notes. Merging
it releases that version (RELEASING.md).
Upcoming version¶
0.1.0 (2026-09-25)¶
🎉 specsolve is officially on PyPI!
specsolve 0.1.0 requires mathspec 0.2.0 and uses its words. A spec is the
problem a file states, with no data. A model is a spec with data attached,
which build returns as a Model
(glossary).
The messages and the docs use the two words in these senses.
Since 0.1.0rc1, this release breaks three things:
- An archive holds its spec as
spec.yaml, notmodel.yaml. An archive that 0.1.0rc1 wrote is refused with aLayoutError. To read one, rename itsmodel.yamlmember tospec.yaml. - specsolve requires mathspec 0.2.0. There, the first parameter of
to_spec,adviceand the typesetting functions isspec, notmodel, and the modulemathspec.modelismathspec.spec. A call that passesmodel=by keyword fails. A positional call works as before. - Messages say "spec" where they said "model" for the file. A test that matches the old text fails.
The pull requests since 0.1.0rc1:
- docs: the site follows the reader's light or dark setting in its own violet colour, with code, diagrams and footnotes readable in both (#1767)
- feat!: specsolve requires mathspec 0.2.0 and uses its words spec and model, so an archive holds its spec as spec.yaml (#1768)
- docs: every link to the language's documentation points at mathspec.readthedocs.io (#1764)
- fix: the PyPI page links the docs, issues and changelog, and a stale saved answer says the layout moves before 1.0 (#1763)
0.1.0rc1 (2026-09-25)¶
The release candidate for 0.1.0, the first release on PyPI:
pip install specsolve==0.1.0rc1. The 0.0.1-alpha.N releases below were tags
and GitHub releases only.
- refactor(api): specsolve no longer builds a linopy model, and its linopy extra and LaneError are gone (#1755)
- docs: the solve example archives its run and reads it back, with annotations that name the other options (#1748)
0.0.1-alpha.359 (2026-09-25)¶
Documentation¶
- the configuration files keep a one-line reason only where a setting would look like a mistake (#1756) (7491f91)
0.0.1-alpha.358 (2026-09-25)¶
Documentation¶
- a tutorial feeds the dispatch model from parquet, reads the answer as tables and queries its archive (#1747) (5ecc2ec)
- a tutorial solves one model once per scenario and then window by window (#1746) (7c15f18)
- the readme and home page lead with four benefits for energy system modellers, in cards with icons, and the readme is under half its length (#1743) (e14f3b8)
0.0.1-alpha.357 (2026-09-25)¶
Features¶
- language: an open bound is null and an infinite bound is refused, the way mathspec 0.0.0-alpha.127 does (#1744) (1b1dbef)
0.0.1-alpha.356 (2026-09-25)¶
Documentation¶
- the glossary says a model holds no data, as math-spec uses the word, and every link into math-spec's docs resolves (#1740) (da3f211)
0.0.1-alpha.355 (2026-09-25)¶
Features¶
0.0.1-alpha.354 (2026-09-25)¶
Refactoring¶
- api: a sweep's answer is a Sweep, read back with load_sweep and scan_sweep (#1732) (24b1238)
- api: how each slice of a sweep terminated is runs.record, saved as record.parquet, so objective always means the number (#1731) (7c14833)
Documentation¶
- the glossary defines answers, sweeps, relations and assumptions, and no longer shows build taking a Program (#1730) (25d594b)
0.0.1-alpha.353 (2026-09-24)¶
Documentation¶
0.0.1-alpha.352 (2026-09-24)¶
Refactoring¶
0.0.1-alpha.351 (2026-09-23)¶
Features¶
- language: a special-ordered set names its dimension with along, the way math-spec 0.0.0-alpha.120 does (#1720) (fdc47c5)
0.0.1-alpha.350 (2026-09-23)¶
Features¶
0.0.1-alpha.349 (2026-09-22)¶
Features¶
- api: a curve is written out before a verb reads it, and a sink with no SOS concept refuses a set rather than rewriting it (#1713) (7516597)
Bug Fixes¶
0.0.1-alpha.348 (2026-09-22)¶
Refactoring¶
- data: the caller binds every parameter a piecewise curve reads, and no name the expansion invented (#1711) (7496de9)
0.0.1-alpha.347 (2026-09-22)¶
Features¶
- language: a model states what it assumes of its data, and a where may compare arithmetic, count coordinates and shift a predicate (#1707) (e107514)
0.0.1-alpha.346 (2026-09-21)¶
Bug Fixes¶
- language: a pullback that reads a column over the dimension it joins on is refused at load (#1703) (e92827f)
0.0.1-alpha.345 (2026-09-19)¶
Refactoring¶
0.0.1-alpha.344 (2026-09-19)¶
Documentation¶
- the site is built by zensical, and the two tutorials run as pages rather than notebooks (#1693) (48633b2)
0.0.1-alpha.343 (2026-09-18)¶
Features¶
- language: a call through a relation names the columns it walks, so a relation may gain a value column without changing what the call means (#1691) (451b7c7)
0.0.1-alpha.342 (2026-09-18)¶
Bug Fixes¶
0.0.1-alpha.341 (2026-09-18)¶
Features¶
0.0.1-alpha.340 (2026-09-18)¶
Features¶
- api: an infeasible solve says why there is no solution, so a feasibility cut needs no second model (#1682) (7cc52eb)
0.0.1-alpha.339 (2026-09-18)¶
Features¶
0.0.1-alpha.338 (2026-09-18)¶
Documentation¶
- the decomposition page shows the loop the example runs, and says lpspec owns no driver (#1678) (f1d33b3)
0.0.1-alpha.337 (2026-09-16)¶
Bug Fixes¶
- engine: a cased quantity summed onto a constant side builds, and the coverage guards have one home (#1665) (96a437d)
0.0.1-alpha.336 (2026-09-16)¶
Features¶
0.0.1-alpha.335 (2026-09-16)¶
Bug Fixes¶
0.0.1-alpha.334 (2026-09-15)¶
Features¶
- language: a model states its topology as relations, the way math-spec 0.0.0-alpha.89 does (#1646) (1fd8926)
0.0.1-alpha.333 (2026-09-15)¶
Bug Fixes¶
0.0.1-alpha.332 (2026-09-15)¶
Documentation¶
- the about pages and the model pages say each fact once, in sentences of one idea (#1640) (5d4efa3)
- the howtos, tutorials and reference say each fact once and drop the argument for it (#1639) (697f29d)
0.0.1-alpha.331 (2026-09-15)¶
Features¶
- language: a variable, a constraint and a cased expression declare their shape as dims, as a parameter does (#1634) (7bdcdeb)
0.0.1-alpha.330 (2026-09-15)¶
Documentation¶
0.0.1-alpha.329 (2026-09-14)¶
Bug Fixes¶
0.0.1-alpha.328 (2026-09-14)¶
Documentation¶
- bench: the benchmark page publishes the newest run, and says where that run left a gap (#1618) (089f816)
0.0.1-alpha.327 (2026-09-14)¶
Performance¶
0.0.1-alpha.326 (2026-09-14)¶
Documentation¶
0.0.1-alpha.325 (2026-09-13)¶
Features¶
0.0.1-alpha.324 (2026-09-13)¶
Features¶
Performance¶
- engine: a build stops hashing labels it can count (#1589) (bc49db5)
- engine: a magnitude is read off each side of a column instead of being built (#1592) (019e22c)
- engine: a model reaches HiGHS in one call instead of a batch at a time (#1591) (77ccb7d)
Documentation¶
- api: the glossary defines load and scan, and the tree spells each name one way (#1604) (3d43f6d)
- the published speed claims match the measurements behind them (#1586) (cb98d58)
0.0.1-alpha.323 (2026-09-12)¶
Features¶
0.0.1-alpha.322 (2026-09-12)¶
Features¶
0.0.1-alpha.321 (2026-09-12)¶
Documentation¶
- bench: the benchmark page is re-taken from the newest run, its claims about the numbers included (#1587) (0210774)
0.0.1-alpha.320 (2026-09-11)¶
Features¶
- api: a model, its data and its answer are one file that reads back into polars or a database (#1579) (8dc36f9)
- api: two names that differ only by case are refused, whichever verb reads the spec (#1582) (fc19d17)
0.0.1-alpha.319 (2026-09-10)¶
Features¶
0.0.1-alpha.318 (2026-09-10)¶
Features¶
- strategy: a rolling horizon may keep a different number of coordinates in each window (#1572) (e52bc2d)
Bug Fixes¶
- strategy: a carry hands on the last row a slice owns rather than a coordinate the caller names (#1571) (561d05c)
- strategy: a hand-built axis refuses the stitched answer rather than returning the keyed one (#1568) (7332207)
0.0.1-alpha.317 (2026-09-10)¶
Documentation¶
- descriptions set as prose under math-spec's escaping, pinned to the head of energy-models/math-spec#421 (#1565) (5c6b606)
0.0.1-alpha.316 (2026-09-10)¶
Documentation¶
0.0.1-alpha.315 (2026-09-09)¶
Documentation¶
- each shared claim has one page, and two how-tos cover a parallel sweep and a wrong answer (#1561) (7dc8553)
- every hand-written page meets the docs-writing skill, and the tree follows the nav (#1560) (645a346)
0.0.1-alpha.314 (2026-09-09)¶
Documentation¶
0.0.1-alpha.313 (2026-09-09)¶
Refactoring¶
0.0.1-alpha.312 (2026-09-09)¶
Features¶
- strategy: a lowered program crosses a process, so a pooled sweep lowers nothing twice (#1549) (09cd887)
0.0.1-alpha.311 (2026-09-09)¶
Features¶
- strategy: a sweep spills each slice to disk and resumes where it stopped, and every export and bridge reads every kind (#1547) (c5b4828)
0.0.1-alpha.310 (2026-09-08)¶
Bug Fixes¶
- strategy: a sweep takes every source shape solve takes, and a carry that cannot start is refused before a slice is cut (#1543) (b56f8f2)
0.0.1-alpha.309 (2026-09-08)¶
Refactoring¶
0.0.1-alpha.308 (2026-09-08)¶
Features¶
0.0.1-alpha.307 (2026-09-08)¶
Bug Fixes¶
- linopy: a comparison with its terms on the right builds, and so does a window whose width no lookup reaches (#1537) (46e29cc)
0.0.1-alpha.306 (2026-09-08)¶
Bug Fixes¶
- engine: a variable declared absence: zero reads as zero under a nonlinear operator (#1532) (038af9e)
0.0.1-alpha.305 (2026-09-08)¶
Features¶
- api: a named expression is read back at any degree and may read a constraint's dual (#1529) (b946506)
0.0.1-alpha.304 (2026-09-03)¶
Features¶
0.0.1-alpha.303 (2026-09-02)¶
Bug Fixes¶
0.0.1-alpha.302 (2026-09-02)¶
Documentation¶
0.0.1-alpha.301 (2026-09-02)¶
Bug Fixes¶
- data: a convex piecewise curve is checked without xarray, so a bare install attaches it (#1507) (8b50241)
Refactoring¶
0.0.1-alpha.300 (2026-09-02)¶
Performance¶
0.0.1-alpha.299 (2026-09-01)¶
Performance¶
0.0.1-alpha.298 (2026-09-01)¶
Documentation¶
- bench: the published numbers come from a run of main, and the reproduction installs that commit (#1497) (99a7633)
0.0.1-alpha.297 (2026-09-01)¶
Features¶
0.0.1-alpha.296 (2026-09-01)¶
Documentation¶
0.0.1-alpha.295 (2026-09-01)¶
Refactoring¶
0.0.1-alpha.294 (2026-09-01)¶
Refactoring¶
0.0.1-alpha.293 (2026-08-31)¶
Bug Fixes¶
- differential: a rung's projection names its quantities in the file's order, so a tree nobody changed stops going red (#1469) (1603efa)
0.0.1-alpha.292 (2026-08-31)¶
Features¶
- language: a quantity defined by cases may mix a constant, a parameter and a variable across its regions (#1464) (482e9ec)
0.0.1-alpha.291 (2026-08-31)¶
Documentation¶
0.0.1-alpha.290 (2026-08-31)¶
Bug Fixes¶
0.0.1-alpha.289 (2026-08-29)¶
Bug Fixes¶
0.0.1-alpha.288 (2026-08-28)¶
Bug Fixes¶
0.0.1-alpha.287 (2026-08-28)¶
Bug Fixes¶
- bench: a cell the memory budget stopped says so, instead of naming the seconds (#1447) (e16fc0b)
- bench: the scaling chart reads only the ceilings of the ladder it draws (#1446) (5991e91)
0.0.1-alpha.286 (2026-08-28)¶
Features¶
- api: check hands back the plan the other verbs take, so a model is lowered once per run (#1443) (371bade)
Bug Fixes¶
- differential: a dual the file writes negated is held to the negative of PyPSA's rather than excused (#1444) (8f68665)
0.0.1-alpha.285 (2026-08-28)¶
Documentation¶
- an infeasible model whose file still reads right is diagnosed by the row it built (#1440) (82f4485)
- examples: the PyPSA ladder is the fifteen rungs, and the gallery is examples rather than a second ladder (#1441) (ff525e4)
0.0.1-alpha.284 (2026-08-28)¶
Bug Fixes¶
- data: a negative window width is refused at load, and a spelled-out
AND Truebuilds (#1432) (aeab021)
0.0.1-alpha.283 (2026-08-28)¶
Documentation¶
0.0.1-alpha.282 (2026-08-28)¶
Performance¶
0.0.1-alpha.281 (2026-08-28)¶
Performance¶
0.0.1-alpha.280 (2026-08-28)¶
Bug Fixes¶
0.0.1-alpha.279 (2026-08-28)¶
Documentation¶
0.0.1-alpha.278 (2026-08-28)¶
Refactoring¶
- engine: a program states what it means, so the direction and the edge cannot be inferred wrongly (#1411) (bf67cc4)
Documentation¶
0.0.1-alpha.277 (2026-08-28)¶
Performance¶
0.0.1-alpha.276 (2026-08-28)¶
Features¶
- engine: a malformed plan is refused at the boundary, in plan vocabulary, before any query compiles (#1394) (e435d63)
- engine: the plan says what type a dimension's labels are, as it already says so for a parameter's values (#1391) (05c07f5)
Refactoring¶
- compat: the linopy lane builds from the logical plan, so one lowering answers for both lanes (#1385) (995fa34)
- compat: the linopy loader reads its declarations off the plan, so the plan and the data are the whole seam (#1388) (a20a042)
- engine: a shape operator declares its own fan-in, and the absence pass reads it (#1395) (beaace8)
- engine: one walk over a plan's expressions, and every question about one is a filter of it (#1398) (5c7f2a0)
- engine: the expression nodes are one closed type, so a walk that forgets one no longer compiles (#1397) (e8be601)
- engine: the plan answers which dimension a lookup labels, instead of five callers walking for it (#1387) (8d4cd28)
- engine: the plan decides what a file may say, and the engine only builds it (#1400) (a5582fe)
- engine: two plan fields say what rule holds them, rather than what they saved a lookup on (#1402) (79c8961)
Documentation¶
- the plan's thirteen nodes are one table, each with the query and the linopy call it becomes (#1396) (0e0ae80)
0.0.1-alpha.275 (2026-08-27)¶
Features¶
- differential: rung 14 binds — a network with scenarios flattens to the file's dimensions, and a name PyPSA spells per scenario is held per label (#1376) (ffd53ce)
- differential: rung 15 binds — a multi-period network flattens to one snapshot axis, and PyPSA's network is solved under the semantics PyPSA speaks (#1379) (4fb41cc)
- differential: rungs 12 and 13 bind — the tightening mask and the tangent loss fan in prep, and a block over a segment dimension held to PyPSA's row per segment (#1373) (90d7df2)
0.0.1-alpha.274 (2026-08-27)¶
Refactoring¶
- linopy: a grouped sum's empty group is filled by the caller rather than by a hand-written storage row (#1375) (bb50cb0)
0.0.1-alpha.273 (2026-08-27)¶
Refactoring¶
- differential: snapshots join PyPSA's timestamps natively, the position map is gone (#1369) (00c1da1)
0.0.1-alpha.272 (2026-08-27)¶
Refactoring¶
- linopy: the empty sum is built through linopy's public constructor rather than its storage layout (#1365) (88de413)
0.0.1-alpha.271 (2026-08-27)¶
Features¶
- differential: the commitment rung compares model for model, with its deliberate differences recorded (#1360) (eeeb149)
- differential: the structure column holds the solver model's rows, columns and nonzeros equal on both sides (#1362) (24a73b0)
Bug Fixes¶
- linopy: a sum whose term carries an empty dimension is the empty sum rather than an error (#1359) (a7a3040)
0.0.1-alpha.270 (2026-08-27)¶
Features¶
- differential: each rung has its own model, the file projected onto what the rung builds and held to its objective (#1338) (0400235)
- differential: the ladder holds each PyPSA name to one block with an equal count rather than a sum over its splits (#1351) (46050c3)
- differential: the ladder holds every constraint's dual to PyPSA's, and a difference needs a recorded reason (#1352) (dc37007)
Documentation¶
- differential: the PyPSA ladder page shows the tables each rung binds, committed and held to the corpus (#1336) (cbd00a3)
- differential: the PyPSA ladder, one page per rung, held to PyPSA by objective, structure, duals and the linopy lane (#1348) (a72cc75)
0.0.1-alpha.269 (2026-08-26)¶
Bug Fixes¶
0.0.1-alpha.268 (2026-08-26)¶
Bug Fixes¶
- differential: a stamp moves when its claim changes, not when the solver returns different bits (#1333) (a890c11)
0.0.1-alpha.267 (2026-08-26)¶
Refactoring¶
- differential: the pypsa corpus lives beside its runner, and the certificate is a committed file this tree must reproduce (#1328) (1e0aa53)
0.0.1-alpha.266 (2026-08-26)¶
Bug Fixes¶
- data: a piecewise method's exact curvature is the language's answer, not this package's copy (#1323) (99994a5)
- differential: the KVL basis is PyPSA's own cycle matrix, and the objective is compared net of its constant (#1322) (9b2aa70)
0.0.1-alpha.265 (2026-08-26)¶
Features¶
- differential: the pypsa runner holds the nodal prices to PyPSA's (#1318) (b45bf15)
- the pypsa differential suite lives here, and the corpus keeps only documents (#1310) (c1db712)
Bug Fixes¶
- bench: the scheduled ladder measures the selection it was given, not pytest's defaults (#1312) (3150844)
- differential: the pypsa runner certifies the rung folders, and refuses an empty corpus (#1313) (2092629)
0.0.1-alpha.264 (2026-08-26)¶
Bug Fixes¶
- linopy: a sum_back window whose every width is zero builds no row instead of crashing (#1307) (5525e7c)
0.0.1-alpha.263 (2026-08-26)¶
Refactoring¶
Documentation¶
0.0.1-alpha.262 (2026-08-26)¶
Bug Fixes¶
Refactoring¶
0.0.1-alpha.261 (2026-08-26)¶
Bug Fixes¶
Documentation¶
0.0.1-alpha.260 (2026-08-26)¶
Refactoring¶
0.0.1-alpha.259 (2026-08-26)¶
Refactoring¶
0.0.1-alpha.258 (2026-08-25)¶
Features¶
0.0.1-alpha.257 (2026-08-25)¶
Documentation¶
0.0.1-alpha.256 (2026-08-25)¶
Features¶
Bug Fixes¶
Refactoring¶
- bench: an arm is a module, not a branch in three verbs (#1264) (e62cc33)
- bench: the eager lane is not one of the libraries we compare against (#1268) (37ca9c3)
0.0.1-alpha.255 (2026-08-25)¶
Features¶
0.0.1-alpha.254 (2026-08-25)¶
Features¶
0.0.1-alpha.253 (2026-08-25)¶
Refactoring¶
0.0.1-alpha.252 (2026-08-24)¶
Bug Fixes¶
Documentation¶
0.0.1-alpha.251 (2026-08-24)¶
Refactoring¶
- data: a curve's numbers are checked somewhere of their own (#1236) (d69dad1)
- engine: a build is a value, so the engine holds one field not twenty-six (#1245) (3daf67d)
- engine: a where-mask is its own vocabulary, not a method (#1240) (fde62ee)
- engine: walking a dimension's own order is one subject, not nine methods (#1244) (cf229e6)
- engine: what a term is stops being the compiler's business (#1234) (49b655f)
- linopy: the builder builds; it stops also being the operator table (#1235) (dfb6283)
- lowering: a walk stops handing itself the same three arguments (#1249) (5db1df9)
- lowering: each built-in lowers in a function with its own name (#1247) (7c009d1)
Documentation¶
0.0.1-alpha.250 (2026-08-24)¶
Refactoring¶
0.0.1-alpha.249 (2026-08-23)¶
Features¶
0.0.1-alpha.248 (2026-08-21)¶
Documentation¶
0.0.1-alpha.247 (2026-08-21)¶
Documentation¶
0.0.1-alpha.246 (2026-08-21)¶
Refactoring¶
0.0.1-alpha.245 (2026-08-21)¶
Bug Fixes¶
0.0.1-alpha.244 (2026-08-21)¶
Refactoring¶
0.0.1-alpha.243 (2026-08-21)¶
Features¶
0.0.1-alpha.242 (2026-08-21)¶
Refactoring¶
- tests: a test is named for its construct, and the residue file is split (#1209) (935bfd7)
- tests: the relational tests say what each group shares (#1211) (c389f6c)
Documentation¶
0.0.1-alpha.241 (2026-08-21)¶
Documentation¶
0.0.1-alpha.240 (2026-08-21)¶
Bug Fixes¶
0.0.1-alpha.239 (2026-08-21)¶
Features¶
Documentation¶
0.0.1-alpha.238 (2026-08-20)¶
Documentation¶
0.0.1-alpha.237 (2026-08-20)¶
Refactoring¶
0.0.1-alpha.236 (2026-08-20)¶
Documentation¶
0.0.1-alpha.235 (2026-08-20)¶
Features¶
Refactoring¶
- data: a lookup's values are checked once, not once per lane (#1190) (73c8bf6)
- engine: an unmapped label is a row that is not there, inside as well (#1187) (903ec33)
0.0.1-alpha.234 (2026-08-20)¶
Bug Fixes¶
0.0.1-alpha.233 (2026-08-20)¶
Features¶
- api: check answers whether a named sink will take the model (#928) (4a9d80e)
- language: a constraint may be quadratic where something can build one (#942) (7ef15c7)
- language: a discount factor is arithmetic, not a column to prepare (#1177) (6c5c806)
- language: the objective takes a quadratic term (#929) (e8c88cb)
- sinks: a sink declares what it can ingest, and what it refuses in pairs (#927) (3af0c43)
- solver: gurobi takes the quadratic objectives highs refuses (#930) (344804b)
Documentation¶
0.0.1-alpha.232 (2026-08-20)¶
Features¶
0.0.1-alpha.231 (2026-08-20)¶
Documentation¶
0.0.1-alpha.230 (2026-08-20)¶
Bug Fixes¶
- language: a constraint that decides nothing is refused where the file is read (#1173) (c94d330), closes #1171
- typeset: a fill and a group share the operator's one subscript (#1169) (8455a73), closes #1165
0.0.1-alpha.229 (2026-08-20)¶
Bug Fixes¶
- compat: a reduction over an empty dimension builds no row on either lane (#1170) (7e348a1), closes #1108
0.0.1-alpha.228 (2026-08-20)¶
Bug Fixes¶
0.0.1-alpha.227 (2026-08-20)¶
⚠ BREAKING CHANGES¶
- language: a piecewise gate is named for the number it is (#1136)
Bug Fixes¶
- language: a piecewise curve whose gate does not exist there is ungated, not relaxed (#1159) (1b927cc)
- release: the alpha stream holds against a breaking commit title (#1162) (27f03c3)
Refactoring¶
0.0.1-alpha.226 (2026-08-20)¶
Documentation¶
0.0.1-alpha.225 (2026-08-20)¶
Refactoring¶
0.0.1-alpha.224 (2026-08-20)¶
Refactoring¶
0.0.1-alpha.223 (2026-08-20)¶
Bug Fixes¶
- engine: four operators refuse a constant beside a term as a lane gap (#1140) (b59aa4c)
- engine: sum_back drops a constant at a slot its term is absent from (#1143) (2845133)
Refactoring¶
- errors: the language raises its own errors (#1135) (38c00af)
- language: the AST is read through one declared surface (#1132) (fd8bfb1)
0.0.1-alpha.222 (2026-08-20)¶
Features¶
0.0.1-alpha.221 (2026-08-20)¶
Features¶
- language: a curve shorter than its breakpoint dimension says so (#1115) (45dc672)
- language: a curve's length is a fact of the curve (#1117) (3996273)
Bug Fixes¶
- data: a breakpoint dimension with no index keeps its own message (#1125) (0ffef63)
- data: a piecewise curve is judged as the model builds it (#1126) (c23102b)
- language: a curve varying along a dim no link carries is named on the link (#1127) (a51c151)
Documentation¶
0.0.1-alpha.220 (2026-08-19)¶
Features¶
Refactoring¶
- data: both lanes read their data through one front door (#1076) (8923df9)
- linopy: the builder groups by what it translates (#1092) (380cdbe)
0.0.1-alpha.219 (2026-08-19)¶
Documentation¶
0.0.1-alpha.218 (2026-08-19)¶
Features¶
0.0.1-alpha.217 (2026-08-19)¶
Bug Fixes¶
0.0.1-alpha.216 (2026-08-19)¶
Features¶
- file-out: a model leaves as MPS, not only as LP (#1097) (76dc58b)
- language: a convex cost curve stops paying a variable per breakpoint (#926) (50d1984)
0.0.1-alpha.215 (2026-08-19)¶
Features¶
0.0.1-alpha.214 (2026-08-19)¶
Documentation¶
0.0.1-alpha.213 (2026-08-19)¶
Features¶
0.0.1-alpha.212 (2026-08-19)¶
Bug Fixes¶
0.0.1-alpha.211 (2026-08-19)¶
Refactoring¶
0.0.1-alpha.210 (2026-08-19)¶
Features¶
- language: a sum can take every dim its operand carries (#1071) (9874d64)
- language: an objective spells the sums that make it one number (#1077) (d40ca88)
0.0.1-alpha.209 (2026-08-19)¶
Features¶
0.0.1-alpha.208 (2026-08-19)¶
Bug Fixes¶
0.0.1-alpha.207 (2026-08-19)¶
Performance¶
0.0.1-alpha.206 (2026-08-19)¶
Bug Fixes¶
0.0.1-alpha.205 (2026-08-18)¶
Features¶
0.0.1-alpha.204 (2026-08-18)¶
Bug Fixes¶
- compat: the eager lane's edge fills the shift's own vacated slot (#1050) (3f965f7)
- engine: a per-entity offset's edge is per entity (#1053) (53fc3f7)
0.0.1-alpha.203 (2026-08-18)¶
Features¶
0.0.1-alpha.202 (2026-08-18)¶
Bug Fixes¶
Refactoring¶
Documentation¶
0.0.1-alpha.201 (2026-08-18)¶
Bug Fixes¶
- language: a divisor that adds is refused at load, not at build (#1048) (4153653)
- typeset: an objective term is shown summed over the dims it carries (#1045) (3e29596)
0.0.1-alpha.200 (2026-08-18)¶
Features¶
- ports: a risk preference is three variables and two rows (#1035) (c3972ff)
- ports: capacity is chosen once and dispatch once per future (#1033) (96a4572)
0.0.1-alpha.199 (2026-08-18)¶
Bug Fixes¶
Documentation¶
0.0.1-alpha.198 (2026-08-18)¶
Bug Fixes¶
0.0.1-alpha.197 (2026-08-18)¶
Features¶
- api: a badly scaled model says which declaration is badly scaled (#993) (ab92e2e)
- data: a declared dtype is what the column has to be (#1022) (acbe2e6)
0.0.1-alpha.196 (2026-08-18)¶
Features¶
0.0.1-alpha.195 (2026-08-18)¶
Features¶
Refactoring¶
0.0.1-alpha.194 (2026-08-18)¶
Bug Fixes¶
0.0.1-alpha.193 (2026-08-18)¶
Documentation¶
0.0.1-alpha.192 (2026-08-18)¶
Bug Fixes¶
0.0.1-alpha.191 (2026-08-18)¶
Bug Fixes¶
0.0.1-alpha.190 (2026-08-18)¶
Features¶
- language: a boundary seed survives the index being relabelled (#904) (ca76c5a)
- ports: what may be built in a period depends on the period before (#995) (208e9e7)
Bug Fixes¶
Documentation¶
0.0.1-alpha.189 (2026-08-17)¶
Features¶
Bug Fixes¶
Refactoring¶
0.0.1-alpha.188 (2026-08-17)¶
Features¶
0.0.1-alpha.187 (2026-08-17)¶
Features¶
0.0.1-alpha.186 (2026-08-17)¶
Features¶
0.0.1-alpha.185 (2026-08-17)¶
Bug Fixes¶
- compat: at() through a label that maps nowhere drops the row, not the coordinate (#969) (89587ce)
- engine: a row a propagated absence deleted is an omission too (#981) (0851444)
Documentation¶
0.0.1-alpha.184 (2026-08-17)¶
Features¶
0.0.1-alpha.183 (2026-08-17)¶
Documentation¶
0.0.1-alpha.182 (2026-08-17)¶
Features¶
0.0.1-alpha.181 (2026-08-17)¶
Features¶
0.0.1-alpha.180 (2026-08-17)¶
Features¶
0.0.1-alpha.179 (2026-08-17)¶
Features¶
0.0.1-alpha.178 (2026-08-17)¶
Bug Fixes¶
0.0.1-alpha.177 (2026-08-17)¶
Features¶
0.0.1-alpha.176 (2026-08-17)¶
Features¶
0.0.1-alpha.175 (2026-08-17)¶
Features¶
0.0.1-alpha.174 (2026-08-17)¶
Features¶
0.0.1-alpha.173 (2026-08-17)¶
Features¶
0.0.1-alpha.172 (2026-08-17)¶
Bug Fixes¶
0.0.1-alpha.171 (2026-08-17)¶
Documentation¶
0.0.1-alpha.170 (2026-08-16)¶
Features¶
0.0.1-alpha.169 (2026-08-16)¶
Refactoring¶
Documentation¶
0.0.1-alpha.168 (2026-08-16)¶
Bug Fixes¶
0.0.1-alpha.167 (2026-08-16)¶
Bug Fixes¶
0.0.1-alpha.166 (2026-08-16)¶
Documentation¶
0.0.1-alpha.165 (2026-08-16)¶
Refactoring¶
0.0.1-alpha.164 (2026-08-16)¶
Features¶
- language: a dimension takes its labels from an index, never from the data (#884) (13aa444)
- language: a window's width is a column, not a run of shifts (#871) (7a90400)
- language: an offset that differs per entity is a column, not a literal (#862) (7a3ba7b)
Bug Fixes¶
Documentation¶
0.0.1-alpha.163 (2026-08-16)¶
Bug Fixes¶
- compat: a dimension index is a table on both lanes, and a defect in one reads the same (#877) (cb7af0a)
0.0.1-alpha.162 (2026-08-16)¶
Bug Fixes¶
0.0.1-alpha.161 (2026-08-16)¶
Bug Fixes¶
0.0.1-alpha.160 (2026-08-16)¶
Features¶
0.0.1-alpha.159 (2026-08-16)¶
Features¶
Bug Fixes¶
Documentation¶
0.0.1-alpha.158 (2026-08-16)¶
Refactoring¶
0.0.1-alpha.157 (2026-08-16)¶
Features¶
0.0.1-alpha.156 (2026-08-16)¶
Features¶
- api: a parameter may be written out in Python, not only handed over as a table (#853) (b8cf21f)
- compat: the linopy lane reads every table the product path reads (#857) (c39bd5d)
Refactoring¶
0.0.1-alpha.155 (2026-08-16)¶
Features¶
Documentation¶
0.0.1-alpha.154 (2026-08-16)¶
Bug Fixes¶
Documentation¶
0.0.1-alpha.153 (2026-08-16)¶
Documentation¶
0.0.1-alpha.152 (2026-08-16)¶
Documentation¶
0.0.1-alpha.151 (2026-08-16)¶
Features¶
- language: a small relation is declared, not supplied (#771) (3be93de)
- language: a where reads a lookup (#768) (ab584f2)
Bug Fixes¶
- language: a declared lookup map holds labels of the declared dtype (#781) (5ec2c2f)
- language: two lookups are comparable only where their labels are (#780) (b2e2742)
0.0.1-alpha.150 (2026-08-16)¶
Bug Fixes¶
0.0.1-alpha.149 (2026-08-16)¶
Features¶
- gallery: a model proves every many-to-many shape load-bearing (#747) (bb75a1a)
- language: a coordinate is a named top-level lookup (#742) (a326026)
- language: a lookup addresses itself, and the sibling kwarg is gone (#759) (01c243c)
Bug Fixes¶
Documentation¶
0.0.1-alpha.148 (2026-08-16)¶
Features¶
Bug Fixes¶
0.0.1-alpha.147 (2026-08-15)¶
Refactoring¶
- bench: one comparison table, and it renders the same bytes twice (#806) (28a39fa)
- bench: the harness stops carrying what no longer measures anything (#804) (441de0f)
0.0.1-alpha.146 (2026-08-15)¶
Features¶
Documentation¶
0.0.1-alpha.145 (2026-08-15)¶
Documentation¶
0.0.1-alpha.144 (2026-08-15)¶
Features¶
- language: a declaration says what it is, and the legend reads it (#812) (6b31278)
- language: a file says what model it is (#813) (6c081e1)
- language: a named expression can say what it counts (#814) (d57aad1)
0.0.1-alpha.143 (2026-08-15)¶
Features¶
0.0.1-alpha.142 (2026-08-15)¶
Features¶
0.0.1-alpha.141 (2026-08-15)¶
Features¶
0.0.1-alpha.140 (2026-08-15)¶
Documentation¶
0.0.1-alpha.139 (2026-08-15)¶
Bug Fixes¶
0.0.1-alpha.138 (2026-08-15)¶
Features¶
- api: a named expression is readable after a solve (#726) (e41fbe1)
- gallery: a generator sits on a bus and burns a carrier (#783) (5334608)
- strategy: a sweep reads the quantity its model names (#748) (1268fb5)
0.0.1-alpha.137 (2026-08-15)¶
Documentation¶
0.0.1-alpha.136 (2026-08-15)¶
Features¶
0.0.1-alpha.135 (2026-08-15)¶
Documentation¶
0.0.1-alpha.134 (2026-08-15)¶
Bug Fixes¶
0.0.1-alpha.133 (2026-08-14)¶
Bug Fixes¶
0.0.1-alpha.132 (2026-08-14)¶
Refactoring¶
0.0.1-alpha.131 (2026-08-14)¶
Bug Fixes¶
0.0.1-alpha.130 (2026-08-14)¶
Documentation¶
0.0.1-alpha.129 (2026-08-14)¶
Features¶
0.0.1-alpha.128 (2026-08-14)¶
Features¶
- api: a slow build says where the time went (#717) (bab22b0)
- api: a solved constraint row says its activity (#716) (63205d4)
0.0.1-alpha.127 (2026-08-14)¶
Documentation¶
0.0.1-alpha.126 (2026-08-14)¶
Bug Fixes¶
- engine: a coordinate may target a dimension nothing spans yet (#714) (f93969e)
- tests: the coordinate-target fixture speaks the current objective surface (#734) (5d18833)
0.0.1-alpha.125 (2026-08-14)¶
Features¶
0.0.1-alpha.124 (2026-08-14)¶
Documentation¶
0.0.1-alpha.123 (2026-08-14)¶
Performance¶
- engine: a coefficient of zero stops reaching the solver (#685) (6a6c026)
- engine: a share stops carrying its zeros through the sort (#686) (ca7b54e)
Documentation¶
0.0.1-alpha.122 (2026-08-14)¶
Features¶
- api: diagnostics say what the sink added to the model it was handed (#689) (0e6c75a)
- language: a piecewise curve may name its formulation (#688) (d420c8b)
- language: a variable may declare a special-ordered set over one of its dims (#687) (94cc18e)
Performance¶
0.0.1-alpha.121 (2026-08-13)¶
Documentation¶
- models: both tabs start from the same tables (#678) (dc50136)
- models: every teaching model is verified and reads in linopy (#680) (613a8e8)
- models: the journey from files to the shared tables has one page (#679) (bdc636d)
- models: the linopy tabs read as linopy users write, types said where hidden (#681) (840e79e)
- models: the model files speak as a modeller, the pages teach the language (#682) (07c58b4)
0.0.1-alpha.120 (2026-08-13)¶
Documentation¶
0.0.1-alpha.119 (2026-08-13)¶
Refactoring¶
0.0.1-alpha.118 (2026-08-13)¶
Refactoring¶
0.0.1-alpha.117 (2026-08-13)¶
Documentation¶
0.0.1-alpha.116 (2026-08-13)¶
Documentation¶
0.0.1-alpha.115 (2026-08-13)¶
Documentation¶
0.0.1-alpha.114 (2026-08-13)¶
Features¶
Performance¶
0.0.1-alpha.113 (2026-08-13)¶
Documentation¶
0.0.1-alpha.112 (2026-08-13)¶
Performance¶
0.0.1-alpha.111 (2026-08-13)¶
Performance¶
- engine: constants stop doubling the cost of a constraint's rows (#650) (a89a2c9)
- sinks: a row's comparison crosses to the solver as a code, not a string (#648) (b0bb8c3)
- sinks: the solver's column vectors stop being walked five times (#649) (98d604d)
0.0.1-alpha.110 (2026-08-12)¶
Bug Fixes¶
0.0.1-alpha.109 (2026-08-12)¶
Documentation¶
0.0.1-alpha.108 (2026-08-12)¶
Documentation¶
0.0.1-alpha.107 (2026-08-12)¶
Refactoring¶
0.0.1-alpha.106 (2026-08-12)¶
Bug Fixes¶
0.0.1-alpha.105 (2026-08-12)¶
Documentation¶
0.0.1-alpha.104 (2026-08-12)¶
Documentation¶
0.0.1-alpha.103 (2026-08-11)¶
Performance¶
0.0.1-alpha.102 (2026-08-11)¶
Features¶
0.0.1-alpha.101 (2026-08-11)¶
Documentation¶
0.0.1-alpha.100 (2026-08-11)¶
Documentation¶
0.0.1-alpha.99 (2026-08-11)¶
Documentation¶
0.0.1-alpha.98 (2026-08-11)¶
Documentation¶
0.0.1-alpha.97 (2026-08-11)¶
Documentation¶
0.0.1-alpha.96 (2026-08-11)¶
Refactoring¶
Documentation¶
0.0.1-alpha.95 (2026-08-11)¶
Bug Fixes¶
0.0.1-alpha.94 (2026-08-11)¶
Refactoring¶
0.0.1-alpha.93 (2026-08-11)¶
Bug Fixes¶
0.0.1-alpha.92 (2026-08-11)¶
Bug Fixes¶
0.0.1-alpha.91 (2026-08-11)¶
Performance¶
- engine: the objective keeps the hash count — bought order was a shape-dependent bet (#581) (d30598f)
0.0.1-alpha.90 (2026-08-11)¶
Refactoring¶
0.0.1-alpha.89 (2026-08-11)¶
Bug Fixes¶
0.0.1-alpha.88 (2026-08-11)¶
Performance¶
0.0.1-alpha.87 (2026-08-11)¶
Performance¶
0.0.1-alpha.86 (2026-08-11)¶
Features¶
- language: a coordinate may declare its own label space (#557) (220fd8a)
- language: a row with no variable terms is not built, and is reported (#561) (4cf2ea5), closes #556
0.0.1-alpha.85 (2026-08-10)¶
Performance¶
0.0.1-alpha.84 (2026-08-10)¶
Features¶
0.0.1-alpha.83 (2026-08-10)¶
Bug Fixes¶
0.0.1-alpha.82 (2026-08-10)¶
Bug Fixes¶
0.0.1-alpha.81 (2026-08-10)¶
Bug Fixes¶
Performance¶
0.0.1-alpha.80 (2026-08-10)¶
Bug Fixes¶
- api: one exception tree, whichever door built the model (#538) (52cdb8b), closes #527
- linopy: extend() passes the borrowed names to its own expansion (#542) (282a2d3)
0.0.1-alpha.79 (2026-08-10)¶
Bug Fixes¶
0.0.1-alpha.78 (2026-08-10)¶
Refactoring¶
0.0.1-alpha.77 (2026-08-09)¶
Documentation¶
0.0.1-alpha.76 (2026-08-09)¶
Features¶
0.0.1-alpha.75 (2026-08-09)¶
Refactoring¶
0.0.1-alpha.74 (2026-08-09)¶
Documentation¶
0.0.1-alpha.73 (2026-08-09)¶
Performance¶
0.0.1-alpha.72 (2026-08-09)¶
Bug Fixes¶
0.0.1-alpha.71 (2026-08-09)¶
Refactoring¶
0.0.1-alpha.70 (2026-08-09)¶
Features¶
Performance¶
- polars: two group_sums collide only where the coordinates meet, and the matrix leaves in row order (#487) (53621b1)
0.0.1-alpha.69 (2026-08-09)¶
Bug Fixes¶
0.0.1-alpha.68 (2026-08-09)¶
Documentation¶
0.0.1-alpha.67 (2026-08-09)¶
Bug Fixes¶
0.0.1-alpha.66 (2026-08-09)¶
Documentation¶
0.0.1-alpha.65 (2026-08-09)¶
Documentation¶
0.0.1-alpha.64 (2026-08-09)¶
Documentation¶
0.0.1-alpha.63 (2026-08-09)¶
Documentation¶
0.0.1-alpha.62 (2026-08-01)¶
Documentation¶
0.0.1-alpha.61 (2026-07-31)¶
Bug Fixes¶
0.0.1-alpha.60 (2026-07-31)¶
Refactoring¶
0.0.1-alpha.59 (2026-07-31)¶
Performance¶
0.0.1-alpha.58 (2026-07-31)¶
Documentation¶
0.0.1-alpha.57 (2026-07-31)¶
Performance¶
0.0.1-alpha.56 (2026-07-31)¶
Bug Fixes¶
0.0.1-alpha.55 (2026-07-31)¶
Performance¶
0.0.1-alpha.54 (2026-07-31)¶
Performance¶
0.0.1-alpha.53 (2026-07-31)¶
Performance¶
0.0.1-alpha.52 (2026-07-31)¶
Features¶
0.0.1-alpha.51 (2026-07-31)¶
Documentation¶
0.0.1-alpha.50 (2026-07-31)¶
Performance¶
- polars: a constraint over distinct variables has nothing to collapse (#408) (8e725de)
- polars: a fragment is not restricted by its own absence (#413) (8ac3a0d)
- polars: a mask joins for what it is certain of (#415) (68d95e2)
- polars: a solve is read back by position, not by key (#414) (cba01c4)
- polars: an existence join does not deduplicate what it asks about (#412) (c008154)
0.0.1-alpha.49 (2026-07-31)¶
Bug Fixes¶
0.0.1-alpha.48 (2026-07-31)¶
Bug Fixes¶
0.0.1-alpha.47 (2026-07-31)¶
Refactoring¶
0.0.1-alpha.46 (2026-07-31)¶
Features¶
0.0.1-alpha.45 (2026-07-31)¶
Documentation¶
0.0.1-alpha.44 (2026-07-31)¶
Documentation¶
0.0.1-alpha.43 (2026-07-31)¶
Documentation¶
0.0.1-alpha.42 (2026-07-31)¶
Documentation¶
0.0.1-alpha.41 (2026-07-31)¶
Documentation¶
0.0.1-alpha.40 (2026-07-31)¶
Refactoring¶
0.0.1-alpha.39 (2026-07-31)¶
Refactoring¶
- language: the front end is a package, and degree 1 lives in it (#371) (0bcfd1b)
- relational: binding produces a value, and the live registry is visibly the exception (#370) (70e13ba)
0.0.1-alpha.38 (2026-07-31)¶
Refactoring¶
- relational: labels and the result are modules, not regions of the executor (#368) (7c8604a)
- three small simplifications in the eager lane and piecewise (#366) (b8a5d3e)
0.0.1-alpha.37 (2026-07-31)¶
Documentation¶
0.0.1-alpha.36 (2026-07-31)¶
Refactoring¶
0.0.1-alpha.35 (2026-07-31)¶
Features¶
0.0.1-alpha.34 (2026-07-30)¶
Performance¶
0.0.1-alpha.33 (2026-07-30)¶
Refactoring¶
0.0.1-alpha.32 (2026-07-30)¶
Bug Fixes¶
0.0.1-alpha.31 (2026-07-30)¶
Bug Fixes¶
0.0.1-alpha.30 (2026-07-30)¶
Bug Fixes¶
0.0.1-alpha.29 (2026-07-30)¶
Documentation¶
0.0.1-alpha.28 (2026-07-30)¶
Bug Fixes¶
0.0.1-alpha.27 (2026-07-30)¶
Refactoring¶
0.0.1-alpha.26 (2026-07-30)¶
Bug Fixes¶
0.0.1-alpha.25 (2026-07-30)¶
Documentation¶
0.0.1-alpha.24 (2026-07-29)¶
Features¶
0.0.1-alpha.23 (2026-07-29)¶
Bug Fixes¶
0.0.1-alpha.22 (2026-07-29)¶
Documentation¶
0.0.1-alpha.21 (2026-07-29)¶
Documentation¶
- the home page shows the model it sets, as math (#317) (4094fb9)
- typeset: say that
symbols=takes a dict, not only a path (#323) (e9f2102)
0.0.1-alpha.20 (2026-07-29)¶
Bug Fixes¶
0.0.1-alpha.19 (2026-07-29)¶
Bug Fixes¶
- a divisor must be defined where the model divides by it (#318) (d7ad809)
- relational: absence propagates into a reduction, and laws to hold it there (#314) (f4bb63b)
0.0.1-alpha.18 (2026-07-29)¶
Documentation¶
0.0.1-alpha.17 (2026-07-29)¶
Features¶
Bug Fixes¶
0.0.1-alpha.16 (2026-07-29)¶
Documentation¶
0.0.1-alpha.15 (2026-07-29)¶
Bug Fixes¶
0.0.1-alpha.14 (2026-07-29)¶
Documentation¶
0.0.1-alpha.13 (2026-07-29)¶
⚠ BREAKING CHANGES¶
- linopy: importing
farkas.linopysetslinopy.options['semantics']to 'v1' process-wide. Models built through this lane change answer wherever a variable is masked or shifted — that is the point, and it is the answer the native engine has always given. - a bare
shift()now drops the row at the vacated coordinate instead of contributing zero there, andshift()over a variable-free expression is a load error. Addfill=0for the previous behaviour.
Features¶
Bug Fixes¶
- linopy: the lane selects v1 on import, and fill= takes the identity of its position (#293) (451c354)
- release: put the version back on the alpha stream, and make the pin real (#295) (8ef60a5)
0.0.1-alpha.12 (2026-07-29)¶
Documentation¶
0.0.1-alpha.11 (2026-07-29)¶
Bug Fixes¶
0.0.1-alpha.10 (2026-07-28)¶
Documentation¶
0.0.1-alpha.9 (2026-07-28)¶
Bug Fixes¶
0.0.1-alpha.8 (2026-07-28)¶
Bug Fixes¶
- piecewise: emit foreach in declaration order, not set order (#271) (c06907b)
- where: a declared dimension on a comparison RHS is a load error (#272) (5b1784e)
0.0.1-alpha.7 (2026-07-28)¶
Documentation¶
0.0.1-alpha.6 (2026-07-28)¶
Documentation¶
0.0.1-alpha.5 (2026-07-28)¶
Documentation¶
0.0.1-alpha.4 (2026-07-28)¶
Documentation¶
0.0.1-alpha.3 (2026-07-28)¶
Documentation¶
0.0.1-alpha.2 (2026-07-28)¶
Refactoring¶
0.0.1-alpha.1 (2026-07-28)¶
⚠ BREAKING CHANGES¶
- rebuild the relational engine on polars (#189)
Features¶
Chores¶
0.0.0-alpha.33 (2026-07-28)¶
⚠ BREAKING CHANGES¶
- absence propagates and drops the row, plus defined(v) (#239)
Features¶
0.0.0-alpha.32 (2026-07-28)¶
Features¶
- compat: answer linopy's v1 convention where the position knows the answer (#236) (facee3f), closes #8
0.0.0-alpha.31 (2026-07-28)¶
Documentation¶
0.0.0-alpha.30 (2026-07-28)¶
Documentation¶
No functional change: this release is alpha.29 plus tests and a paragraph of
docs/ARCHITECTURE.md. The commit subject says perf: and claims a speed-up, which
is wrong — that optimisation shipped in alpha.29 as
#178. #152 was retitled after it
had already been merged and released, too late for the squash subject.
0.0.0-alpha.29 (2026-07-28)¶
Performance¶
0.0.0-alpha.28 (2026-07-28)¶
Bug Fixes¶
0.0.0-alpha.27 (2026-07-28)¶
Bug Fixes¶
0.0.0-alpha.26 (2026-07-27)¶
Documentation¶
0.0.0-alpha.25 (2026-07-27)¶
Performance¶
0.0.0-alpha.24 (2026-07-27)¶
Performance¶
0.0.0-alpha.23 (2026-07-27)¶
Performance¶
0.0.0-alpha.22 (2026-07-27)¶
Performance¶
0.0.0-alpha.21 (2026-07-27)¶
Performance¶
0.0.0-alpha.20 (2026-07-27)¶
Bug Fixes¶
0.0.0-alpha.19 (2026-07-27)¶
Features¶
0.0.0-alpha.18 (2026-07-27)¶
Features¶
0.0.0-alpha.17 (2026-07-27)¶
Features¶
0.0.0-alpha.16 (2026-07-27)¶
Documentation¶
0.0.0-alpha.15 (2026-07-27)¶
⚠ BREAKING CHANGES¶
- documentation only — the suggested alias is now
fk.import farkaswas and remains the actual import.
Chores¶
0.0.0-alpha.14 (2026-07-27)¶
⚠ BREAKING CHANGES¶
Solutionis nowResult;statusreturns the coarse axis (ok) rather than the solver's wording (Optimal) —termination_conditioncarries that, andis_okis what most call sites meant.objectiveisnanandprimal/to_*raiseNoSolutionErrorwhen the solve produced nothing.
Features¶
0.0.0-alpha.13 (2026-07-26)¶
Bug Fixes¶
0.0.0-alpha.12 (2026-07-26)¶
Bug Fixes¶
0.0.0-alpha.11 (2026-07-26)¶
Documentation¶
0.0.0-alpha.10 (2026-07-26)¶
Bug Fixes¶
0.0.0-alpha.9 (2026-07-26)¶
⚠ BREAKING CHANGES¶
- the import path is now
farkas; the compat lane isfarkas.linopyand its extra is[linopy].
Refactoring¶
0.0.0-alpha.8 (2026-07-26)¶
Refactoring¶
0.0.0-alpha.7 (2026-07-26)¶
Refactoring¶
0.0.0-alpha.6 (2026-07-26)¶
Features¶
Refactoring¶
Documentation¶
0.0.0-alpha.5 (2026-07-26)¶
⚠ BREAKING CHANGES¶
- a file declaring more than one objective no longer loads.
- a Series or DataArray whose index names are not the declared dims is now a DataError; previously the names were discarded.
- a dimension declares the coordinates its labels carry (#100)
- every IR, AST and schema class is renamed, and
fk.LanguageErrorno longer covers data-binding failures — those arefk.DataError. Both remain underfk.LinopyYamlError, as does the deprecatedRelationalBuildErroralias.
Features¶
Bug Fixes¶
- a bool parameter is a mask, on both lanes (#47) (#96) (a3f3926)
- a declared coordinate must be its declared dtype (#65) (#101) (5349991)
- a named index binds by name, not by position (#91) (#98) (3e14be8)
- a second objective is a load error, not a silent drop (#49) (#97) (24f5849)
- one place per language rule, and formulations judged like the rest (#99) (3137fbc)
Refactoring¶
- names say what they mean, and errors are one tree (#94) (0c1300c)
- the compat lane is a directory, so the fence is structural (#95) (4015131)
Documentation¶
- consolidate the doc set and cut it by two thirds (#87) (0a89d7d)
- runnable architecture walkthrough, one stage at a time (#54) (0f0910f)
- say plainly that breaking changes land without a deprecation cycle (#102) (6131342)
- split sink capability from the expressive ceiling (#88) (4e58227)
- the composition seam exists, and value-only re-solve has a precondition (#93) (2dffd89)
0.0.0-alpha.4 (2026-07-25)¶
⚠ BREAKING CHANGES¶
- unknown YAML keys are an error, not a silent default (#72)
- sum/roll/shift/group_sum over a dim the operand does not carry, a where dim outside the frame, a bound parameter dim outside foreach, and a constraint whose expression dims differ from its foreach are all load errors. Each previously built a model that solved and was wrong, or larger than the file read as.
Features¶
- Result.to_xarray() — the labelled form, one call away (#75) (7df73b4)
- static dim checking — the type is a set of dim names (#68) (f96bcb4)
Bug Fixes¶
- dim checking runs on both lanes, and binary ops union (#70) (2072cfa)
- read YAML 1.2 booleans, and refuse duplicate keys (#77) (b12af91)
- unknown YAML keys are an error, not a silent default (#72) (909bc4c)
Documentation¶
- an objective totals its dims, so the examples stop pretending otherwise (#74) (f090c8c)
- the axes the expressiveness taxonomy does not rank (#76) (bcfcdee)
0.0.0-alpha.3 (2026-07-25)¶
⚠ BREAKING CHANGES¶
where: "<dimension>"is a load error. It never did anything except in the case where it broke.- an unknown name in a where string is a load error rather than a False mask; parameter-vs-parameter where comparisons are rejected; and names may no longer collide across kinds. Each was a way to build a model that solved and was silently wrong.
- a variable declared without
bounds.lowerwas silently non-negative; it is now unbounded below, matching linopy'sadd_variables(lower=-inf). Models relying on the implicit>= 0must writelower: 0. An LP that was bounded only by that implicit constraint will now report as unbounded.
Bug Fixes¶
- a bare dimension name in a where is a load error (#64) (1a89fef)
- both lanes agree on where-comparisons over dimensions, and on
**(#52) (7bec431) - check() enforces degree 1; README stops promising a fallback (#55) (d0b008c)
Refactoring¶
- cut back the accumulated surface (#56) (1802dd0)
- finish the lane split — where_parser keeps grammar, not evaluation (#59) (a30f7ec)
- let the annotations say what the parsers already guarantee (#61) (49387d4)
- name resolution is a pass, not a backend detail (#62) (8622fa6)
Documentation¶
- cross-language vocabulary map, and a procedure for the ceiling (#63) (7f535cd)
- SPEC catches up with the code it describes (#57) (50edfb6)