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.2.1 (2026-09-29)¶
This release fixes three wrong answers. None of them raised an error. A model that meets one builds a different row, or reads a different value, in 0.2.1. No file, archive or import breaks.
- A sum over a variable with a
where:, beside a parameter over fewer dimensions, such assum(y + w, over=f)withwoverfalone. The parameter now drops out where the variable is absent, in the constraint row and inevaluate. Before, it stayed in, so the row had a wrong right-hand side. - A divisor, a power's base or an exponent that is a
sum(...). It is now taken as its total, in a build and in a read. Before, it was taken summand by summand. - A reported quotient whose divisor is absent or zero. It now has no value at
that coordinate. Before, it read
infor raised aDataError.
Result.dual now states the sign of a dual: the rate at which the optimal
objective rises with the row's right side, for every comparator, under either
sense and on every solver. No value changes. mathspec's reference now defines
dual(c) the same way
(energy-models/mathspec#751).
The pull requests since 0.2.0:
- fix(engine): a sum leaves out a parameter where a variable added to it is absent, in the model and in a read (#1784)
- fix(engine): a divisor, a power's base or an exponent that is a sum is taken as its total rather than summand by summand (#1779)
- fix(api): a reported quotient is absent where its divisor is absent or zero (#1776)
- docs(api): a dual is the rate at which the optimal objective rises with its row's right side, on every sink (#1774)
0.2.0 (2026-09-25)¶
A saved answer now records which layout it was written in and which specsolve wrote it, so a later release can name an answer it no longer reads. The Python API reference is now rendered from the docstrings.
This release breaks one thing:
- An answer or an archive that 0.1.0 or earlier wrote is refused with a
LayoutErrorthat says to solve the model again and save it. Itsformat.jsonreads{"answer": 0}; 0.2.0 writes{"layout": 1, "specsolve": "0.2.0"}. An archive still holds the spec and the data it was solved with, underspec.yamlandsources/.
The pull requests since 0.1.0:
- feat(api)!: a saved answer is stamped with layout 1 and the specsolve version that wrote it, and one written by 0.1.0 or earlier is refused by name (#1765)
- docs: each fact about the Python API is stated once, in the docstring of the name it belongs to (#1769)
- docs: the Python API page renders every public name from its docstring (#1766)
- docs(sweeps): the sweep reference says how many sessions a sweep opens on a remote Gurobi (#1771)
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)