Changelog#
Written by release-please from
the conventional-commit subjects that land on main — see RELEASING.md. Do not
edit it by hand; the next release overwrites what you wrote.
New releases are inserted directly below this paragraph, so nothing may sit
between it and the first ## heading. The Keep a Changelog skeleton that used
to live here — a hand-maintained ## Unreleased block, and a comment
documenting the heading format — is what broke 0.0.0-alpha.1: that comment
contained a literal ## [X.Y.Z] heading, release-please inserts above the first
## it finds, and so the entire release landed inside the comment and rendered
nowhere.
0.0.0-alpha.70 (2026-09-02)#
Documentation#
0.0.0-alpha.69 (2026-09-02)#
Bug Fixes#
Refactoring#
- the expression parser is package-private, and the parsed tree is named apart from the program's (#342) (55ff525)
0.0.0-alpha.68 (2026-09-02)#
Documentation#
- language: the rules binding obeys belong to the language, not to whichever engine reads the data (#242) (c05da6a)
0.0.0-alpha.67 (2026-09-02)#
Refactoring#
- a built-in's one positional argument is stated once, and a degree question names the tree it walks (#364) (556af30)
- every rule two passes shared has one home, and a docstring says what a caller needs rather than why (#363) (f24ddd3)
- model: each cross-declaration rule is one method, so a refusal names the rule that raised it (#369) (b25a602)
- piecewise: one block expands itself, holding its names, frame and mask once (#367) (537eadf)
- resolution is one method per node kind, and each operator's dim rule is one function (#368) (c7c2833)
- typesetting: the legend reads what the equations returned rather than state left on the walk (#366) (db96a54)
0.0.0-alpha.66 (2026-09-01)#
Performance#
0.0.0-alpha.65 (2026-09-01)#
Refactoring#
- language: a translation policy and a bound's side name the values they can be, rather than being a string (#354) (d212157)
- typesetting: a format spells the operators the language names, rather than any string a walk happens to ask for (#352) (12b4041)
0.0.0-alpha.64 (2026-09-01)#
Features#
- parser: a refused where string names the rewrite for pandas and C connective habits (#346) (3dbd9b2)
0.0.0-alpha.63 (2026-09-01)#
Refactoring#
- language: an operator, a declaration kind and a notation name the values they can be, rather than being a string (#345) (3f3f858)
0.0.0-alpha.62 (2026-09-01)#
Bug Fixes#
- language: a declaration named what no expression could write is refused, rather than loading unreferenceable (#340) (b865bc1)
0.0.0-alpha.61 (2026-09-01)#
Performance#
0.0.0-alpha.60 (2026-09-01)#
Bug Fixes#
- language: the language reference states which case arms are refused, and the refusal says what actually breaks (#336) (01920d1)
0.0.0-alpha.59 (2026-09-01)#
Bug Fixes#
0.0.0-alpha.58 (2026-09-01)#
Features#
- program: a resolved where is a first-class Mask whose leaves carry their dims, and the where grammar is package-private (#327) (53cc352)
0.0.0-alpha.57 (2026-09-01)#
Bug Fixes#
- program: a program describes a mathematical program rather than being one, and claims neither linearity nor a storage format (#315) (5dfa6be)
0.0.0-alpha.56 (2026-09-01)#
Features#
- program: the conjuncts of a where mask are the program's to give, not each consumer's to re-derive (#313) (db63d3c)
0.0.0-alpha.55 (2026-08-31)#
Documentation#
- ceiling: load-time unit checking has its own refusal, where the data-prep row used to answer for it (#272) (8dfd17d)
0.0.0-alpha.54 (2026-08-31)#
Documentation#
- drop the effects row from the PyPSA-1.3.0 parity table, a feature that release does not have (#305) (92e5ed8)
0.0.0-alpha.53 (2026-08-31)#
Documentation#
- a link's delivery lags its flow, wrapping or losing what is in transit at the horizon's edge (#300) (1d4f10f)
0.0.0-alpha.52 (2026-08-31)#
Documentation#
- examples: the PyPSA file states a constraint once where PyPSA builds one row set, rather than a block per regime (#257) (#292) (c35e637)
0.0.0-alpha.51 (2026-08-31)#
Features#
- a named expression may give a value per region, and no two regions may claim one coordinate (#168) (e12e7da)
0.0.0-alpha.50 (2026-08-31)#
Documentation#
0.0.0-alpha.49 (2026-08-31)#
Features#
Bug Fixes#
- examples: a committable modular unit that is not extendable gets the rows PyPSA builds for it (#271) (5af0ac8)
0.0.0-alpha.48 (2026-08-31)#
Features#
- language: which dims a mask reads is the language's answer, so two consumers cannot restrict one model differently (#269) (350b1ed)
0.0.0-alpha.47 (2026-08-28)#
Documentation#
0.0.0-alpha.46 (2026-08-28)#
Features#
- program: a piecewise assumption names the data it is about, and a derived parameter says how it is filled (#237) (48431b1)
0.0.0-alpha.45 (2026-08-28)#
Bug Fixes#
- language: a negative edge fill prints, the sign of a literal amount being folded once at resolution (#234) (d9303db)
0.0.0-alpha.44 (2026-08-28)#
Bug Fixes#
- language: a where mask is folded at resolution, so a typeset page and a program agree about it (#232) (553bda0)
0.0.0-alpha.43 (2026-08-28)#
Features#
- program: a parameter says which piecewise block derived it, and a label space keeps its dtype (#227) (515dbd5)
- program: a piecewise block is kept as facts — its breakpoints, its mask, and what it assumes of the data (#228) (2fdbd6f)
0.0.0-alpha.42 (2026-08-28)#
Bug Fixes#
- language: a negative sum_back width is refused at load rather than asserting in lowering (#223) (62e52eb), closes #222
0.0.0-alpha.41 (2026-08-28)#
Bug Fixes#
- language: a boolean literal in a where is decided at load wherever it stands (#216) (fab308f), closes #214
0.0.0-alpha.40 (2026-08-28)#
Refactoring#
- program: the declaration vocabularies have one home, so a program cannot spell one differently from the file (#219) (f7596d7), closes #209
0.0.0-alpha.39 (2026-08-28)#
Bug Fixes#
- advice: a model handed over as a program is advised of everything a file is (#217) (4fc50e6), closes #210
0.0.0-alpha.38 (2026-08-28)#
Features#
Bug Fixes#
- a file the language accepts is one every consumer can build, the edge rules being decided at load (#211) (a362ff0)
- program: a where mask cannot be rewritten under another consumer (#197) (ce406b0)
- program: an unknown dimension is refused rather than answered empty (#199) (96fdccf)
- program: every expression node answers fan_in (#202) (f5cc67d)
Refactoring#
- program: a program is built by keyword, so a new field cannot reorder an old call (#203) (214394a)
- program: a program's declarations are keyed by the name the file wrote (#205) (579264a)
- program: drop the two pieces of the program API nothing reaches (#204) (ca25fa5)
- program: expressions are the ones a row is built from, and the declared ones say so (#206) (81aaddd)
- program: the program module says what it promises, rather than offering its whole namespace (#208) (08d2f64)
0.0.0-alpha.37 (2026-08-28)#
Features#
- a model is checked from the shell, advice included, with no consumer installed (#192) (941126c)
- advice carries which pass said it and which declaration it is about, so a consumer can filter rather than parse (#195) (89408f6)
Refactoring#
0.0.0-alpha.36 (2026-08-28)#
Refactoring#
- a program is trusted by construction, so the language's rules are checked once, on the spec (#189) (45931b1)
0.0.0-alpha.35 (2026-08-28)#
Documentation#
0.0.0-alpha.34 (2026-08-28)#
Refactoring#
- two public states and a conversion to each, where the surface was seventy-seven names (#180) (718e2de)
0.0.0-alpha.33 (2026-08-28)#
Features#
- the notes a check prints are reachable, so a consumer surfaces them rather than re-deriving them (#184) (19ef814)
0.0.0-alpha.32 (2026-08-28)#
Features#
0.0.0-alpha.31 (2026-08-28)#
Documentation#
0.0.0-alpha.30 (2026-08-28)#
Documentation#
0.0.0-alpha.29 (2026-08-27)#
Features#
- language: dimension members and lookup maps come from the data, rather than from the file (#169) (f3c4e5f)
0.0.0-alpha.28 (2026-08-27)#
Bug Fixes#
0.0.0-alpha.27 (2026-08-27)#
Bug Fixes#
- the linearized rung states its three caps as rows and starts one unit cold, so every block it declares is built (#162) (cb4863f)
0.0.0-alpha.26 (2026-08-27)#
Features#
0.0.0-alpha.25 (2026-08-27)#
Features#
- rung 11 — PyPSA's ac-dc-meshed example, whole (#151) (a133044)
- rung 12 — linearized unit commitment, a file of its own (#152) (69b926e)
- rung 13 — transmission losses in tangent form, a file of its own (#153) (379ce23)
- rung 14 — two-stage stochastic with CVaR, a file of its own (#154) (41b427d)
- rung 15 — investment periods with a growth limit, a file of its own (#155) (285aac3)
0.0.0-alpha.24 (2026-08-26)#
Features#
- PyPSA in one file — every rung stated, shown beside its data, and solved to the same objective on both lanes (#122) (46544e3)
0.0.0-alpha.23 (2026-08-26)#
Bug Fixes#
- docs: the homepage feature cards render as cards rather than as loose rules and paragraphs (#145) (b88e5dc)
0.0.0-alpha.22 (2026-08-26)#
Features#
0.0.0-alpha.21 (2026-08-26)#
Documentation#
0.0.0-alpha.20 (2026-08-26)#
Documentation#
0.0.0-alpha.19 (2026-08-26)#
Bug Fixes#
0.0.0-alpha.18 (2026-08-26)#
Refactoring#
- parser: one number rule, one amount table, and a namespace nothing builds by hand (#106) (f775a07)
- schema: one wording for an undeclared dimension, and the front door validates once (#105) (69e42db)
- the stack's own additions say less and repeat nothing (#102) (119e588)
- typeset: Markdown is LaTeX's math with its own document layer, and a step merges itself (#107) (1ca9178)
0.0.0-alpha.17 (2026-08-25)#
Bug Fixes#
- language: a link takes any affine expression, an uncalled template hides no typo, and degree is decided at load (#91) (a653056)
- parser: a negation is over a power, a keyword is given once, and an amount is a number or a name (#88) (4bf994c)
- schema: every refusal of a malformed file is a SchemaError, and an empty declared map survives a round trip (#89) (ee07736)
- schema: two literal bounds that cross are refused at load (#97) (30589ba)
- typeset: a sum under its own dimension takes a fresh index, and prose escapes its markup (#92) (20c7076)
Refactoring#
0.0.0-alpha.16 (2026-08-25)#
Refactoring#
0.0.0-alpha.15 (2026-08-25)#
Documentation#
0.0.0-alpha.14 (2026-08-25)#
Documentation#
0.0.0-alpha.13 (2026-08-25)#
Bug Fixes#
0.0.0-alpha.12 (2026-08-25)#
Documentation#
0.0.0-alpha.11 (2026-08-25)#
Bug Fixes#
- enforce the two rules a named offset or width was always said to obey (#61) (5bd92dc), closes #58
- let sum_back stop at each group's edge, as its checks already assumed (#65) (cb58e88)
- refuse a negated named amount, and one read where there is no coordinate (#63) (15d9c25), closes #62
0.0.0-alpha.10 (2026-08-24)#
Features#
Refactoring#
- name the groups a pass asks about, and spell each operator once (#52) (e35c46c)
- the package is
typesetting, the function staystypeset(#54) (a1d9599)