TripoSplat-WebGPU / tests /runtimeManifestFloat16.test.ts
Yosun's picture
Deploy TripoSplat WebGPU demo
31c7d49 verified
Raw
History Blame Contribute Delete
5.37 kB
import assert from 'node:assert/strict'
import test from 'node:test'
import {
float16BitsToNumber,
float16ToFloat32,
float32ToFloat16,
numberToFloat16Bits,
} from '../src/runtime/float16.ts'
import {
assertModelManifest,
copyModelManifest,
createConventionalExternalDataManifest,
resolveModelManifest,
type OnnxModelManifest,
} from '../src/runtime/modelManifest.ts'
import {
createTripoSplatModelManifest,
createVaeEncoderSliceManifest,
} from '../src/models/triposplat/manifests.ts'
test('model manifests preserve explicit virtual sidecar paths while resolving fetch URLs', () => {
const original: OnnxModelManifest = {
graphUrl: 'graphs/model.onnx',
externalData: [
{ path: 'weights/block-0.bin', url: 'objects/model-v7/block-0.bin?token=abc' },
{ path: '../shared/block-1.bin', url: 'https://weights.example/block-1.bin' },
],
}
assert.doesNotThrow(() => assertModelManifest(original))
const resolved = resolveModelManifest(original, 'https://cdn.example/releases/v7/')
assert.equal(resolved.graphUrl, 'https://cdn.example/releases/v7/graphs/model.onnx')
assert.deepEqual(resolved.externalData, [
{
path: 'weights/block-0.bin',
url: 'https://cdn.example/releases/v7/objects/model-v7/block-0.bin?token=abc',
},
{
path: '../shared/block-1.bin',
url: 'https://weights.example/block-1.bin',
},
])
const copied = copyModelManifest(original)
copied.externalData![0].url = 'changed'
assert.equal(original.externalData![0].url, 'objects/model-v7/block-0.bin?token=abc')
})
test('manifest validation rejects ambiguous duplicate and malformed sidecars', () => {
assert.throws(
() => assertModelManifest({
graphUrl: 'model.onnx',
externalData: [
{ path: 'model.data', url: 'a' },
{ path: 'model.data', url: 'b' },
],
}),
/Duplicate ONNX external-data path 'model.data'/,
)
assert.throws(
() => assertModelManifest({ graphUrl: 'model.onnx', externalData: 'model.onnx.data' }),
/must be an array/,
)
assert.throws(
() => assertModelManifest({ graphUrl: '', externalData: [] }),
/graphUrl must be a non-empty string/,
)
assert.throws(
() => assertModelManifest({
graphUrl: 'model.onnx',
externalData: [{ path: 'bad\0path', url: 'data.bin' }],
}),
/must not contain a null character/,
)
})
test('conventional sidecar helper is opt-in and preserves query/hash placement', () => {
assert.deepEqual(
createConventionalExternalDataManifest('https://cdn.example/model%20v2.onnx?sig=123#asset'),
{
graphUrl: 'https://cdn.example/model%20v2.onnx?sig=123#asset',
externalData: [{
path: 'model v2.onnx.data',
url: 'https://cdn.example/model%20v2.onnx.data?sig=123#asset',
}],
},
)
})
test('TripoSplat graph manifests explicitly declare each ONNX sidecar', () => {
const graphs = createTripoSplatModelManifest({
baseUrl: 'https://models.example/triposplat/v1',
})
assert.deepEqual(Object.keys(graphs), [
'dinov3',
'vaeEncoder',
'dit',
'octree',
'gaussianDecoder',
])
for (const descriptor of Object.values(graphs)) {
assert.ok(descriptor)
const graphFile = descriptor.manifest.graphUrl.split('/').at(-1)!
assert.equal(descriptor.precision, 'float32')
assert.deepEqual(descriptor.manifest.externalData, [{
path: `${graphFile}.data`,
url: `https://models.example/triposplat/v1/${graphFile}.data`,
}])
}
const slice = createVaeEncoderSliceManifest(
'https://models.example/graphs/vae-v3.onnx',
'float16',
)
assert.equal(slice.vaeEncoder!.precision, 'float16')
assert.deepEqual(slice.vaeEncoder!.manifest.externalData, [{
path: 'flux2_vae_encoder.onnx.data',
url: 'https://models.example/graphs/vae-v3.onnx.data',
}])
})
test('float16 conversion matches canonical IEEE-754 binary16 encodings', () => {
const vectors: Array<[number, number]> = [
[0, 0x0000],
[-0, 0x8000],
[1, 0x3c00],
[-2, 0xc000],
[65504, 0x7bff],
[2 ** -14, 0x0400],
[2 ** -24, 0x0001],
[2 ** -25, 0x0000],
[Infinity, 0x7c00],
[-Infinity, 0xfc00],
]
for (const [value, bits] of vectors) {
assert.equal(numberToFloat16Bits(value), bits)
}
assert.ok(Number.isNaN(float16BitsToNumber(numberToFloat16Bits(Number.NaN))))
assert.ok(Object.is(float16BitsToNumber(0x8000), -0))
// Round-to-nearest, ties-to-even on either side of an odd half code.
assert.equal(numberToFloat16Bits(1 + 2 ** -11), 0x3c00)
assert.equal(numberToFloat16Bits(1 + 3 * 2 ** -11), 0x3c02)
})
test('float16 vector helpers round-trip every non-NaN binary16 pattern', () => {
for (let bits = 0; bits <= 0xffff; bits += 1) {
const exponent = (bits >>> 10) & 0x1f
const mantissa = bits & 0x3ff
if (exponent === 0x1f && mantissa !== 0) continue
assert.equal(numberToFloat16Bits(float16BitsToNumber(bits)), bits)
}
const source = Float32Array.of(0, -0, 1 / 3, 65504, Infinity, Number.NaN)
const encoded = float32ToFloat16(source)
const decoded = float16ToFloat32(encoded)
assert.equal(decoded.length, source.length)
assert.ok(Object.is(decoded[1], -0))
assert.equal(decoded[3], 65504)
assert.equal(decoded[4], Infinity)
assert.ok(Number.isNaN(decoded[5]))
assert.ok(Math.abs(decoded[2] - 1 / 3) < 2e-4)
})