Skip to content

Releases

yamaa v0.8.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 21:35
8bac2a6

yamaa 0.8.0

Choose your download

Python

Install from PyPI with python -m pip install yamaa==0.8.0. pip selects a compatible wheel. Building the source package requires Rust and a C compiler.

R

Choose a binary for your operating system and R series; binaries need no Rust or Rtools. The source package requires compilation. See the R installation instructions.

CLI

Unzip the archive for your operating system and architecture, then run yamaa (yamaa.exe on Windows). No Python, R or Rust installation is needed.

Developer resources

Grammars and conformance cases for language implementers.

0.8.0 adds calculated history through backward row reads and improves execution
of large datasets with column operations and concurrent partitions. The
specification language remains 1.0. Like 0.7.0, this release precedes the
stability contract that starts at yamaa 1.0.0; the saved-output change is
listed under Upgrading. The
0.7.0 notes
cover the previous release.

After publication, 0.8.0 is available on GitHub and PyPI. It is not submitted
to CRAN; R users install the source package or a binary from the GitHub release.

Install

Install the Python package from PyPI with python -m pip install yamaa (#3030
D57). The wheels cover CPython 3.12 to 3.15 on Linux x86_64 and aarch64 with
glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip builds the
source archive, which needs Rust 1.82 or later and a C compiler. Each GitHub
release carries the same Python files, and also R binary packages for Windows
x64 and macOS arm64, for R 4.6 and R 4.5, which install without Rust, Rtools or
a network; the R source package, for Linux and any other R from 4.2.0; and the
standalone yamaa command line for Linux, Windows and macOS, which needs no
Python, R or Rust and ships unsigned (#3030 D52). Install the R package from
the GitHub release. The
Python
and
R
package pages give the commands, Supported platforms
lists every platform, and Installing in a restricted
environment

covers machines without internet access.

Supported platforms

Each cell names the CPython or R series that native qualification installs and
tests the package with, the oldest glibc a Linux wheel needs, or the Rust
target of the command-line binary; no means the release has no such package.

Platform Python wheel Python source archive R source package R binary package Command-line binary
Linux x86_64 CPython 3.12 to 3.15 on glibc 2.28 or later CPython 3.12 to 3.15 R 4.2 or later no x86_64-unknown-linux-musl
Linux aarch64 CPython 3.12 to 3.15 on glibc 2.28 or later CPython 3.12 to 3.15 R 4.6 no aarch64-unknown-linux-musl
macOS arm64 CPython 3.12 to 3.15 CPython 3.12 to 3.15 R 4.2 or later R 4.5 and 4.6 aarch64-apple-darwin
Windows x64 CPython 3.12 to 3.15 CPython 3.12 to 3.15 R 4.2 or later R 4.5 and 4.6 x86_64-pc-windows-msvc
  • The Linux wheels are manylinux_2_28, for RHEL 8, Ubuntu 20.04, Debian 10
    or later; older systems build the Python source archive.
  • The source packages carry their crates and build offline with Rust 1.82 or
    later, Cargo and a C compiler. For an offline Python build, first install
    maturin==1.9.6 from carried files, then run
    python -m pip install --no-index --no-build-isolation --no-deps ./yamaa-0.8.0.tar.gz.
    A Windows R build needs the Rtools of its R series and the
    x86_64-pc-windows-gnu target.
  • Each R binary package serves one R series, R-release or R-oldrel
    (#3030 D48), and installs without Rust, Rtools or a network; the macOS
    ones need macOS 11. Other R series and Linux use the R source package.
  • The command-line binaries are static on Linux (musl) and Windows, need
    macOS 11 on macOS, and ship unsigned (#3030 D52).
  • macOS x86_64, free-threaded Python and the Python and R packages on musl
    systems such as Alpine Linux are not supported (#3030 D49).

Saved files are qualified with these readers at these minimums, which the
Python test extra and the R package's Suggests declare: Polars 1.35.2
(2.0.0 on CPython 3.15) and PyArrow 23.0.1 (26.0.0 on CPython 3.15) for CSV
and Parquet; R arrow 23.0.1 for CSV and Parquet; Python's standard library and
R jsonlite 2.0.0, with bigint_as_char = TRUE, for Dataset-JSON 1.1; and lxml
6.1.3 for Define-XML 2.1.

Upgrading

  • Break: Parquet output bytes change; values do not. Saved Parquet files
    use Zstandard compression and dictionary encoding, with row groups of
    131,072 rows; fields, row order, nulls and values are preserved, including
    every floating-point bit (PARQUET-4, #4198).

Changes

  • Calculated values can use earlier calculated rows. Strictly backward
    row_value reads can carry calculated history through causal column groups
    in one independently ordered window. Current-row dependencies remain
    acyclic; the stored, converted and handled value, including a missing value,
    is what later rows read. The dosing-weight benchmark demonstrates this
    without a project function (WINDOW-12, #4233, #4234, #4236).
  • Partitioned runs can read other inputs through lookups. A CSV or Parquet
    driver can be read by partition while the other inputs are read whole for
    keyed lookups, qualified source reads or intermediates without derivations.
    The row and cell limits then bound each driver partition, allowing a driver
    beyond 10,000,000 records when its operations stay within partitions
    (LIMIT-3, #4203).
  • The hosts and command line expose a thread limit. Every Python and R
    call that takes progress also takes threads; the check, run and
    submission commands take --threads N. The default is the fewer of four
    and the cores the process may use; one requests serial execution. A project
    builds independent specifications concurrently, and specifications and
    partitions share that limit. Output, diagnostics, reports and progress-event
    order are preserved; concurrent work delivers its events when the partition
    or specification finishes (#4206, #4216, #4226).
  • Column operations and shared grouping reduce repeated work. Source
    copying, expressions, filters, row construction, joins, aggregates, windows,
    output access and report serialization operate on typed columns and reuse
    grouping or lookup results. Partitioned execution checks and publishes
    partitions in order without merging their rows into one frame (#4194,
    #4197, #4202, #4204, #4205, #4215, #4221, #4224, #4225, #4229, #4231, #4232).
  • Parquet reading and writing use the run's threads. Inputs decode into
    typed columns and retain the first scanned partition for reuse. Driver
    row-group scans and output row-group encoding share the configured worker
    limit (#4207, #4222, #4235).
  • Selecting one project specification avoids preparing every listing.
    A listing whose own file writes its domain is named from that file alone;
    selecting it by name prepares the selected specification (#4217).
  • Host packages negotiate boundary version 9. The native calls group
    engine settings together and refuse mixed host/native builds (#4223).

Known issues

The command-line binaries are unsigned and not notarized. The YAML reader
remains a vendored copy of saphyr-parser 0.2.1 with reviewed fixes (#3969),
as described in the
0.7.0 notes.

Qualified native arti...

Read more

yamaa v0.7.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 12:47
c039509

yamaa 0.7.0

Choose your download

Python

Install from PyPI with python -m pip install yamaa==0.7.0. pip selects a compatible wheel. Building the source package requires Rust and a C compiler.

R

Choose a binary for your operating system and R series; binaries need no Rust or Rtools. The source package requires compilation. See the R installation instructions.

CLI

Unzip the archive for your operating system and architecture, then run yamaa (yamaa.exe on Windows). No Python, R or Rust installation is needed.

Developer resources

Grammars and conformance cases for language implementers.

0.7.0 comes between 0.6.x and 1.0.0. It fixes defects, settles the interface
questions that 1.0.0 would otherwise freeze as they stand, and adds features;
1.0.0 follows it and the feedback on it (#4064 D294). Like 0.6.x, 0.7.0 is
outside the stability contract, which starts at 1.0.0 (#3030 D1), so it breaks
some 0.6.x files and calls, and each break has one line under
Upgrading. The 0.6.0
notes

describe the 1.0 interface that 0.6 releases for testing and every change up to
0.6.0, and the
0.6.1
and 0.6.2
notes

the patches since. Report what you find through the issue
forms
: the 0.6/0.7
feedback form for what you tried and how the interface felt, the bug report for
a defect.

Install

Install the Python package from PyPI with python -m pip install yamaa (#3030
D57). The wheels cover CPython 3.12 to 3.15 on Linux x86_64 and aarch64 with
glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip builds the
source archive, which needs Rust 1.82 or later and a C compiler. Each GitHub
release carries the same Python files, and also R binary packages for Windows
x64 and macOS arm64, for R 4.6 and R 4.5, which install without Rust, Rtools or
a network; the R source package, for Linux and any other R from 4.2.0; and the
standalone yamaa command line for Linux, Windows and macOS, which needs no
Python, R or Rust and ships unsigned (#3030 D52). Install the R package from
the GitHub release. The
Python
and
R
package pages give the commands, Supported platforms
lists every platform, and Installing in a restricted
environment

covers machines without internet access.

Supported platforms

Each cell names the CPython or R series that native qualification installs and
tests the package with, the oldest glibc a Linux wheel needs, or the Rust
target of the command-line binary; no means the release has no such package.

Platform Python wheel Python source archive R source package R binary package Command-line binary
Linux x86_64 CPython 3.12 to 3.15 on glibc 2.28 or later CPython 3.12 to 3.15 R 4.2 or later no x86_64-unknown-linux-musl
Linux aarch64 CPython 3.12 to 3.15 on glibc 2.28 or later CPython 3.12 to 3.15 R 4.6 no aarch64-unknown-linux-musl
macOS arm64 CPython 3.12 to 3.15 CPython 3.12 to 3.15 R 4.2 or later R 4.5 and 4.6 aarch64-apple-darwin
Windows x64 CPython 3.12 to 3.15 CPython 3.12 to 3.15 R 4.2 or later R 4.5 and 4.6 x86_64-pc-windows-msvc
  • The Linux wheels are manylinux_2_28, for RHEL 8, Ubuntu 20.04, Debian 10
    or later; older systems build the Python source archive.
  • The source packages carry their crates and build offline with Rust 1.82 or
    later, Cargo and a C compiler; an offline Python build needs maturin
    installed (pip install --no-build-isolation --no-index), and a Windows R
    build the Rtools of its R series and the x86_64-pc-windows-gnu target.
  • Each R binary package serves one R series, R-release or R-oldrel
    (#3030 D48), and installs without Rust, Rtools or a network; the macOS
    ones need macOS 11. Other R series and Linux use the R source package.
  • The command-line binaries are static on Linux (musl) and Windows, need
    macOS 11 on macOS, and ship unsigned (#3030 D52).
  • macOS x86_64, free-threaded Python and the Python and R packages on musl
    systems such as Alpine Linux are not supported (#3030 D49).

Saved files are qualified with these readers at these minimums, which the
Python test extra and the R package's Suggests declare: Polars 1.35.2
(2.0.0 on CPython 3.15) and PyArrow 23.0.1 (26.0.0 on CPython 3.15) for CSV
and Parquet; R arrow 23.0.1 for CSV and Parquet; Python's standard library and
R jsonlite 2.0.0, with bigint_as_char = TRUE, for Dataset-JSON 1.1; and lxml
6.1.3 for Define-XML 2.1.

Known issues

The known issues of 0.6.0
still apply: the command-line binaries are unsigned and not notarized, and
the YAML reader is a vendored copy of saphyr-parser 0.2.1 with reviewed
fixes (#3969).

zstd advisories in 0.6.2 and earlier. Those releases link zstd 0.13.3 and
zstd-safe 7.3.0, which RUSTSEC-2026-0391 and RUSTSEC-2026-0395 to 0406 name; this
release links zstd 0.14.3 and zstd-safe 8.2.0, which fix them. yamaa decodes a
ZSTD Parquet page with a new DCtx and its one-shot DCtx::decompress alone,
with no dictionary and no stream. Every advisory but RUSTSEC-2026-0400 names
functions that yamaa does not call, and RUSTSEC-2026-0400, which names
DCtx::decompress, needs a stream left open on the same context and a
dictionary, so the earlier releases are not known to be exposed (#4066).

Changes since 0.6.2

Each change since 0.6.2 that users can observe has one line below.
Upgrading comes first, then the other changes by area: the
language, inputs, submission metadata, diagnostics, files and saving, the
lint and the command line, the packages and platforms, and the Rust facade.

Upgrading

Each change that breaks a file, call or saved output that works with 0.6.2
has one line here, starting with Break, which says what to change. The
other lines are steps an upgrade needs although nothing broke. A file that
0.6.2 already refuses may now report another diagnostic: code that matches
diagnostics finds each such change, with the diagnostic it replaces, under
Diagnostics and Submission metadata.

  • Break: lint returns a result. Read result.findings in Python or
    result$findings in R; status fails while findings remain, paths lists
    rewritten files, and printing gives the summary (#4064 D300, #4078).

  • Break: invalid ODM limits carry a diagnostic. Catch the package refusal
    for negative, fractional, Boolean and missing limits, and read
    value_not_permitted at the argument in its issues table (#4064 D299,
    #4077).

  • Break: operation, state and argument refusals share one error hierarchy.
    Update Python handlers that catch RuntimeError, TypeError or
    NotImplementedError from yamaa calls to catch yamaa.Error or its
    StateError subclass, and R handlers to catch yamaa_error or its
    yamaa_state_error subclass (#4077).

  • Break: a refusal always carries an issues table. Handle an empty R data
    frame instead of NULL issues, including for conversion failures and calls
    before negotiation (reverses D258, #4077).

  • Break: a Submission section declares a transport. Composing Define-XML
    under context: Submission, the default, now fails with
    missing_required_field at ...

Read more

yamaa v0.6.2

Choose a tag to compare

@github-actions github-actions released this 26 Oct 09:44
7aaa79b

yamaa 0.6.2

yamaa 0.6.2 fixes the build of the R source package on Windows with Rust
1.86 to 1.95, among them the Rust that CRAN's Windows machines use, and is
the release submitted to CRAN after that build failed CRAN's checks of
0.6.1. Its interface is 0.6.0's: the language, the Python, R and
command-line calls, the diagnostics and the saved files are unchanged, so
upgrading from 0.6.0 or 0.6.1 needs no change. A change that CRAN asks for
after a release moves every host to the same patch version, so the Python
packages and the command line are 0.6.2 too, and the 0.6.1 GitHub release
stays as published (#3030 D51).

The 0.6.0 notes
describe the 1.0 interface that 0.6 releases for testing, the break from
0.5.0 and every change up to 0.6.0, and the
0.6.1 notes
the changes in 0.6.1. Like 0.6.0, 0.6.2 is outside the stability contract,
which starts at 1.0.0 (#3673 D289). Report what you find through the
issue forms: the
0.6.0 feedback form, which covers 0.6.2, for what you tried and how the
interface felt, the bug report for a defect.

Install

Install the Python package from PyPI with python -m pip install yamaa
(#3030 D57). The wheels cover CPython 3.12 and later on Linux x86_64 and
aarch64 with glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip
builds the source archive, which needs Rust 1.82 or later and a C compiler.
Each GitHub release carries the same Python files, and also R binary packages
for Windows x64 and macOS arm64, for R 4.6 and R 4.5, which install without
Rust, Rtools or a network; the R source package, for Linux and any other R
from 4.2.0; and the standalone yamaa command line for Linux, Windows and
macOS, which needs no Python, R or Rust and ships unsigned (#3030 D52). The R
source package also goes to CRAN, and once CRAN accepts it,
install.packages("yamaa") installs it from there (#3673 D289). The
Python
and R
package pages give the commands,
Supported platforms
lists every platform, and
Installing in a restricted environment
covers machines without internet access.

Known issues

The known issues of 0.6.0
still apply: the command-line binaries are unsigned and not notarized, and
the YAML reader is a vendored copy of saphyr-parser 0.2.1 with reviewed
fixes.

Changes since 0.6.1

Packages

  • On Windows, the R source package builds with Rust 1.86 to 1.95. Their
    standard library for x86_64-pc-windows-gnu carries an empty split-DWARF
    member, *.rcgu.dwo, in each of its archives, and the Rust static library
    that R links bundles them. The build removes the static library's export
    directives with GNU objcopy, which refuses a member without sections, so
    the installation stopped there. The build now deletes those empty members
    first (#4012). Rust 1.82 to 1.85 and 1.96 onward ship none and were not
    affected, nor were the R binary packages.

Qualified native artifacts

Native qualification run: https://github.com/elong0527/yamaa/actions/runs/40293890522/attempts/1.

  • native-python-ubuntu-24.04-3.14 (artifact 12637836913)
  • native-python-macos-15-3.14 (artifact 12637602500)
  • native-python-windows-2025-3.14 (artifact 12637732565)
  • native-python-ubuntu-24.04-arm-3.14 (artifact 12637177936)
  • native-r-ubuntu-24.04 (artifact 12637318158)
  • native-r-binary-macos-15-4.6.1 (artifact 12639196332)
  • native-r-binary-macos-15-4.5.3 (artifact 12638946583)
  • native-r-binary-windows-2025-4.6.1 (artifact 12638587956)
  • native-r-binary-windows-2025-4.5.3 (artifact 12639071974)
  • native-cli-x86_64-unknown-linux-musl (artifact 12636783724)
  • native-cli-aarch64-apple-darwin (artifact 12637257840)
  • native-cli-x86_64-pc-windows-msvc (artifact 12637113057)
  • native-cli-aarch64-unknown-linux-musl (artifact 12637127744)
  • native-conformance-ubuntu-24.04 (artifact 12637302225)

yamaa v0.6.1

Choose a tag to compare

@github-actions github-actions released this 26 Oct 03:25
65de8da

yamaa 0.6.1

yamaa 0.6.1 fixes the build of the R source package on Windows with a Rust
toolchain for the GNU host, which CRAN's Windows machines use, and is the
first release submitted to CRAN after that build failed CRAN's checks of
0.6.0. Its interface is 0.6.0's: the language, the Python, R and
command-line calls, the diagnostics and the saved files are unchanged, so
upgrading from 0.6.0 needs no change. A change that CRAN asks for after a
release moves every host to the same patch version, so the Python packages
and the command line are 0.6.1 too, and the 0.6.0 GitHub release stays as
published (#3030 D51).

The 0.6.0 notes
describe the 1.0 interface that 0.6 releases for testing, the break from
0.5.0 and every change up to 0.6.0. Like 0.6.0, 0.6.1 is outside the
stability contract, which starts at 1.0.0 (#3673 D289). Report what you find
through the issue forms:
the 0.6.0 feedback form, which covers 0.6.1, for what you tried and how the
interface felt, the bug report for a defect.

Install

Install the Python package from PyPI with python -m pip install yamaa
(#3030 D57). The wheels cover CPython 3.12 and later on Linux x86_64 and
aarch64 with glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip
builds the source archive, which needs Rust 1.82 or later and a C compiler.
Each GitHub release carries the same Python files, and also R binary packages
for Windows x64 and macOS arm64, for R 4.6 and R 4.5, which install without
Rust, Rtools or a network; the R source package, for Linux and any other R
from 4.2.0; and the standalone yamaa command line for Linux, Windows and
macOS, which needs no Python, R or Rust and ships unsigned (#3030 D52). The R
source package also goes to CRAN, and once CRAN accepts it,
install.packages("yamaa") installs it from there (#3673 D289). The
Python
and R
package pages give the commands,
Supported platforms
lists every platform, and
Installing in a restricted environment
covers machines without internet access.

Known issues

The known issues of 0.6.0
still apply: the command-line binaries are unsigned and not notarized, and
the YAML reader is a vendored copy of saphyr-parser 0.2.1 with reviewed
fixes.

Changes since 0.6.0

Packages

  • On Windows, the R source package builds with a Rust toolchain for the GNU
    host, x86_64-pc-windows-gnu, as CRAN's Windows machines have it. Its
    Makevars gave Cargo R's C compiler command as the linker, and R's Windows
    CC ends in a space, so Cargo found no linker gcc for the build scripts
    and procedural macros that it links on that host. It now gives Cargo the
    compiler's program alone (#4005). A toolchain for the MSVC host with the
    GNU target added, as rustup target add x86_64-pc-windows-gnu sets it up,
    links them with MSVC's linker and was not affected, nor were the R binary
    packages.
  • Native qualification's CRAN checks on Windows build the R source package
    with the minimum Rust for the GNU host, as CRAN's Windows check does
    (#4006).

Qualified native artifacts

Native qualification run: https://github.com/elong0527/yamaa/actions/runs/40256761575/attempts/1.

  • native-python-ubuntu-24.04-3.14 (artifact 12623196732)
  • native-python-macos-15-3.14 (artifact 12623261173)
  • native-python-windows-2025-3.14 (artifact 12622772969)
  • native-python-ubuntu-24.04-arm-3.14 (artifact 12623385651)
  • native-r-ubuntu-24.04 (artifact 12623366351)
  • native-r-binary-macos-15-4.6.1 (artifact 12624486597)
  • native-r-binary-macos-15-4.5.3 (artifact 12624601685)
  • native-r-binary-windows-2025-4.6.1 (artifact 12624636029)
  • native-r-binary-windows-2025-4.5.3 (artifact 12623812871)
  • native-cli-x86_64-unknown-linux-musl (artifact 12623236226)
  • native-cli-aarch64-apple-darwin (artifact 12622278640)
  • native-cli-x86_64-pc-windows-msvc (artifact 12623395757)
  • native-cli-aarch64-unknown-linux-musl (artifact 12622647832)
  • native-conformance-ubuntu-24.04 (artifact 12622986669)

yamaa v0.6.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 00:38
bba2e23

yamaa 0.6.0

yamaa 0.6.0 is the 1.0 interface, released for you to test before it
freezes: the language that specification files declare as yamaa: "1.0",
the Python, R and command-line calls, the diagnostics and the saved files
that 1.0.0 is planned to keep. The freeze starts at 1.0.0, so 0.6.0 is
outside the stability contract and 1.0.0 may still change what your
feedback shows is wrong, as Stability says (#3030 D1, D20,
#3673 D289). Report what you find through the
issue forms: the 0.6.0
feedback form for what you tried and how the interface felt, the bug report
for a defect.

0.6.0 breaks with 0.5.0, so read The break from 0.5.0
before you upgrade.

The break from 0.5.0

Every file written for 0.5.0 must be rewritten. A 1.0 file starts with
yamaa: "1.0" and type:, and some fields and values are spelled
differently, but the language still means what it meant: a rewritten
specification builds the datasets that 0.5.0 built, apart from the changes
that this section and Changes since 0.5.0 list.
Python's tables and lint, the issues table, some condition names and the Rust
facade change too.

The approved rename table lists every changed spelling:
tools/migrate/renames.yaml
at the 0.6.0 tag. For every field, keyword and enumerated value of the 0.5.0
schemas it gives the 1.0 spelling, or the reason the item was removed, and it
lists the fields that 1.0 adds and the conditions, diagnostic paths and
issues-table columns that change (#3030 D27, D58). There is no migration
guide and no converter for users (#3030 D35): rewrite each file with the
table. The converter that moved this repository's own files was internal,
shipped in no package and left the repository before 0.6.0 (#3443).

Files

  • Header. Every file starts with yamaa: "1.0", the oldest language
    version that it needs, quoted, and type:, one of spec, project,
    codelists and function, in place of schema_version (SCHEMA-2,
    #3030 D4).
  • Functions. A project function is one type: function file, listed in
    the project's functions, with each host's callable under
    implementations. The project's environments holds each host's lock, as
    python: {lock: uv.lock}, and the two environment files are gone (#3030
    D8).
  • Expressions. An expression field takes one grammar: a bare name reads a
    variable, text is quoted, as in derivation: "'DM'", and a YAML number or
    Boolean is a literal, so literal, compute and the string form of
    source are gone. YAML null is the missing value, and a child layer
    clears an inherited field by listing its path under clear:, not by
    setting it to null. Value fields, such as handlers, dict values and cut
    labels, keep bare text (#3030 D18, D31).
  • Inheritance. A child that restates an inherited input,
    intermediates or rows member, or a named window, merges with it as in
    0.5.0: a mapping key by key, so an entry the child leaves out comes back
    from the parent. Listing the mapping in clear beside it, as
    clear: [rows.scores.derivations], replaces it instead, and the lint
    reports a restatement that leaves entries out as partial_restatement
    (LAYER-6, LAYER-8, LAYER-9, #3689).
  • Fragments. A layer lists reusable spec fragments under include:. At
    each layer its parent chain contributes first, then its fragments in list
    order, then its own fields, so one fragment file serves every template that
    lists it. A fragment names neither parent nor include
    (prohibited_construct), an include that leads back to a layer still
    being composed is an inheritance_cycle, and a file reached twice in one
    composition fails as the new duplicate_layer (LAYER-3, LAYER-4, #3688).
    check(parent = ), and yamaa check PATH --parent PATH, check a fragment
    as if a template you name were its parent, as it would compose in a file
    that names the template as its parent, includes the fragment and writes
    nothing else, so a fragment is checked before any file lists it; a
    parent given for a file that declares parent or include is refused as
    value_not_permitted at parent (LAYER-4, #3694).
  • Lookups. A named intermediate declares its key, unless it drives a
    row template, and an implicit join, or a qualified aggregate without its
    own key, matches on the key that its input declares instead of on
    same-named columns. absent answers only a lookup that finds no record: a
    read of a variable that does not exist fails as unknown_field (#3030
    D23, D63, D67).
  • CDISC metadata. A project section lists standards, and a column or
    value-level entry lists origins, as Define-XML allows several. A
    specification with submission metadata names its model, SDTM, SEND
    or ADaM, and a copy entry takes columns from a producer linked through
    schema, with the type and label that the producer declares and a
    Predecessor origin (#3030 D16, D19, D25, D70).
  • Renamed fields. Some operands, handlers and bindings are renamed, such
    as study_day's date to source, an intermediate's no_match to
    absent, an aggregate's derive list to a derivations map, diff's
    bounds to closed, and a project section's datasets to transport,
    with json spelled dataset_json (#3030 D58).
  • A specification alone. A specification checked or run without its
    project file fails validation at each codelist and inventory vocabulary
    that it binds and each project function that it calls; 0.5.0 skipped or
    deferred those checks (CT-13, #3030 D32).

Python, R and diagnostics

  • Python tables. Every table is a yamaa.Table, which implements the
    Arrow PyCapsule stream interface and converts with to_polars(),
    to_pandas(), to_arrow() or to_pylist(). The package has no runtime
    dependencies, so install Polars, pandas or PyArrow to convert to their
    tables; to_pandas() keeps each column's Arrow type (#3030 D11, D43, D190).
    R's tables stay data frames.
  • Saving. save() returns the paths that it wrote, and a refused save's
    yamaa.Error, or R's yamaa_error condition, carries paths (#3030 D38,
    D69).
  • Status and printing. Every result has a status: succeeded,
    failed, or skipped for a project run's specification whose producer did
    not complete. A result, and a specification or project object, prints the
    summary that the engine renders, the same words in both hosts and on the
    command line: Python's repr() returns it, and R's format() returns its
    lines and print() writes them, where R printed a bare environment (#3030
    D36, D37, D103, #3401).
  • Engine information. yamaa.info() and R's yamaa_info() return the
    engine version, the language versions that it reads, its features, the
    host, the host's version and the platform, as a dict or a named list: the
    record that a selftest's info holds and that yamaa --version prints.
    __version__ and packageVersion("yamaa") stay the package versions
    (#3030 D41, #3404).
  • Project names and creation time. A project's names lists its
    specifications in the order that a run of every section builds them,
    without reading study data, and a submission's created gives the creation
    time that its documents carry: the one given, or the time it read once for
    every section (#3030 D45, D69, D129, D180, #3405).
  • R names and length. names() of an R result lists its fields and
    methods, starting with status, where it listed its hidden handle, and
    length() counts them; a project run's names() are its specifications'
    names. Python's len() of a project run counts them too (#3030 D44,
    #3406).
  • Lint. yamaa.lint() and R's yamaa_lint() replace
    python -m yamaa.style and the Python package's style extra, and a
    suppression comment is spelled # yamaa-lint: allow (#3030 D40, D58).
  • Issues. The issues table has twelve columns, in a new order that begins
    with severity. rule replaces requirement and cites a rule card, such as
    CHECK-7, as the run report's RULE column now does, instead of a
    REQ-NNNN ID; severity, file, line, column and message are new
    (#3030 D28, D59).
  • Conditions and paths. Four conditions are renamed, such as
    schema_version_mismatch to unsupported_language_version, seven retire,
    and new ones arrive, such as project_binding_missing. Spec paths follow the
    renamed fields and name a row template or an intermediate by its id, as
    in intermediates.<id> instead of intermediates[0]. The rename table's
    conditions and paths blocks list these (#3030 D58, D69), and the changes
    below name each refusal that now reports a more specific condition, path or
    context key.

The Rust facade

The yamaa crate, the Rust facade that both packages and the command line
call, changes throughout. Its public items, which
rust/crates/yamaa/public-api.txt
lists, freeze at 1.0.0. It keeps the 1.0 use cases and removes the pre-1.0
entry points: a specification's and a project's operations are requests that
Engine::spec(path) and Engine::project(path) return, every operation fails
with one Failure, the crate root re-exports only what configures an engine
or comes back from one, and the two host ports move under yamaa::host.
Rust facade below names each change (#3030 D22, D192, #3415,
#3765, #3766).

Install

Install the Python package from PyPI with python -m pip install yamaa
(#3030 D57). The wheels cover CPython 3.12 and lat...

Read more

yamaa v0.5.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 22:02
75dd278

yamaa 0.5.0

yamaa 0.5.0 runs every specification on one executor over a resolved plan
(rewrite 1), consolidates the rules and the language, and redesigns the
Python and R interface around a specification and a project
(yamaa.spec() and yamaa.project(); yamaa_spec() and yamaa_project()
in R). It is published on PyPI and as GitHub release assets ahead of the 1.0.0
release candidates (#3030 D1, amended for 0.5.0 on #2848), which may still
change the interface. Most 0.4.0 specifications and every 0.4.0 Python and R call need
changes: read Migration before you upgrade.

Install

Install the Python package from PyPI:

python -m pip install --upgrade yamaa==0.5.0

The GitHub release tagged yamaa-v0.5.0 also provides one Python wheel each
for Linux x86_64 and aarch64, macOS arm64 and Windows x64, the Python source
archive yamaa-0.5.0.tar.gz and the R source package yamaa_0.5.0.tar.gz.
The owner requested the PyPI upload on 2026-10-20, updating the earlier
GitHub-only plan on #2848.
PyPI serves this release's five Python packages unchanged. CRAN receives
1.0.0 only.

python -m pip install ./yamaa-0.5.0-<wheel-tags>.whl
python -m pip install ./yamaa-0.5.0.tar.gz   # Python source build
install.packages("yamaa_0.5.0.tar.gz", repos = NULL, type = "source")

The Linux wheels are manylinux_2_28 and need glibc 2.28 or later, for
example RHEL 8, Ubuntu 20.04 or Debian 10, instead of manylinux_2_34 and
glibc 2.34; older systems build from yamaa-0.5.0.tar.gz. Each is built in
the manylinux_2_28 container of its architecture, and native qualification
runs the conformance corpus on AlmaLinux 8. A Linux aarch64 wheel joins the
x86_64 one (#3030 D49).

Source packages

  • The installed R package carries only the test inputs that its installed
    suites read, so it is about 5 MB smaller on Linux and its source tarball
    about 1 MB smaller (#2937). It leaves out inputs that only the Python suites
    or no suite read, including four of its five copies of the Python packaging
    lock. Each third-party SAS test file now has its license beside it.
  • The R source package builds offline, as CRAN's policy for packages that
    use Rust asks (#3058). It carries the locked crates.io crates in
    src/rust/vendor.tar.xz, with the script that wrote it, and builds them
    with cargo build --offline -j 2 and a Cargo home inside the build tree, so
    installation needs no network, runs at most two jobs and writes nothing to
    the user's Cargo home. The tarball grows by about 11 MB. inst/AUTHORS
    names the authors and license of every bundled crate, and DESCRIPTION
    credits them and the authors of the bundled ReadStat sources as
    contributors and copyright holders.
  • The R package's configure finds Cargo and rustc on the PATH or in
    ~/.cargo/bin, requires both to be at least the workspace's
    rust-version, 1.82, instead of checking rustc alone, and reports them
    before compiling; it stops with installation advice otherwise and never
    lets rustup install a toolchain. Cargo keeps to two jobs under a parallel
    make too (#3058).
  • The R build uses the caller's default Rust toolchain, 1.82 or later, and
    reports its version first; rustup no longer selects or installs Rust 1.99.1
    from the bundled rust-toolchain.toml. DESCRIPTION states
    SystemRequirements in CRAN's wording, and GNU make is no longer required.
    The toolchain file no longer lists Clippy or rustfmt.
  • Native qualification installs the Linux-built Python and R source archives,
    the ones a release publishes, on macOS and Windows as well, instead of
    archives built on each host.

License notices

  • LICENSE-THIRD-PARTY.txt also carries the notices of the Rust standard
    library that the native extension links (#3009). It reproduces the notice
    that Rust 1.99.1 ships as share/doc/rust/COPYRIGHT-library.html: the
    licenses and copyright holders of the standard library's own files, with
    their license texts, and each out-of-tree crate with its notice texts.
  • The packages also link zlib-rs, the GZIP backend that Parquet 55 selects,
    under the Zlib license, so the notices accept Zlib and the Python
    License-Expression adds Zlib (#3111).
  • The alloc-stdlib entry names Dropbox's BSD-3-Clause license, which its
    repository ships in alloc-no-stdlib. It no longer names the canonical text
    with its placeholders unfilled.

Supported platforms and dependencies

  • The Python runtime requires only Polars and packaging; the style checker
    requires the style extra, and independent readers live in the test extra.
  • CPython 3.15 joins the supported interpreters, with wheels and source builds
    on Linux x86_64, macOS arm64 and Windows x64. The supported range is CPython
    3.12 through 3.15.
  • On CPython 3.15, three Python dependency floors move to the oldest releases
    that work there: Polars 2.0.0, PyArrow 26.0.0 and Pydantic 2.14.0 (#2871).
    CPython 3.12 to 3.14 keep Polars 1.35.2, PyArrow 23.0.1 and Pydantic 2.12.4.
  • The lxml floor rises from 6.1.0 to 6.1.3 on every supported interpreter
    (#2943). lxml 6.1.3 stops loading external parameter entities by default,
    and 6.1.1 patched the libxslt that its Linux wheels bundle. yamaa's ODM
    reader was not exposed, and it no longer uses lxml: it moved into the Rust
    engine, which refuses a DOCTYPE, resolves only the five predefined entities
    and never reaches the network (#2967).
  • Source builds now need Rust 1.82 or later, instead of 1.90 (#3111).
  • Release builds use Rust 1.99.1. CI checks and lints the workspace with the
    minimum, Rust 1.82.0, and builds and checks the R source package with it:
    Rust 1.82.0 was released on 2024-10-17, so on any submission date it is at
    least the two-year-old cargo that CRAN asks packages using Rust to test
    with. The engine uses edition 2021 and the newest releases that build with
    Rust 1.82: Arrow and Parquet 55.2.0 instead of 57.3.0, PyO3 0.27, toml 1.0
    and quick-xml 0.41.
  • The R package supports R 4.4.0 and later instead of 4.6.1 (#3030 D13): the
    binding calls only R C API entry points that R 4.4 provides, and the package
    passes R CMD check on R 4.4 (#3058).
  • R no longer suggests nanoarrow: results are plain data.frames, so the
    nanoarrow 0.8.0 floor for Arrow views is gone (#2967).

Language consolidation

0.5.0 carries the rules consolidation and language simplification that were
developed for a separate 1.0.0 line (#2855). The contracts are rewritten as
short rule cards under the principles that rules/README.md lists, and the
language keeps one way to state each thing. Most 0.4.0 specifications
need edits before they validate:

  • Some results move without an error. A missing value sorts lowest, so it
    comes first in an ascending order unless the order term declares nulls.
    One rounding, the SAS-compatible near-tie rule, serves the rounding
    operation and CSV display precision, and int and float compare exactly.
    An imputation bound outside the collected month or year is ignored.
  • Many 0.4.0 spellings fail validation, each with a named condition:
    parents (a specification has one parent), the retired define.yaml
    route, the date_* and datetime_* verbs (now diff, shift, impute
    and precision with a declared type), previous_non_missing (now
    locf), str_concat (now str_template), and a declaration that repeats
    another, such as allowed_values beside a bound codelist or a unique
    check on the keys.
  • One expression grammar serves predicates, compute and aggregate,
    and every expression has one declared result type. Regular expressions use
    a portable subset without lookaround or backreferences, matched in linear
    time.
  • Declared metadata is enforced when a specification runs. A mandatory
    column holds no missing value, and a bound codelist that lists its items
    limits the column's values even when the list is extensible.
  • A missing single input or an absent record gives missing by default,
    counted like a declared handler; require_match: true states where a
    missing match must stop the run.
  • Every lookup runs one model of four steps (LOOKUP-25): an implicit
    join, a named intermediate and a qualified aggregate match their keys and
    range, narrow the matched records by their filter, select one record or
    reduce them, and answer absence. A filter is asked only about records whose
    keys match, so a filter that would fail on a record no row matches no
    longer stops the run. A named intermediate that verifies a unique
    combination, or drives a row template, still asks its filter about every
    record, since it reads every record the filter keeps. A key value whose
    type cannot compare with its match value fails as incompatible_input_type
    for every kind, even on a record the filter would remove: an implicit join
    or an aggregate matched nothing before, and a named intermediate's filter
    hid the record, so a run that succeeded can now fail. In the order the
    model fixes, an aggregate evaluates its range value with its match values
    before any record is matched, even for a row whose missing key value
    matches nothing: a named intermediate that the range value reads is
    selected for that row too, its missing record counted at the aggregate's
    between, or failing the run when the intermediate declares
    require_match. A structured source: binding takes between, as a named
    intermediate and an aggregate do. On a row that a named intermediate
    drives, a range value qualified by the intermediate reads the record that
    built the row; a field the intermediate derives is not supported there yet
    and fails as unsupported_operation. An aggregate's empty key fails as
    invalid_field_type, as a named intermediate's does.
  • An input schema link types a stored artifact only. A s...
Read more

yamaa v0.4.0

Choose a tag to compare

@github-actions github-actions released this 18 Oct 08:39

yamaa 0.4.0

yamaa 0.4.0 is a fresh release with breaking changes. Python and R now run one
shared Rust engine for specification admission, execution, verification,
Define documents and explicit Save. Read Migration before you
upgrade.

Install

0.4.0 is distributed only as assets of the GitHub release tagged
yamaa-v0.4.0: one Python wheel per supported OS, the Python source archive
yamaa-0.4.0.tar.gz and the R source archive yamaa_0.4.0.tar.gz. These
GitHub assets do not establish PyPI publication. CRAN, r-universe and R binary
packages are later work.

python -m pip install ./yamaa-0.4.0-<wheel-tags>.whl
python -m pip install ./yamaa-0.4.0.tar.gz   # Python source build
install.packages("yamaa_0.4.0.tar.gz", repos = NULL, type = "source")

The Linux wheel is manylinux_2_34 and needs glibc 2.34 or later, for example
RHEL 9, Ubuntu 22.04 or Debian 12; older systems build from
yamaa-0.4.0.tar.gz. Each wheel is the exact artifact tested on every
supported interpreter for its OS. The attached source archives are the ones
tested on Linux; native CI also qualifies source builds on macOS and Windows
from each host's own archive.

Source builds need Rust 1.90.0 with Cargo, a C compiler and GNU make. They
download the locked Rust crates from crates.io, and pip's build isolation
fetches maturin, so an offline build needs a pre-filled Cargo cache. Windows
R builds also need Rtools45 and the GNU target on the pinned toolchain:
rustup toolchain install 1.90.0 --target x86_64-pc-windows-gnu. The bundled
rust-toolchain.toml forces Rust 1.90.0, so a target added to another
toolchain is not used. R needs no Python runtime.

The yamaa project on PyPI holds only the outdated 0.1.0, so
pip install yamaa installs a stale API; install 0.4.0 from the release
assets (#2932). R has no ODM XML reader in 0.4.0: convert ODM with Python's
yamaa.write_odm_parquet and read the Parquet file in R (#2933).

Every package carries the project's MIT license as LICENSE.txt. It also
carries LICENSE-THIRD-PARTY.txt, with the license, copyright and NOTICE texts
of every third-party Rust crate in the locked build graph, alongside the
ReadStat, Unicode and YAML parser notices. Wheels keep these files in
yamaa-0.4.0.dist-info/licenses/, the Python source archive keeps them at its
root, and the R package installs them from inst/. The wheels link Apache-2.0
Arrow, Parquet, FlatBuffers and Thrift crates and BSD-3-Clause compression
crates, so the Python license expression is
MIT AND Apache-2.0 AND BSD-3-Clause AND Unicode-3.0 (#2926).

Supported platforms and dependencies

  • CPython 3.12, 3.13 and 3.14 on Linux x86_64, macOS arm64 and Windows x64.
  • R 4.6.1 source builds on the same three hosts.
  • Free-threaded Python, musl and R binary packages are not supported.

Python requires Polars 1.35.2 or later and PyArrow 23.0.1 or later. The
minimum independent readers of saved artifacts are:

Reader Minimum
Python Polars 1.35.2
Python PyArrow 23.0.1
Python lxml 6.1.0
R arrow 23.0.1
R jsonlite 2.0.0
R nanoarrow (Arrow views) 0.8.0

Both packages build the Rust workspace with Rust 1.90.0 and the canonical
Cargo.lock, including Arrow and Parquet 57.3.0, libm 0.2.16 and the vendored
saphyr-parser 0.2.1 with its reviewed compact-flow patch. Arrow and Parquet
are pinned to exactly 57.3.0, with brotli 8.0.4 and lz4_flex 0.13.1 floors, so
an embedder whose Rust graph holds Arrow 57.3 builds the engine unchanged
(#2831, #2832). Saved Parquet records only type-defined column orders, which
Polars 1.35.2 and later read (#2833). The
release guide
has the complete platform, reader and dependency statements.

Language

Every specification is pruned

Every specification is composed and pruned before name and reference
validation, whether or not it declares parents. A file without parents is
a composition of one layer. Pruning removes the input, intermediates and
columns entries that cannot affect the artifact or a declared assertion. An
unresolved reference reachable from a root still fails; one inside a removed
declaration is discarded with it. parents: [] no longer affects pruning.
Any parents field, even an empty one, still orders resolved columns by
dependency
(REQ-0643).
Rules:
REQ-0614,
REQ-0638 to REQ-0641
and
REQ-0060
(#2761).

str_replace

str_replace replaces every match of a portable regular expression with
literal text:

derivation:
  str_replace:
    source: AE.AETERM
    pattern: '\s+'
    replacement: " "
  • The scan is global and runs left to right; matches never overlap.
  • replacement is literal text: $1, $&, backslashes and braces are copied
    as written.
  • After an empty match, the scan copies the next character unchanged and
    continues after it: pattern x* with replacement - turns ab into
    -a-b-.
  • A source with no match is returned unchanged, and an empty result is the
    empty string, never missing. A missing source returns the declared
    missing value.

Rules:
REQ-1318 to REQ-1322
(#2776).

date_impute.not_after

date_impute accepts not_after, the upper bound that mirrors not_before.
A bound moves only the components that imputation supplied, and a complete
source date is returned unchanged. A completed date after the bound becomes
the latest day the collected month or year allows on or before the bound.
When no such day exists, the result is missing and no handler runs. Both
bounds may be declared together. Rules:
REQ-1323 to REQ-1325
(#2781).

Datetimes recorded to the hour or minute

datetime_impute and datetime_precision read source text recorded to the
hour (2025-03-04T08) or the minute (2025-03-04T08:30), as ISO 8601
reduced precision allows. datetime_precision returns D, H, M or S
for a source collected to the day, hour, minute or second, so a case on it
derives the ADaM *TMF flag. datetime_impute keeps every collected field
and supplies only the missing ones: first supplies 00, and last
supplies 23, 59 and 59. Converting or ingesting text as a datetime
column is unchanged: T08:30 still names second zero and T08 is still not
a datetime. Rules:
REQ-1326 to REQ-1329
(#2818).

Row defaults are promoted per template

A row default is promoted only for the row templates that need it. A
candidate that a template filter suppresses never reads a lookup it does not
need, so it no longer fails as unmatched_key
(REQ-1264)
(#2762).

One limit remains. When the templates that still need a column read
different drivers, the column is bound against the whole dataset rather than
against each template's own driver. A derivation in one of those templates
that reads a stored field only its own driver supplies can still fail key
validation. #2829 tracks removing this limit in 0.5.0.

check reports formula findings

For a specification without rows, check now reports three findings that
domain reports at validation, without reading inputs: a formula that reads
a column declared later (forward_reference,
REQ-0071),
a qualified name that is not a declared record lookup
(REQ-0442),
and a cycle among formulas
(REQ-0072).
Findings that need the inputs or come from other derivation kinds are still
reported by domain only (#2796).

A qualified between.value names the row's driver

A between.value written as INPUT.FIELD, in a named intermediate or in an
aggregate, reads the record of the input that drives the row being matched:
the root base without row templates, or the row template's dataset. Inside
another intermediate's derivations, the reading intermediate's dataset
supplies it. Any other input fails validation as unknown_field at that
between.value. This also applies when the intermediate is reached through
another between.value or an aggregate's derive step. The value is never
read through the implicit join.

Earlier, an intermediate compared a different field of the driver record, and
an aggregate read the named input at the driver's record positions. Both gave
wrong values with no message. check reports the refusal for an aggregate;
for an intermediate, domain reports it (#2951). A row template driven by a
secondary input can now read its own driver in a between.value or a
correlated filter
(REQ-0121,
REQ-0472)
(#2888, #2904, #2925).

SAS records deleted in place are refused

...

Read more

yamaa v0.3.0

Choose a tag to compare

@elong0527 elong0527 released this 11 Oct 15:52
845a91f

yamaa v0.3.0 anchors Harbor benchmark runs to a fixed source snapshot.

Tag: yamaa-py-0.3.0
Source commit: 845a91ff9ba4ab6599efbd79fafe1c4e1dd14255

Build benchmark tasks from a clean checkout of this tag:

git fetch origin tag yamaa-py-0.3.0
git switch --detach yamaa-py-0.3.0

Follow the Harbor setup and run instructions at this release. Each task records the full source commit. Compared runs must use this same commit, grading protocol 4, and the same agent/verifier image references for their language.

  • Includes full, conventions, and brief prompt tiers, each with 136 R, 136 Python, and 134 opensas cases: 1,218 tasks across nine language/tier combinations.
  • Adds the opensas track with the pinned opensas v0.6.6 runtime and retained upstream notices. Investigator comments, randomization, and age quality remain excluded from that track.
  • Uses separate R, Python, and opensas agent/verifier image pairs, with default references yamaa-harbor-agent-<language>:0.8 and yamaa-harbor-verifier-<language>:0.8. Build each pair once and reuse its artifact references for a comparison; shared runs should use immutable versioned references as described in the setup instructions.
  • Enforces the required language throughout each task and independently verifies trajectories, outputs, held-out inputs, and changed-input derivations.
  • Retains benchmark reference edge-case corrections and prepares both Python and R yamaa package metadata at version 0.3.0.
  • Extends shared Rust producer/project results, declarative temporal and rounding behavior, and submission metadata generation. Source packages retain the locked Rust workspace and exclude generated Python caches.

Validation for this snapshot: benchmark SDK version pins and the declared API inventory checks passed; all nine benchmark task/configuration groups were generated locally with the source commit above. Benchmark task generation does not establish completed runtime evaluation. Native migration and installed-package qualification remain tracked in the release-readiness register; CI for this source commit was still pending when this release was prepared.

Full changes: yamaa-py-0.2.0...yamaa-py-0.3.0.

yamaa v0.2.0

Choose a tag to compare

@elong0527 elong0527 released this 02 Oct 23:43
bc97ce5

Second release of the yamaa Python engine, 593 commits after v0.1.0.

Highlights since v0.1.0:

  • Harbor agent-evaluation framework: executable benchmark tasks with
    oracle and no-op smoke checks, held-out and changed-input reruns,
    and per-benchmark leaderboards
  • Harbor prompt tiers for every SDTM/ADaM benchmark (full, conventions,
    brief) via evaluations/harbor/brief.py
  • Terminology validation and submission generation/validation
  • Continued engine, schema, and verification-language work across the
    python package

Full diff: yamaa-py-0.1.0...yamaa-py-0.2.0

yamaa v0.1.0

Choose a tag to compare

@elong0527 elong0527 released this 13 Sep 00:43
51df19c

initial release