Skip to content

Commit fa3610d

Browse files
Merge pull request #738 from SKaiNET-developers/release/0.31.0
chore(release): prepare SKaiNET 0.31.0
2 parents 4b23480 + 5f60288 commit fa3610d

8 files changed

Lines changed: 23 additions & 12 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
## [Unreleased]
44

5+
## [0.31.0] - 2026-06-15
6+
7+
### Fixed
8+
9+
- **`ops.transpose` now lazily handles every packed matmul dtype.** The CPU backend's 2-D transpose rewraps the packed bytes with a flipped shape (a metadata-only "lazy transpose") for the K-series (Q4_K/Q5_K/Q6_K) and Q5_0/Q5_1, but **Q8_0 and Q4_0 fell through to the generic FP32 path**, which cast the Byte-backed buffer to Float and threw `ClassCastException`. Added the `Q8_0TensorData` and `Q4_0TensorData` cases so a packed Q8_0/Q4_0 matmul weight (e.g. a model's tied Q8_0 `lm_head`) survives `linearProject`'s `matmul(x, ops.transpose(W))` and dispatches to its packed kernel instead of crashing — `ops.transpose` now covers the full `chooseQuantizedMatmulHeap` dispatch set (Q4_K/Q5_K/Q6_K/Q5_0/Q5_1/Q8_0/Q4_0). Adds `transpose_preserves_every_packed_quant_type` (commonTest, jvm + linuxX64) as a regression guard. (PR #736, #737)
10+
11+
### Changed
12+
13+
- **Bumped `com.networknt:json-schema-validator` to 3.0.4.** (PR #733)
14+
515
## [0.30.0] - 2026-06-13
616

717
### Added

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Add the core dependencies (Gradle Kotlin DSL):
3636
```kotlin
3737
dependencies {
3838
// Recommended: import the umbrella BOM and drop versions on the engine modules.
39-
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
39+
implementation(platform("sk.ainet:skainet-bom:0.31.0"))
4040

4141
implementation("sk.ainet.core:skainet-lang-core")
4242
implementation("sk.ainet.core:skainet-backend-cpu")
@@ -227,14 +227,15 @@ Runnable examples:
227227

228228
---
229229

230-
## What's New in 0.30.0
230+
## What's New in 0.31.0
231231

232-
- **First-class Q5_K packed in-kernel dequant-matmul** across the CPU backends — a `Q5_KBlockTensorData` packed type and a `Q5KMatmulKernel` SPI with scalar (commonMain / Kotlin-Native), JVM Panama Vector, and native-C implementations, wired into `DefaultCpuOps` matmul dispatch + lazy transpose and the GGUF streaming loader. Q5_K weights now stay packed (no FP32 inflation) and dequantize inside the matmul, like Q4_K/Q6_K.
233-
- **Hand-written ARM NEON kernels** for the native CPU backend (fp32, q8_0, q4k, q5k), guarded by `__ARM_NEON` so x86 keeps its scalar / auto-vectorized path. The native CMake build gains an aarch64 branch (`-march=armv8.2-a+fp16+dotprod`, dotprod for Cortex-A55) plus an opt-in cross-compile.
234-
- **Kotlin/Native consumption of the C kernels via cinterop**`skainet-backend-native-cpu` now also builds a static archive and exposes the kernels to Kotlin/Native (`linuxX64` + `linuxArm64`) through a `KernelProvider`, so on-device (non-JVM) binaries get the same hand-tuned kernels the JVM reaches via FFM. (PR #734)
232+
- **`ops.transpose` lazily handles every packed matmul dtype.** The CPU backend rewraps packed bytes with a flipped shape (metadata-only "lazy transpose") so a packed weight survives `linearProject`'s `matmul(x, transpose(W))` instead of inflating to FP32 — but **Q8_0 and Q4_0** were missing and threw `Byte → Float ClassCastException`. Now the full dispatch set (Q4_K/Q5_K/Q6_K/Q5_0/Q5_1/Q8_0/Q4_0) transposes lazily, so a packed Q8_0/Q4_0 matmul weight (e.g. a tied Q8_0 `lm_head`) stays packed end-to-end on its NEON/SIMD kernel. Regression-tested across all seven packed types. (PRs #736, #737)
233+
- **Dependency:** `com.networknt:json-schema-validator` → 3.0.4. (PR #733)
235234

236235
### Recent releases
237236

237+
- **0.30.0** — First-class **Q5_K packed in-kernel dequant-matmul** across the CPU backends (`Q5_KBlockTensorData` + `Q5KMatmulKernel` SPI: scalar / Panama Vector / native-C), **hand-written ARM NEON kernels** (fp32/q8_0/q4k/q5k, `-march=armv8.2-a+fp16+dotprod`), and **Kotlin/Native consumption of the C kernels via cinterop** (`skainet-backend-native-cpu` static archive + `linuxX64`/`linuxArm64` `KernelProvider`). (PR #734)
238+
238239
- **0.29.1**`sk.ainet.core:skainet-compile-minerva` now publishes to Maven Central (packaging fix for the Minerva export module shipped in 0.29.0).
239240
- **0.29.0****Minerva secure-MCU export module**: an end-to-end pipeline that lowers a SKaiNET model through shared graph-export contracts → Minerva IR → an `.npz` compiler input → a libminerva-packaged secure MCU project bundle, with host-side runtime verification and fingerprinted manifest artifacts (runnable sample, examples, ONNX workflow, getting-started docs). Plus **packed-quant matmul kernels with Kotlin/Native parity** (Q5_0/Q5_1/Q4_K/Q6_K — commonMain scalar + SPI, packed-quant dispatch in `DefaultCpuOpsBase`, Panama Vector for Q5_1/Q5_0 and Q6_K via the `KernelRegistry`), and an **auto-generated, CI-gated kernel × platform support matrix**. (PRs #697#726)
240241
- **0.28.1** — Kotlin DSL → StableHLO → IREE is green end-to-end for the whole conformance suite (7/7 models, 27/27 ops compile to a `vmfb`): `inferDagOutputSpecs` now infers correct output shapes for shape-changing ops, and `reduce_window` (pooling) emits IREE's generic region form. (PRs #674, #676)

docs/modules/ROOT/pages/how-to/io-readers.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Add the following dependencies to your `build.gradle.kts`:
2020
[source,kotlin]
2121
----
2222
dependencies {
23-
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
23+
implementation(platform("sk.ainet:skainet-bom:0.31.0"))
2424
2525
implementation("sk.ainet.core:skainet-io-gguf")
2626
implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.8.2")
@@ -32,7 +32,7 @@ dependencies {
3232
[source,kotlin]
3333
----
3434
dependencies {
35-
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
35+
implementation(platform("sk.ainet:skainet-bom:0.31.0"))
3636
3737
implementation("sk.ainet.core:skainet-io-onnx")
3838
implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.8.2")

docs/modules/ROOT/pages/how-to/minerva-export.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ For a published application, use the SKaiNET BOM and the Minerva artifact:
3838
[source,kotlin]
3939
----
4040
dependencies {
41-
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
41+
implementation(platform("sk.ainet:skainet-bom:0.31.0"))
4242
implementation("sk.ainet.core:skainet-compile-minerva")
4343
}
4444
----

docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
= Kernel × platform support matrix
22
:description: Which compute-kernel provider serves each weight format on each KMP target.
33

4-
Generated from `kernel-support.json` (version `0.30.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh.
4+
Generated from `kernel-support.json` (version `0.31.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh.
55

66
Each cell is the best (highest-priority) provider that serves `Float32 × format` `matmul` on that platform: *native-ffm* (100) → *panama-vector* (50) → *scalar* (0). An empty cell (`—`) means no provider carries a kernel there (the format is dequant-to-FP32 only).
77

docs/modules/ROOT/pages/tutorials/image-data-getting-started.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ For a JVM project, add the image/data modules alongside the CPU backend:
3232
[source,kotlin]
3333
----
3434
dependencies {
35-
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
35+
implementation(platform("sk.ainet:skainet-bom:0.31.0"))
3636
3737
implementation("sk.ainet:skainet-backend-cpu-jvm")
3838
implementation("sk.ainet:skainet-io-image-jvm")

docs/modules/ROOT/pages/tutorials/java-getting-started.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ repositories {
144144
145145
dependencies {
146146
// Import BOM for version alignment
147-
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
147+
implementation(platform("sk.ainet:skainet-bom:0.31.0"))
148148
149149
// Core tensor library
150150
implementation("sk.ainet:skainet-lang-core-jvm")

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
GROUP=sk.ainet.core
2-
VERSION_NAME=0.30.0
2+
VERSION_NAME=0.31.0
33
POM_DESCRIPTION=SKaiNET
44

55
POM_URL=https://github.com/SKaiNET-developers/skainet/

0 commit comments

Comments
 (0)