From 59dcda1e592828537aa2293718af94796d907caf Mon Sep 17 00:00:00 2001 From: Jeran Date: Wed, 22 Jul 2026 15:02:32 +0200 Subject: [PATCH] Vibecoded shape agnostic function --- src/components/zarr/GetArray.ts | 2 +- src/components/zarr/utils.ts | 63 +++++++++++++++++---------------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/components/zarr/GetArray.ts b/src/components/zarr/GetArray.ts index 0bee8ac0..98404c63 100644 --- a/src/components/zarr/GetArray.ts +++ b/src/components/zarr/GetArray.ts @@ -204,7 +204,7 @@ export async function GetArray(varOveride?: string) { cache.set(cacheName, { data: compress ? CompressArray(chunkF16, 7) : chunkF16, - shape: thisShape, stride: chunkStride, + shape: thisShape.filter((val)=> val > 1), stride: chunkStride, scaling: scalingFactor, compressed: compress, coarsened: coarsen, kernel: { kernelDepth: coarsen ? kernelDepth : undefined, kernelSize: coarsen ? kernelSize : undefined }, fullChunkDim: [zDim.chunkDim, yDim.chunkDim, xDim.chunkDim], diff --git a/src/components/zarr/utils.ts b/src/components/zarr/utils.ts index d02821eb..0bb7d0e7 100644 --- a/src/components/zarr/utils.ts +++ b/src/components/zarr/utils.ts @@ -206,44 +206,47 @@ export function copyChunkToArray( fullChunkDim: number[], sliceStart: number[], ): void { - const [z, y, x] = chunkGridPos; - const [chunkDimZ, chunkDimY, chunkDimX] = fullChunkDim; - const [sliceStartZ, sliceStartY, sliceStartX] = sliceStart; - const [destShapeZ, destShapeY, destShapeX] = destShape; + // ---- This is a vibecoded function and I don't really know how it works. + const ndim = chunkShape.length; + const start = new Array(ndim); + const end = new Array(ndim); + const destBase = new Array(ndim); // abs offset - sliceStart, per dim + + for (let i = 0; i < ndim; i++) { + const abs = chunkGridPos[i] * fullChunkDim[i]; + start[i] = Math.max(0, sliceStart[i] - abs); + end[i] = Math.min(chunkShape[i], sliceStart[i] + destShape[i] - abs); + destBase[i] = abs - sliceStart[i]; + } - const absZ = z * chunkDimZ; - const absY = y * chunkDimY; - const absX = x * chunkDimX; + const last = ndim - 1; + const contiguous = chunkStride[last] === 1 && destStride[last] === 1; - const czStart = Math.max(0, sliceStartZ - absZ); - const czEnd = Math.min(chunkShape[0], sliceStartZ + destShapeZ - absZ); - const cyStart = Math.max(0, sliceStartY - absY); - const cyEnd = Math.min(chunkShape[1], sliceStartY + destShapeY - absY); - const cxStart = Math.max(0, sliceStartX - absX); - const cxEnd = Math.min(chunkShape[2], sliceStartX + destShapeX - absX); - - for (let cz = czStart; cz < czEnd; cz++) { - for (let cy = cyStart; cy < cyEnd; cy++) { - const sourceRowOffset = cz * chunkStride[0] + cy * chunkStride[1]; - const destZ = (absZ + cz) - sliceStartZ; - const destY = (absY + cy) - sliceStartY; - const destXStart = (absX + cxStart) - sliceStartX; - const destRowOffset = destZ * destStride[0] + destY * destStride[1] + destXStart; - - if (chunkStride[2] === 1) { - const rowData = chunkData.subarray( - sourceRowOffset + cxStart, - sourceRowOffset + cxEnd, + function walk(dim: number, chunkOffset: number, destOffset: number): void { + if (dim === last) { + const s = start[dim], e = end[dim]; + if (contiguous) { + destArray.set( + chunkData.subarray(chunkOffset + s, chunkOffset + e), + destOffset + s + destBase[dim], ); - destArray.set(rowData, destRowOffset); } else { - for (let cx = cxStart; cx < cxEnd; cx++) { - const destX = (absX + cx) - sliceStartX; - destArray[destZ * destStride[0] + destY * destStride[1] + destX] = chunkData[sourceRowOffset + cx * chunkStride[2]]; + for (let c = s; c < e; c++) { + destArray[destOffset + (c + destBase[dim]) * destStride[dim]] = + chunkData[chunkOffset + c * chunkStride[dim]]; } } + return; + } + for (let c = start[dim]; c < end[dim]; c++) { + walk( + dim + 1, + chunkOffset + c * chunkStride[dim], + destOffset + (c + destBase[dim]) * destStride[dim], + ); } } + walk(0, 0, 0); } export function copyChunkToArray2D(