Repository navigation
v1.0.6
[1.0.6] - 2026-09-05
Changed
-
The bundled and validated wirelog ref moves from
v0.54.0to
v0.60.0at peeled SHA
300f3e5150095c85331b561f1f42d99c27b4746f. -
The minimum compatible runtime wirelog version remains
0.52.0.
wirelog 0.60.0 adds 19 exported symbols and removes none, and the
library SONAME is unchanged, so no PyreWire code stops supporting
0.52.0. The PyreWire public API is unchanged; none of the new
symbols is wrapped yet. -
A recursive
min()/max()aggregate that shares an SCC with any
other relation is now refused (wirelog#1021). This is an
engine-level compatibility break that reaches every PyreWire entry
point:optimize()still succeeds, andevaluate()raises
InvalidIRError. Programs that ran on 0.54.0 can stop running here.The refusal is deliberate. Such a consumer reads the aggregate's
per-iteration content -- each round's per-rule output, before that
round's cross-rule domination -- so what it observes is decided by the
engine's evaluation strategy rather than by the program. The shapeLabel(x, min(x)) :- Edge(x, y). Label(y, min(y)) :- Edge(x, y). Label(x, min(l)) :- Label(y, l), Edge(y, x). Big(x) :- Label(x, l), l > 2. Label(x, min(9)) :- Big(x).over
Edge(1,2) (2,3) (3,4)returnedLabelall-1 on 0.54.0 while
still reportingBig(3)andBig(4)-- two nodes said to carry a
label above 2 when no surviving label exceeds 1.The rule is coarse, and upstream says so: programs that answer
correctly today are refused too. The workaround is to break the
feedback edge so the consumer lands in a later stratum -- dropping
Label(x, min(9)) :- Big(x).above yieldsLabelall-1 with an empty
Big. Narrowing the rule is tracked as wirelog#1135.wirelog's own rejection is silent at the default log level, and
wl_plan_from_program()has no error channel (wirelog#1137), so
PyreWire can only surface the genericInvalidIRError; it has no
message naming the relations involved. SetWL_LOG=EVAL:1in the
environment to get the engine's diagnostic on stderr. -
Positive
sidecompound patterns now work in any body-atom
position (wirelog#994). Their generated side-relation joins are
spliced onto the left-deep body chain, so conjunction order no longer
changes the result. A program that compensated for the old
order-dependence may need its body order revisited.
Added
-
Float columns, float literals and the
average()aggregate now
work, delivered by the engine bump. A.declmay declare afloat
column, a fact may carry a float literal, andaverage()over a
floatoperand returns a float. PyreWire needed no change to carry
them: afloatcolumn decodes as a Pythonfloatthrough the
existing result path.-0.0and+0.0canonicalize to the same
+0.0value on ingress, so they collapse to one row.Float values reach a program through its source text only.
EasySession.insert()still carriesint64lanes and raises
ExecErroron a Pythonfloat; wirelog 0.60.0 adds
wirelog_session_insert_typed()for typed ingress, and PyreWire does
not wrap it yet. -
Arithmetic expressions in a rule head (
A + B,A - B,A * B,
A / B,A % B) and multi-line.declcontinuations, also from the
bump. Arithmetic parses left-associatively:A + B * Cmeans
(A + B) * C, not the conventional multiplication-first grouping.
Division truncates toward zero and the remainder keeps the dividend's
sign. -
examples/14_arithmetic_operations.py, a port of wirelog
examples/14-arithmetic-operations, covering both of the above
against wirelog's own golden output. It is skipped on engines older
than 0.60.0, where the whole program is a parse error. -
wirelog 0.60.0 exposes
wirelog_program_relation_has_input(), which
reports whether a relation carries a parsed.inputdirective without
opening its source (wirelog#1070). PyreWire does not wrap it yet.
Fixed
- Engine fixes picked up by the bump, none of them reachable through
PyreWire's surface: a partial NULL guard in the columnar evaluator's
post-eval skip (wirelog#1075, unreachable without editing library
code), out-of-range dependency-graph edges corrupting SCC detection
(wirelog#1083, reachable only by an embedder building the graph by
hand), and arrangement row counts overflowing their hash-table sizes
(wirelog#1074, needs more than 2^30 rows in one arrangement).