Changelog¶
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)