diff --git a/CHANGELOG.md b/CHANGELOG.md index bf7e0fe7..a84b7548 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,18 @@ ## [Unreleased] -Headline: **model-specific detector code leaves core; the reusable detection pieces stay.** +## [0.62.1] - 2026-10-21 + +Headline: **the native Q8_0 / Q4_0 / Q5_0 / Q5_1 kernel bindings no longer zero the earlier rows of a +multi-row product** (#1436, see *Fixed*). The defect was in the JVM FFM lane since those bindings exist: a +single-row product (a decode step) was right, every multi-row one kept only its last row, which made any +quantize-at-load encoder on the JVM with `skainet-backend-native-cpu` on the classpath — Laya on Q8_0 — answer +with uniform probabilities. CI never saw it because its classpath has no native provider; the LayaMoE example +did. Fix releases carry what develop holds: also the YOLO move-out below, the StableHLO softmax axis fixes, the +*Flexibility at every compile stage* explanation page (#1432) and the SKEEP-008 draft, *Precision and encoding +conversion* (#1434, tracking #1433). + +Also in this release: **model-specific detector code leaves core; the reusable detection pieces stay.** ### Added diff --git a/CITATION.cff b/CITATION.cff index 38d5ceb5..a4feb7f4 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -12,7 +12,7 @@ authors: orcid: https://orcid.org/0009-0006-7981-4075 - name: SKaiNET-developers contributors website: https://github.com/SKaiNET-developers -version: "0.62.0" +version: "0.62.1" date-released: "2026-10-21" license: MIT repository-code: https://github.com/SKaiNET-developers/SKaiNET diff --git a/README.md b/README.md index d56d0b0d..aee13349 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Add the core dependencies (Gradle Kotlin DSL): ```kotlin dependencies { // Recommended: import the umbrella BOM and drop versions on the engine modules. - implementation(platform("sk.ainet:skainet-bom:0.62.0")) + implementation(platform("sk.ainet:skainet-bom:0.62.1")) implementation("sk.ainet.core:skainet-lang-core") implementation("sk.ainet.core:skainet-backend-cpu") @@ -308,7 +308,18 @@ val withoutLabel = dataPipeline() --- -## What's New in 0.62.0 +## What's New in 0.62.1 + +A fix release on top of 0.62.0: the native FFM bindings of the Q8_0, Q4_0, Q5_0 and Q5_1 kernels +copied a zero-filled staging buffer back from index 0, so a product served row by row — any +quantize-at-load encoder on the JVM with `skainet-backend-native-cpu` on the classpath — kept only +its last row. Single-row decode steps were never affected. A regression test now covers every packed +format for one, seven and fifty rows. Also: the YOLOv8 model code moves out of core into its cartridge +blueprint (`skainet-model-yolo` is gone; `Letterbox`, `BoundingBox` and `nonMaxSuppression` stay in +`skainet-data-media`), the StableHLO `softmax` axis and `logSoftmax` lowering are fixed, and the docs +gain *Flexibility at every compile stage* and the SKEEP-008 draft on precision and encoding conversion. + +### Carried from 0.62.0 JVM ↔ Kotlin/Wasm parity: the browser tier runs the same kernels as the JVM, keeps its activations in the sidecar, and reads models the way the JVM does — with every remaining difference documented. @@ -359,6 +370,12 @@ We love contributions! Whether it's a new operator, documentation, or a bug fix: Browse the full codebase documentation on [DeepWiki](https://deepwiki.com/SKaiNET-developers/SKaiNET). +### Contributors (0.62.1) + +- **Michal Harakal** ([@michalharakal](https://github.com/michalharakal)) — the native packed-kernel + binding fix and its regression test, the YOLO move-out, the compile-flexibility explanation, the + SKEEP-008 draft, and the release + ### Contributors (0.62.0) - **Michal Harakal** ([@michalharakal](https://github.com/michalharakal)) — the JVM ↔ wasm parity @@ -478,7 +495,7 @@ from it). Ready-to-paste BibTeX: author = {Harakal, Michal and {SKaiNET-developers contributors}}, title = {{SKaiNET}: A {Kotlin} Multiplatform {AI} Framework}, year = {2026}, - note = {Version 0.62.0. MIT License}, + note = {Version 0.62.1. MIT License}, howpublished = {\url{https://github.com/SKaiNET-developers/SKaiNET}} } ``` diff --git a/docs/antora.yml b/docs/antora.yml index 3cad2f3d..fb8e53fc 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -15,7 +15,7 @@ asciidoc: framework_name: SKaiNET # Current SKaiNET release — bump once per release; referenced as # {skainet_version} in dependency snippets (blocks need subs="attributes+"). - skainet_version: 0.62.0 + skainet_version: 0.62.1 ksp_version: 2.2.21-2.0.5 dokka_version: 2.1.0 asciidoctorj_version: 3.0.0 diff --git a/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc b/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc index 1ffa6a83..69caf002 100644 --- a/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc +++ b/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc @@ -1,7 +1,7 @@ = Kernel × platform support matrix :description: Which compute-kernel provider serves each weight format on each KMP target. -Generated from `kernel-support.json` (version `0.62.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh. +Generated from `kernel-support.json` (version `0.62.1`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh. Each cell is the best (highest-priority) provider that serves `Float32 × format` `matmul` on that platform: *native-ffm* / *native-jni* / *native-cinterop* (100) → *panama-vector* / *wasm-simd128* (50) → *scalar* (0). An empty cell (`—`) means no provider carries a kernel there (the format is dequant-to-FP32 only). The JS/WASM column assumes `WasmSimd.install()` has run; without the sidecar it is the scalar floor. diff --git a/docs/modules/ROOT/pages/reference/operators/generated/index.adoc b/docs/modules/ROOT/pages/reference/operators/generated/index.adoc index df8efd5d..968a07fc 100644 --- a/docs/modules/ROOT/pages/reference/operators/generated/index.adoc +++ b/docs/modules/ROOT/pages/reference/operators/generated/index.adoc @@ -1,6 +1,6 @@ = AI-NET Operators Reference -Generated from version `0.62.0` on 2026-10-21 +Generated from version `0.62.1` on 2026-10-21 == Operators by Modality diff --git a/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc b/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc index 109fc20a..4070ea4f 100644 --- a/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc +++ b/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc @@ -1,7 +1,7 @@ = Operator Coverage Matrix :description: Cross-backend status for every operator function in SKaiNET. -Generated from `operators.json` version `0.62.0` on 2026-10-21. +Generated from `operators.json` version `0.62.1` on 2026-10-21. Rows are `Operator.function` pairs. A gap is marked in source with `@NotImplemented(reason = …, issue = …)` (or `@InProgress`) and shows up here as ❌ (or 🚧) linked to its tracking issue; the PR that closes the gap removes the annotation. See xref:contributing/issue-taxonomy.adoc[Issue taxonomy] to pick one up. diff --git a/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc b/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc index 7b47e107..59cc6fc7 100644 --- a/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc +++ b/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc @@ -19,12 +19,12 @@ An Android project with Kotlin. Add the SKaiNET modules: [source,kotlin] ---- dependencies { - implementation("sk.ainet.core:skainet-lang-core:0.62.0") // tensors, DSL, training - implementation("sk.ainet.core:skainet-backend-cpu:0.62.0") // CPU ops - implementation("sk.ainet.core:skainet-compile-dag:0.62.0") // autograd (training context) - implementation("sk.ainet.core:skainet-data-api:0.62.0") // Dataset / DataBatch - implementation("sk.ainet.core:skainet-data-simple:0.62.0") // embedded Iris - runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu:0.62.0") // NEON kernels (see below) + implementation("sk.ainet.core:skainet-lang-core:0.62.1") // tensors, DSL, training + implementation("sk.ainet.core:skainet-backend-cpu:0.62.1") // CPU ops + implementation("sk.ainet.core:skainet-compile-dag:0.62.1") // autograd (training context) + implementation("sk.ainet.core:skainet-data-api:0.62.1") // Dataset / DataBatch + implementation("sk.ainet.core:skainet-data-simple:0.62.1") // embedded Iris + runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu:0.62.1") // NEON kernels (see below) } ---- diff --git a/gradle.properties b/gradle.properties index 1abd57e4..eb32112b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=sk.ainet.core -VERSION_NAME=0.62.0 +VERSION_NAME=0.62.1 POM_DESCRIPTION=SKaiNET POM_URL=https://github.com/SKaiNET-developers/skainet/